Fedora 31 on the Razer Stealth GTX (Late 2019)

My hunt for a shiny new laptop always starts with the best of intentions, but well-intentioned laptops usually don’t come with gaming-ready GPUs. What do I mean by a “well-intentioned” laptop? I have a lot of respect for System76 and Star Labs for their lovely Linux-first systems, and particular respect for Purism‘s holistic approach to the union of open source hardware and privacy. But I’d be lying to myself if I didn’t admit that my ideal laptop is just as capable of running triple-A video games as it is of running Linux-based workloads.

With this in mind, after careful consideration of several sensible options, I ended up with Razer’s 13″ Stealth GTX laptop. As far as I can tell, this is the first time that Razer has offered a discrete GPU in their 13″ Stealth form factor. The result is a completely-under-the-radar ultraportable gamer that doesn’t look out of place on the desk in my office.

In order for me to make the best use of my laptop as a work system, Windows 10 wasn’t going to cut it. Even with the Windows Subsystem for Linux in place, native Linux Containers don’t work in a Windows 10 environment. Not to mention the odd looks I’d be getting from a company full of folks that, for the most part, stick with RHEL, Fedora, and MacOS.

So, here’s a walkthrough of everything I did to get a dual-booted Linux environment running on this beast of an ultrabook:

1. Set up Windows

Out of the box, set up the Windows environment on the Razer. This includes all of the updates of Windows, Razer drivers, the nVidia driver, etc. It will probably take a couple of hours to get through this step.

2. Create Space for Linux

Using the built-in Windows Disk Management utilities, shrink the largest single partition on your hard drive. Personally I wanted about 120GB for my Linux setup out of the total 512GB of space on the drive. The largest partition was like 450GB, and now it’s down to 330ish. Plenty of space for video games.

3. Disable SecureBoot

For the approach I’m going to use to install nVidia drivers, I needed to disable SecureBoot in the BIOS. There is a workaround if you want to go through the trouble of self-signing the nVidia drivers — Google will point you in the right direction.

4. Install Linux

As the title of this article implies, I installed Fedora 31 from a LiveUSB image onto the laptop. A couple of notes here:

  • I let the installer auto-partition the empty space on the laptop drive
  • I encrypted the Linux installation because it’s good form

Left to it’s own devices, the LiveUSB installer detected the Windows partition and automatically included support for booting into Windows from the grub2 boot menu.

5. Hardware Compatibility Adjustments

Once the installation was done and I could boot into Linux, I spent a few days of trial and error trying to figure out the right adjustments for the Razer Stealth hardware. Here’s what I found:

Suspend / wake fixes
This was the main, non-intuitive problem I ran into. Everything seemed cool with the Linux installation until I closed the laptop lid for the first time. When I opened it later, the laptop seemed to un-suspend but then a moment later it was trying to suspend again.

Later on, upgrading to Linux 5.4.7 exposed a problem with the nVidia driver (more on the nVidia driver below), but props to Major Hayden for finding a solution for that.

The fixes to both of these issues involve passing arguments to the kernel command line. As root, edit /etc/default/grub and find the line that starts with GRUB_CMDLINE_LINUX. To the end of the line of arguments assigned here, add button.lid_init_state=open pcie_port_pm=off.

After doing this, still as root, run grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg to force the regeneration of the grub config menus.

Replace Nouveau with nVidia drivers
Following the wisdom of Major Hayden, I enabled the RPMFusion yum repos and installed the akmod-nvidia drivers. This approach is really slick as it not only installs functional drivers, but it also does the blacklisting of the nouveau drivers for you.

Control that fancy keyboard
As of the time of this post, there is a pull request making its way through the OpenRazer project’s code review process that will enable support for this laptop model. I’ve already set up the Fedora repo and installed the openrazer-meta package. When that PR is merged and the RPM is rebuilt, I’ll be able to tell my keyboard to pick a color and stick with it.

And there you have it

Even though the steps ended up being pretty straightforward, a lot of trial and error went into getting this all figured out. Hopefully this will be useful to the next person who decides to go large with a Razer Stealth GTX while going Linux at the same time!

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?


Perl’s not that bad :-)


“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


“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.


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.