<?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: Chase Adams</title>
    <description>The latest articles on DEV Community by Chase Adams (@curiouslychase).</description>
    <link>https://dev.to/curiouslychase</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%2F80531%2F519846e0-0efd-4327-b900-bf3187ea1a08.jpeg</url>
      <title>DEV Community: Chase Adams</title>
      <link>https://dev.to/curiouslychase</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/curiouslychase"/>
    <language>en</language>
    <item>
      <title>Understanding Structured, Non-Structured, and Semi-Structured Data</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Sat, 15 Jul 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/understanding-structured-non-structured-and-semi-structured-data-2c7n</link>
      <guid>https://dev.to/curiouslychase/understanding-structured-non-structured-and-semi-structured-data-2c7n</guid>
      <description>&lt;p&gt;Data. A simple four-letter word, yet it represents an intricate and expansive world of information. It's the raw facts, figures, and details that, when properly analyzed, give us invaluable insights.&lt;/p&gt;

&lt;p&gt;Yet, data isn't a one-size-fits-all concept.&lt;/p&gt;

&lt;p&gt;There are different kinds of data: structured, non-structured, and semi-structured. Each holds its own significance, use cases, and ways of interpretation.&lt;/p&gt;

&lt;p&gt;Join me on this exciting expedition into the landscape of data types. &lt;/p&gt;

&lt;p&gt;We'll dive into what each type entails, how they differ, and why each one matters. &lt;/p&gt;

&lt;p&gt;Though data might seem daunting at first, gaining a clear understanding of these types is your first step towards mastery. So, buckle up and let's begin our data exploration!&lt;/p&gt;

&lt;h1&gt;
  
  
  Learning Outcomes
&lt;/h1&gt;

&lt;p&gt;By the end of this blog post, here's what you'll have added to your knowledge toolbox:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An unambiguous understanding of the three main types of data: structured, non-structured, and semi-structured.&lt;/li&gt;
&lt;li&gt;A handle on the unique attributes that set apart each type of data.&lt;/li&gt;
&lt;li&gt;Exposure to tangible examples of each type of data in everyday life and business contexts.&lt;/li&gt;
&lt;li&gt;Insights into the specific value and use cases for each data type.&lt;/li&gt;
&lt;li&gt;A comprehensive understanding of the key differences between structured, non-structured, and semi-structured data.&lt;/li&gt;
&lt;li&gt;A sense of how recognizing and distinguishing these data types can strengthen your data handling and analytical strategies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Acquiring this knowledge about data types isn't merely about gathering information. &lt;/p&gt;

&lt;p&gt;It equips you with essential tools to approach data more effectively, allowing you to work with data with the precision and foresight of a craftsman. &lt;/p&gt;

&lt;p&gt;Whether you're a data professional, an aspiring data enthusiast, or a curious reader, these insights will help you navigate the world of data more confidently. &lt;/p&gt;

&lt;p&gt;Let's embark on thit journey together!&lt;/p&gt;

&lt;h1&gt;
  
  
  Who This Is For
&lt;/h1&gt;

&lt;p&gt;This blog post is designed for a wide audience, catering to various levels of familiarity with data:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data Professionals:&lt;/strong&gt; If you're a data scientist, data analyst, database administrator, or data engineer, this post will help reinforce your understanding and perhaps offer a new perspective on the types of data you encounter daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Enthusiasts:&lt;/strong&gt; If you're enthusiastic about technology and have a keen interest in learning about the data that fuels it, this post will provide you with a foundational understanding of different data types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Career Shifters:&lt;/strong&gt; If you're considering a career shift into the world of data or tech, this knowledge will prove instrumental in developing your understanding of how dat is classified and processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Academic Learners:&lt;/strong&gt; For students and researchers in the fields of computer science, information technology, or data science, this post serves as a valuable resource to strengthen your academic understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General Readers:&lt;/strong&gt; Even if you don't belong to the above categories but are curious about data and its implications in our digital age, this post can quench your thirst for knowledge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In essence, anyone who seeks to unravel the layers of data, comprehend its forms, and appreciate its power and potential, will find value in this exploration of structured, non-structured, and semi-structured data. Here's to the joy of learning together!&lt;/p&gt;

&lt;h1&gt;
  
  
  Unstructured Data: The Wild West of Information
&lt;/h1&gt;

&lt;p&gt;If structured data is a well-organized bookshelf, then unstructured data is akin to a treasure chest, filled with an array of diverse and untamed elements, just waiting to be explored.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Unstructured Data?
&lt;/h2&gt;

&lt;p&gt;Unstructured data refers to data that doesn't conform to a predefined model or schema. It's not organized in a pre-defined manner and doesn't follow a consistent format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Characteristics of Unstructured Data
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Variety:&lt;/strong&gt; Unstructured data comes in many forms. It could be text files, social media posts, emails, audio files, videos, images, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unpredictable:&lt;/strong&gt; Unlike structured data, unstructured data doesn't follow a predictable pattern. Its inconsistency can make it more difficult to process and analyze.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voluminous:&lt;/strong&gt; Given its varied sources, unstructured data often comprises the bulk of data that organizations and individuals handle.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example of Unstructured Data
&lt;/h2&gt;

&lt;p&gt;Consider a collection of customer reviews on an e-commerce website. The reviews can be of varying lengths, use different language styles, contain images, videos, or emojis, and don't follow a standard format.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Unstructured Data: When and Why it's Used
&lt;/h2&gt;

&lt;p&gt;Unstructured data might seem like a messy treasure chest, but it holds valuable insights. With the right tools and techniques, like machine learning and natural language processing, these insights can be unlocked and used to improve customer experiences, make business predictions, and enhance decision-making processes. It's often utilized in sentiment analysis, predictive modeling, and other advanced analytics applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  Structured Data: The Order in the Chaos
&lt;/h1&gt;

&lt;p&gt;In the realm of data, structured data is like a well-organized bookshelf, where each book has its specified place, and you know exactly where to find what you're looking for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Structured Data?
&lt;/h2&gt;

&lt;p&gt;Structured data is data that adheres to a predefined model or schema. It's neatly organized and easy to understand because it resides in fixed fields within a record or a file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Characteristics of Structured Data
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency:&lt;/strong&gt; Structured data is consistent in nature. The format remains the same throughout the dataset, allowing for easier analysis and interpretation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Organized:&lt;/strong&gt; Like books on a well-ordered shelf, structured data is organized into rows and columns, which can be easily accessed and understood.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Searchable:&lt;/strong&gt; Thanks to its organization, structured data can be easily queried. You can search for specific information using simple queries, almost as easily as picking a book from a shelf.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example of Structured Data
&lt;/h2&gt;

