All posts by Mike Clements

Maxxix Rambler Review & Road Test

Read here for background. I love my MTB, it is a fantastic bike with great knobby tires for rough technical riding. But for long gravel rides I needed a tire that is lighter with less rolling resistance. The Schwalbe G-One allrounds did not work, having multiple failures that made me walk back from rides. So I tried the Maxxis Rambler.

It comes in 2 styles: EXO/TR with 120 TPI, and Silkshield with 60 TPI. The latter is a bit heavier and more rugged. I opted for the former. They are size 650-47, which fits 27.5″ wheels. They have a directional tread pattern, but the directional arrows on the sidewalls are subtle and could be easily overlooked. They weigh 550 and 551 grams on my scale, which is a bit heavier than their specification. By comparison, the DHR/DHR weigh 900 / 820 grams respectively, and the G-One allrounds weighed 626 grams each. The 47mm width means you’ll probably have the widest tires of anyone showing up for that gravel ride. But it’s perfect for typical MTB rims; any narrower may cause problems with fit or tire shape. And for light weight and minimum rolling resistance, you don’t need it any wider.

They mounted easily on my Reynolds AR carbon wheels. I used 2.5 oz of Stan’s in each tire, and I also apply the sealant between the tire bead & rim. But they didn’t want to seat, not only requiring a compressor, but also removing the valve stem core to increase airflow volume. Once seated, fit & seal were perfect.

I rode them a couple of hundred miles, a mix of pavement & gravel. No flats or other problems, and I could feel that they were a bit lighter and faster than the knobby tires. I tried a few different pressures and ended up with 37 rear, 30 front being about ideal. After this initial success, due to their generous 47mm width, I wanted to test them on more rugged terrain, so I rode them on Tiger Mountain. That turned out to be a mistake!

Tiger is a steep, rugged, network of trails for intermediate & advanced riders. My route is only 13.5 miles, but it’s over 2,000′ of climbing. For the first half, things were going well. The Ramblers did great on the uphill, including 25%+ grades where lesser tires might have slipped. They lost traction a few times in downhill turns and obstacles where the knobbies would have gripped. But they were predictable and controllable, no crashes. About 9 miles into the ride, I heard the dreaded shwoosh of a tubeless tire going flat.

I stopped and inspected the rear tire. It had a gash over an inch long, on the sidewall running radially from the bead to the tread. The sealant spewed out within seconds. The tire was too damaged to remove the valve core and put a tube inside. It was destroyed. So I walked the last 4.5 miles, pushing my bike.

Lesson learned: Maxxis Ramblers are good for converting your MTB into a gravel bike. But don’t let their width & tread fool you into thinking they can be used on rugged MTB terrain. OTOH, perhaps the heavier Silkshield version would have held up.

Schwalbe G-One Allround Tire Review & Road Test (Garbage!)

In early 2020 I was preparing to ride the Oregon Trail Gravel Grinder, a 5-day stage ride based in Sisters, OR. My road bike won’t make that gravel ride, and with 7 bikes in the garage I did not want yet another bike. So I decided to ride it on my mountain bike. However, the heavy knobby tires that work so well on rough terrain are not optimal for gravel. They are just not efficient enough, especially for doing 350 miles in 5 days.

Note: these are tubeless wheels, Reynolds Carbon AR, size 27.5″ / 650 / 584.

Gravel rides are a “thing” now, so there are lots of tire options. After reading a bunch of reviews I opted for Schwalbe G-One Allround tires. They make 2 sizes for my bike: 40-584 and 57-584 (note: 584, 650 and 27.5″ are all the same wheel size, just different ways of measuring it). One seemed a bit too skinny (40mm = 1.6″), the other a bit too fat (57mm = 2.24″). I wasn’t sure which would be best so I ordered a set of each.

First, I installed the wide ones. They installed and sealed neatly without the need for my compressor. Rode them around the block, pumped them up to 5 PSI below max. They held pressure overnight and I rode them the next day on a gravel road (John Wayne Trail from Rattlesnake Lake toward Snoqualmie Tunnel). Ran about 35 PSI rear, 30 PSI front. They did fine and I could feel how much lighter and faster they were.

Failure the First

Next ride, I hit the Snoqualmie Valley Trail. About 40 miles in, I could hear the rear wheel losing air. It had a puncture with sealant spraying out. The sealant eventually did its job and I finished the ride (10 more miles) and made it home. I inspected the tire from the outside, there was no obvious damage, so I removed the valve stem and added another ounce of sealant to replace what it had lost.

