Go Time – Episode #29

Go and Buffalo Live from Dunkin' Donuts

with Mark Bates

All Episodes

Mark Bates joined the show this week live from his local Dunkin’ Donuts to talk about Go and Buffalo — his Go web framework. Those who listened live said this was our best show yet. If you agree let us know in #gotimefm on Gopher Slack or say hi on Twitter.



LinodeOur cloud server of choice. Get one of the fastest, most efficient SSD cloud servers for only $5/mo. Use the code changelog2017 to get 4 months free!

FastlyOur bandwidth partner. Fastly powers fast, secure, and scalable digital experiences. Move beyond your content delivery network to their powerful edge cloud platform.

StackImpact – StackImpact is all about profiling and monitoring for Go. Laser focus on the performance of your Go applications.

Notes & Links

📝 Edit Notes

Mark’s power went out at his home office so he did the show from his local Dunkin’ Donuts. Listen to the FULL raw uncut edition of this show (NSFW).

  • Mark can’t talk about the secret because it’s now the big big secret — details coming soon
  • Buffalo is “another” Go web framework
  • gorilla/mux - A powerful URL router and dispatcher for golang
  • Like all good software, Buffalo stands on the shoulders of giants
  • You 👉 can run your own Go 1.8 release party
  • Have you seen Google’s Grumpy? It’s “The best of Python running on the Go runtime” -Brian Ketelsen
  • GoReleaser - Deliver Go binaries as fast and easily as possible
  • Mutagen - Simple, cross-platform, continuous, bi-directional file synchronization
  • Introducing Prism — an open source profiling tool for Go (from Geckoboard)
  • Octotree - code tree for GitHub and GitLab. Mark Bates says “I can’t imagine using GitHub without it.”

Mark Bates at Dunkin’ Donuts



📝 Edit Transcript


Play the audio to listen along while you enjoy the transcript. 🎧

Alright everybody, welcome back for another episode of GoTime. We are back from a long two-week vacation. Hopefully everybody got some rest and relaxation and maybe some detox time. On today’s show the panel consists of myself, Erik St. Martin, Carlisia Pinto is also on the call, say h–

Hi, everybody. [laughter]

Oh, you’re ruining it! I thought I was [unintelligible 00:01:01.09]

You ruined it, Carlisia! Game over!

You’re also like a well-oiled machine, let me just throw that one out there. Clearly, this has been practiced several times.

I was holding back the laughter until Carlisia – alright, so we also have Brian Ketelsen…

There was a slight delay there…

And today’s special guest, live from Dunkin’ Donuts, apparently, is Mark Bates.


Are you taking orders, Mark?

[01:39] It’s a very caffeinated Mark Bates sitting here in the corner of a Dunkin’ Donuts. [laughter] Coming to you live…

Thank you for sprinting to Dunkin’ Donuts to get power, since the power went out in your block; we appreciate that very much.

Oh, I’m glad I could eventually find a place.

But the show must go on!

That’s what they say.

We have a saying in the show business, and we are in show business; even though Adam doesn’t follow us on Twitter, we are in show business, and that saying is that the show must go on.

I’ve got some great stories about that, but it’s probably not safe for this podcast.

This is a family-friendly podcast. Thanks for filtering yourself, we appreciate it.

Then we’re gonna be in trouble, because almost all of my stories are highly inappropriate. [laughs]

Oh, we’re in trouble…

You have to shift them from “Not safe for work” to “Somewhat safe for work.”

Okay, I’ll just substitute anything bad with the word Belgium, and we should be fine. [laughter]

And then Belgium! Yeah, this is gonna be a good show, folks.

Let’s get to it, because I am dying to know what it is that it is the big secret!

Oooh, the big secret…

Oh, the big secret. Well, I can’t talk about the big secret.

Oh, come on! I thought you came on the podcast to talk about the big secret.

I did, and then yesterday the big secret got even bigger and better…

Way bigger…

Yeah, than I could have ever imagined it would, and so we have to not talk about the big secret today.

But there is something really cool to talk about, that a lot of people may not already be aware of, which is your new project you’ve been working on.

Yes, we can talk about Buffalo. GoBuffalo.io… Till the cows come home. Or till the buffalos come home anyway.

Till the buffalos come home, that’s right.

[laughs] That’s right. I’m very excited about Buffalo. That, I definitely wanna talk about, because it’s some pretty cool stuff, I think.

So why don’t you start by telling us what the hell Buffalo is?

Besides just a terrible name for any project, Buffalo is another web framework in Go. I use the word “another” because there are a collection of them out there. This one aims to be slightly different in that I have decided not to reinvent the wheel that a lot of these frameworks have invented, but instead I’m gluing together a bunch of my absolute favorite packages and kind of putting them together in a “If you use this opinionated set of packages, your life developing web apps in Go will be as nice as - and I’m saying this with huge quotes and a huge lick of salt - Rails.”

That five-letter word that no one wants to talk about.

When I first heard about Buffalo, my first thought was the xkcd Standards comic, you know? Like, you have 14 computing standards. Ridiculous! We need to develop one!

A 15th, yeah.

So what was the motivation for creating another web framework?

That’s a great question. The Why has haunted me for a while, I wanna write a blog post about the Why. I have, over the years, tried some of the big Go frameworks, and I’m not gonna name any names, and I don’t wanna poop Belgium on anybody’s framework…

We’re not shaming anybody!

