Low-Overhead Linux Networking

I want to do more posts here that are quick roundups of interesting things I’ve read, rather than rambling commentary.

  • DPDK, the Data Plane Development Kit, permits a userspace application in Linux or BSD to bypass the kernel and directly interact with a network card. Handling interrupts to pass data from a 100 Gbps network card through the kernel apparently performs poorly.
  • Selectel’s “Introduction to DPDK: Architecture and Principles” looks like a detailed walkthrough of how it works. (I only skimmed it on the train tonight though.)
  • FD.io is a Linux Foundation project implementing a software dataplane employing vector packet processing (VPP). Its What is VPP? page is a good intro.
  • networking-vpp brings support to OpenStack networking.
  • Ligato and Contiv-VPP bring VPP to Kubernetes (et al.)
  • I’ve run up against mentions of YANG, which is “Yet Another Next Generation” DSL for modeling network data.
  • Intro to networking-vector packet processing is based on a 2018 FOSDEM talk. The Youtube video really helped things “click” for me.

2018 Camaro SS review

Last week, I had to have my car towed into the shop—and then from there to the dealership. (It felt sort of like when someone is taken by ambulance to a local hospital and then taken by medical helicopter to a larger hospital.) The dealership didn’t have any loaners, so they called Enterprise.

Now, Enterprise isn’t a bad company, and their cars aren’t necessarily undesirable, but no one bringing their car to a BMW dealership is hoping for an Enterprise rental. Like any other rental company, the car is always a little tin can that somehow doesn’t have GPS in 2018.

So imagine my surprise when they gave me the keys to this:

I didn’t know much about Camaros, but it turns out that, even more improbably for a rental car, this was one of the good ones, the Camaro 1SS with a V8 making 455 horsepower. Sitting in the driver’s seat with the Enterprise employee in the passenger’s seat as we completed paperwork, it was hard to contain my grin as I pushed the start button and the car let loose a throaty growl.

Once I filled out all the paperwork promising to treat the car gently and the Enterprise employee took off, I tried to at least leave the lot before doing all the things I said I wouldn’t. In my car, you need to give the pedal a fair bit of pressure when the light turns green. I almost think of it as slack in the pedal. Of course you don’t slam the pedal to the floor, but if you’re too ginger, people are going to start honking. Getting a heavy car rolling takes a bit of gas.

At first blush, the Camaro seemed the same. Give it a tiny little bit of gas, and the engine doesn’t deliver much power. So you do what I do in my car—give it a fair bit of pressure. And—oh shit!—that’s how I peeled out of the lot. With way more power than I expected, I let off on the gas in a panic, leaving me rolling through the intersection slowly and looking even more like I shouldn’t be trusted with this car. It didn’t take long to find a better balance, but it certainly wasn’t a great start.

Driving is a blast, though. It’s loud, and packs an awful lot of power. Whether it’s driving around town or passing a slowpoke on the highway, it doesn’t take much to get this thing going, and it’s hard to not have fun while doing it.

An interesting thing I discovered is that the car seems to shut down half of the cylinders when you’re cruising along at a steady speed, which is probably why the thing gets more than 20mpg:

(I don’t know who took this photo, but I’m sure they were on a dyno.)

But go to pass someone, and those extra cylinders come back in the blink of an eye. You’d never know they weren’t running if not for that screen showing it.

The specs show a 0-60 time of about 4 seconds. I didn’t dare try to run a timer while pinned to the back of my seat on the onramp, but I don’t doubt that number. I never got to the end of an onramp wanting for speed, but did often have to let off the gas long before the end because I had surpassed 80.

The ride wasn’t _un_comfortable, but you definitely felt every little bump in the road… And New England roads aren’t exactly smooth in early spring.


I had no trouble with headroom, but the car does sit quite low which probably helps. Audio controls on the steering wheel help you keep your eyes on the road, though I missed the volume controls my car had. The steering wheel felt like leather, imitation or not. The bottom of the steering wheel is squared off for reasons I don’t entirely follow; perhaps to help with legroom getting in. It was a little odd turning into sharp spaces where the steering wheel wasn’t round, but I tend towards shuffle steering so it didn’t come up too often.

A decently-sized LCD in the center console shows everything, from music to climate control settings. Climate control has dedicated hardware buttons, and adjusting temperature or fan speed is done by turning those huge center vents. An overlay on the LCD simply shows where they’re set. The screen has a slight downtilt which seems to prevent the glare that plagues my car’s center screen.

