dmuth's blog

My presentation on the Node.js Seq module

My presentation on the Seq module from the Node.js Philly Meetup is now online.

Here's how to view it:

git clone

open seq.html # On a Mac, this will open in your browser

Enjoy, and feel free to send me any questions you may have about Seq!

Average: 5 (1 vote)
Your rating: None

Philly DevOps Meetup Notes, September 2013

"I LOVE Boxen!"

I attended tonight's Philly DevOps Meetup at the Comcast Center in Philadelphia, PA. As a service to the tech community, I decided to share the notes I took from the presentations.

Boxen (presented by Adam Ochonicki):

  • configuration management for Macs
  • Does things like installs Skype, VLC, etc.
  • is a wrapper for Puppet
  • Warnings:
    • Installs its own Homebrew and rbenv
    • Installs services on non-standard ports
    • YMMV on "older" hardware

Docker (presented by Dave Konopka):

  • Docker is to Linux containers what Vagrant is to VMs
  • Linux containers (lxc): isolate proceses, files, and networking running on a host system
  • AUFS: Layered file system
  • Docker is NOT:
    • package manager
    • configuration management
    • VM
  • Requirements:
    • 3.8 kernel
    • LXC and AUFS support
  • Layered file system:
    • Base image can be shared across multiple docker containers
  • Unlike VMs, the guest OSes and kernels are not duplicated
  • Host kernel + smaller resource footprint + layered file system = insanely fast spinup
  • Can run on top of other forms of virtualization (EC2)
  • Starting a container:
    • Spawn a container from an image
    • Fire one process
  • Repositories
  • Ideal use cases:
    • Experiment with distributed applications
    • Portable stand alone applications
    • App deployment
    • Replicate test environments
    • High number of concurrent isolated "systems"
  • "production ready" due in October, 2014
Average: 4.5 (2 votes)
Your rating: None

My BronyCon 2013 Writeup

Earlier this month I attended BronyCon, a convention for "bronies", or people who are fans of "My Little Pony: Friendship is Magic". With over 8,000 attendees, it is the biggest convention of its kind.

"You're a brony?"

No, I do not identify as a brony. I've seen the show, and it's good animation and solid storytelling. If I had children, I'd watch the show. But I do not feel enough of a connection at this time to self-identify as a brony.

"Why'd you go, then?"

A few reasons. First, I was curious about the brony fandom, especially its explosive growth--BronyCon is only 3 years old, and they had over 8,000 attendees this year. Second, I wanted to work a convention outside of my comfort zone for a change. Third... we kinda had a staff swap going. At Anthrocon last month, BronyCon's Operations Director worked for me in my department. So I returned the favor and worked for BronyCon this year.

VIPR Group Photo Fursuiters at BronyCon DSC_7763

"Wait, what? You were staff there!?"

Yep, I worked for the VIP Relations team, or VIPR for short. One difference between BronyCon and other kinds of conventions I worked is the larger number of guests who are voice actors and relatively famous in real life. Due to the increased attention that guests would get, each guest had a "handler" assigned to them for the duration of the convention. That means your schedule is your guest's schedule. You meet your guest in the hotel when they head out in the morning, and you're on duty until they head back to their hotel for the night. You are responsible for escorting them to each panel and stage appearance on time, and are basically their Point of Contact for the convention itself.

Average: 4 (11 votes)
Your rating: None

My Anthrocon 2013 Report

We had another amazing year at Anthrocon 2013 in Pittsburgh!


Let's start with some statistics:

  • Total number of attendees at Anthrocon 2013: 5,577
  • Total number of fursuits in the Fursuit Parade: 1,300
  • We raised over $31,000 for our charity: Equine Angels Rescue. Great job, everybody!
  • Next year's Anthrocon will be held: July 3rd to 6th, 2014. The theme will be: "Secret Societies"
DSC_7369 DSC_7388 DSC_7605 DSC_7682