Exactly. So I’ve tried a lot of them, and the biggest problems I found with a lot of them is a) they’re not idiomatic Go, b) they’re too complex, c) they don’t think of the problem holistically; they don’t start you off right from the beginning with “Here’s a generated base of things to work with. Just start plugging in your code.” It’s “Here’s our framework. Start typing out framework code, so you can then start doing your thing.” And taking it from frontend, including a massive pipeline, through a good templating system, through good testing and good frameworks, good routing and good middleware, all that sort of stuff.

That’s really what I was looking for, and that’s kind of how Buffalo came to be. It was years of me curating these packages and building essentially a Buffalo for every single web app I’ve developed in Go. I got sick and tired of doing that, so that’s kind of how Buffalo was born.

So would it be accurate to say that you took the best of all of the packages that exist out there, sprinkled in some SuperGlue and turned it into what you’re calling in air quotes a framework?

[06:09] Yeah, that’s about right. If you look at the core Buffalo package itself, most of it is just glue code. There are a handful of sub-packages to other things, like provide basic rendering frameworks… You know, that could be extended using a very simple interface, and stuff like that.

I found a great router, for example - the gorilla/mux router is a great router. Great, let’s wrap that. Let’s wrap then the ability to add some nice middleware on it, an easy to use declarative syntax, a context structure, the ability to skip middleware, which nobody really does, but very useful… So that sort of glue work.

And even things like the asset pipeline; I just pulled in Webpack and set up Webpack for you and made it kind of all work. So just taking the best of all those worlds.

What is an asset pipeline? Can you explain that for people like me who don’t know a damn thing about the web?

[laughs] Yeah, I know that because I’ve tried to help you with it several times.


The pain!

I know. I love you, Brian, but you… I thought I was bad at frontend work, but… [laughs]

We won’t shame web frameworks, but we will shame people.

Yeah, apparently shaming Brian is perfectly okay.

[laughs] I’ve got a document saying to shame Brian, from Erik. Was I not supposed to do that?

Oh, I didn’t get that.

You’re fine, that’s another document, Brian… We have it on [unintelligible 00:07:34.20] [laughter] You’re fine, Mark, go ahead.

So an asset pipeline is a term kind of coined from the Rails world. Essentially, it is a build system around your JavaScript, your style sheets and your images and the like. In the Rails world they do it all on Ruby and it’s painfully slow and difficult to use. In other worlds, they use tools like Webpack, which are faster but also difficult to use, as I’ve found out, but it’s the latest and greatest.

[08:07] So I pulled that in, and the nice thing about that is by using something like that you can develop ES6 right out of the box with Buffalo. You can use SASS stylesheets right out of the box with Buffalo. The Buffalo dev command does hotcode reloading of both your Go app and your asset, so as those change, it recompiles them and they’re ready for you in your browser when you get there.

The Buffalo build command will build up a binary of all of your code - your Go code, your assets, your migrations, everything in one single binary. It’s pretty slick stuff, I think.

Wait, wait, wait… Go back for just a minute. Did you say that you bundle all of the assets and the migrations directly into the binary?

Well, yes I do, Brian. I did say that.

That is freakin’ amazing!

It is. It’s one binary to rule the world, as I like to say.

How do you enable such magic?

[laughs] Through the power of code generation, Brian. Yeah, there’s definitely a lot of magic going on. All I would say is if you follow “the Buffalo way”, if you generate a stock Buffalo app and you use it as such, and you use the Acid pipeline and the way the folder structure is set up for you and everything, when you run that Buffalo build, it just grabs all that, holds onto it, makes a binary that you can run “my binary migrate” and it’ll run your migrations. “my binary” - just start it up and it just starts the applications and knows where all those templates are, and everything.

It really is beautiful. It’s been one of my biggest pain points in Go web development over the years.

Alright, so all campiness aside - I built the current GopherTrain website and the current GopherCon website using Buffalo, and it’s actually brought joy back to my life in web development. I did Rails for a long time, and I’ve liked the idea of Rails; there were pain points in Rails that I didn’t like, but there were certainly great things about Rails and Buffalo brings back all of those great things, but in an idiomatic, compiled, type-safe, Go sort of way, and it really makes me happy. So I’m excited to have you on today, talking about Buffalo, because it’s brought joy back to my web development life.

Aww… That makes me sad for making fun of your earlier.

It should.

I mean, you know…

Because I’ve never done anything but say nice things about you.

That is true.

Well, actually, it’s not, but you don’t know better, so…


Publicly he’s only said nice things. [laughter]

Hang on a second. Excuse me, I’m being interviewed by Casey Affleck right now… Would you mind being quiet? Yeah. No-no. It’s Casey Affleck, you know? The “dood-basterd…”, yeah. Okay.

Sorry. I was being bothered by a local. [laughter]

Did that just happen? [laughter]

Oh my god.

So back to the Buffalo.io… I am curious to know what third-party libraries are you using? You already said you were using gorilla-mux, which I think is awesome that you made that choice. I’m wondering, are you wrapping around any database library and what else are you using?

Yeah, that’s a great question. So one of the big things about Buffalo is I believe Buffalo stands on the shoulders of giants. As a matter of fact, whenever I cut a new release I generate a file called shoulders.md, which lists all of the packages that I use inside of Buffalo because I wanna make sure everybody has the props that they deserve for these wonderful packages.

[11:52] So for me, some of the packages like go.rice, which allows you to bundle static files into Go - it’s a great package. What I love about that package is you don’t have to keep running it in development, it falls back to your file system, which is really nice. So you only need to generate those kinds of bindings at build time.