In the instrument panel, the tachometer and speedometer are both large analog meters. Their layout is the opposite of a BMW, but it’s not like it’s hard to figure out which is which. The gauges in the middle are digital displays styled to look like analog meters. A compass readout is front and center, and was just a tad distracting while turning.

The rearview mirror was adequate but remarkably small. At the same time, that also describes the rear window, so perhaps they’re paired well. Flipping the mirror to night mode is done by hand (soooo 2015!), and the button is recessed directly behind the OnStar button. Pressing the OnStar button by mistake makes a loud chime that will freak you out. (Ask me how I know.)

Visibility overall is poor. The front windshield is remarkably short, but gives an adequate view of the road ahead. Side visibility past 90 degrees, though, is atrocious. Trying to take a sharp left while watching for traffic from the right required crazy contortions with my head against the windshield to see past the passenger’s seat. You need to have your mirrors adjusted correctly in this, because peripheral vision is poor.

One review called the rear seats “vestigial,” which is the perfect word to describe them. I used them as a shelf to hold my umbrella. “Legroom” in the rear is comical; reaching to get my umbrella when it slid onto the floor, I didn’t have enough arm room to pick it up. Perhaps if the driver and front passenger have very short arms and legs and pull their seats way forward, you could seat four if the rear passengers were emaciated. I really can’t imagine when you could fit anyone in the back, unless they were maybe in a car seat. (And if you’ve got a toddler, I humbly submit that perhaps a Camaro isn’t the right car for you at this stage of your life.)

In short: having the Camaro for a weekend was a blast. And I certainly wouldn’t mind having one as an occasional fun thing to drive. But by the time my car had two functioning axles again on Monday, I was happy to get something more practical back. Visibility and comfort are surprisingly important.

Towerspotting: Mt. Uncanoonuc

In what is apparently now a series, here’s another “Towerspotting” post. This time I traveled to Mt. Uncanoonuc in Goffstown, NH. (Months ago, actually.)

]2Mt. Uncanoonuc from drone

There are actually two Uncanoonucs, South Uncanoonuc and North Uncanoonuc. South Uncanoonuc, actually the shorter of the two (by 3 feet), stands at 1,321 feet. It is suggested that the word “uncanoonuc” may be from the the Massachusett word for “breast.”

Just a short bit outside of Manchester, the 1,321-foot summit has a height above average terrain (HAAT) of about 250 meters, or 820 feet, which perhaps explains why it’s home to much of the southern NH TV and radio stations.

The contents of the mountain are perhaps better revealed by a lower shot from when I took my drone up there earlier this fall:

]4Mt. Uncanoonuc towers

From left, we’re seeing:

  • WGIR-FM’s old tower, now used for backup
  • A tall Crown-Castle tower (red and white), home to WGIR-FM’s primary antenna system (out of frame; some cellular stuff is all you can see in this shot)
  • Immediately behind it and barely visible, a self-supporter that I think is owned by SBA; home to cellular, microwave, some some land-mobile stuff
  • WMUR-TV’s antenna and tower, also red and white.
  • An abandoned (?) tower, comparatively quite short
  • WMUR-TV’s old antenna/tower from the analog-to-DTV cutover; a microwave dish is mounted much lower
  • WZID-FM’s tower; the 3 lumps on the side are their FM bays, with the two smaller red ones on the side being their backup antenna (I think).
  • Just to the right of it, almost overlapping, is a commercial land-mobile tower
  • Dead center, another commercial land-mobile tower. This looks to be one of the taller sites, over 200 feet, but I’m not sure it actually has an ASR on file ???
  • To the right, the diminutive-looking WNEU-TV tower that’s actually cranking out 80 kW, the most powerful station up there by far.
  • A wide self-supporter that I believe is owned by the Town of Goffstown. There may be another land-mobile tower directly behind it; not sure
  • A very short tower with a few VHF fiberglass whips. The site is on a very small concrete pad and houses a doghouse-sized enclosure that is literally falling apart. Town records have it appraised at six figures.
  • At far-right, an Industrial Communications tower, which looks to be home to cellular and land-mobile stuff.

I’m about 95% sure on those. Corrections welcome!

Here’s another view, showing a few of the towers and looking over to North Uncanoonuc:

]6 North Uncanoonuc, viewed from South Uncanoonuc

Here is WZID’s tower:

