2020: Less gas

In 2020, I got less gas.

As a result of the global pandemic, I didn’t drive my car, a 2013 Mini Cooper Clubman, much. My last regular work-week was at the end of February. I then flew to a work conference during the first week of March, returned via train, and immediately began working from home. A college course I teach went to online learning. Even occasional short trips to the grocery store were usually made in my wife’s SUV, so we could stock up and therefore go less often.

Driving picked up toward the end of the year. After buying a new house about 12 miles from the old one, I made many trips between the two, doing work. I also made one 460 mile roundtrip to my hometown.


Fuel consumption and miles driven dropped about 40 percent between 2019 and 2020, and owing to lower gas prices, money spent dropped by more than half. Average miles-per-gallon in 2020 was higher than it’s been over the life of the car. I filled the tank 23 times in 2019, but only 13 in 2020.

Note: Some data was lost spanning the end of 2019 and beginning of 2020. See Methodology section for details.

Detailed stats

My car’s fuel consumption dropped more than 40 percent — from nearly 300 gallons in 2019 to about 169 in 2020. In the six full years I’d owned my car prior to 2020, I’d never bought less than 200 gallons.

My total expenses for gas dropped by about half, from $773 in 2019 to $383 in 2020. The quantity I bought only went down 40%, but the average price dropped too — I paid an average of $2.58 / gallon in 2019, but only $2.27 / gallon in 2020. Between 2014 and 2019, I’d never paid less than $550 to fill the tank for the year.

I drove about 4,000 fewer miles. In 2019, I drove about 9,485 miles, but in 2020 I drove just 5,435. This again is a significant drop-off during the life of the car. Between 2014 and 2019, I’d never driven under 7,000 miles in a year.

My average miles-per-gallon went up as well. In 2020 I got about 32.33 miles per gallon. I’d never cracked 32 before, though 2019 hit 31.96 mpg. This can likely be attributed to a greater percentage of my miles being long-distance driving. In 2020, more than 40% of my total miles driven can be attributed to trips to the college I teach at and the one long trip to my hometown. In 2019 long trips accounted for less than 40% of the total miles driven.


I most often fill the tank when it’s nearly empty. In 128 out of 136 purchases, the average amount purchased was 13.28 gallons, with a standard deviation of .69.

I try to log all my gas purchases, and am mostly successful. Over the 7+ years I’ve owned my current car, I’ve logged information for 136 fuel purchases. Most of these include date, gallons purchased, price per gallon and current odometer reading.

However, due to a technology error1, information was lost for an assumed eight fill-ups between 2019–09–21 and 2020–02–05.

Reconstructing the missing data

I am assuming eight purchases were lost for two reasons:

  1. I’m able to identify eight gas station purchases during the missing time period in credit card records.
  2. The odometer readings before and after the gap, divided by the size of the gap, yields a reasonable average mileage.

I was able to recover the mileage only for three of these events, so the odometer gap is only five purchases. This gap is 2,336 miles — dividing by six (that’s five unknown fill-ups) gets 389.3 miles. This would be in the upper 20th percentile of all known distances driven on one tank of gas. Attempting to distribute the 2,336 miles over four fill-ups gets more than 467 miles per tank, which would be in the 90th percentile.

Estimating amount purchased

For the eight transactions, I simply assumed the amount of gas purchased each time was the average amount I’d purchased over the life of the car — 13.275 gallons. As mentioned, this number is fairly stable — a standard deviation of about .7 gallons.

Estimating price per gallon

From the credit card records, I had the total amount of the purchase. I divided this by the estimated amount purchased.

Estimating odometer reading

As I said, I was able to recover mileage for three of the eight fill-ups. Therefore the gap where the mileage is unknown is five. I evenly distributed the total miles driven among these five, resulting in an odometer increase of 389 miles for each fill-up.

Effect of data reconstruction

Five of the eight purchases missing data were in 2019, with the balance in 2020.

The 66.36 estimated gallons purchased is 22.2 percent of the total amount of gas in 2019 (including the estimated amount). For 2020, the 39.8 estimated gallons represent 23.6 percent of the total.