We were using the raymond package for our templating system, but unfortunately we ran into just a few issues with that library, but we leveraged the AST and lexer and parser from raymond; it builds basically raymond on top of raymond, but fixing a few of the issues we had and kind of improving upon it. It is a great templating library and he did a great job building raymond initially.

A lot of the gorilla stuff - we use a lot of that. For things like database, we’re actually using a package I wrote called pop, which I quite like because it offers actual migrations versus auto-migrations. I’m a big fan of being able to control when my database gets upgraded and how. It’s kind of a halfway between magic and halfway between straight Go, so it’s not as heavyweight as some of the other ORM systems out there.

I know Brian has used it and is favorable towards it, if I could use those words, Brian…

You’re putting words in my mouth, but yes, I think pop is good, and I’ve used gorm quite a bit in the past, which is a whole lot of magic in the ORM side of things. And I like pop quite a bit; it’s not much magic at all, but it gives you the power to get things done with just enough glue on top of sqlx in the background. I think Mark’s been sniffing the glue though, that’s the problem.

[laughs] I have. I do love sqlx, that’s such a great package. But yeah, so just a ton of them. Just some really great… Like, blackfriday… I support markdown templates as well as HTML templates, so blackfriday is there… Just a ton. I recommend people check out the shoulders.md file, because there’s so many great packages and I’m really appreciative of everybody whose shoulders I get to stand on to build something like this.

You know, one cool feature that I saw was there that I haven’t seen in any of the other frameworks is the REPL, which is really cool.

Yeah, I pulled in Gore, which is, again, an awesome little project. I do, again, just a little bit - I generate a little bit of code to import your models and actions into the REPL right away, so you don’t have to import those later. But yeah, it’s really cool, and again, it didn’t take much time at all to pull something like that in.

And if the term REPL sounds odd or confusing to anybody, I believe it’s Read-Execute-Print Loop, if I recall…

It might be ‘Evaluate’.

Yeah, I think it’s ‘Evaluate’.

Yeah, it might be ‘Evaluate’. But it’s basically just a console to interact with the language.

With your Go application - how awesome is that?

It’s very awesome.

The other thing is we also use Grift, which is a library that lets you run kind of reusable tasks, very similar to rake in the Ruby world… Which is great for doing things like seeding and stuff like that.

You stole my thunder, I was gonna mention Grift. Grift is my favorite part of the whole thing, because you get to do that whole rake thing. If you’re used to the Ruby world where you ran rake db:migrate or whatever, you could make your own Grift tasks that interact with your Go code.

Yesterday - not yesterday, maybe Friday - I created a meta Grift that runs Grift on the remote server, so you can run Grift-Grift, and it creates a Grift that runs a Grift on a remote server, which is just awesome, so you can do your production db migrations over SSH. Very awesome.

My favorite part is being able to say “I’m running a grift.” [laughter]

[unintelligible 00:16:00.27] a grift. [laughter]

Don’t say that in front of that undercover cop.

[16:05] [laughs] Oh, this Dunkin’ Donuts is pretty used to that sort of behavior.

Carlisia, you were about to say something?

Yeah, a couple things I wanna say now. First, actually I do wanna make sure people understand that there is a listing of all the libraries that Mark is using, and it’s worth taking a look. There’s some very interesting stuff, including the libraries that were just mentioned. And a lot of the libraries that were just mentioned are actually libraries that Mark has developed, and my previous question was actually “Are you in massive need of help to maintain these libraries?” How are you managing this?

[laughs] Absolutely. I’m always looking for help, I think like any good OSS person is always looking for help. Yeah, they are… Well, thankfully, with the exception of Buffalo and pop, a lot of the libraries are very small things that don’t do very much; they’re just little helpers and bits that I find very useful. But some of them are bigger, like pop and Buffalo, and… Goth is not part of Buffalo; there is a goth generator, and goth is probably my most popular package I’ve written for Go. It’s an OmniAuth kind of clone; it lets you create authentications using OAuth2 and OAuth providers, and that’s pretty cool, too. So yeah, always looking for help.

If goth is really popular, do you think Adam follows it on Twitter? [laughter] Probably not.

I was drinking too, and I almost spit it out. [laughter]

So you can actually make fun of it now, because he can’t interject, so you can say whatever you want.

Don’t break the fourth wall, Adam. Don’t do it. [laughter]

I actually wanna play with pop, because I haven’t seen it. I haven’t had to do database migrations or anything in a while, but there seem to be some tools in the early days for migrations, and many of them seem to get abandoned.

Yeah, I was using one - I think it was called Migrate - very early on, and it was great… I’m trying to remember the issues I had with it; I tend to start - that’s kind of my development process… I find something, I love it, I start using it, I try to contribute; if things aren’t happening, if the maintainer is not accepting PRs or they’ve kind of dropped it, then I end up usually taking things into my own hands… Which is sad.
I’ve asked for a bit commit on several repos in the past that have gotten nowhere, so I guess my call to OSS maintainers is if you can’t maintain your OSS, be willing to give it up. Be willing to give it to somebody else who wants to maintain it.

Yeah, I guess that’s a fair point. And sometimes it’s hard too, because sometimes it’s not intentional, right? Many of us create little things to solve a purpose, then we share it with the world because we’re like, “Hey, this might be useful to somebody else” and then you forget about it.


I’ve had a couple of those that I’m sure I probably have GitHub issues that have been open for years and I’ve never even seen them.