(It’s far more likely that my camera was a little crooked than the tower having a lean…) The structures at the very top are simply lightning rods/dissipators. I’m not totally clear what’s up there, but I suspect that the 3 bays at top are their primary antenna system, with the two smaller ones on the left being a backup. The antennas are cross-polarized, to serve listeners whether their antennas are horizontal or vertical, and consequentially look a bit strange compared to your average antenna.

The round dishes are most likely 900 MHz studio-transmitter link antennas, feeding the broadcast audio.

WZID is licensed for 14.5 kW on 95.7, though FMpower suggests that this is probably maximum power for a Class B station based on HAAT.

And here’s WNEU-TV, a Univision station:

Walking around the top of the hill, each tower is surrounded by a barbed-wire or razor-wire fence, and also contains a transmitter building. WNEU’s is one of the only ones that makes a lot of noise, with a substantial HVAC system with giant fans. It made sense when I started looking up licenses, and found that they’re licensed for 80 kW output.

For comparison, here’s WMUR-TV:

They’re licensed for 6.5 kW.

And finally, WGIR-FM, whose antenna we were almost looking into on some of the drone shots:

They are licensed for 11.5 kW at 101.1 MHz, but, like WZID, it seems this is maximum legal power based on their height.

There is also some ham stuff up there, including a few DMR repeaters through DMR-MARC, and a 220 MHz link for the N1IMO repeater. At one time there was a 6-meter repeater as well, but it seems to have faded from the Internet and I’m not sure it’s still around.

Understanding pepper (OC) spray ratings

Pepper spray has been legal in Massachusetts without any sort of permit required for a few years now. It’s also known as OC spray, from the extracted oleoresin capsicum, being an oleoresin formed from capsicum, the ingredient that makes hot peppers spicy.

I recently picked some up, and would like to share a few things I’ve learned.

Where to buy pepper spray

Finding pepper spray in MA can be hard. I’ve seen it in lots of places across the border in New Hampshire, but it’s hard to find in Massachusetts. Making it worse, shipping it to Massachusetts is either prohibited, or thought by online merchants like Amazon to be prohibited. I ended up picking mine up in a sporting/gun shop.

Why all the numbers are meaningless

But here’s the part that really trips me up: the ratings. The spray I purchased is listed as “10% OC (2 million SHU).” Intuitively, I assumed this meant that it was 10% of the maximum strength possible. (If 10% is 2 million SHU, the maximum must be 20 million SHU.) But this is totally wrong! The SHU rating or the percentage alone are meaningless numbers.

What this actually means is this:

  • The solution in the canister is 10% oleoresin capsicum, and 90% other stuff (inert ingredients). If this number were 100%, I assume it would be a sticky goop that you couldn’t spray, so it’s necessary that a decent percentage of the contents be something like water or propylene glycol.
  • The OC that’s in the spray is rated at 2 million Scoville heat units (SHU).

As an analogy: you have a rum and Coke, which is about 25% rum and 75% Coke. The rum used is 80-proof, or 40% alcohol. If your goal is to get drunk, neither of those metrics is meaningful on its own. 25% rum doesn’t necessarily tell you how strong the alcohol is, and “The rum in this Coke is 100 proof!” isn’t good news if they only put a dollop of it in your drink. What you’d actually want to know is the total amount of alcohol.

The same is true of OC spray. Sabre, one manufacturer of pepper spray, has a blog post explaining that you need to consider the product of the two numbers, known as the percentage of Major Capsaicinoids, or MC. The same math is discussed in a number of places; the Sabre blog post is just the first place I saw the math given a name.

Pure capsaicin is 16 million Scoville heat units. So if the oleoresin capsicum in my canister of pepper spray is 2 million SHU, it’s 2/16 = 12.5% of the maximum strength.

But only 10% of the canister is OC, so it’s 12.5% × 10% = 1.25% MC. (Well, the Sabre article uses the same starting numbers to arrive at 1.33%. I’ll assume that I’m the one that’s off on the math.)

A competing product is marketed as 6% and 3 million SHU. That’s 18.7% × 6% = 1.122% MC. Other sources have higher SHU ratings at lower percentages. This all gets very confusing, because manufacturers seem to just decide whether they want to market their product on having a high-percentage of OC, or on a high SHU number. You need to compare the total percentage of capsicum if you want to do any sort of meaningful comparison.