Failure the Second

The OTGG was cancelled due to COVID, so I flew out to Moab to meet Stefan for some biking. On day 1, riding the easy Bar M Loop Trail, the front tire flatted. Sealant spewed out, then after a long moment it did its job. I used my hand pump to replace some of the lost pressure and we finished the ride.

Failure the Third

Now it was 2021 and I was preparing to ride the Cascade Gorge Grinder that had been cancelled the prior year. So I installed the skinny G-One Allround tires. At least, I tried to. After completing the first and inflating it to 5 PSI below max pressure, I set it aside to work do the second. About 10 minutes later, BANG! The tire I had set aside blew off the rim. Upon inspection, the bead had ruptured internally without any exterior evidence of cuts or damage. I use only smooth plastic tire “irons”. Chalk it up to manufacturing defect.

So I reinstalled the fat ones.

Failure the Fourth

Next ride, I went out on the same pavement that I ride my road bike. After a few miles I heard the familiar dreaded sound of the rear tire losing pressure and spewing sealant. This time, it never sealed. I stopped and rotated the rear wheel so the puncture was at the bottom so the sealant could gather there. All the sealant (I use 2 full ounces) spewed out and it went completely flat. I had to walk home.

Conclusion

Schwalbe’s G-One Allround tires are so fragile they repeatedly puncture, even on paved roads that my road bike can handle with 700×23 tires. They seem to impair sealant from doing its job, and I also encountered a manufacturing defect that caused one to blow off the rim even when seated and sealed, and below its max recommended pressure.

Needless to say, I’m never buying Schwalbe tires again. I’ve never had these problems with Maxxis tires (knock on wood!).

Note: I’m now using Maxxis Ramblers size 47-584 on this bike, for gravel rides. Fingers crossed!

For knobbies I’ve used Maxxis Ardents, and now use the DHF / DHR combo. Both have been great; good traction, easy installation and no flats. Of course, they’re heavy with higher rolling resistance. But when you need rugged knobbies, those aspects are less important and these are great tires.

Firefox and Audio Streaming

I use my desktop computer as an audio source for music listening. Listening to high quality (lossless) music over the browser, I’ve explored different browsers and how they deal with audio. This is on Ubuntu 18 Linux with Pulseaudio. I’ve set up the audio to avoid resampling as much as possible.

I tried about 10 different browsers on Ubuntu. Every one but Firefox resamples audio to some fixed rate, either 44.1 or 48 kbps. Firefox is the only one that passes audio through unmolested. Or, at least it used to. Primephonic is a classical music streaming service that passes audio uncompressed at whatever rate the albums were recorded (from 44.1 to 192 kHz).  I could listen to different albums and watch Pulseaudio change the sampling rate to match whatever rate each was recorded. At least until some time in Feb 2021, when Firefox’s behavior changed.

Here’s a summary of the changes:

Firefox now ignores the audio stream’s native rate and attempts to stream it at the highest rate the system will support. This means it will resample the audio rather than play it at its native rate.

If Pulseaudio’s avoid-resampling is set to true, then that rate will always be the highest rate the system supports. For example, with my Juli@ sound card it is 192 kHz. Otherwise (avoid-resampling set to false) that rate is the highest rate Pulseaudio is configured to use. That is either default-sample-rate or alternate-sample-rate, whichever is higher.

So in order to listen to music on Firefox without resampling, you must:

  • Set both of Pulseaudio’s rates to the native rate of the stream you are playing.
  • Set Pulseaudio avoid-resampling to false.

Essentially, you are forcing the system to play all audio at a single rate that exactly matches the audio you are playing.

And indeed, the irony is that in order to avoid resampling, you must set avoid-resampling to false!

Incidentally, why the irony? I can only speculate. Cubeb, the audio engine in Firefox, asks Pulseaudio what is its highest sampling rate. If Pulseaudio is avoiding resampling, then it reports its highest rate to be the highest rate the audio card supports. But if Pulseaudio is resampling, then it reports its highest rate as whatever rate it is resampling everything into. Seems logical. But it ironically leads the reverse of the intended behavior. The root of the problem is cubeb. It should pass audio to the system at its native rate, and let the system deal with it. Cubeb is being too smart by half, trying to deal with that itself.

