<?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>Forem: Eamonn Cottrell</title>
    <description>The latest articles on Forem by Eamonn Cottrell (@sieis).</description>
    <link>https://forem.com/sieis</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%2F667219%2F7801d8d2-c1de-4a19-8f6a-e7f61a84107f.jpg</url>
      <title>Forem: Eamonn Cottrell</title>
      <link>https://forem.com/sieis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sieis"/>
    <language>en</language>
    <item>
      <title>Google Sheets Tutorial – How to Enable Multiple Selection Data Validation Using Apps Script</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Mon, 06 Feb 2023 15:01:45 +0000</pubDate>
      <link>https://forem.com/sieis/google-sheets-tutorial-how-to-enable-multiple-selection-data-validation-using-apps-script-3097</link>
      <guid>https://forem.com/sieis/google-sheets-tutorial-how-to-enable-multiple-selection-data-validation-using-apps-script-3097</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published for &lt;a href="https://www.freecodecamp.org/news/google-sheets-multiple-data-validation-selections/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article I will show you how to allow for multiple items to be selected using the drop-down data validation feature in Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1yxc4k1x5idcS_moQ1Bq8LnHGZF2nm9dpARglY7Rv0UI/edit#gid=390071620" rel="noopener noreferrer"&gt;Here's the Google Sheet&lt;/a&gt; we'll use for the example. You can make a copy of this to edit yourself by clicking &lt;code&gt;File -&amp;gt; Make a copy&lt;/code&gt;.&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%2F863cvb2k105rgilmkfqh.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%2F863cvb2k105rgilmkfqh.png" alt="image-13" width="680" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the bottom of the article is a video walkthrough I recorded for this solution. 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem 🤔&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;My five-year-old son posed a question that triggered a deep dive into Google Apps Script. He wanted to have multiple items selected from a data validation drop-down list.&lt;/p&gt;

&lt;p&gt;Leave it to a five-year-old to send me to Google, YouTube, and beyond in search of a spreadsheet solution! 😅&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%2Fzsekvysus45k7gh8711g.gif" 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%2Fzsekvysus45k7gh8711g.gif" alt="Gif of Michaelengelo from Teenage Mutant Ninja Turtles" width="500" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We had built a spreadsheet that showed information about the Teenage Mutant Ninja Turtles. Names, birthdays, ages, favorite colors...&lt;/p&gt;

&lt;p&gt;I was highlighting the amazing power of spreadsheets to organize, calculate, and visualize information. Typical five-year-old parenting stuff.&lt;/p&gt;

&lt;p&gt;For the favorite color column, we used a drop-down list to select from a list of colors.&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%2F2tb48tgdq1yefb1l1wmn.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%2F2tb48tgdq1yefb1l1wmn.png" alt="image-3" width="343" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a fairly simple feature to use in Google Sheets. To create a drop-down list, select &lt;code&gt;Data -&amp;gt; Data validation&lt;/code&gt; from the menu:&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%2Fmcasph93q0ijbz1dtrco.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%2Fmcasph93q0ijbz1dtrco.png" alt="Screenshot of Google Sheet's data menu" width="518" height="897"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update: the same feature is now also available when you right-click a cell:&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%2Fg4bn4260a4w2gwrx528b.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%2Fg4bn4260a4w2gwrx528b.png" alt="Screenshot of right-clicking menu in Google Sheets" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In either case, a data validation menu will appear where you may set your conditions.&lt;/p&gt;

&lt;p&gt;We had our list of colors in the cells &lt;code&gt;H2:H9&lt;/code&gt; so we selected &lt;code&gt;Dropdown (from a range)&lt;/code&gt; in the Criteria section and then entered that range.&lt;/p&gt;

&lt;p&gt;We wanted this to be copied to other cells without affecting that range, so we locked it in place, using the $ signs: &lt;code&gt;=$H$2:$H$9&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows for the validation to be copied to other cells while retaining those cell references for the list of color values.&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%2Ff8r4f7tzubtxxrjpgp0c.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%2Ff8r4f7tzubtxxrjpgp0c.png" alt="Screenshot of Google Sheets' data validation options menu" width="469" height="1791"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Google Sheets Allows One Selection Only 🚩&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The problem is, Google Sheets only allows for a single selection. We wanted for Leonardo to have multiple favorite colors!&lt;/p&gt;

&lt;p&gt;Fortunately, Google Apps Script allows custom code to be written within Google Sheets, and we used this to solve our problem.&lt;/p&gt;

&lt;p&gt;I came across the code for this from a YouTube &lt;a href="https://www.youtube.com/watch?v=dm4z9l26O0I" rel="noopener noreferrer"&gt;video&lt;/a&gt; by Alexander Ivanov and set out to update the information with a more clearly laid out video and explanation of my own.&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%2Fta4jb39e7qugls0fkk6z.gif" 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%2Fta4jb39e7qugls0fkk6z.gif" alt="Problem Solved gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use Apps Script🧑💻&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open the Apps Script screen by selecting &lt;code&gt;Extensions -&amp;gt; Apps Script&lt;/code&gt; from the menu bar.&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%2Fct69ajh0gn5t7srvaaz2.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%2Fct69ajh0gn5t7srvaaz2.png" alt="image-9" width="556" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be able to create files using the plus &lt;code&gt;+&lt;/code&gt; icon. For this project we need a &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;&lt;code&gt;Code.gs&lt;/code&gt;&lt;/a&gt; file and a &lt;code&gt;Page.html&lt;/code&gt; file.&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%2Fyg1d2v9pgorr8gjpggo2.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%2Fyg1d2v9pgorr8gjpggo2.png" alt="image-8" width="523" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The&lt;/strong&gt; &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;&lt;strong&gt;Code.gs&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;File&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Start in the &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;Code.gs&lt;/a&gt; file.&lt;/p&gt;

&lt;p&gt;The first thing we want is a drop-down from the Google Sheets toolbar to run our code.&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%2Fmis72h1bi9qz5m32glex.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%2Fmis72h1bi9qz5m32glex.png" alt="Screenshot of Google Sheets' custom drop-down bar" width="666" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To do this, we use the following code to add the UI option &lt;code&gt;Show dialog&lt;/code&gt; to the menu bar. Upon clicking, it will run the &lt;code&gt;showDialog&lt;/code&gt; function. By wrapping these methods in the built-in &lt;code&gt;onOpen&lt;/code&gt; function, this menu in the toolbar gets added as soon as we open the spreadsheet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function onOpen(e) {                                
    SpreadsheetApp.getUi()                                
    .createMenu('Multiple Select Data Validation')
    .addItem('Show dialog', 'showDialog')                                
    .addToUi();                                
}

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

&lt;/div&gt;



&lt;p&gt;There is often a short delay of a few seconds before custom menus are visible in the menu. Give it a few seconds and it will appear.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;showDialog&lt;/code&gt; function will create an HTML variable from a template that we will create in a moment. It then uses the built-in method &lt;code&gt;.showSidebar&lt;/code&gt; to create a sidebar with that html.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function showDialog() {                                
    var html = HtmlService.createTemplateFromFile('Page').evaluate();
    SpreadsheetApp.getUi().showSidebar(html);                                
}

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

&lt;/div&gt;



&lt;p&gt;Then we have another function, &lt;code&gt;valid&lt;/code&gt;, which will check the current cell for any data validation criteria and return those values in a 2-dimensional array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var valid = function(){                                
    try{                                
        return SpreadsheetApp.getActiveRange().getDataValidation().getCriteriaValues()[0].getValues();                                
    }catch(e){                                
        return null                                
    }                                
}

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

&lt;/div&gt;



&lt;p&gt;And our final function, &lt;code&gt;fillCell&lt;/code&gt;, will create an array to hold the resultant list of values we want the cell to contain. It then pushes these strings to the array and separates them by commas.&lt;/p&gt;

&lt;p&gt;Lastly, it uses the built-in method, &lt;code&gt;setValue&lt;/code&gt; to fill the current cell with the comma separated values (our favorite colors).&lt;/p&gt;

&lt;p&gt;(&lt;code&gt;fillCell&lt;/code&gt; and &lt;code&gt;valid&lt;/code&gt; are called in the Page.html code we are about to go over.)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function fillCell(e){                                
    var s = [];                                
    for(var i in e){                                
        if(i.substr(0, 2) == 'ch') s.push(e[i]);                                
}                                
    if(s.length) SpreadsheetApp.getActiveRange().setValue(s.join(', '));
}

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

&lt;/div&gt;