If you’re going to carry pepper spray, you would probably do well to also carry something like these decontamination wipes to help alleviate the effects, in case you end up getting some of the spray as well. (There are a few other products linked from there as well. Having never used any of them, I can’t recommend one over the other. All I can say is that Sudecon wipes fit in my glovebox nicely.)

Related compounds (science nerds take note!)

As mentioned above, the “active ingredient” in hot peppers is capsaicin. Pure capsaicin is 16 million Scoville heat units. The hottest pepper is the Carolina Reaper, around 1.5 million SHU. (You should definitely not vape it.)

However, capsaicin isn’t the hottest compound. That honor appears to belong to something even tougher to pronounce, Resiniferatoxin. Found naturally in a plant known as Euphorbia poissonii (what could be scary about a plant whose Latin name is poissonii?), Wikipedia writes that it “causes severe burning pain in sub-microgram (less than 1/1,000,000th of a gram) quantities when ingested orally.”

All of these compounds seem to act on a receptor in the body known as TRPV1, which controls body temperature and “provides a sensation of scalding heat and pain.” There’s also a compound known as capsazepine which inhibits the TRPV1 channel, effectively blocking the effects of capsaicin and its ilk. I’m yet to see it being marketed as an antidote to pepper spray, though.

Running on new hardware

I’ve just completed a server move, and the site should be back in business.

The old setup was a beefy server in my basement with 24GB RAM and eight cores. But access was via a jenky IPv6 connection over my cable modem, with external access via a varnish instance running at Digital Ocean. Something in my home network configuration causes that to be extremely unreliable, taking the site offline for days.

It’s now running on an AWS instance, which I hope to make an auto-scaling group. Actual content resides on an EFS volume, which is surprisingly performant. And it’s all behind a new application-style ELB, which also supports HTTPS and HTTP/2.

For now, I am using neither varnish nor a CDN, to see how it goes. Access is directly to the ELB, with every page hitting Apache. WP Super Cache should keep things pretty performant with any luck.

Clearing Chrome’s DNS cache

Most normal people will probably never even know this is a thing, but Chrome (and other browsers, really) keeps its own in-memory DNS cache, separate from what the OS keeps. For normal use, this is undoubtedly an improvement.

But every now and then, this can be a burden, and Chrome will have cached something you don’t want it to. For example, you make a change in /etc/hosts to hit a development server bypassing its load balancer or the like, but Chrome has already cached the IP, and thus the hosts change isn’t picked up.

It turns out that you can totally flush this cache—and view its contents. Just pay a visit to chrome://net-internals/#dns and voila! A listing of cache entires, and a “Clear host cache” button. (It also provides a look at how many optimistic DNS queries Chrome performs: many of the entries seem to be unvisited links on sites you’ve visited.)

Generations and their names

I hate not knowing things.

The latest? What exactly constitutes a millennial? And what’s all that Gen X/Y business?

It turns out that there’s actually not broad consensus on exactly what the date are, but they look something like this:

Generation Name Birthdate Range
Silent Generation 1925-1945
Baby Boomers 1946-1964
Generation X 1965-1979
Millennials / Generation Y 1980-1996
Generation Z 1997—Present

They tend to run 15-20 years, which means we’re around the time for needing a new term for those post Generation Z.

Also interesting to me: at the time of this writing, “millennials” are between 20 and 36 years old. I’ve taken a lot of the “kids these days” complaints about millennials to refer to teens, which would more accurately be Generation Z. Ironically, those born on or after 2000 are not millennials. (I used to assume the term referred to those born this millennium.)

The lines are insanely broad, though. Wikipedia captures this well:

For the purposes of this list, “Western world” can be taken to mean North America, Europe, South America, and Oceania. However, it should also be noted that many variations may exist within the regions, both geographically and culturally, which mean that the list is broadly indicative, but necessarily very general.

It seems that virtually no one agrees on exactly where a generation ends or begins, so you’ll see several years of variation depending on the source.

Playing with Software Defined Radio

For a while now I’ve read about software-defined radio (SDR), but as an academic pursuit, or as something very expensive. It turns out that I was way misinformed, and you can get in on the fun for $25 ro so as long as you have a computer with a USB port.

As the story goes, tuners like these were originally cheap USB TV tuners. They cut costs by doing much of the processing in software instead of hardware. And, well, that’s software-defined radio! The fact that they were TV tuners had some other nice effects: the TV bands are all over the place, and each TV signal is a few MHz wide, so these are in fact broadband SDRs capable of capturing a couple MHz of spectrum concurrently. And that’s awesome for us!

