All Posts

A new woodworking space

We moved into a new house at the beginning of the year and my woodworking shop is getting moved from a basement to the garage. It took a while to get set up, but my tool wall did speed things up quite a bit as I hoped. I’ve got quite a bit more storage too. The garage had one set of lower cabinets and some upper cabinets that I am keeping. A friend of mine was also getting rid of some cabinets with drawers and a corner cabinet with a Lazy Susan that I snagged. I put it all together on some pressure treated 2×4’s that I cut and shimmed so the whole thing was level since the garage floor slopes. I made a top out of two sheets of 3/4″ OSB, topped that with the backside of some 1/4″ paneling that was left, and ripped some 2×4’s to use as edging. All in all, it turned out pretty great!

To break in the new space I made a coat hook with a shelf for the new entryway.

Server Testing via Visual Regression Testing

One of my least favorite tasks at work is testing new production servers. The team that provisions them doesn’t use any automated tools and manually sets up each one by hand. Unfortunately, this usually leads to missed settings and configurations, so we have to manually test several of our important systems on each server before signing off on them.

While I was working on it this time, I started thinking about ways that I could automate the process on our end. It basically is just browsing to a specific list of web pages we maintain on multiple servers and verifying everything looks the same on our current in-use production servers. Thinking about it, it sounded awfully similar to visual regression testing.

So I wrote up a quick node.js program that takes an array of servers to compare, an array of pages you want to compare, and the server you want to compare against. First, it generated screenshots for each page on the “baseline” server. Then, it generates a screenshot of each page on every other server and compares them to the baseline using the Pixelmatch library. If it finds more than 10 pixels of difference in the screenshot, it will report out to the console and generate a “Diff” screenshot that highlights the differences.

Here is what it looks like when searching for “tea” on both and

For GVSU, I can now use this to verify all the servers in a few seconds instead of a few minutes. I can check our homepage, pages from the cms we manage, and some custom pages I created just for this. For example, there often are issues with a charting library we use, so I created a page that is just a static chart that I can now hit with the automated tool to verify they are working.

I threw the script up on Github in case it might be useful for anyone else: If you find it useful, I’d love to hear about it!

My Goal for 2020 – Simplify

I have really struggled to set goals for this year – more than any year I can remember to be honest. The past year was really busy, and at times I almost felt weighed down by the goals I set.

So far, it’s looking like this year isn’t going to slow down either. We moved into our new house just a few weeks ago. Between the shed that needs to become an office, the basement that needs to be finished, and 10 acres of land to figure out how take care, it can be a little overwhelming. Couple that with the fact I would rather spend my free time with my 18-month old, and setting a bunch of ambitious goals just doesn’t seem like the right thing for this year.

But I wanted to do something, so I decided I am simplifying and picking just one goal:

I will weigh less than 200 pounds at the end of the year.

I’ve struggled with my weight for a long time. I hate talking about it, and I feel silly even writing it here now. But the older I get the more important my health is becoming to me, and the harder it is to maintain.

Now let’s be honest, it’s not that I don’t have other things I want to do this year. I’m really excited about planting a big garden at the new house and having more free weekends once things get settled to do woodworking and brew beer and all the other things I love to do.

But as far as “goals” go, that’s it. When I write my recap at the end of the year, it will say I succeeded or failed based purely on the scale. Hopefully, that will be the motivation I need to actually get it done.

Goal Recap 2019

Well, the end of the year and start of this one has been a blur. We recently moved back to our hometown Dowagiac, MI. I’m really excited to be here, but it has been hectic! We found the house in November and purchased it, listed, and sold our old house all before Christmas. We spent almost all of the Holiday break getting the new house ready and moved in early January. Needless to say, the annual goal recap/setting yearly goals took a bit of a backseat. So here goes, a recap of how I did with my goals for last year:

Learn German

I didn’t meet all my goals, but I did learn enough that when we decided to go to Germany in the fall – which wasn’t on the radar at the beginning of the year, it went pretty well. I managed to get through a conversation with a stranger while waiting for a train, which was a really cool experience.

