All posts by Mike Clements

Mazda 3 Suspension

Summary

The Mazda 3 is a popular car and here I’ll describe a suspension setup that really transforms and improves its handling.

Background

I like to tweak things, but I also believe in “if it ain’t broke, don’t fix it”. Last year I installed a stiffer rear swaybar in my 2014 Mazda 3 (3rd generation) to reduce understeer and improve handling. It works nicely. Later, when replacing the tires I discovered the left rear wheel well had a film of greasy oil. This often indicates the shock has failed and is spewing its internal oil. That was all the excuse I needed to replace the shocks & springs

Research

The Mazda 3 has lots of suspension options: shocks, springs, coilovers and sway bars. Many of them are not focused on performance, but appearance — e.g. lowering. For example, the Eibach springs sold by Tire Rack are actually softer than OEM! I wanted the car to be firmer than stock. By that I mean less body roll, and to a lesser extent, less squat and dive. But I did not want to change the car’s front to rear balance. I already had a stiffer rear sway bar that effectively reduced oversteer. If the car ended up a bit lower, that is OK if the difference is an inch or less, but lowering is not my goal.

Springs & Shocks

Racing Beat has a set of springs that +20% stiffer than OEM, front and rear. From what I gather, the OEM spring rates are about 138 in-lb. front and 174 in-lb. rear. The Racing Beat springs are 162 front and 211 rear. And they are bright red in color. That may be a pro or con, depending on your perspective.

I opted for Koni Yellow shocks, which are adjustable. The fronts can be adjusted with a simple knob turn while installed. To adjust the rears, they must be removed from the car, fully compressed and rotated. The softest setting on these shocks is firmer than OEM. I set them “blind” at 1/3 of the way up from the softest setting, so just below the halfway point. This turned out to be perfect.

The car sits about 1/2 inch lower in the rear, 3/4 inch lower in the front. Not a big difference, but you can see it if you look for it.

Installation

The job took all day but it wasn’t hard. The only special tool you need is a spring compressor. These aftermarket parts fit perfectly like OEM, and their quality was OEM or better. After completing it, I took the car in for an alignment check. It was still perfect – swapping the shocks and springs did not change the alignment.

Test Drive

I quickly realized that the car was transformed. It wasn’t as stiff as the RX-7 and Panoz Roadster that I used to race in SCCA. At high speed, like cruising down the freeway at 80 mph, the car feels as solid as a brick house, like a Lexus or Mercedes sedan. In the corners, it’s a precise steering flat-tracker with eager quick turn-in. Typical of FWD cars, it has throttle-off oversteer and throttle-on understeer. It’s very street-able yet with more responsive handling.

I set the adjustable rear swaybar back to its stiff setting (3x the stock rate), and it was even better. With the OEM shocks & springs, this gave the car an unsettled dartiness so I kept the swaybar on the soft setting (2x the stock rate). But with the new suspension this was completely gone and the car is absolutely perfect on the stiff setting.

Conclusion

If you have a Mazda 3 this is a great suspension setup for performance.

Aviation, Lycoming, Mixture, Efficiency, Cruise Flight

Flying my Lycoming O-360-A4M powered Cessna 172-N, I learned through experience something that should be in the POH, but is not. It’s about fuel efficiency during cruise.

These engines are conservatively rated (180 HP from 360 cubic inch displacement), designed to operate continuously at or near full power, and their 2700 RPM redline is a prop limitation, not an engine limitation. Also, at cruise altitude full power is a smaller fraction of their rated power; for example, at 10,000′ the air is so thin, a normally aspirated engine can only produce about 70% power. All this is to say, when cruising above 5,000′ MSL, you can run the engine at WOT. This is considered normal operation; the POH cruise tables support this configuration. It is not hard on the engine, in fact, these engines are designed to run best at or near WOT properly leaned.

However, you shouldn’t run it at WOT, but slightly less. Here’s why, based on 2 reasons:

The carburetor for this engine (and for the O-320-D2J it had before) has an enrichment circuit that mechanically engages at WOT. This adds a margin of safety against detonation, with a minimal loss of power since the power vs. mixture curve is asymmetric, tapering slowly on the rich side, steeply on the lean side.