The mileage and gallons work out to 29.3 miles per gallon for the estimated data. This would be significantly lower than average — just under the 30th percentile for the known 2019 data and just under the 20th percentile for the known 2020 data.

  1. I created a Shortcut on my iPhone that would fill in the date and ask me for the gallons, price and mileage, then send this info to a CSV file in Dropbox. Somehow the connection was lost so that the shortcut appeared to work correctly but the data was not saved in the file.  ↩

2020 in review

Bought a new house. Worked from it (and the old house) a lot. Oldest kid started kindergarten (remotely). Went on a couple trips. That’s the highlights.

New house

Most prominently, my family bought a new house. It’s only about 8 miles as the crow flies from the old house. The process was a struggle, partly because two kids and a global pandemic makes it difficult to visit as many options as easily as we’d have liked. Partly because the market was extremely hot — we were outbid on the first house we made an offer on, and we’d offered asking price (or maybe even more, I forget). We also had at least one showing canceled because the buyer accepted an offer between the time we scheduled it and when it was scheduled for, and we visited a house for a showing that had — unbeknownst to us and our realtor — already been sold shortly before.

Still, we eventually found a great one that backs onto common ground woods and a creek, with more woods behind it. We’ve seen deer and turkey, and a wide variety of birds, among other animals. Collected some neat rocks along the creek. We’re pretty happy with it.

Which leaves the old house, which has been a bit of a pain to deal with. I haven’t had much luck in finding people to do some fairly light work that needs done before putting it on the market, so I’ve been getting done what I can myself in bits and pieces. Things like resealing the basement walls, patching and painting, etc. Probably the biggest bits are replacing light fixtures, replacing carpet upstairs, and removing sticky vinyl tile from the bathroom floor to reveal — as our realtor suspected — the original 1940s tile floor in great condition underneath. Great condition other than needing to remove all the adhesive, clean and probably regrout the whole thing. I hope I will not be writing about the old house in the 2021 in review other than to say we sold it.


Went on a couple trips this year.

In January we drove to Minnesota for a funeral in my wife’s family.

At the beginning of March, I went to New Orleans for the 2020 NICAR convention. There had been some question leading up to it whether or not it would happen, but the organizers were pretty consistent in saying it would. And it did.

The conference itself was fine. I’d never been to New Orleans. I flew down, wandered around the city a bit as usual, before the conference. I led sessions on GitHub and file organization, as well as helping out in a sort of “office hours”-type session. Played Wingspan with some folks one night at the hotel bar. The party was at the aquarium on the waterfront, which was quite nice.

Power line towers receding across a lake

After the conference, I took Amtrak back to St. Louis, via Chicago. I visited with Pete in Chicago and ate, if I recall correctly, my last meal in a restaurant in 2020 — March 9 at Breakfast House. I also managed to find Anderson Pens’ Chicago location (new to me). It would close (“temporarily” — but it’s still closed) a little more than a week later.

When I arrived home, I asked my boss whether he thought it might be best if I worked from home for a week, just as a precaution. Later that evening I got an email announcement that a conference attendee had tested positive (another would follow several days later, but that was the last we heard of spread related to the conference). And shortly after that, everyone was working from home.

Other than that, I haven’t been much of anywhere. I took the kids for a drive through Lone Elk Park but we stayed in the car. I also traveled back to Danville for an estate sale at my grandparents’ house, but I went by myself.


(Other than surviving a global pandemic). My singing group, the Greenleaf Singers put on a concert on January 5. And then that was it. We haven’t been able to sing together since. Though the St. Louis Renaissance Faire still went on, we didn’t perform. The Christmas concerts we normally sing were cancelled. I’ve made the least music this year in at least a decade, and I miss it so much. Our group has gotten together on Zoom a few times, just to hang out, but the singing doesn’t work so well.

Rock with fossils

Photography has been on the upswing, especially since buying the new house. The variety of things to see, plants and animals in the woods and along the creek is great for taking pictures.

The kids and I have been down to walk around the creek a few times to go rockhounding. There are some fossils and other interesting rocks to be found, and the creek floods quite a bit so I think the rocks should turn over a fair amount.

