2019: Year of the Spartan

In October of 2018, I got my annual physical and came face-to-face with the reality of my current weight and fitness levels. I was at 30 BMI and at my lowest amount of regular physical activity in years. The trend was not good.

My wife encouraged me to try Noom – I signed up for it the same day as my physical – and the support and coaching that I got through that little mobile app was transformational. It wasn’t just about reducing calories and increasing activity; it was complete mindset shift. I think about food differently now.

I had set myself up for extremely gradual weight loss. I figured that this was a marathon, not a sprint. By March of 2019 I was already seeing major improvements in the way I looked and felt. And so I made a crazy commitment to myself. 2019 was going to be the year that I completed my first Spartan Trifecta.

I had run Spartan Sprints – 3 to 5 mile obstacle course races – in the past. But never a Super (8 to 12 miles) and certainly never a Beast (13 plus miles). And now I was going to do all of them in a calendar year. This goal scared me a little bit, but then – fear is a great motivator 🙂

The photo above is me finishing the final obstacle of the Mt. Killington Beast in September. I had dropped 30 pounds in 11 months, and I was just about to complete a 30-obstacle course. One obstacle for every pound. And this is me crossing the finish line:

I’m putting this here mostly as a reminder to myself – that at age 45, I accomplished this. And moreover, if I want to maintain what I’ve achieved, I need to keep finding the edges of my comfort zone and pushing past them. So yeah, I’m already signed up for a 2020 trifecta 🙂

Hey reader – if you’re motivated too – embrace patience, embrace focus, and crush those challenges!

I wonder how hard it is to exit that car?

nixcraft:

Perl’s not that bad :-)

nixcraft:

“If you put a million monkeys at keyboards, one of them will eventually write a Java program. The rest of them will write Perl programs.”

— Unknown 

Fake it ’till you make it

nixcraft:

“Every great developer you know got there by solving problems they were unqualified to solve until they actually did it.”

— Patrick McKenzie

I don’t hold myself in the same stratosphere as the amazing software developers that I work with every day. But given that I started my career with a degree in writing, I’d say this rings true for the ‘pretty good’ developers as well.

TGIF

Cocktail Hour

Here at The Internet Shipyards, Friday night is cocktail night. Today’s special guest: the Rusty Nail, also known as the World’s Simplest Cocktail.

  • 1 part Drambuie
  • 1 part cheap scotch

I can’t overstate how cheap the scotch should be. If it doesn’t come in a bottle with a white label that says “SCOTCH” on it, it’s probably too fancy for this cocktail.

Cheers 🙂

That App You Love – Headed to DevConf.cz!