The intake manifold for this engine is immediately downstream of (fed from) the carburetor. On any engine having a single carb upstream from an intake manifold, the A/F ratio to each of the cylinders will never be exactly the same. There will always be one cylinder that is slightly richer or another slightly leaner, than the others. This A/F balance across the cylinders is “mostly even” but exactly how even varies depending on the throttle position & mixture.

These 2 factors combine to form an important aspect of engine operation that should be (but isn’t in) in the POH. The carburetor’s WOT enrichment circuit impairs the distribution of mixture to the cylinders. When it engages, it increases the difference between the richest & leanest cylinder. This means, in order to avoid roughness (the leanest cylinder running rough), you must set the mixture richer than it otherwise would be when this circuit is not engaged.

You might wonder, why not apply WOT, then lean the mixture to compensate for the enrichment circuit? You certainly can do this. The problem is, the mixture setting will be richer than it would be, if the enrichment circuit weren’t engaged.

Put differently: when you pull the throttle back from WOT just enough to disengage the enrichment circuit, the mixture distribution across the cylinder is more even. There is less of a difference between the richest and leanest cylinder. Thus, the mixture setting for any equivalent power level (peak, 50 RPM below peak, or whatever) is leaner.

The difference is significant: about 15%. That is, if you fly at WOT and lean the engine properly, you will burn about 15% more fuel than if you pull the throttle back from WOT just enough to disengage the enrichment circuit. The POH tables reflect non-WOT operation, so at WOT you will burn 15% more fuel than the POH indicates. That is, if the POH says 8 gph, you will actually burn about 9 gph.

Procedure: High Speed High Altitude Cruise

So what is the best procedure for high speed high altitude (above 5,000′) cruise?

  1. Apply WOT.
  2. Gradually lean until slightly rough.
  3. Very slowly pull the throttle back.
  4. Since the engine is already lean, when the enrichment circuit disengages the engine will suddenly get much leaner, and you will get a sudden drop in RPM and increase in roughness.
  5. Leave the throttle in this position, then enrich mixture to desired setting, typically peak RPM, or 50 RPM below peak.

Typically, step (4) happens about 1/2″ back from WOT.

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

  • In Pulseaudio, set your primary and secondary rates to 44100 and 48000
    • This enables all rates from low (CD / 44100) to high to play without resampling
    • These rates are minimums, so if you set them higher, low rates (like CD) will be up-sampled
  • Avoid resampling wherever possible
  • If you must resample, upsample by integer multiples
  • If you must resample by a non-integer multiple, sample up rather than down
  • All resamplers are not created equal. Use the best quality resampler your system supports.
    • First choice: soxr-vhq
    • Next best: speex-float-10

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! This bike has also proven itself on some of the biggest, hardest rides in the country, like the Oregon Trail Gravel Grinder, 350+ miles and 30,000′ of climbing.

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

Some of these issues are basic recurring maintenance. Others are caused by using aluminum or weak alloys in critical parts instead of appropriate materials like steel or brass.

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.

Since then I’ve overhauled the levers with the complete rebuilt kit. This includes all-new seals and pistons, among other things. It made a big improvement so I’ll be repeating this every 3-5 years.

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, 12mm size. It fit perfectly and the frame is like new again. Actually, better than new!

Another issue that gradually develops is side-to-side play. The frame pivot that meets the bushing has a shiny black surface (paint?) that gradually wears down, allowing this play. The solution is to place thin spacer washers around the bushing’s core, “inside” between the bushing face and the frame. This pushes the bushing faces slightly outward to eliminate the play. The best washer size is 1/2″ inside diameter, 3/4″ outside diameter, and 1/32″ thick.

Rear Hub Failure

The last problem I encountered was a severe ride-stopper. 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.

After just over a year, I inspected the new pawls to find that they had visible wear, though they were still working. I ordered another set of pawls, installed them, and kept these as emergency replacements.

It’s frustrating to note that if these pawls were made of steel, they’d last forever and the wheel would only be a few grams heavier. But they’re made of some kind of lightweight alloy.

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.

Alloy Spoke Nipples

Descending Olallie, I heard a “ping” from the front wheel so I stopped. A spoke was loose; the nipple head had sheared off. I smoothly bent the free spoke to weave it through adjacent ones so it couldn’t flop around. Fortunately, the wheel is strong enough and with disc brakes I was able to finish the ride slowly.

