Blog

Hello, World

How I Got My Start As A Professional Software Developer

This month marks my 20th year as a professional software developer. Over the years I’ve had a lot of opportunities to work on some pretty big software projects and meet some great people along the way. But I didn’t start out like most of the other developers I’ve worked in my career. I got my first real programming job when I was 19 and didn’t graduate college until I was 29. In those ten years I took night classes at Minneapolis Community & Technical College and later, after I moved to Chicago from Minneapolis, online classes at Metro State University.  If you might be questioning the need for a four year degree to become a processional developer or maybe you have other blockers keeping you from getting your degree now, this is how I did it.

My first job was as an entry level/jr. developer at Wells Fargo in the Stock Options Services group developing Visual Basic 6 desktop and Classic ASP apps. Except for two computer classes in high school and a one year computer programming certificate from the now defunct Brown Institute, I had zero classroom computer science education at the time. That Brown Institute certificate is the same as a coding boot camp; a 12 month course where you focus on a variety of programming languages but never really getting into them enough to fully understand how they work. Looking back at that experience, as much as the organization promised we’d all have super awesome programming jobs at the end, I don’t feel like that adequately prepares someone just entering the work force to be successful in the software engineering space. So, a lot of my education came from reading books, getting the MCSD, create a few AOL Proggies and just building things on my own. I feel like I was pretty fortunate as I was hired with a non-existent computer science education and couldn’t even order a beer at team happy hours – I had a lot of cherry cokes in those days.

My dad is an old programmer who had been building my small hometown a water usage billing system in Visual Basic. He generously allowed me to hack away on a few components along side him to give me some real world working experience. I quickly added this to my resume – right above the one year programming certificate and my previous experience as a warehouse “manager” at Wick’s Furniture in Edina, Minnesota. I’m convinced that having this development experience on my resume is what enabled me to get an interview and later hired as a professional software developer without any experience or a four year education – or even a two year education. Before this job I applied to hundreds of entry level programming jobs and never heard anything back – which is hella discouraging. After months of applying to jobs and never hearing a peep I started get really down and thinking about backup plans. The thought of joining the Army even popped into my mind. That or maybe start looking at two or four year colleges. Then I got an interview for an entry level developer role at Wells Fargo. That interview came from a job fair my roommate convinced me to go to with him. I interviewed with a HR person, technology manager and the director of the business; they all decided to hire me. Coming from a non CS background with very little experience, getting that first job was crucial. The saying goes “you can’t get experience without a job and can’t get a job without experience” so after a couple years of development experience it was pretty easy to get job offers. Potential new employers start to look past not having a degree to see that any experience was enough to look past not having a degree.

There are so many senior developers and people in the business who took me under their wing to help me grow as a developer and person in those early years. It would be easy for me to say I got hired as a professional developer without having a four year degree all on my own, but that would be a lie as there were many people who made that happen for me; my dad, my roommate, the HR rep, technology manager, business manager, etc. I’ve since tried to reach out to the people who made it happen to say thanks for the opportunity but haven’t been able to find them online yet. They probably have no idea how much their decisions meant to me then and how much they do today.

Every now and then I’ll be talking to someone at a party who isn’t happy with their job and eventually they’ll ask if they can pick my brain on how to get into programming. Many of these people are looking to get started in development as a career without a formal CS degree or previous development experience. My answer is always to just build something by solving a problem you have or a problem you can see. You’ll learn a lot building that first app or website and you’ll have something to put on your resume. There are so many resources online to learn the concepts of programming, but you’ll never really get it until you try to build something on your own. If there is an idea you have or an open source project you’re passionate about, then I’d recommend trying to build that app or website or get involved in that open source project.

I learned a valuable lesson then in taking chances on people and how getting a small job opportunity can be the break someone needs. I try to pay it forward when I’m working with younger developers or if I have a gig I can bring on a more junior developer to help them gain experience.