Duolingo: I completed my lessons for 285 days out of the year. Not the goal. but not too shabby either.

iTalki Lessons: This one I missed entirely, but they say speaking/hearing a language is the best way to learn it, so I think the days I spent in Germany offset it a little right?

German Journal: This one I tried and did for about a month before giving it up. I think it’s a good idea, but I just didn’t know enough German to make it practical. The five-minute journal was really the 15-30 minute journal, and it is was just too much time to fit into my day. I liked it, it just wasn’t practical.

Get in Shape

This went well although differently than planned. I lost 15 pounds and kept it off all year. I have struggled with losing weight quickly only to gain it back again, so I was happy that I was able to make changes that resulted in a slow but consistent weight change. Having said that, I could still stand to work out more regularly at home and lose some more weight, so I guess it’s a bit of a wash as far as meeting my goals.

Morning Routine

Honestly, this was a total fail, I just couldn’t get into a routine. Can’t win them all right?

Meaningful Free Time

I was pretty happy with this category, although I didn’t complete everything I wanted to. I feel like I spent most of my free time doing something I enjoyed and not wasting it, which was really the goal.

This one also took a turn, my lathe broke early in the year, but I did still do some woodworking. A couple of cutting boards, some wood toys, and playing around with a scroll saw I picked up.

I only brewed twice last year, but I am mostly okay with that. The beer turned out well and honestly, I had a lot of beer stockpiled from past years and with us moving I wanted to get the ridiculous number of beers we have to move down. Even only brewing twice this year we still moved almost a hundred bottles of beer and cider, so I think it was for the best. I didn’t try an all-grain batch but I did find somewhere new to keep my recipes, although I haven’t finished adding them:

Open Source
Finally, somewhere I actually did well! I had a lot of fun contributing to the Gutenberg editor last year, and it really helped me learn a lot too. I also completed the Hacktoberfest challenge for the first time after starting and failing to the last two years, so I was pretty happy with that. I had 47 contributions last year according to Github, so I would call that a win.

This started off well, I updated almost weekly for a few months before I fell off it again. Definitely something I need to work on doing a better job of moderating, it is either all or nothing.

Conference: php[world] 2019

I spent last week outside Washington D.C. at php[world] 2019. It was the first PHP specific conference I have been to and it was great. I attended the whole day workshop on testing in PHP and learned a ton. If you get a chance to attend one of Steve Grunwell’s presentations it’s definitely worth your time. He mentioned he will be presenting a similar talk at WordCamp US later this week. If you are attending, be sure to check it out:

The next two days were the standard hour-long presentations on various topics. Some of my favorites:

(Note: I will add links to the videos when they become publicly available.)

It is also the 25th anniversary of PHP as a language and there was a lot of talk about why and how PHP got where it is. There was a shared proudness that PHP came about not as a well-planned exercise in computer science. Instead, it was as a community of people just trying to get things done. That is why you will find things like mismatched naming conventions and duplicated functionality. While PHP gets complaints about those things today, it also is the defining reason it is so popular. It was a really interesting perspective on the evolution of a programming language over time.

I do have to say that the area where I stayed was a bit disappointing. Just a lot of chain restaurants and not much to do nearby. Having said that, I stopped by the Steven F. Udvar-Hazy Center by the airport before I flew out and it was amazing! I had never heard of it before, but it is a hangar by the Dulles airport that is part of the National Air and Space Museum. I left myself an hour and wish I had more time there. It was huge, there were over 200 planes including an SR-71 Blackbird and a Concorde. Oh yeah, and you could walk right up to the Discovery shuttle! (See header image) It was free and definitely worth your time if you are nearby.

Overall, it was a really good conference. I also learned that there is a similar conference in February called SunshinePHP held in Florida. As one of the Michiganders looking outside my window today and seeing the first snowfall, I kind of wish I had chosen that one instead…