Has anybody seen the GitHub statistics thing that’s running around Twitter that shows you how many commits you did last year, or whatever…? There’s a list of the GitHub repos that I committed to last year, and I committed to like 213 repos, and a hundred and something of them are mine. And I thought to myself, “I have a hundred and something Go libraries that I’ve been maintaining?” It scared me a little bit… I actually can think of maybe one of them, so… Who knows? [laughter]

You can only hope that they’re forks of other people’s projects that are being maintained.

I try to delete my forks as quick as possible. It’s for the best.

[20:04] Nathan Youngman in the GoTime FM channels says that there is a fork of the migrate library - that’s a tool, or whatever you wanna call it by Gemnasium that also has Cassandra support, so that’s cool.

I love Cassandra, too.

I think that was my problem with Migrate - it wasn’t Cassandra support, I just remembered… It was everything had to be done via parameters on the command line, and it was difficult to work with since I was setting up configurations for within my app, and then now I’m running migrations outside the app, and being able to configure all those things with one way was the big problem for it.

Nathan also said - and this is actually on your Shoulders page - fsnotify.

It’s a really, really useful library. He says he sucks at maintaining, who wants to maintain it? [laughter] So if you’re looking to help maintain a project…

This is a swap meet?

[laughs] I’d definitely love commit access on fsnotify, I use it a lot. It’s a great library, and it’s what basically powers the ability for Buffalo to rebuild your binary whenever a file changes.

I think you should take it over, Mark.

I’m happy to get commit access to it, definitely.

Look at this, we’re making deals… Brokering stuff right here, at Dunkin’ Donuts, live in Boston.

Right, but Nathan has to take commit access on one of my projects too, that’s the way that works. [laughter]

Oh, nice.

Wow, you’re smart. [laughter]

So I also have to interject… I just saw an email come through, and the last early bird ticket for GopherCon is officially gone.


Wow… What - two days?

One day.

Yeah, a day and a half, because late tonight it will be two full days. So yeah, that’s awesome. So anyway, I kind of just totally derailed our Buffalo talk, but we’ll get back to it at GopherCon.

GopherCon’s gonna be amazing this year, I know that for a fact.

It sounds like there will be a lot more people this year than last year.

So before we get on to all the news and stuff, I’d love to hear kind of like – so Buffalo is kind of just in its infancy… What’s the future for Buffalo? What are some of the things you’re looking to do with it? Where would you like to see it go?

Yeah, that’s a great question. So we reached 0.7.0 yesterday, which was a huge release because it brought it all that build compatibility yesterday. Things that I would love to see worked on are more generators - I’m a big fan of generating all the things, like Brian is. You could do “buffalo new” and it generates a great skeleton app for you, and there’s a couple other generators in there that are really wonderful, but I wanna extend those and make those even more powerful so that we could just get onto the problem with building our apps and not all that code.

Definitely need to look at support for background jobs; I know there are several sidekick-like worker jobs in Go world, so we’ll get support for those, we’ll get support for mailing, creating mailers. Again, I look for really nice packages and then just try to write some glue around it that makes it easy for everybody to use. So making mail interact with background jobs, for example, is that little bit of glue that I’ll probably add. Those are definitely things that are on my plate before 1.0 comes down.

That’s awesome.

That’s a lot.

Oh, and form builders. I was working on a form builder today.

Validations. Validations would be useful, too.

Yeah, those just dropped in pop today, actually.

Ask and you shall receive.

[23:55] [laughs] I’m like that. Yeah, you can now “validate and create”, “validate and save”, “validate and update”, that sort of thing. So yeah, those are already in pop, and they’re ready to go. The generator generates basic validations for you now.

Wow! All of this since we talked yesterday?

Yeah, man. I’m a machine. [laughs]

Do you have a life? How does your family feel about your abandonment of their needs?

Um… Who? [laughter]

What fuels you, Mark? Dunkin’ Donuts? How do you get so much done?

Are those the people in my house?

That explains it all.

That explains it… Both my sons call me Mark, which I think is kind of odd… [laughter] No, um…

I don’t think it’s supposed to work that way.

I don’t think so either. I’ve got a wonderful wife and two wonderful children. I honestly couldn’t be – I couldn’t do any of this without their support. They’re wonderful, they always have been. My conference talks, my books that I’ve written, the projects I’ve started - they’ve always been big supporters, my wife in particular. I just feel like I’m pretty good at time management… That’s honestly the key to doing all of this. If you’re terrible at time management you’re just not gonna get anything done.

So I code pretty feverishly between when my wife and kids leave for school and work in the morning and when I pick them up. The kids up about five, and then from five till eight-thirty, nine o’clock I’m a family man, I just do my things with the family. On the weekends I leverage the kids’ downtime, when they want to be down, I try to leverage those free hours, but for the most part they keep us busy on the weekends. It’s everything I can do to keep it all in balance.

That’s awesome. Just looking at your GitHub profile - you’re prolific. Every two minutes you’re putting out a new change. I think working on Buffalo or working with Buffalo over the last couple weeks - it’s blown my mind just like the validations. I ask, “Hey, you think it would be possible to do X, Y and Z?” and of course, Mark’s first response is “We love pull requests”, but his second is “Yeah, I added that yesterday.” I don’t understand how you have time to do it all, it’s amazing. You’re far more productive than I am.

It’s because he drinks Dunkin’ Donuts coffee.

It’s because I drink Dunkin’ Donuts every morning. I actually do drink Dunkin’ Donuts coffee every morning. [laughs]

That is the secret, there we go.