&lt;p&gt;Here is the full code for the &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;&lt;code&gt;Code.gs&lt;/code&gt;&lt;/a&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function onOpen(e) {                                
    SpreadsheetApp.getUi()                                
    .createMenu('Multiple Select Data Validation')
    .addItem('Show dialog', 'showDialog')                                
    .addToUi();                                
}                                
function showDialog() {                                
    var html = HtmlService.createTemplateFromFile('Page').evaluate();
    SpreadsheetApp.getUi().showSidebar(html);                                
}                                
var valid = function(){                                
    try{                                
        return SpreadsheetApp.getActiveRange().getDataValidation().getCriteriaValues()[0].getValues();                                
    }catch(e){                                
        return null                                
    }                                
}                                
function fillCell(e){                                
    var s = [];                                
    for(var i in e){                                
        if(i.substr(0, 2) == 'ch') s.push(e[i]);                                
}                                
    if(s.length) SpreadsheetApp.getActiveRange().setValue(s.join(', '));
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;The Page.html File&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now create and open a file called &lt;code&gt;Page.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will control a pop-up sidebar where we will handle our multiple selections, and will contain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;a form with checkboxes next to each option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a button to fill in the current cell&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a button to get validation from the current cell&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F756lzdrpaoywui6k0ipd.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%2F756lzdrpaoywui6k0ipd.png" alt="Screenshot of our custom Google Sheet html sidebar" width="483" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will use templated HTML for our example. First, create a variable, &lt;code&gt;data&lt;/code&gt;, by calling the &lt;code&gt;valid()&lt;/code&gt; function we created above. We use &lt;code&gt;&amp;lt;? CODE_GOES_HERE ?&amp;gt;&lt;/code&gt; syntax to write code within the html template.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;? var data = valid(); ?&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Then we create a form to house all of the data pulled from the &lt;code&gt;valid()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form id="form" name="form"&amp;gt;
&amp;lt;/form&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;And we'll run some code to build our list of checkboxes within this form. First, we check if the data in the cell is of type &lt;code&gt;[object Array]&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;&amp;lt;? if(Object.prototype.toString.call(data) === '[object Array]') { ?&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;valid()&lt;/code&gt; returns a two-dimensional array because it's using the built-in method &lt;code&gt;getValues()&lt;/code&gt;. So, you can picture this being returned as an array of arrays with each individual one being one of the favorite colors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//for illustration only; this is the type of 2D array that valid() will return

favoriteColors = [
    ["purple"],
    ["red"],
    ["white"],
    ["black"]
]

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

&lt;/div&gt;



&lt;p&gt;This will help as we look at the next bit of code which can appear overwhelming.&lt;/p&gt;

&lt;p&gt;We need to access each color the strings. We do this by nesting &lt;code&gt;for&lt;/code&gt; loops. The first loop iterates through each position in the favorite colors array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;? for (var i = 0; i &amp;lt; data.length; i++) { ?&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;The second loop iterates through each element in the interior arrays. In our case, this will always be one element since each of these arrays are of length 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;? for (var j = 0; j &amp;lt; data[i].length; j++) { ?&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Remember, &lt;code&gt;["purple"]&lt;/code&gt; is an array of length 1. The &lt;code&gt;j&lt;/code&gt; loop does not count the letters in the string &lt;em&gt;within&lt;/em&gt; the array we are just counting the length &lt;em&gt;of&lt;/em&gt; the array.&lt;/p&gt;

&lt;p&gt;So, we're looping through each item in the 2D array and creating a checkbox input for each one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;input type="checkbox" id="ch&amp;lt;?= '' + i + j ?&amp;gt;" name="ch&amp;lt;?= '' + i + j ?&amp;gt;" value="&amp;lt;?= data[i][j] ?&amp;gt;"&amp;gt;&amp;lt;?= data[i][j] ?&amp;gt;&amp;lt;br&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;This adds an &lt;code&gt;id&lt;/code&gt; and &lt;code&gt;name&lt;/code&gt; that start with "ch" and then adds the element's array position. It also pulls the value (the color) itself as a &lt;code&gt;value&lt;/code&gt; in addition to the displayed text.&lt;/p&gt;

&lt;p&gt;These screenshots may help connect the mental dots:&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%2F0dd1rhqt694ql23n6szq.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%2F0dd1rhqt694ql23n6szq.png" alt="screenshot of inspected element: the input with an id" width="259" height="255"&gt;&lt;/a&gt;&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%2Fryprqodsldj8gs7n06md.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%2Fryprqodsldj8gs7n06md.png" alt="screenshot of inspected element: the form and input elements" width="793" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If our initial &lt;code&gt;if&lt;/code&gt; statement fails, we'll display a &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; indicating that perhaps there are no data validation rules in that cell while linking to a support article showing how to create an in-cell drop down list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;else { ?&amp;gt;                                
    &amp;lt;p&amp;gt;Maybe current cell doesn't have &amp;lt;a href="https://support.google.com/drive/answer/139705?hl=en"&amp;gt;Data validation...&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;                                
&amp;lt;? } ?&amp;gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;How to Code the Buttons&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Then we need our two buttons.&lt;/p&gt;

&lt;p&gt;The first button pulls the data validation from the cell. It runs the &lt;code&gt;showDialog()&lt;/code&gt; function we created in &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;&lt;code&gt;Code.gs&lt;/code&gt;&lt;/a&gt; and builds the form of checkbox entries if there exist data validation values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// get validation from the current cell
&amp;lt;input type="button" value="get validation from current" onclick="google.script.run.showDialog()" /&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;The second button fills the selected values into the current cell. &lt;strong&gt;This is what we were after all along!&lt;/strong&gt; This runs the &lt;code&gt;fillCell&lt;/code&gt; function in &lt;a href="http://Code.gs" rel="noopener noreferrer"&gt;&lt;code&gt;Code.gs&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// fills values into current cell
&amp;lt;input type="button" value="fill current" onclick="google.script.run.fillCell(this.parentNode)" /&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Here is the full code for &lt;code&gt;Page.html&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;&amp;lt;div&amp;gt;                                
&amp;lt;? var data = valid(); ?&amp;gt;                                
&amp;lt;form id="form" name="form"&amp;gt;                                
&amp;lt;? if(Object.prototype.toString.call(data) === '[object Array]') { ?&amp;gt;                                
&amp;lt;? for (var i = 0; i &amp;lt; data.length; i++) { ?&amp;gt;                                
    &amp;lt;? for (var j = 0; j &amp;lt; data[i].length; j++) { ?&amp;gt;                                
        &amp;lt;input type="checkbox" id="ch&amp;lt;?= '' + i + j ?&amp;gt;" name="ch&amp;lt;?= '' + i + j ?&amp;gt;" value="&amp;lt;?= data[i][j] ?&amp;gt;"&amp;gt;&amp;lt;?= data[i][j] ?&amp;gt;&amp;lt;br&amp;gt;                                
    &amp;lt;? } ?&amp;gt;                                
&amp;lt;? } ?&amp;gt;                                
&amp;lt;? } else { ?&amp;gt;                                
        &amp;lt;p&amp;gt;Maybe current cell doesn't have &amp;lt;a href="https://support.google.com/drive/answer/139705?hl=en"&amp;gt;Data validation...&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;                                
&amp;lt;? } ?&amp;gt;                                
    &amp;lt;input type="button" value="fill current" onclick="google.script.run.fillCell(this.parentNode)" /&amp;gt;                                
    &amp;lt;input type="button" value="get validation from current" onclick="google.script.run.showDialog()" /&amp;gt;                                
&amp;lt;/form&amp;gt;                                
&amp;lt;/div&amp;gt;

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

&lt;/div&gt;



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

&lt;p&gt;Yes, this is quite a cumbersome solution to something relatively simple. Maybe Google will add this to the native functionality at some point. They have recently updated Data Validation to include more modern and easy to use functionality, so it's not out of the question.&lt;/p&gt;

&lt;p&gt;Until then, this has been a great solution for me, and I'm grateful to &lt;a href="https://www.youtube.com/watch?v=dm4z9l26O0I" rel="noopener noreferrer"&gt;Alexander&lt;/a&gt; for his initial code.&lt;/p&gt;

&lt;p&gt;I hope this article has helped you understand the code a bit better and that it empowers you to create your own custom Google Sheets solutions!&lt;/p&gt;

&lt;p&gt;As promised, here's my walkthrough video:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Video Walkthrough 📽&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/41ydIPKZezE"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Thanks!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! If you found this helpful, I'd love it if you followed me and said hey 👋 over on &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; where you can find more content like this.&lt;/p&gt;

&lt;p&gt;Have a great one!&lt;/p&gt;

</description>
      <category>googlesheets</category>
      <category>datavalidation</category>
      <category>spreadsheets</category>
      <category>googleappsscript</category>
    </item>
    <item>
      <title>Excel Tutorial – How to Clean Data with the TRIM() and CLEAN() Functions</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Fri, 27 Jan 2023 14:43:50 +0000</pubDate>
      <link>https://forem.com/sieis/excel-tutorial-how-to-clean-data-with-the-trim-and-clean-functions-4ok7</link>
      <guid>https://forem.com/sieis/excel-tutorial-how-to-clean-data-with-the-trim-and-clean-functions-4ok7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/excel-tutorial-clean-data-with-the-trim-and-clean-functions/"&gt;Originally published for freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Without clean data, your spreadsheet is knocking on death's door. In this tutorial, I will show you two fast ways to clean up the data in your Excel or Google Sheets spreadsheet.&lt;/p&gt;

&lt;p&gt;When dealing with data sets, especially large ones and/or those that you didn't create, it is likely that you will have to clean the data in large or small ways to get it fully functional.&lt;/p&gt;

&lt;p&gt;Both of the built-in functions we'll discuss &lt;code&gt;=TRIM()&lt;/code&gt; and &lt;code&gt;=CLEAN()&lt;/code&gt; are available in Microsoft Excel as well as Google Sheets. And both of them have the potential to save you a lot of head-scratching.&lt;/p&gt;

&lt;p&gt;Let's examine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;What do we mean by clean data?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why isn't it already clean?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do we clean it fast and thoroughly?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9S7NUXQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/clean-desk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9S7NUXQg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/clean-desk.gif" alt="a man flipping his messy desk and it becoming magically organized" width="500" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;pssst&lt;/em&gt;: I have a video walkthrough at the bottom 👇 of the article too 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Clean Data?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;In Excel and Google Sheets, the data that we work with is located in cells. In a perfect world, these cells contain properly formatted data like numbers, amounts, names, and other pieces of information.&lt;/p&gt;

&lt;p&gt;However, we often encounter things in the cells which don't belong and which will prevent us from using that data in the way we need.&lt;/p&gt;

&lt;p&gt;Things like non-printable characters, extra white spaces and letters in cells that should contain numbers are a few examples of unclean data which will negatively affect our work.&lt;/p&gt;

&lt;p&gt;What are non-printable characters, you ask? They are the first 32 control characters in the ASCII table.&lt;/p&gt;

&lt;p&gt;Check out the table below of the ASCII characters. The first 32 are non-printable control codes. These can cause issues if they somehow make it into your data set.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yKGTI_pv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/char-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yKGTI_pv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/char-1.png" alt="screenshot of ascii table in Excel" width="880" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can generate this table by using the character function for all the numbers from 0 to 255: &lt;code&gt;=CHAR(&amp;lt;number&amp;gt;)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The other common offenders are spaces that shouldn't be there leading or trailing spaces in a cell. Or simply spaces in the middle that shouldn't be there.&lt;/p&gt;

&lt;p&gt;Compound these finicky cells throughout a spreadsheet that contains thousands or millions of cells, and we've got quite a mess on our hands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ySKIzLyK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/a-mess.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ySKIzLyK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/a-mess.gif" alt='a woman waving hands and saying, "this is a mess"' width="480" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Isn't the Data Clean?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Because we live in a fallen world.&lt;/p&gt;

&lt;p&gt;🤣 Well, it's not that dramatic. But there can be many reasons the data isn't already clean. Many times human error is the culprit.&lt;/p&gt;

&lt;p&gt;Whoever or wherever you're getting your data from simply made some mistakes with it before you got your hands on it.&lt;/p&gt;

&lt;p&gt;Or maybe you messed it up when you started to manipulate the data.&lt;/p&gt;

&lt;p&gt;As we'll see in the example below, the data could be perfectly fine wherever you're getting it from on the internet. But then when you import it into your spreadsheet, the conversion from HTML to Spreadsheet brings in a bunch of non-printable characters and spaces.&lt;/p&gt;

&lt;p&gt;And, of course, because we're dealing with computers and people and data, we may never figure out why the data we've received isn't clean. It simply isn't. And despite our confusion, we have to clean it up to use it and extract meaning from it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OYK3xF1v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/confusion.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OYK3xF1v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/confusion.gif" alt="Obi Wan visibly confused" width="480" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Clean Data in Excel and Google Sheets&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let's first get some data. In both Excel and Google Sheets, we can import data from the web. I want to bring in a table of Recipes and Ingredients from a video game website that looks like this online.&lt;/p&gt;

&lt;p&gt;Here's Link...I mean, &lt;a href="https://www.ign.com/wikis/the-legend-of-zelda-breath-of-the-wild/All_Recipes_and_Cookbook"&gt;here's the link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HxUzNkJs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-153.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HxUzNkJs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-153.png" alt="Zelda recipe table" width="880" height="1107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To address the obvious question first: yes, I could just copy and paste the table. And, yes, it will in this case paste the table straight into Excel.&lt;/p&gt;

&lt;p&gt;But it'll also bring in the pictures which I don't need, the links which I don't want, some formatting that I'll have to reset, and potentially some of the non-printable characters and/or spaces that we'll discuss below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6jXjvn-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-154.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6jXjvn-V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-154.png" alt="Table of Recipe ingredients copied straight off website" width="539" height="1260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Above is what it will look like after copying and pasting. But we are interested in preserving data and cleaning it, so we'll import it another way for the sake of the rest of our discussion.&lt;/p&gt;

&lt;p&gt;If you're using Excel, it has some pretty robust cleaning features out of the box. When importing data from IGN, we enter the address where it lives, and it will pull down any data that it detects as available for import.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L8pOJ5jF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/import.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L8pOJ5jF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/import.png" alt="screenshot of data import from web in Excel" width="880" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's get the table of Poultry and Meat Entre receipts from Zelda: Breath of the Wild.&lt;/p&gt;

&lt;p&gt;The Navigator window shows us a handy list of data tables detected on the page as well as a preview pane on the right that can be toggled between table and website views.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aCySoAak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/recipe-table-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aCySoAak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/recipe-table-1.png" alt="Excel data import navigator window screenshot" width="880" height="699"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Excel Power Query&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Once we've selected our data and loaded it, we'll have imported a table into our spreadsheet just fine. Excel's Power Query features allow us to then go into this particular table and extract the values in the Ingredients column into a list of items delimited by a selector of our choice.&lt;/p&gt;

&lt;p&gt;In other words, Excel is smart enough to extract the individual list items in the Ingredients column and put them in a cell one by one and separated by commas (or whatever we select to separate them).&lt;/p&gt;

&lt;p&gt;The following three screenshots show this process:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_AgakNNu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/expand-values.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_AgakNNu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/expand-values.png" alt="Screenshot of Excel Power Query menu" width="880" height="734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eC1gtzkm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/delimiter.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eC1gtzkm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/delimiter.png" alt="Screenshot of delimiter for expanded values" width="880" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S0NWDNOr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/extracted.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S0NWDNOr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/extracted.png" alt="Screenshot of Expanded list values in Ingredient column" width="880" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The end result is a comma separated list of values that is seemingly pretty clean. We can then split it up by using the &lt;code&gt;=SPLIT()&lt;/code&gt; function into separate cells if we choose, or simply use it as is.&lt;/p&gt;

&lt;p&gt;This is an ideal situation. But what if we encounter those spaces and non-printable characters?&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Clean and Trim Functions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Here's a screenshot of the same table when imported into Google Sheets with &lt;code&gt;=IMPORTHTML()&lt;/code&gt;. It pulls the data correctly, but you can see the extra spaces that were also brought into the sheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QfBDEWqU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/sheets-trim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QfBDEWqU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/sheets-trim.png" alt="Imported data from webpage in Google Sheets" width="746" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By using &lt;code&gt;=CLEAN()&lt;/code&gt; on the ingredients cells, we can get rid of some non-printable carriage returns causing the line breaks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yAY61qWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/justclean.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yAY61qWW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/justclean.png" alt="Table after Cleaning cells" width="761" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By using &lt;code&gt;=TRIM()&lt;/code&gt; on the cells, we can get rid of all the leading spaces.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--knvZavxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/justtrim.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--knvZavxT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/justtrim.png" alt="Table after Trimming white spaces" width="349" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And by nesting the two with &lt;code&gt;=CLEAN(TRIM())&lt;/code&gt;, we can do both. The result is a list of values separated by dashes. Similarly to our resultant table in Excel where we were left with a comma-separated list, we can then go and &lt;code&gt;=SPLIT()&lt;/code&gt; these values further if need be.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U31ZiRRo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/both.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U31ZiRRo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/both.png" alt="Table after cleaning and trimming at once" width="738" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These functions work the same in Excel, but for illustrative purposes we used Google Sheets since it wasn't able to import the data as neatly there.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Sample Spreadsheet &amp;amp; Video Walkthrough&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/11j6ajxvN6dSd9U7y6LQT6IhAJvM99jRGPFcDIBtBMkM/edit?usp=sharing"&gt;Here is a link to the sample Google Sheet&lt;/a&gt; that I made for this tutorial.&lt;/p&gt;

&lt;p&gt;The first page is a table of the non-printable characters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1jUl9jww--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-155.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1jUl9jww--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2023/01/image-155.png" alt="image-155" width="588" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the second page is the Zelda example we talked about. Feel free to make a copy of this spreadsheet if you'd like to mess around with it further (File -&amp;gt; Make a copy).&lt;/p&gt;

&lt;p&gt;We'll be building a really cool project with some of this Zelda data soon...&lt;a href="https://www.youtube.com/@eamonncottrell"&gt;follow me on YouTube&lt;/a&gt; to keep an eye out for that.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/mgAHQWrTcCg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Thanks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Thanks for reading, and I hope this has been useful for you. Come say hey 👋 on &lt;a href="https://www.linkedin.com/in/eamonncottrell/"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@eamonncottrell"&gt;YouTube&lt;/a&gt;, and I'll talk to you in the next article!&lt;/p&gt;

</description>
      <category>excel</category>
      <category>data</category>
      <category>cleandata</category>
      <category>googlesheets</category>
    </item>
    <item>
      <title>Accounting Number Format in Excel – How to Apply it to Selected Cells</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Wed, 18 Jan 2023 14:36:09 +0000</pubDate>
      <link>https://forem.com/sieis/accounting-number-format-in-excel-how-to-apply-it-to-selected-cells-2bnh</link>
      <guid>https://forem.com/sieis/accounting-number-format-in-excel-how-to-apply-it-to-selected-cells-2bnh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published for &lt;a href="https://www.freecodecamp.org/news/accounting-number-format-in-excel-how-to-apply-it-to-selected-cells/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article I will show you how to format cells in Microsoft Excel. We'll be looking particularly at the &lt;code&gt;Accounting&lt;/code&gt; format for cells with numbers.&lt;/p&gt;

&lt;p&gt;At the end of the article I'll give you two bonuses: a short video walkthrough of the methods we go over, as well as a breakdown of the differences between the &lt;code&gt;Accounting&lt;/code&gt; format and the &lt;code&gt;Currency&lt;/code&gt; format.&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%2Fl8kfm97ch3ba1o6aapsk.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%2Fl8kfm97ch3ba1o6aapsk.png" alt="Excel screenshot with differently formatted columns of numbers" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll go over these three primary ways to format cells in Excel, and how to use each one to add the &lt;code&gt;Accounting&lt;/code&gt; format to cells.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Point and click on Home Tab in Ribbon&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ctrl + 1 opens format cells window&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keyboard Combos&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Easy Mode: Point and Click&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As with most things in Excel, you can indeed simply select the cell(s) you'd like to apply the &lt;code&gt;Accounting&lt;/code&gt; format to and click the appropriate selection.&lt;/p&gt;

&lt;p&gt;Select the Home tab from the toolbar at the top. The formatting options are found in the Number section on the Ribbon.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Accounting&lt;/code&gt; format actually has its own shortcut button marked by the dollar sign.&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%2Fetqq1b8pmwvfpfcwl42w.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%2Fetqq1b8pmwvfpfcwl42w.png" alt="Excel screenshot of Ribbon" width="800" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may also select the drop-down menu to see the list of options:&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%2Faq6yvyu6avowjtc7eo7j.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%2Faq6yvyu6avowjtc7eo7j.png" alt="Excel screenshot of number format options" width="404" height="804"&gt;&lt;/a&gt;&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%2F6ebbz676mm7fo3f7wazm.gif" 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%2F6ebbz676mm7fo3f7wazm.gif" alt="easy as that gif" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use the Format Cell Menu&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The selections above included the most common number formats, but you can also open the full Format Cells window by clicking the arrow in the bottom right corner of the Number section on the Ribbon.&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%2F7919k77rru74ru8im1qx.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%2F7919k77rru74ru8im1qx.png" alt="Excel screenshot of format cell menu selection" width="290" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As with all good things in computer life, there is also a shortcut to open the Format cell menu.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;CTRL + 1&lt;/code&gt; to open the full menu.&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%2Fpqz5fhoacds8tx3svvnq.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%2Fpqz5fhoacds8tx3svvnq.png" alt="Excel screenshot of Format Cells menu" width="706" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From here you can again select the &lt;code&gt;Accounting&lt;/code&gt; format and also adjust additional options like what type of money symbol and how many decimal places to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use the Keyboard Combo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Excel includes keyboard combos for every imaginable action. In many cases this can save time spent searching for and clicking the buttons on the Ribbon.&lt;/p&gt;

&lt;p&gt;Keyboard combos start by pressing the &lt;code&gt;ALT&lt;/code&gt; key. As soon as you press it, you'll see a ton of letters pop up on the toolbar and Ribbon.&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%2F3xkdylch0jdg9muzmpqi.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%2F3xkdylch0jdg9muzmpqi.png" alt="Excel screenshot of ALT keyboard combo letters in Ribbon" width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Keyboard Combo for &lt;code&gt;Accounting&lt;/code&gt; Format is &lt;code&gt;ALT, H,AN&lt;/code&gt;:&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%2Fdmycayrgwxuh8pqz12hm.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%2Fdmycayrgwxuh8pqz12hm.png" alt="image-30" width="352" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And after you press those buttons (one after the other), you'll have selected the drop-down for &lt;code&gt;Accounting&lt;/code&gt; format. The most commonly used currency symbols are displayed. &lt;code&gt;ENTER&lt;/code&gt; will select the English dollar sign, or you can arrow down to another selection.&lt;/p&gt;

&lt;p&gt;You can see from the screenshot above that you can also press the combo &lt;code&gt;ALT,H,FM&lt;/code&gt; to open the full Format Cells window.&lt;/p&gt;

&lt;p&gt;The keyboard combos offer the most nimble way to access operations and menus in Excel. Learning the ones you'll use most often can greatly improve your productivity.&lt;/p&gt;

&lt;p&gt;As promised, here's an overview video walking through the topics I've discussed in this article:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Video Walkthrough&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/o_cNy4JPXCA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Accounting vs Currency Format&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So, why use &lt;code&gt;Accounting&lt;/code&gt; format? Isn't it just formatting the numbers with dollar signs?&lt;/p&gt;

&lt;p&gt;That's a half truth. Yes, it adds a dollar sign, but so does the &lt;code&gt;Currency&lt;/code&gt; format. If we open up the Format Cells window again by pressing &lt;code&gt;CTRL + 1&lt;/code&gt;, we'll see that the main difference is one of alignment.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Currency&lt;/code&gt; format is used for "general monetary values" and puts the dollar sign directly in front of the left-most number. The &lt;code&gt;Accounting&lt;/code&gt; format, on the other hand, lines up both the dollar sign as well as the decimal in the column of numbers.&lt;/p&gt;

&lt;p&gt;In terms of formatting, &lt;code&gt;Currency&lt;/code&gt; will also give you options for how to display negative numbers. But in the &lt;code&gt;Accounting&lt;/code&gt; format, the negative numbers will always be displayed within parenthesis.&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%2F52wn6jlgr3hikv8ald50.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%2F52wn6jlgr3hikv8ald50.png" alt="Format cells menu in Excel" width="668" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Thanks for reading!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I hope this has been helpful for you.&lt;/p&gt;

&lt;p&gt;Come find me on &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; where I'm growing my coding and spreadsheet tutorial channel. And come follow and say hey over on &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. 👋&lt;/p&gt;

&lt;p&gt;Have a great one!&lt;/p&gt;

</description>
      <category>excel</category>
      <category>spreadsheet</category>
      <category>formatting</category>
      <category>currency</category>
    </item>
    <item>
      <title>How to Clear Formatting in Excel – Remove Format From a Cell</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Thu, 12 Jan 2023 14:34:49 +0000</pubDate>
      <link>https://forem.com/sieis/how-to-clear-formatting-in-excel-remove-format-from-a-cell-fl2</link>
      <guid>https://forem.com/sieis/how-to-clear-formatting-in-excel-remove-format-from-a-cell-fl2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published for &lt;a href="https://www.freecodecamp.org/news/how-to-clear-formatting-in-excel/" rel="noopener noreferrer"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article I will show you how to clear formatting from a cell in Excel. If you want the quick and dirty version, it's first up and will require you to simply click a couple times.&lt;/p&gt;

&lt;p&gt;If you want to become a spreadsheet speedrunner, read this whole, brief article. I'll show you a couple keyboard combos and open the door for you to the WIDE world of Excel shortcuts.&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%2F0u4u3oxnvb9wtljjmh7o.gif" 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%2F0u4u3oxnvb9wtljjmh7o.gif" alt="A gif of a man opening door" width="480" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Clear Formatting in Excel with Just a Click&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is easy mode. Highlight the cells you'd like to clear formatting on and click &lt;code&gt;Clear -&amp;gt; Clear Formats&lt;/code&gt; from the Home menu in the Excel Ribbon:&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%2F2qwuia926rsysk1hw3lx.jpg" 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%2F2qwuia926rsysk1hw3lx.jpg" alt="Excel screenshot of the Ribbon, Home Tab and Clear selection" width="800" height="450"&gt;&lt;/a&gt;&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%2Faxg1srbpd5dozhranc75.jpg" 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%2Faxg1srbpd5dozhranc75.jpg" alt="Excel screenshots of the editing window" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't see the ribbon at all, it will appear when you click any of the menu tabs (Home, for example). You can then click the arrow over in the bottom right corner. This will allow you to select which Show Ribbon option you'd prefer.&lt;/p&gt;

&lt;p&gt;If you're using the web app version of Excel, this arrow will simply toggle the full Ribbon display on and off.&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%2F416dlvsih0h3cx3d5jdw.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%2F416dlvsih0h3cx3d5jdw.png" alt="Excel screenshot of Showing the Ribbon" width="614" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you found this helpful, follow me over on &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;. But I hope you'll stick around a couple more minutes, because the real fun stuff is below! 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use Excel Keyboard Shortcuts to Clear Formatting&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Excel is a powerhouse.&lt;/p&gt;

&lt;p&gt;You know this. Mostly, though, it simply rears its head and tramples us with its density. Those who have mastered it have done so only through mental grit and by using a peculiarly large set of obscure keyboard combinations in lieu of a mouse.&lt;/p&gt;

&lt;p&gt;You too could be one of these keyboard shortcutting pioneers.&lt;/p&gt;

&lt;p&gt;Think of the glory.&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%2Fdumu1pwewfzpkj11ncuk.gif" 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%2Fdumu1pwewfzpkj11ncuk.gif" alt="Dark Souls praise the sun gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most modern software has at least a few keyboard shortcuts to make life easier for their users. Who among us has not readily used &lt;code&gt;CTRL + C&lt;/code&gt; and &lt;code&gt;CTRL + V&lt;/code&gt; for the better part of our lives?&lt;/p&gt;

&lt;p&gt;In Excel, though, there lies an ocean of possibility.&lt;/p&gt;

&lt;p&gt;On the surface live the usual suspects of copying, pasting and undoing. Things we are used to seeing everywhere.&lt;/p&gt;

&lt;p&gt;But as we go underneath the water a bit, we find that there's a universe of keyboard shortcuts. In fact, virtually every command is accessible through a combination of keystrokes in Excel.&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%2Fv83l8qwogemc72v02etp.gif" 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%2Fv83l8qwogemc72v02etp.gif" alt="Deep sea diver gif" width="120" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Just Press ALT&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Go ahead. Fire up Excel. Or go to &lt;a href="http://excel.new" rel="noopener noreferrer"&gt;excel.new&lt;/a&gt; in your browser.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;ALT&lt;/code&gt; &lt;strong&gt;:&lt;/strong&gt;&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%2F0mcptw8wnv35iecqmdkl.jpg" 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%2F0mcptw8wnv35iecqmdkl.jpg" alt="Excel screenshot highlighting keyboard combos" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see letters appear next to all the menu tabs. Pressing the letter will open that menu tab.&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;H&lt;/code&gt; &lt;strong&gt;:&lt;/strong&gt;&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%2Fpvt21uli81c1v1z0k6fb.jpg" 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%2Fpvt21uli81c1v1z0k6fb.jpg" alt="Excel screenshot of ALT Ribbon shortcuts" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neat, right? Pressing &lt;code&gt;ALT&lt;/code&gt; opens up a gigantic array of keyboard combinations that avoid using the mouse altogether.&lt;/p&gt;

&lt;p&gt;And for productivity's sake, this can be a huge time saver. How many seconds do you think you've spent hunting for a menu, clicking into it and then hunting for the next menu option? It doesn't take long, but a few keystrokes takes three, four, five times less time.&lt;/p&gt;

&lt;p&gt;(And it's a lot more fun!!) 😆&lt;/p&gt;

&lt;p&gt;You've still got the &lt;code&gt;Home&lt;/code&gt; tab selected with the new list of letters, right?&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;E&lt;/code&gt; &lt;strong&gt;:&lt;/strong&gt;&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%2Fnkdmcyem5uq49wn1bhui.jpg" 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%2Fnkdmcyem5uq49wn1bhui.jpg" alt="Excel screenshot highlighting the clear selection" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press &lt;code&gt;F&lt;/code&gt; &lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This will clear the format of any cells you'd selected just like the point and click version. But with the swift &lt;code&gt;ALT + H + E + F&lt;/code&gt; keyboard combination, it takes less than a second.&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%2Fq1furhf8dd0wbpe4rqd8.jpg" 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%2Fq1furhf8dd0wbpe4rqd8.jpg" alt="Excel screenshot of clear formats command" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's important to remember that unlike CTRL + C for copying, the ALT shortcuts are keyboard &lt;strong&gt;combos&lt;/strong&gt;. So, you press the keys &lt;strong&gt;consecutively&lt;/strong&gt; rather than all at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Can You Use These Shortcuts in Google Sheets?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you're a Google Sheets purist, you may be wondering if this all works the same there.&lt;/p&gt;

&lt;p&gt;And yes, it does.&lt;/p&gt;

&lt;p&gt;First of all, there is a simple keyboard shortcut for the Clear Formatting in Google Sheets. Pressing &lt;code&gt;CTRL + \&lt;/code&gt; will clear the formatting.&lt;/p&gt;

&lt;p&gt;If you want to enable the ALT keyboard combos, press &lt;code&gt;CTRL + /&lt;/code&gt; to open the Keyboard Shortcuts menu in Google Sheets.&lt;/p&gt;

&lt;p&gt;At the bottom, toggle on the &lt;strong&gt;Enable compatible spreadsheet shortcuts&lt;/strong&gt; feature. Our clear formatting is available and it tells us the three keyboard shortcut and combo options to access it (just as they appear in Excel).&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%2Fkms7ulfdk3vdokzge28r.jpg" 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%2Fkms7ulfdk3vdokzge28r.jpg" alt="Google Sheets Screenshot of format and keyboard shortcuts menus" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is one difference between using the &lt;code&gt;ALT&lt;/code&gt; combos in Google Sheets vs Excel. In order for Google Sheets to know that you're trying to use &lt;code&gt;ALT&lt;/code&gt; combos, you have to press the first two keys at once.&lt;/p&gt;

&lt;p&gt;Pressing &lt;code&gt;ALT&lt;/code&gt; on its own does not bring up the letter options like Excel, and Google Sheets will not start listening for further keystrokes.&lt;/p&gt;

&lt;p&gt;However, once you press &lt;code&gt;ALT + H&lt;/code&gt; together, you'll see it registering the combo in the bottom left of the screen. After pressing those two together, you proceed to press each of the next keys consecutively like in Excel:&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%2Fa0p58ttfpn4far9ml5ep.jpg" 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%2Fa0p58ttfpn4far9ml5ep.jpg" alt="Google Sheets Screenshot of Shortcut Keys Pressed" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I hope this has been helpful for you! Keyboard shortcuts and combos have leveled up my productivity over the years, and I encourage you to continue expanding your own repertoire.&lt;/p&gt;

&lt;p&gt;If you enjoyed this article, follow me on &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; for more content and videos like it.&lt;/p&gt;

&lt;p&gt;Have a great one! 👋&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%2Fzmz7m54i28cbhzjm3cca.gif" 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%2Fzmz7m54i28cbhzjm3cca.gif" alt="gif of Jake Gyllenhaal waving goodbye" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>excel</category>
      <category>formatting</category>
      <category>googlesheets</category>
    </item>
    <item>
      <title>I Made 📃Goals and 💲Money This Year | 👉Dev Retro 2022</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Wed, 28 Dec 2022 17:19:54 +0000</pubDate>
      <link>https://forem.com/sieis/i-made-goals-and-money-this-year-dev-retro-2022-5e25</link>
      <guid>https://forem.com/sieis/i-made-goals-and-money-this-year-dev-retro-2022-5e25</guid>
      <description>&lt;h2&gt;
  
  
  📈 Spreadsheets and Goals
&lt;/h2&gt;

&lt;p&gt;I found it immensely helpful to create a spreadsheet outlining some of my goals this past year. I'll reference it throughout this article, and &lt;a href="https://docs.google.com/spreadsheets/d/1oTtfOsWAH90mRvHYD0TWkdij9zSo7iZvTmtJpcjSVFo/edit#gid=0"&gt;here's the link&lt;/a&gt; if you'd like to check out the View Only version.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This year has been both a joyful exercise in learning and content creation as well as an endurance test.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I began the year reenergized for my continued pathway into computer programming and content creation. I'd been consistently learning to code for a couple of years while working full-time, but I was not getting much clarity in terms of what direction I was headed in.&lt;/p&gt;

&lt;p&gt;I've got some videos 📺 of some projects I've worked on this year toward the end of the article. Make sure you read all the way down! 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  Good Job
&lt;/h2&gt;

&lt;p&gt;My job was (and is) great.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V-C1kYhS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672173032034/768d48d9-3aa7-4d81-a7d9-70c6782f4584.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V-C1kYhS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672173032034/768d48d9-3aa7-4d81-a7d9-70c6782f4584.gif" alt="I love my job gif" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was not unemployed or even looking hard for new employment. In many ways, this made things trickier than they would have otherwise been. Unlike others who may need the fastest route to employment in the field, most of my endeavors for the past several years have been for intrinsic gain.&lt;/p&gt;

&lt;p&gt;Sure, I'd like to find some alternate revenue sources, though. And at the onset of the year, this was one of my expressed purposes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goals at the Start
&lt;/h2&gt;

&lt;p&gt;I committed in January to do a few things pertaining to my continued education:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Continue learning to code by building real things.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete Quincy Larson's (freeCodeCamp) &lt;a href="https://www.freecodecamp.org/news/2022-become-a-dev-new-years-resolution-challenge/"&gt;Become a Developer in 2022 challenge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Participate in the &lt;a href="https://www.100daysofcode.com/"&gt;100 Days of Code challenge&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Within these general guidelines, were specific goals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Complete the &lt;a href="https://www.freecodecamp.org/learn/relational-database/"&gt;Relational Database Certification&lt;/a&gt; on freeCodeCamp&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure my &lt;a href="https://blog.eamonncottrell.com/"&gt;homepage's subdomain&lt;/a&gt; to my Hashnode blog and have written 3 blogs by the end of the 100 Days of Code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Become an &lt;a href="https://www.freecodecamp.org/news/author/eamonn"&gt;author at freeCodeCamp&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make actual, sellable &lt;a href="https://eamonn.gumroad.com/"&gt;products on Gumroad&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://iwant2hack.transistor.fm/"&gt;Podcast&lt;/a&gt; about my journey&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.youtube.com/@eamonncottrell"&gt;Make videos&lt;/a&gt; along the course of my journey&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a lot, but I had experience with many of the more daunting aspects already.&lt;/p&gt;

&lt;p&gt;I am a seasoned writer; I enjoy the craft and have written many things for fun - &lt;a href="https://www.amazon.com/Swansong-Pirata-Isle-Eamonn-Cottrell-ebook/dp/B00J1NUGP6/ref=sr_1_1?crid=1QH7H53OVRWAY&amp;amp;keywords=jon+swansong+and+the+pirata+isle&amp;amp;qid=1672151978&amp;amp;sprefix=jon+swansong+and+the+pirata+isle%2Caps%2C66&amp;amp;sr=8-1"&gt;including a novel&lt;/a&gt; - in the past.&lt;/p&gt;

&lt;p&gt;I have been &lt;a href="https://www.eamonncottrell.com/podcasts/"&gt;podcasting&lt;/a&gt; on and off since 2006.&lt;/p&gt;

&lt;p&gt;I've made an assortment of videos over the past decade for fun.&lt;/p&gt;

&lt;p&gt;And, of course, I have been learning to code already for a few years.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪Combine Goals With Progress
&lt;/h2&gt;

&lt;p&gt;Just getting started is one of the biggest hurdles. Many times, I find myself not knowing how to start or what to do next.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k6U7GHPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672173616697/19e9167e-8387-4cc0-83b2-c6bffe649961.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6U7GHPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672173616697/19e9167e-8387-4cc0-83b2-c6bffe649961.gif" alt="" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of my core weaknesses has been following rabbit trails. If you're at all familiar with the choose-your-own-adventure style of learning to code online, you've probably had your fair share of these alluring rabbit trails pop up in front of you.&lt;/p&gt;

&lt;p&gt;One second you're learning the basics of flexbox 🤔 and the next thing you know you're watching a 20 hour tutorial on BigQuery. 😵&lt;/p&gt;

&lt;p&gt;These things happen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Bb2-Ts9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672152289898/bfc5b11b-3d13-483c-8f94-0cb57cb32892.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Bb2-Ts9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672152289898/bfc5b11b-3d13-483c-8f94-0cb57cb32892.gif" alt="it happens gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know this about myself, and I wanted to fight against that.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A critical component to my success in leveling up my developer skills this year has been combining my many interests around thematic goals.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By repurposing content in multiple media, I was able to write, video and podcast about my learning journey and solidify the concepts I was learning along the way.&lt;/p&gt;

&lt;p&gt;Now, overachievement can also lead to burnout, stress and the copious anxiety of seeking to produce content for its own sake - a burden I was eager to avoid. And as a result, not every piece of content was accompanied by every media outlet.&lt;/p&gt;

&lt;p&gt;But when it made sense to write an article, record a video or podcast, I seized the moment.&lt;/p&gt;

&lt;p&gt;Simply pressing record or typing the opening paragraph of an article is often all it takes to get over the insecurities of creation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I've never regretted writing, recording or learning.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  👊I Kept Going Anyway
&lt;/h2&gt;

&lt;p&gt;Here's the tough truth: even knowing this, I spent the first several months of 2022 doing exactly the things that I was trying to guard against.&lt;/p&gt;

&lt;p&gt;I veered off course by trying to learn multiple things at once.&lt;/p&gt;

&lt;p&gt;I procrastinated learning the things I'd written down as goals in favor of checking a box on other certifications.&lt;/p&gt;

&lt;p&gt;I didn't follow through daily with 100 Days of Code. Look through my &lt;a href="https://docs.google.com/spreadsheets/d/1oTtfOsWAH90mRvHYD0TWkdij9zSo7iZvTmtJpcjSVFo/edit#gid=0"&gt;spreadsheet of tweets&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first one was on &lt;em&gt;January 10th&lt;/em&gt;; the last one was on &lt;strong&gt;&lt;em&gt;August 19th&lt;/em&gt;&lt;/strong&gt;! That's six months, y'all! 😱&lt;/p&gt;

&lt;p&gt;I launched a few products but then lost steam for several months.&lt;/p&gt;

&lt;p&gt;I podcasted pretty regularly right up until I stopped for a while.&lt;/p&gt;

&lt;p&gt;Here's the thing, though. I just kept going even when I missed a day or a week. And I didn't beat myself up when I didn't keep perfect track of all I was working on. Maybe I learned some cool stuff for work one day but didn't tweet it out. No big deal. Oftentimes perfection is the enemy.&lt;/p&gt;

&lt;p&gt;And I never stopped. Momentum has been so important for me. Even as I've zigged and zagged I've kept forward momentum.&lt;/p&gt;

&lt;p&gt;Even when I felt like throwing in the towel. Even when I felt like I was not making progress. Even when I felt like my learning and content was purposeless....I didn't stop.&lt;/p&gt;

&lt;p&gt;I realize that &lt;strong&gt;it doesn't matter what I feel like&lt;/strong&gt;. Results come after the crappy feelings...even when they take twice as long as you planned.🤣&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qDldMkyS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672174364267/3336b2d6-41e4-43e5-a576-89b61413c06f.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qDldMkyS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672174364267/3336b2d6-41e4-43e5-a576-89b61413c06f.gif" alt="actually it does not matter gif" width="480" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💥Mission Accomplished
&lt;/h2&gt;

&lt;p&gt;And you know what? By the end of those six months, I'd annihilated my original goals.&lt;/p&gt;

&lt;p&gt;Not only had I completed every one of them, but I'd begun to learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;how to &lt;a href="https://www.freecodecamp.org/news/how-to-use-trello-to-manage-freelance-web-projects/"&gt;better organize my time&lt;/a&gt; by managing projects like a professional.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to &lt;a href="https://blog.eamonncottrell.com/sacred-geometry-with-adobe-illustrator"&gt;combine my design interests with my technical writing and developer pathway&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to &lt;a href="https://blog.eamonncottrell.com/journey-to-the-center-of-the-code"&gt;quantify why I was doing this&lt;/a&gt; in the first place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to write proficiently. I have published over 30 articles this year on &lt;a href="https://blog.eamonncottrell.com/"&gt;Hashnode&lt;/a&gt;, &lt;a href="https://www.freecodecamp.org/news/author/eamonn/"&gt;freeCodeCamp&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/eamonncottrell/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to &lt;a href="https://blog.eamonncottrell.com/infinite-memory"&gt;participate in a hackathon&lt;/a&gt;. &lt;a href="https://blog.eamonncottrell.com/series/writeathon-2022"&gt;I won $500&lt;/a&gt; as one of the runner ups in Hashnode's Writeathon this fall!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to work with clients in a freelance capacity. By talking and writing about my progress, I was able to work with two clients who reached out to me for web development work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to reach out to people I admire. I've met &lt;a href="https://www.freecodecamp.org/news/author/quincylarson/"&gt;Quincy&lt;/a&gt; (founder of freeCodeCamp) twice this year to discuss his platform, my contributions to it, and opportunities for future growth&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to release &lt;a href="https://eamonn.gumroad.com/"&gt;real products&lt;/a&gt; into the world on Gumroad.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check out my first tweet in January:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/EamonnCottrell/status/1480721431596093443"&gt;https://twitter.com/EamonnCottrell/status/1480721431596093443&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the end of the 100 tweets in August, after meandering through a myriad of topics, my final tweet was a milestone for me. I released a legit &lt;a href="https://unmove.netlify.app/"&gt;open-source animation library&lt;/a&gt; 💥:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/EamonnCottrell/status/1560699132439941120"&gt;https://twitter.com/EamonnCottrell/status/1560699132439941120&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That project alone rolled together project management, open-source infrastructure, version releases on GitHub, making proper documentation...not to mention coding the actual product.&lt;/p&gt;

&lt;p&gt;Much of the year had me refining my project management as much as my raw coding skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  🏃Priorities
&lt;/h2&gt;

&lt;p&gt;I've also learned where to pull back. One of the reasons my "100" Days of code challenge didn't go as planned was that we had our fourth child this spring.&lt;/p&gt;

&lt;p&gt;I've had to learn where to pump the brakes, slow down and reprioritize.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1EAeBXQ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672174794400/867cfc7f-fb88-45fd-aae1-011963603071.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1EAeBXQ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672174794400/867cfc7f-fb88-45fd-aae1-011963603071.gif" alt="man gesturing to slow down" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Correct. I have a job, a wife and four children.&lt;/p&gt;

&lt;p&gt;And on top of that, I love running. Not 5Ks either. &lt;a href="https://ultrasignup.com/results_participant.aspx?fname=Eamonn&amp;amp;lname=Cottrell"&gt;I run ultra-marathons&lt;/a&gt;. That takes a ton of time.&lt;/p&gt;

&lt;p&gt;So, rather than bemoan all the free time I no longer have that I was spoiled with in my twenties, I have had to learn how to prioritize things. How to give up things. How to focus on what's truly important.&lt;/p&gt;

&lt;p&gt;Everyone has the same amount of time and I can do anything I want as long as I'm willing to sacrifice something else.&lt;/p&gt;

&lt;p&gt;It may come as no surprise then that I don't watch a ton of TV or sports. That I don't go out on weekends. That I'm not doing end-game raids anymore.&lt;/p&gt;

&lt;p&gt;Know what? Some of the simplest ways to consistently level up my coding and content creation cadences has been to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Get good sleep&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wake up early&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eat healthily&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exercise regularly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be in community with others&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How bout that for boring and oversimplified general life advice?! 🤣&lt;/p&gt;

&lt;p&gt;But it's so true. When I can prioritize these things, every other aspect of my life has benefited.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙋What is Important?
&lt;/h2&gt;

&lt;p&gt;Computers are not important.&lt;/p&gt;

&lt;p&gt;Coding is not important.&lt;/p&gt;

&lt;p&gt;Writing is not important.&lt;/p&gt;

&lt;p&gt;Content is not important.&lt;/p&gt;

&lt;p&gt;Relationships are important.&lt;/p&gt;

&lt;p&gt;People are important.&lt;/p&gt;

&lt;p&gt;Family is important.&lt;/p&gt;

&lt;p&gt;Selflessness is important.&lt;/p&gt;

&lt;p&gt;My kids don't give a rip about what new framework has inspired me to watch a YouTube analysis.&lt;/p&gt;

&lt;p&gt;My wife doesn't read &lt;del&gt;any&lt;/del&gt; many of the articles I write.&lt;/p&gt;

&lt;p&gt;What I've created matters far less than who it can help. After a year of diligently expanding my technical toolkit and writing repertoire, I am convinced that the best thing I've done has been to try and help others.&lt;/p&gt;

&lt;p&gt;There will always be someone who can learn from what I've just done.&lt;/p&gt;

&lt;p&gt;The thing is, learning for its own sake is also a ton of fun. I'd probably spend a significant portion of my life in college forever if I had infinite resources. So it can be easy to slide off into misaligned priorities that completely miss the point.&lt;/p&gt;

&lt;p&gt;The point is that I'm learning and creating content to benefit others. By teaching, I get better and I help others get better.&lt;/p&gt;

&lt;p&gt;I was beginning to understand this even at the start of the year when I thought I'd make a new product every month.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩Solving Specific Problems
&lt;/h2&gt;

&lt;p&gt;Solving specific problems that I was experiencing gave birth to the &lt;a href="https://eamonn.gumroad.com/l/personalfinance?layout=profile"&gt;2022 Personal Finance Tracker&lt;/a&gt;, the &lt;a href="https://eamonn.gumroad.com/l/sacred-geometry?layout=profile"&gt;Sacred Geometry&lt;/a&gt; collection, and the &lt;a href="https://infinite-memory.netlify.app/"&gt;Infinite Memory&lt;/a&gt; web application.&lt;/p&gt;

&lt;p&gt;These products couldn't be categorically further from one another, but they were all things I was deeply interested in as well as passionate about sharing with others.&lt;/p&gt;

&lt;p&gt;The Finance Tracker was a polished version of a Google Sheets tool that my wife and I have been using for the past decade every year.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=E9oeEXdJFbg"&gt;https://www.youtube.com/watch?v=E9oeEXdJFbg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Sacred Geometry collection was more an art project than anything. I combined my Adobe Illustrator hacks with my childhood interests in geometric drawings to create an iPhone wallpaper pack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=yKP609MObYY"&gt;https://www.youtube.com/watch?v=yKP609MObYY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Infinite Memory project was a tool I made for a men's bible study to help memorize scripture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=qgInM6FH8Lk"&gt;https://www.youtube.com/watch?v=qgInM6FH8Lk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Making videos or writing articles about specific things I was struggling with or had figured out became my most popular content.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Helping others is the best way to increase exposure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My personal YouTube channel is tiny because it contains a diverse amount of irregularly posted content. ( &lt;strong&gt;I have a dedicated brand channel that will be launching in the coming weeks that will focus on spreadsheets and coding&lt;/strong&gt;!)&lt;/p&gt;

&lt;p&gt;But even with the minuscule amount of views I ordinarily garner from my personal channel's posts, I had one video amass 10,000+ views since publishing it in January.&lt;/p&gt;

&lt;p&gt;And the coolest part: I made it on a whim after talking to my 5-year-old son about building a spreadsheet that kept track of the Teenage Mutant Turtles' favorite colors.&lt;/p&gt;

&lt;p&gt;This was not a high-concept piece, it was simply something that I did for fun with my son, and which presented a &lt;strong&gt;curious, small, specific  problem&lt;/strong&gt; that I had to figure out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=41ydIPKZezE"&gt;https://www.youtube.com/watch?v=41ydIPKZezE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The other two videos that gained multiple thousand views were answering very specific, and pretty basic questions about a point-of-sale software that my company uses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=L8PBv2k76jU"&gt;https://www.youtube.com/watch?v=L8PBv2k76jU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=HB4OQF9r98c"&gt;https://www.youtube.com/watch?v=HB4OQF9r98c&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;People benefit most from answers to concise questions. I am still learning how to get better at keeping things simple in my content and in my learning path.&lt;/p&gt;

&lt;h2&gt;
  
  
  💩You Gotta Make Poop Before Pearls
&lt;/h2&gt;

&lt;p&gt;Why the bit on YouTube? Why not give some Hashnode stats? First, I'm happy to share my meager Hashnode numbers below. This article will be the 30th I've published here, and of those, 5 were originally published on freeCodeCamp.&lt;/p&gt;

&lt;p&gt;I have &lt;strong&gt;169&lt;/strong&gt; videos on YouTube. Of those, &lt;strong&gt;only 10 have more than 100 views&lt;/strong&gt;. 👀&lt;/p&gt;

&lt;p&gt;For Hashnode, I have only been putting out content for a year, and my readership is not large. Here's a snapshot from the advanced analytics before publishing this article:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p3wXdyfK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672155436152/59926267-aa95-43b9-aff6-f526460de859.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p3wXdyfK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672155436152/59926267-aa95-43b9-aff6-f526460de859.png" alt="" width="880" height="773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most viewed article I have written was about &lt;a href="https://blog.eamonncottrell.com/responsive-youtube-lessiframegreater-embedding-with-bootstrap"&gt;embedding video in a Bootstrap 5 site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The next two articles were about doing very specific things too: &lt;a href="https://blog.eamonncottrell.com/animate-svgs-for-github-readmes"&gt;Animating SVGs for GitHub ReadMEs&lt;/a&gt; and &lt;a href="https://blog.eamonncottrell.com/how-to-quickly-create-a-lightbox-photo-gallery-in-your-bootstrap-5-site"&gt;Creating Lightbox Photo Galleries in a Bootstrap 5 site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, you've got to make crap first. Or at least I do.&lt;/p&gt;

&lt;p&gt;It takes writing and recording and putting out a bunch of crap to refine my voice.&lt;/p&gt;

&lt;p&gt;It takes fearlessly releasing things into the wild and persevering past negative (or even worse, zero) reactions to them.&lt;/p&gt;

&lt;p&gt;It takes time to develop a skillset and the ability to craft content that is at once &lt;strong&gt;concise&lt;/strong&gt; and &lt;strong&gt;helpful&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But it has been and will continue to be worth it.&lt;/p&gt;

&lt;p&gt;I love helping and teaching others. I love creating content that can provide shortcuts to solutions I've discovered. I love platforms that connect developers and content creators around the world.&lt;/p&gt;

&lt;p&gt;I love these things because I love people. Sure I love software and learning and challenges and puzzles and videos and writing and all that.&lt;/p&gt;

&lt;p&gt;But at the end of the day, I love connecting with others. Creating content has helped me do more of that this year. I love that I can expand my technical toolkit by helping someone else expand theirs.&lt;/p&gt;

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

&lt;p&gt;I could go on about the cool stuff I've learned and been able to write about this year. Mostly, though, it's given me further insight into the viability of being a professional creator. I love connecting with people through the content I make, and I look forward to an impactful year of doing more of exactly that in 2023!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4VuKFy7O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672156102565/688050ed-54a8-4cc1-9e67-805d82c408d3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4VuKFy7O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1672156102565/688050ed-54a8-4cc1-9e67-805d82c408d3.gif" alt="" width="349" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you found this recap helpful and inspiring! Come follow me on &lt;a href="https://www.linkedin.com/in/eamonncottrell/"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://www.youtube.com/@eamonncottrell"&gt;YouTube&lt;/a&gt;! I'd love it if you said hey! 👋&lt;/p&gt;

</description>
      <category>goals</category>
      <category>freelance</category>
      <category>review</category>
    </item>
    <item>
      <title>What is a ROM? ROM Price and Cost Estimate</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Fri, 23 Dec 2022 14:13:23 +0000</pubDate>
      <link>https://forem.com/sieis/what-is-a-rom-rom-price-and-cost-estimate-3b95</link>
      <guid>https://forem.com/sieis/what-is-a-rom-rom-price-and-cost-estimate-3b95</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/what-is-a-rom-price-and-cost-estimate-2/" rel="noopener noreferrer"&gt;Originally published for freeCodecamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ROM stands for &lt;strong&gt;Rough Order of Magnitude&lt;/strong&gt;. It is a project management guideline to determine the estimated range of costs for a project.&lt;/p&gt;

&lt;p&gt;This article will explain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Who should use a ROM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When to use a ROM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to calculate a ROM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple example of a ROM&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Who Should Use a ROM&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Project Managers use rough orders of magnitude to determine initial cost ranges for upcoming projects. Many organizations and most software organizations use project managers to lead projects.&lt;/p&gt;

&lt;p&gt;Their role involves leading their project team, defining the goals of the project, reporting on the progress to the company stakeholders, and seeing the project through to completion.&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%2F93e1bhvwiozbkkxuiww4.gif" 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%2F93e1bhvwiozbkkxuiww4.gif" alt="man with blank stare listening to man trying to explain something" width="350" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Who else can use a ROM? You! 👊 As you'll see, the concept of a ROM is very simple to grasp and can be useful in myriad circumstances.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;When to Use a ROM&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;ROMs are extremely important for project managers in the &lt;strong&gt;early stages&lt;/strong&gt; of a project's planning. They're used to decide whether or not a project is going to be feasible or not.&lt;/p&gt;

&lt;p&gt;Rough Orders of Magnitude can be used to prepare a project business case (an analysis of the potential benefits of the project) before a project is committed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Calculate a ROM&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Calculating a ROM is pretty straightforward. It is meant to provide a &lt;strong&gt;range of the possible cost of a project&lt;/strong&gt; and you can find it using the following formulas:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Lower Bound = ROM Estimate x 0.75&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Upper Bound = ROM Estimate x 1.75&lt;/code&gt;&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%2Fkw7dbhqnb86dt4vm537a.gif" 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%2Fkw7dbhqnb86dt4vm537a.gif" alt="Fred Flinstone counting on fingers" width="480" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;During the planning phases of a project, the project manager can come up with an estimate of the costs involved. From here, using the above formulas, they can then calculate a lower boundary in case the project ends up being less expensive and an upper boundary in case it goes over budget.&lt;/p&gt;

&lt;p&gt;Since it is helpful to have more room on the upper boundary to avoid running out of funding if it does go over budget, the rough order of magnitude's upper boundary is considerably higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ROM Example&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You've probably calculated a ROM without knowing it. 💡&lt;/p&gt;

&lt;p&gt;Say you're going to the movies with a friend. You figure there will be ticket costs plus refreshment costs. Maybe $20 a ticket since you're going to the latest Nolan IMAX film and then another $30 a person since popcorn is more expensive than steaks at the movies.&lt;/p&gt;

&lt;p&gt;This puts you at $100 total for both of you.&lt;/p&gt;

&lt;p&gt;The Lower Bound in a ROM calculation would be &lt;code&gt;$100 x 0.75 = $75&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The Upper Bound would be &lt;code&gt;$100 x 1.75 = $175&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You probably don't do this exact math in your head, but you likely have figured there could be extra expenses. You go into the date thinking you could spend as much as $150, for instance.&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%2Fqe6nyb0s6tn4t7er6x71.gif" 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%2Fqe6nyb0s6tn4t7er6x71.gif" alt="Angry Bird eating popcorn at movies" width="409" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Rough Orders of Magnitude are extremely important in organizational projects. It is vital to decide at the onset whether or not the project is feasible. And the principals behind ROMs are both common sense and easy to calculate.&lt;/p&gt;

&lt;p&gt;I hope this has been helpful to you!&lt;/p&gt;

&lt;p&gt;You can find and follow me on &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; &amp;amp; &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. I'd love it if you said hey! 👋&lt;/p&gt;

</description>
      <category>rom</category>
      <category>projectmanagement</category>
    </item>
    <item>
      <title>How to Calculate Percentage Differences Between Two Numbers in Excel - Cell Percentage Change Tutorial</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Tue, 20 Dec 2022 14:14:26 +0000</pubDate>
      <link>https://forem.com/sieis/how-to-calculate-percentage-differences-between-two-numbers-in-excel-cell-percentage-change-tutorial-10e</link>
      <guid>https://forem.com/sieis/how-to-calculate-percentage-differences-between-two-numbers-in-excel-cell-percentage-change-tutorial-10e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/how-to-calculate-percentage-differences-between-two-numbers-in-excel-cell-percentage-change-tutorial/" rel="noopener noreferrer"&gt;Originally published for freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Spreadsheets are powerful and awesome. 💪&lt;/p&gt;

&lt;p&gt;In this tutorial I will show you four ways to find the percentage difference between two numbers in Excel. I'll also show you how to use custom functions in Google Sheets. 👍&lt;/p&gt;

&lt;p&gt;The four techniques (and one bonus) we'll use are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Using a Formula (lvl 1 easy mode)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using the LAMBDA FUNCTION + Name Manager (lvl 2 normal mode)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Visual Basic for Applications (VBA) (lvl 3 hard mode)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using the Office JavaScript API (lvl 4 ultra-mode)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Custom Functions with Google Sheets (💥 bonus level)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Formula for Percentage Change Between Two Numbers in Excel&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The formula is the first thing most people will reach for when making a calculation in Excel. It allows us to make explicit calculations using data in cells.&lt;/p&gt;

&lt;p&gt;Suppose we have sales data for one year in cell &lt;code&gt;B3&lt;/code&gt; and sales data for the second year in cell &lt;code&gt;C3&lt;/code&gt;. By typing the formula below we can calculate the percentage difference from the first year to the second:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=(C3-B3)/B3

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

&lt;/div&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%2Fc0da62noi2hmvwjvhdc0.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%2Fc0da62noi2hmvwjvhdc0.png" alt="formula for percentage change between two numbers in Excel" width="800" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Typing a custom formula has the advantage of being quick and straightforward, especially for simple calculations.&lt;/p&gt;

&lt;p&gt;Additionally, formulas may be copied down and/or across cell ranges for quick reuse. And formulas are used in exactly the same fashion in Google Sheets as in Microsoft Excel.&lt;/p&gt;

&lt;p&gt;However, when calculations become lengthy and/or complex, it can be helpful to know about some alternative methods.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use a LAMBDA Function and Name Manger&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building on our first example, the LAMBDA function allows us to take a custom operation and codify it for reuse throughout our worksheet.&lt;/p&gt;

&lt;p&gt;Using the same data as before (this time in cells &lt;code&gt;B4&lt;/code&gt; and &lt;code&gt;C4&lt;/code&gt;) we write the LAMBDA Function like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=LAMBDA(year1,year2,(year2-year1)/year1)(B4,C4)

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

&lt;/div&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%2Fc0rxt8visuvdkgd5n4gg.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%2Fc0rxt8visuvdkgd5n4gg.png" alt="Screenshot of Excel Lambda function" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance you might wonder why on earth we should type out this lengthy mess, but hang with me and you'll see it is arguably cleaner for reuse than simply defining a function.&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%2Fkq19xaty32479rqy9z9g.gif" 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%2Fkq19xaty32479rqy9z9g.gif" alt="Gif of woman scratching head and looking confused" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what's happening:&lt;/p&gt;

&lt;p&gt;The first thing we're doing is defining the parameters of our function and separating them by commas. You can define as many of those as you need (well, up to 253 that is 🤣). We only have two: &lt;code&gt;year1&lt;/code&gt; and &lt;code&gt;year2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After listing the parameters, we write the formula we want Excel to calculate. This is the same thing we did in the first Formula section only this time we're using our parameter names instead of the explicit cell names: &lt;code&gt;(year1-year2)/year1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Last, we close the parenthesis of the LAMBDA function and then call it by writing the actual cells being used: &lt;code&gt;B4,C4&lt;/code&gt;. This is telling the function that it needs to use the value in cell &lt;code&gt;B4&lt;/code&gt; for the parameter &lt;code&gt;year1&lt;/code&gt; and the value in cell &lt;code&gt;C4&lt;/code&gt; for the parameter &lt;code&gt;year2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What a mess, right!? Yes, and technically, writing out the whole LAMBDA function here is simply good practice to make sure the thing works before we do the next step...&lt;/p&gt;

&lt;p&gt;This is the cool part. Click the Formula tab in the Ribbon at the top and select Name Manager.&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%2Fhlizojpyj0ul4mcru3v2.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%2Fhlizojpyj0ul4mcru3v2.png" alt="Excel Ribbon accessing Name Manager in Formula Tab" width="479" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select New.&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%2Fnpny2yfd4ysq8wfbeo70.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%2Fnpny2yfd4ysq8wfbeo70.png" alt="Screenshot of Name Manager in Excel" width="698" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then enter the Name of your formula and write an optional description in the Comments. In the Refers to line, you'll copy in the LAMBDA Function.&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%2Ftjt5vhmmt7mu3qh5fx0c.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%2Ftjt5vhmmt7mu3qh5fx0c.png" alt="Screenshot of Named Function in Excel" width="528" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be able to use it in the same way you would use a built-in function by typing the following into a cell&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=Percentage_Change(B5,C5)

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

&lt;/div&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%2Fsy4asbi4e0hk900zodwb.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%2Fsy4asbi4e0hk900zodwb.png" alt="Screenshot of Excel Formula" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have all the ease of a regular built-in function at our disposal. Google Sheets has similar functionality, which we'll discuss at the end of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use Visual Basic for Applications&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you're using the desktop version of Excel, you have access to Visual Basic for Applications. This is an event-driven programming language by Microsoft and you can use it to do almost anything you can dream (and code) up.&lt;/p&gt;

&lt;p&gt;If you wanted to find the percentage difference between two numbers using VBA, you would go to the Developer tab in the Ribbon (or press &lt;code&gt;alt + F11&lt;/code&gt;).&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%2Fcg7z0ufyefkgfos5ragk.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%2Fcg7z0ufyefkgfos5ragk.png" alt="Screenshot of Developer Tab in Excel" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't see the Developer tab, you may need to enable it by selecting File -&amp;gt; Options. Then look for Customize Ribbon. From here you can select the box next to Developer.&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%2F7pwo4wqgmd8pqumwyner.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%2F7pwo4wqgmd8pqumwyner.png" alt="Screenshot of Excel Options" width="800" height="658"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bonus: If &lt;code&gt;ALT + F11&lt;/code&gt; doesn't work, GeForce Experience may be interfering with the built-in shortcuts. Change the shortcut for whatever is using &lt;code&gt;ALT + F11&lt;/code&gt; in the settings. For me it was the Toggle comments on/off while broadcasting to Facebook setting.&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%2Fuk5ws6o6yuc77oboiktl.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%2Fuk5ws6o6yuc77oboiktl.png" alt="screenshot of GeForce Experience settings" width="800" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've opened the VBA window, select Insert -&amp;gt; Module from the menu. This will open up a blank window where we will write our program. Think of this like an IDE inside Excel. We'll program here and then utilize that program in our worksheet.&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%2F65ion4teiqgue8l1680f.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%2F65ion4teiqgue8l1680f.png" alt="Screenshot of VBA menu" width="595" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we can enter the same type of commands we used with the Named LAMBDA function above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Function PERCENTFUNCTION(year1, year2)
    PERCENTFUNCTION = (year2 - year1) / year1
End Function

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

&lt;/div&gt;



&lt;p&gt;And voil! We can now use &lt;code&gt;PERCENTFUNCTION&lt;/code&gt; in our Excel Sheet in the same way we used the &lt;code&gt;Percentage_Change&lt;/code&gt; named function.&lt;/p&gt;

&lt;p&gt;VBA is useful for more complicated programs and would be overkill for our example. Incidentally, Google Sheets does not have VBA functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use the Office JavaScript API&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now the real good stuff! Did you know you can write JavaScript and TypeScript within Excel? Me either. But you can.&lt;/p&gt;

&lt;p&gt;Script Lab is an Add-on by Microsoft that allows us to explore the JavaScript API within Office Apps as well as declare custom functions by writing them as scripts.&lt;/p&gt;

&lt;p&gt;You can add it to Excel &lt;a href="https://learn.microsoft.com/en-us/office/dev/add-ins/overview/explore-with-script-lab" rel="noopener noreferrer"&gt;here&lt;/a&gt;. And read more about it &lt;a href="https://learn.microsoft.com/en-us/office/dev/add-ins/overview/explore-with-script-lab" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unlike VBA, this is usable on the web version of Excel too.&lt;/p&gt;

&lt;p&gt;Once it's installed, select it from the Ribbon and click Code.&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%2Fizt6253qs72t2dlp8b37.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%2Fizt6253qs72t2dlp8b37.png" alt="Screenshot of Script Lab in Excel Ribbon" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will bring up a legit code editor on the sidebar.&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%2F4gny1x40r6wtqlisyjhh.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%2F4gny1x40r6wtqlisyjhh.png" alt="Screenshot of Script Labs Code Editor in Excel" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can create a custom function using JavaScript by selecting a New Snippet from the Hamburger menu at the top left of the Scripts Lab window.&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%2Fu7xjnu2q3trmxizr6lu1.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%2Fu7xjnu2q3trmxizr6lu1.png" alt="Screenshot of New Snippet menu" width="427" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By typing the following function we can again define a percent difference function, but this time using JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/** @CustomFunction */
function percent_change_javacscript(year1, year2) {
  return (year2 - year1) / year1;
}

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

&lt;/div&gt;



&lt;p&gt;In order to use this function, select Script Lab -&amp;gt; Functions from the Ribbon:&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%2Fte1tlfmekub7h4gzwoss.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%2Fte1tlfmekub7h4gzwoss.png" alt="Screenshot of Script Lab Menu in Ribbon" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will open another sidebar tab and because of the first line in the snippet: &lt;code&gt;/** @CustomFunction */&lt;/code&gt; it will register that custom function.&lt;/p&gt;

&lt;p&gt;In the worksheet, you'll be able to use it just like we've been using custom defined functions. This time, though, when you start typing the title, you'll see it registered with a scriptlab prefix on the name. Select this, and it will return the percent change just like the other methods.&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%2F0vgtlqc3xk6hyff2n94n.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%2F0vgtlqc3xk6hyff2n94n.png" alt="Screenshot of Script Lab Custom Function in Excel" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once again, this is major overkill for a simple function, but quite handy to put in your toolbelt nonetheless! 👍&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Use Custom Functions with Google Sheets&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As promised, here's a bonus for how to create a Named Function in Google Sheets. This is very similar to using the Name Manager in Excel.&lt;/p&gt;

&lt;p&gt;Select Data -&amp;gt; Named Functions in Google Sheets.&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%2F6ksaxkove6rb5l9hd08g.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%2F6ksaxkove6rb5l9hd08g.png" alt="Screenshot of Google Sheets Data Menu" width="608" height="771"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will prompt you to name and describe your function as well as provide arguments, if applicable.&lt;/p&gt;

&lt;p&gt;Last, you'll define the function's operation.&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%2Fnc2546uj3zenrx1e0r1g.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%2Fnc2546uj3zenrx1e0r1g.png" alt="Screenshot of naming a custom function in Google Sheets" width="492" height="1074"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next screen prompts you to add argument descriptions and examples if you'd like. This is optional, but will be included in the drop down help menu when you use the function in your sheet.&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%2Fvby13c9rvsxyc7qs5djk.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%2Fvby13c9rvsxyc7qs5djk.png" alt="Screenshot of custom function argument descriptions in Google Sheets" width="488" height="1110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it's as easy as typing in your custom function and selecting the cells. You can see below how the help menu is displayed with the information you provided.&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%2F7wgf5g0alkpjb5vljnn9.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%2F7wgf5g0alkpjb5vljnn9.png" alt="Screenshot of using a custom function in Google Sheets" width="587" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Yes, often you will opt for simplicity's sake to use a quick formula in Excel or Google Sheets. But now you know several other ways to find the percentage change between two numbers.&lt;/p&gt;

&lt;p&gt;I hope you've found this useful, and good luck in your own spread-sheeting adventures!&lt;/p&gt;

&lt;p&gt;You can find and follow me on &lt;a href="https://www.youtube.com/@eamonncottrell" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; &amp;amp; &lt;a href="https://www.linkedin.com/in/eamonncottrell/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;. I'd love it if you said hey! 👋&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%2F9sh3wmzzizkygp55cc7y.gif" 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%2F9sh3wmzzizkygp55cc7y.gif" alt="Jimmy Fallon saying haaaaay and holding up some hay" width="250" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>excel</category>
      <category>vba</category>
      <category>spreadsheet</category>
      <category>googlesheet</category>
    </item>
    <item>
      <title>Email Alias – How to Set Up a Professional Email for Free</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Fri, 02 Dec 2022 19:37:42 +0000</pubDate>
      <link>https://forem.com/sieis/email-alias-how-to-set-up-a-professional-email-for-free-2di2</link>
      <guid>https://forem.com/sieis/email-alias-how-to-set-up-a-professional-email-for-free-2di2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published for &lt;a href="https://www.freecodecamp.org/news/email-alias-set-up-a-professional-email-for-free/"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I needed to log in to AWS. But my main email address was rejected. I'd done this in the past and the account had been irreversibly deleted.&lt;/p&gt;

&lt;p&gt;No reset option just a message saying the account was permanently deleted:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jFYp82JM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.17.29-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jFYp82JM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.17.29-PM.png" alt="Screen-Shot-2022-10-12-at-2.17.29-PM" width="880" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are about a million ways to get a new email address, but I wanted to set up one of the domains I own with email.&lt;/p&gt;

&lt;p&gt;And I figured there would probably be a way to have that forwarded to my Gmail.&lt;/p&gt;

&lt;p&gt;I was right!&lt;/p&gt;

&lt;p&gt;In this quick guide, I'll walk you through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;How to create an email alias&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forwarding mail from the alias to a Gmail account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sending mail as the Email Alias&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Create an Email Alias&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I'm using Google products: &lt;a href="https://domains.google.com/registrar/"&gt;Google Domains&lt;/a&gt; and &lt;a href="https://gmail.com/"&gt;Gmail&lt;/a&gt;. All these steps should apply generally to other Domain and Email services.&lt;/p&gt;

&lt;p&gt;First, login to your domain provider and select the &lt;strong&gt;Email&lt;/strong&gt; menu. You will be able to select " &lt;strong&gt;Add email alias&lt;/strong&gt;" from the menu options.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f1szoIq0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.37.40-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f1szoIq0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.37.40-PM.png" alt="Screen-Shot-2022-10-12-at-2.37.40-PM" width="880" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Forward Email to Another Address&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Note: if you add the asterisk (*) symbol, this will create a wildcard alias that forwards any email to the specified address. We'll be adding a specific alias in this tutorial.&lt;/p&gt;

&lt;p&gt;Add whatever email you choose and enter where you'd like it to be forwarded to. I'll have &lt;a href="//mailto:hi@sieis.com"&gt;&lt;strong&gt;hi@sieis.com&lt;/strong&gt;&lt;/a&gt; forwarded to my main Gmail address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PwGh8Z8h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.41.16-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PwGh8Z8h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-2.41.16-PM.png" alt="Screen-Shot-2022-10-12-at-2.41.16-PM" width="880" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are using Google Name servers, then Google Domains will automatically set up the correct mail records (MX).&lt;/p&gt;

&lt;p&gt;Otherwise, you'll need to set up these MX records. The process is exactly like setting up name servers if you've ever done that to host your website somewhere different than where you purchased the domain.&lt;/p&gt;

&lt;p&gt;| &lt;strong&gt;NAME/HOST/ALIAS&lt;/strong&gt; | &lt;strong&gt;TYPE&lt;/strong&gt; | &lt;strong&gt;TIME-TO-LIVE (TTL)&lt;/strong&gt; | &lt;strong&gt;PRIORITY&lt;/strong&gt; | &lt;strong&gt;VALUE/ANSWER/DESTINATION&lt;/strong&gt; |&lt;br&gt;
| Blank or @ | MX | 1H | 5 | &lt;a href="http://gmr-smtp-in.l.google.com"&gt;gmr-smtp-in.l.google.com&lt;/a&gt; |&lt;br&gt;
| Blank or @ | MX | 1H | 10 | &lt;a href="http://alt1.gmr-smtp-in.l.google.com"&gt;alt1.gmr-smtp-in.l.google.com&lt;/a&gt; |&lt;br&gt;
| Blank or @ | MX | 1H | 20 | &lt;a href="http://alt2.gmr-smtp-in.l.google.com"&gt;alt2.gmr-smtp-in.l.google.com&lt;/a&gt; |&lt;br&gt;
| Blank or @ | MX | 1H | 30 | &lt;a href="http://alt3.gmr-smtp-in.l.google.com"&gt;alt3.gmr-smtp-in.l.google.com&lt;/a&gt; |&lt;br&gt;
| Blank or @ | MX | 1H | 40 | &lt;a href="http://alt4.gmr-smtp-in.l.google.com"&gt;alt4.gmr-smtp-in.l.google.com&lt;/a&gt; |&lt;/p&gt;

&lt;p&gt;Bonus: I've done this for a site hosted on Netlify, and it is very straightforward. From the Netlify dashboard, select &lt;strong&gt;Options&lt;/strong&gt; , &lt;strong&gt;Go to DNS panel&lt;/strong&gt; , and then enter the MX records:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hlBgMtNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.42.25-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hlBgMtNJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.42.25-PM.png" alt="Screen-Shot-2022-10-12-at-3.42.25-PM" width="880" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oSWsRdC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.42.53-PM-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oSWsRdC6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.42.53-PM-2.png" alt="Screen-Shot-2022-10-12-at-3.42.53-PM-2" width="880" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google will send a one-time verification email here, but if you've previously done this verification it may not send another one.&lt;/p&gt;

&lt;p&gt;Send yourself an email from a different address and check it out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LHaTNEqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.02.53-PM-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LHaTNEqi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.02.53-PM-1.png" alt="Screen-Shot-2022-10-12-at-3.02.53-PM-1" width="880" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Email sent to Alias and forwarded to main Gmail&lt;/p&gt;

&lt;p&gt;Note: sending from your main Gmail address doesn't show up as an unread message like it normally would when you email yourself. Send it from a different address at this point. After the rest of the steps, it will behave as normal when we complete the "send email as alias" part.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2ZPZuSUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.04.35-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2ZPZuSUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.04.35-PM.png" alt="Screen-Shot-2022-10-12-at-3.04.35-PM" width="880" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How to Send Email as the Alias&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you reply from your main Gmail currently, the recipient will see that address when you reply instead of the alias. That may not be a big deal depending on the use case, but we can certainly set it up so that sent mail acts like it's coming from the custom domain as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OJnO08_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.08.37-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OJnO08_V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.08.37-PM.png" alt="Screen-Shot-2022-10-12-at-3.08.37-PM" width="880" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll need to go to your &lt;a href="https://myaccount.google.com/security"&gt;&lt;strong&gt;Google Account Security&lt;/strong&gt;&lt;/a&gt; and click &lt;strong&gt;App passwords&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KFFLtmsC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.12.46-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KFFLtmsC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.12.46-PM.png" alt="Screen-Shot-2022-10-12-at-3.12.46-PM" width="880" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;Mail&lt;/strong&gt; for the app dropdown and &lt;strong&gt;Other&lt;/strong&gt; for the device dropdown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--40UdIliS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.14.18-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--40UdIliS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.14.18-PM.png" alt="Screen-Shot-2022-10-12-at-3.14.18-PM" width="880" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter the name of your domain and click &lt;strong&gt;Generate&lt;/strong&gt;. It will give you a 16 digit password. Save this for use over in Gmail...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OzLRa3uW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.15.34-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OzLRa3uW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.15.34-PM.png" alt="Screen-Shot-2022-10-12-at-3.15.34-PM" width="880" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Gmail, go to settings -&amp;gt; &lt;strong&gt;Accounts and Import&lt;/strong&gt; and click &lt;strong&gt;Add another email address&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m5RMwuUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.17.49-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m5RMwuUL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.17.49-PM.png" alt="Screen-Shot-2022-10-12-at-3.17.49-PM" width="880" height="899"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will pop up a new small window where you will enter in the details of the alias. Enter the &lt;strong&gt;name&lt;/strong&gt; you want recipients to view and the &lt;strong&gt;address&lt;/strong&gt; of the alias. Make sure the " &lt;strong&gt;Treat as an alias&lt;/strong&gt;" box is checked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1TERJ7pz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.21.46-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1TERJ7pz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.21.46-PM.png" alt="Screen-Shot-2022-10-12-at-3.21.46-PM" width="880" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the next screen, you'll need to change the &lt;strong&gt;SMTP server&lt;/strong&gt; to &lt;a href="http://smtp.gmail.com"&gt;smtp.gmail.com&lt;/a&gt;, the &lt;strong&gt;username&lt;/strong&gt; to your Gmail username, and then paste in the &lt;strong&gt;16-digit password&lt;/strong&gt; you generated from Google Security in the steps above.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;port&lt;/strong&gt; should be 587, and the &lt;strong&gt;TLS&lt;/strong&gt; radial button should be checked.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Add Account&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dUG8yvWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.23.33-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dUG8yvWf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.23.33-PM.png" alt="Screen-Shot-2022-10-12-at-3.23.33-PM" width="880" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will prompt a verification code being sent to the email alias...which should in turn go to the Gmail account. Enter that in, and you'll now be good to go!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YBnbLK_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.27.09-PM-1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YBnbLK_h--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.27.09-PM-1.png" alt="Screen-Shot-2022-10-12-at-3.27.09-PM-1" width="880" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back in our email thread in Gmail, you'll have the dropdown option when composing new messages to select which account you would like it to send from.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GugzUDYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.29.10-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GugzUDYp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.29.10-PM.png" alt="Screen-Shot-2022-10-12-at-3.29.10-PM" width="880" height="911"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can see from our full thread that our email forwards to and sends from our Gmail account using the email alias and display name we selected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--obWYRKEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.35.15-PM.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--obWYRKEH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/Screen-Shot-2022-10-12-at-3.35.15-PM.png" alt="Screen-Shot-2022-10-12-at-3.35.15-PM" width="880" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Thanks for reading!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This was enlightening for me, and I hope it's helpful for you too.&lt;/p&gt;

&lt;p&gt;Come say hey on Twitter: &lt;a href="https://twitter.com/EamonnCottrell"&gt;https://twitter.com/EamonnCottrell&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0QQGGtGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/goodtogo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0QQGGtGs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://www.freecodecamp.org/news/content/images/2022/10/goodtogo.gif" alt="goodtogo" width="450" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>alias</category>
      <category>gmail</category>
    </item>
    <item>
      <title>Animate SVGs for GitHub READMEs</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Wed, 07 Sep 2022 16:04:37 +0000</pubDate>
      <link>https://forem.com/sieis/animate-svgs-for-github-readmes-420d</link>
      <guid>https://forem.com/sieis/animate-svgs-for-github-readmes-420d</guid>
      <description>&lt;p&gt;Holy backslash! We can program SVG animations directly within the file! 😲&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G45SA-06--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662565610555/g-6GLxgru.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G45SA-06--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662565610555/g-6GLxgru.gif" alt="amazing.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's an SVG?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;From Wikipedia&lt;/a&gt;: SVGs are scalable vector graphics. They are an XML-based vector image format for defining 2d graphics that supports interactivity and animation. They can be scaled in size without loss of quality.&lt;/p&gt;

&lt;p&gt;So, SVGs are, in essence, a list of programatic instructions describing a shape or collection of shapes. The file itself is an XML document and when you open one up, it looks a lot like html at first glance. In fact, as we'll see shortly, you can add ids and classes to the different elements in order to manipulate them with CSS just like html elements!&lt;/p&gt;

&lt;p&gt;Cool, right?! 😁&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case - GitHub README
&lt;/h2&gt;

&lt;p&gt;I recently updated the README for one of my GitHub projects, &lt;a href="https://github.com/sieis/unmove"&gt;unMove&lt;/a&gt;. This was what caused me to go down the .svg rabbit hole. I wanted an animation on there without having to resort to something on giphy.&lt;/p&gt;

&lt;p&gt;This is what I used first, but it was pretty rough:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.giphy.com/media/rqXk2WsgiDGHoHMU8l/giphy.gif"&gt;https://media.giphy.com/media/rqXk2WsgiDGHoHMU8l/giphy.gif&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's when I realized that I could "embed" the animation into an .svg and then just add that .svg straight to the README like any other image file.&lt;/p&gt;

&lt;p&gt;Below is the graphic I created in Illustrator with the embedded code followed by the full .svg code block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;svg id="b" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 322.01 322.01"&amp;gt;
    &amp;lt;defs&amp;gt;
        &amp;lt;style&amp;gt;
            .e{
                fill:url(#d);
            }
            .rotate{
                transform-origin: center;
                animation: rotation 20s infinite linear;
            }
            @keyframes rotation{
                from{
                    transform: rotate(0deg);
                }
                to{
                    transform: rotate(359deg);
                }
            }
        &amp;lt;/style&amp;gt;
        &amp;lt;radialGradient id="d" cx="161.01" cy="161.01" fx="161.01" fy="161.01" r="161.01" gradientUnits="userSpaceOnUse"&amp;gt;
            &amp;lt;stop offset="0" stop-color="red"/&amp;gt;
            &amp;lt;stop offset=".22" stop-color="#ff0"/&amp;gt;
            &amp;lt;stop offset=".4" stop-color="#f7931e"/&amp;gt;
            &amp;lt;stop offset=".73" stop-color="#f0f"/&amp;gt;
            &amp;lt;stop offset="1" stop-color="#aca1c9"/&amp;gt;
        &amp;lt;/radialGradient&amp;gt;
        &amp;lt;/defs&amp;gt;
    &amp;lt;g id="c" class="rotate"&amp;gt;
        &amp;lt;path class="e" d="M322.01,161c-88.92,0-161.01,72.09-161.01,161.01,0-88.92-72.08-161.01-161-161.01C88.92,161,161,88.92,161,0c0,88.92,72.09,161,161.01,161Z"/&amp;gt;
    &amp;lt;/g&amp;gt;
&amp;lt;/svg&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Pretty neat, eh? 😀&lt;/p&gt;

&lt;p&gt;Let's build one of our own...&lt;/p&gt;

&lt;h2&gt;
  
  
  Get SVG from unDraw
&lt;/h2&gt;

&lt;p&gt;You don't have to create a graphic from scratch, although that's a fun option too if you're so inclined!&lt;/p&gt;

&lt;p&gt;One of my favorite places to get free, open-sourced illustrations in .svg or .png format is &lt;a href="https://undraw.co/"&gt;unDraw&lt;/a&gt;. We'll be using one of their illustrations for our example file.&lt;/p&gt;

&lt;p&gt;When you select an image on unDraw, you'll be able to change it's color as well as select the download format.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RavRVXo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662486593294/oS_bPTtfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RavRVXo6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662486593294/oS_bPTtfj.png" alt="Screen Shot 2022-09-06 at 1.49.33 PM.png" width="880" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm going to use the &lt;em&gt;Blooming&lt;/em&gt; illustration.&lt;/p&gt;

&lt;p&gt;If you search "flower", it should pop up easily for you. 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QuzRpPOz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662486532292/o1iHhFw8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QuzRpPOz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662486532292/o1iHhFw8n.png" alt="Screen Shot 2022-09-06 at 1.47.03 PM.png" width="880" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Edit the SVG
&lt;/h2&gt;

&lt;p&gt;Once you've downloaded the SVG, open it up in your code editor of choice. I use &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;, but any editor will do the trick.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pro-tip&lt;/em&gt;: if you're so inclined, you can also open the .svg in a graphics program like &lt;a href="https://www.adobe.com/products/illustrator.html"&gt;Adobe Illustrator&lt;/a&gt; (not free) or &lt;a href="https://www.gimp.org/"&gt;GIMP&lt;/a&gt; (free) and make edits or additions graphically. Once you've done that, though, we'll want to end up looking at the actual code.&lt;/p&gt;

&lt;p&gt;I've created a folder for our example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$mkdir svg-sample

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

&lt;/div&gt;



&lt;p&gt;And then I've placed the svg in the folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ls
# blooming.svg

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

&lt;/div&gt;



&lt;p&gt;This makes it simple to open in VSCode&lt;br&gt;
&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;Once in VSCode, though, you'll be confronted with an impenetrable wall of text when you open the .svg file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PWlRexAA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662487027120/qZ2VFmKD8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PWlRexAA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662487027120/qZ2VFmKD8.png" alt="Screen Shot 2022-09-06 at 1.56.33 PM.png" width="880" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take heart! 💚&lt;/p&gt;

&lt;p&gt;We'll just need to clean up the code a bit to make examination easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  SVG Elements
&lt;/h2&gt;

&lt;p&gt;As always, MDN is an incredible resource for information. The &lt;a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element"&gt;documentation on SVGs&lt;/a&gt; is immense, and I encourage you to dig deeper on your own.&lt;/p&gt;

&lt;p&gt;As we examine our code, we can see that is made up of several elements: &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;rect&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;polygon&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;circle&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;g&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first thing we'll do is get things a little more readable so we can decipher what's what and manipulate certain elements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clean Up
&lt;/h3&gt;

&lt;p&gt;In VSCode, &lt;code&gt;SHIFT + CMD + L&lt;/code&gt; will select all occurrences of the highlighted text, so I will select all the beginning of all the various elements, backspace to the start of them, and hit &lt;code&gt;RETURN&lt;/code&gt; to get all of them at the start of a line:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7gg6Gx83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662488458518/uRKR116ns.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7gg6Gx83--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662488458518/uRKR116ns.gif" alt="svg vscode.gif" width="480" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can begin to see what's going on a little easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experimentation
&lt;/h2&gt;

&lt;p&gt;In simple SVGs, you may have only one or two elements. This makes it simple to label and apply styling to. However, in our example, there are many elements and nothing to let us know what is what.&lt;/p&gt;

&lt;p&gt;By poking around with some styling, we can figure out what is what. The shapes themselves will tell us a little, but by applying a fill color to different things, we can then label everything in our SVG code.&lt;/p&gt;

&lt;p&gt;I'm using the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer"&gt;Live Server extension&lt;/a&gt; in VSCode, so I'm able to see the effects of changes instantly by opening the file while I'm making the styling edits.&lt;/p&gt;

&lt;p&gt;You can see in the screenshot below that the first path in the .svg is the path for the woman's right hand in the illustration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l8dR3-eU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662489180434/KiJUt-zpg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l8dR3-eU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662489180434/KiJUt-zpg.png" alt="Screen Shot 2022-09-06 at 2.31.17 PM.png" width="880" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SVG Elements
&lt;/h3&gt;

&lt;p&gt;We start out with the &lt;code&gt;&amp;lt;svg&amp;gt;&lt;/code&gt; element itself. This is a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Element/svg"&gt;container element&lt;/a&gt; and sets up the coordinate system. Think of it as our canvas where the rest of the graphics will live.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg xmlns="http://www.w3.org/2000/svg" width="598.25299" 
height="581.49793" 
viewBox="0 0 598.25299 581.49793" 
xmlns:xlink="http://www.w3.org/1999/xlink"&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Then, we go straight into the paths, polygons, rectangles and circles. All of the following code blocks are individual pieces of the illustration. I've made note of which piece is which in the comments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- right hand --&amp;gt;
&amp;lt;path id="uuid-207e1ec5-f316-41d7-bdda-8b0dd0a2bd60-198" 
d="M317.37575,441.36116c-8.89671,1.36364-15.40463,7.05944-14.53588,12.72122,.86876,5.66178,8.78434,9.14461,17.68405,7.7793,3.56255-.49662,6.95436-1.83918,9.89166-3.91538l37.62277-6.25382-2.511-14.87153-37.53792,5.31177c-3.42552-1.10114-7.06497-1.36572-10.61369-.77157Z" 
fill="#ffb6b6"/&amp;gt;


&amp;lt;!-- right sleeve --&amp;gt;
&amp;lt;polygon points="479.50058 395.00508 464.91227 425.96119 391.57489 450.64909 330.71947 453.89578 329.19546 439.2792 395.14843 425.48908 462.82463 393.50814 479.50058 395.00508" 
fill="#e6e6e6"/&amp;gt;


&amp;lt;!-- middle flower stem --&amp;gt;
&amp;lt;rect x="313.0222" 
y="330.24459" 
width="2.0005" 
height="173.77644" 
transform="translate(-9.1013 7.00975) rotate(-1.26066)"/&amp;gt;


&amp;lt;!-- flower center on middle flower --&amp;gt;
&amp;lt;circle class="flower" 
cx="314.6595" 
cy="306.0531" 
r="21.23894" 
fill="#3f3d56"/&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;In this manner, you will be able to go through and label any part of the illustration that you need to use in your animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full Example Animation
&lt;/h2&gt;

&lt;p&gt;Now, look at the full example below. I've made the graphic quite lively to show how you can make an illustration come to life with some basic css.&lt;/p&gt;

&lt;p&gt;All of this can be achieved by writing the css in a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; section directly within the .svg file itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Writing the css into the .svg file itself was actually very important for our GitHub README use case. This is what allows us to have the animated .svg rendered in our markdown file on GitHub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Piece by Piece
&lt;/h2&gt;

&lt;p&gt;There is not a lot of complicated things going on here, tbh. The most difficult part in this example was simply going through each of the .svg elements to label all the parts.&lt;/p&gt;

&lt;p&gt;From there, I built a spinning animation for the flower petals. One clockwise and one counterclockwise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.spin{
    transform-box:fill-box;
    transform-origin:center;
    animation:spin 7s infinite linear;
}
.spin-counter{
    transform-box:fill-box;
    transform-origin:center;
    animation:spin-counter 7s infinite linear;
}
@keyframes spin{
    0%{transform:rotate(0deg)}
    100%{transform:rotate(359deg)}
}
@keyframes spin-counter{
    0%{transform:rotate(0deg)}
    100%{transform:rotate(-359deg)}
}

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

&lt;/div&gt;



&lt;p&gt;Then I found the code for those petals and added &lt;code&gt;class="spin"&lt;/code&gt;. They were the most lengthy elements in this file.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2yCMtjzb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662512819701/SMDTG0TWL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2yCMtjzb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662512819701/SMDTG0TWL.png" alt="Screen Shot 2022-09-06 at 9.05.19 PM.png" width="880" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, I animated the flower stems and leaves to flash and the center of the flowers to scale up and down while changing colors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.flash{
    animation:flash .2s infinite steps(5,jump-none);
}
.flower{
    transform-box:fill-box;
    transform-origin:center;
    animation:flower 4s infinite ease-in-out;
}
@keyframes flash{
    0%{fill:yellow}
    20%{fill:pink}
    40%{fill:blue}
    60%{fill:orange}
    80%{fill:red}
    100%{fill:purple}
}
@keyframes flower{
    0%{
        transform:scale(1.0);
        fill:#3f3d56;
    }
    50%{
        transform:scale(1.3);
        fill: yellow;
    }
    100%{
        transform:scale(1.0);
        fill: #3f3d56;
    }
}

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

&lt;/div&gt;



&lt;p&gt;But, we're not limited to harsh, obvious animations. I tried to mimic a slight breeze through the woman's hair by adding a very slight rotation with &lt;code&gt;ease-in-out&lt;/code&gt; to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.hair{
    transform-box:fill-box;
    transform-origin:top-left;
    animation:hair 3s infinite ease-in-out;
}
@keyframes hair{
    0%{transform:rotate(0deg)}
    50%{transform:rotate(-2deg)}
    100%{transform:rotate(0deg)}
}

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

&lt;/div&gt;



&lt;p&gt;And similarly, for her foot...a little tapping by doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.tap{
    transform-box:fill-box;
    transform-origin:right;
    animation:tap 1.3s infinite cubic-bezier(.2,1.4,.7,2);
}
@keyframes tap{
    0%{transform:rotate(-2deg)}
    50%{transform:rotate(-5deg)}
    100%{transform:rotate(-2deg)}
}

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Full Code
&lt;/h2&gt;

&lt;p&gt;There are other ways to put an .svg on a website. For instance, you can insert the element directly into the html and then move all your styling to a separate css file.&lt;/p&gt;

&lt;p&gt;This makes things cleaner, but we focused on having everything together for our project today. This way, you can simply upload the .svg to your GitHub project and then throw it into your README like you would any other picture&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![svg-animation](&amp;lt;path-to-svg&amp;gt;)

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

&lt;/div&gt;



&lt;p&gt;Here is the full code file with everything within the .svg:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;svg xmlns="http://www.w3.org/2000/svg" width="598.25299" height="581.49793" viewBox="0 0 598.25299 581.49793" xmlns:xlink="http://www.w3.org/1999/xlink"&amp;gt;

&amp;lt;style&amp;gt;
    .flash{
        animation:flash .2s infinite steps(5,jump-none);
    }
    .spin{
        transform-box:fill-box;
        transform-origin:center;
        animation:spin 7s infinite linear;
    }
    .spin-counter{
        transform-box:fill-box;
        transform-origin:center;
        animation:spin-counter 7s infinite linear;
    }
    .flower{
        transform-box:fill-box;
        transform-origin:center;
        animation:flower 4s infinite ease-in-out;
    }
    .hair{
        transform-box:fill-box;
        transform-origin:top-left;
        animation:hair 3s infinite ease-in-out;
    }
    .tap{
        transform-box:fill-box;
        transform-origin:right;
        animation:tap 1.3s infinite cubic-bezier(.2,1.4,.7,2);
    }
    @keyframes flash{
        0%{fill:yellow}
        20%{fill:pink}
        40%{fill:blue}
        60%{fill:orange}
        80%{fill:red}
        100%{fill:purple}
    }
    @keyframes spin{
        0%{transform:rotate(0deg)}
        100%{transform:rotate(359deg)}
    }
    @keyframes spin-counter{
        0%{transform:rotate(0deg)}
        100%{transform:rotate(-359deg)}
    }
    @keyframes flower{
        0%{
            transform:scale(1.0);
            fill:#3f3d56;
        }
        50%{
            transform:scale(1.3);
            fill: yellow;
        }
        100%{
            transform:scale(1.0);
            fill: #3f3d56;
        }
    }
    @keyframes hair{
        0%{transform:rotate(0deg)}
        50%{transform:rotate(-2deg)}
        100%{transform:rotate(0deg)}
    }
    @keyframes tap{
        0%{transform:rotate(-2deg)}
        50%{transform:rotate(-5deg)}
        100%{transform:rotate(-2deg)}
    }
&amp;lt;/style&amp;gt;

&amp;lt;!-- right hand --&amp;gt;
&amp;lt;path id="uuid-207e1ec5-f316-41d7-bdda-8b0dd0a2bd60-198" d="M317.37575,441.36116c-8.89671,1.36364-15.40463,7.05944-14.53588,12.72122,.86876,5.66178,8.78434,9.14461,17.68405,7.7793,3.56255-.49662,6.95436-1.83918,9.89166-3.91538l37.62277-6.25382-2.511-14.87153-37.53792,5.31177c-3.42552-1.10114-7.06497-1.36572-10.61369-.77157Z" fill="#ffb6b6"/&amp;gt;

&amp;lt;!-- right sleeve --&amp;gt;
&amp;lt;polygon points="479.50058 395.00508 464.91227 425.96119 391.57489 450.64909 330.71947 453.89578 329.19546 439.2792 395.14843 425.48908 462.82463 393.50814 479.50058 395.00508" fill="#e6e6e6"/&amp;gt;

&amp;lt;!-- middle flower --&amp;gt;
&amp;lt;g class="flash"&amp;gt;

&amp;lt;!-- middle flower stem --&amp;gt;
&amp;lt;rect x="313.0222" y="330.24459" width="2.0005" height="173.77644" transform="translate(-9.1013 7.00975) rotate(-1.26066)"/&amp;gt;

&amp;lt;path d="M313.1538,407.16797c-.18115-.61621-4.32715-15.26855,4.65088-29.6709l1.69727,1.05859c-8.48975,13.61816-4.47021,27.90723-4.42871,28.05078l-1.91943,.56152Z" /&amp;gt;

&amp;lt;path d="M318.50651,378.60915s-2.72937-18.65506,22.41425-23.77492c5.23825-1.06664,10.16278-1.79561,14.67694-2.28132,5.32851-.57333,7.40701,6.72083,2.59337,9.0768-6.97123,3.41197-13.52893,7.71085-16.94694,12.80161-9.42681,14.04022-22.73764,4.17784-22.73764,4.17784Z"/&amp;gt;

&amp;lt;path d="M315.74023,461.11523l-1.91943-.56152c.0415-.14355,4.06104-14.43262-4.42871-28.05078l1.69727-1.05859c8.97803,14.40234,4.83203,29.05469,4.65088,29.6709Z"/&amp;gt;

&amp;lt;path d="M310.3877,432.55605s2.72937-18.65506-22.41425-23.77492c-5.23825-1.06664-10.16278-1.79561-14.67694-2.28132-5.32851-.57333-7.40701,6.72083-2.59337,9.0768,6.97123,3.41197,13.52893,7.71085,16.94694,12.80161,9.42681,14.04022,22.73764,4.17784,22.73764,4.17784Z"/&amp;gt;

&amp;lt;!-- flower petals on middle --&amp;gt;
&amp;lt;path class="spin" d="M345.38308,306.12152c5.06107-1.33443,9.79382-3.65962,9.63686-5.95984-.18646-2.73252-7.21292-4.56342-13.27465-4.84202,4.57215-3.57699,8.77317-8.52168,7.48846-10.75799-1.1811-2.05594-6.67554-1.25956-11.74486,.5512,2.99995-4.28898,5.10906-9.12193,3.50282-10.77588-2.00087-2.06027-9.10218,1.49577-13.9485,5.42651,.94344-6.1237,.46649-13.8534-2.2801-14.55274-2.29776-.58506-5.55432,3.91139-7.78706,8.80952-.98679-5.1402-2.98444-10.02026-5.29-10.02026-3.28439,0-5.9469,9.9025-5.9469,16.35398,0,.36468,.00967,.70797,.02632,1.03597-.32965-.38218-.70745-.78145-1.1383-1.19988-4.62815-4.49466-13.58691-9.48355-15.8751-7.12744-1.60625,1.65395,.50287,6.4869,3.50282,10.77588-5.06932-1.81075-10.56375-2.60714-11.74486-.5512-1.58701,2.76251,5.19664,9.65864,10.71068,13.00291-.33147-.03993-.67971-.07355-1.05033-.09883-6.4365-.43917-16.49728,1.54306-16.72087,4.81983-.15696,2.30022,4.57578,4.62541,9.63686,5.95984-5.03878,1.89411-9.74642,4.83707-9.31913,7.16931,.51858,2.8306,8.42853,3.82148,14.64789,3.24148-4.64633,4.4579-9.68446,12.44383-7.5819,14.78429,1.54078,1.71511,6.50608-.06012,10.98934-2.76114-2.15166,4.93429-3.32024,10.36176-1.34945,11.68009,2.60449,1.74223,9.74743-4.32147,13.51348-9.53904-.38374,6.38314,1.14359,15.15229,4.17408,15.49836,2.29068,.2616,4.82911-4.36033,6.39273-9.35537,1.66258,5.11982,4.38795,9.95671,6.73724,9.63613,3.05486-.41687,4.38668-9.40546,3.81684-15.79319,3.88469,5.00287,10.42248,10.35339,12.88884,8.70356,1.9708-1.31833,.80222-6.7458-1.34945-11.68009,4.48325,2.70102,9.44855,4.47625,10.98934,2.76114,2.10256-2.34046-2.93557-10.3264-7.5819-14.78429,6.21936,.58,14.12931-.41088,14.64789-3.24148,.42729-2.33224-4.28035-5.2752-9.31913-7.16931Zm-27.25118,18.05535c-1.30094,.17752-2.49049,.43103-3.39512,1.07838-.96104-.95404-2.3647-1.2446-3.92539-1.42282-1.74749-.19956-3.33551-.21882-4.54651,.78962-.44311-1.23164-1.53269-2.1066-2.80192-2.95564-1.09135-.73004-2.14972-1.3293-3.2561-1.44485-.08644-1.35139-.94416-2.4999-1.99392-3.66846-.66934-.7451-1.33902-1.41125-2.08213-1.85683,1.07214-1.3054,.94852-2.9553,.61679-4.76601-.2366-1.2915-.54407-2.46827-1.23197-3.34246,.90927-1.00353,1.13558-2.41899,1.24252-3.98616,.11675-1.7112,.06824-3.26269-.91948-4.41797,2.55254,.32468,3.78435-1.26552,4.92929-3.25854,.65405-1.13848,1.17989-2.23522,1.21986-3.3469,1.34239-.17824,2.42983-1.11217,3.52418-2.23903,.93486-.96262,1.73007-1.91578,2.02877-3.01283,1.0712,.90022,2.53281,1.03646,4.14527,1.03646,1.57083,0,2.99839-.12942,4.06148-.96827,.82534,.7458,1.97845,1.13265,3.25084,1.45663,1.21463,.30928,2.36117,.51612,3.4036,.30795,.38052,.86931,1.05707,1.65872,1.82981,2.4544,1.09435,1.12687,2.18179,2.06079,3.52418,2.23903,.03998,1.11167,.56582,2.20841,1.21986,3.3469,.76989,1.34014,1.57848,2.49889,2.80151,3.01589-.1428,.77844-.12753,1.63528-.06603,2.53672,.10695,1.56718,.33326,2.98266,1.24252,3.98616-.68791,.87419-.99537,2.05096-1.23197,3.34246-.33173,1.8107-.45535,3.46061,.61679,4.76601-.7431,.44557-1.41278,1.11173-2.08213,1.85683-1.04976,1.16856-1.90749,2.31707-1.99392,3.66846-1.10638,.11555-2.16475,.71482-3.2561,1.44485-1.49056,.99708-2.73218,2.03061-2.97065,3.63515-1.11854-.54256-2.45752-.47248-3.90393-.27513Z" fill="#ff6863"/&amp;gt;

&amp;lt;!-- flower center on middle flower --&amp;gt;
&amp;lt;circle class="flower" cx="314.6595" cy="306.0531" r="21.23894" fill="#3f3d56"/&amp;gt;&amp;lt;/g&amp;gt;

&amp;lt;!-- ground --&amp;gt;
&amp;lt;path d="M58.50921,563.59732c0,.66003,.53003,1.19,1.19006,1.19H581.98925c.65997,0,1.19-.52997,1.19-1.19,0-.65997-.53003-1.19-1.19-1.19H59.69927c-.66003,0-1.19006,.53003-1.19006,1.19Z" fill="#3f3d56"/&amp;gt;

&amp;lt;!-- right leg skin --&amp;gt;
&amp;lt;polygon points="344.23894 512.546 331.14162 545.67451 314.19215 534.11806 324.20774 499.44869 344.23894 512.546" fill="#ffb6b6"/&amp;gt;

&amp;lt;!-- left leg skin --&amp;gt;
&amp;lt;polygon points="289.53838 500.21912 254.86901 533.34763 268.73676 547.9858 304.17655 520.25031 289.53838 500.21912" fill="#ffb6b6"/&amp;gt;

&amp;lt;!-- back of hair --&amp;gt;
&amp;lt;polygon points="485.99813 392.35886 485.61291 389.66236 476.75296 372.32767 447.47661 380.03198 452.86962 403.91532 485.99813 392.35886" fill="#ffb6b6"/&amp;gt;

&amp;lt;!-- skirt right leg--&amp;gt;
&amp;lt;path d="M473.67124,507.92342l.90036,11.57162s3.72223,48.52195-26.32456,52.3741c-30.04679,3.85215-43.1441,7.7043-60.864-22.34248l-27.73549-49.30754-16.20027,19.27593-21.55082-16.96463s15.40861-60.09357,27.73549-62.40486c1.54086-.28891,3.08172-.43337,4.59851-.46497,10.20508-.21261,19.82492,4.77897,25.93085,12.95861l34.95723,46.82949,12.7121-5.77823,45.84061,14.25296Z" fill="#2f2e41"/&amp;gt;

&amp;lt;!-- right foot --&amp;gt;
&amp;lt;path d="M307.25828,544.13365l6.93387-13.09732,20.03119,13.86775s4.62258,16.94947-2.31129,19.26076c-6.93387,2.31129-26.19463-.77043-26.19463-.77043,0,0-35.4398,7.7043-36.21023,.77043s16.17904-8.47473,16.17904-8.47473l21.57205-11.55646Z" fill="#2f2e41"/&amp;gt;

&amp;lt;!-- skirt left leg --&amp;gt;
&amp;lt;path d="M382.76045,534.88849l-53.54491-33.73818-27.35028,24.49301-18.49033-21.57205s33.89894-50.07798,43.91453-52.38927,26.19463-3.85215,26.19463-3.85215l49.30754,45.45539-20.03119,41.60324Z" fill="#2f2e41"/&amp;gt;

&amp;lt;!-- left foot --&amp;gt;
&amp;lt;path class="tap" d="M254.09858,530.2659l17.7199,19.26076-2.33678,1.99887s-4.59709,20.02209-15.38312,13.24898c-10.78603-6.77311-11.55646-8.31398-11.55646-8.31398,0,0-30.81722,6.93387-33.89894-5.39301-3.08172-12.32689,5.39301-10.0156,5.39301-10.0156l7.6952,4.62258,32.36718-15.40861Z" fill="#2f2e41"/&amp;gt;

&amp;lt;!-- face --&amp;gt;
&amp;lt;circle cx="456.72177" cy="363.85294" r="24.65377" fill="#ffb6b6"/&amp;gt;

&amp;lt;!-- chest --&amp;gt;
&amp;lt;path d="M450.94354,398.90752l35.4398-10.78603s13.86775,32.35808,11.55646,46.99625c-2.31129,14.63818-23.3682,84.37729-23.3682,84.37729l-46.74096-25.82458s-.77043-15.40861-3.08172-22.34248-9.63038-28.12071,6.54866-45.84061c16.17904-17.7199,19.64597-26.57985,19.64597-26.57985Z" fill="#e6e6e6"/&amp;gt;

&amp;lt;!-- big flower --&amp;gt;
&amp;lt;g class="flash"&amp;gt;

&amp;lt;rect x="107.34447" y="155.95049" width="1.99952" height="409.09901" transform="translate(-7.90461 2.47077) rotate(-1.26058)"/&amp;gt;

&amp;lt;path d="M107.59862,336.66016c-.10254-.34961-10.01758-35.3584,10.79932-68.75146l1.69727,1.05811c-20.34814,32.6416-10.67773,66.78906-10.57764,67.13086l-1.91895,.5625Z"/&amp;gt;

&amp;lt;path d="M118.90075,269.80903s-6.42539-43.91713,52.76688-55.97014c12.33172-2.51104,23.92488-4.22717,34.55197-5.3706,12.54419-1.34971,17.43734,15.82195,6.10524,21.36829-16.41144,8.03236-31.84935,18.15263-39.89591,30.13712-22.19228,33.05303-53.52818,9.83533-53.52818,9.83533Z"/&amp;gt;

&amp;lt;path d="M111.08984,463.66016l-1.91895-.5625c.09961-.34082,9.75146-34.52051-10.57764-67.13086l1.69727-1.05859c20.81689,33.39355,10.90186,68.40234,10.79932,68.75195Z"/&amp;gt;

&amp;lt;path d="M99.78771,396.80903s6.42539-43.91713-52.76688-55.97014c-12.33172-2.51104-23.92488-4.22717-34.55197-5.3706-12.54419-1.34971-17.43734,15.82195-6.10524,21.36829,16.41144,8.03236,31.84935,18.15263,39.89591,30.13712,22.19228,33.05303,53.52818,9.83533,53.52818,9.83533Z"/&amp;gt;

&amp;lt;!-- big flower petals --&amp;gt;
&amp;lt;path class="spin-counter" d="M182.17266,99.16107c11.91461-3.14148,23.05627-8.61536,22.68677-14.03046-.43896-6.4328-16.98041-10.74304-31.25073-11.39893,10.76361-8.42084,20.6535-20.06146,17.62909-25.32611-2.78052-4.84003-15.71533-2.96521-27.64935,1.29761,7.06238-10.09698,12.02759-21.47455,8.24622-25.36823-4.71039-4.85022-21.42804,3.5213-32.8371,12.7749,2.22101-14.4162,1.09821-32.61322-5.36774-34.25958-5.4093-1.37732-13.07581,9.20807-18.33203,20.73907-2.32306-12.10089-7.02588-23.58936-12.45355-23.58936-7.73199,0-14,23.31213-14,38.5,0,.85852,.02277,1.66669,.06195,2.43884-.77606-.89972-1.66547-1.83966-2.67975-2.82471-10.89545-10.58118-31.98584-22.32587-37.37262-16.77917-3.78137,3.89368,1.18384,15.27124,8.24622,25.36823-11.93402-4.26282-24.86884-6.13763-27.64935-1.29761-3.73608,6.50342,12.23376,22.73804,25.21472,30.61102-.78033-.09399-1.60016-.17316-2.47266-.23267-15.15259-1.03387-38.83734,3.63263-39.36371,11.34668-.36951,5.4151,10.77216,10.88898,22.68677,14.03046-11.86212,4.45905-22.9447,11.38727-21.93878,16.87775,1.22083,6.6637,19.84216,8.9964,34.48358,7.63098-10.93823,10.49463-22.79883,29.29486-17.84906,34.80469,3.62726,4.03766,15.31641-.14154,25.87073-6.50018-5.06537,11.61615-7.81641,24.39331-3.17682,27.49689,6.13141,4.1015,22.94708-10.17346,31.81299-22.45648-.90338,15.02698,2.6922,35.67102,9.82648,36.48572,5.39264,.61584,11.36853-10.26495,15.04956-22.02411,3.914,12.05292,10.32996,23.43976,15.8606,22.68506,7.19165-.98138,10.32697-22.14203,8.98547-37.17981,9.1452,11.77759,24.53625,24.3736,30.34247,20.48962,4.63959-3.10358,1.88855-15.88074-3.17682-27.49689,10.55432,6.35864,22.24347,10.53784,25.87073,6.50018,4.94977-5.50983-6.91083-24.31006-17.84906-34.80469,14.64142,1.36542,33.26276-.96729,34.48358-7.63098,1.00592-5.49048-10.07666-12.4187-21.93878-16.87775Zm-64.15381,42.50531c-3.06262,.41791-5.86304,1.01471-7.99268,2.5387-2.26245-2.24597-5.56689-2.92999-9.24103-3.34955-4.11389-.46979-7.85236-.51514-10.70325,1.85889-1.04315-2.89948-3.60822-4.95929-6.59619-6.95807-2.56921-1.71863-5.06079-3.12939-7.66541-3.40143-.20349-3.1814-2.22272-5.88519-4.69403-8.63617-1.57574-1.75409-3.15228-3.32233-4.90167-4.37128,2.52399-3.07312,2.23297-6.95728,1.45203-11.21997-.55701-3.04041-1.28082-5.81073-2.90027-7.86871,2.14056-2.36249,2.67334-5.6947,2.92511-9.38409,.27484-4.02844,.16064-7.68091-2.16461-10.40063,6.00909,.76434,8.909-2.97925,11.60437-7.67114,1.53973-2.68018,2.77765-5.26208,2.87177-7.87915,3.16022-.41962,5.72021-2.61823,8.29651-5.27106,2.20081-2.26617,4.07288-4.51007,4.77606-7.09271,2.52179,2.11926,5.96265,2.44,9.75867,2.44,3.698,0,7.05872-.30469,9.5614-2.27948,1.94299,1.75574,4.65759,2.66644,7.65302,3.42914,2.85944,.72809,5.55859,1.21503,8.01263,.72498,.89581,2.04651,2.48853,3.90491,4.30768,5.77808,2.57629,2.65283,5.13629,4.85144,8.29651,5.27106,.09412,2.61707,1.33203,5.19897,2.87177,7.87915,1.81244,3.15491,3.716,5.88281,6.59521,7.09991-.33618,1.83258-.30023,3.84973-.15546,5.97186,.25177,3.68939,.78455,7.02167,2.92511,9.38409-1.61945,2.05798-2.34326,4.82831-2.90027,7.86871-.78094,4.2627-1.07196,8.14685,1.45203,11.21997-1.74939,1.04895-3.32593,2.61719-4.90167,4.37128-2.47131,2.75098-4.49054,5.45477-4.69403,8.63617-2.60461,.27203-5.09619,1.6828-7.66541,3.40143-3.50903,2.34729-6.43201,4.7804-6.99341,8.55774-2.63324-1.27728-5.7854-1.1123-9.19049-.64771Z" fill="#ff6863"/&amp;gt;

&amp;lt;circle class="flower" cx="109.84423" cy="99" r="50" fill="#3f3d56"/&amp;gt;&amp;lt;/g&amp;gt;

&amp;lt;!-- small flower --&amp;gt;
&amp;lt;g class="flash"&amp;gt;

&amp;lt;rect x="570.88768" y="466.26258" width="2.00002" height="97.74925" transform="translate(-11.19664 12.70857) rotate(-1.26084)"/&amp;gt;

&amp;lt;path d="M570.979,509.65527c-.104-.35449-2.48779-8.7793,2.66504-17.04492l1.69727,1.05859c-4.66504,7.48242-2.46533,15.34668-2.44287,15.4248l-1.91943,.56152Z"/&amp;gt;

&amp;lt;path d="M574.40991,493.46765s-1.53527-10.49347,12.60802-13.3734c2.94652-.59998,5.71656-1.01003,8.25578-1.28324,2.99728-.3225,4.16644,3.78047,1.45877,5.1057-3.92132,1.91924-7.61002,4.33735-9.53265,7.2009-5.30258,7.89763-12.78992,2.35003-12.78992,2.35003Z"/&amp;gt;

&amp;lt;path d="M573.27392,540l-1.91943-.56152c.02246-.07812,2.22217-7.94141-2.44287-15.42383l1.69727-1.05859c5.15283,8.26562,2.76904,16.68945,2.66504,17.04395Z"/&amp;gt;

&amp;lt;path d="M569.84308,523.81278s1.53527-10.49347-12.60802-13.3734c-2.94652-.59998-5.71656-1.01003-8.25578-1.28324-2.99728-.3225-4.16644,3.78047-1.45877,5.1057,3.92132,1.91924,7.61002,4.33735,9.53265,7.2009,5.30258,7.89763,12.78992,2.35003,12.78992,2.35003Z"/&amp;gt;

&amp;lt;path class="spin-counter" d="M589.52798,452.69335c2.84685-.75062,5.50902-2.05854,5.42073-3.35241-.10489-1.53704-4.05727-2.56692-7.46699-2.72364,2.57184-2.01206,4.93491-4.79345,4.21226-6.05137-.66437-1.15647-3.75499-.7085-6.60648,.31005,1.68747-2.41255,2.87385-5.13109,1.97033-6.06143-1.12549-1.1589-5.11997,.84137-7.84603,3.05241,.53068-3.44458,.2624-7.79254-1.28256-8.18592-1.29249-.32909-3.12431,2.20016-4.38022,4.95535-.55507-2.89136-1.67875-5.63639-2.97563-5.63639-1.84747,0-3.34513,5.57016-3.34513,9.19912,0,.20513,.00544,.39823,.0148,.58273-.18543-.21498-.39794-.43956-.64029-.67493-2.60334-2.52825-7.64263-5.3345-8.92974-4.00918-.90351,.93035,.28286,3.64888,1.97033,6.06143-2.85149-1.01855-5.94211-1.46651-6.60648-.31005-.89269,1.55391,2.92311,5.43298,6.02476,7.31414-.18645-.02246-.38234-.04137-.59081-.05559-3.62053-.24703-9.27972,.86797-9.40549,2.71115-.08829,1.29387,2.57388,2.60179,5.42073,3.35241-2.83431,1.06544-5.48236,2.72085-5.24201,4.03274,.2917,1.59221,4.74105,2.14958,8.23944,1.82333-2.61356,2.50757-5.44751,6.99966-4.26482,8.31616,.86669,.96475,3.65967-.03382,6.1815-1.55314-1.21031,2.77554-1.86764,5.82849-.75906,6.57005,1.46503,.98,5.48293-2.43083,7.60133-5.36571-.21585,3.59052,.64327,8.52316,2.34792,8.71783,1.28851,.14715,2.71637-2.45269,3.59591-5.2624,.9352,2.8799,2.46822,5.60065,3.7897,5.42032,1.71836-.23449,2.4675-5.29057,2.14697-8.88367,2.18514,2.81411,5.86264,5.82378,7.24997,4.89575,1.10857-.74156,.45125-3.79451-.75906-6.57005,2.52183,1.51932,5.31481,2.51789,6.1815,1.55314,1.18269-1.31651-1.65126-5.8086-4.26482-8.31616,3.49839,.32625,7.94774-.23112,8.23944-1.82333,.24035-1.31188-2.4077-2.9673-5.24201-4.03274Zm-15.32879,10.15614c-.73178,.09985-1.4009,.24245-1.90975,.60659-.54059-.53665-1.33014-.70009-2.20803-.80033-.98297-.11225-1.87623-.12309-2.55741,.44416-.24925-.69279-.86214-1.18496-1.57608-1.66255-.61388-.41065-1.20922-.74773-1.83156-.81273-.04862-.76016-.53109-1.4062-1.12158-2.06351-.37651-.41912-.7532-.79383-1.1712-1.04446,.60308-.73429,.53354-1.66236,.34694-2.68088-.13309-.72647-.30604-1.3884-.69298-1.88014,.51146-.56449,.63876-1.36068,.69892-2.24222,.06567-.96255,.03838-1.83526-.51721-2.48511,1.4358,.18263,2.1287-.71186,2.77273-1.83293,.3679-.6404,.66369-1.25731,.68617-1.88263,.7551-.10026,1.36678-.62559,1.98235-1.25946,.52586-.54148,.97317-1.07763,1.14118-1.69472,.60255,.50637,1.4247,.58301,2.33172,.58301,.88359,0,1.6866-.0728,2.28458-.54465,.46426,.41951,1.11288,.63711,1.8286,.81935,.68323,.17397,1.32816,.29032,1.91452,.17322,.21404,.48899,.5946,.93303,1.02927,1.3806,.61557,.63386,1.22726,1.15919,1.98235,1.25946,.02249,.62532,.31827,1.24223,.68617,1.88263,.43306,.75383,.88789,1.40563,1.57585,1.69644-.08033,.43787-.07174,.91985-.03714,1.42691,.06016,.88154,.18746,1.67774,.69892,2.24222-.38695,.49173-.55989,1.15367-.69298,1.88014-.1866,1.01852-.25613,1.94659,.34694,2.68088-.418,.25063-.79469,.62535-1.1712,1.04446-.59049,.65731-1.07296,1.30335-1.12158,2.06351-.62234,.065-1.21767,.40209-1.83156,.81273-.83844,.56086-1.53685,1.14222-1.67099,2.04477-.62918-.30519-1.38235-.26577-2.19596-.15476Z" fill="#ff6863"/&amp;gt;

&amp;lt;circle class="flower" cx="572.24597" cy="452.65487" r="11.9469" fill="#3f3d56"/&amp;gt;&amp;lt;/g&amp;gt;

&amp;lt;g&amp;gt;

&amp;lt;path id="uuid-fcc96ddd-8a9b-4008-9e3e-ba4d42e134c9-199" d="M372.9429,560.6837c-5.76763,6.90981-6.87749,15.48672-2.47944,19.15655,4.39805,3.66983,12.6373,1.04277,18.40606-5.87027,2.34226-2.72987,3.99672-5.98097,4.82492-9.48131l24.06795-29.58576-11.72388-9.48778-24.62774,28.82333c-3.29686,1.44132-6.20051,3.65139-8.46786,6.44523Z" fill="#ffb6b6"/&amp;gt;

&amp;lt;polygon points="478.12744 414.451 486.50417 447.63127 445.50568 513.25891 403.65242 555.32266 390.08694 544.06849 432.29671 491.54901 464.29146 423.87933 478.12744 414.451" fill="#e6e6e6"/&amp;gt;&amp;lt;/g&amp;gt;

&amp;lt;!-- hair --&amp;gt;
&amp;lt;path class="hair" d="M433.99408,359.61557c6.32276-.01514,6.68173,.02699,7.7043,0,7.84218-.20681,9.89286-3.2921,13.86775-3.08172,7.09451,.37553-2.26916,35.94511-6.16344,52.38927-3.81924,16.12741,9.08811,30.5789,10.0156,31.58765,13.10117,14.24835,36.11364,16.85373,40.06238,10.78603,3.19618-4.91121-8.13109-12.37871-5.39301-23.11291,2.67657-10.49307,15.03562-9.3757,18.49033-19.26076,3.61798-10.35219-8.54038-15.57338-16.17904-40.83281-4.3869-14.50661-3.61083-17.20961-7.7043-26.19463-10.94177-24.01645-64.57358-13.7909-58.55271,8.47473,1.16467,4.307-1.93482,9.25899,3.85215,9.24516Z" fill="#2f2e41"/&amp;gt;&amp;lt;/svg&amp;gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Thanks for Reading! 🙏
&lt;/h2&gt;

&lt;p&gt;I love tweaking illustrations like this and making them animated. A little animation goes a long way.&lt;/p&gt;

&lt;p&gt;I hope this has been helpful and fun for you to learn about as well!&lt;/p&gt;

&lt;p&gt;Come say hey 👋 and let me know if you add an animated .svg to your GitHub; you can find me on Twitter: &lt;a href="https://twitter.com/EamonnCottrell"&gt;https://twitter.com/EamonnCottrell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>svg</category>
      <category>animation</category>
      <category>github</category>
    </item>
    <item>
      <title>Build an Open Source CSS Library</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Thu, 01 Sep 2022 18:52:20 +0000</pubDate>
      <link>https://forem.com/sieis/build-an-open-source-css-library-16og</link>
      <guid>https://forem.com/sieis/build-an-open-source-css-library-16og</guid>
      <description>&lt;p&gt;Meet &lt;a href="https://github.com/sieis/unmove"&gt;unMove&lt;/a&gt;: my latest project where I built my first open-source library using vanilla CSS, &lt;a href="https://github.com/features/issues"&gt;GitHub Projects&lt;/a&gt;, Issues, &lt;a href="https://blog.eamonncottrell.com/version-releases-and-git-tags-for-beginners"&gt;tags&lt;/a&gt; and &lt;a href="https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository"&gt;releases&lt;/a&gt;, &lt;a href="https://semver.org/"&gt;semantic versioning&lt;/a&gt; and &lt;a href="https://www.jsdelivr.com/"&gt;jsDelivr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NYZy8ZHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661886510165/WI4BjANVg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NYZy8ZHr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661886510165/WI4BjANVg.png" alt="image.png" width="880" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I set out building this to better learn good project management and the ins &amp;amp; outs of maintaining an open source project.&lt;/p&gt;

&lt;p&gt;If you're interested in open source or project management...or just staying organized and on task amidst a never ending stream of ideas, this may be helpful for you!&lt;/p&gt;

&lt;p&gt;I'll walk you through all the pieces of this project in the order that I built them. I've managed to put together a good boilerplate for a project, and look forward to continuing to contribute to its growth!&lt;/p&gt;

&lt;h2&gt;
  
  
  README 📖
&lt;/h2&gt;

&lt;p&gt;Please create a readme file. 🙏&lt;/p&gt;

&lt;p&gt;You probably know it, but don't forget to do this. It is the best place to showcase your project. And GitHub will automatically prompt you to initiate the repository with a readme, so there's no excuse to leave this out.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://readme.so/"&gt;readme.so&lt;/a&gt; by &lt;a href="https://twitter.com/katherinecodes"&gt;Katherine Peterson&lt;/a&gt;: she's made an incredibly easy to use browser-based tool. It lets you to create a clearly sectioned readme using a drag and drop template editor that you can then copy and paste into your repository.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rv9E7hXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661887480616/X5an1_gRO.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rv9E7hXW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661887480616/X5an1_gRO.png" alt="readmeso.png" width="880" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't have enough info at the beginning, make the readme anyway and come back later to fill it in.&lt;/p&gt;

&lt;p&gt;Here's what mine looked like initially; it wasn't perfect, but it had some of the bones of what the project would become. I copied and pasted all of it from readme.so except for the gif. I actually designed that graphic and made it spin on giphy so I could have something animated quickly on the readme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--phooPPON--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661889742463/u0MLIhQw3T.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--phooPPON--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661889742463/u0MLIhQw3T.png" alt="unmove alpha readme.png" width="880" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bonus: In the current, updated &lt;a href="https://github.com/sieis/unmove#readme"&gt;readme&lt;/a&gt; I used an svg and edited the inline &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; to add the rotation animation. It made it a lot cleaner than the giphy version. 😊&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hu6WV7N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890055266/mY8gcS9Tj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hu6WV7N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890055266/mY8gcS9Tj.gif" alt="sacred spinner.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  License 🎓
&lt;/h2&gt;

&lt;p&gt;Another easy addition. You'll be prompted for this too. MIT License is an easy way to make the project completely open sourced. Go &lt;a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository#choosing-the-right-license"&gt;here&lt;/a&gt; to check out how to choose a license for your repository.&lt;/p&gt;

&lt;p&gt;I simply selected MIT for &lt;a href="https://github.com/sieis/unmove/blob/main/LICENSE"&gt;unMove's license&lt;/a&gt; and am good to go without any further edits:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eCnj44Y---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890165536/ztAbvljq_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eCnj44Y---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890165536/ztAbvljq_.png" alt="license.png" width="880" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Descriptions &amp;amp;&amp;amp; Tags
&lt;/h2&gt;

&lt;p&gt;Don't neglect the right sidebar. Here's where you should add a description for your project as well as tags. We'll come back later when we create a new release too 😊.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b_smZGak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890318689/sldhhRhEh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b_smZGak--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890318689/sldhhRhEh.png" alt="tags.png" width="880" height="814"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_x1ZFeWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890360550/Fuj-3Dr5L.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_x1ZFeWz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890360550/Fuj-3Dr5L.png" alt="image.png" width="880" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Issues &amp;amp;&amp;amp; Projects
&lt;/h2&gt;

&lt;p&gt;I've recently been using Trello for &lt;a href="https://www.freecodecamp.org/news/how-to-use-trello-to-manage-freelance-web-projects/"&gt;freelance project management&lt;/a&gt;, and it's been a great solution to keep me and my client on task.&lt;/p&gt;

&lt;p&gt;For this project, though, we'll use the &lt;a href="https://github.com/features/issues"&gt;built in capabilities from GitHub&lt;/a&gt;. 🙌&lt;/p&gt;

&lt;p&gt;GitHub projects allows you to create board or table-view task lists for your project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N2qv_IOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890462075/9SmL7y3m9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N2qv_IOq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890462075/9SmL7y3m9.png" alt="github projects.png" width="880" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what they'll look like when you create some:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFoDQ4Jv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890584977/WqBuWofWk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFoDQ4Jv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890584977/WqBuWofWk.png" alt="image.png" width="880" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you can convert them to Issues so they show up in your Issues Tab for assignment to team members 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eq1P1oAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890652037/XRiy0Gakr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eq1P1oAi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661890652037/XRiy0Gakr.png" alt="convert.png" width="880" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can create an issue from the Issues tab and then assign it to a Project 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S7bcL2tV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971635139/YfqwVlI8U.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S7bcL2tV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971635139/YfqwVlI8U.png" alt="github-issues-edit.png" width="880" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since this project consists of just me, I'm assigning everything to myself, but I'm also going through the small step of adding labels like enhancement, feature, good first issue, etc.&lt;/p&gt;

&lt;p&gt;Even though these first small issues don't require much documentation, I want to get in the habit of creating well documented comments and reviewing the changes before merging into main.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6dXdw4aF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971704531/Sx8NtK3R9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6dXdw4aF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971704531/Sx8NtK3R9.png" alt="commenting issues.png" width="880" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You don't need to have grand plans or incredible features listed here. Simple things are fine. It's important to simply set good habits of documentation, assignments and code review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branches: Main vs Other
&lt;/h2&gt;

&lt;p&gt;So I've known branches were a thing for a while, but I've never bothered using one in any of my personal projects.&lt;/p&gt;

&lt;p&gt;Turns out they're a real good idea (shocker), and a real helpful tool even on small projects. I'll use development branches in this project any time I make changes to the codebase. This way I can check that everything is working without effecting the current (already working) main branch.&lt;/p&gt;

&lt;p&gt;Simply click the branches tab and type the name of the branch you'd like to create.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QKSYM8ca--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971821059/j8XYW-jUb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QKSYM8ca--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661971821059/j8XYW-jUb.jpg" alt="branches.jpg" width="880" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now once you clone the repo to work locally, you can &lt;code&gt;$git checkout develop&lt;/code&gt; to switch to the develop branch. This will allow for changes to be tested without affecting the main branch.&lt;/p&gt;

&lt;p&gt;This is a new habit for me, and I am happy to be leveling up my developing processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pull Requests, Briefly
&lt;/h3&gt;

&lt;p&gt;More often, though, after forking and cloning the repo, you'll want to make your own branch locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$git checkout -b &amp;lt;new-branch-name&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Then, when you push this &lt;code&gt;&amp;lt;new-branch-name&amp;gt;&lt;/code&gt; to your forked repo, you'll have the option to open a pull request against the main branch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch
&lt;/h2&gt;

&lt;p&gt;I suppose we need to make something functional before launching. At the very least, I want this library to have a couple CSS animations available immediately. I've developed these in a develop branch to test out, and once satisfied, I merged those changes to the main branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$git checkout main
$git merge &amp;lt;new-branch-name&amp;gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Versioning &amp;amp;&amp;amp; Git Tags
&lt;/h2&gt;

&lt;p&gt;Here's another thing I've known about for a while, but only actually used once before. I want to launch with an actual version number. In this case, v0.1.0-alpha. In order to do this, we'll need two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Basics-Tagging"&gt;Git Tag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository"&gt;GitHub Release Version&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The release version won't work unless you have a git tag in your codebase, so we'll do that first.&lt;/p&gt;

&lt;p&gt;Git Tags denote spots in your commit history where big things happen...like a version release!&lt;/p&gt;

&lt;p&gt;This will show your commit history:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$git log --pretty=oneline

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

&lt;/div&gt;



&lt;p&gt;This will tag the spot you choose in your history. Replace the hashmarks with the first digits in the checksum from your commit history.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$git tag -a v0.1.0-alpha #####

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

&lt;/div&gt;



&lt;p&gt;Pushing this change works differently too. If you run &lt;code&gt;$git status&lt;/code&gt; everything will look like it's up to date. Instead, run &lt;code&gt;$git push origin v0.1.0-alpha&lt;/code&gt; and we're good to go!&lt;/p&gt;

&lt;p&gt;Now, back in GitHub, we can make a version release by clicking &lt;em&gt;Create a new release&lt;/em&gt; in the righthand side bar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hkUxNWNd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972410340/VvJ4jLrB-.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hkUxNWNd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972410340/VvJ4jLrB-.jpg" alt="release.jpg" width="880" height="1243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Website
&lt;/h2&gt;

&lt;p&gt;Building a website is usually the second order of business...right in line with purchasing a sweet domain. I've focused first on building up a framework of good processes.&lt;/p&gt;

&lt;p&gt;But the time has now come. We do indeed need a website. It doesn't have to be much, but it does have to be clean and concise.&lt;/p&gt;

&lt;p&gt;Enter: Netlify. Or a host of other...hosts. 😁 Use whatever you're comfortable with, but I have been very impressed using Netlify especially for personal projects. It's allowed me to hone my git and GitHub skills and incorporate that into the development workflow.&lt;/p&gt;

&lt;p&gt;I love how deployment works: push a change to my GitHub repository, and it deploys/updates automatically.&lt;/p&gt;

&lt;p&gt;Bonus: Netlify has an open source plan if you meet certain criteria. &lt;a href="https://www.netlify.com/legal/open-source-policy/"&gt;Here's the link&lt;/a&gt; to that, and the basics are below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Include open source compatible license &lt;/li&gt;
&lt;li&gt;Have a code of conduct&lt;/li&gt;
&lt;li&gt;Link to Netlify &lt;/li&gt;
&lt;li&gt;Cannot be a commercial project &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As you can see, my site (&lt;a href="https://unmove.netlify.app/"&gt;https://unmove.netlify.app/&lt;/a&gt;) is currently a bare bones display of the first few animation classes available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EkvdnrlF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972612339/1g48Cw9SE.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EkvdnrlF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972612339/1g48Cw9SE.png" alt="image.png" width="880" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  JSdelivr CDN
&lt;/h2&gt;

&lt;p&gt;JSdelivr is, simply put, a free CDN for Open Source.&lt;/p&gt;

&lt;p&gt;Content Delivery Networks (CDN) help deliver content &lt;strong&gt;fast&lt;/strong&gt; by using globally distributed servers and help cache content at the network edge. 🚀&lt;/p&gt;

&lt;p&gt;CDNs are widely used, and it will allow our users the option of using our stylesheet via a JSdelivr link rather than downloading it into their project.&lt;/p&gt;

&lt;p&gt;And since our project is on GitHub, we can simply load any release, commit or branch by using this link template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// load any GitHub release, commit, or branch
// note: we recommend using npm for projects that support it
https://cdn.jsdelivr.net/gh/user/repo@version/file

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OXD-1r0o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972890610/R3rFg-VxK.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXD-1r0o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661972890610/R3rFg-VxK.png" alt="image.png" width="880" height="710"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I updated our README file's &lt;a href="https://github.com/sieis/unmove#quick-install-instructions"&gt;Quick Install Instructions&lt;/a&gt; to reflect these changes once I had the first working CSS distribution.&lt;/p&gt;

&lt;p&gt;In our case, adding the following to the html page's &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; allows us to use unMove! 😃&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset="UTF-8"&amp;gt;
        &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&amp;gt;
        &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt;
        &amp;lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/sieis/unmove@main/dist/unmove.css"&amp;gt;
        &amp;lt;title&amp;gt;unmove demo&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  CSS
&lt;/h2&gt;

&lt;p&gt;What's going on? 1300 words in and we're just now at the actual product. We were writing a CSS library after all, remember!?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5s1_xO51--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661976006896/-gSWdFmMv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5s1_xO51--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661976006896/-gSWdFmMv.gif" alt="whatsgoingon.gif" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the thing: code is important, but getting a project and/or product organized can be just as cumbersome a process as writing the code. And if it's not done up front, if standards aren't set, it's liable to get real messy real quickly. 🤔&lt;/p&gt;

&lt;p&gt;So, yes, here we are at the end...and just beginning to review the code.&lt;/p&gt;

&lt;p&gt;But so much is in place now! And hopefully, you've picked up some knowledge that you can take into your own projects.&lt;/p&gt;

&lt;p&gt;One of the reasons I picked a CSS animation library was precisely so it wouldn't be too heavily code-intensive. I wanted a quick way to get a working MVP into the world.&lt;/p&gt;

&lt;p&gt;And we did exactly that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cdn.jsdelivr.net/gh/sieis/unmove@main/dist/unmove.css"&gt;Here is a link to the CSS from JSdelivr&lt;/a&gt;. Pull this up in another tab to examine the code and I'll walk through the classes below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jOirHNIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661974776539/htKWefPU_.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jOirHNIl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661974776539/htKWefPU_.png" alt="image.png" width="880" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Spinning Animation
&lt;/h3&gt;

&lt;p&gt;Here's a look at the Spinner Section from &lt;a href="https://unmove.netlify.app/"&gt;unMove's example page&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;section class="text-center container border border-dark border-5 rounded-3 p-5 my-2"&amp;gt;
      &amp;lt;h2&amp;gt;Spinner Animation&amp;lt;/h2&amp;gt;
      &amp;lt;div class="p-2 text-center"&amp;gt;
        &amp;lt;p&amp;gt;An infinite spin. Add the class &amp;lt;code&amp;gt;um-spin&amp;lt;/code&amp;gt; to anything you want to spin
        &amp;lt;/p&amp;gt;
        &amp;lt;div style="height:200px;width:200px"
          class="my-5 mx-auto spin border border-dark border-5 rounded-5 shadow-lg um-spin"&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class="p-2 text-center"&amp;gt;
        &amp;lt;p&amp;gt;Crank up the speed. Add the class &amp;lt;code&amp;gt;um-spin-fast&amp;lt;/code&amp;gt; to go twice as fast.
        &amp;lt;/p&amp;gt;
        &amp;lt;div style="height:200px;width:200px"
          class="my-5 mx-auto border border-dark border-5 rounded-5 shadow-lg um-spin-fast"&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class="p-2 text-center"&amp;gt;
        &amp;lt;p&amp;gt;Chill out. Add the class &amp;lt;code&amp;gt;um-spin-slow&amp;lt;/code&amp;gt; to calm down and go real slow.
        &amp;lt;/p&amp;gt;
        &amp;lt;div style="height:200px;width:200px"
          class="my-5 mx-auto border border-dark border-5 rounded-5 shadow-lg um-spin-slow"&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/section&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;And the CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
/* Infinite Spinning Animation */
.um-spin {
    animation: spin 3s linear infinite;
}
.um-spin-fast {
    animation: spin 1.5s linear infinite;
}
.um-spin-slow {
    animation: spin 6s linear infinite;
}
@keyframes spin {
    from {
        transform: rotate(0);
    }
    to {
        transform: rotate(360deg);
    }
}

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

&lt;/div&gt;



&lt;p&gt;This is fairly simple. We are using &lt;code&gt;transform: rotate()&lt;/code&gt; to rotate the 200px square divs. All that the &lt;code&gt;.um-spin&lt;/code&gt; classes do is apply the animation &lt;code&gt;spin&lt;/code&gt;. One rotation will take either 1.5sec(&lt;code&gt;.um-spin-slow&lt;/code&gt;), 3sec(&lt;code&gt;.um-spin&lt;/code&gt;) or 6sec (&lt;code&gt;.um-spin-fast&lt;/code&gt;). And then &lt;code&gt;infinite&lt;/code&gt; simple tells it not to stop.&lt;/p&gt;

&lt;p&gt;The keyframes are very simple. We go from 0 degrees to 360 degrees.&lt;/p&gt;

&lt;h3&gt;
  
  
  News Ticker Animation
&lt;/h3&gt;

&lt;p&gt;Many of the solutions for the news ticker style animation involved writing JavaScript. I've got nothing against that, but I simply wanted a pure CSS version. After looking at a few CSS builds, I modeled unMove's off of a solution I found on &lt;a href="https://nolte.io/blog/a-continuous-image-ticker-built-with-pure-css/"&gt;Nolte here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is the html from the example site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        &amp;lt;div class="um-news-wrap"&amp;gt;
          &amp;lt;div class="um-news-tick"&amp;gt;
            &amp;lt;!-- free handdrawn vectors used from https://goodstuffnononsense.com/ --&amp;gt;
            &amp;lt;img src="./img/earth@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/saturn@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/mars@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/jupiter@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/venus@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/uranus@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/neptune@4x.png" alt="" class="um-news-item"&amp;gt;

            &amp;lt;img src="./img/earth@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/saturn@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/mars@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/jupiter@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/venus@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/uranus@4x.png" alt="" class="um-news-item"&amp;gt;
            &amp;lt;img src="./img/neptune@4x.png" alt="" class="um-news-item"&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;and the News Ticker CSS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
/* Scrolling News Ticker Animation */
.um-news-wrap {
    overflow: hidden;
}
.um-news-tick {
    display: flex;
    animation: news-ticker 6s linear infinite;
}
.um-news-tick:hover {
    animation-play-state: paused;
}
.um-news-tick-no-hover {
    display: flex;
    animation: news-ticker 6s linear infinite;
}
.um-news-tick-reverse {
    display: flex;
    justify-content: flex-end;
    animation: news-ticker-reverse 6s linear infinite
}
.um-news-tick-reverse-no-hover {
    display: flex;
    justify-content: flex-end;
    animation: news-ticker-reverse 6s linear infinite
}
.um-news-tick-reverse:hover {
    animation-play-state: paused;
}
.um-news-item {
    width: 16rem;
    /* min-width helps svgs behave properly in the scroll without having to manually set their height or width */
    min-width: 16rem;
    margin: 0 1rem;
}
@keyframes news-ticker {
    0% {
        transform: translate3d(0, 0, 0);
    }
    100% {
        transform: translate3d(-126rem, 0, 0);
    }
}
@keyframes news-ticker-reverse {
    0% {
        transform: translate3d(0, 0, 0);
    }
    100% {
        transform: translate3d(126rem, 0, 0);
    }

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

&lt;/div&gt;



&lt;p&gt;It is not as elegant as a JavaScript solution, but it works for our purposes. The first div with &lt;code&gt;class=um-news-wrap&lt;/code&gt; sets 'overflow:hidden'. This hides everything outside the edges of the div.&lt;/p&gt;

&lt;p&gt;The second div is what will move from side to side. This is the actual ticker. It's going to be twice as wide as the container because we're putting two copies of the items in it. This is so there's no stuttering in the animation.&lt;/p&gt;

&lt;p&gt;As the first set of icons goes from right to left, the second set will then start scrolling across the viewable area. At the end of the animation duration, the first set will be ready to display immediately as the second set is scrolling off the viewable area.&lt;/p&gt;

&lt;p&gt;Without the duplication, halfway through the animation duration, there would be nothing scrolling across and then at the start of the next iteration, the original strip of images would pop into place. Below is a side by side example. The seamless setup with duplicate images is on the left, and the non-duplicate version is on the right 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TSJ4bFbH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662057975749/qYaDkEmJ4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TSJ4bFbH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1662057975749/qYaDkEmJ4.gif" alt="comparison.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting that overflow to hidden lets us manipulate the div in a way that looks seamless.&lt;/p&gt;

&lt;p&gt;You'll notice that &lt;code&gt;.um-news-item&lt;/code&gt; sets width and margin for the items. This is the hacky part. We are hardcoding widths both here and in the keyframe transform in order for the scrolling to work as intended. This only works with 7 items in the example because that's how I've calculated the widths.&lt;/p&gt;

&lt;p&gt;16rem * 7 items + 2rem * 7 items = 126rem total&lt;/p&gt;

&lt;p&gt;So, yeah, JS would be simpler. But this is a CSS project, and we like hacky things! 😂&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributions
&lt;/h2&gt;

&lt;p&gt;Last but not least, the beauty and the joy of open-source is the community. I've written up a &lt;a href="https://github.com/sieis/unmove/blob/main/CONTRIBUTING.md"&gt;CONTRIBUTING guidelines file&lt;/a&gt;, and welcome your input on this project.&lt;/p&gt;

&lt;p&gt;This was a big motivation for taking on this project - I want to see what it's like maintaining a public, open-source project.&lt;/p&gt;

&lt;p&gt;So, please hop over to the &lt;a href="https://github.com/sieis/unmove"&gt;repo&lt;/a&gt;, give it a star, make a fork, read the guidelines, check out the issues, and contribute away! 🙌&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You
&lt;/h2&gt;

&lt;p&gt;I appreciate you reading through this, and hope that you learned something helpful! If you did, let me know!&lt;/p&gt;

&lt;p&gt;You can find me on Twitter, and I'd love to say hey 👋 &lt;a href="https://twitter.com/EamonnCottrell"&gt;https://twitter.com/EamonnCottrell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>opensource</category>
      <category>productmanagement</category>
    </item>
    <item>
      <title>📚 Two Inspiring Technology Companies 💻</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Sat, 27 Aug 2022 17:24:02 +0000</pubDate>
      <link>https://forem.com/sieis/two-inspiring-technology-companies-4d7o</link>
      <guid>https://forem.com/sieis/two-inspiring-technology-companies-4d7o</guid>
      <description>&lt;p&gt;No other online platforms have had as big an impact in my life as &lt;a href="https://www.khanacademy.org/"&gt;Khan Academy&lt;/a&gt; &amp;amp;&amp;amp; &lt;a href="https://www.freecodecamp.org/"&gt;freeCodeCamp&lt;/a&gt;. I'm forever grateful to the wealth of knowledge they provide, and their missions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Our mission is to provide a free, worldclass education for anyone, anywhere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-&lt;a href="https://www.khanacademy.org/about"&gt;Khan Academy&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;freeCodeCamp's mission is to help people learn to code for free.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-&lt;a href="https://www.freecodecamp.org/news/freecodecamp-press-kit"&gt;freeCodeCamp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Khan Academy
&lt;/h2&gt;

&lt;p&gt;Khan Academy is an online learning platform offering practice exercises, videos and more. It is primarily for K-14 material as well as free tools for parents and instructors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's staggering to me the amount of material present on the platform, and the quality with which it's presented.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Khan Academy was &lt;a href="https://support.khanacademy.org/hc/en-us/articles/202483180-What-is-the-history-of-Khan-Academy-"&gt;founded by Sal Khan&lt;/a&gt; after he began tutoring family members online. He started posting his videos on YouTube in 2006, and incorporated as a non-profit in 2008.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qSxUAZIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661456105217/A3XPz57fG.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qSxUAZIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661456105217/A3XPz57fG.png" alt="KA_Wordmark_RGB_Dark.png" width="880" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pre-funding early days of Khan Academy ran parallel to my return to college in the late 00's. Shortly after significant grant money began to bolster the platform, I began to use it extensively.&lt;/p&gt;

&lt;p&gt;I took my first Calculus course in the spring of 2012, and it was a system-shock experience. I quickly realized I'd have to relearn substantial chunks of trigonometry in tandem with the Calculus work to keep up with our professor.&lt;/p&gt;

&lt;p&gt;Dr. Shive, like many college professors at the time, recommended Khan Academy to any (all) of us who were struggling to keep pace with his instruction.&lt;/p&gt;

&lt;p&gt;I spent many hours on Khan Academy relearning the trig and reinforcing the Calculus that semester.&lt;/p&gt;

&lt;p&gt;And you know what happened?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eUpFhPJw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661453729478/DRYf-gBun.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eUpFhPJw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661453729478/DRYf-gBun.gif" alt="light.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I fell in love with both subjects&lt;/li&gt;
&lt;li&gt;I fell in love with learning, in general&lt;/li&gt;
&lt;li&gt;I realized the potential for educational content online&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🏫 New School
&lt;/h3&gt;

&lt;p&gt;I'd had some wonderful professors through the years. Having returned for my first degree at age 25, I was more receptive to subjects and instruction than before.&lt;/p&gt;

&lt;p&gt;Profs. Bishop, Switzer, Kelly, Prenshaw, Fiser, Culpepper, Brister and Parakkal were a few standouts that had life-long impacts on my education and my career afterward.&lt;/p&gt;

&lt;p&gt;Add Sal Khan to the list. Particularly because of his early instructional videos in mathematics and physics. I was so impressed with the quality of content he was producing even before the videos themselves became as polished as they are today.&lt;/p&gt;

&lt;p&gt;As a result of my experiences that final semester during my business undergraduate degree, my love of learning was renewed. And my love for math and science was birthed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TSdre9uS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458492215/oc0aVaukw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TSdre9uS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458492215/oc0aVaukw.gif" alt="justwannalearn.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went back through two years of an engineering degree two years after graduating, and my love of web development and technology today stems from those formative years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Khan Academy inspires me to&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Continue learning&lt;/li&gt;
&lt;li&gt;Help others in their journey&lt;/li&gt;
&lt;li&gt;Leverage the power of the internet to do good&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  freeCodeCamp
&lt;/h2&gt;

&lt;p&gt;Not long after my experiences with Khan Academy, freeCodeCamp was founded in 2014. This was right when I returned to college in an engineering program.&lt;/p&gt;

&lt;p&gt;freeCodeCamp is a free online coding bootcamp with challenges, projects and verified certifications. In addition to the curriculum, there are hundreds of tutorials and videos available on their news blog and YouTube channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WZhVo3w_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661456472840/PQPL9lRpJ.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WZhVo3w_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661456472840/PQPL9lRpJ.jpg" alt="fcc_primary_large.jpg" width="880" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I dabbled in Python and Java over the course of two years. I found freeCodeCamp myself in 2016 after my first son was born and I chose to exit formal university in favor of self-study.&lt;/p&gt;

&lt;p&gt;I also used Codecademy and edX a bit, but was always drawn to freeCodeCamp because of its crystal clear mission.&lt;/p&gt;

&lt;p&gt;The for-profit market is very crowded, especially as bootcamps have become a mainstream, albeit expensive, route to learn many specific skills. They can be a useful tool, but I couldn't help but feel that the value proposition was skewed.&lt;/p&gt;

&lt;p&gt;Through a combination of listening to &lt;a href="https://changelog.com/podcast/431"&gt;Quincy's personal story&lt;/a&gt; and motivations for beginning freeCodeCamp and my own experience working through a bit of the curriculum, I could tell that it was a special platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DFLAQ-63--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458575523/Til6FZPKl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DFLAQ-63--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458575523/Til6FZPKl.gif" alt="special.gif" width="480" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The impetus for growth is placed on the individual. And all the certifications are project-based. I was able to go through the tutorial sections just like I have come to expect from any number of sites.&lt;/p&gt;

&lt;p&gt;But rather than getting stuck in tutorial hell, the projects are just difficult enough to force you to go beyond the lessons into external documentation to solve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deeper Learning
&lt;/h3&gt;

&lt;p&gt;Being pushed outside my comfort zone is a healthy thing. I've recently completed the &lt;a href="https://www.freecodecamp.org/learn/relational-database/"&gt;Relational Database certification&lt;/a&gt;, and it was very challenging at times.&lt;/p&gt;

&lt;p&gt;It is still in beta as of this writing (08/2022), and was available either as a &lt;a href="https://www.freecodecamp.org/news/how-to-run-freecodecamps-relational-databases-curriculum-using-docker-vscode-and-coderoad/"&gt;VSCode + Docker&lt;/a&gt; experience or in a &lt;a href="https://www.freecodecamp.org/learn/relational-database/"&gt;web-based course&lt;/a&gt; delivered via integration with &lt;a href="https://codeally.io/"&gt;CodeAlly.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This caused all kinds of problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FrLmSwQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661619740108/TEMQGNplj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FrLmSwQW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661619740108/TEMQGNplj.gif" alt="laugh.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But you know what?&lt;/p&gt;

&lt;p&gt;It was incredibly impactful. The problems I encountered deepened my learning when I was able to set frustrations aside and come to grips with the fact that web development and computer programming is wrought with bugs and problem solving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1z-2_X9u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458438962/QPYxPohvX.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1z-2_X9u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458438962/QPYxPohvX.gif" alt="learning.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It was fantastic practice in finding solutions rather than having them handed to me.&lt;/p&gt;

&lt;p&gt;This continues to be my experience with freeCodeCamp as a whole. &lt;strong&gt;It inspires me to&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Not give up in the face of seemingly impossible problems&lt;/li&gt;
&lt;li&gt;Pay it forward as a contributor to the news blog&lt;/li&gt;
&lt;li&gt;Be mission-based in my online ventures&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Online Education
&lt;/h2&gt;

&lt;p&gt;It's no secret that it's easy to start an online course, and it's often even easier to quit one.&lt;/p&gt;

&lt;p&gt;My own start-stop relationship with both of these platforms is testament to that. But, I've kept coming back.&lt;/p&gt;

&lt;p&gt;I've "wanted to learn how to code" since about 2013 when I &lt;a href="https://share.transistor.fm/s/80d46ef6"&gt;first wrote some custom Google Apps Scripts&lt;/a&gt; for a spreadsheet at work.&lt;/p&gt;

&lt;p&gt;But it wasn't until about 2019 that I got really serious and began to make progress past the introduction-level.&lt;/p&gt;

&lt;p&gt;Don't give up.&lt;/p&gt;

&lt;p&gt;Even when you give up!&lt;/p&gt;

&lt;p&gt;Here's a screenshot of my first GitHub commit. It was in December 2012. My next commit was in July of 2019!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--icyK88YN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458712692/8iIpCx4hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--icyK88YN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458712692/8iIpCx4hy.png" alt="image.png" width="880" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's right, years went by. I'm pretty sure I started Harvard's CS50 like 5 times.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sx-wAOKZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458806120/PAYLiCjh5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sx-wAOKZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661458806120/PAYLiCjh5.gif" alt="what.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did some coding in there, sure, but I largely was focused on my career, my family and traditional education.&lt;/p&gt;

&lt;p&gt;But I never shut the door. And I'm so glad I didn't. These resources were there waiting for me when I came back.&lt;/p&gt;

&lt;p&gt;Services like Khan Academy and freeCodeCamp always have open doors to free learning for anyone, anywhere!&lt;/p&gt;

&lt;p&gt;Seeing how two people leveraged their own unique skillsets through technology to make the world a better place and to help millions of learners continues to inspire me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Hope
&lt;/h2&gt;

&lt;p&gt;I hope that I can pass on what has been freely given to me. It's one of the reasons that I've begun writing about my journey as a developer this year. I want to be able to help others along this journey by sharing my own experiences.&lt;/p&gt;

&lt;p&gt;And I hope, whatever my future holds, that I can contribute to and build impactful tools and resources that serve others well!&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;Come say hey 👋 over on Twitter: &lt;a href="https://twitter.com/EamonnCottrell"&gt;https://twitter.com/EamonnCottrell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>week2</category>
      <category>4articles4weeks</category>
      <category>khanacademy</category>
      <category>freecodecamp</category>
    </item>
    <item>
      <title>Journey to the Center of the Code</title>
      <dc:creator>Eamonn Cottrell</dc:creator>
      <pubDate>Mon, 22 Aug 2022 15:29:14 +0000</pubDate>
      <link>https://forem.com/sieis/journey-to-the-center-of-the-code-8ab</link>
      <guid>https://forem.com/sieis/journey-to-the-center-of-the-code-8ab</guid>
      <description>&lt;h2&gt;
  
  
  Beginning and re-beginning
&lt;/h2&gt;

&lt;p&gt;My first experiences with coding were in middle school. I didn't quite realize it at the time, but I was writing rudimentary programs on our graphing calculators and having a ball programing conditional statements in a choose-your-own-adventure fashion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o197mMrl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661179762464/EKW-z5CVB.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o197mMrl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661179762464/EKW-z5CVB.png" alt="drug wars game ti-83 screenshot" width="297" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing really stuck, though. I had a penchant for accounting and numbers came easily, but I didn't invest into my math and engineering interests until much later.&lt;/p&gt;

&lt;p&gt;My first college major was piano. That didn't last long. I took a long sabbatical during the truly pretentious days of the early 00's coffee scene to work as a barista and fantasize about owning my cafe.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--knWq21QY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661179958497/C_9LzQoXi.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--knWq21QY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661179958497/C_9LzQoXi.gif" alt="barista.gif" width="331" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the froth settled, I returned to college. This time taking an assortment of histories, creative writing, statistics and anything else that seemed halfway interesting. Naturally, this leads to one of two places: English teachers and business majors.&lt;/p&gt;

&lt;p&gt;I chose the later and it was not until the final semester of my senior year that I began second guessing this seemingly logical and well-rounded pathway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Derivatives and starting over
&lt;/h2&gt;

&lt;p&gt;I'd put off Calculus until the absolute last semester, and once the class began, it became apparent that a) I was going to have to re-learn trigonometry, and b) I really liked math.&lt;/p&gt;

&lt;p&gt;So, while my classmates complained about the rigor with which our professor held us to, I soaked up the integrals and the sounds of chalk-on-slate while supplementing his lessons with Khan Academy material to fill in all the trigonometric blanks in my head.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hmMMpykF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180032766/zw1JpOTEP.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hmMMpykF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180032766/zw1JpOTEP.gif" alt="math.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This taught me another two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I really missed the boat when picking business as my major&lt;/li&gt;
&lt;li&gt;There was a world of free educational material on the internet &lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The real world
&lt;/h2&gt;

&lt;p&gt;My business degree gave me access to a "real job" at the company I had worked at through college. After a couple years, though, I began to get curious about other options.&lt;/p&gt;

&lt;p&gt;I took a Calculus II summer class. (like you do)&lt;/p&gt;

&lt;p&gt;I talked to a friend about cyber security.&lt;/p&gt;

&lt;p&gt;I took one of the first MOOC's over at edX: an intro to computer programming with Python from MITx.&lt;/p&gt;

&lt;p&gt;I decided I was supposed to be an engineer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--744urKyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180161953/l2NU1r_Oc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--744urKyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180161953/l2NU1r_Oc.gif" alt="engineer.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  School and kids 👶
&lt;/h2&gt;

&lt;p&gt;Another degree seemed the logical step if I was going to hop careers into engineering. So I went back part time while working and took the first two years' worth of an engineering degree. You know: all the easy stuff...Cal III &amp;amp; IV, Physics, Chemistry, Differential Equations, Linear Algebra, Engineering Mechanics...oh, and a Java course that was absolutely dreadful.&lt;/p&gt;

&lt;p&gt;I knew engineers designed and built stuff. And I knew they got paid well. I was loving learning, and began to try and figure out what branch of engineering I would go into.&lt;/p&gt;

&lt;p&gt;I decided Civil. Then Computer. Then Electrical. Then Nuclear. Then Civil again...maybe Environmental. Then Software.&lt;/p&gt;

&lt;p&gt;I really didn't have a clue, and I was continuing to manage the chain of cafes I had been employed at for years. My previous pipe dream of ownership seemed like a possible future. But did I want that any more?&lt;/p&gt;

&lt;p&gt;My wife and I had our first child 👶 during the final semester of that two year pre-engineering degree in the spring of 2016, and I began to take a hard look at the options I had:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Continue in a state college engineering program-probably in Knoxville, TN as we were about to move.&lt;/li&gt;
&lt;li&gt;Transfer into ASU's online program&lt;/li&gt;
&lt;li&gt;Pivot into either software development or a hybrid path&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I was pretty sold on a traditional degree being valuable to my situation. I enrolled in ASU, but at the same time got a promotion at work with some solid assurances for my family. I pulled out of ASU in order to move from Mississippi to Tennessee, and began to scout out programs at UT.&lt;/p&gt;

&lt;p&gt;Over the course of all this time, I'd tinkered online with Codecademy, freeCodeCamp, Coursera and edX. I'd learned enough of HTML, CSS, and basic programming concepts with Python, Java and Javascript to understand the basics but I wasn't really sold on going the software route yet.&lt;/p&gt;

&lt;p&gt;Opportunities continued to open up at my day job, and we had our second child 👶👶 after moving to Knoxville. I was unable to devote my full time to pursuing the last two years' of a degree, and I was unable to start over in a new career.&lt;/p&gt;

&lt;p&gt;I felt pretty stuck: I really wanted to pivot, but it just didn't seem possible. I looked at a masters program in Data Analytics, but the timing and logistics didn't work out for it either.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qDCH8kK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180496707/iTYAD_dly.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qDCH8kK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661180496707/iTYAD_dly.gif" alt="stuck.gif" width="324" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Web Development
&lt;/h2&gt;

&lt;p&gt;Every six months or so, I'd dabble back in &lt;a href="https://www.freecodecamp.org/sieis"&gt;freeCodeCamp&lt;/a&gt; or Udemy and get my creative juices flowing for web development. I stumbled across the &lt;a href="https://www.indiehackers.com/"&gt;Indie Hackers&lt;/a&gt; community. I began listening to entrepreneurial podcasts. I became intrigued with a new idea: web development as a pathway into engineering and/or entrepreneurship.&lt;/p&gt;

&lt;p&gt;Maybe I wouldn't have to wait until timing permitted me to return to school.&lt;/p&gt;

&lt;p&gt;When the 2020 pandemic hit, I dove back into freeCodeCamp with the expressed intent of honing my web development skills while I continued to manage my business. I began to hear many stories of people successfully learning on the side and eventually landing jobs or starting companies.&lt;/p&gt;

&lt;p&gt;We had another baby 👶👶👶 in 2020 and were all-in on raising a family. My job was fully remote, and I had enough margin to study when and where I could on the side. My previous formal education pathway and traditional engineering school slipped further into the background.&lt;/p&gt;

&lt;p&gt;I'd still love to go through a masters program some day, but it doesn't serve an explicit purpose right now.&lt;/p&gt;

&lt;p&gt;I began to actually put together &lt;a href="https://www.eamonncottrell.com/projects/"&gt;some small projects&lt;/a&gt;, I began to find ways to automate spreadsheets at work using code, I began to &lt;a href="https://blog.eamonncottrell.com/"&gt;document&lt;/a&gt; some of my processes and progress.&lt;/p&gt;

&lt;p&gt;I began to have a blast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gk8_CwEq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661192244296/B7hzhBbBX.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gk8_CwEq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661192244296/B7hzhBbBX.gif" alt="havingablast.gif" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I really enjoyed the process of building things. I was fascinated by the stories of ordinary people building extraordinary things on the internet using little more than the skills I saw that were within my grasp.&lt;/p&gt;

&lt;p&gt;Furthermore, I saw the opportunity to create &lt;a href="https://eamonn.gumroad.com/"&gt;digital products&lt;/a&gt; for a potential worldwide audience pool rather than relying on physical good in a fixed place and time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep leaning forward 📈
&lt;/h2&gt;

&lt;p&gt;I'm in a unique situation. I have a great job with benefits that would be hard to replace in an entry level position. Throughout the course of the last two years, I've worked at optimizing my role there by automating what I can and then using any free time to continue to learn and develop my technical skill set.&lt;/p&gt;

&lt;p&gt;Certifications are certainly a slippery slope. It's easy to get caught in a pattern of hopping from one to another, but I have found value in pursing a few, and ultimately using them as guide rails to learn specific things I'm interested in through projects.&lt;/p&gt;

&lt;p&gt;freeCodeCamp is great at this: all their programs use project based learning techniques where you learn enough to build a user-story-specified project at the end. I just wrapped up their &lt;a href="https://www.freecodecamp.org/learn/relational-database/"&gt;Relational Database&lt;/a&gt; course and it was a wonderful learning experience in SQL and troubleshooting.&lt;/p&gt;

&lt;p&gt;Google has &lt;a href="https://grow.google/certificates/#?modal_active=none"&gt;several programs&lt;/a&gt; they've launched over the past couple years, and I completed their &lt;a href="https://www.credly.com/badges/c8f8a2ff-cc12-4737-a169-34036c7602b2/public_url"&gt;data analytics&lt;/a&gt; one to sharpen my skills earlier this year.&lt;/p&gt;

&lt;p&gt;Hashnode's hackathons have been a great tool as well, giving opportunities to flex and stretch skills while competing. I built a &lt;a href="https://blog.eamonncottrell.com/infinite-memory"&gt;very small project&lt;/a&gt; for my very first hackathon experience earlier this year.&lt;/p&gt;

&lt;p&gt;In January of 2022, Quincy (founder of freeCodeCamp) &lt;a href="https://www.freecodecamp.org/news/2022-become-a-dev-new-years-resolution-challenge/"&gt;posted a challenge&lt;/a&gt; which I've just finished up. It included blogging as part of the developer path he laid out, and I've found that writing has been a great tool to utilize in my learning process.&lt;/p&gt;

&lt;h2&gt;
  
  
  My 222 day version of #100DaysOfCode
&lt;/h2&gt;

&lt;p&gt;After accepting the "Become a Dev" challenge, I did what all good students do: I built a new spreadsheet. 😂&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1oTtfOsWAH90mRvHYD0TWkdij9zSo7iZvTmtJpcjSVFo/edit#gid=0"&gt;Here's my track record&lt;/a&gt; for the last 222 days' worth of that journey. And it's a testament to how long I can take to complete 100 days of coding!&lt;/p&gt;

&lt;p&gt;To be fair, we had our fourth (and final? 👶👶👶👶) child in May, so I knew that I was going to likely be having forced breaks in my coding streak.&lt;/p&gt;

&lt;p&gt;Even so, I managed to stick with it. And I think I've been able to maintain a healthy balance of work + family + exercise + learning.&lt;/p&gt;

&lt;p&gt;Not plowing through to the point of exhaustion has actually been a critical lesson learned from these last 222 days. It's important to keep margin in my life. I need healthy relationships in and outside my family. I need to be reading books (fiction, not coding), listening to music, running, ect.&lt;/p&gt;

&lt;p&gt;Those extra-curricular activities kept me from coding every single day, but they also kept me more sane and healthy than I would have otherwise been.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_XTOUqIq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661181372003/1Mg6-Ib7r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_XTOUqIq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1661181372003/1Mg6-Ib7r.gif" alt="insane.gif" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I don't know what's next, career-wise. But I know I'm going to be coding along the way.&lt;/p&gt;

&lt;p&gt;I don't know if I'll truly seek another job or keep doing this on the side. But the more I code, the more intrigued I am with roles outside of just a "programmer".&lt;/p&gt;

&lt;p&gt;Developer relations, product management, startup founder, data scientist and more all interest me.&lt;/p&gt;

&lt;p&gt;I know this: I'm going to keep leaning forward and learning.&lt;/p&gt;

&lt;p&gt;I'm currently writing on &lt;a href="https://www.freecodecamp.org/news/author/eamonn/"&gt;Hashnode&lt;/a&gt; and &lt;a href="https://www.freecodecamp.org/news/author/eamonn/"&gt;freeCodeCamp&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've just released the v0.1.0-alpha of &lt;a href="https://github.com/sieis/unmove"&gt;unMove&lt;/a&gt;, a css animation library that I'm building to learn a few things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Proper use of GitHub, PR's and codebases&lt;/li&gt;
&lt;li&gt;Maintaining an open source project&lt;/li&gt;
&lt;li&gt;Structured project management&lt;/li&gt;
&lt;li&gt;Collaboration with others&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As disparate as my journey to code has been so far, I'm truly excited to see where it takes me next, and I look forward to the doors that open...especially the ones I didn't realize were there to begin with!&lt;/p&gt;

&lt;p&gt;Come say hey on Twitter. You can find me here: &lt;a href="https://twitter.com/EamonnCottrell"&gt;https://twitter.com/EamonnCottrell&lt;/a&gt;&lt;/p&gt;

</description>
      <category>story</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