Tips getting your first programming job without a four year degree:

  1. Learn a language by utilizing an online course. JavaScript, C#, Python, Ruby, it doesn’t really matter what language you pick, try building a couple “Hello, World”s and choose the language that jives with you the best.
  2. Build something. A snow emergency website or tamale tracker or playlist generator.
  3. Create a Github profile and start pushing code from those projects to your repositories.
  4. Create a portfolio website to present yourself as a professional developer and display the different projects you’ve worked on – open source or your own. The more you can show off your skills the more likely you can set yourself apart.
  5. Update your resume with your portfolio, links to the sites/apps/open source projects and your Github profile.
  6. Network like crazy while linking to your portfolio whenever you can.
  7. Join local tech meetups.
  8. Join local tech Slack groups. They usually have a #jobs channel where people will post jobs and some of them are for entry level developers.
  9. Reach out to other developers to ask questions or advice.
AWS Amplify Removed Video Source

AWS Amplify removed video sources from HTML

A good amount the websites I’ve pushed to production in the past couple of years have all been hosted on-prem within my client’s data centers. However, not all of my clients have test environments. Up until recently I’ve been hosting my test sites with Server4You, a fantastic non AWS/Azure/GCP hosting company/provider. But with the rise of AWS and Azure I want to start venturing over that way to gain experience and play around with those providers some more.

I’m starting with a front end only React app that I’ve developed for a client which will ultimately live in their data center when the site goes live, but to test while we’re building the site I decided to give AWS Amplify a try. This service is awesome and hooks right into Gitlab for automated CI/CD with a couple button clicks. Awesome as it is, I did run into one problem: My video src references were stripped out during the CI/CD process.

The site has three HTML5 video references to mp4s that are hosted within the build folder at the root of the web project. When the AWS Amplify CI/CD process migrated my code over to the hosting web server all of my src references were blank – <video src="" />.. I tried referencing the videos in a couple different ways from the React app but nothing seemed to work.

To get the video links to work in AWS Amplify, I ended up creating a S3 storage account, uploading my videos to a S3 bucket , assigned the appropriate permissions then referencing the videos in code to pull from the S3 bucket which ended up fixing the problem.

I haven’t been able to find any documentation that explicitly says that video sources are removed but hosting the videos in S3 fixed the issue for me.

Filter DataTable By Column Value With Custom Dropdown Menu

In addition default search box in DataTables sometimes it’s nice to have the ability to filter by a specific DataTable column. This example shows how to use a custom drop-down menu to filter a DataTable by column value. I’m going to create a drop-down menu that displays the unique list of strings from a column called Category and when the user selects a category from the dropdown-menu, the datatable will be rendered with only records with the Category from the selected value.

Filter DataTable Example

View full working example.
Download full repo.

HTML

There are two main parts to the HTML, the category filter drop-down menu and the datatable. The values in the category filter will be the values that are to be filtered from the table when the user selects an item.

    <!-- Create the dropdown filter -->

   <div class="category-filter">
      <select id="categoryFilter" class="form-control">
        <option value="">Show All</option>
        <option value="Classical">Classical</option>
        <option value="Hip Hop">Hip Hop</option>
        <option value="Jazz">Jazz</option>
      </select>
    </div>

    <!-- Set up the datatable -->
    <table class="table" id="filterTable">
      <thead>
        <tr>
          <th scope="col">Artist</th>
          <th scope="col">Category</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td scope="col">Public Enemy</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Chet Baker</td>
          <td scope="col">Jazz</td>
        </tr>
        <tr>
          <td scope="col">Billie Holiday</td>
          <td scope="col">Jazz</td>
        </tr>
        <tr>
          <td scope="col">Vivaldi</td>
          <td scope="col">Classical</td>
        </tr>
        <tr>
          <td scope="col">Jurrasic 5</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Onyx</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Tchaikovsky</td>
          <td scope="col">Classical</td>
        </tr>
        <tr>
          <td scope="col">Oscar Peterson</td>
          <td scope="col">Jazz</td>
        </tr>
      </tbody>
    </table>

JavaScript

The JavaScript part relies on jQuery but can be modified to use vanilla javascript if you don’t have jQuery as part of the project. The code is commented below to give you an idea of what’s happening.

<script>
    $("document").ready(function () {

      $("#filterTable").dataTable({
        "searching": true
      });

      //Get a reference to the new datatable
      var table = $('#filterTable').DataTable();

      //Take the category filter drop down and append it to the datatables_filter div. 
      //You can use this same idea to move the filter anywhere withing the datatable that you want.
      $("#filterTable_filter.dataTables_filter").append($("#categoryFilter"));
      
      //Get the column index for the Category column to be used in the method below ($.fn.dataTable.ext.search.push)
      //This tells datatables what column to filter on when a user selects a value from the dropdown.
      //It's important that the text used here (Category) is the same for used in the header of the column to filter
      var categoryIndex = 0;
      $("#filterTable th").each(function (i) {
        if ($($(this)).html() == "Category") {
          categoryIndex = i; return false;
        }
      });

      //Use the built in datatables API to filter the existing rows by the Category column
      $.fn.dataTable.ext.search.push(
        function (settings, data, dataIndex) {
          var selectedItem = $('#categoryFilter').val()
          var category = data[categoryIndex];
          if (selectedItem === "" || category.includes(selectedItem)) {
            return true;
          }
          return false;
        }
      );

      //Set the change event for the Category Filter dropdown to redraw the datatable each time
      //a user selects a new filter.
      $("#categoryFilter").change(function (e) {
        table.draw();
      });

      table.draw();
    });
</script>

Full HTML/JS/CSS

Here is the full HTML with Javascript and a bit of CSS included.

<!doctype html>

<html lang="en">

<head>
  <meta charset="utf-8">

  <title>Add select drop-down filter to DataTable</title>
  <meta name="description" content="">
  <link rel="stylesheet" href="https://cdn.datatables.net/1.10.23/css/jquery.dataTables.min.css" />
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" />
<style>
  select.form-control{
    display: inline;
    width: 200px;
    margin-left: 25px;
  }
</style>
</head>

<body>
  <div class="container mt-4">
    <!-- Create the drop down filter -->
    <div class="category-filter">
      <select id="categoryFilter" class="form-control">
        <option value="">Show All</option>
        <option value="Classical">Classical</option>
        <option value="Hip Hop">Hip Hop</option>
        <option value="Jazz">Jazz</option>
      </select>
    </div>

    <!-- Set up the datatable -->
    <table class="table" id="filterTable">
      <thead>
        <tr>
          <th scope="col">Artist</th>
          <th scope="col">Category</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td scope="col">Public Enemy</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Chet Baker</td>
          <td scope="col">Jazz</td>
        </tr>
        <tr>
          <td scope="col">Billie Holiday</td>
          <td scope="col">Jazz</td>
        </tr>
        <tr>
          <td scope="col">Vivaldi</td>
          <td scope="col">Classical</td>
        </tr>
        <tr>
          <td scope="col">Jurrasic 5</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Onyx</td>
          <td scope="col">Hip Hop</td>
        </tr>
        <tr>
          <td scope="col">Tchaikovsky</td>
          <td scope="col">Classical</td>
        </tr>
        <tr>
          <td scope="col">Oscar Peterson</td>
          <td scope="col">Jazz</td>
        </tr>
      </tbody>
    </table>

  </div>

  <script src="https://code.jquery.com/jquery-3.5.1.min.js"
    integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>

  <script src="https://cdn.datatables.net/1.10.23/js/jquery.dataTables.min.js"></script>

  <script>
    $("document").ready(function () {

      $("#filterTable").dataTable({
        "searching": true
      });

      //Get a reference to the new datatable
      var table = $('#filterTable').DataTable();

      //Take the category filter drop down and append it to the datatables_filter div. 
      //You can use this same idea to move the filter anywhere withing the datatable that you want.
      $("#filterTable_filter.dataTables_filter").append($("#categoryFilter"));
      
      //Get the column index for the Category column to be used in the method below ($.fn.dataTable.ext.search.push)
      //This tells datatables what column to filter on when a user selects a value from the dropdown.
      //It's important that the text used here (Category) is the same for used in the header of the column to filter
      var categoryIndex = 0;
      $("#filterTable th").each(function (i) {
        if ($($(this)).html() == "Category") {
          categoryIndex = i; return false;
        }
      });

      //Use the built in datatables API to filter the existing rows by the Category column
      $.fn.dataTable.ext.search.push(
        function (settings, data, dataIndex) {
          var selectedItem = $('#categoryFilter').val()
          var category = data[categoryIndex];
          if (selectedItem === "" || category.includes(selectedItem)) {
            return true;
          }
          return false;
        }
      );

      //Set the change event for the Category Filter dropdown to redraw the datatable each time
      //a user selects a new filter.
      $("#categoryFilter").change(function (e) {
        table.draw();
      });

      table.draw();
    });
  </script>
</body>

</html>

View full working example.
Download full repo.

Create multiple .env files in a React app

Configuring multiple environment files for a React app is handy if you have different variables for each environment (local, dev, test and production) – API endpoints is a good example. Like the name suggests, a .env file allows you to create environment specific variables that you specify to be used in specific builds for each of your environments. My projects usually have the four different environments:

  1. Local – My local machine where I do all my development.
  2. Development – This is the server environment where we can try new code outside our development machines. This is a server environment that is configured similar to test and production but is reserved to break things. Generally this environment is filled with dummy data and can become a mess pretty easily as we test out new features and debug code.
  3. Test or staging – A copy of the production environment where end users, testers and other folks from the team do their testing. This environment usually has the same data (minus any PII/PHI data) that production has.
  4. Production – This is the live site. You know what this is.

With these four environments I have five environment files in my React app structure. Each with their own variables that relate to the specific environment.

  • .env
    • This is a placeholder file that only shows the structure the other environment files should follow. For example:
      • REACT_APP_API_HOST=API_HOST
        REACT_APP_WEB_HOST=WEB_HOST
        REACT_APP_BUILD=BUILD
  • .env.development.local
    • This is the file that I use for my local development. I have this file added to .gitignore so it’s not checked into source control. Every developer should create this file locally and configure it with their local information.
  • .env.development
    • Development server
  • .env.staging
    • Staging server
  • .env.production
    • Production server

Then by utilizing the env-cmd package I’m able to run a command like npm run build:production to create my production build which uses the variables defined in the .env.production file. Same goes for local, development and testing/staging.

How to configure multiple .env files

Here’s how to set up a React application to utilize multiple .env files and variables. This example uses Create-React-App, so YMMV depending on what you bootstrapped your React app with.

1. Start off by creating a .env file at the root of your project for each of your environments.

Multiple .env files in React

2. Install the env-cmd package into your project npm install env-cmd

3. Open your package.json file and inside the scripts node add a line for each environment you will be building. You should already have lines for start, build, test and eject. Each line is specific to the build and .env file. So, build:development is the command you’ll run to create your development build, build: staging for testing and build:production for production.

"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "build:development": "env-cmd -f .env.development react-scripts build",
    "build:staging": "env-cmd -f .env.staging react-scripts build",
    "build:production": "env-cmd -f .env.production react-scripts build"
  }

4. Add the environment specific variables to your environment files.

REACT_APP_API_HOST=https://localhost:5001
REACT_APP_WEB_HOST=http:localhost:3000
REACT_APP_BUILD=Development.Local

5. Run your build to create a build with your environment variables npm run build:production

Now you should have the ability to build your React apps with environment specific variables. Hopefully this makes your deployments easier and more straightforward.

There was an error running the selected code generator in .Net Core 5

I’m working on a new .Net Core 5 web app with user authentication and Identity Server 4 where I need to customize some of the Identity account pages (Login, Register, Forgot Password, etc). Out of the box these pages are built into .Net Core and Identity Server 4 so there’s nothing you need to do to use them. However, if you want to customize any of the account pages you’ll need to scaffold the source of those pages into your project.

In the latest version of Visual Studio 2019 – (Version 16.8.4 as of today) you are able to do this by right clicking the project and selected “Add –> New Scaffolded Item” for all .Net Core projects below version 5 without any issues. But if you are trying to scaffold Identity in .Net Core 5 from Visual Studio then you might run into this error:

“There was an error running the selected code generator: ‘Package restored failed. Rolling back package changes for ‘Your App’.”

A way around this is error I found was to use the dotnet CLI outside of Visual Studio. Follow these steps to scaffold the full Identity pages into your .Net Core 5 app.

  1. Close Visual Studio
  2. Open a command prompt and change directories to the project where you want to create the scaffolded items.
  3. Run the following command updating MyApp.Models.ApplicationDbContext to your own DbContext: dotnet aspnet-codegenerator identity -dc MyApp.Models.ApplicationDbContext

That should fix the “There was an error running the selected code generator” issue. You can also pass a set of parameters into the dotnet aspnet-codegenerator app if you only want to scaffold a certain number of files versus all Identity files.

Week In Photos – 12/7/2020

In an effort to get myself to write and take more photos I decided to start a weekly post of the previous week’s photos that I took. I don’t have much of a plan for this series, but it feels like a good way to get myself to reflect on the past week and focus on writing more. It’s December, so with the Holidays and another heavy quarantine around the corner what better way to document the season? So here goes.

Squirrel Attacked Coffee Bag

The neighborhood squirrels started a war last week. I’ve looked the other way as they ate our Halloween pumpkins or taunted our dog on the front steps. But it all changed last week. Every week I get a bag of coffee sent to our house through the online subscription service, Trade. Last week I was looking forward to this new bag from Irving Farm in New York. When I went outside to pick up the coffee beans much to my surprise the neighborhood squirrels busted into my the back and tore it apart. It’s on now, guys.

We’ve reached that in-between time of year where it’s not the colorful part of fall or the pretty part of winter. We’re living in the Mama’s and the Papa’s song – California Dreamin

Marshmellow Old Fashioned

We made marshmallow old fashions and they are great.

COVID Dishwasher

Since we have been quarantined it feels like we’re running the dishwasher every day of the week. And while the dishwasher is running, we’ve got a pile of dishes waiting in the sink for the next run. Much like a crowded rush hour platform, these dishes are always waiting for the next train/available washer.

Bell's Christmas Ale

It’s the best time of year for beer. We picked up four six packs of Christmas ales last week. Two sets of Bell’s – their Christmas Scotch Ale and their Old Fashioned holiday brew, St. Bernardas Christmas Ale and Odell’s Isolation Ale.Contrail

And finally the last worthy photo I took last week. There’s nothing special to say about this one, other than I really liked the way it all came together.

Music About Food And Drinking: A Thanksgiving Playlist

It’s Thanksgiving time and that means firing up my Thanksgiving playlist. This playlist is a mix of music I’ve put together over the years with songs that are about Thanksgiving, food, family and a little bit of drinking. Really everything that you love and possibly don’t love so much about Thanksgiving wrapped up in one jazz, blues, hip-hop and indie rock playlist.

Enjoy and Happy Thanksgiving!

Here is a full track list of my Thanksgiving playlist:

Arlo Guthrie – Alice’s Restaurant Massacree
Ray Charles – Mess Around
Carolina Chocolate Drops – Cornbread and butterbeans
Dee Dee Sharp – Gravy (For My Mashed Potatoes)
The J.B.’s – Pass The Peas
The Roots – Bread And Butter
Vince Guaraldi Trio – Thanksgiving Theme
Brandi Carlile; Emmylou Harris – Take Me Home, Country Roads
Digital Underground – Food Fight
They Might Be Giants – Dinner Bell
A Tribe Called Quest – Ham ‘N’ Eggs
Patty Griffin – Making Pies
Heavy D & The Boyz – Black Coffee
Lightnin’ Hopkins – Long Gone Like a Turkey Through the Corn
Bobby Troup – The Hungry Man
Lou Donaldson – Gravy Train – Rudy Van Gelder/Digital Remaster/2007
James Brown & The Famous Flames – Mashed Potatoes U.S.A.
Nat King Cole Trio – The Frim Fram Sauce
Lambert, Hendricks & Ross – Gimme That Wine
Louis Armstrong – All That Meat And No Potatoes
Tom Waits – Eggs And Sausage (In A Cadillac With Susan Michelson)
The Handsome Family – Drunk By Noon
Billie Holiday; Sy Oliver & His Orchestra – Gimme A Pigfoot And A Bottle Of Beer
Norah Jones – The Long Way Home
Fat Boys – All You Can Eat
Johnny Flynn – Leftovers
Trampled by Turtles – November
Iggy Pop – Candy
Patsy Cline – Hungry For Love
Fountains Of Wayne – Mexican Wine
Nat Kendrick & The Swans – Mashed Potatoes
The Flaming Lips – She Don’t Use Jelly
Cannonball Adderley – Autumn Leaves
Lou Donaldson Quartet – Wiskey Drinkin’ Woman
The J.B.’s – Givin’ Up Food For Funk
Bob Marley & The Wailers – Give Thanks & Praises
Thelonious Monk – Stuffy Turkey
Loretta Lynn – Wine, Women And Song
Andrew Bird – Measuring Cups
Lou Reed – Perfect Day
Nat King Cole – Save The Bones For Henry Jones (‘Cause Henry Don’t Eat No Meat)
Dee Dee Sharp – Mashed Potato Time
Jelly Roll Morton – Big Fat Ham
The Clash – Lost in the Supermarket – Remastered
Hank Williams – Jambalaya (On The Bayou)
The Smashing Pumpkins – Mayonaise – Remastered
Cab Calloway & His Orchestra – Everybody Eats When They Come to My House
Charles Mingus – Eat That Chicken
B.B. King – Troubles, Troubles, Troubles
Drive-By Truckers – The Thanksgiving Filter
Weezer – Pork And Beans
Bing Crosby – I’ve Got Plenty To Be Thankful For
Adam Sandler – The Thanksgiving Song
Booker T. & the M.G.’s – My Sweet Potato
The California Honeydrops – Pumpkin Pie
Little Eva – Let’s Turkey Trot
Quincy Jones – Groovy Gravy
Otis Redding – I Want to Thank You
The Avett Brothers – Nothing Short of Thankful
Louis Jordan & His Tympany Five – Beans And Corn Bread
Sarah Vaughan – Black Coffee
Golden Smog – Pecan Pie
Jr. Walker & The All Stars – Home Cookin’
Edward Sharpe & The Magnetic Zeros – Home
Neil Young – Harvest Moon
Sam Cooke – Bring It On Home To Me
Louis Prima; Keely Smith; Sam Butera & The Witnesses – Banana Split For My Baby – Remastered
Dale Watson – My Baby Make Me Gravy
Joe Diffie – Good Brown Gravy
James Brown – (Do The) Mashed Potatoes
Sly & The Family Stone – Thank You (Falettinme Be Mice Elf Agin) – Single Version
Paul Desmond – Autumn Leaves
Bob Marley & The Wailers – One Love / People Get Ready – Medley
Ernie K-Doe – Mother-In-Law