That is the secret. The bigger secret is I only started drinking coffee just over a year ago, so I don’t know how I was doing this productivity stuff before then.

The key is just drinking. Just… Booze. [laughter]

That’s my problem, see? I’m almost a complete teetotaler, so if I drink more, maybe I’d be more productive.

Exactly. [laughs] The funny story is I’ve written three books over the years, and the longest one took me about three or four months to write, at night, part-time. I would sit down at about nine o’clock in the evening after the kids went to bed and I would crack open a six-pack of Guinness and a bag of M&M’s and I would write until like three in the morning and I would just send them off to my editor and I wouldn’t even look at them… I would do zero revisions, I would just send them off.

Then they would send me back the changes, the corrections a couple days later, and it would start off perfectly fine, you know, and as it went on there’d be a little bit of red, and a little bit more red, and then finally by the end there’d just be like whole paragraphs scratched out and all red… “This isn’t a word”, “These aren’t sentences”, “This is the lyrics to ‘I am the walrus’…” [laughter]

Wait… So you realize what you are doing is actually getting your editor to write a book for you? [laughs]

Well no, no, because then I’d go back and change, correct the things that were the lyrics to “I am the walrus” and make them actual sentences again.

[28:03] [laughs] Okay… It’s the equivalent of making an incorrect statement on StackOverflow and have people just give you the right answer.

Well, everything’s an incorrect statement on StackOverflow, so I don’t… You know… That’s like saying there’s hatred on Hacker News, and that every statement is misguided or misinformed… [laughs]

It’s not true…

Oh my god… I’m hyperventilating here. This is funny.

That is not true. Everything Brian puts on there is full of love and honesty. [laughter]

But yeah, “suppress your inner editor” I guess is how I did that. [laughter]

Okay, so we should probably move on to projects and news. Before that, let’s take a quick sponsor break.

So, projects and news… What do we wanna talk about first?

Oh my god, there’s so much to talk about. I think we have to start with the biggest one. Talk about shots fired - Scott Mansfield said “shots fired” in the GoTime Slack channel. Shots fired happened when Google yesterday released Grumpy, which is a Go backend to a Python interpreter, and holy cow, the Python world is completely on its ear… “How could you possibly make a Go backend for a Python interpreter?”, but if you look at the blog post, the performance of these Python applications that are being run transpiled into Go - it’s insane. I mean, drastically, a thousand percent faster. Insane. Really awesome.

Yeah, that project looks insanely good.

It does. I know that it’s not even close to code complete. There’s a lot of the Python standard library that’s missing, but holy cow… It’s fast, it’s really fast, and it already works for several cases of Python apps, so if you’ve got Python code that you’re looking to make fast, you can run it with the Grumpy interpreter and get the best of whatever it is that you like out of Python running on the Go runtime.

Admittedly, they did cut a few corners… No C extensions and no global interpreter lock, which is actually a good thing.

Well yeah, you don’t want the global interpreter lock. C extensions - yeah, I don’t know…

Yeah, that was always a problem with the alternative Ruby versions - they all struggled supporting C extensions, and because of that, people struggled to use them.

Yes. We should get Evan Phoenix and Charlie Nutter on here and talk about all of the people that are building alternative Rubys and we could just have a big crying festival. [laughter]

Is Python one of the approved or supported languages at Google? I think there are five of them.

It is, yeah.

I think it’s one of the primary, actually. If I recall, I think YouTube is a lot of Python.

So is that why they did this? Because I don’t think this will necessarily increase Go adoption. I don’t think that’s why they did this.

[32:01] No, that’s not… If you read the blog post, they did it in order to get better performance out of their Python without having to rewrite all of the Python apps in something like Go.

So almost for the same reasons of like a HipHop VM to PHP or something like that, where rather than having to make that transition, it’s just easier to write something to make your code run faster.

I think it’s just a tacit admission that Python is slow and their developers can’t be taught.

Ouch! [laughter]

I was waiting for the laughter. There was none. Alright, fine.

Even I was silent on that.

Yeah, that was like, “Whoa, shots fired for real.” [laughter] It’s hard to change the wheels on a moving bus, is the saying, right?

Very hard, right.

Absolutely. So Grumpy sounds very exciting.

Yeah, so we’ve actually got like a couple of big things to talk about this week. So it is after the first of the year, which means GopherCon 2017 CFP has been opened, along with registration. That’s huge! I’m really looking forward to GopherCon this year.

Do I understand it correctly that the CFP closes at the end of January?

That’s correct.

We’ve toyed with this, and one of the times we gave everybody 90 days to write a proposal, and what we found was everybody submitted their proposal in the last 48 hours. So then we gave everybody a month, and everybody submits their proposal in the last 48 hours. [laughter] So it doesn’t really matter what the timeline is, everybody waits till the end. So if you have something interesting to talk about, definitely submit a proposal.

There’s three types of things you can submit for: keynote session or plenary session, that will be in the main hall, kind of directed towards everybody; tutorial sessions, that will be kind of like a more direct group of people you’re speaking to with similar interests… And then we actually opened it up for workshops for anybody who has interesting things they wanna teach in the day before.
The dates of GopherCon: 13th and 14th July are the main talk days; 15th - we typically used to call this Hack Day, we’re now calling it Community Day, because I think it’s a lot more in line with the spirit of the day. The Go team has continued to increase their presence there. Last year we had this really cool community room where they had discussions about some hot topics going on with the community, so we’re gonna kind of expand on that, make that room bigger and get good at A/V. What else have we changed this year, Brian?