Starting back in September I published a series of articles for the Red Hat Developer Blog under the series title “That App You Love”. I’m psyched to announce that “That App You Wrote”, my followup presentation, has been accepted as a talk at [DevConf.cz](https://devconf.cz) this month! Didn’t read the original series? You can follow along here:

1. [Making a Connection](http://developerblog.redhat.com/2016/09/27/that-app-you-love-part-1-making-a-connection/)

2. [Immutable but Flexible – What Settings Matter?](https://developers.redhat.com/blog/2016/09/29/that-app-you-love-part-2-immutable-but-flexible-what-settings-matter/)

3. [Every Setting in Its Place](https://developers.redhat.com/blog/2016/10/04/that-app-you-love-part-3-every-setting-in-its-place/)

4. [Designing a Config-and-Run Container](https://developers.redhat.com/blog/2016/10/06/that-app-you-love-part-4-designing-a-config-and-run-container/)

5. [Upping Our (Cloud) Game](https://developers.redhat.com/blog/2016/10/11/that-app-you-love-part-5-upping-our-cloud-game/)

6. [Container, Meet Cloud](https://developers.redhat.com/blog/2016/10/13/that-app-you-love-part-6-container-meet-cloud/)

7. [Wired for Sound](https://developers.redhat.com/blog/2016/10/18/that-app-you-love-part-7-wired-for-sound/)

8. [A Blueprint for “That App You Love”](https://developers.redhat.com/blog/2016/10/20/that-app-you-love-part-8-a-blueprint-for-that-app-you-love/)

9. [Storage and Statefulness](https://developers.redhat.com/blog/2016/10/25/that-app-you-love-part-9-storage-and-statefulness/)

10. [Long Live “That App You Love”](https://developers.redhat.com/blog/2016/10/27/that-app-you-love-part-10-long-live-that-app-you-love/)

The upcoming talk will summarize the highlights of the series, along with some additional notes on cloudify-ing legacy apps. If you can get to Brno at the end of January, DevConf.cz is a _great_ annual tech conference and registration to attend is completely free.

## That App You Love on GitHub

If you want to fast-forward to the full stack application from my blog series, make sure you read [Part 5](https://developers.redhat.com/blog/2016/10/11/that-app-you-love-part-5-upping-our-cloud-game/) and [Part 9](https://developers.redhat.com/blog/2016/10/25/that-app-you-love-part-9-storage-and-statefulness/). Then you can grab some helpful template files from [nhr/znc-cluster-app](https://github.com/nhr/znc-cluster-app) on GitHub. Happy coding!

A Sunbeam for Mia

We lost Mia today. I’ve always read posts like this with some amount of indifference because in the back of my head I am thinking “this is just an animal” and “this is not a person”. And so I forgive you for feeling the same way. I understand that response.

This stream of thoughts is really for me, and it is also for my wife and kids and anyone else who feels the loss of our “just a cat” as acutely as I am feeling it right now. But maybe you’ve been here, too, with your pets, at the end of a chapter in your own life. Here is a rememberance for us.


Mia and her sister Pia came into our lives on March 15th, 2002. I remember this day well because it was the Ides of March and by an ironic coincidence, I spent that day at the enlistment center in Boston, signing up to join the Army National Guard. The cats were originally found in a cardboard box by a dumpster, and their age at the time that they came home to us was estimated to be eight months.

We had no children yet, we were both working, and I was going to be disappearing for two and a half months to go to basic training. My wife wanted (and still wants) a dog, but I knew our lifestyle couldn’t work with dogs. Mia and Pia were the compromise.

Despite being part of the same litter, Mia and Pia couldn’t have been less alike. Pia was a long haired cat, mostly gray with dark streaks. Mia was the classic black and white tabby cat. Pia was a normal-sized, aggressive, dominating cat. Mia never grew past the size of a kitten, and spent her youth quietly in her sister’s shadow.

The cats were raised to be indoor-outdoor cats and spent many a night out and about in our neighborhood. The extent of their range was not obvious to us until, a few years later, Pia had gone missing for a few days. A neighbor, some streets away from us, put up a poster about the dead cat they had found meeting Pia’s description.

I went to discover that Pia had been hit by a car and died instantly. The posters that our distant neighbor had put up were a great kindness; otherwise we may never have known her fate.

Pia was like the wild rocker of the pair; she lived hard and died young. We were sad then, but we were young and busy raising the first of our children as well. We had much to distract us from the loss. Our house was also in a densely populated residential area, so rather than burying her in our tiny yard, we opted to have Pia cremated. We had no specific plans about where or when to bury, and so she has resided in an urn on our bookcase ever since.

In Pia’s absence, Mia came into her own as the quiet, methodical hunter that I will fondly remember. Her small size was no shortcoming in the business of mousing, but she was equally as gentle and loving with her humans. She lived out her best years in and around the house, occasionally tying up with other cats or critters in the neighborhood, but mostly just lording over the creatures in our own yard.

For each of our children, during their infancy Mia showed incredible patience and tolerance with their poking and prodding. Her reactions were always tempered to a level that was appropriate to the age of the kids. At night, she could often be found curled up beside one of them. She would follow them up to the house of our friends and neighbors and wait for the kids outside (or even inside, on occasion).


A few years ago we got the first indication that her kidneys were failing. We were able to manage this with special food and for her own part, Mia was still herself. Around a year ago, we had a much bigger scare when I found a large, open abscess on her abdomen. Our best guess is that this was the result of a scrape with one of the other animals in the neighborhood.

The timing of her abdominal injury was tough; it came right in the midst of our house move and so we were making vet visits with her one hour and frantically packing the next. But eventually, everything settled out. Mia’s wound was treated and healing, and we were in the new house. Our vet, who had cared for both cats from the beginning, left us with stern instructions that Mia could no longer be an outdoor cat at the new place.

At first, Mia didn’t take kindly to being sequestered, but she was slowing down and ultimately seemed to accept the indoor lifestyle. Part of me wonders now if she might have preferred to be outdoors at the end, but the lack of closure for our kids would have been pretty hard. It will be hard enough as it is.

Over this past summer, my wife brought a new cat into the family. Mia and Pia were already around eight months old when they came to us, but this new cat was very much a young kitten. With Gus, as we’ve come to call him, Mia made it clear from the start that she would not suffer to live again in another cat’s shadow. Even when the kitten had grown to twice her size in six months, she held her ground against his frequent ambushes and games.

The squabbling was tiresome for Mia, but she had another big health problem brewing. By January, Mia was showing some occasional shortness of breath. By late February, breathing was starting to become a real effort for her.

This past Wednesday, Mia’s new vet confirmed that her chest cavity was filled with fluid. The two likely causes were cancer, or congestive heart failure. In a cat that is already dealing with full blown kidney disease, both of these possibilities are pretty bad. We’d never had to face this part of pet ownership before, but now we had to ask ourselves how far we were willing to go to treat this.

With cancer it would have only been a matter of time, and a pretty miserable time at that. With heart failure alone we might have managed it, but the heart failure combined with kidney failure is a difficult balancing act. I don’t believe that we could have stayed on top of the fine tuning that lies between the opposing treatment plans. Either way would have been a really miserable way to go.

They gave Mia a diuretic on Wednesday to see if it would reduce the fluid in her chest cavity. I spent a half hour Wednesday night just laying the bed with Mia laying on my chest, as comfortable as possible under the circumstances. Yesterday there was no obvious change in her condition, and so we set up the appointment for her to be put to sleep today. My wife let the kids know what was going to happen, and that it was time to start saying our goodbyes. That went about as well as you could expect.

We skipped the kidney-friendly food. Mia had a can of tuna for dinner last night, and she spent her last night curled up on the couch with my wife. This morning she got another can of tuna for breakfast. She ate both with gusto.

But this morning was tough; I don’t think the kids completely grasped that they would leave for school and Mia would be gone when they got home. After they left, I took my breakfast with Mia on my lap, my wife sitting nearby. When it was time go, she held Mia while I got the cat carrier together, and then we sat for a long, tearful moment before I set Mia in her crate.


I will not lie or play down the fact that I was, and still am, a complete wreck. I lost it when I sat down in the car, but I pulled it together for our ten minute drive. As we rode, I told Mia that it was beautiful day, and that we were family, and that we’d had fourteen wonderful years. I told Mia that there was a sunbeam waiting for her past the mounting discomfort of this illness. And I lost it again for a bit, but pulled myself together for the vet’s office.

We went straight in to the exam room. I took Mia out of the crate and into my lap so we could sit there together. Not long afterward, a tech came in with a form for me to sign and to give me information about the cremation service we would be using. A moment later, the doctor was with us, and she explained the process we were about to undertake.

The first shot that they give is a heavy anesthetic. For a cat like Mia it takes about three minutes to set in, and when it has taken effect, the cat is in a deep sleep and totally unconscious. The second shot they give, intravenously, is essentially an overdose of anesthetic that is powerful enough to stop the cat’s heart.

After they gave Mia the first shot, they left us alone while the medicine set in. I wanted this cat to feel loved and comfortable on her way out, and so I just held her and stroked her fur, and started telling telling her about that sunbeam that she would find.

“You are a sweet little cat. Any time that sun hits my face, we’ll be sitting in it together. I’ll find you in a sunbeam…”

And then I just started to acknowledge this deep gratitude that I felt for her:

“Thank you for being there for each of my kids, laying with them as they slept, watching them grow up. Thank you for being there for my wife when I went off to boot camp and she was alone. Thank you for being a part of my life… Thank you, thank you. Thank you.”

Mia had been purring as I stroked her and talked to her, but eventually the purring slowed and then stopped, her body slackened, and I could feel that she was in a deep, relaxed sleep.

When the doctor and the tech returned, I layed her on the examination table so that they could run a line for her second shot. Laying there, I could see that she was barely bigger than the first time I saw her fourteen years ago. As the medicine went in, her lungs rattled a bit from the effort of breathing, and then Mia was gone.

They left me again to say my last goodbyes, and the moment they were out the door I well and truly lost it. I had the foresight to bring along a tea towel and I was using it to cover my ragged breaths as the tears streamed down my face. Eventually I collected myself and stood there for a while, stroking Mia’s fur until I was reasonably confident that I could walk to the car without losing it again.

My last glimpse of Mia was of the tech coming in to take care of her. She was speaking kind words to Mia and I appreciated the care and respect that she and the vet had exhbited through the whole business.


My father, who has owned and had to say goodbye to a few pets over the years, observed to me once that the span of a pet’s life is like a chapter in our own lives. Mia’s chapter was the beginning of our time as adults with a home and a family – first with cats, and then with children of our own. Mia’s chapter closed in a new house, with our first child on the verge of being a teenager.

Back at the old house, we never had a plan for burying Pia. Maybe, without really knowing it, we were waiting to bury Mia and Pia together. Now we’ve got enough land to make a proper memorial garden for both of the sisters. When Mia’s ashes come home, we’ll find a nice spot and we’ll make sure that it’s a spot that gets plenty of sun. I think that the combination of being outdoors and laying in a sunbeam is as close to Nirvana as Pia and Mia could get.

Advice From an Open-Source Hiring Manager

In Decemeber of 2014 I transitioned from fifteen years of being a developer into being one of the people managers on a really amazing team here at Red Hat. All told, my first year in this role has been a tremendous learning experience for me. If you are interested in becoming a part of a team like this one, here is some advice for you based on the dozens of interviews I have conducted over my first 15 months.

1. Do Your Homework

A little basic Googling will reveal that I currently work for Red Hat and that I am involved with the Project Atomic and OpenShift projects, both of which are open-source and are hosted on GitHub. If one of our awesome recruiters sets you up for an interview with me, they will also tell you about these projects. When this happens, read up on the projects.

I know that you may already have a day job, and outside of work your life may be just as busy – but time-boxing 15 minutes to learn the basics of the project you are being interviewed to work on seems reasonable to me. I’m going to ask you: “what do you know about $project?” and you should be able to come back with “I checked it out on GitHub and here’s my understanding of the system…” If you can’t do that, you’re either a recent college grad and I give you the benefit of the doubt, or you’ve been working long enough to know better and you come across like an artiste whose genius must certainly exempt you from things like reading ahead.

2. Put Your Best Code Forward

If you already work in open source, you can probably point to a GitHub repository with some of your commits in it. That’s great, particularly if the commits are extensive and show a solid contribution to whatever project you worked on. On the other hand, if you are coming from a closed-source company, or don’t have any high-profile commits, I encourage you to code a sample application and publish it in a public repository.

When I first joined my current team as a developer, I had been working expressly in private corporations with private code repositories. My interviews went reasonably well, but with no working code to point to, the team was hesitant to commit. The interviewing manager asked me to pull together a code sample and suggested that since I was interviewing to work on OpenShift, then I ought to write an app that would work on OpenShift. I put my weekend plans aside and spent 48 hours cobbling together this goofy farmstand search application.

That code is old and somewhat bit-rotted now. I also wrote it in Node.JS, having never worked with it before my weekend hack-a-thon. In the balance, though? Probably the most important weekend in my professional career.

3. Be Ready to Dive Deep on What You Know, and Know When You Don’t Know

As I talk to you during our interview, I’m going to try to figure out where on our team you could be a good fit. Once I’ve started to dial that in, I’m going to start asking more specific questions. I want to understand the level of technical depth that you possess. I don’t have perfect knowledge of all of the technologies that we work with, but if I’m reasonably comfortable with your skills then I am going to have you interview you with someone who can go really deep on that stuff.

So, be ready to talk through multiple levels of the technology that we discuss, and also be ready to tell me when you’ve hit the extent of your knowledge on a given topic. I’d rather spend the remaining time in our interview talking through other technologies rather than having you improvise on a topic that you don’t really know.

Also – don’t be surprised or offended if we ask you some college-level questions about data structures, or sorting complexities. If we’re asking you, it is because these things are directly relevant to the work that you are being considered for. We want our systems to work quickly and efficiently at cluster scale, so this stuff is pretty important.

4. Show Me Your Team Face

My main responsibility to the company as a people manager is to put together the best team to work on the projects that I’m a part of. A large part of this is making sure that new hires have the technical chops to do what is expected, based on their level of expertise. But there are a number of other skills that mean a lot to me. I’m talking about the stuff that we collectively refer to as Emotional Intelligence.

I’m not a psychologist, but I know how a good team operates, and I want to make sure that your participation is going to be a net positive for my team. Sure, I want to hire rock stars – but if we make an engineering decision as a team that you personally disagree with, you’ve got to be able to let your own position go for the benefit of the team. So the challenge to you is to convince me that you can accept the team’s decision even if you don’t believe it is the right approach.

I will ensure that you always have the opportunity to speak your mind, but you’ve got to convince me that you can live with the team decision. This is a huge part of getting things done in an open-source environment.

Seem Reasonable?

Hopefully none of what I’ve said sounds outlandish, or like I’ve got a particularly puffed-up view of my team and my company. Naturally, I think my team at Red Hat is the best team in the business. In fact, bonus advice: if you are considering a job in open source, don’t work for a manager who doesn’t think their team is great.

But more to the point, I think the items that I outlined in this article will be helpful for you at any company that’s doing real open-source work. And even if you aren’t looking right now, putting up some code samples for even the most basic application that you can think up is an easy way to start “building your brand” as a developer.

If you end up interviewing with me, I can’t guarantee that following this article to the letter will land you a job offer. But on the other hand, it will certainly make you stand out to me and the recruiters that I work with.

Good (job) hunting!

Comments on Backing Up a Linux Laptop

My primary workhorse right now is an HP Omen running Fedora 22. Thinking and talking about how to restore my work environment from a total failure, I came to the conclusion that there are three primary things that need to be preserved:

Item 1: My entire user directory under /home, since that’s where all my stuff is.

Solution: Crashplan is impressing me – slick commercial-quality UI, completely free for mounted “local” disk backups and peer-to-peer backups through their central broker. Naturally they also offer managed off-site backups for a cost, but they don’t ram it down your throat. I think they’ll be getting some of my business.

Item 2: A list (preferably in Kickstart format) of user-installed software packages, so that I can restore all of the apps I use.

Solution: this is very distro-specific, but dnf (yum’s heir apparent) has a kickstart-friendly report that I will integrate into a once-a-day kickstart generator script: dnf history userinstalled

Item 3: A snapshot of everything under /etc, which tells the computer how my apps and service should be run.

Solution: I found an awesome utility called etckeeper that turns /etc into a git (or mercurial, or svn) repo and can automatically push changes out to multiple targets. On its own it is nice, but the dnf-etckeeper packages hooks this behavior directly into the package manager – so, every time I run dnf for an update or a new package, my /etc snapshot is updated as well.


Thinking about this now, I realize that for completeness I need to copy /var/spool/cron/* somewhere as well. The only cron job I’m running is the tail-end of an IFTTT hack to gets photos off of my iPhone and into shotwell, but that’s fodder for another post.

New Challenges, New Tools

I almost feel like a traitor, which is a weird way to feel about consumer electronics. But my next laptop is not going to be a MacBook. Our current development work on OpenShift requires easy access to a docker service, and Boot2docker just doesn’t cut it.

Apple provides an excellent ecosystem of interrelated apps; they find ways to make it easy to move content from one app to another that seem intuitive. This requires the lock-step portfolio-wide architecture that you will rarely see in open source. At least, not across native desktop apps.

But so much of what used to happen on the desktop has been replaced by the cloud, and so many interoperability problems are being solved by cloud app folks that in reality, the playing field is fairly level between OS X, Linux and Windows. My parting comment in my WWDC piece was:

…as more of our ‘office’ tools move to the cloud, any platform that can run a modern browser is a competitor…

I don’t necessarily want to do all of my work in a browser, but where web UIs go these days, native clients seem to follow.

What I Like About Mac

Thinking over my years of Apple product use, here’s the top three things I’ve loved about MacBook and OS X:

MacBook build quality is as good as it gets.
This is a big deal, and it matters to me a lot. The all-aluminum design is heavier than some carbon-fiber competitors, but the laptops can take a beating.

OS X provides great default apps.
There are many computer-based tasks where I am not strongly opinionated about the tools I use, and OS X bundles apps developed by people who were paid to be strongly opinionated about them. I’m talking about Mail, Calendar, Reminders, and Notes. The net result is a native app potfolio that surpases expectations, to the point where I feel no motivation to seek alternatives.

I can run Windows for Gaming
Apparently, Microsoft’s OS is capable of doing other things as well, but my laptop’s Boot Camp partition has one job: running video games.

But continuing to use a MacBook as my primary system when I am part of a development team that is doing full-stack work against a Linux kernel is just making less and less sense. And having needed to straddle OS X and Linux for the past three years, I’ve found a series of great cloud-based apps that replace or even surpass the OS X app portfolio.

The New Deal

Having taken all of that into consideration, here’s my plan for a replacement system.

OS: Fedora
From a desktop perspective, there are better Linux-based “out-of-box” experiences than Fedora. But for me, a huge part of being productive in OS X was learning the keyboard shortcuts, and Fedora has great keyboard shortcuts. It also provides a full-screen app / screen switching model that is ver similar to OS X, which makes changing desktops easier for Mac users.

I called out some great default OS X apps above; here’s my replacement plan:

  • For Mail, Geary. Geary provides a very similar conversation-based mail display model and works perfectly with Gmail. My one wish-list item for Geary: let me map IMAP folders to the “special” folders so that you can treat my “Archive” folder on the work server the same way you treat “All Mail” on Gmail.
  • For Calendar, California. Made by the same folks who do Geary (and Shotwell). The display is very Calendar like, Geary supports all of the same protocols as well.
  • For Reminders, I’m partially sticking with Reminders. Well played, Apple. For work tasks I’m mostly using Wunderlist because there are clients for Linux (via Chrome) and iOS. But Reminders has the nice “Remind me when I get to location X” feature so it continues to be used, at least on my phone.
  • For Notes, I’m using a combination of Simplenote and Zim Wiki. Simplenote does everything that Notes does, and Zim Wiki provides a more Evernotes-like experience but in a database that is completely not cloud-based. Some work info doesn’t belong in the cloud; it goes in Zim Wiki so I can still search on it and take freeform notes.

Hardware: HP Omen 15"
If you are not a gaming enthusiast, you’ve probably never heard of VoodooPC. They were a boutique PC manufacturer that made high-end gaming computers. They were bought by HP and after that, Voodoo continued to be associated with HP’s bleeding edge laptops and desktops. These days, the “Voodoo” name has disappeared from HP’s product portfolio, but their DNA remains in products like the Omen 15“.

Like the MacBook, the Omen features an all-aluminum body and a solid-state hard drive. Like the top-end MacBook Pro 15”, the Omen features a discrete graphics processor with its own dedicated RAM. But that’s where the similarities end.

The Benefits of Change

Feature-wise, and based on what we’re hacking at work, I believe I’ve won out in the bargain. Here’s how moving to the Omen matches up…

Lower Cost
As of the time of this blog post, the same-spec’‘ed MacBook Pro 15" with a lesser discrete graphics card cost more. Now, a major argument in favor of Apple has always been that they don’t charge for OS upgrades and Windows does, but in this case, 1) I’m using Linux as primary, so that’s moot, and 2) Windows 10 is also going to be a free upgrade.

Better Linux Hardware Support
I actually ran Fedora directly on a MacBook Air for a while, but the hardware support is not rock solid. Most notably, Apple’s choice of a PCI-based webcam with no open source drivers meant that I could never videoconference from my laptop. These are non-issues on the Omen.

Business in the Front, Party in the Back
The Omen has an almost embrassing amount of LED-driven “bling lighting”. It has LEDs backlighting the keyboard (which is pretty standard), but also in the speakers and fan exhaust ports. Happily, I can turn all of that off in “work mode” under Linux. The Omen doesn’t need it to stand out and look like an awesome laptop. But hey, when I flip it over to the “gaming OS”? Yeah, I’m cranking up the LEDs 🙂

Return on Investment?

Time will tell if I’m going to miss OS X. From the OS / apps side, I think I’ve found a combination that works well between a Linux laptop and an iOS phone, and on the hardware side, I feel like I’ve found a system with the same solid build as a MacBook.

The first time I spin up OpenShift directly on my laptop – that’s going to be a win.