Silence is Complicit. I'll Speak Up Now.

Jessie Frazelle of Docker engineering fame wrote This Industry is Fucked a few days ago. Read it now if you haven’t. Her experience - and as far as I can tell the experience of most women in technology - is revolting, shocking, disgusting, all of those things.

I share all of the positive sentiments expressed by people in response to her tweet: Jessie’s an important engineer working on important things that I use every day; she tweets funny and important things (I found i3wm from her and it made computers fun again, but that’s another post…); she gives awesome talks. So yeah: fuck the haters, keep your head up, you’re awesome - I agree.

Fuck the Haters. But Wait, There’s More…

But no one should have to grin and bear this shit, so it has to change. And “it has to change” is a hollow, abstract rallying cry. So here’s something concrete that I commit to do from now on:

If I overhear you making sexist, misogynist statements to/with your buddies at a conference, I’m calling you out on the spot. Doesn’t matter if you think I’m not listening or if we don’t know each other or we’re 15 feet apart in the hallway. If my neurons have to process your garbage, game on. I’ll do my best to calmly explain why what you said is wrong, and I hope you’ll be contrite and apologize. If not, I’ve probably already seen your badge and know your name, and I’ll let the conference organizers know what you said. Even if you do apologize, I may tell on you because fuck that is why, I’m done being complicit.

Relevant Backstory

I failed at this just a few weeks ago at DockerCon. I was sitting at the bar in the conference hotel working through e-mail, and two guys a few seats down with attendee badges on were mocking the MomOps in DevOps talk that was scheduled for later that day: they ridiculed it, laughed at it, made jokes about working mothers. It made me viscerally upset, but I did nothing. I’m pretty sure they even gave me a sideways glance and determined I was safe: big bearded white guy, we’re clear. I felt too angry to be constructive, but I also questioned my place intruding in their conversation. I was complicit then - and I have been in the past - in the culture that breeds the monsters that torment women in our industry. Never again.

What You Should Do

Do that thing I wrote a few paragraphs up. Don’t be complicit, don’t be a safe harbor. Call people out on the spot. Shine a big bright light every chance you get. Do other things, too. Find something concrete that you can contribute and let’s get to work on cleaning up the mess in our industry.

Hugo on the Go: Static Blogging from an iPhone

I moved from Ghost to Hugo a few weeks ago. After ironing out a few kinks with look and feel, the only missing link was writing and publishing from my iPhone. Definitely not something I do often, but it was easy on Ghost and I thought it should at least be possible with Hugo.

Write and Publish from Workstation

Writing and publishing from a workstation with Hugo is pretty standard if you’ve used a static website/blog generator (like Pelican or Jekyll). Here’s my basic workflow to create and publish a new post from my laptop:

  1. The site (minus the generated content) is on GitHub: https://github.com/evandbrown/evanbrown.io

  2. Create a new post:

    hugo new -t casper post/probably-a-pizza-review.md
  3. If there are images, they probably came from my phone and are synced to Dropbox, so I’ll copy them into the blog:

    cp ~/Dropbox/camera-uploads/pizza-pic.jpg ~/dev/evanbrown.io/static/img/
  4. Run the Hugo server and make sure things look good locally:

    hugo server -t casper
  5. Looks good. I’ll commit and push the changes:

    git add content/post/probably-a-pizza-review.md
    git add static/img/pizza-pic.jpg
    git commit -m "New Pizza Review"
    git push origin master
  6. Finally, generate the static content and sync to S3:

    hugo -t casper
    aws --region us-west-2 s3 sync --recursive ~/dev/evanbrown.io/public/ s3://evanbrown.io/

It looks a lot worse than it is. Even if I wasn’t worried about mobile, that last step where the site is generated and synchronized to S3 should be automated. Pushing to remote should be the final step in publishing, and as it turns out is the key piece in getting this to work on mobile.

Authoring with Hugo on an iPhone

I knew there were two tools I needed to get this working:

  1. A git client for iOS - I wasn’t sure this existed, but it does. It’s called Working Copy and it is bad ass. Like, not just “it works, but it’s a real pain-in-the-ass” functional, but actually fully-featured and easy to use. More on Working Copy below. It’s $10. You should buy it.
  2. Travis to generate the static site and push to S3 after it’s been commited to GitHub. Like I said, automatic build and deploy is a huge win even if never publish from a phone. Travis is awesome and makes this trivial; details on the configuration below.

Writing a Post with Working Copy

Since I don’t have hugo new... on the phone, I created a template in evanbrown.io/content/post/template.md that I copy to a new file and start a new post. In addition to doing all of the git tricks, Working Copy also has a totally functional text editor, so I use it to write. Here’s the basic flow, followed by a gif showing the UI:

  1. Initial setup of Working Copy: sign into GitHub (or BitBucket) and you’ll get a list of repositories to clone
  2. In Working Copy, locate template.md and copy it to new-post.md
  3. Open new-post.md in the Working Copy editor, change the front matter and write the post
  4. If you have a photo, open Photos and send the picture to Working Copy. I can’t overstate this: Working Copy has fantastic integration with iOS. It’s trivial to sling or squirt or whatever files from an app into a git repo.
  5. If you added a pic, now you have 2 files to commit. Write a commit message, then commit and push the files to GitHub.