A male cardinal landing on a feeder

A very new hobby (like within the past few days) is birding. After noticing the large variety of birds at the new house, I anticipated getting a feeder at some point. Then I saw a sale on 20 lb. bags of mixed feed for $5 just after Christmas, and jumped on it. I hung a tube feeder, which was successful, and then built a crude platform feeder for larger birds, which has also been ok so far. This is in turn allowing for some fantastic photos (I set the feeders up not far from a convenient spot) and even live-streaming.

Geekway to the West was canceled this year, so we didn’t get to go to that. Consequently (and between moving, et al.) we haven’t played a lot of games this year. We did buy Wingspan for Tabletop Simulator and play through that a couple times.


I taught data journalism at SIU for the second time. It went well, despite meeting virtually for the second half. For the upcoming spring semester I’ll be teaching that again as well as a visual communication course.


It was, no surprise, largely focused on the pandemic. I built a dashboard and a bot for our Slack that helps broadcast the stats to our reporters daily. Also worked on the election, of course. Flew the drone a couple times, including at a drive-in open for business during the pandemic. Among many many other things.

I think I’ve been into the newsroom a total of three or four times since the end of February.


Some media I enjoyed this year, in no particular order:

The St. Louis Symphony Orchestra played Beethoven’s 9th. Enough said.

Chris Thile and Andrew Bird played an incredibly joyful rendition of ‘Blue Skies’ on Live From Here. Also Live From Here got canceled, which is still disappointing to me.

I greatly enjoyed the streamed Sondheim 90th Birthday Concert.

Watched the filmed version of Hamilton on Disney+.

Speaking of streaming services, when we moved, we canceled DirecTV and got Hulu’s live TV service. So far, so good.

I watched the Cardinals play on opening day, which I’ve always enjoyed but was particularly significant this year amid the uncertainty.

I highly enjoyed AppleTV’s Central Park animated series, as well as Ted Lasso. My kids have also enjoyed Helpsters.

I didn’t read a whole lot. I borrowed the biography Weird Al: Seriously, and The Office: The Untold Story of the Greatest Sitcom of the 2000s: An Oral History from the library.

I watched a lot of YouTube:

  • Cracking the Cryptic’s sudoku, which I’ve been enjoying the challenge of attempting every so often. The Miracle Sudoku is what introduced me and many other people to the channel.
  • Late last year, we’d started watching the British comedy game show Taskmaster, and continued that as they posted new episodes.
  • Adam Savage, formerly of Mythbusters, has been doing a fantastic job during the pandemic on his channel Tested.

Siri and alarms

This is probably common enough knowledge if you use Siri often, but I don’t so here I am: If you ask Siri, at least on HomePod, “how long until my next alarm”, the answer will include alarms that are turned off.

This morning, my kid set an alarm for his next school meeting, but got the time wrong. I told Siri to “cancel the alarm”. Siri confirmed the alarm had been turned off. Then my kid correctly set an alarm.

A while later, my kid asked how long until his class. So we asked Siri “how long until my alarm”. Siri gave an incorrect time. Took me a minute to figure out the time was until the first, canceled alarm.

I asked Siri “what are my alarms”, and it listed both (but confirmed the incorrect one was turned off). I deleted the incorrect one.

Now asking “how long until my alarm” gives the right answer. It was confusing to me that asking “how long until my alarm” would include an alarm that’s turned off, but maybe there are situations where that would make sense.

A new feature for Tweetnest

I’ve been using Tweetnest to download and archive my tweets for some time now. I set it up some time ago, and generally, it just runs. I think I’ve had to go reboot the cronjob it uses to collect new tweets once or twice. I just added a feature to automate finding tweets “on this day” from prior years.


Tweetnest, if you’re unfamiliar, is a self-hosted app to collect all your tweets and present them nicely in a way that’s separate from Twitter’s interface. It collects everything into a mySQL database, and is written in PHP. It’s nice to have a backup of Tweets kept separate from Twitter.

The main page just displays recent tweets, but it also lets you search, and has month and day pages. It’s a nice, calm interface for exploring or searching old Tweets of yours, which comes in more handy than you’d think.

I have been using Micro.blog more, through this site, which solves some of those problems. But even if I left Twitter today, having this backup and nice interface to it would be valuable, so I figured it was worth doing a little writeup on.

Ok, so what’s the new feature?

As I said I haven’t really touched the site since installing it, and mostly it works fine. But I recently went in a made a tweak, which is the impetus for this post.

One thing I’ve been doing recently is checking out my Tweets “on this day” to see what was going on last year, five years ago, even a decade ago. Twitter doesn’t have a function for this natively, and neither does Tweetnest.

I started out just by visiting the pages on Tweetnest sequentially. The daily page URLs are formatted year/month/day, so you can visit last year’s pretty easily, then just change the year in the URL, see the new ones, and so on. But this is tedious and occasionally there are no Tweets on a given day so it’s a waste of time.

I quickly tired of that, and wrote a little Keyboard Maestro macro to get the current date, format the URL properly, and open tabs in my browser, one for each year between one year ago and when my archive starts in 2008. This is pretty good, but it only works on desktop, not mobile, and it still suffers from the case when there are no tweets on a day (it just opens a tab that says “No tweets here!”).

Finally, I decided to create a proper solution. I built a page for the site that gets the current day and month, then queries the database for tweets that happened today, and presents them.

The code

This was pretty simple and required no innovation on my part. I just modified the code for a specific day to remove the year, and added logic to get the date from the current date, instead of the URL. It’s functional, but since I don’t know PHP it’s quite possible I’ve done something wrong. Here’s the query:

$day = date("d");
$month = date("m");


query("SELECT `".DTP."tweets`.*, `".DTP."tweetusers`.`screenname`, `".DTP."tweetusers`.`realname`, `".DTP."tweetusers`.`profileimage` FROM `".DTP."tweets` LEFT JOIN `".DTP."tweetusers` ON `".DTP."tweets`.`userid` = `".DTP."tweetusers`.`userid` WHERE MONTH(FROM_UNIXTIME(`time`" . DB_OFFSET . ")) = '" . s($month) . "' AND DAY(FROM_UNIXTIME(`time`" . DB_OFFSET . ")) = '" . s($day) . "' AND `".DTP."tweets`.`hidden` = 0 ORDER BY `".DTP."tweets`.`time` DESC");<br>

Next, I modified the .htaccess file to run the new php file at a particular URL (I called mine “/today”), and the inc/html.php file to include a link to “/today” in the sidebar. And that’s that. Now I can visit that link and see all the tweets posted through the years on a single page. You can see my modifications on my Github fork of the project.

Other enhancements

One other thing about Tweetnest is that it hasn’t been officially updated to include the new, longer Tweets. So some folks who use it have modified it to take advantage of those. You can see those changes in my previous commit, or in various issues in the main repository.

One shortcoming

A thing I noticed while working on this was that, because I hadn’t made the long-tweets upgrade until now, many prior tweets are truncated (Twitter increased the length at the end of 2017).

One suggestion in the Github issues was to remove all tweets since the lengthening and re-import them.

Tweetnest has two ways of importing tweets: The loadtweets.php file and the loadarchive.php file.

Loadtweets is the thing that runs on a cronjob, so usually it’s only grabbing a handful of tweets at a time. It uses Twitter’s API to get tweets, and so is limited to 3,200. This, unfortunately, isn’t quite far enough to get all my Tweets since the change (it also hits a memory error when trying to load that many).

Loadarchive was built to consume json files you can download from Twitter that contain your archive. Twitter limits public access to tweets to the last 3,200, but it will compile your data and let you download all of your tweets.

Unfortunately, the format of this archive has changed since this function was written for Tweetnest. I attempted this route, but ran into a couple roadblocks:

  1. The link to the tweet on Twitter is missing its username. Tweetnest generates the Tweet, but wherever it’s trying to grab the username from to generate the link is missing, and so the URL it links to is just missing a piece.
  2. Retweets are messed up. In prior archives (and in current API calls) you seem to get much more information about retweets than you do in the archive. And so when you load tweets from the archive, Retweets aren’t able to get the original tweet.