&lt;p&gt;Imagine a library catalog. It has fields for the book's title, author, publication date, and ISBN number. Each of these fields represents a column, and each book entry (or row) follows the same structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Structured Data: When and Why it's Used
&lt;/h2&gt;

&lt;p&gt;Structured data shines when it comes to efficiency and accuracy. Its clear organization allows for quick searches and precise data analysis, which is invaluable in scenarios where time and accuracy are paramount. It's widely used in relational databases and spreadsheets, where the structured format lends itself well to tasks like data mining and statistical analysis.&lt;/p&gt;

&lt;p&gt;Unstructured data, with its unexplored potential, adds an exciting layer to the world of data. But what if there was something that straddles the line between the strict order of structured data and the wild unpredictability of unstructured data? Enter semi-structured data, our next destination in this data exploration journey. Buckle up!&lt;/p&gt;

&lt;h1&gt;
  
  
  Semi-Structured Data: A Fusion of Worlds
&lt;/h1&gt;

&lt;p&gt;In our data universe, if structured data is a well-ordered bookshelf and unstructured data is a treasure chest of assorted items, then semi-structured data strikes a balance between the two. It's like a garden: not as rigidly organized as a bookshelf, but not as chaotic as a treasure chest either. Each plant has its place, but the layout isn't uniform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Semi-Structured Data?
&lt;/h2&gt;

&lt;p&gt;Semi-structured data is a type of data that doesn't conform to the strict structure of data models, yet it contains tags or other markers to separate data elements and enforce hierarchies of records and fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Characteristics of Semi-Structured Data
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Flexible:&lt;/strong&gt; Semi-structured data allows for a level of organization without the rigidity of structured data. It offers a flexible model that can handle variations in the type of data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tagged:&lt;/strong&gt; Elements in semi-structured data are often separated by tags or markers, which help in defining the hierarchy and order of the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Describing:&lt;/strong&gt; Unlike structured data, semi-structured data often includes metadata that provides information about the data itself.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example of Semi-Structured Data
&lt;/h2&gt;

&lt;p&gt;An excellent example of semi-structured data is a JSON (JavaScript Object Notation) file. It doesn't follow a strict tabular format, but its elements are tagged and organized in a way that represents the hierarchy and order of the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Semi-Structured Data: When and Why it's Used
&lt;/h2&gt;

&lt;p&gt;The strength of semi-structured data lies in its flexibility. It can store complex and hierarchical data, making it suitable for situations where the data model might not be strictly defined or may change over time. Its typical use cases include data interchange between systems and storage of complex data structures, like XML files or emails.&lt;/p&gt;

&lt;p&gt;Exploring semi-structured data completes our journey through the different types of data. But understanding the value of each in isolation is not enough. Up next, we'll see how these data types differ from one another, deepening our understanding of when to use which. Let's continue the exploration!&lt;/p&gt;

&lt;h1&gt;
  
  
  Structured vs. Non-Structured vs. Semi-Structured Data: The Comparative Landscape
&lt;/h1&gt;

&lt;p&gt;We've journeyed through the individual worlds of structured, non-structured, and semi-structured data. But the world of data comes alive in all its glory when we understand these forms not just in isolation, but in relation to each other. Let's delve into the comparative landscape.&lt;/p&gt;

&lt;h2&gt;
  
  
  How They Differ
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Organization:&lt;/strong&gt; Structured data is neatly organized in rows and columns, like books on a shelf. Unstructured data is as diverse and untamed as a treasure chest of assorted items. Semi-structured data strikes a balance, akin to a garden where each plant has its place, but the layout isn't strictly uniform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Searchability:&lt;/strong&gt; The organization of structured data allows for easy querying, making specific information readily accessible. Searching unstructured data is more challenging due to its lack of uniformity, often requiring sophisticated tools. Semi-structured data, with its tagging and metadata, facilitates a certain level of searchability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume:&lt;/strong&gt; Structured data usually represents the smaller portion of an organization's data. In contrast, unstructured data often makes up the bulk, given its varied sources. Semi-structured data can vary in volume depending on the specific use case and the data sources involved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Analysis:&lt;/strong&gt; Structured data lends itself well to straightforward, traditional data analysis techniques. Unstructured data, on the other hand, often requires more advanced techniques like machine learning for extraction of insights. Semi-structured data can be handled using a combination of these methods, depending on its structure and complexity.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Structured Data&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Non-Structured Data&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Semi-Structured Data&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Neatly organized in rows and columns&lt;/td&gt;
&lt;td&gt;Diverse and untamed&lt;/td&gt;
&lt;td&gt;Strikes a balance between organization and flexibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Searchability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easy to query due to organization&lt;/td&gt;
&lt;td&gt;More challenging due to lack of uniformity&lt;/td&gt;
&lt;td&gt;Facilitated by tagging and metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Volume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usually smaller portion of data&lt;/td&gt;
&lt;td&gt;Makes up the bulk of data&lt;/td&gt;
&lt;td&gt;Varies depending on use case and data sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Straightforward, traditional data analysis techniques&lt;/td&gt;
&lt;td&gt;Requires advanced techniques like machine learning&lt;/td&gt;
&lt;td&gt;Can use a combination of techniques depending on structure and complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Understanding these differences can significantly enhance your data management strategies, helping you decide what type of data to use when, and which analytical tools are best suited for the task. Armed with this knowledge, you're well on your way to becoming a true data craftsman!&lt;/p&gt;

&lt;h1&gt;
  
  
  Finding Value in Different Data Types: Harnessing the Power of Diversity
&lt;/h1&gt;

&lt;p&gt;Understanding the differences between structured, non-structured, and semi-structured data is key, but what truly makes a difference is realizing how to harness their unique attributes in specific scenarios. Let's explore some use cases to illustrate how each type of data can be valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power of Structured Data
&lt;/h2&gt;

&lt;p&gt;Structured data is like a reliable friend. It's predictable, easy to handle, and straightforward in its communication. With its consistency and organization, it's an excellent choice for applications where accuracy and efficiency are critical.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Business Reporting:&lt;/strong&gt; Whether it's a sales report, a financial analysis, or an inventory update, structured data provides the tabular, easy-to-analyze format necessary for such tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Relationship Management (CRM):&lt;/strong&gt; CRMs typically store data in a structured format, such as customer names, contact details, and purchase histories. This allows for efficient searching and handling of customer information.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Unearthing the Potential of Unstructured Data
&lt;/h2&gt;