Here’s the one I have; the specific model is no longer made, but it uses the same R820T tuner that current models support:


On Linux I use rtl_fm for tuning, but on Windows, I use SDR Sharp. And on the Mac, I use gqrx, also available on Linux.

Here it is in action:


(Sorry for the photograph of a computer screen. That’s my old radio-programming laptop that needs to stay on Windows XP, so I intentionally keep it off the Internet.)

You can see it’s tuned to 162.525, which is WNG575, my nearest NOAA weather radio station. SDR Sharp is giving us a spectrum scope view, which is pretty handy.

The receiver has adjustable gain, from 0 to about 47 dB. It’s not abundantly clear to me how this relates to regular receivers; it seems like the 0 dB setting is pretty deaf compared to most of my other radios, but at 47 dB it’s definitely got some gain on the others. The spectrum scope is especially useful for seeing the effects of gain, though: as you increase gain, the noise floor goes right on up with the signal. (This is, of course, not surprising, but it’s a great visual explanation of why you don’t always want a powerful preamp.)

With the scope, you can see that, with the gain turned up, the noise floor is sitting around -65 dBm, while the weather station is up at -20 dBm. Nearly as strong off to the right is 162.55, WXL93 out of Paxton. (You’ll also see 162.475, KHB35 in Boston; as well as, much weaker, 162.45, which is KZZ40 on Saddleback Mountain in NH.)

You’re probably not particularly interested in which weather stations I can receive, but the spectrum view is quite handy.

And here it is during a linked traffic net on the ham bands:


With the GP-15 I just put up, I’m seeing a number of area repeaters active — plus some noise!

The thing isn’t perfect. As an extremely wideband receiver that is so small that I could literally swallow it, it seems to suffer a bit more than other receivers with strong noise and intermod. I receive ghosts of signals in odd places on the band, seemingly related to the bandwidth I sample: at the 0.25 Msps mode, I often see images duplicated 1 MHz off their true frequency. The 0.9 MHz view is more confusing. But, for the cost, and the features that a receiver costing 20x as much doesn’t offer, I’m willing to put up with that.

Oh, it also gets kind of hot, especially as you crank the gain up:



That also points to another problem, in that it often has some frequency error, which seems to vary a bit with temperature. I’ll often have to dial in about 30 ppm correction, and then back off that as it warms up. But, like the performance in noisy environments, that’s a problem I can put up with.

How to install a Thule AeroBlade roof rack on an F10 BMW

My loving relatives gifted me an Thule AeroBlade roofrack, to celebrate me turning really old and also no longer having a car large enough to shove a Christmas tree in the back of. I figured I’d document the process, for my sanity when I go to repeat this next year, and for anyone else who’s looking at installing these.



My car’s a 2012 BMW 535i, a member of the “F10” series/class. I believe all of the 2010/2011 and newer 5-series cars will fit into that category. The Thule assembly for this model came in three separate boxes:

  • ARB47, Thule AeroBlade, 47″, “load bars” — the actual roof rack bars.
  • 460R, Rapid Podium, the base onto which the load bars attach
  • Kit 3089, the vehicle-specific kit for securing to the roof.

Going wrong

Because I’m a guy, I started by assuming I didn’t need the directions. I mean, how hard can it be? The car even has these flip-up mounting points:


They pop up like so, revealing slots you can screw into.


My plans were quickly foiled when I realized I hadn’t even started with the right box of equipment. Apparently, there’s a reason they include the instructions.

Overall plan of attack

What was totally unclear to me when I was figuring all of this out is that you really can’t just do one box at a time. You can mostly install the vehicle-specific kit first, but then you start needing to meld the other kits together.

The rest of the post will go into much more detail, but you’re going to want to accomplish the following.

First, you’ll install the vehicle-specific mounting kit, “Kit 3089” in this case. This will leave you posts the rest attaches to:


Then, you’re going to want to assemble the AeroBlades, and loosely secure them to the “Rapid Podium”:


Finally, you’ll attach that whole mix to the mounting kit you bolted to the car in the first step.

Car Mounting Kit

Have you ever assembled something from Ikea? You know how the illustrations give you a vague sense of what you want to accomplish, but don’t quite tell you how to get there? That’s how I felt the whole time I was doing this, and then I realized that Thule and Ikea are both Swedish companies. Having a little Swedish ancestry was insufficient to intuit what they meant some of the time.