The Timp Peak came with Reynolds AM 27.5 carbon wheels. Apparently, carbon fiber causes a redox galvanic corrosion reaction with alloy nipples. It starts slowly and progresses incrementally over time, so the wheels may go 5 years or so before it weakens the spoke nipples enough for the heads to shear off. I replaced that spoke with a brass nipple and re-sealed the wheel.

After the OTGG, another spoke nipple head popped off while I was truing the wheel–actually loosening the spoke, not tightening it! At this point I unsealed the wheel and replaced all of them with brass. While doing so, I found 4 others that were already cracked just waiting to break.

<rant>
No carbon wheel should use alloy spoke nipples. Brass will last forever and a set of 28 only weighs about 20 grams more. Alloy may be appropriate for super light road bike wheels, but the weight savings is immaterial on a MTB, considering we typically run 800 gram tires. This is an example of the race to the lightest wheelset at any cost. Reynolds confirmed that their wheel builders use only brass spoke nipples when servicing wheels, even though their OEM wheels come with alloy nipples.
</rant>

Rear Rim

The rear wheel rim delaminated near the outer edge; structure failure. Fortunately, I noticed it after a ride so it didn’t fail while riding.Reynolds replaced it under their lifetime warranty. Normally, this means mailing them your broken wheel, they rebuild a new rim onto your old hub and charge you $150 for the parts (spokes, sealing tape). It takes 6 weeks.

But 6 weeks wouldn’t work. This happened 1 week before the OTGG, a 5-day stage ride I had been training for 18 months. I asked Reynolds support to simply mail me a new rim, I would rebuild the wheel myself. And they did! They don’t make the AM wheels anymore, so now I have the closest match, a Blacklabel 287 (which has off-center spoke holes to equalize spoke dish angles). It arrived 1 day before the big ride, I built the wheel that afternoon (using DT 14 gauge straight-pull spokes and brass nipples) and it all worked out. Now that is just-in-time warranty service!

The new rim has a deeper profile, so the ERD is 9mm smaller, which meant I needed shorter spokes. Split the ERD difference in half means 4mm shorter on each side. But the original spokes didn’t fully protrude from the nipple heads, so I added 1mm (3mm shorter). This way the spokes would pass all the way through the nipple heads which makes it a bit stronger.OTGG was this new wheel’s first break-in ride. It performed flawlessly.

Rear Axle

In Sep 2022 riding the John Wayne / Palouse trail, the rear axle broke between Beverly and Othello. This is normally a critical failure that makes the bike un-rideable. At the same time, the derailleur swung forward and sheared off the end stop of the hangar. I was able to MacGyver both the axle and the derailleur in order to ride back to the nearest town and hitch a ride.

Rear Wheel Bearings

While I was replacing the axle I decided also to replace the bearings. They were still in serviceable shape, but not perfectly smooth anymore. I ordered a set of NSK bearings (size 6902) since they’re supposed to be excellent. I cleaned out the rat piss that they use for OEM grease and packed it with Schaeffer’s 221 #2. The bearing was smooth as butter. After installing it (smoothly with a proper bearing press, not whacking it in), it was rough & notchy. I pressed it out and it was smooth again. Weird. So I bought a generic 6902 at the LBS. Same procedure: cleaned out the OEM grease, packed with Schaeffer’s 221 #2, installed. It was smooth as butter installed.

Perhaps the hub’s bearing socket wasn’t perfectly round? Maybe, but 2 other bearings were butter smooth as installed, so seems unlikely.

Perhaps somehow the compression/squeeze forces of the press-fit install, eliminated the bearing’s internal tolerances? Maybe.

Perhaps it was due to the generic bearing being cageless, combined with an imperfectly round bearing socket? The NSK is a caged bearing, which is normally better. Yet perhaps cageless bearings are more tolerant of imperfectly round sockets?

Rear Through-Axle

After riding the bike 15 miles with a broken axle, the through-axle showed metal fatigue right at the point where the axle had snapped. Apparently, this put more stress on the through-axle. It was still serviceable, but due to the visible metal fatigue I replaced it anyway. It’s 12mm OD, 142mm rear dropout spacing, 174mm total length, 20mm of threads at the end, with a 1.75 pitch.