&lt;p&gt;While unstructured data may seem like a challenge with its diversity and lack of consistent format, it hides gems of insights waiting to be unearthed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis:&lt;/strong&gt; Social media posts, product reviews, or customer feedback are often unstructured but are goldmines for understanding customer sentiment towards a product, service, or brand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice of Customer (VoC) Programs:&lt;/strong&gt; Unstructured data from customer calls or support tickets can be processed and analyzed to extract valuable customer insights, aiding in decision making and strategy development.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Leveraging the Flexibility of Semi-Structured Data
&lt;/h2&gt;

&lt;p&gt;With the capability to straddle the line between structure and flexibility, semi-structured data offers the best of both worlds.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Web Data Extraction:&lt;/strong&gt; Web pages, which are typically semi-structured, can be efficiently crawled to extract relevant information, useful for applications like price comparison, sentiment analysis, or brand monitoring.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email Analysis:&lt;/strong&gt; Emails, with their blend of structured (header information) and unstructured (body content) data, can be considered semi-structured. Analyzing email data can provide insights for communication audits, fraud detection, or customer service improvement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understanding the value and specific use cases of structured, non-structured, and semi-structured data helps in selecting the right data type for the right situation. It's like choosing the perfect tool from your data toolbox to craft a masterpiece. &lt;/p&gt;

&lt;p&gt;Now, isn't that a valuable skill to have in our data-driven world? &lt;/p&gt;

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

</description>
    </item>
    <item>
      <title>Code Review Process</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Fri, 24 Mar 2023 17:44:17 +0000</pubDate>
      <link>https://dev.to/curiouslychase/code-review-process-al1</link>
      <guid>https://dev.to/curiouslychase/code-review-process-al1</guid>
      <description>&lt;p&gt;A friend asked me: "how do you generally approach code reviews? what's your mindset? do you have a checklist?"&lt;/p&gt;

&lt;p&gt;Here's my process as it is now (it's iterated over time)!&lt;/p&gt;

&lt;h2&gt;
  
  
  My Process for Code Reviews
&lt;/h2&gt;

&lt;p&gt;I do my reviews in 3 &lt;strong&gt;stages&lt;/strong&gt; and 3 &lt;strong&gt;passes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 Stages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pause&lt;/strong&gt; - This is to orient &lt;em&gt;me&lt;/em&gt; towards the person requesting review and towards curiosity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore&lt;/strong&gt; - Review the code, attempting to be curious and noticing any judgment or suggestions that come up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suggest&lt;/strong&gt; - Review the code again, adding comments for noticings and suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 1: Pause
&lt;/h3&gt;

&lt;p&gt;This stage is about orienting, I don't &lt;em&gt;look at the Pull Request&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Here are the steps I take in this stage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I &lt;strong&gt;orient myself towards the person&lt;/strong&gt; I’m doing the code review for. What do I know about their style? What do I know about their goals? How do I get into a mindset of energetic collaboration.&lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;place myself&lt;/strong&gt;. How am I feeling outside of this code review? What have I experienced today? What are my feelings? I put anything that comes up in a note in &lt;a href="https://curiouslychase.com/notes/obsidian"&gt;Obsidian&lt;/a&gt; as a container and &lt;strong&gt;attempt to detach extrensic experiences and feelings from the review&lt;/strong&gt;. This is important so that I don’t bring it with me into the review)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I orient myself towards curiosity&lt;/strong&gt;. I want this review to start from curiosity. In tech, so much of what we have been &lt;em&gt;taught&lt;/em&gt; matters is &lt;strong&gt;defensive&lt;/strong&gt; and &lt;strong&gt;judgmental&lt;/strong&gt;. It's not to say there isn't a place to &lt;em&gt;assess the code&lt;/em&gt; and &lt;em&gt;make suggestions&lt;/em&gt;, but the goal of this step is to &lt;strong&gt;reduce my ego as much as possible.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stage 2: Explore
&lt;/h3&gt;

&lt;p&gt;This stage is about going on an adventure in the Pull Request!&lt;/p&gt;

&lt;p&gt;In this stage, I take these steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I orient myself towards the goal.&lt;/strong&gt; I read the description. I attempt to rephrase it so I understand it. If any questions come up, I first verify they're not "suggestions disguised as questions" and if they're curious questions, I write them down. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I read the code a first time, starting at the top of the PR.&lt;/strong&gt; I try to understand what's happening. I don't make notes. I don't add any comments. I just try to understand &lt;em&gt;what&lt;/em&gt; is happening. I hold the code lightly. &lt;strong&gt;I notice places where I hit drag in reading&lt;/strong&gt;. Usually drag indicates something isn't clearly. If I notice I hit drag, I write questions from curiosity about the drag. I make notes of if something came up as a noticing, judgment or suggestion but I don't add them to the Pull Request. I will make a note of where I think the execution context is at the end of the read for stage 3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I read the code a second time, starting at the top of the PR.&lt;/strong&gt; In the second run, I look for what wasn't clear on a first read. I look to my questions I wrote down. If they're related, I make them as comments. Any comments I add as questions to a review, I start with ❓ so they're easier for me to find later. I review the execution context I guessed on the first pass.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point I take a 15 minute break and do something else. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taking a break allows my subconscious to sit with my two passes through the code&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: Suggest
&lt;/h3&gt;

&lt;p&gt;This stage is where I make suggestions based on my noticings of drag.&lt;/p&gt;