Meanwhile, in the Operations Office

My primary responsibility at Anthrocon is to manage The Operation Office, known more informally as "Con Ops". Among other customer service-oriented functions, we also handled Lost and Found and Volunteers. This year, we tried splitting those tasks off into their own areas. Lost and Found was headed up by Jasper Blue, while Volunteer Coordination was run by Kasi Frost.

Both of these ideas worked out really well. Jasper kept track of all lost and found items in a spreadsheet and was able to more effectively assist people who came by Con Ops looking for lost items. (You'd be surprised how many cell phones are lost each year...) On the volunteer side of things, Kasi came up with some new ideas for managing volunteers, and was able to capture detailed data on how many volunteer hours were put in on each day of the convention, and in what departments. It will help us plan volunteer requirements better in future years.

DSC_7671 DSC_7424 DSC_7449

Social Media

I stepped things up a bit on the social media side this year and that investment paid off quite well. I tried a few new things for the first time:

1) Many many tweets. I used HootSuite to manage our social media accounts. In addition to just posting, I scheduled 60+ posts to be sent out on Twitter, Facebook, and Google Plus over the course of the convention announcing major events, Guest of Honor panels, and announcements for the Fursuit Parade. Since it can take 30-45 minutes to get to Hall A from The Westin due to elevators, I set up HootSuite to start tweeting announcements about the parade early Saturday morning, and increased the frequency of the tweets and posts through the 1:50 PM "door closing" time. I'd like to think that helped increase turnout at the parade.

2) Customer Service. Since my iPhone can be set up as an Internet access point, I did so and then used my iPad to watch the various social media sites. When a concern about Anthrocon came up, I was able to address it in near real-time. For example, there was a miscommunication between about water bottles being allowed in the Dealers Room and attendees with them were turned away at the door. As soon as I saw it mentioned on Twitter, I was able to relay it to our Security Chief who then let the rest of people on security know that personal water bottles were allowed. Total time to resolve: 10 minutes. I was able to address other issues and answer questions during the convention in this manner as well.

Average: 3.5 (25 votes)
Your rating: None

Introducing Multiping: An Easy Way to Ping Multiple Hosts

Yet another day with 8% packet loss from Comcast, it seems. In a fit of frustration, I spent half an hour and wrote a tool that can be used to ping multiple hosts at the same time, for the purpose of making sure that the problem isn't external to Comcast's network.

Here's how to install it:

git clone

Here's how to use it:

./multiping is a router on Comcast's network which is upstream of myself and one of my neighbors, whom is experiencing the same issue.

And here's what the output looks like: icmp_seq=33 ttl=55 time=16.950 ms icmp_seq=33 ttl=61 time=14.612 ms icmp_seq=34 ttl=61 time=14.525 ms Request timeout for icmp_seq 34 icmp_seq=35 ttl=55 time=17.031 ms icmp_seq=35 ttl=61 time=13.550 ms icmp_seq=36 ttl=55 time=14.822 ms icmp_seq=36 ttl=61 time=13.404 ms
Average: 3.6 (13 votes)
Your rating: None

I hate pennies. I *really* hate pennies. What to do with them all?

I really hate pennies. Let me count the reasons:

Here, look at my pile of spare change that I've collected from the last few years:


Just look at it. Half of that pile is pennies! The pile of pennies is worth what, $5? $10? The pile of nickels and dimes on the other side is probably 7 or 8 times that. I seriously think that if I take that many pennies into a bank to deposit that the security guards will shoot me just on general principle. Can't say I'd blame them.

Average: 3.5 (17 votes)
Your rating: None

Log4Go Updates: colored text, Printf(), and SetLevelString()

I recently rolled out some updates for my Log4Go package which I'd like to talk about here.

My first update is the most technically appealing one: Printf()-style functionality.

Instead of having to concatenate strings, percent mark placeholders can be used in the same style as fmt.Printf().