Rear Hub Shell

When the 2nd set of replacement pawls showed signs of wear in only 5 months, I sent Reynolds a photo and asked for a warranty replacement. They studied the photo and found that the pawl pockets machined into the hub are worn & distorted. I took a close look and they’re right! The distortion is only slight and the hub is still serviceable, but its days are numbered.

Looks to me, and to a friend with experienced eyes, Reynolds should have used a harder grade of aluminum alloy. Not only for the hub shell, but also for the pawls, and for the axle (all of which have failed on me).

They offered to warranty the hub shell, which means mailing them the wheel, the rebuild it onto a new hub shell and send it back, charge me $200 for parts (spokes, axle, bearings, freehub) and labor. I asked if they had a parts list because I prefer to do my own work and build my own wheels. They said no, it’s only a service. Which is different from last year, when they mailed me a warranty replacement rim for me to build myself.

That doesn’t sound like a great deal because I can buy top quality parts for less and build the wheel myself. But I do appreciate their sharp eyes in detecting a problem that I overlooked. I suspect they knew what to look for, as this isn’t the first of their hubs that has had this problem. Indeed, after all the problems this rear wheel has given me, I’m not inclined to use another Reynolds wheel. In summary:

  • OEM spoke nipples cracked and failed, due to aluminum/carbon redox reaction. I rebuilt the wheels with brass spoke nipples
  • Freehub pawls sheared, stranding me in the Moab desert.
  • Carbon Rim delaminated; Reynolds sent me a new rim under warranty and I rebuilt the wheel (again).
  • Axle broke, stranding me on along the John Wayne Trail.
  • Hub shell pawl pockets wore out of shape.

Meier Audio Corda Soul

The Soul is a DAC (digital to analog converter), headphone amp and preamp with DSP (digital signal processing). It’s the best preamp I have owned and a unique piece of kit. It has the transparency of a passive attenuator with the flexibility of a DAC and active preamp. This page summarizes the info I have on it.

More specifically, the Soul is an AIO or “all in one” device providing 4 functions:

  • Fully balanced analog line-level preamp
  • Fully balanced analog heaphone amp
  • DAC: Digital Analog Converter
  • DSP: Digital Signal Processing with features like tone controls, image crossfeed, and notch filters

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. In other words, it swaps the resistors in the gain-feedback loop.
    • Benefit: lower noise & distortion 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, no ground loops
  • Switching power supplies
    • The Soul has 4 separate power supplies, all switching at about 70 kHz
    • Benefit: lower noise, eliminates 50/60 Hz hum
  • Dual WM8741 chips in mono mode
    • The Soul DAC 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
  • 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, smoother high frequency response
  • FF internal feedback pre-emphasis
    • The Soul applies internal pre-emphasis to minimize distortion in the frequency range where human hearing is most sensitive
    • Benefit: pyschoacoustically shaped (perceptually lower) noise & distortion, improved clarity and detail/resolution
  • 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

The Soul’s analog stages and DSP are state of the art. You cannot get anything better for any price. The Soul’s DAC is very good but not state of the art. The WM8741 is old and has been eclipsed by newer chips. Whether one can hear the difference is a different question. However, the Soul has a switchable loop that enables one to use an external DAC. Thus, it is future-proofed.

The Soul’s maximum output level is 8 V and 600 mA. Eight volts is what you get for a full-scale digital signal with the volume knob maxed, and it has enough current to support that down to about 14 ohm loads. This gives the following max power levels (of course, you can interpolate using V=IR, and P=IV):

R (load)V I (mA) P (mW)
1485714600
2084003200
3582291830
708114910
140857.1457
350822.9183

In the above you can see that the Soul is not current limited for most headphones; its 600 mA max current capability is enough to support its 8 V max output voltage down to 14 ohms, where it can deliver 4.6 watts of power. For example, consider the HifiMan HE-6 (one of the least efficient, most power-hungry headphones). The Soul can deliver 8 V, 160 mA and 1.28 W of power to this headphone. The HE-6 voltage sensitivity is 1.25 V for 94 dB, so 8 V is 16 dB louder, which gives 94 + 16 = 110 dB.

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!