I think we decided that we’re not gonna let Mark Bates MC anything…

What?! [laughter]

Oh, there’s a big change…

I love how I find out online, in front of everybody.

…the CFP this year is hosted on some weird website called PaperCall.io.

Yeah, I’ve heard nothing but good things about PaperCall.

And the inside joke is that that’s hosted by Mark and someone else, so PaperCall is one of Mark’s creations. Now tell us quickly, you said you were doing some experimentation on PaperCall, running it in Buffalo versus Rails. Give us an idea of how much faster it is in Buffalo versus Rails.

Of course Cory just jumped into the Slack channel with saying “It’s not written with Buffalo.” It is not. It is actually written in Rails, and it’s the bane of my existence because of that. But I have been rewriting it in Buffalo - don’t tell Scott, my co-founder; he doesn’t know… But it’s roughly a hundred times faster and uses something like 40% less memory in CPU usage, or something ridiculous like that.

Wow… Good stat.

[36:00] Yeah, it’s insane. Requests that were taking about 300 milliseconds take about 3 milliseconds, and the app on average uses about 5-6 megs of memory, versus the Rails, we’re gonna start you with 512, or something along those lines.

Yeah, it’s pretty slick. I’m very excited and desperately trying to finish it, so I’d get it out there. But yeah, PaperCall is pretty awesome, and if you host a conference, obviously you should host it on PaperCall.

Speaking of which, the lightning talks - can we talk about those for a minute?

Because I’m sure people will ask…

The ones you’re not hosting?

The ones I’m not hosting; well, in that case, you know, screw ’em. [laughter]

We already hired security and they have your picture. I’m just saying…

Oh, what? You just tell Heather, “Don’t let Mark in?”

Pretty much! And you know Heather, she’ll make that happen.

She has banned me from GopherCon I think every single year and I somehow managed to still sneak in the backdoor, so… Your brother Steve lets me in. [laughs]

I’m assuming we’re gonna open up lightning talks CFP later in the year for those who wanna give lightning talks.

I’m doing a lightning talk.

Yeah, focus on the real talks. Not real talks, but the plenary talks.

Lightning talks are important, too.

They are.

They are fake, though. They’re not real. That’s what Erik’s saying.

I started the wheel spinning today to get approval to bring my barbecue grill to GopherCon to the Convention Center, so that I can do a lightning talk about Cupid and barbecue and IoT using Go and the GoBot framework, so if we can get approval, there will be a lightning talk that involves barbecue, with live barbecue.

If you are planning to turn that thing on, you’re not gonna get approval. [laughter]

Well, we will just have to see about that.

If it can be done, Heather will make it happen.

That’s right. Our people know people.

That is true. If anybody can do it, Heather can.

Another cool thing with the community day too that we’re gonna try to do this year - no promises yet, but we’re investigating - is the potential to maybe offer people the ability to just come to community day. So if they don’t have the time or financial ability to come to the core event, they might still be able to participate in the community day. We’ve gotta figure out the logistics of that, but that would be really awesome to make happen.

That would be very cool.

I’m sorry, I just got very distracted by something Cory said.

Barbecuing gophers?

We all get distracted by things Cory says.

This is like the ADHD episode. Like squirrel… [laughter]

Cory, I’m gonna kick you out of the channel.

Anyway, moving on.

Let’s talk about Go 1.8, coming out in February, on 16th. Dave Cheney once again is organizing release party across the globe for Go 1.8; so if you organize a meetup or if you’re a part of a Go meetup, then we’ll put the link in the show notes for a way you can find information about how to do a Go 1.8 release party at your meetup. We are definitely hosting one here in Tampa, for the Tampa Go meetup. It will be the first meetup we’ve had in like nine months… But we’re gonna do one for Go 1.8, and that’s a big deal, because 1.8 is a big deal, and we’re all very excited about it.

Alright, other exciting projects, let’s see… These are all my projects; did you guys do nothing in projects and news? I’m just gonna say them all, because I’ve put them all in here. So a really cool app that I found is called Releaser, and it’s in the repository at github.com/goreleaser/releaser.

[39:52] It’s an awesome app that does cross-compiling and it will automatically build your app and tag a release on GitHub and upload the binaries for you, which is really cool, something I was looking to do recently and didn’t have a way to do it without RubyGem. So that one’s pretty slick, I like that a lot. I wish it would actually do the tagging for me, but it doesn’t do the tagging yet. I’m sure PRs are accepted.

A cool one I found this morning - Mutagen, at the GitHub repo mutagen-io/mutagen. I’m a huge fan of synchronizing code between 8,000 different machines that I use, and Mutagen is kind of like a Unison clone, if you’ve used Unison before. It’s really fast, and it runs in the background and it has some nice tools; so I was playing with that today. I like Mutagen quite a bit.

So what happened to – was it SyncThing, the one you were using before?

SyncThing ate my breakfast once, and I haven’t been able to turn it on since. I lost a day of code with SyncThing. I’m sure it was my fault somehow, but yeah… I haven’t turned on SyncThing since I lost that day of code. It made me grouchy.

You weren’t committing? How was your fault?

So I was synchronizing code between multiple machines…

But not committing it? Just committing on one machine, or…?

Yeah, just saving it on one machine, and then it gets synchronized to other machines… And something happened - I don’t know, I deleted something somewhere and it ended up wiping out the entire source directory for my Go stuff, and everything that wasn’t committed to GitHub got lost, and it made me sad.