High Res Audio on Ubuntu: Part 3

Once we’ve got it all set up, we want to test it while playing audio. It’s the only way to know for sure it is working as expected. To do this, we’ll be using the Linux Pulseaudio command-line tool pacmd.

If you jumped directly to this page, you may want to read part 1 and part 2.

Once you’ve tested your setup, possibly made adjustments, and confirmed they are working, you may want to read about streaming audio from a browser.

Basic Audio Device Info

To start, enter this command:

pacmd list-sinks

A “sink” is an audio output device. Even if you only have 1 sound card in your system, it may support multiple sinks. And you may have multiple cards. So you may see a lot of output here.

Let’s use grep to shrink the output to only the fields most useful to us:

pacmd list-sinks | grep -e 'sample spec:' -e 'channel' -e 'buffer' -e 'latency:' -e 'name:' -e 'alsa\.card'

On my system, it returns this:

name: <alsa_output.pci-0000_04_02.0.analog-stereo>
current latency: 0.00 ms
sample spec: s32le 2ch 176400Hz
channel map: front-left,front-right
fixed latency: 185.76 ms
alsa.card = "1"
alsa.card_name = "ESI Juli@"
device.buffering.buffer_size = "262144"
device.buffering.fragment_size = "70560"

This tells you I have an ESI Juli@ sound card that is currently set to 176.4 kHz sampling and 32-bit signed. My Pulseaudio configuration uses sample rates of 176400 and 192000, so this is the default sample rate. This is 4x oversampled for normal CD quality (44.1 kHz) and 4x oversampled for normal DVD quality (48 kHz).

Now I play an audio file that happens to be sampled at 96 kHz. While it’s playing I run the above command again and it returns this:

name: <alsa_output.pci-0000_04_02.0.analog-stereo>
current latency: 170.65 ms
sample spec: s32le 2ch 192000Hz
channel map: front-left,front-right
fixed latency: 185.76 ms
alsa.card = "1"
alsa.card_name = "ESI Juli@"
device.buffering.buffer_size = "262144"
device.buffering.fragment_size = "70560"

You can see that Pulseaudio has changed the sample rate to 192 kHz. Why? I have “avoid resampling” enabled, so it should play at the audio file’s native rate of 96 kHz. But Pulseaudio will never use a sample rate lower than what you configure. Since it can’t use 96 kHz, it uses the next best thing, which is an integer multiple of the native rate. That is why it switches to 192 kHz.

Resampling

The above command showed us the current state of the audio device. We can also use pacmd to get the current state of any audio being sent to or processed by that device.

First, ensure no audio is playing on your system and then enter this command:

pacmd list-sink-inputs

You should see this response:

0 sink input(s) available.

Now, try the prior command again:

pacmd list-sinks| grep -e 'sample spec:' -e 'channel' -e 'buffer' -e 'latency:' -e 'name:' -e 'alsa\.card'

You will see something like this:

name: <alsa_output.pci-0000_04_02.0.analog-stereo>
current latency: 0.00 ms
sample spec: s32le 2ch 192000Hz
channel map: front-left,front-right
fixed latency: 185.76 ms
alsa.card = "1"
alsa.card_name = "ESI Juli@"
device.buffering.buffer_size = "262144"
device.buffering.fragment_size = "70560"

This tells you that the audio card is in a certain state, but there is no data or input being sent to that card.

Now play an audio file of any kind, and while it’s playing, repeat the above commands. In my case, I played a CD file (44.1 kHz, 16-bit) and get the following:

First, the card itself:

pacmd list-sinks| grep -e 'sample spec:' -e 'channel' -e 'buffer' -e 'latency:' -e 'name:' -e 'alsa\.card'

This returns:

name: <alsa_output.pci-0000_04_02.0.analog-stereo>
current latency: 185.75 ms
sample spec: s32le 2ch 176400Hz
channel map: front-left,front-right
fixed latency: 185.76 ms
alsa.card = "1"
alsa.card_name = "ESI Juli@"
device.buffering.buffer_size = "262144"
device.buffering.fragment_size = "70560"

You can see the card switched to 176.4 kHz sampling, because the source is 44.1 kHz and it wants to use an integer multiple for resampling.

Now let’s check the status of the audio being sent to the device:

pacmd list-sink-inputs

Now you see a bunch of output. As above, let’s use grep to filter it down to the essentials we care about:

pacmd list-sink-inputs | grep -e 'sample spec:' -e 'resample method:' -e 'application\.name'

Now we see something like this:

sample spec: float32le 2ch 44100Hz
resample method: soxr-vhq
application.name = "VLC media player (LibVLC 3.0.8)"

Here we see that the source is coming from VLC (my media player), sampled at 44.1 kHz and the system is resampling it using the soxr-vhq method.

Now let’s play an audio file that happens to exactly match one of our system’s sampling rates (in my case, 176.4 kHz or 192 kHz). And then re-run this command. We get:

sample spec: float32le 2ch 192000Hz
resample method: copy
application.name = "VLC media player (LibVLC 3.0.8)"

Look at the resample method: copy. This means Pulseaudio is not resampling the audio, but is directly copying the stream from the source to the sink without resampling it. This is an important test: it tells you when the system is resampling audio.

Conclusion

So, now we know how to test our audio settings, see how the audio card is currently configured, and also check the audio stream being played. Also, whether audio is being resampled, and if so, using what resampling method, and the source and target sample rates.

As a general guide to resampling:

  1. No resampling is always best
  2. Resampling at integer multiples is better (faster, more transparent) than fractional
  3. Up-sampling is more transparent than Down-sampling

Conclusions we can draw from this

  • Avoid resampling wherever possible
  • If you must resample, upsample by integer multiples
  • If we have 88.2 kHz, downsampling to 44.1, is better than upsampling to 96
  • If you must resample by a non-integer multiple, sample up rather than down

MTB / Mountain Bike: Fezzari Timp Peak

I’ve been riding bikes of all kinds since the 1980s and done some big rides. But the Fezzari Timp Peak I bought in late 2014 was the first really good mountain bike I owned. I got this bike to ride Kokopelli’s Trail with Bikerpelli in 2015. Great ride!

Carbon frame, carbon wheels, SRAM XX1, dual suspension, dropper seat, weighing 25-26 lbs. ready to ride. It’s been a great bike but it’s not perfect. Here are some of of the problems I’ve encountered and how I solved them.

SRAM Sticky Brakes

The first problem was the dreaded SRAM sticky brakes. The brake lever pistons gradually grow (yes they physically get larger!) and get stuck in the cylinder. In my case it took a few years to happen. Here is my fix. That worked for a year or so, then they got sticky again. At that point instead of sanding down the pistons again, I replaced them with aftermarket metal pistons. These have perfect fit & function, came with the o-rings, and fix the problem permanently.

Frame Suspension Pivot Bushing

After a few years, the frame developed a bit of play. Most of the frame suspension pivots use bearings, which I serviced (cleaned, re-greased). But one of them uses a bushing, and that’s where the play developed. Over time the bushing wears and needs replacing. I contacted Fezzari and they told me:

The bushings at the main rocker pivot are IGUS L289 sleeve bushings. The part number for them is LFM-1012-06. The “-06” part of this part number is in reference to the bushing length which is 6mm.