Add A New Git Remote Repository

Working with different clients I often end up with multiple Git remote repositories. When I start a new project with a client I create the initial repository in my Gitlab called origin and if the time comes I will add another remote repository in the client environment with the name of the client clientABC. This is how to add a new Git remote repository in addition to your default Git repository.

Add the new remote repository using the git remote add command.
git remote add clientABC https://gitlab.com/clientABC/exampl-repo.git

Then when pushing or pulling from the different remote repositories make sure to include the appropriate remote name when running the commands. For example, when pulling from origin dev branch use git pull origin dev. And if you want to push your changes up to the new client remote use git push clientABC dev.

October Snowstorm

It started snowing again today. At first the snow was a light snow that reminded me of “Stranger Things” other world type of snow. But now it’s turned into a full on snow storm with a forecasted total of 6 inches accumulated when it’s all over. In Minnesota six inches isn’t out of the ordinary, but on October 20th it’s pretty much out of the norm. As a kid I don’t remember it snowing this early in the year, except for the big Halloween blizzard of 1991 which any Minnesotan over the age of 35 will gladly tell you about.

I was curious about how early it usually snows in Minnesota so I looked back over some weather timelines as well as my own social media feeds and found that over past couple of years it has snowed early in October – almost like clockwork. They’ve all been pretty light but snow that doesn’t stick around when it’s this early in the year but seeing snow in October can really be brutal on your mood.

List of Minnesota snow records

During my in depth research of early snowfalls I found this table on Wikipedia with the list of Minnesota weather records. Here’s the snow records with the earliest recorded snowfall being August 31.

Event[3] Measurement Date Location
Earliest recorded snow[1] Trace August 31, 1949 Duluth
Earliest measurable snow 0.3 inch (1 cm) September 14, 1964 International Falls
Latest recorded snow 1.5 inches (4 cm) June 4, 1935 Mizpah
Most snow, 24 hours 36 inches (91 cm) January 7, 1994 Lake County
Most snow, one storm 47 inches (119 cm) January 6–8, 1994 Lake County
Most snow, one month[7] 66 inches (168 cm) March, 1965 Collegeville
Most snow, season 170 inches (432 cm) 1949 – 1950 Grand Portage State Park
Deepest snowpack[7] 75 inches (191 cm) March 28, 1950 Pigeon River Bridge
Most fatalities, winter storm[8] up to 200 January 12–13, 1888 Statewide


As it’s “Stranger Things” snowing out I’m listening to Cattails by Big Thief. It’s has a very nice mellow sound that goes great with this kind of weather.