There are probably ways around both of these problems for someone more versed in PHP and/or Twitter’s API/data than I am, but since new tweets should come in at their full length and new retweets are ok, it’s not vital to fix these problems. (If you do tackle this, please let me know).


Tweetnest is pretty great, especially for some free software written nearly a decade ago. It’s nice to be able to hack on things and add features that make your life slightly easier.

2018 in review

The biggest change in the new year of course is the birth of my second child. I also applied for and was chosen to teach a data journalism class at SIU-Carbondale beginning in the Spring. Other than that, I don’t know. After reviewing the year, I mostly just feel exhausted.


The aforementioned child was born by the time February was here, so we spent most of the year adjusting to raising two kids instead of one.


Took mostly small trips, in town.

In April, we visited the St. Louis Science Center during an exhibit featuring the command module Columbia from the Apollo 11 mission. It was a surprisingly moving experience to be in the presence of it.

Also went to a Cardinals game with my Dad in April, to the Zoo in May, the Transportation Museum in June, a Cardinals game in June, Grant’s Farm and the Arch in August, the Arch again in September, and the Garden Glow at the Botanical Garden in December.

A couple larger trips my family took were to take the new baby to visit my family in May, another trip back there in Christmas and a trip to Carbondale, Ill. to fill out some paperwork for the job, when we also took in a football game and spent a day at Giant City State Park.

In June I also stopped by Chicago for a day on my way home from a work conference and got to hang out with a friend and his family.

Home Improvement

Didn’t do much to our house this year, unfortunately. Did clean out the back fence line again this fall, and dug out an old lava-rock-lined flower bed on the north side of the lot. Also bought a new battery-powered lawnmower and weed trimmer, which are working out well.


The singing with Greenleaf continues, beginning with a concert in January, as well as singing a bit at one of our member’s weddings. We also performed at the Renaissance Faire in Wentzville for three weekends, the concert at Eliot and our own concert in December. We finally sold tickets online for the first time for our own concert and that seemed to work well.

In February, I made a weather status indicator out of a Raspberry Pi and a Blinkt! module. Later in the month, I used a Scroll pHat HD and a Pi to animate a customizeable rainstorm. Inspired by the movie ‘Desk Set’ and its 1950s computer mainframe prop, I also coded up a version of that.

I think I played exactly one round of golf this year, at the Prairies in Cahokia.

In May, Pam and I went to “Geekway to the West”, a board game convention in St. Charles. They have a game library with all different kinds, vendors and publishers running demos, and lots of door prizes. Between Thursday and Sunday, I played 22 games. It was a lot of fun — we plan on going back again this year.

In August, I managed to finally use some scrap leather I bought at the Renaissance Faire the previous year to make a lcase for my AirPods. Turned out pretty good, and it was fun making it, although I haven’t done anything else with it.

In August, I also went bowling for the first time in a half-decade.

In September, I somehow got it in my head to go thrift store hunting. The first time out went pretty well, yielding a Gitman Bros. blue oxford shirt, a Land’s End pink OCBD, a Brooks Bros. broadcloth shirt and some Banana Republic Traveler Jeans. Around the same time I also nabbed a deal on a pair of new Levi’s for $13. Later in the year I got a couple new Jos. A. Bank corduroy jackets for $20 each, so I was feeling pretty well dressed by the end of the year.

In October, Pam and I went to a board game cafe, Pieces. It was a good time. We played Jaipur, Hive, Medieval Academy and Potion Explosion.

I keep on taking pictures. I bought a used Rokinon 85mm f1.4 lens, which I really enjoy using. Also got a 12mm f2 for Christmas this year, so I’ll be trying that out more too.


A NYT article in early January led me to ‘Force Majeure’ a weird, dark movie about relationships in a Swedish family on a ski trip. It was good, and one of those splinter-in-your-brain-type movies. It was a 2014 movie, so nothing new, but new to me.

While in Chicago for a work trip, I got to multitask and go to a Mac Power Users meetup and meet David Sparks, Katie Floyd, and Kourosh Dini, among many other fans of the show. It was a good time.

I watched ‘Jesus Christ Superstar Live’ on NBC on Easter Sunday. It was quite good.