First, screw these bolts into each of the four mounting points on the roof. The mounting point covers on the BMW swivel up to reveal the sockets, but don’t come off. That’s fine; you don’t need them to. One end of the bolt is wider in a small section; that’s the bit that goes into the roof screw-holes.


If the bolts aren’t going in, that’s fine. They include a die that you can use to perfect the threads:


You screw that in with a larger 5mm hex bit, and then unscrew it, leaving pristine threads. I didn’t see a 5mm bit in the box, but there was one in the Rapid Podium box. That die is only to fix the threads; it doesn’t stay in the car.

Once those bolts are in, make four of these:


The metal bracket snaps into the larger piece.

Place them on the bolt, with the “24” facing you, so that the back angles away from you. Secure it with a washer and nut from the package. Also, place the rubber boot over it, like so:


The rubber should sit between you and the metal post.

Note that the rubber pieces have separate shapes for front and back. One will obviously fit and the other won’t.


Note that this whole assembly is going to look ridiculously crooked. That’s normal; the other pieces are angled to make it all work. I never got the rubber boots to sit quite flush.

Partly assemble the load bars

All you should do at this point is put the long rubber strip in the top. Note that it has little feet that snap into the channel. Don’t attempt to thread the whole thing inside. (If that last sentence means nothing to you, that’s good; it means your mind didn’t even conceive the bad idea I had for how it was supposed to go together.)


Do not put the end caps in the box on yet; they’d just be in the way for the next step.

Attach the Rapid Podium mounts to the load bars

When you take these out of the box, there are two parts held together with tape. Remove the tape, and separate them.


You want the part I’m not holding in the picture. The base will slide into the load bar like so:


The underside of the load bars has an adjustable piece to set how far in the mount goes. I only needed to push it in 2-3″ on each side to get it to fit. The goal is to put the podium mount on each side, and get them loosely matched to fit the bases you installed previously. You’ll quickly find that the podium mounts don’t always want to move. There’s a locking mechanism. Looking at the underside of the bar, it’s this thing:


Pull that inward (towards the center of the bar) to allow it to move; push it out to lock it in place. The nice thing is that it keeps things from falling apart as you maneuver it.

Your goal right now is not to get it mounted, only to size it appropriately. It takes a bit of fiddling, especially trying to make it proportional. Mine ended up a little off-kilter. It bothers me a lot, but not enough to take it off and do it again.

Note that the Rapid Podium pieces only come to the inside of the vehicle mount; they don’t sit on top of it. Like this:


Don’t put the bolts through yet, however. All you’re doing right now is a dry fit to get the mounts set at the right points.

Mounting the bars

You should basically be at the above step, minus the bolts. So now, go to install those bolts.

This is by far the most frustrating step. It took 70% of my time and caused 90% of my irritation. If you can’t get the bolts to thread through, I found it easiest to just cast the whole bar/podium aside and put the bolts in first:


Then try to mount it. I still had trouble on a couple of them, which led to yet another strategy. I removed the metal bar from the inside entirely:


Then I ran the pushed through from the car mount to the podium, and then worked on sliding the metal bar back in and getting the screws to thread.

Unless you’re some sort of natural maskiningenjör, this process is going to take a while before everything begins to thread together. Once you get one of the two bolts to start to go, don’t turn it much! Immediately get the other one to thread in. Otherwise you’ll just never get it.

I found, from experience, that if I didn’t get it after a few attempts, it made the most sense to take apart and start over. Sometimes it took several tries, but aimlessly jiggling and shoving things didn’t help anything at all. Try to remain välbalanserad for this.

Also, keep count of how many times you drop a screw on the ground. A true Swede will number fewer than 20; I did not. And I dropped the wrench even more.

Oh, and watch out for this—it’s easy to scratch the paint with the wrench:


The good news is, I had just ordered a bunch of stuff for detailing and getting other scratches and swirl marks out, and I believe this will polish out pretty easily. But that’s the subject of a later blog post!

Once you get this step done, you’re 98% of the way there. The rest is a breeze!

Install the caps

Remember the other half of this? The part I’m holding? Now, you just need to install that.


It just slides into place. Then you use these key-like things to lock it in:


If the slot is vertical, it’s open. Turn it clockwise to a horizontal position (I used a knife blade because that’s what I had in my tool box, but I suspect a coin would work well too) to latch it. Give it a tug to make sure it’s actually latched.

You are done. Hooray!

Perhaps the experience has left you wishing to learn a little Swedish?