Here’s a gif showing all of that, plus a few meta frames showing creation of the gif and adding it to the repo, and finally committing/pushing the whole thing:

What is that, a gif for ants? Unfortunately, Giffer - I paid $2.99 for it - wants a $3.99 upgrade to do high res images. Huh.

Build and Publish with Travis

I dropped a standard and simple .travis.yml in my repo. The current version is at https://github.com/evandbrown/evanbrown.io/blob/master/.travis.yml. Here’s a pretty snippet current as of the publishing date:

language: go
go:
- 1.4
install:
- go get github.com/spf13/hugo
script: hugo -t casper
deploy:
  provider: s3
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_KEY
  bucket: evanbrown.io
  region: us-west-2
  endpoint: evanbrown.io.s3-website-us-west-2.amazonaws.com
  local-dir: public
  skip_cleanup: true
  on:
    repo: evandbrown/evanbrown.io

Again, Travis is badass. Combined with go binaries, this was so easy. We just go get hugo and override the build command with script: hugo -t casper. That generates the static content and puts it in the public/ directory (relative to the build).

Travis provides built-in support for deploying to S3 after a build. This was the trickiest part. Set the region and endpoint to the correct values for your bucket. skip_cleanup is required so the generated files aren’t deleted, and local_dir limits the uploaded files to those in the public/ dir. Finally (and most importantly) I created an IAM user just for Travis, with s3::PubObject** just for my bucket:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "travis-put",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": [
                "arn:aws:s3:::evanbrown.io/*"
            ]
        }
    ]
}

Copy and paste the values into AWS_ACCESS_KEY and AWS_SECRET_KEY env vars in Travis. Don’t download or save the creds. Replace them in the future if you need to.

Now I can push (from my workstation or iPhone), and Travis builds and publishes http://evanbrown.io. And it costs like a few pennies a month, but I didn’t switch from Ghost for that reason (I switched because I didn’t want to manage upgrading the Ghost software and OS it ran on. Ain’t got time for that.)

Here’s a successful build:

Next Steps

Here’s what I want to do next:

  1. Get www.evanbrown.io to redirect to evanbrown.io
  2. Put SSL on it
  3. Create a preview branch that Travis builds and publishes to preview.evanbrown.io so I can…preview stuff before merging to master and pushing that? Nah, that sounds like overkill. Nevermind.

The Woodlands: More Pizza and Pub Options in North Seattle

The Woodlands - formerly The Boardroom Cafe - opened a few weeks ago in our neighborhood, specifically on east side of Aurora between 83rd and 84th streets (it’s still knows as The Boardroom Cafe to Google):

We went to the Boardroom for coffee and breakfast sandwiches a few times. It was always good, but crossing Aurora was enough of a barrier that we’d head to Neptune on Greenwood instead. A huge Starbucks opened directly across the street from Boardroom last year, so the pivot to pizza and beer was a good idea. We’re on a pizza kick lately, so we loaded June in the stroller and set out on the 5-7 minute walk to give it a shot.

Ballard Beer

The sandwich board out front got me excited with a list of solid Pacific Northwest beers, including two Seattle favorites Reuben’s and Stoup. We had the Reuben’s Summer IPA, a nice, citrusy drink for a hot day.

Babies Welcome

They had high chairs, a place to put the stroller, and even mentioned that they can do off-menu things for little ones like avocado and blueberries. Nice! We felt totally welcome with June.

Really Good Pizza

They’ve got a cool wood-fired oven, and hand-make the pies in plain view. I saw an employee bringing wood from the back fairly regularly to keep the oven going. It was a tad slow - about 35-40 minutes from order to eating - but all the tables were filled and I’m sure they’re working out kinks. I bet that will get worked out. But what really matters is the taste. I ventured out and got a barbeque chicken pizza, while Elli went with the vegetarian option:

I didn’t try Elli’s pie because I was obsessed with mine. The bacon was thick and generous, the chicken could stand alone in a sandwich (moist and great bbq flavor), and the crust was perfect. The cliantro, jalapeno, and onion were added after the pizza was cooked, giving it a fresh taste.

Service was also quick and friendly. They’re not quite finished designing the inside, so it looks a little rough on one side of the restaurant, but I expect they’ll get that done in the next month or two.

This is a different pie and dining experience than Delancy (I wrote about them a few weeks ago). The crust isn’t thick, but it’s not Delancy-thin; the toppings and available configurations are more traditional than Delancy, but Delancy focuses on simplicity and local ingredients. Delancy has a killer wine and cocktail selection, and Woodlands nails beer. The price point is similar ($10-15/pie, same size). There’s room in our world for both of these places.

Check it Out!

If you’re in North Seattle, I’d recommend a cold beer and pizza from The Woodlands. This is an especially great location for folks in northwest Greenlake: super easy walk for delicious food.

Pancake Pointers

I really got into making pancakes when June was born. She’s loved them since she started eating solids, and I took some artistic leisure for her birthday breakfast

:

My latest trick makes the cakes very fluffy and adds a very subtle tang that I think is great: substitute 1/4 of the milk with whole-fat vanilla yogurt (flavor matters; regular, non-vanilla is too tart). Here’s the result from last weekend: