<?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: Drew Ronk</title>
    <description>The latest articles on DEV Community by Drew Ronk (@dronk6).</description>
    <link>https://dev.to/dronk6</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%2F695782%2F95743e54-cfea-46c5-b560-613ce063f852.jpg</url>
      <title>DEV Community: Drew Ronk</title>
      <link>https://dev.to/dronk6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dronk6"/>
    <language>en</language>
    <item>
      <title>Quick and Easy Deployment with Vercel</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Sun, 13 Mar 2022 19:56:39 +0000</pubDate>
      <link>https://dev.to/dronk6/quick-and-easy-deployment-with-vercel-2p76</link>
      <guid>https://dev.to/dronk6/quick-and-easy-deployment-with-vercel-2p76</guid>
      <description>&lt;p&gt;Recently, I learned about a platform called &lt;a href="https://vercel.com/home"&gt;Vercel&lt;/a&gt;, which allows for fast and accessible deployment of static sites and frontend frameworks. Given how much legwork can be involved in getting a site deployed, a system like this can be a game-changer for developers who don't need an overly complex deployment of their frontend. &lt;/p&gt;

&lt;p&gt;Businesses have started to see the value in this too, as the platform now has a ton of customers, including: McDonald's, The Washington Post, Facebook, Patreon, Uber... The list is impressively long and filled with household names. &lt;/p&gt;

&lt;p&gt;So, what makes Vercel so special? Let's find out. &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Vercel?
&lt;/h2&gt;

&lt;p&gt;Simply put, Vercel is a &lt;a href="https://www.redhat.com/en/topics/cloud-native-apps/what-is-faas#how-does-faas-work"&gt;Function as a Service&lt;/a&gt; (FaaS). This essentially means that the platform handles most of the extra stuff involved with deploying a website, so developers don't have to. That "extra stuff" could be infrastructure such as servers or the extensive CI/CD configuration needed to deploy a site, both of which take some work on the developer's end to get set up and maintained.&lt;/p&gt;