However, what I would recommend trying is a bushing with a 10mm or 12mm bushing length (part no. LFM-1012-10 & LFM-1012-12, https://www.igus.com/product/?artnr=LFM-1012-10). It will allow for a bit more overlap with the frame and should help reduce the play.

I ordered that part, 10mm size. It fit perfectly and the frame is like new again. Actually, better than new!

Rear Hub Failure

The last problem I encountered was the most severe. It stranded me out in the desert near Moab and I had to walk my bike out. Going up a hill, the bike suddenly made a horrible clacking sound and the pedals were free-spinning. The chain was completely intact. I took apart the rear hub by the side of the road to discover that pawls that engage the freehub ratchet had worn down and were slipping. No way to fix that by the side of the road. And after I hiked back to the car and drove to town, none of the bike shops in Moab could fix it either.

Fezzari connected me to Hayes/Reynolds where I contacted a guy named Dan and ordered the parts:

Part 21290 "Reynolds XD Driver Body" replaces the cassette ratchet gear.

Part 20702 "2015-2016 Attack Assault Strike Hub Rebuild Kit" replaces the hub pawls (and other things).

When I told Reynolds this unusual and catastrophic failure happened to a bike that was only a few years old, equipped with some of their best carbon wheels, and left me stranded having to hike out of the desert pushing my bike, they gave me a 25% discount.

The above parts fixed it. The pawls were the essential part; they were visibly and obviously worn down and rounded off. The freehub ratchet wasn’t obviously worn, but I replaced it anyway since it could have had non-visible damage from the damaged pawls slipping over it.

Bottom Bracket Crank Arm Spindle Bolt

After servicing the bottom bracket (cleaning & re-greasing bearings) I was re-assembling it. These SRAM cranks have a single bolt on the left (non-drive) side that holds everything together. The spec says tighten to about 52 Nm, or 38 ft.lbs. As I was tightening it, well before it got that tight, I felt it give. I removed it and discovered 2 things:

  1. The head had sheared off the bolt
  2. The bolt was made of aluminum (or alloy) — not steel ?!

This is a high torque, high stress bolt. It should be made from steel! Making it from a softer, weaker aluminum alloy is a total fail in design. I’ll gladly pay a weight penalty of a measly 12 grams for the confidence of knowing my cranks won’t fall off the bike. Apparently I’m not the only person who thinks so. Shout-out to one of my LBS, Gregg’s Cycles, who had a replacement bolt in stock. I bet I know why they keep these bolts in stock… <groan>

Details:

  • Truativ GXP M15 Crank Bolt
  • CR2193
  • 11.6900.002.140
  • M15/M26

Sadly, it is alloy like the broken one. So it is probably “single-use”. I’m still looking for a steel one, but this one will serve until I find it.

Meier Audio Corda Soul

The Soul is a DAC, headphone amp and preamp. It’s the best preamp I have owned and a unique piece of kit. It has the transparency of a passive attenuator and the flexibility of a DAC and active preamp. This page summarizes the info I have on it.

So what’s the deal? DACs, headphone amps and preamps have improved a lot over the past 20 years and nowadays SOTA sound quality is commodified. What’s so special about the Soul? Jan Meier incorporates both engineering and psychoacoustics into his designs. Without getting into subjective impressions, here are some its engineering features.

  • Stepped gain-volume control
    • The volume knob is a stepped attenuator that sets the analog gain ratio, instead of attenuating a fixed gain ratio.
    • Benefit: lower noise and perfect L-R channel balance, especially at low-medium volume settings
  • 100% balanced/differential both D and A
    • The Soul is fully balanced/differential from the DAC chip to the analog outputs.
    • Benefit: lower noise and distortion.
  • Dual WM8741 chips in mono mode
    • The Soul uses a pair WM8741 chips, each in mono mode, one for each channel (instead of using a single WM8741 chip in stereo mode).
    • Benefit: lower noise and distortion
  • Switching power supplies
    • The Soul has 4 separate power supplies, all switching at about 70 kHz
    • Benefit: lower noise and distortion, eliminates 50/60 Hz hum
  • Maximum oversampling at all rates
    • The Soul sets the WM8741 chip in “OSR high” mode which oversamples all data to the chip’s max rate (44.1k is 8x, 192k is 2x).
    • Benefit: lower noise & distortion.
  • FF internal feedback pre-emphasis
    • The Soul applies internal pre-emphasis to minimize noise & distortion in the frequency range where human hearing is most sensitive
    • Benefit: pyschoacoustically shaped (perceptually lower) noise & distortion
  • Top quality parts: Neutrik, Alps, Lorlin, AD797 opamps, BUF634, WM8804, Nichicon caps, etc.
    • The Soul uses top quality parts and build quality, made by Lake People in Germany.
    • Benefit: reliability, durability, longevity

 

Social Media and Section 230

Section 230 refers to US Code, Title 47, Chapter 5, Subchapter II, Part 1, Section 230. This is an important part of federal law that essentially says two things:

  1. (c) (1) No provider or user of an interactive computer service shall be treated as the publisher or speaker of any information provided by another information content provider.
  2. (c) (2) No provider or user of an interactive computer service shall be held liable on account of any action voluntarily taken in good faith to restrict access to or availability of material that the provider or user considers to be obscene, lewd, lascivious, filthy, excessively violent, harassing, or otherwise objectionable, whether or not such material is constitutionally protected.

Part (1) makes internet social media possible. Without it, companies could be prosecuted (criminally or civilly) or held responsible for the content their users publish. No company could risk that liability, so it would destroy social media as we know it.

Part (2) enables companies to filter or censor content without losing their liability protection granted by part (1). Without it, internet social media could become a cesspool of illegal and offensive material. You think it’s bad today? Just imagine if part (2) didn’t exist!

The $64,000 question: what exactly does part (2) protect? That is, how much filtering can companies apply before they lose their liability protection?

Surely, if they use too heavy a hand, cherry picking only certain kinds of content, they are effectively defining the platform’s content and it is “user-generated” in name only. The platform no longer represents the views of users, but of the platform owners themselves. For example, 3 months before an election they suppress all content promoting candidate A and allow only content promoting candidate B. In this case, for all practical purposes they have become the content publisher and should lose their part (1) liability protection. Clearly, part (2) was never intended to allow this.

If, on the other hand, they use too light a hand, then they lose control of their platform. It would be impossible to create certain types of socially beneficial spaces, whether family friendly, or forums for discussing religious, political, personal, economic or other sensitive yet important and relevant topics. Section 230 specifically allows filtering and censorship for this purpose.

The problem with today’s discussion about section 230 is that it is treated as an all or nothing thing. Either section 230 allows any amount of filtering and censorship (ignoring its own words that it is limited), or section 230 should be rescinded entirely. In my view, these views are both wrong. Section 230 is necessary and beneficial. Deciding exactly how far part (2) goes in allowing filtering and censorship is messy hard work whose outcome will never please everyone. But real-world application of law is never clean or easy, and Section 230 is important enough that this work is worth doing.

Ubuntu Upgrade: 16 to 18

Introduction

My upgrade from Ubuntu 16 to 18 was anything but smooth. Here’s the story, in case others find it useful or I need to refer back to what happened.

Why Upgrade?

If it ain’t broke, don’t fix it. My desktop had been running Ubuntu 16 for years and was happy. Since one of the things I use it for is listening to music, I wanted the later version of Pulseaudio that can play music at its native bit rate. Ubuntu 16 resamples everything to one of 2 system bit rates.

The Upgrade

The upgrade itself went smoothly. In short, these commands ran just fine:

sudo apt updatesudo apt dist-upgradesudo do-release-upgrade

After that, all hell broke loose.

Problem 1: No Boot

The system failed in the Grub boot loader and dropped the Grub rescue prompt:

Error: Symbol 'grub_calloc' not found. 
Entering rescue mode...
grub_rescue>

To fix this, I used Ubuntu Boot Repair. I flashed its ISO to a USB stick, booted to that stick, then ran the standard boot repair, which reinstalls Grub on the PC.

Problem fixed: the computer now boots!

Problem 2: Laggy Desktop

The mouse pointer lagged by a second or two, reminding me of using a mouse on my old 4.77 MHz IBM XT years ago. Turns out the upgrade hosed my video driver, making it not entirely the Nvidia driver, not entirely the open source driver, but some kind of zombie hybrid of the two.

I uninstalled the Nvidia driver and rebooted. But I couldn’t do that, because apt-get was broken. I had to fix that first.

Problem 3: Apt-Check

After every Ubuntu install or upgrade I always re-enable whatever repos were disabled for the upgrade, then update all the software so it can install new versions. This problem manifested as an error message whenever I ran “apt”:

libdvd_pkg: 'apt-get check' failed. You may have broken packages. Aborting...

This turned out to be caused by the libdvd package not completing its installation steps. To fix this, we can complete them manually:

sudo dkpg-reconfigure libdvd-pkg

After that, make sure apt-get is really fixed:

sudo apt update
sudo apt dist-upgrade
sudo apt autoremove

Done!

Problem 2: Laggy Desktop: Reprise

With apt-get fixed, I can now uninstall & reinstall the NVidia drivers to fix the laggy desktop:

sudo apt purge nvidia*
sudo apt-get check
sudo apt update
sudo apt upgrade
sudo apt autoremove
sudo reboot

Problem fixed! So I reinstalled the NVidia binary driver:

sudo ubuntu-drivers autoinstall
sudo reboot

Problem 4: Python 3 Broken

I use Python virtual environments and virtualenvwrapper. The upgrade broke these and I was getting a virtualenv related error message every time I opened a terminal. To fix this, I had to reinstall pip and virtualenvwrapper:

python -m pip uninstall pip
python -m pip install pip
pip install virtualenvwrapper

I did this in the system default python (python 2) because that I run virtualenv from the command line.

Fixed!

Problem 5: Desktop Crashes

At this point, my desktop was working pretty well in Ubuntu 18. But I was disappointed to find that periodically, from every 10 minutes to every hour, the computer would crash entirely and revert to a text mode screen. After such a crash I could ssh to it from another machine, so the machine was still running, it was just the desktop that crashed. From ssh, I could kill Xorg and the login prompt would appear on that desktop.

I found this bug report, which provides a workaround: add a parameter to the linux kernel when booting

GRUB_CMDLINE_LINUX_DEFAULT="scsi_mod.scan=sync"

This seems to have fixed it, though only time will tell.

Update: the system still crashes. This does not fix the problem. More specifically, the desktop suddenly goes black and I must ssh from another computer, kill Xorg and it restores the login prompt.

As I’m experiencing these Xorg crash/hangs, I’ll list the various things I’ve tried that don’t fix it:

  • adding kernel param “scsi_mod.scan=sync”
  • disabling display power management in XFCE power Manager (screen never powers off)
  • disabling screen saver (screen saver never kicks in)
  • disabling screen blank (screen never goes blank)
    • … PENDING … no crash yet, this might actually fix it!

Road Biking: Vashon Island

Vashon Island is a fun road bike ride. It’s rural and scenic, and hilly making a great workout. Here you will find suggestions to make this ride a smooth experience.

Ride Overview

The full ride is about 42 miles with 3900′ of climbing. The hills are steep and there’s lots of them, making it feel more like a 50-60 mile ride. Here is a GPX of the full route. Here is a picture:

On the route you can see 2 black dots. These are decision points to change the ride.

Decision point 1: about mile 13; whether to ride down to the Tahlequah ferry terminal at the S tip of Vashon Island. This is an out-and-back 3.7 mile round trip descending 350′ then back up.

Decision point 2: about mile 22; whether to ride the Maury Island loop. This is 11 miles with about 1100′ of climb. It has scenic sections, and the toughest climbs on the route.

Here are some photos from a ride in Oct 2020.

Getting There (and Back!)

From Seattle, the easiest way to get to Vashon is the WA state ferry. Here’s the schedule. It’s different on weekends & weekdays. You’ll depart from and return to Fauntleroy. As of Oct 2020, the fare is $7 for a walk-on with a bike and is paid only westbound. Masks are required due to COVID. As you approach the Fauntleroy ferry terminal, if you are on the walkway, then walk (don’t ride) your bike. If you want to ride your bike, take the car lanes. If your forget this, the ferry workers will chide you when you arrive.

Parking: you can park a car at Lincoln Park parking lot 1. This is about 1/4 mile up the street from the ferry terminal. There are no fees for parking. From there, ride down to the ferry terminal to walk onto the ferry.

Ride Notes

Vashon’s pavement is often rough. Autumn leaves fall onto the road, get rained on and decompose, making the corners slippery. And some of the downhills are steep. So take extra care!

Most Vashon roads don’t have bike lanes, but most cars drive slow. It’s similar to biking the San Juan Islands.

For typical riders in decent physical condition, due to road conditions & hills, plan on lowish average speeds around 14 mph which makes 3 hours of riding. Bring food & water accordingly. About halfway through the ride there’s a little town with a coffee shop, hotel, and a deli called Harbor Mercantile, where you can get food & water.

Ride Scenario

Here’s a typical scenario for a Vashon ride in Autumn 2020:

  • Meet @ 7:40am @ Lincoln Park
  • Park, prep, ride to Ferry
  • Pay fare & walk onto 8:15am ferry
  • Disembark on  Vashon around 8:45am
  • Bike: 4 hours (full route, with extra time to eat or fix a flat)
  • Walk onto return ferry: 12:40 or 13:30
  • Ride back to Lincoln Park

Car Performance & Handling: Swaybars!

It’s been several years since I autocrossed or owned a high performance car. I still like fun to drive cars, I just don’t have the time for it anymore. I finally got around to doing the first performance upgrades that I’ve done in years. Back in my SCCA days, the first 2 mods anybody did was (1) tires, and (2) swaybar.

Swaybar 101

When a car has a swaybar, in order for the body to roll L or R it must twist the swaybar. Stiffer swaybars reduce L-R body roll without affecting the spring or shock rates. If both wheels hit a bump and move together, the swaybar does nothing. It only kicks in when the L and R sides try to move differently. When one side (L or R) tries to move up or down, the swaybar forces the other side to also move up or down too. How much, depends on the swaybar’s stiffness.

A stiffer swaybar reduces body roll, which reduces weight transfer, which reduces overall traction. Yet at the same time, it improves response and agility. So it’s a trade-off. Put differently, you need to allow some body roll to get good traction, but too much of it reduces response.

Adjustable Swaybars

When the car’s body roll twists the swaybar, it does so through connecting arms. Longer arms give the body roll forces a longer moment arm, making it easier to twist the bar, making a softer bar (lower rate) with less resistance to body roll. Adjustable swaybars usually have several points along their arms where you can connect the end links.

Must both of the swaybar arms have the same length? Imagine if one arm is longer than the other; that is, connecting the end links to different mounting points on each arm. Newton’s 3rd law says the torques exerted are always equal and opposite, which seems to suggest that an asymmetric setup could give symmetric roll response. In this case, an adjustable bar with 2 holes actually has 3 different rates, or with 3 holes has 5 different rates.

However, while the torques are always equal and opposite, even when connected asymmetrically, the moment arms are not. And the torque on the bar exerts a force on the opposite side through its moment arm. So connecting the swaybar asymmetrically would create asymmetric roll rates: stiffer to the L than to the R, or vice versa.

The conclusion: always connect the end links to the swaybar using equal length arms.

Tuning the Response

Most cars are designed to understeer: that is, under most conditions the front slides before the rear does. This is easy to control, especially for unskilled drivers. But skilled drivers find excessive understeer to be less fun and even annoying. Excessive understeer makes a car less responsive. As a general rule:

  • A stiffer rear swaybar reduces understeer, increases oversteer.
  • A stiffer front swaybar reduces oversteer, increases understeer.

This is all relative. Most factory cars are too soft overall and also understeer, so a stiffer rear swaybar is ideal. But if the car is too stiff overall and also understeers, you might use a softer front swaybar.

Mazda 3

My 2014 Mazda 3 is actually pretty fun to drive, for a FWD economy car. At 36000 miles I finally had to replace the OEM tires. While I was doing this I figured I’d also install a stiffer rear swaybar.

This is such a common car there are many options. I used a 22mm Progress bar. It was relatively inexpensive and came with new bushings and brackets to handle the larger forces. The OEM rear swaybar is 18mm diameter with a rate of 334 in-lbs. The Progress is 22mm diameter with rates of 772 in-lbs (about twice as stiff), and 1,015 in-lbs. (about 3 times as stiff). This bar has excellent build quality and perfect fit with the end links pointing straight up and down just like they do with the OEM bar.

The soft setting made a noticeable yet not a huge reduction in body roll. I quickly shifted to the stiff setting which was completely different. Less body roll, quicker turn-in and more precise handling. But, it got twitchy. The swaybar was too stiff for the rest of the suspension. So I kept it at the soft setting (still twice as stiff as stock).

A few months later, I replaced the shocks & springs all around. With the stiffer shocks (Koni yellows) and springs (+20% rates from Racing Beat), the swaybar’s stiff setting was better matched to the rest of the suspension. The twitchiness was gone, now it was just a precise, sharp, flat tracking, great handling car.

Subaru Forester

My wife’s 2018 Forester is a lot softer than our 2004 Forester. It drives more like a bus than a car. Over the years, Subaru softened the suspensions. Subaru has OEM swaybar replacements in 2 sizes: 19mm or 20mm. Stock is 16mm, so the 19mm is about twice the rate. I got this bar from Subaru Online Parts, cost about $100 and included new brackets and bushings.

This makes the new Forester handle more like the old one. It’s less like a bus, more like a car. It feels tighter and more controlled. But not too tight. If you go too stiff with an AWD vehicle it can impair traction off road. It’s perfect for my wife, who wanted less body roll but is not a performance car enthusiast.

NOTE: the end links on this Subaru were quite nearly frozen. The end link attachment bolt was corroded to the nut. And the car is only 2 years old, 4700 miles, and has not been driven on salted roads. I removed the end links from the car, so I could remove the entire bar with end links attached to it. Soaked the end link bolts in liquid wrench and moved the nut back and forth chasing the threads until it finally came free.

More generally, a stiffer swaybar applies greater forces to the end links. So if you more than double the rates, don’t be surprised if the end links eventually break. Keep an eye on them and be ready to replace them with more robust aftermarket end links.