Also in April, I was lucky enough to win the lottery to see Hamilton at the Fox. Pam and I went, and it exceeded expectations. Just incredible.

In August, I got to go see a couple friends performing in R-S Theatrics’ Light in the Piazza, which was delightful. I wasn’t familiar with the show or the soundtrack, and it was quite good.

In October, the “Rushmore of Nerdcore” tour came to the Firebird, with Schaffer the Darklord, Mega Ran, MC Lars and MC Frontalot. I heard MC Frontalot on his last trip through St. Louis, and I’m glad I went again.

I saw the Coen Bros’. Ballad of Buster Scruggs when it came out on Netflix. Not without its issues, but beautifully shot, and thought-provoking.

Finally, in December I happened to catch that TCM was playing White Christmas in a few theaters on a couple nights, so Pam and I went to see that. She really enjoys the movie, and it was nice to see it in a theater.


My first restaurant meal in 2018, according to my Twitter, was a Courtesy Diner Slinger, so it was pretty much all downhill from there.

I also made it to Squatters Cafe several more times before it closed toward the end of the year. The chef is opening a new restaurant nearby, so I’m looking forward to that.

On the aforementioned Chicago work trip, I went to Portillo’s for the first time. I also went to Eataly, which was a couple blocks down from the hotel and Shake Shack a couple times, which was right across the street.

In September I got to take a VIP tour of the Schlafly Brewhouse downtown. It was interesting to see behind the scenes and in the basement, as well as taste some in-production stuff.

I made Krupnik again, and it turned out great. I took some to one of the Greenleaf cast parties and it seemed to be a hit.

I made some chili for our work chili cookoff in November. It did not win, but I thought it was pretty good. Got to make chili powder from scratch, too.

On Black Friday I managed to nab some bottles of 2018 Bourbon County Barrel Stout at Schnucks, so now I have bottles going back to 2015. Due to accidentally getting some extra 2017, I also cracked open a bottle of that, and it’s delicious, as expected.


Got a new boss, got a new (side) job. Flew the drone a bunch, did a bunch of projects.

New Job

I saw an opening posted for a temporary part-time person to teach a data journalism class at Southern Illinois University Carbondale, where I earned my degree from. It sounded like a good fit, so I applied, and I got it. I’ve been preparing for it ever since, and the first class is in two weeks. I’ll be commuting down there one day a week. So we’ll see how that goes. I’m excited.


Worked on lots of projects this year: A 10-year look back at the Great Recession, a major project on the 25th anniversary of the Flood of 93, a neat little graphic tracing the path of a baseball at Busch Stadium, our election night graphics, a investigative piece on Northside Regeneration, and a year-end Best of 2018 project.

And those are mostly just the larger projects, let alone the analyses, maps and daily graphics, tools, etc.


In March, NICAR was in Chicago. It was good, and more of the same. I helped lead a session on “Learn From My Fail.”

In June, I also got a spot at SRCCON in Minneapolis. A bit higher-level/more conceptual than NICAR is (also smaller), it was great to be able to take a step back for a few days and focus a bit wider than usual.


We finally got the drone and all the approvals and everything we needed to fly this year, so I got to take it out several times. I flew mostly in St. Louis, taking pictures of the new NGA site, the former Pruitt-Igoe site and St. Louis’ water towers. I also flew at a house that was flooded in 1993, though you couldn’t see the river from the house using the drone. I got it out over the Mississippi River to take some photos and video of the Merchants Bridge. And I took it out after a snowfall in December and got some footage and photos of the Mississippi River from the Illinois side just south of Chain of Rocks Bridge.

I was also on our radio talkshow in May to talk about the drone and how we’d use it, and again in July, this time live, to talk about Temporary Flight Restrictions in place around the President’s visit.

Games I played at Geekway to the West:

Atlantis rising
Rising sun

El Dorado
Cottage Garden
Rising Sun
Whistle Stop

Indian Summer
The Networks
Palace of Mad King Ludwig
The Thing: Infection at outpost 13
Bottom of the Ninth
Settlers of Catan: Dice

New York Slice