That’s painful.

It was. I stopped using SyncThing at that point.

Do these tools all work on your Windows machine, or…?

Yes, so far all of them do. I wish I could remember what I did. I’m sure it was a user error, and I don’t want to speak poorly of SyncThing because lots of people use SyncThing very successfully, so I’ll take all of the blame for my user error there, but I haven’t used it since.

So basically it’s not a SyncThing thing, it’s that you’re scared you’re gonna screw it up again, it’s what you’re saying…?

Exactly, I’m positive that I’ll do something foolish and lose source code again. I don’t wanna do that.

I do all of my development in Dropbox.


I did that early, early on, but I stopped doing it.

Yeah, I do everything in Dropbox.

Yeah, I had a bad experience with Dropbox.

It sounds like everybody’s vodka story. [laughter] “Yeah, I drank too much Dropbox once. It was bad.”

Yeah, knock on wood… In five or six years I’ve never had anything bad happen, and almost my entire home folder is in there.

Just Git commit, you’ll be fine.

See, so that’s the scary thing about having a hundred percent synchronization over a backup strategy, right? If you destroy the file in one place, you destroy it everywhere.

See, Dropbox offers history.

Well, again… I’m sure it was a user error. PEBKAC.

So the last awesome tool I found is called Prism, and there’s an article on Medium today… Let me copy and paste that URL.

Is Medium still going today?

Oh, just for today.

It’s up right now, but who knows…?

Yeah, who knows…? So Prism is a pretty nifty open source profiling tool for Go code, and the thing that I really like about Prism is that it shows historical diffs over time. So you can run a profile on your app, and it has pretty decent-looking output - better than pprof, obviously - and as you make changes to your application, you can view the difference in those profiling changes from the most current revision to the last one, or you can view the entire profile difference. So you can say “This change made me 5% faster, but since I started profiling, I’m 1000% faster.”

[43:57] It’s really neat to show historical changes in your profiling. And it’s got a nice interface, it looks really easy to use… I have not yet tried to use it, but it looks pretty nice. So Prism… I don’t even remember what company released it, but it looked pretty cool.

Yeah, I haven’t played with it myself personally, but I love the aesthetics of it, the comparison against previous versions. And the name is cool too, Prism. And it’s inspecting stuff, monitoring stuff…

Yeah, it sounds like a CIA Black Ops project - Prism.

I wanna say those were kind of the core things this week that we ran across… There was probably some other stuff, but two weeks away is a long time.

And by ‘we’, we mean Brian. [laughter] We’re just riding on your back, Brian.

Hey, in my defense, I dropped the Grumpy link in the GoTime FM channel for the hosts a while back (a couple days ago, something like that).

Only after I saw it, though. It’s too late. Nice try.

Can I say that then?

Does that count? I saw all the stuff first; I just was lazy and decided to let you do it.

Yep, that’s fine. Nobody will believe it, though.

Works for me. So let’s move on to #FreeSoftwareFriday. This is the part of the show where we give shout outs to projects and people that make all of our lives easier. Who wants to go first? [pause] Nobody?

I can go first. I wanna give a shout out to this library called Refresh. It sounds very cool, I’m actually gonna start using it. I just found out about it, and guess what? It was written by our guest.

I know.

So basically, if you’re working with a Go project and you run this library, if you change your Go files, you will – what is it, Mark? Why don’t you explain it? I know what it does, I’m just having trouble explaining it.

It’s pretty simple; there are actually a few of these types of libraries out there, but essentially it watches your file system using the fsnotify package, and as your Go files change, or files that you say “I’m watching” change, it will rebuild your Go binary and start it back up again.

Does that use ionotify under the background?


Fsnotify, I’m sorry, my bad. Sorry, Nathan.

It also offers a webhook that you can put into your Go code that will show you in your web browser what error has occurred compiling your app.

I have something embarrassing to share, but I will because I don’t care. I lost half a day one time doing work and checking my work manually, and the changes weren’t appearing, and I thought because I was just doing it wrong, and I forgot that I had to rebuild my binary… [laughter] Oh my god…

Okay, that is embarrassing. I probably wouldn’t have told anybody that.

I know. But I never did it again, though.

I’ve done similar things though, too. I was building a CNI plugin for Kubernetes, which is the container networking interface, to basically control the networking interfaces that pop up in the container, and their IPs and all that stuff, and I couldn’t figure out - it was at least a day, maybe a day and a half - why my CNI plugin was not getting called, and I realized that I was using host networking, and of course host networking doesn’t need to call [laughter]. Yeah, that kind of sucked. Talk about some time wasted…

[47:58] That’s not as bad as developing on a remote Linux box and then opening a local host, calling it 8080 and wondering why your web server isn’t started. [laughter]

Oh, I can beat that. I have had Vim open and in my file finder I have deleted the folder, and I’ve been editing in the trash folder. [laughter]

Oh, man… The pain.

It’s happened to everybody.

I feel better now.

Those are those days where you’re like, “Am I really qualified to do what I do?”

The answer is always no… A resounding no.

Those are the days I just get up and watch Police Academy. [laughter] Just all of them, back-to-back, even the non-Guttenberg ones.

No… Those are terrible. So my #FreeSoftwareFriday shout out is for Buffalo. Even though it’s topical today, it really has changed how I look at web development in Go. I didn’t use to think that web development in Go was fun, even though I typically consider myself a Go apologist and I said, “Oh, absolutely, you can do web development in Go”, it still wasn’t fun. Now it is again, and I very much appreciate that application and whatever guy is that wrote it.

