Graceful Shutdown of a Go Service

I recently spent some time figuring out how to gracefully shut down a Go service. The goal was to allow in-flight transactions to complete successfully before shutting down, but return Unavailable for any new requests. I found the solution to be fairly straightforward for Linux, but a little bit more tricky for Windows, specifically when running in a Windows Docker container.

General solution for handling termination signals (Linux/Darwin)

For most use cases, the os/signal package works for capturing termination signals:

Read more →

GopherCon 2019

GopherCon 2019

Another year and another GopherCon, this time in sunny San Diego! As usual, there were a lot of high quality talks across a breadth of subjects. I highly recommend browsing through the GopherCon videos on YouTube, but I’ll highlight what I thought were the interesting bits below.

The last year or so has seen a LOT of discussion around dependency management for Go, particularly around dep and Go Modules (formerly vgo). Previously, dep was the “official experiment” for dependency management for Go, but was superceded by a proof of concept called vgo that became what we now know as Go Modules. Go Modules is being actively developed in the Go toolchain and is the future of dependency management for Go. While dep is a fine choice, it’s clear that the Go team will be pushing Go Modules hard. This was made clear in Russ Cox’s introductory talk regarding the future of Go 2.0. I’ve always been more in the dep camp, but a lot of my concerns were alleviated by what I heard from Russ. Also, there was a fantastic talk later on by Aaron Schlesinger about Athens, a free, open source mirror for Go Modules. It seems to me that Go Modules will be in a good place to take over dependency management for Go in the near future.

Read more →

Tiled in Unity using SuperTiled2Unity

Tiled in Unity using SuperTiled2Unity

My brother and I are in the early stages of development and design for a game we are making together. He’s the genius artist and I’m the programmer guy. Everything in-between we share, including map making. There’s an excellent free tool called Tiled that can be used to make 2D maps. It supports layering, automapping, animations, and even collision boundaries. In short, it’s a fantastic tool for creating 2D maps.

Unity is the game engine we are using. It’s very popular, full featured, has an excellent store for assets/plugins, and, most important of all, it’s free for small developers. We wanted to see if we could use Tiled maps in our Unity project and I was completely willing to write a script to load an exported Tiled map into our project. Turns out, there is already a fantastic free tool (you can make a donation to support the author) for doing just this. SuperTiled2Unity is a plugin for Unity that allows you to just drag and drop your Tiled map file and textures into the project assets folder and they get automagically imported.

Read more →

Hackathon: Generating Fake Test Data with Python

Hackathon: Generating Fake Test Data with Python

We had yet another hackathon at work. This time around, I wanted to do something with Python. Since we have a gap in test data at work, I decided to create a script to generate oodles of fake test data using a Python library called Faker. It has a number of default providers for generating different types of data. It can generate fake addresses, names, dates, phone numbers, etc.

This simple code block:

Read more →

Hackathon: Tello Drone, Go, and Lua

Hackathon: Tello Drone, Go, and Lua

When the theme for our latest company hackathon was revealed to be “Need for Speed”, I went straight to Best Buy after work and picked up a DJI Tello drone. I had been wanting one ever since I went to GopherCon and saw the presentation by Ron Evans where he used Gobot and GoCV to make a Tello drone follow his friend’s face around. Now that I had a drone, I needed to figure out what to do with it.

Read more →

Multi-platform Makefile for Go

Multi-platform Makefile for Go

Something that Go does very well is multi-platform support. You can build a binary for just about any system without much hassle. On a single build machine, you can build binaries for Windows, macOS, and many flavors of Linux. All that is required is to change the GOOS and GOARCH env variables to the desired OS and architecture. I made a Makefile to take advantage of this.

First I started with a few variables. EXECUTABLE is the name of the program to build. WINDOWS, LINUX, and DARWIN are the actual names of the binaries to be created, based off of EXECUTABLE. VERSION is a version string derived from the latest git tag and commit hash, something like v1.1.1-8-g99740b5.

Read more →

Worker Pool to Limit Concurrent Goroutines

Worker Pool to Limit Concurrent Goroutines

Recently, I had the need to process a near infinite number of messages asynchronously. You can’t just throw all the messages into separate goroutines when there are that many of them and more incoming. One solution is to use some sort of worker pool to manage the number of concurrent goroutines that can run. Here’s how I went about creating a worker pool (I’ve called it a task pool) in Go.

Read more →

GopherCon 2018

GopherCon 2018

I had the privilege again this year to fly out to Denver and attend GopherCon, the premier gathering of “gophers” (people who program in Go). It’s a lot of fun and I learn something every time. After spending the weekend hanging out around town with my wife, enjoying Hammond’s candy and exploring the Denver Museum of Nature and Science, I started the conference with a machine learning workshop. It turned out to not be quite what I expected. I was hoping to spend more time with deep neural networks and current tools of the trade, like Tensorflow. Instead we spent most of our time going over machine learning basics, which I was already marginally familiar with. They did go over the math behind a few concepts, like linear regression and k-nearest neighbors. I found that to be interesting enough. Afterwards, they started setting up some arcade classics that could be played for free, so I knew the conference was going to good.

Read more →

Hackathon: DNN Service

Hackathon: DNN Service

A couple weeks ago, we had another hackathon at work. This time, I wanted to create something useful that could potentially be adapted by one of our teams. My initial thought was to convert some of our old C++ code to Go and remove a Windows dependency, but after talking with one of my coworkers, we decided to instead create a DNN service for executing a Caffe2 model in Go. We had a third volunteer join us and we set out to achieve our goal. What we ended up with was a Python service that uses PyTorch to execute a neural network.

Read more →

Microsoft Acquires GitHub

Microsoft Acquires GitHub

Earlier today, Microsoft announced they are acquiring GitHub, the popular git hosting solution that everyone uses. At least, it feels like everyone uses it. Here’s the announcement from GitHub. I use GitHub and I really like it. It seems to be an integral part of the Go ecosystem and open source software at large. I actually like Microsoft, but I’m not happy about this turn of events. The design and user experience currently present in GitHub are in line with what I want from my version control hoster. Also, I just really like that GitHub has been a neutral third party that everyone can collaborate in. Now that is changing.

Read more →

Hackathon: Conway’s Game of Life

Hackathon: Conway's Game of Life

Recently, I had the pleasure of participating in an internal hackathon at work. They gave us two days to create whatever we wanted with whatever group of coworkers. There were no specific guidelines on what the project had to be or what technologies it needed to use, so I decided to go solo and recreate Conway’s Game of Life in Go. I’ve been fascinated with the Game of Life ever since I first heard of it several years back. It’s an exercise in cellular automation that works by simultaneously updating a grid of cells that are either alive or dead according to four rules:

Read more →

Setting up a Ghost blog on Amazon AWS

Setting up a Ghost blog on Amazon AWS
If it wasn’t immediately evident, I created this blog fairly recently. After much deliberation and research, I chose Ghost as my blogging platform. I like its simplicity and focus on content. My desire was to use Amazon AWS for hosting, as it is fairly cheap and dependable. It took some fiddling to get Ghost running and I thought I would share what I did in the hope that it would aid someone else. Please note, these instructions assume the person following them already has an AWS account set up and ready to go.
Read more →