&lt;p&gt;What makes Vercel so great? It's super good at the whole FaaS thing and makes it really easy for developers to go from localhost to having a site anyone can access. Vercel provides a short and easily-repeated process for developers to deploy their sites through the platform, allowing for additional configuration but taking care of most of it already--making life a lot easier for someone (like me) who just wants a quick and easy way of deploying a site. It also automatically scales due to its offer of serverless deployment for users, and allows developers to customize integrations and setup for their projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;To better understand Vercel, let's import a project into Vercel from GitHub. To do so, first set up an account with Vercel (it's free) and link your GitHub account in Vercel. On your Vercel Dashboard, you'll see a &lt;strong&gt;New Project&lt;/strong&gt; button. Click that, and you should see the following screen:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_tqMKusJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rpslenobv20nudwjb7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_tqMKusJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rpslenobv20nudwjb7l.png" alt="Create Project Page" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, I have the option to import from a Git Repo on the left and Vercel has access to my GitHub projects. Before importing a project to deploy, make sure your project is up-to-date in GitHub. When you click the &lt;strong&gt;import&lt;/strong&gt; button, you'll have some configuration to do with your project:&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;In most cases, you won't have any issues here. If your &lt;strong&gt;Framework Preset&lt;/strong&gt; box on this page is set to "Other," your project isn't using a framework that Vercel automatically supports. That's perfectly fine, you may just need to update the "Output Directory" dialog box in the &lt;strong&gt;Build and Output Settings&lt;/strong&gt; to match your specific project's expected output directory (often "_site" or "dist". If you notice your project is not deploying properly, this can also be done in the &lt;strong&gt;Settings&lt;/strong&gt; tab of your project once it's set up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As long as you like the name of your project, you can hit the &lt;strong&gt;Deploy&lt;/strong&gt; button! When you do, you'll probably see a page like this, and you're good to go!&lt;/p&gt;

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

&lt;p&gt;Now, your site is deployed through Vercel and you can access it any time from the link the platform provides. Any time you update the &lt;code&gt;main&lt;/code&gt; branch of the GitHub repository you linked Vercel, the site automatically updates to reflect your changes. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you'd like to see more, Vercel also has a very useful &lt;a href="https://vercel.com/docs/get-started"&gt;docs&lt;/a&gt; page with demos of how to set up quite a few commonly-used frontend frameworks.&lt;/em&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Experience Thus Far
&lt;/h2&gt;

&lt;p&gt;Using Vercel, I've already deployed four websites! &lt;/p&gt;

&lt;p&gt;The first three were 11ty demos I discussed in &lt;a href="https://dev.to/dronk6/static-site-generation-working-with-eleventy-3l9p"&gt;this article&lt;/a&gt;, all of which were incredibly easy thanks to Vercel's support for 11ty. Even the last demo in my 11ty article, which fought me tooth and nail when I tried to deploy it using GitHub Actions, deployed with ease using Vercel. &lt;/p&gt;

&lt;p&gt;The last demo site I deployed was from RedHat's Michael Potter, which can be found &lt;a href="https://github.com/btopro/ist-vercel-demo"&gt;here&lt;/a&gt;. As the demo uses &lt;a href="https://lit.dev/"&gt;Lit&lt;/a&gt;, I had to clone the project locally via GitHub, install Vercel globally, run &lt;code&gt;npm install&lt;/code&gt;, and run &lt;code&gt;vercel dev&lt;/code&gt; to get the project properly tied to Vercel. I also had to override the "Output Directory" dialog box in the &lt;strong&gt;Build and Output Settings&lt;/strong&gt; and set it to "dist" for the project to successfully deploy. These extra steps seem to be a common thing for frameworks outside those automatically supported by Vercel, but I could be wrong.&lt;/p&gt;

&lt;p&gt;Included below are the links to all four projects, as well as screenshots of how they look on Vercel:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 11ty: Getting Started Guide
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/dronk6/11ty-sample"&gt;https://github.com/dronk6/11ty-sample&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Vercel Site:&lt;/strong&gt; &lt;a href="https://11ty-sample-seven.vercel.app/"&gt;https://11ty-sample-seven.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;How it looks on Vercel:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--buhDbk8u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnp6vxjbtmlly25szhxw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--buhDbk8u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnp6vxjbtmlly25szhxw.png" alt="11ty Getting Started Overview" width="880" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 11ty: Base Blog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/dronk6/11ty-base-blog"&gt;https://github.com/dronk6/11ty-base-blog&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Vercel Site:&lt;/strong&gt; &lt;a href="https://11ty-base-blog.vercel.app/"&gt;https://11ty-base-blog.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;How it looks on Vercel:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bOx6d_NN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/079ylk0r7km1ks0absub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bOx6d_NN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/079ylk0r7km1ks0absub.png" alt="11ty Base Blog Overview" width="880" height="541"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Malte Ubl x Google: Eleventy High Performance Blog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/dronk6/11ty-high-performance-blog"&gt;https://github.com/dronk6/11ty-high-performance-blog&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Vercel Site:&lt;/strong&gt; &lt;a href="https://11ty-high-performance-blog.vercel.app/"&gt;https://11ty-high-performance-blog.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;How it looks on Vercel:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZUtdvP0Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/meyd6p2tnmnp60kuj7vm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZUtdvP0Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/meyd6p2tnmnp60kuj7vm.png" alt="High Performance Blog Overview" width="880" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. IST Vercel Demo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/dronk6/ist-vercel-demo"&gt;https://github.com/dronk6/ist-vercel-demo&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Vercel Site:&lt;/strong&gt; &lt;a href="https://vercel-demo-blond-psi.vercel.app/"&gt;https://vercel-demo-blond-psi.vercel.app/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;How it looks on Vercel:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lzhOsVW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipfq46n4h910w33bw930.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lzhOsVW_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipfq46n4h910w33bw930.png" alt="Vercel Demo Overview" width="880" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Developer Experience
&lt;/h3&gt;

&lt;p&gt;One of Vercel's main goals is to improve DX, and I'd say they do so successfully. Where other CI/CD offerings such as GitHub Actions require most of the setup to be manually done by the developer, Vercel abstracts a lot of this and only asks for input from the developer where absolutely necessary. This allows for faster feedback loops during development and less confusion for the developer, which I really appreciated. Where I felt like I was a little in the weeds with GitHub Actions and was basically just guessing at what needed to be fixed when I ran into an issue, Vercel was guiding me in the right direction by default and offering me the option to do more once we got a basic setup. I really appreciated this kind of experience as I am not well-versed with site deployment.&lt;/p&gt;

</description>
      <category>vercel</category>
      <category>faas</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Static Site Generation: Working with Eleventy</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 28 Feb 2022 06:26:07 +0000</pubDate>
      <link>https://dev.to/dronk6/static-site-generation-working-with-eleventy-3l9p</link>
      <guid>https://dev.to/dronk6/static-site-generation-working-with-eleventy-3l9p</guid>
      <description>&lt;p&gt;I recently learned about &lt;a href="https://www.freecodecamp.org/news/static-site-generation-with-nextjs/#what-is-static-generation"&gt;Static Site Generation (SSG)&lt;/a&gt; via &lt;a href="https://www.11ty.dev/"&gt;Eleventy (11ty)&lt;/a&gt;, and wanted to use this post to talk about how it went when I tried to use it to make a blog. 11ty is a Static Site Generator that simplifies this workflow by providing tons of plugins and a clean, intuitive developer experience. As 11ty already has a basic &lt;a href="https://www.11ty.dev/docs/getting-started/"&gt;Getting Started Guide&lt;/a&gt;, this is going to read more like a review than a tutorial.&lt;/p&gt;

&lt;p&gt;In this review, we'll be talking about three Eleventy-based templates that I tried out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;11ty's &lt;a href="https://www.11ty.dev/docs/getting-started/"&gt;Getting Started Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;11ty's &lt;a href="https://github.com/11ty/eleventy-base-blog"&gt;Base Blog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Malte Ubl's Google-co-signed &lt;a href="https://github.com/google/eleventy-high-performance-blog"&gt;"Eleventy High Performance Blog"&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'll compare the three as I experienced them, and briefly comment on what it took to get them up and running. &lt;/p&gt;

&lt;h2&gt;
  
  
  1. 11ty: Getting Started Guide
&lt;/h2&gt;

&lt;p&gt;The most basic of the three options I'll be discussing, this was was essentially a "Hello World" boilerplate of 11ty. As I knew very little about 11ty going into messing around with it, its lack of templating had me confused &lt;em&gt;~pretty~&lt;/em&gt; quickly. However, I recognize that this was meant to be a clean slate for someone looking to have a no-frills experience with 11ty, and that's exactly what it was. I didn't feel like I was dealing with a bunch of unnecessary code, and it was very simple to work with once I did some googling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sv0-moXJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/imm0ybnwj31alsenfg04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sv0-moXJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/imm0ybnwj31alsenfg04.png" alt="The home page I built" width="880" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the two templates I worked with (see options 2 and 3) had a blog-like setup, I modelled this in the same way. As you can see above, I was able to pretty quickly get some HTML up with 11ty and link to some static sites written in markdown, such as a previous blog post I had created and placed in this project:&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Yes, it looks like unformatted HTML--because it is. I put a markdown file in my directory, and out came a really clean HTML file in its own directory. Pretty cool.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to see how I did this, here's the &lt;a href="https://github.com/dronk6/11ty-sample"&gt;GitHub repo&lt;/a&gt; and the &lt;a href="https://dronk6.github.io/11ty-sample/index.html"&gt;site&lt;/a&gt; I have my project hosted on.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 11ty: Base Blog
&lt;/h2&gt;

&lt;p&gt;This was the first template I tried, also created by 11ty. Out of the three options I'm discussing, I liked this one the most for learning 11ty's features without feeling in over my head. I was able to quickly understand the logic behind the project's organization and how the components fit together, and the README that came with it was simple without being ambiguous. &lt;/p&gt;

&lt;p&gt;My favorite aspect of this one is that it included a lot of stylistic touches, such as having preset CSS and out-of-the-box components like a navigation bar. It made the experience of building a blog site really fast and accessible, while giving me a hint at what was possible with 11ty. Here's the home page I was able to create within ten minutes of running &lt;code&gt;npm install&lt;/code&gt; for the first time: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--153hWLWG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lhlw9mf9ufrv8z1vizzw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--153hWLWG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lhlw9mf9ufrv8z1vizzw.png" alt="Base Blog Home" width="880" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As is the case with 11ty in general, all it took was me putting some formatted markdown in a file in the directory to produce this:&lt;/p&gt;

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

&lt;p&gt;If you'd like to see my attempt at this, here's the &lt;a href="https://github.com/dronk6/11ty-base-blog"&gt;GitHub repo&lt;/a&gt; and the &lt;a href="https://dronk6.github.io/11ty-base-blog/"&gt;site&lt;/a&gt; I have my project hosted on. If the site shows the page without rendered CSS, yeah that confused me too--I've had a great time with GitHub Actions lately.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Malte Ubl x Google: Eleventy High Performance Blog
&lt;/h2&gt;

&lt;p&gt;The third option I'll be discussing was also a template, created by Google's Malte Ubl. I stumbled across this while looking at 11ty templates, and was really impressed by how verbose this option was. Where the 11ty Base Blog provided a strong framework from which to build, this provided a fully-functioning, highly-stylized website that only needed to be filled in. &lt;/p&gt;

&lt;p&gt;Despite this being the case, I felt this template was more advanced than needed for my intent and purpose--which was actually harmful when I went to deploy it with GitHub actions. That said, it shares a lot of the benefits of 11ty's Base Blog while also including some really cool advanced features, such as support for Google Analytics and out-of-the-box testing. Plus, the pre-loaded CSS, built-in progress bar, and automatically-estimated reading times made the site look incredibly professional from the first time I built it. I was in over my head fast, but I was learning the entire time and quickly found myself looking at a high-quality product. Here's what I came up with using this template: &lt;/p&gt;

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

&lt;p&gt;And a sample post: &lt;/p&gt;

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

&lt;p&gt;The one problem I ran into with this one was when it came to CI/CD. I got the project's built-in CI to work, but for the life of me couldn't get GitHub Actions to let me build this project for deployment. The project has built-in support for &lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;, I just didn't feel like venturing down that rabbit hole. &lt;/p&gt;

&lt;p&gt;So, thank GitHub Actions for this meme. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uQJ_3W1D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bd3shkwetyn569p07zc1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uQJ_3W1D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bd3shkwetyn569p07zc1.png" alt="If I had one" width="500" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you'd like to see my code, here's the &lt;a href="https://github.com/dronk6/11ty-high-performance-blog"&gt;GitHub repo&lt;/a&gt; and here's where I would have put my &lt;a href="https://dronk6.github.io/11ty-high-performance-blog/"&gt;site&lt;/a&gt; (ya know, &lt;em&gt;if I had one&lt;/em&gt;).&lt;/p&gt;

</description>
      <category>11ty</category>
    </item>
    <item>
      <title>Getting Started with Docker: Docker Playground</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Thu, 24 Feb 2022 23:32:32 +0000</pubDate>
      <link>https://dev.to/dronk6/getting-started-with-docker-docker-playground-28h3</link>
      <guid>https://dev.to/dronk6/getting-started-with-docker-docker-playground-28h3</guid>
      <description>&lt;p&gt;In a previous article, I stumbled my way through a tutorial on &lt;a href="https://dev.to/dronk6/getting-started-with-docker-windows-11-3ihn"&gt;how to install Docker for Windows 11&lt;/a&gt;; however, I made it pretty clear I had &lt;em&gt;no idea&lt;/em&gt; how to use Docker (let alone what it was) at the time. So, I'm going to use this post to learn more by starting the tutorial on Docker's website: &lt;a href="https://www.docker.com/101-tutorial" rel="noopener noreferrer"&gt;Docker Playground&lt;/a&gt;, which is their free way to learn the system. I'm also going to talk a little about Docker itself, and discuss how to create a Dockerfile using &lt;a href="https://www.docker.com/101-tutorial" rel="noopener noreferrer"&gt;this microservice&lt;/a&gt; as a backdrop. Let's get to it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Docker so Powerful?
&lt;/h2&gt;

&lt;p&gt;I talk a little about this in that post I linked above, but Docker is &lt;em&gt;incredibly&lt;/em&gt; powerful. This is because container-based architecture allows for the creation of instances of an application, allowing a developer to customize and replicate these instances as much as they want without interfering with anything else on a user's system. &lt;/p&gt;

&lt;p&gt;Docker takes this to another level, as it allows developers to toss everything needed to run an app into one easily-distributed package, then ship it to any system that can support the application. This makes the application easier to manage--because they're not relying on users to have (most) of the necessary dependencies--and infinitely scalable. Which is a huge deal, because it allows users to have a faster, lighter experience with an application that is still tied into the same backend.&lt;/p&gt;

&lt;p&gt;With that in mind, let's try it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Playground
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/101-tutorial" rel="noopener noreferrer"&gt;Docker Playground&lt;/a&gt; is Docker's free, online tutorial for learning Docker. Once you get through the initial steps, they provide a verbose guide that can get you going with a container. So, I'll go through the first couple of steps to get going then I'll leave the rest to you!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Access Play With Docker and Sign In
&lt;/h3&gt;

&lt;p&gt;First, we'll navigate to the &lt;a href="https://labs.play-with-docker.com/" rel="noopener noreferrer"&gt;Play with Docker&lt;/a&gt; starting page, which should look like this:&lt;/p&gt;

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

&lt;p&gt;Click Start, and you'll be prompted to sign in with a GitHub or Docker account. Feel free to do whichever is easier for you, but do not purchase anything if you decide to create a Docker account--the tutorial and Docker Playground are free.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Create a New Instance
&lt;/h3&gt;

&lt;p&gt;Once you are signed in, click the "Add New Instance" button to create a virtualized container in Docker Playground. If you did so successfully, your page will look something like this:&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Step 3: Access the Docker 101 Tutorial
&lt;/h3&gt;

&lt;p&gt;To access the Docker 101 Tutorial, you actually have to use the instance you've just created. So, type the following command in the Command Line Interface on Docker Playground and hit Enter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -dp 80:80 docker/getting-started:pwd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After this command processes, you'll see that a hyperlinked "&lt;strong&gt;80&lt;/strong&gt;" has appeared next to the "Open Port" button at the top of the screen, like so:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Click this link, and you'll be taken to the Docker 101 tutorial. From there, you can navigate through the tutorial and learn more about Docker via the Docker Playground!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Dockerfile
&lt;/h2&gt;

&lt;p&gt;A Dockerfile is a set of instructions, called a &lt;a href="https://searchitoperations.techtarget.com/definition/Docker-image" rel="noopener noreferrer"&gt;Docker image&lt;/a&gt;, which Docker uses to build your application within a container. As these instructions essentially define how the Docker container will handle the process of running your application, it is important that this file exists in your container prior to you attempting to run your application. Below, we'll look at an example of a Dockerfile that was created for a &lt;a href="https://github.com/heyMP/ist402-docker/tree/master/labs/7-news-api-microservice" rel="noopener noreferrer"&gt;NewsAPI Microservice&lt;/a&gt;, then show what having this Dockerfile properly configured can do for you.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h4&gt;
  
  
  How are Dockerfiles created?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;When you're configuring a container, typically you'll be creating a custom Dockerfile. To do so, you just create a text file titled "Dockerfile" in your container's directory, then insert the commands necessary for your container.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What's in a Dockerfile?
&lt;/h3&gt;

&lt;p&gt;This can depend on what the Dockerfile is being used for, but in this case we actually have two: one for the visual web component, and another for the server that accesses an API. To avoid confusion, we'll just focus on the server. Below is what we have in that file: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

FROM node:12

WORKDIR /home/node/app

COPY package.json ./
RUN yarn install

COPY . .

CMD [ "yarn", "start" ]


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

&lt;/div&gt;

&lt;p&gt;The capitalized words in this file represent commands, which Docker uses to create an environment conducive for your application to run--regardless of the system it's on. Let's look at each of these commands:&lt;/p&gt;

&lt;h4&gt;
  
  
  FROM
&lt;/h4&gt;

&lt;p&gt;The first thing we see here is the "FROM" instruction. This is always the first command in a Dockerfile, as it indicates that this Dockerfile is the base image is for the container.&lt;/p&gt;

&lt;h4&gt;
  
  
  WORKDIR
&lt;/h4&gt;

&lt;p&gt;This instruction key establishes the working directory where subsequent commands will be run.&lt;/p&gt;

&lt;h4&gt;
  
  
  COPY
&lt;/h4&gt;

&lt;p&gt;The first time this command is shown, it's copying our application's package.json file into the working directory. The way we can see this is the &lt;code&gt;./&lt;/code&gt; that follows &lt;code&gt;package.json&lt;/code&gt; in the command, which signifies that this is the destination for our copy. In this case, copying this will allow us to then use that package.json to install the app's necessary dependencies using:&lt;/p&gt;

&lt;h4&gt;
  
  
  RUN
&lt;/h4&gt;

&lt;p&gt;RUN can be used in a variety of ways, but in this example it's being used to run a &lt;code&gt;yarn install&lt;/code&gt; command--which installs all the dependencies needed to allow our application to run in the Docker container.&lt;/p&gt;

&lt;h4&gt;
  
  
  COPY (again)
&lt;/h4&gt;

&lt;p&gt;We already talked a little about COPY, but this time the thing that's being copied is a shorthand, &lt;code&gt;.  .&lt;/code&gt;, which indicates that everything (&lt;code&gt;.&lt;/code&gt;) is being copied to the working directory, allowing the container to be configured to work with the application.&lt;/p&gt;

&lt;h4&gt;
  
  
  CMD
&lt;/h4&gt;

&lt;p&gt;And finally, we have CMD. The CMD command takes in an array of parameterized commands, which will then be run when the Dockerfile is used to build your application. So, this CMD's array equates to &lt;code&gt;yarn start&lt;/code&gt;, which is a command that uses &lt;a href="https://yarnpkg.com/" rel="noopener noreferrer"&gt;yarn&lt;/a&gt; to start the application. As this is the final command in the Dockerfile, at this point our application is built within the container!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you'd like to learn more about Dockerfile commands, &lt;a href="https://takacsmark.com/dockerfile-tutorial-by-example-dockerfile-best-practices-2018/#dockerfile-key-instructions-best-practices" rel="noopener noreferrer"&gt;this article&lt;/a&gt; breaks each down with great examples.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;At this point, you can run the application since you've successfully built it using the Dockerfile. In the case of &lt;a href="https://github.com/heyMP/ist402-docker/tree/master/labs/7-news-api-microservice" rel="noopener noreferrer"&gt;our example&lt;/a&gt;, this would involve running the &lt;code&gt;docker-compose up&lt;/code&gt; command. Which allows you to view our example application's front-end, which lists hyperlinked articles from NewsAPI:&lt;/p&gt;

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

</description>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>APIs: Fetching Data and an Example via Wikipedia</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 31 Jan 2022 05:26:31 +0000</pubDate>
      <link>https://dev.to/dronk6/apis-fetching-data-and-an-example-via-wikipedia-3c6p</link>
      <guid>https://dev.to/dronk6/apis-fetching-data-and-an-example-via-wikipedia-3c6p</guid>
      <description>&lt;p&gt;APIs, or Application Programming Interfaces, are an incredibly useful tool for accessing data from an external source. Retrieving, storing, and using this data typically requires a programmatic API call, which can be done using a language such as JavaScript. In this article, we'll be discussing how data can be retrieved via the fetch() function in JavaScript, then analyzing a commonly-used API that can be accessed through an HTML tag: the &lt;a href="https://en.wikipedia.org/w/api.php"&gt;Wikipedia API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  fetch()ing Data
&lt;/h2&gt;

&lt;p&gt;When working with an API, a common starting point is calling upon the API to retrieve some information. This info can then be stored in a variable within your application, which gives you plenty of options for using and manipulating that data. One way this can be done in JavaScript is using the fetch() function, which directly calls upon an API by treating the API's link as a parameter.&lt;/p&gt;

&lt;p&gt;Below is an example fetch() call, which accesses an API called "FreeGeoIP" that returns a user's IP address when called:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pYX2Mnv1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ir42tefplcrd62frr0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pYX2Mnv1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ir42tefplcrd62frr0x.png" alt="getGEOIPData() function breakdown" width="880" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the getGEOIPData() function handles the fetch() method call, where the API's link is one of the parameters passed into fetch(). The API call reaches out to the API at this link, then uses the response that is returned to determine whether to store data from the fetch() call. In this case, a successful API call would grant us access to information such as the IP address' geographic coordinates, city, and state, which we are storing further down in the getGEOIPData() function.&lt;/p&gt;

&lt;p&gt;Since I'm working with &lt;a href="https://lit.dev/"&gt;LitElement&lt;/a&gt; in this case, you can see I'm assigning the data I got back to global variables that were initially created in the application's constructor. This allows me to mutate the location information in my constructor, and carry my data changes throughout my entire web page, every time I make another call to the API--such as when I press a button to call it or refresh the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wikipedia API
&lt;/h2&gt;

&lt;p&gt;Using the data we stored in getGEOIPData(), we could learn more about the location that our IP address is tied to by working with the Wikipedia API. The Wikipedia API can be accessed using a fetch() call as well, or through &lt;a href="https://www.npmjs.com/package/@lrnwebcomponents/wikipedia-query"&gt;this&lt;/a&gt; very cool HTML tag that simplifies the call into an embeddable component. For this article, we'll be using that tag, which is called &lt;code&gt;wikipedia-query&lt;/code&gt;. This is incredibly useful, as a simple import and implementation of the tag allows us to embed a preview of a Wikipedia article directly into our web page, like so: &lt;/p&gt;

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

&lt;p&gt;All you'd end up adding to your HTML, or in my case the render() function in my Lit implementation, is a &lt;code&gt;wikipedia-query&lt;/code&gt; tag with the search parameter tied to whatever I want. Below, you can see the three different options I went with--all of which are information I pulled from the IP address data returned from the API call discussed earlier:&lt;/p&gt;

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

&lt;p&gt;Using a tag like those pictured above and an import call, I could very easily learn more about my current location based on the IP address that my device is using to access the internet--all in a web page!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here's the import statement you'd need to make it work: &lt;code&gt;import { WikipediaQuery } from '@lrnwebcomponents/wikipedia-query/wikipedia-query.js';&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All of this is possible because Wikipedia's powerful API allows a user to enter a search term into an API call, and returns bundled information that can then be elegantly presented to a user.&lt;/p&gt;

&lt;p&gt;This is just scratching the surface of APIs and their capabilities, but it shows just how limitless their uses and possibilities can be!&lt;/p&gt;

</description>
      <category>api</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Getting Started with Docker: Windows 11</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 17 Jan 2022 01:59:14 +0000</pubDate>
      <link>https://dev.to/dronk6/getting-started-with-docker-windows-11-3ihn</link>
      <guid>https://dev.to/dronk6/getting-started-with-docker-windows-11-3ihn</guid>
      <description>&lt;p&gt;Before writing this article, I had never worked with Docker before. In fact, I didn't even know what it was. However, through a lot of Googling and trial-and-error, I found enough information to go from crawling to slowly walking. Let's get you there too.&lt;/p&gt;

&lt;p&gt;In this demo, I'll be covering what Docker is, how to download it on Windows 11 OS, and getting Docker Desktop up and running with an example GitHub repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;Docker is a platform-as-a-service (PAAS) software that allows users to put their entire application into a virtual "container." This means that, rather than using your desktop to host an application, you can isolate your entire app within a single container--allowing you to manage multiple applications at once and utilize multiple versions of required software for your applications. All of this means you can manipulate your applications with more power and flexibility than was previously possible.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For more information about containers and Docker's logic, go to &lt;a href="https://www.docker.com/resources/what-container"&gt;this guide&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Downloading Docker for Windows 11
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Before we get into the steps, you need to make sure your machine is running &lt;strong&gt;Windows 11&lt;/strong&gt; and is &lt;strong&gt;at least 64-bits&lt;/strong&gt;. You can do this by navigating to the Windows Settings application and going to System &amp;gt; About. In this menu, you'll find your System Type and Windows Edition.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Download and Install Docker Desktop
&lt;/h3&gt;

&lt;p&gt;Click &lt;a href="https://www.docker.com/products/docker-desktop"&gt;this link&lt;/a&gt; and click the "Download for Windows" button. Your version should be automatically detected.&lt;/p&gt;

&lt;p&gt;Once you've downloaded the installer, run it. At this point, you'll be taken through the setup wizard. When you finish this, you should be able to open the application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Uh oh.
&lt;/h3&gt;

&lt;p&gt;Docker has some ancillary tools that you also need to install just to get it up and running, so you'll likely receive an error when you first try to open it. It happened to me, and this is the error message I saw:&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;Do not worry, the resolution is very simple...&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Install WSL 2
&lt;/h3&gt;

&lt;p&gt;WSL, or the Windows Subsystem for Linux, helps ensure Docker can compatibly run with your Windows computer. To install it, you can click the link in the error message shown above if it pops up on your screen when you try to open Docker, or you can go to &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package"&gt;this link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go through steps four and five of the instructions in that link, then try closing Docker and opening it again. &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: The Tutorial
&lt;/h3&gt;

&lt;p&gt;When you re-open Docker, it should open successfully and you'll see a tutorial. I highly recommend going through it, as it's brief but helpful in getting you acclimated to the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  (Optional) Step 5: Sign in/up
&lt;/h3&gt;

&lt;p&gt;Since this was my first time using Docker, I had to sign up using the button in Docker Desktop. If you've never used Docker, it's worth creating an account so you can use the platform to its fullest.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;At this point, you've successfully installed Docker Desktop! Next, we'll take a look at how to get started with an example demo.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example with HAXcms
&lt;/h2&gt;

&lt;p&gt;To get started, we'll need a GitHub repo with a fully-fledged application. In my case, I'll be using &lt;a href="https://github.com/elmsln/haxcms"&gt;HAXcms&lt;/a&gt;: a content management system that encapsulates the incredibly accessible authoring experience of &lt;a href="//HAXTheWeb.org"&gt;HAX&lt;/a&gt;. Let's get going!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: The Dev Environments Tab
&lt;/h3&gt;

&lt;p&gt;Navigate to the "Dev Environments" Tab in Docker Desktop, and click the "Create" button. Click the "Get Started" button in the guide that pops up, and the following screen should appear: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1o0uXJlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czzwtb4zd5h5kmc0kidw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1o0uXJlu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czzwtb4zd5h5kmc0kidw.png" alt="Create a Dev Environment" width="880" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As you can see in the image, I've already put a link into the "Enter the Git Repository" box. Below, I'll show you where to get a link to put in this box.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Getting the HTTPS Link From a GitHub Repo
&lt;/h3&gt;

&lt;p&gt;Navigate to your GitHub repo of choice, and select the green "Clone" button. A dropdown menu should populate, and you'll want to copy the link that appears in the HTTPS tab. Kind of like this: &lt;/p&gt;

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

&lt;p&gt;Paste the link you copied into the "Enter the Git Repository" box, and click the "Continue" button.&lt;/p&gt;

&lt;p&gt;The Dev Environment will take a little time to generate, then you'll see a page indicating that it's all set up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Get Going in VSCode
&lt;/h3&gt;

&lt;p&gt;At this point, your Dev Environments tab in Docker Desktop should be showing the container you created and your Containers/Apps tab will show that your container is running. Way to go!&lt;/p&gt;

&lt;p&gt;Now, you can start working with your container in VSCode. To do this, click on the container listed in your Dev Environments tab. It should look similar to this: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nh7vOE7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z6yn4g3wx3gmfitmt4ue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nh7vOE7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z6yn4g3wx3gmfitmt4ue.png" alt="Dev Environments with Running Container" width="880" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To open VSCode, just click the button. When you do, you may have to install one or two additional tools--or even VSCode itself if you don't have it already. If this is the case, follow the steps provided and you'll be viewing your container's code in no time!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;For more information about Docker and initial steps, feel free to view this &lt;a href="https://medium.com/free-code-camp/docker-simplified-96639a35ff36#06d9"&gt;guide&lt;/a&gt; from freeCodeCamp. I found it very useful, especially for learning about Docker's basic commands. Good luck!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Reflection: (new) Magic Wand Questions</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Sun, 07 Nov 2021 23:19:48 +0000</pubDate>
      <link>https://dev.to/dronk6/reflection-new-magic-wand-questions-2lmm</link>
      <guid>https://dev.to/dronk6/reflection-new-magic-wand-questions-2lmm</guid>
      <description>&lt;p&gt;Even though I'm only a senior in college, I feel as though I've been asked questions about my aspirations and dreams a lot. You know, the "if you had a magic wand what would you do with your life" type things. I've pretty much always answered those with some version of "I don't know," and the reason for that is because I really don't. I grew up learning to think in aggressively practical terms, so the dreaming thing is still kind of new to me. I honestly can't stand the interview question: "Where do you think you'll be in five years?" because... I don't know where I'll be tomorrow, let alone half a decade from now. I get that's not the point of the question, but I digress. &lt;/p&gt;

&lt;p&gt;Despite the fact that I'm not a huge fan of planning, or questions that make me think about the future, I'm gonna try to answer a few of them today. These were recently posed to me by a professor who told my class he's living his answers to these questions--so I figure answering them myself is worth a try.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you could build an app, website, or technology of any kind, What would it do?
&lt;/h3&gt;

&lt;p&gt;Simply put, I'd build a website that displays updated, easily understood information about the &lt;a href="https://www.theguardian.com/environment/2021/nov/01/the-climate-crisis-explained-in-10-charts"&gt;climate crisis&lt;/a&gt;. Yes, I &lt;em&gt;care&lt;/em&gt; about the environment. The site's primary goal would be to provide unbiased and unfiltered accounts of the current and future consequences of climate change in a clear, digestible manner. Possible solutions (on an individual and societal level) would be included as well, but the priority is to show apathetic people why they should care. Another major goal of the site is to make it clear that it takes more than individual effort to solve this problem, mainly by comparing corporations and governments' contributions to this crisis alongside consumers. Corporations' decision to make climate change seem like an unsolvable predicament by placing all of the responsibility on individual consumers is absolutely horrible, and it's a narrative I'd like to change. I know it's lofty, but I don't really care.&lt;/p&gt;

&lt;h4&gt;
  
  
  Who would it be for? How would they use it? How would you use it?
&lt;/h4&gt;

&lt;p&gt;My target audience for this site is someone who knows absolutely nothing about climate change. If knowledge is power, and action requires power, then helping people learn enough to do right by themselves and others is exactly what I want to do. My goal with this site isn't to belittle people, tell them they're wrong, or even change their opinions. Everyone deserves the opportunity to see a situation without there being some ulterior motive baked into its portrayal. I think this is an especially relevant problem with the rhetoric around climate change and the perceptions people maintain about it. Someone who visits the site could use it to see a different perspective, or just to see an explanation of the issue that isn't so overly technical or politically tainted that they can't get through it without feeling exhausted.&lt;/p&gt;

&lt;p&gt;In turn, I would use this site as an opportunity to help others. Information shouldn't be stuck behind a paywall, and becoming a more informed person shouldn't require extreme effort or some sort of buy-in. Making this site free for visitors and as accessible as possible would allow me to utilize my skills to (hopefully) make a difference in someone's life.&lt;/p&gt;

&lt;h3&gt;
  
  
  If money was no concern, time no concern; what would you do with your life and the skills you've assembled if you could dedicate it to one thing?
&lt;/h3&gt;

&lt;p&gt;I think the first thing I'd do is create the website I described above. It's something I've always been interested in doing, but I've never seen it as a source of revenue so much as an opportunity to do the right thing. Past that, I don't foresee myself doing software/web development on a daily basis. I enjoy it, but if it's not benefitting anyone it's a waste of my time. My passion is helping people, so that's what I'd dedicate my life to. I know that's ridiculously general, but I don't want to do just one thing and almost everything I currently do is because money and time &lt;em&gt;are&lt;/em&gt; concerns. I'd likely use my programming skills to do it, but I'd just try to do right by others. &lt;/p&gt;

&lt;p&gt;Learning new things and meeting new people are two of the most exciting things in life for me, so I'd devote a lot of my time to working for organizations who seek to improve the quality of life for those in adverse situations. More specifically, I'd like to focus on helping people without housing and those affected by climate change. I would start by working directly with those people while informing others of the realities of these issues (this is where web development could come in), but my eventual goal would be to work on policy that fixes the source of these problems. This isn't all I'd do with myself, I'd probably try new food, learn new skills, and travel as much as I physically can, but I want to spend most of my time making a difference in someone else's life.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Externally Sourced Fonts: Implementation in Lit vs. Vanilla JS Projects</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 25 Oct 2021 04:02:59 +0000</pubDate>
      <link>https://dev.to/dronk6/externally-sourced-fonts-implementation-in-lit-vs-vanilla-js-projects-1fbj</link>
      <guid>https://dev.to/dronk6/externally-sourced-fonts-implementation-in-lit-vs-vanilla-js-projects-1fbj</guid>
      <description>&lt;p&gt;Fonts are a great way to tailor your web content to your intended audience through simple stylistic changes. These style adjustments are typically implemented via CSS, which has a series of predefined fonts that can be chosen from via the &lt;code&gt;font-family&lt;/code&gt; attribute. However, fonts can also be &lt;em&gt;imported&lt;/em&gt;, using resources such as &lt;a href="https://fonts.google.com/"&gt;Google Fonts&lt;/a&gt; to access a vast library of custom fonts to make your text stand out. One consideration when importing these fonts is the way in which you do so, which can have a significant impact in whether the font is applied to your web page. &lt;/p&gt;

&lt;h3&gt;
  
  
  Importing with Vanilla JS
&lt;/h3&gt;

&lt;p&gt;When using CSS in tandem with Vanilla JS, two options exist for importing a font from an external source: the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag or an &lt;code&gt;@import&lt;/code&gt; statement within an already linked CSS file. &lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag, the reference to the external source where we are getting the font would be in our main page's HTML. By linking the external source as a stylesheet, we can then reference it in the CSS file we are already using to style our page. To reference the font we imported in our CSS file, we would simply place the name of the font at the beginning of the &lt;code&gt;font-family&lt;/code&gt; rule. Google Fonts provides an already-formatted version of this process, giving both the necessary HTML and the CSS rule required to use a font.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example HTML for this implementation:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_uYZqlDw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfmzqrk4uybvge1dwwef.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_uYZqlDw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wfmzqrk4uybvge1dwwef.png" alt="HTML Style Link"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example CSS Rule for this implementation, which is added to our project's CSS file:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ywuuWIk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09d5tv6gdjkwji61w1h9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ywuuWIk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/09d5tv6gdjkwji61w1h9.png" alt="CSS Rule with Font-Family"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the &lt;code&gt;@import&lt;/code&gt; statement, we avoid editing the HTML by directly importing the needed font into our already-existing CSS file. We could then reference the font's name as we did in our other implementation by placing the name of the font at the beginning of the &lt;code&gt;font-family&lt;/code&gt; rule. Google Fonts also provides a already-formatted version of this process, giving the necessary import statement and CSS rule required to use a font.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example of font import:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jwbo2tYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbx89rs9ar8m21wocigm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jwbo2tYO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbx89rs9ar8m21wocigm.png" alt="Imported CSS with Rule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The problem with a direct import to CSS, as shown above, is that it is a newer format that some frameworks do not account for. One such framework is &lt;a href="https://lit-element.polymer-project.org/guide#what-is-litelement"&gt;Lit&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Importing with Lit
&lt;/h3&gt;

&lt;p&gt;Given that Lit renders CSS differently from a Vanilla JS project, it has added sanitization measures that remove certain things from the embedded CSS. Unfortunately, one such thing is the &lt;code&gt;@import&lt;/code&gt; command. This means that directly importing an external font into CSS is not currently supported in Lit. Instead, we have to use a &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag. To use a font within a specific component, this could be achieved by placing the font in the &lt;code&gt;font-family&lt;/code&gt; CSS rule of the component's .JS file, then adding the necessary &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tag to the HTML in index.html. Thus, the CSS renders with the HTML from the .JS file.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example HTML for this implementation, placed in index.html:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6hXHvbo---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rwycfizngt3klm936j7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6hXHvbo---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6rwycfizngt3klm936j7.png" alt="Lit Index.HTML Link to Font Stylesheet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example CSS Rule for this implementation, placed in JavaScript of yourComponent.js:&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Va8XP2m2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpa5c60ak0knkn4d9xyr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Va8XP2m2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpa5c60ak0knkn4d9xyr.png" alt="Lit CSS Rule with Font-Family"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Considerations When Rendering Fonts
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Font-Display
&lt;/h4&gt;

&lt;p&gt;According to &lt;a href="https://css-tricks.com/almanac/properties/f/font-display/#:~:text=swap%20%3A%20Instructs%20the%20browser%20to,the%20auto%20and%20swap%20values"&gt;CSS Tricks&lt;/a&gt;, the &lt;code&gt;font-display&lt;/code&gt; CSS property dictates how files, such as an externally-retrieved font, are downloaded and rendered. One possible option for the &lt;code&gt;font-display&lt;/code&gt; property is &lt;code&gt;swap&lt;/code&gt;, which immediately loads a local CSS font (the first available in the &lt;code&gt;font-family&lt;/code&gt; property) until the imported font is downloaded and displayed. This initial font is called a &lt;em&gt;fallback&lt;/em&gt;, and allows for the page to render notably faster than other options of font-display because the page is not stuck waiting for a font to use. The one caveat to this is that the page's font may briefly appear in an "unstyled" state, which could be undesirable to some developers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rendering Methodologies
&lt;/h4&gt;

&lt;p&gt;Rendering web pages can be done in a few different ways, and should be chosen based on the desired use cases for a developer's work. Google Developers has a useful &lt;a href="https://developers.google.com/web/updates/2019/02/rendering-on-the-web"&gt;article&lt;/a&gt; in which they break down five of the most common rendering methodologies, elaborating upon their pros and cons and when using each would be helpful. The following diagram provides a brief overview of the article's comparison:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fl-qF1uf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kul2h28wu2uw7v9qqqd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fl-qF1uf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kul2h28wu2uw7v9qqqd5.png" alt="Google Web Dev Rendering Methodologies"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Sources:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fonts.google.com/specimen/Roboto"&gt;Google Fonts Sample&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/almanac/properties/f/font-display/#:~:text=swap%20%3A%20Instructs%20the%20browser%20to,the%20auto%20and%20swap%20values"&gt;CSS Tricks font-display&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/web/updates/2019/02/rendering-on-the-web"&gt;Rendering on the Web Article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mobile.twitter.com/thinkLikeADev/status/1428729216800075776"&gt;Rendering on the Web Diagram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>design</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Considerations for Building Web Components </title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 11 Oct 2021 01:56:27 +0000</pubDate>
      <link>https://dev.to/dronk6/considerations-for-building-web-components-4nie</link>
      <guid>https://dev.to/dronk6/considerations-for-building-web-components-4nie</guid>
      <description>&lt;p&gt;When building a web component, designing the component itself should start with examining considerations for its design, security, and accessibility. Considerations can vary based on what the component's eventual purpose, but common goals for web components include easy access and reusability. As such, major considerations could be the different properties a component might have, as well as the states the component can maintain and how much customization can be applied to it.&lt;/p&gt;

&lt;p&gt;In my case, I'm currently working with my team to design an infographic card. The ultimate goal is for this to be a web component that can be modified based on a user's requirements, but maintains a fairly consistent layout and structure. The card will have a colored banner that includes an icon, title, and sub-title, as well as a content box beneath it to hold text. Major considerations for this card include how the card will resize based on different information inputted by a user, as well as what properties must be modified to ensure someone can customize the card to their specific use case. &lt;/p&gt;

&lt;h3&gt;
  
  
  Atomic Design
&lt;/h3&gt;

&lt;p&gt;To ensure this card is reusable at every level, my team and I intend to utilize the principles of &lt;a href="https://atomicdesign.bradfrost.com/chapter-2/"&gt;atomic design&lt;/a&gt;. This will allow us to break our larger card up into smaller components, which will then be combined to create a cohesive product. The following will be smaller "atoms" which will eventually become our molecule: a functioning card.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The icon &lt;/li&gt;
&lt;li&gt;The banner (includes the icon, header text, and sub-header text)&lt;/li&gt;
&lt;li&gt;The skeleton of the card (a card that contains header and content sections)&lt;/li&gt;
&lt;li&gt;The complete card (a composition of the above atoms)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Difficulties
&lt;/h3&gt;

&lt;p&gt;While atomic design is likely to help our team build this card efficiently and pay closer attention to the necessary requirements and considerations, there are nearly guaranteed to be bumps in the road. Responsive resize within a fixed area can be fairly difficult, and a major use case we'll be trying to account for is someone placing a multi-line title in the banner. Taking the time to design elegant adjustments to our banner component should, hopefully, result in a better card all-around. &lt;/p&gt;

&lt;p&gt;Another consideration I had not immediately thought of is security. Even though we aren't accessing any user data or providing any sensitive data, the SVG (small vector graphic) format we'll be using for our card's icon is a known attack vector for embedded JavaScript attacks. As such, we need to make sure that a bad actor cannot misuse a valuable component of our card to harm users who interact with our product. This could reflect poorly on us and those using our component, not to mention the person whose information is made vulnerable by such an attack.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lessons Learned
&lt;/h3&gt;

&lt;p&gt;Having already built a web component, a button, I feel our team is coming into this project with a clearer understanding of how to interact with and build web components. The structure of LitElement was previously foreign to us, so our first project allowed us to strengthen our knowledge of how Lit works. In addition, I got much more comfortable with CSS during the first assignment. As our team made a circular button that responsively resizes based on its content, I was dealing with CSS I had never touched before. This ultimately pushed me to learn enough to &lt;em&gt;maybe&lt;/em&gt; be dangerous, so I'm looking forward to taking those lessons with me into working on this card.&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Progress Update: Button Web Component</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 27 Sep 2021 01:52:41 +0000</pubDate>
      <link>https://dev.to/dronk6/progress-update-button-web-component-4p02</link>
      <guid>https://dev.to/dronk6/progress-update-button-web-component-4p02</guid>
      <description>&lt;p&gt;Since starting the development of a call-to-action (CTA) button for IST 402, I have encountered quite a few challenges while learning a lot about open web components and LitElement. My partner and I chose to develop a CTA button modeled after a circular button on an e-commerce clothing site, which would act as a building block for learning about atomic web design. &lt;/p&gt;

&lt;h4&gt;
  
  
  Progress
&lt;/h4&gt;

&lt;p&gt;Thus far, my partner and I have created the button component itself, linked it, and have completed a lot of the responsive CSS behavior for the button itself. This includes resizing the button when different text is inserted into it, as well as changes in state when it is hovered over and focused on. We plan to also create behavior for "active" and "disabled" states, and are currently working on these. In addition, we've added optional icon support that features conditional rendering, allowing for the creation and removal of an icon in our button from the "inspect" tab of a browser. We have began working on our button's dark mode behavior as well, designing a way for dark mode to be initiated within the button's tag. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is the repository that exhibits our progress thus far: &lt;a href="https://github.com/3B4B/circle-button-ad"&gt;circle-button-ad Repository&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Challenges
&lt;/h4&gt;

&lt;p&gt;Building a responsive, reusable circular button is hard. As the lead developer in my partner team, I learned this very quickly and figured out my knowledge of CSS was &lt;em&gt;not great&lt;/em&gt; almost immediately. That said, lots of browsing CSS on overly-specific sites has led to me learning a lot more about it than I assumed I would when starting this button. I can proudly say I know more about styling a button than I did when I started this assignment.&lt;br&gt;
As web components are something I've never extensively worked with until now, this also presented a learning curve. LitElement seemed intuitive when I was using a hello-world boilerplate, but getting familiar with its inner workings took more time than I'd like to admit. This isn't a shortcoming of the structure so much as it is my lack of experience with it. As I've continued to work in the directory structure that our web component is set up, I've become more familiar with it and feel that my understanding of our button has gotten much better. For instance, learning how the demo folder's index.html file interacts with my JavaScript file in my src folder has allowed me to vastly improve the way I visually test the functionality of our button--and increase its customizability.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>JS Frameworks: Comparing Boilerplates</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 13 Sep 2021 04:19:14 +0000</pubDate>
      <link>https://dev.to/dronk6/js-frameworks-comparing-boilerplates-32jf</link>
      <guid>https://dev.to/dronk6/js-frameworks-comparing-boilerplates-32jf</guid>
      <description>&lt;p&gt;Having explored "Hello World" boilerplates created with Vue.js, Stencil.js, React, and Angular for IST 402, certain similarities and differences among some of JavaScript's most popular frameworks came to the forefront. In this post, I will also provide feedback on my choice between the four when it comes to developer experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Similarities and Differences
&lt;/h3&gt;

&lt;p&gt;The most striking similarity between the four boilerplates I investigated was the significant number of dependencies they required. Prior to running any of the boilerplates, &lt;code&gt;npm install&lt;/code&gt; was followed by a long series of dependency installations, and a new (and very large) &lt;code&gt;node_modules&lt;/code&gt; folder within the project files. Once this was complete, though, all of the boilerplates were able to run locally and presented a similar webpage experience. As all of these projects run, at some level, on JavaScript, they also maintained a fairly similar file structure: an index.html file that maintained the markup that would display when the application was run, as well as package.json and ReadMe files. &lt;/p&gt;

&lt;p&gt;A significant difference between the four boilerplates is where they get their logic from for the base page. In Stencil's case, this actually a TypeScript file--not JavaScript--and is located in the same folder as its index.html. The other three, on the other hand, utilize JavaScript as their main driver for the logic of their pages. However, where this JavaScript is stored varies, and in the case of Vue.js, it is combined with HTML tags in a special file type that has a .vue extension. Another noteworthy difference here is that Stencil is actually not technically a framework, despite me noting it as one for the sake of simplicity. Rather, it is labeled as a "toolchain," which can be used to create web components in conjunction with many popular JS frameworks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer Experience
&lt;/h3&gt;

&lt;p&gt;Of the four boilerplates, I found the React project to be the easiest to get going. Whether this was good design by the creator of the boilerplate I had tested or just React's intuitive nature, I noticed that getting the boilerplate up and running was very easy. This, compared to the amount of dependency-checking and messing around I had to do with Angular and Vue, was a breath of fresh air. Having never used it before, I appreciated that React had everything I needed to make changes to the main page encapsulated into one folder. In a similar vein, I noticed React seems to have a large community of support behind many of its components and dependencies, which would have been helpful had I run into any issues getting my code to run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which would I choose?
&lt;/h3&gt;

&lt;p&gt;Despite what I just said about React, given the opportunity to begin building an app on impulse I'd choose to work with Stencil.js. It was almost as easy as React to get up and running, and I think it'd be easier to manipulate past the "getting started" phase of working with it. Stencil's prioritization of web component compatibility is really attractive given how tough it can be to ensure all users can view your application. Further, the added accessibility that Stencil provides due to its ability to be embedded into other web frameworks also seems to add a useful level of flexibility. Although I do not know TypeScript, which it relies on for its logic, every option would have its adjusting due to the amount of jargon the other frameworks employ.&lt;/p&gt;

&lt;p&gt;*These conclusions were reached based on the research performed by my team and the boilerplates that are located in &lt;a href="https://github.com/3B4B/boilerplates"&gt;this&lt;/a&gt; GitHub repository. I located my specific boilerplate, which was written with Vue.js, &lt;a href="https://www.npmjs.com/package/vue-hello-world-boilerplate"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setting up open-wc on Windows 10</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 30 Aug 2021 03:59:25 +0000</pubDate>
      <link>https://dev.to/dronk6/setting-up-open-wc-on-windows-10-145a</link>
      <guid>https://dev.to/dronk6/setting-up-open-wc-on-windows-10-145a</guid>
      <description>&lt;p&gt;To set up Open Web Components, or open-wc, on your Windows 10 machine, we will complete the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install the latest version of &lt;strong&gt;Node LTS&lt;/strong&gt; and &lt;strong&gt;NPM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;strong&gt;Yarn&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set up &lt;strong&gt;open-wc&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;To perform the following steps, please be sure to have administrative privileges on your machine and access to the internet.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Node and NPM
&lt;/h3&gt;

&lt;p&gt;Node.js and its package manager, known as Node Package Manager (npm) can be installed from &lt;a href="https://nodejs.org/en/"&gt;this link&lt;/a&gt;. Be sure to choose the &lt;strong&gt;LTS&lt;/strong&gt; version when selecting which build of Node to download, and follow the installation prompts that appear upon successful download of the Node installer. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;During the installation process, you may be asked to grant certain permissions or accept agreements. You must do so to properly utilize Node. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NPM will automatically install with Node, and you can verify that both of these programs are up-to-date by opening Windows PowerShell and typing the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To determine Node's version: &lt;code&gt;node -v&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;To determine npm's version: &lt;code&gt;npm -v&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Yarn
&lt;/h3&gt;

&lt;p&gt;Yarn, an alternative version of the aforementioned npm, can be installed from the command line using the following steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Windows PowerShell.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;npm install -g yarn&lt;/code&gt; and press Enter.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;If you receive a permissions-related error upon entering this command, your account may not have administrative permissions. To circumvent this, attach &lt;code&gt;sudo&lt;/code&gt; to the beginning of your command. In this case, the command would be &lt;code&gt;sudo npm install -g yarn&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Optional: To verify the latest version of yarn has been installed, you can enter the command &lt;code&gt;yarn -v&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Open-wc
&lt;/h3&gt;

&lt;p&gt;Now that we have our dependencies installed, we can set up open-wc!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Before taking these steps, be sure to navigate to the directory in which you would like to do so.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In PowerShell, this can be done using the &lt;code&gt;cd&lt;/code&gt; command, followed by your desired directory path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you are in the folder that will contain your web component, you can utilize the following commands in PowerShell to create your component:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;npm init @open-wc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Select "Scaffold a new project" from the options that appear.&lt;/li&gt;
&lt;li&gt;Choose "Web Component" from the new list of options.&lt;/li&gt;
&lt;li&gt;A list of three tooling options (Linting, Testing, and Demoing) will appear. Enable all three.&lt;/li&gt;
&lt;li&gt;Select "no" when asked if you are using Typescript.&lt;/li&gt;
&lt;li&gt;Give your project a name (using lowercase only).&lt;/li&gt;
&lt;li&gt;Select "Yes" to the following prompts: "Write this file structure to a disk" and "Using yarn."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Upon the completion of these steps, your web component is complete!&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can verify this by using &lt;code&gt;cd&lt;/code&gt; followed by your project's name to view the directory entry of your project.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>openwc</category>
      <category>npm</category>
    </item>
    <item>
      <title>IST 402: Introduction</title>
      <dc:creator>Drew Ronk</dc:creator>
      <pubDate>Mon, 30 Aug 2021 02:58:27 +0000</pubDate>
      <link>https://dev.to/dronk6/ist-402-introduction-37d8</link>
      <guid>https://dev.to/dronk6/ist-402-introduction-37d8</guid>
      <description>&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;Hi Everyone,&lt;/p&gt;

&lt;p&gt;My name is Drew and I'm a senior at Penn State studying the Design &amp;amp; Development track of the Information Sciences and Technology major. Although I am also pursuing a minor in Security and Risk Analysis, my true interests lie in web development--which is why I'm writing this introduction! &lt;/p&gt;

&lt;p&gt;Outside of the classroom, I work as a Learning Assistant within the College of IST and volunteer as an IST Diplomat, working as a student ambassador for the College. I really enjoy hanging out with my friends, keeping up with everything PSU sports, and being outside (pickup football, snowboarding, and spikeball are some favorites).&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Dev?
&lt;/h3&gt;

&lt;p&gt;This past summer, I had the opportunity to work as a full-stack software engineer for Alarm.com. I was interested in web development prior to the internship; but, if my time there taught me anything, it's that I really enjoy working on things that end users directly interact with. Thus, I'm taking this Web Components course to improve my web development skills as I look for full-time careers.&lt;/p&gt;

&lt;p&gt;The environment and its current state have become a recent passion/concern of mine, so my goal upon graduation is to find a career where I can positively impact the environment's declining state. I took a few climate science classes last semester, and while I did not enjoy the nitty-gritty of climatology, I saw the opportunity to make a difference with something I do enjoy. Web development may not seem like the place to start fighting climate change, but I think accessibility to information is an integral part of encouraging some long-overdue improvement to society's environmental practices. Hearing Professor Ollendyke mention that we would be prioritizing accessibility for the work we do in this course really excited me, so I'm looking forward to learning more!&lt;/p&gt;

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