Thank you, Brian. I feel exactly the same way.

Sounds like that guy will be getting into GopherCon after all…

Nope. [laughter] Pictures at the door.

He’s got, wait, what’s our countdown here, 189 days to redeem himself. [laughter]

Yeah, I’ll have to grow a beard, dye my hair…

Then we might let him in on good behavior…

I was gonna tell everybody I’m Cory LaNou, and then I’ll definitely not get in, I guess…

No, he’s invited.

Oh, whatever.

So did you have anybody you wanted to give a shout out to, Mark? I know you like the shoulders of giants.

I was actually gonna point people at my Shoulders of Giants file because there is too many people to thank for all the great work that they’ve done, not just for Buffalo, but just in general. Everybody who’s committed to Gorilla, people like Fatih, for all the work he’s done in the community, and Dave Cheney… If you haven’t used Dave Cheney’s errors package, what are you waiting for?

Oh, you have to.

Yeah. There’s just so many… Just go there and find all those people and say thank you to them, because they do great work.


So you actually brought up mine in yours… I’m actually gonna thank a person, which is Dave Cheney. Many of us have learned a lot about the language through a lot of his blog posts, but he participates I think in a lot of stuff that people don’t even really know. He’s constantly behind the scenes contributing to projects, to proposals to the Go staff… I think he’s involved in almost every Go conference, to varying degrees of capacity.

He’s the program chair for GopherCon - the great programs that we have at the conference are largely thanks to him and all the work that he does in his spare time there, so I think we can’t give Dave enough props for all that he does in the Go community.

Even if he’s Australian.

Especially if he’s Australian.

Yeah, Dave is awesome.

Somebody on Slack mentioned that the errors package should be in standard library. I’ve been begging for that ever since it came out, and I think we need to start an actual movement and just get it to happen, because it’s completely compatible with the errors package in standard library; there is no reason not to have it included. So let’s start calling our representatives and elected officials and make that happen.

I one hundred percent absolutely agree. Not having stack traces and errors seems like a bit of an oversight, and being able to have those back because of Dave Cheney is amazing.

Yes. Thanks, Dave. We love you.

[52:00] I would say I’d buy him a steak, but I’ve already done that. I have one more shout out I’d like to make, because it just dawned on me… The Octotree plugin for Safari, Chrome, Firefox. If you haven’t seen it, it’s amazing. It’s a plugin, and on the left side of your screen you have a file tree for GitHub repos.

Oh, I have seen that. I wanna say that I did it right away, right after they released it, and it crashed Chrome for me. Is it more stable now?

I’ve been using it for ages and it’s amazing. I honestly can’t imagine using GitHub without it.

That is awesome.

That is really cool.

It’s a non-Go shout out, but I was looking at something on GitHub just now and I was like, “Oh my god, I need to shout out to this.”

Yeah, #FreeSoftwareFriday doesn’t have to be just Go.”


We’ve thanked many a tools that we use on a daily basis.

Who are you calling a tool? [laughter] This show just went from PG to PG-13.

Excuse me just one second… I will leave when I am damn well, good and ready to leave. [laughter] No, I haven’t bought anything, and I don’t plan on buying anything. How’s that?! [laughter] I’m on with Casey Affleck. Yeah, CASEY! Not Ben. Yeah, the talented one. [laughter] Yes, thank you. Sorry about that. [laughter]

I’d say that wraps our show. Yeah, that’s a wrap, kids. [laughter]

So people are gonna leave this episode with either the feeling that they’ve listened to comedy hour, or just completely confused.

I don’t know if we lowered or raised the bar by a lot, but it’s one of the two.

The bar is typically lower whenever I enter a room… I tend to bring a screeching halt to anything I’m a part of, so yeah…

If this episode is one of your favorites, thank Mark. If it’s one of your least favorite, just know that whenever Mark shows up, he brings the collective intelligence of the room down. [laughter]


You know what’s really embarrassing? I just finished a live class for O’Reilly, and I think there were 250-300 people in the class and I said, “Everybody needs to go listen live at changelog.com/live after this class.” That might have been a mistake.

You feel sorry now.

Sorry, everyone.

Yeah, it might have been a mistake.

So this is why we can’t have nice things…

It is. Mark is why we can’t have – well, actually, Mark is what brings the love back to Go web development, so we’re gonna let it slide this time.

It’s a love/hate relationship.

Yes. I always joke, my parents recently moved in down the street from me…

Yeah, don’t even… [laughs] So they leave down the street from me and I say it’s like living in the sitcom now “Everybody hates Mark.” [laughter]

So now I know the story of how you lost power. They’re like, “Nobody needs more Mark.” [laughter]


“Shut it down!” So we should probably end the madness… Definitely thanks to everybody who’s on the show. Thank you, Mark, for coming on the show. Thank you to everybody who’s listening live and will be listening to this when the recording has released. If you aren’t currently, we are at GoTime.fm, we are @GoTimeFM on Twitter, and there is also a GoTime FM Slack channel. If you subscribe, we will have a weekly email starting up sometimes. If you wanna be on the show or have suggestions for people on the show, github.com/gotimefm/ping.

Huge shout out to our sponsor StackImpact for sponsoring the show, and with that, bye everybody!

Goodbye. Thanks, Mark!

Goodbye, thank you guys.

This was fun, bye!


Our transcripts are open source on GitHub. Improvements are welcome. 💚

Player art
  0:00 / 0:00