&lt;p&gt;Here are the steps to my suggestions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;I read the code a third time, starting at the &lt;em&gt;most obvious entrypoint to the execution context&lt;/em&gt;&lt;/strong&gt;. At this point, I've seen the code twice and am oriented towards what it's doing. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I make suggestions where the intent is clear.&lt;/strong&gt; I make suggestions in three cases: a fairly obvious security issue, a way to make the code more readable without sacrificing performance, performance benefits that don't reduce readability. In these cases I try to be &lt;em&gt;really clear&lt;/em&gt; about what I noticed, which of these buckets I'm making a recommendation for and why I think the recommendation could make it a little better.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notice where someone did &lt;em&gt;great work&lt;/em&gt;!&lt;/strong&gt; I try to notice where I appreciate that the requester has done something that crushes for me and tell them I appreciate it and why. &lt;strong&gt;I think this has 3 benefits.&lt;/strong&gt; 1. They get a dopamine hit. 2. I get a dopamine hit. 3. I reinforce what I think matters in a codebase. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Some Quick Tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;a href="https://curiouslychase.com/notes/loom"&gt;Loom&lt;/a&gt; for comments.&lt;/strong&gt; Add text to your comments, but also if you can, use a loom here and there and in the comment for the review. &lt;strong&gt;Looms help set emotional context for the person you're reviewing for.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stay curious.&lt;/strong&gt; This code is about a thing someone put effort into. Recognize that they put their energy into it, be grateful for that and ask yourself how you help &lt;em&gt;amplify&lt;/em&gt; their efforts instead of snuffing out their energy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use emoji for comment types and share your heuristic.&lt;/strong&gt; Emoji at the beginning of a comment (for example: "❔ I noticed I slowed down when reading this bit of code and I think it's because I don't understand what it's supposed to do, can you give me a summary of what you were trying to achieve with it?"). Emoji makes your comments easily scannable for both of you &lt;em&gt;and&lt;/em&gt; helps set context for the comment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set navigation points in comments.&lt;/strong&gt; This is hard to do, but it's always been well received when I do it. If you want to create a narrative about your review, use comment hyperlinks and document them in each comment for &lt;strong&gt;back&lt;/strong&gt; and &lt;strong&gt;next&lt;/strong&gt;. This helps the person you're reviewing for understand the narrative instead of having to go top to bottom.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The most important thing to notice here is that &lt;strong&gt;I attempt to do two passes of a code review before making suggestions&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This keeps me curious about what's happening and I think &lt;em&gt;when&lt;/em&gt; I follow this, the experience is usually really positive for me and the person I'm reviewing the code for.&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>productivity</category>
      <category>process</category>
    </item>
    <item>
      <title>Share Specific Lines in a Markdown file with GitHub</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Sun, 24 Mar 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/share-specific-lines-in-a-markdown-file-with-github-4ff0</link>
      <guid>https://dev.to/curiouslychase/share-specific-lines-in-a-markdown-file-with-github-4ff0</guid>
      <description>&lt;p&gt;In the past, when I needed to share a specific line in a Markdown file from GitHub, I'd usually share a link to the Markdown file or a link to the fragment for the header closest to what I wanted to share and say, "look for X".&lt;/p&gt;

&lt;p&gt;In this short GitHub protip, I'll share the hack I discovered that allows you to share specific lines from a Markdown file.&lt;/p&gt;

&lt;p&gt;I'm using Hashicorps HCL repo as an example, but the concepts work with any Markdown file on GitHub. We're going to be sharing specific lines about how to write comments in HCL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing a line with GitHub UI
&lt;/h2&gt;