Here are some examples:

log4go.Errorf("Expected 4, got: %d", 72)
log4go.Warn("The temperature in %s is %d degrees and rising!", "Saigon", 112)

The second change I made was the most visually appealing: colored text!

The color of the text printed is now dependent on the severity of the message. Errors are red, Warnings are yellow, Info messages are green, Debug messages are cyan, and Trace messages are purple.

Here is a screenshot of how it looks in Mac OS/X:

Credit where credit is due: I used Meng Zhang's excellent Terminal package for the colored text.

Average: 3.6 (13 votes)
Your rating: None

Introducing Log4Go: Logging for Google Go

When working on my last project, I wanted an easy way to perform logging. I had difficulty finding a logging framework that worked for me, and I figured it would be another good small project if I were to write a log4j-like logger for Google Go.

Here's how to install Log4go:

GOPATH=`pwd` go get # Beginners
go get # Nerds

The latter example assumes that you have the environment variable $GOPATH set. When $GOPATH is set, any packages that are installed will go into a directory hierarchy under that directory. I recommend $HOME/golibs/ as a value for testing and development.

Here's sample usage of Log4go:

import log ""
func main() {

And the output might look something like this:

[301.119ms] INFO: foobar

I wrote some sample tests for Log4go. Here's how to run them:

go test ./src/

And if the test passes, the output should look like this:

ok       0.009s

The source can be downloaded from GitHub:

git clone git://

This project wasn't too terribly complicated, but it gave me some new techniques to try in Google Go. My next project promises to be much more complicated and interesting. Until then, feel free to like, comment, rate, flame or whatever. Smiling

Average: 3 (7 votes)
Your rating: None

Multi Core CPU Performance in GoLang

I've been playing around with Google's programming language known simply as Go lately, and have learned quite a bit about concurrency, parallelism, and writing code to effectively use multiple CPU cores in the process.

An Overview of Go

If you are used to programming at the systems level, Go is effectively a replacement for C, but also has higher level functionality.

  • It is strongly typed
  • It can be compiled
  • It has its own unit testing framwork
  • It has its own benchmarking framework
  • Doesn't support classes, but supports structures and attaching functions to variables instantiated from those structures
  • Doesn't expose threads, but instead uses a construct called "channels" for communication between different parts of a Go program. More on channels shortly.

Your First Go Program

First, let's start with this Go code, which I will walk you through:

    c := make(chan string, config.Buffer_size)

    num_cores := 1
    for i:=0; i<num_cores; i++ {
        go func(c chan string) {

    message := "x"

    for i:=0; i<10000000; i++ {
        c <- message

What this piece of code does is it creates a channel--a construct similar to named pipes in UNIX or SQS queues in Amazon Web Services. One part of code can write to a channel while another piece of the code can read from the same channel and performed a NOOP. It also defines a function inline and precedes it with the keyword "go". That function is then launched in the background as a "goroutine". Goroutines can be thought of as "lightweight threads". Thousands of them can be spawned over the lifetime of a Go program with little impact on performance. If the "num_cores" variable is tweaked in the above code, the run time of the program should decrease as there will be multiple cores reading messages off of the channel. Finally, the code writes the string "x" into the channel 10 million times. Assuming the goroutine is running, the loop to populate the channel should execute on one core while the goroutines which read from the channel should execute on the other cores.

Average: 3.7 (14 votes)
Your rating: None

Furry Connection North 2013 Report

First, the stats.

There were 1,259 total attendees at this year's Furry Connection North.

We raised $21,299.67 for our charity, Country Cat & City Kitty Cat/Kitten Rescue.

As usual, I got to see a lot of friends there, and meet some people I only knew online in person for the first time. Good times all around.

DSC_7143 DSC_7148 DSC_7149 DSC_7152 DSC_7154 DSC_7190

Average: 2.6 (5 votes)
Your rating: None