&lt;p&gt;First, open a GitHub project and find the &lt;code&gt;README.md&lt;/code&gt; &lt;sup id="fnref1"&gt;1&lt;/sup&gt;. (If you don't have one handy, feel free to follow along &lt;a href="https://github.com/hashicorp/hcl"&gt;in the hashicorp/HCL repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can see that the &lt;code&gt;README.md&lt;/code&gt; is rendered as Markdown instead of source. In the file viewer, find and click &lt;code&gt;README.md&lt;/code&gt;. The view this takes us to is &lt;em&gt;also&lt;/em&gt; rendered as Markdown:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--stLIzVcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-readme-view.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--stLIzVcP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-readme-view.png" alt="GitHub rendered README.md" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our example, the part of the Markdown file that we want to share is "Single line comments start with # or //" and as you can see, there's not a way to do that from this view.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To select a specific line, we're going to use the Blame view.&lt;/strong&gt; Click the &lt;strong&gt;Blame&lt;/strong&gt; button in the top right corner of the content view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L2UbBs_8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-blame.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L2UbBs_8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-blame.png" alt="GitHub button for Blame for README.md" width="880" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new view that we see has the source of the Markdown file, along with the line numbers! Now we can look for "Single line comments start with # or //" and to the left, click the line number (54 as of writing).&lt;/p&gt;

&lt;p&gt;You should notice that the URL Location has changed to include a fragment at the end of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/hashicorp/hcl/blame/master/README.md#L54
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you share this link, it will take the recipient to this page, at this line number and add highlighting to the line you referenced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sharing multiple lines with GitHub UI
&lt;/h2&gt;

&lt;p&gt;If you wanted to share &lt;em&gt;all&lt;/em&gt; of the lines regarding comments instead of just the single line comment, you can do that too! Click the line number you want to start on (again, line 54) and shift+click the line you want to end on (in this case, line 58).&lt;/p&gt;

&lt;p&gt;This adds a URL fragment that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/hashicorp/hcl/blame/master/README.md#L54-L58
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when the recipient follows this link it will take them to the file, go to line 54 and highlight lines 54-58.&lt;/p&gt;

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

&lt;p&gt;This is currently the best way I know of to share specific lines in a Markdown file with GitHub. Hopefully they'll be listening and push out the change I've shared below so this post can become obselete!&lt;/p&gt;

&lt;h2&gt;
  
  
  For GitHub, if you're listening...
&lt;/h2&gt;

&lt;p&gt;You've already nailed this UI with GitHub Actions, so if you're looking for small easy wins, consider applying the switcher for rendered blob and source blob:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c7BjzL9U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-better-buttons.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c7BjzL9U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://chaseonsoftware.com/img/gh-md-better-buttons.png" alt="GitHub rendered README.md" width="368" height="176"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;This works for all markdown files, but this is the one that is most prolific/consistent. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>markdown</category>
      <category>github</category>
    </item>
    <item>
      <title>Writing Drafts in GatsbyJS &amp; Netlify</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Sun, 10 Feb 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/writing-drafts-in-gatsbyjs--netlify-3chn</link>
      <guid>https://dev.to/curiouslychase/writing-drafts-in-gatsbyjs--netlify-3chn</guid>
      <description>&lt;p&gt;There are a few solutions out there for keeping drafts in GatsbyJS, but none achieved what I wanted. The ones I've found required &lt;code&gt;graphql&lt;/code&gt; to do the heavy lifting to filter out drafts which meant a lot of filtering out anything where drafts was false. **If you don't care about the justification, you can skip to &lt;a href="https://dev.to/gatsby-drafts/#how-i-write-drafts-in-gatsby"&gt;the code for how I write drafts in GatsbyJS&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Justification
&lt;/h2&gt;

&lt;p&gt;These were the specifications that led me to the solution I use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to infer which articles are in draft state.&lt;/li&gt;
&lt;li&gt;Single author not using Netlify CMS (works for multiple authors as well, but not required for me).&lt;/li&gt;
&lt;li&gt;The production build/runtime of my site should be totally unaware of drafts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finding Drafts is Clear
&lt;/h3&gt;

&lt;p&gt;I'm a huge advocate for reducing the friction of finding content that has a state of "Work in Progress". Having a separate directory explicitly for drafts helps me do that.&lt;/p&gt;

&lt;p&gt;One of the downsides of using &lt;code&gt;drafts&lt;/code&gt; in frontmatter is that you usually have to &lt;em&gt;search&lt;/em&gt; through the frontmatter with a tool that can tell if a file is a draft (grep, ripgrep, etc) &lt;em&gt;or&lt;/em&gt; keep the state in your brain (which is a bad use of a brain).&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Author Hosting Content on Dropbox
&lt;/h3&gt;

&lt;p&gt;I'm the only author on my Gatsby sites and use Dropbox to host my content. I think this solution could easily work for multiple authors using git as the "backend" (the way you might use Netlify CMS), but I haven't tried that with this pattern so mileage may vary.&lt;/p&gt;

&lt;p&gt;I also use Dropbox to &lt;em&gt;host&lt;/em&gt; my content and builds are done as a result of changes to files. Having a separate drafts folder allows me to write content without triggering unnecessary Dropbox/Netlify hooks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Production Safety
&lt;/h3&gt;

&lt;p&gt;I don't want to have a bunch of drafts filters in my GraphQL. I can't think of a compelling reason for GraphQL to filter drafts when I know that I I don't want drafts in production). Having a separate drafts folder reduces a lot of the complexity (and potential bugs) that would come with using GraphQL to do the same filtering.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Write Drafts in Gatsby
&lt;/h2&gt;

&lt;p&gt;Now to the fun part: configuring Gatsby!&lt;/p&gt;

&lt;p&gt;I have two content folders in my src directory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;content&lt;/code&gt; - the content ready for production&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;drafts&lt;/code&gt; - the content that I'm still working on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are 3 "stages" of the content lifecycle:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;content&lt;/code&gt; present&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;drafts&lt;/code&gt; present&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local Development&lt;/td&gt;
&lt;td&gt;✅ (symlink)&lt;/td&gt;
&lt;td&gt;✅ (symlink)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Production Netlify&lt;/td&gt;
&lt;td&gt;✅ (pulled at build)&lt;/td&gt;
&lt;td&gt;✅ (pulled at build)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production Netlify&lt;/td&gt;
&lt;td&gt;✅ (pulled at build)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is to have a &lt;code&gt;gatsby-source-filesystem&lt;/code&gt; for &lt;code&gt;drafts&lt;/code&gt; in any non-production stage and to not even worry about it in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup for Gatsby Config
&lt;/h3&gt;

&lt;p&gt;In my &lt;code&gt;gatsby-config.js&lt;/code&gt; I have a Gatsby config object (rather than setting the object directly on &lt;code&gt;module.exports&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const cfg = {
  /* ...my default configuration */
};

module.exports = cfg;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then do a conditional check for the environment the environment where Gatsby is building my site (based on Netlify's environment contexts):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (process.env.CONTEXT !== "production") {
  const draftsCfg = {
    resolve: `gatsby-source-filesystem`,
    options: {
      name: `drafts`,
      path: `${__dirname}/src/drafts`
    }
  };
  cfg.plugins.push(draftsCfg);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;process.env.CONTEXT&lt;/code&gt; isn't &lt;code&gt;production&lt;/code&gt;, provide &lt;code&gt;drafts&lt;/code&gt; as a filesystem source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;draftsCfg&lt;/code&gt; is a &lt;code&gt;gatsby-source-filesystem&lt;/code&gt; plugin configuration object, where the &lt;code&gt;sourceInstanceName&lt;/code&gt; of the content is &lt;code&gt;drafts&lt;/code&gt; and the path to the content is the &lt;code&gt;src/drafts&lt;/code&gt; directory inside of the project root.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next we push the &lt;code&gt;draftsCfg&lt;/code&gt; into the &lt;code&gt;plugins&lt;/code&gt; object that Gatsby will use when it builds the site.&lt;/p&gt;

&lt;p&gt;Now whenever Gatsby is run locally or in a non-production branch (because Netlify's preview branches are AWESOME!) and the build in the production environment is totally unaware of the fact that we have a &lt;code&gt;drafts&lt;/code&gt; folder.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caveat
&lt;/h3&gt;

&lt;p&gt;A lot of this looks like it's dependent on using Netlify, but every hosting provider worth its salt provides a way to set environment variables. Netlify does it out of the box, so it was super convenient to hook into that, but it's not a show stopper if you're using another hosting provider.&lt;/p&gt;

&lt;p&gt;Big ❤️ to GatsbyJS and Netlify for making this process super easy!&lt;/p&gt;

</description>
      <category>gatsby</category>
      <category>netlify</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Emacs: Highlight $FlowFixMe comments</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Fri, 30 Nov 2018 00:19:37 +0000</pubDate>
      <link>https://dev.to/curiouslychase/emacs-highlight-flowfixme-comments-13b4</link>
      <guid>https://dev.to/curiouslychase/emacs-highlight-flowfixme-comments-13b4</guid>
      <description>&lt;p&gt;I've been working with Flow a lot since joining Webflow and one of the things that I constantly miss is the &lt;code&gt;// $FlowFixMe&lt;/code&gt; comments. I decided to highlight &lt;code&gt;// $FlowFixMe&lt;/code&gt; comments in red so they stood out.&lt;/p&gt;

&lt;p&gt;Emacs makes it trivial to add configuration to highlight specific lines based on certain criteria. In &lt;code&gt;init.el&lt;/code&gt; or any file that you load configuration through, you can add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight common_lisp"&gt;&lt;code&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;defface&lt;/span&gt; &lt;span class="nv"&gt;flow-fix-me-comment&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:foreground&lt;/span&gt; &lt;span class="s"&gt;"#ff0000"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="s"&gt;"Red"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;font-lock-add-keywords&lt;/span&gt;
   &lt;span class="ss"&gt;'js-mode&lt;/span&gt; &lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;"// $FlowFixMe"&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ss"&gt;'flow-fix-me-comment&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Breaking it down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;defface&lt;/code&gt; allows us to declare a customizable &lt;code&gt;FACE&lt;/code&gt; (you can think of &lt;code&gt;FACE&lt;/code&gt; as a style). We're naming it &lt;code&gt;flow-fix-me-comment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;font-lock-add-keywords&lt;/code&gt; allows us to highlight a mode based on a specific keyword.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'js-mode&lt;/code&gt; is the mode we want to highlight on.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"// $FlowFixMe"&lt;/code&gt; is the term we want to use as the criteria for highlighting.&lt;/li&gt;
&lt;li&gt;If the term matches the line, apply the &lt;code&gt;flow-fix-me-comment&lt;/code&gt; &lt;code&gt;FACE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to &lt;code&gt;eval-buffer&lt;/code&gt; on the snippet, reload your config or restart Emacs to see the changes take place.&lt;/p&gt;

&lt;p&gt;The end result will look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frw5xhedut9pcq4n6qi1h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frw5xhedut9pcq4n6qi1h.png" alt="Use Emacs to highlight $FlowFixMe in Javascript" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're using Emacs to develop for JavaScript and using Flow in your projects, this is a great way to make sure you don't get burnt by any &lt;code&gt;$FlowFixMe&lt;/code&gt; comments during development!&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>flow</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Most Common Programming Case Types</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/most-common-programming-case-types-30h9</link>
      <guid>https://dev.to/curiouslychase/most-common-programming-case-types-30h9</guid>
      <description>&lt;p&gt;When working with computers—specifically while programming—you'll inevitably find yourself naming things (&lt;a href="https://twitter.com/codinghorror/status/506010907021828096?lang=en"&gt;one of the two hard things in computer science&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;A major factor of being successful in naming is knowing the type of case you want to use so that you can have a consistent convention per project/workspace. If you're writing software, you'll come across at least one of these in a languages specification for how it's written. Some languages (Go, particularly) rely heavily on you knowing the difference between two of them and using them correctly!&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The most common case types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Camel case&lt;/li&gt;
&lt;li&gt;Snake case&lt;/li&gt;
&lt;li&gt;Kebab case&lt;/li&gt;
&lt;li&gt;Pascal case&lt;/li&gt;
&lt;li&gt;Upper case (with snake case)&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;How to use them for the following situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming files for a computer (my recommended best practice)&lt;/li&gt;
&lt;li&gt;writing code with Go&lt;/li&gt;
&lt;li&gt;writing code with Ruby&lt;/li&gt;
&lt;li&gt;writing code with JavaScript&lt;/li&gt;
&lt;li&gt;writing code with Python&lt;/li&gt;
&lt;/ul&gt;


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

&lt;h1&gt;
  
  
  camelCase
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;camelCase&lt;/code&gt; must &lt;strong&gt;(1)&lt;/strong&gt; start with a lowercase letter and &lt;strong&gt;(2)&lt;/strong&gt; the first letter of every new subsequent word has its first letter capitalized and is compounded with the previous word.&lt;/p&gt;

&lt;p&gt;An example of camel case of the variable &lt;code&gt;camel case var&lt;/code&gt; is &lt;code&gt;camelCaseVar&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  snake_case
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;snake_case&lt;/code&gt; is as simple as replacing all spaces with a "_" and lowercasing all the words. It's possible to snake_case and mix camelCase and PascalCase but imo, that ultimately defeats the purpose.&lt;/p&gt;

&lt;p&gt;An example of snake case of the variable &lt;code&gt;snake case var&lt;/code&gt; is &lt;code&gt;snake_case_var&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  kebab-case
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;kebab-case&lt;/code&gt; is as simple as replacing all spaces with a "-" and lowercasing all the words. It's possible to kebab-case and mix camelCase and PascalCase but that ultimately defeats the purpose.&lt;/p&gt;

&lt;p&gt;An example of kebab case of the variable &lt;code&gt;kebab case var&lt;/code&gt; is &lt;code&gt;kebab-case-var&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  PascalCase
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;PascalCase&lt;/code&gt; has every word starts with an uppercase letter (unlike camelCase in that the first word starts with a lowercase letter).&lt;/p&gt;

&lt;p&gt;An example of pascal case of the variable &lt;code&gt;pascal case var&lt;/code&gt; is &lt;code&gt;PascalCaseVar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: It's common to see this confused for camel case, but it's a separate case type altogether.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  UPPER_CASE_SNAKE_CASE
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;UPPER_CASE_SNAKE_CASE&lt;/code&gt; is replacing all the spaces with underscores and converting all the letters to capitals.&lt;/p&gt;

&lt;p&gt;an example of upper case snake case of the variable &lt;code&gt;upper case snake case var&lt;/code&gt; is &lt;code&gt;UPPER_CASE_SNAKE_CASE_VAR&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Which case type should I use?
&lt;/h1&gt;

&lt;p&gt;Now that you know the various case types, let's tackle an example of my recommended best practice for filenames and when to use each case for Go, JavaScript, Python &amp;amp; Ruby.&lt;/p&gt;

&lt;h2&gt;
  
  
  What convention should I use when naming files?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Recommendation: always snake case&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When naming files, it's important to ask "what's the lowest common denominator?" If you're not opinionated, I've found I've had the most success with snake case because it's the least likely to create a problem across filesystems and keeps filenames readable for "my_awesome_file".&lt;/p&gt;

&lt;p&gt;If you're a Mac user or work with Mac users, it's a good practice to always use lowercase. Mac's have an HFS+ filesystem and since HFS+ is not case sensitive, it can read "MyFile" or "myfile" as "myfile".&lt;/p&gt;

&lt;p&gt;My predominant argument for this stems from a particularly insidious "bug" I saw when I was running a CI/CD (continuous integration/continuous delivery) cluster. A CI job failed with "file not found: mycomponent.js" during a build for a React project. The developer swore the file was in the project's source, and as I dug through it, I noticed they had an import for "mycomponenet.js" but the file was named "MyComponent.js" (for a React project, where PascalCase is the convention for naming component files). Due to the way HFS+ handles file casing, it happily accepted that "MyComponent.js" was "mycomponent.js" at the time the developer (using a Mac) was writing the code, but ath the time the Unix based CI server was building it, it would fail because it expected exact casing to find the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Go Conventions
&lt;/h2&gt;

&lt;p&gt;Go is the language where it's most critical to pay attention to case type conventions. The language decides whether a variable, field or method should be available to a package caller by if the name starts with a capital or lowercase letter.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pascal case&lt;/strong&gt; is &lt;em&gt;required&lt;/em&gt; for exporting fields and methods in Go&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Camel case&lt;/strong&gt; is &lt;em&gt;required&lt;/em&gt; for internal fields and methods in Go
&lt;/li&gt;
&lt;/ul&gt;

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

type ExportedStruct {
    unexportedField string
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the above example, &lt;code&gt;ExportedStruct&lt;/code&gt; is available to package callers for &lt;code&gt;casetypes&lt;/code&gt; and &lt;code&gt;unexportedField&lt;/code&gt; is only available to methods on &lt;code&gt;ExportedStruct&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Javascript Conventions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Camel case&lt;/strong&gt; for variables and methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal case&lt;/strong&gt; for types and classes in JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upper case snake case&lt;/strong&gt; for constants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  React Conventions
&lt;/h3&gt;

&lt;p&gt;I write enough React and it's unique enougn that it's worth calling out conventions here as a subsection:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pascal case&lt;/strong&gt; is used for component names and file names in React.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ruby Conventions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pascal case&lt;/strong&gt; is used for classes and modules in Ruby.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snake case&lt;/strong&gt; for symbols, methods and variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upper case snake case&lt;/strong&gt; for constants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Python Conventions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snake case&lt;/strong&gt; for &lt;a href="https://www.python.org/dev/peps/pep-0008/#method-names-and-instance-variables"&gt;method names and instance variables&lt;/a&gt; (PEP8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upper case snake case&lt;/strong&gt; for constants.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Other Conventions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;kebab case in &lt;strong&gt;Lisp&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;kebab case in &lt;strong&gt;HTTP URLs&lt;/strong&gt; (&lt;code&gt;most-common-programming-case-types/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;snake case in &lt;strong&gt;JSON&lt;/strong&gt; property keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Quick Comparison Table
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case Type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original Variable as String&lt;/td&gt;
&lt;td&gt;&lt;code&gt;some awesome var&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Camel Case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;someAwesomeVar&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snake Case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;some_awesome_var&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kebab Case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;some-awesome-var&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pascal Case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SomeAwesomeVar&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upper Case Snake Case&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SOME_AWESOME_VAR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now that you've been introduced to the most common case types, you're prepared to hop into most of the popular languages and know what conventions to keep when you're writing your own code!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>python</category>
      <category>go</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Inspect a Collection of Objects in Javascript with console.table</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Mon, 30 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/how-to-inspect-a-collection-of-objects-in-javascript-with-consoletable-1892</link>
      <guid>https://dev.to/curiouslychase/how-to-inspect-a-collection-of-objects-in-javascript-with-consoletable-1892</guid>
      <description>&lt;h1&gt;
  
  
  Learn how to inspect an array or object of objects with console.table in the browser.
&lt;/h1&gt;

&lt;p&gt;When building software in JavaScript, I often need to inspect an array of objects or object of objects.&lt;/p&gt;

&lt;p&gt;One of my favorite methods for achieving this is to use &lt;code&gt;console.table()&lt;/code&gt;. Rather than having to toggle open nested objects that are of the same "type" (in this example we'll use some weird fishes), &lt;code&gt;console.table()&lt;/code&gt; presents the data in a clean, tabular format. It's available in &lt;a href="https://nodejs.org/api/console.html#console_console_table_tabulardata_properties"&gt;NodeJS as of version 10.0.0&lt;/a&gt; and in &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/table#Browser_compatibility"&gt;almost every major browser&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll learn how to use &lt;code&gt;console.table()&lt;/code&gt; by creating an array of objects and calling &lt;code&gt;console.table&lt;/code&gt; to inspect the data using NodeJS and Google Chrome.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;code&gt;console.table()&lt;/code&gt; signature
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;console.table(tabularData[, properties])&lt;/code&gt; is a method that takes two parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tabularData&lt;/code&gt;: a collection of data with any type&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;properties&lt;/code&gt;: an array of strings of the fields you want to use to display the table&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Setup code
&lt;/h1&gt;

&lt;p&gt;First, let's create a file for this example code called &lt;code&gt;weirdfishes.js&lt;/code&gt; and create an array of weird fishes called &lt;code&gt;weirdFishes&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;weirdFishes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common fangtooth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogaster cornuta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogastridae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Fangtooth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vampire squid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vampyroteuthis infernalis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vampyroteuthidae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Vampire_squid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blobfish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Psychrolutes marcidus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogastridae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Blobfish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dumbo octopus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Grimpoteuthis abyssicola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Opisthoteuthidae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Grimpoteuthis_abyssicola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Simple call to console.table()
&lt;/h1&gt;

&lt;p&gt;We're going add a call to &lt;code&gt;console.table()&lt;/code&gt; with &lt;code&gt;weirdFishes&lt;/code&gt; passed in as the first argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weirdFishes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we call &lt;code&gt;console.table&lt;/code&gt; with only the first argument, it will display all of the data inside of each object.&lt;/p&gt;

&lt;h1&gt;
  
  
  Inspect array of objects in NodeJS
&lt;/h1&gt;

&lt;p&gt;Open your favorite terminal emulator application (I used VS Code's Integrated Terminal for the screenshots) and run &lt;code&gt;node weirdfishes.js&lt;/code&gt; within the parent directory of &lt;code&gt;weirdfishes.js&lt;/code&gt;. &lt;strong&gt;Note that this requires nodejs &amp;gt;= v10.0.0)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When we run the command, the console will display a table like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MOVdkI-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/nodejs-console-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MOVdkI-A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/nodejs-console-table.png" alt="Output of running console.table on an array of objects in NodeJS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Inspect array of objects in the Browser (Chrome Example)
&lt;/h1&gt;

&lt;p&gt;The easiest way to see this in action in Chrome is to add the object via the JavaScript console. To open the Javascript console, type &lt;code&gt;cmd + option + j&lt;/code&gt; and a new pane should pop up at the bottom of the browser window.&lt;/p&gt;

&lt;p&gt;Copy the JavaScript snippet from above and paste it into the JavaScript console, press enter and you'll see a table that looks similar to the screenshot below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VARKrZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/chrome-console-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VARKrZr2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/chrome-console-table.png" alt="" title="Output of running console.table on an array of objects in Chrome"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Constructing the table based on keys
&lt;/h1&gt;

&lt;p&gt;Let's revisit the second parameter mentioned earlier: &lt;code&gt;properties&lt;/code&gt;—an array of strings representing the values you want to display. Continuing in the browser example in the JavaScript console, call &lt;code&gt;console.table&lt;/code&gt; with a second argument of &lt;code&gt;["common_names"]&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weirdFishes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calling &lt;code&gt;console.table&lt;/code&gt; with the second argumend constructs the new table with only the index and the values of the keys in the array:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q4JRJeyu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/console-table-only-one-key.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q4JRJeyu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/console-table-only-one-key.png" alt="" title="Output of running console.table on an array of objects in Chrome with only the common name key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Using console.table on an object of objects
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;console.table&lt;/code&gt; also works for an object of objects (because an array is a type of object) and the index will be the key for the child objects. You can see an example of this by running &lt;code&gt;console.table(roleModelsObj)&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;weirdFishes2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;common fangtooth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogaster cornuta&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogastridae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Fangtooth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;vampire squid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vampyroteuthis infernalis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Vampyroteuthidae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Vampire_squid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blobfish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Psychrolutes marcidus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anoplogastridae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Blobfish&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dumbo octopus&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scientific_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Grimpoteuthis abyssicola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;family&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Opisthoteuthidae&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wikipedia_link&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://en.wikipedia.org/wiki/Grimpoteuthis_abyssicola&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;weirdFishes2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see that the table now has the key for each object as the index:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xqwT3sT---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/console-table-object-of-objects.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xqwT3sT---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.chaseadams.io/img/console-table-object-of-objects.png" alt="" title="Output of running console.table on an object of objects in Chrome"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you've got a great alternative to &lt;code&gt;console.log&lt;/code&gt; for displaying objects in JavaScript in tabular form instead of nested data—an alternative that will save you time in inspection and debugging!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>debugging</category>
      <category>webdev</category>
      <category>node</category>
    </item>
    <item>
      <title>Full Page Webpage Snaphots with Chrome DevTools</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Sun, 29 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/full-page-webpage-snaphots-with-chrome-devtools-251</link>
      <guid>https://dev.to/curiouslychase/full-page-webpage-snaphots-with-chrome-devtools-251</guid>
      <description>&lt;h2&gt;
  
  
  Learn how to take full page snapshots of a webpage using Chrome DevTools
&lt;/h2&gt;

&lt;p&gt;Taking full-length screenshots of a webpage is useful for client work, keeping historical references of a website or when you want to have a webpage round-up gallery to show sites that you've found around the web.&lt;/p&gt;

&lt;p&gt;In the past, if you needed to do this, you likely did it incrementally and stitched it together or installed a separate extension in your browser (most had varying results).&lt;/p&gt;

&lt;p&gt;Recently when I was doing some mobile web development and checking how my site looked for various devices with Chrome DevTools, I noticed that Chrome has a baked in way of taking a full length screenshot!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open DevTools.&lt;/strong&gt; In the application menu click &lt;strong&gt;"View"&lt;/strong&gt; , then &lt;strong&gt;"Develop"&lt;/strong&gt; , then &lt;strong&gt;Developer Tools&lt;/strong&gt; (Alternatively you can save some clicks with cmd+option+i on a Mac). You should have a new pane that has tabs for "Elements", "Console", "Sources" and more and below that you will likely see the HTML of the page you're currently on. &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chaseadams.io%2Fimg%2Fchromescreencap_1.gif" title="How to open Chrome DevTools"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toggle Device Toolbar.&lt;/strong&gt; In the top left corner of the new pane, click the second icon from the left for &lt;strong&gt;"Toggle Device Toolbar"&lt;/strong&gt;. A new toolbar should open at the top of the browser's window with options to change the page to be emulate displaying different devices. &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chaseadams.io%2Fimg%2Fchromescreencap_2.gif" title="how to toggle device toolbar"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Take The Screenshot.&lt;/strong&gt; In the new device toolbar, click the &lt;strong&gt;"More Options"&lt;/strong&gt; button (3 vertical dots) in the far right corner and click &lt;strong&gt;"Capture Full Size screenshot"&lt;/strong&gt;. &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chaseadams.io%2Fimg%2Fchromescreencap_3.gif" title="how to take a full-screen screenshot of a website with Chrome DevTools"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now you can take full size screenshots with ease and natively in the browser!&lt;/p&gt;

</description>
      <category>chrome</category>
      <category>devtools</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using Current Date and Time In VS Code Snippets</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Tue, 24 Jul 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/curiouslychase/using-current-date-and-time-in-vs-code-snippets-4gog</link>
      <guid>https://dev.to/curiouslychase/using-current-date-and-time-in-vs-code-snippets-4gog</guid>
      <description>&lt;p&gt;Previously when generating new blog articles, adding dates to Markdown frontmatter was a manual step that required me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Determine the date&lt;/li&gt;
&lt;li&gt;Convert what I read into the date format I use for frontmatter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As of &lt;a href="https://code.visualstudio.com/updates/v1_20#_more-snippet-variables" rel="noopener noreferrer"&gt;VS Code release 1.20&lt;/a&gt;, Snippets have access to the current date and time with one of the following variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CURRENT_YEAR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_YEAR_SHORT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_MONTH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_DATE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_HOUR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_MINUTE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CURRENT_SECOND&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now if I want a frontmatter "date" for Markdown for the current year, month and day (&lt;code&gt;YYYY-MM-DD&lt;/code&gt;), I can add the following to my snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date: \"$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE\"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the published date of this post, the expanded snippet produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date: "2018-07-24"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fwww.chaseadams.io%2Fimg%2Fvscode-current-date-time-in-snippets.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chaseadams.io%2Fimg%2Fvscode-current-date-time-in-snippets.gif" title="Markdown snippet with current date and time automatically inserted"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>snippets</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Enable tab completion for Markdown Snippets in VS Code</title>
      <dc:creator>Chase Adams</dc:creator>
      <pubDate>Sun, 24 Jun 2018 00:00:00 +0000</pubDate>
      <link>https://dev.to/chaseadamsio/enable-tab-completion-for-markdown-snippets-in-vs-code-5gja</link>
      <guid>https://dev.to/chaseadamsio/enable-tab-completion-for-markdown-snippets-in-vs-code-5gja</guid>
      <description>&lt;p&gt;While working on a frontmatter markdown snippet in VS Code I couldn't understand why tab completion wasn't working. It turns out that &lt;a href="https://github.com/Microsoft/vscode/issues/1617" rel="noopener noreferrer"&gt;some extensions (including Markdown) don't have snippet tab completion enabled by default&lt;/a&gt; (you can however type &lt;code&gt;ctrl+Space&lt;/code&gt; to show available snippets with what you've typed).&lt;/p&gt;

&lt;h1&gt;
  
  
  Enable snippet tab completion for all extensions
&lt;/h1&gt;

&lt;p&gt;To enable tab completion in VS Code, open your &lt;strong&gt;User Settings&lt;/strong&gt; (&lt;code&gt;⌘+,&lt;/code&gt; in MacOS, &lt;code&gt;ctrl+,&lt;/code&gt; in Windows) and add the following JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"editor.tabCompletion": true,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save your &lt;strong&gt;User Setttings&lt;/strong&gt; configuration and your on your way to more efficient snippet usage for Markdown (and other languages)!&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%2Fwww.chaseadams.io%2Fimg%2Fmarkdown-expand.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.chaseadams.io%2Fimg%2Fmarkdown-expand.gif" title="Markdown Snippet Tab Completion"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>markdown</category>
      <category>snippets</category>
    </item>
  </channel>
</rss>
