It seems everybody must disassemble an American Standard kitchen faucet to replace the spout seal O-rings, as my description of How It’s Done has remained in the top five most popular posts since I wrote it up in 2009.
About two years ago, I replaced the valve cartridge with a (presumably) Genuine Replacement; unlike the O-rings, the original valve lasted for nigh onto a decade. A few weeks ago, the replacement valve began squeaking and dribbling: nothing lasts any more. Another (presumably) Genuine Replacement, this time from Amazon, seems visually identical to the previous one and we’ll see how long it lasts.
I always wondered what was inside those faucets and, after breaking off the latching tabs in the big housing to the upper right, now I know:
You get a bunch of stuff for twelve bucks! The stainless steel valve actuator is off to the right, still grabbed in the bench vise.
The valve action comes from those two intricate ceramic blocks with a watertight sliding fit:
In fact, you (well, I) can wring the slabs together, just like a pair of gauge blocks. That kind of ultra-smooth surface must be useful for some other purpose, even though I can’t imagine what it might be…
Both of us began sniffling and sneezing in early October, long after the outdoor flowers faded away, and finally remembered to check the Mother In Law’s Tongue:
It’s that time of the year again: we’re both wildly allergic to a houseplant with weird flowers. Even after cutting the stalk off and deporting it outdoors, we’re still sniffly.
The blossoms produce so much nectar that the droplets near the base of each flower eventually fall off, making a mess on the floor if the stalk tilts over far enough.
We kept it when we helped Mom move out of the Ancestral House, long ago, and it’s still going strong.
A friend asked why Norwegians point their satellite dishes at the ground. After maneuvering Google Streetview around Vadsø for a while, I found a dish in profile:
Turns out geostationary orbit is way low, as seen from the top of the world. A bit of doodling shows it’s only 11° above the horizon at 70° N:
TV satellite antennas have an offset-fed reflector, with the receiver in the lump at the end of the spine sticking out from the bottom of the dish, so as to not obstruct the signal entering the dish. Even though the plane of the reflector points downward, the signal reflected to the receiver comes in from above.
science trigonometry grand?
My Raspberry Pi-based streaming radio player generally worked fine, except sometimes the keypad / volume control knob would stop responding after switching streams. This being an erratic thing, the error had to be a timing problem in otherwise correct code and, after spending Quality Time with the Python
select doc, I decided I was abusing mplayer’s
This iteration registers mplayer’s
stdout pipe as Yet Another
select.poll() Polling Object, so that the main loop can respond whenever a complete line arrives. Starting mplayer in quiet mode reduces the tonnage of
stdout text, at the cost of losing the streaming status that I really couldn’t do anything with, and eliminates the occasional stalls when mplayer (apparently) dies in the middle of a line.
The code kills and restarts mplayer whenever it detects an EOF or stream cutoff. That works most of the time, but a persistent server or network failure can still send the code into a sulk. Manually selecting a different stream (after we eventually notice the silence) generally sets things right, mainly by whacking mplayer upside the head; it’s good enough.
It seems I inadvertently invented streaming ad suppression by muting (most of) the tracks that produced weird audio effects. Given that the “radio stations” still get paid for sending ads to me, I’m not actually cheating anybody out of their revenue: I’ve just automated our trips to the volume control knob. The audio goes silent for a few seconds (or, sheesh, a few minutes) , blatting a second or two of ad noise around the gap to remind us of what we’re missing; given the prevalence of National Forest Service PSAs, the audio ad market must be a horrific wasteland.
The Python source code as a GitHub Gist:
The original SuperFormula equation produces points in polar coordinates, which the Chiplotle library converts to the rectilinear format more useful with Cartesian plotters. I’ve been feeding the equation with 10001 angular values (10 passes around the paper, with 1000 points per pass, plus one more point to close the pattern), which means the angle changes by 3600°/10000 = 0.36° per point. Depending on the formula’s randomly chosen parameters, each successive point can move the plotter pen by almost nothing to several inches.
On the “almost nothing” end of the scale, the plotter slows to a crawl while the serial interface struggles to feed the commands. Given that you can’t see the result, why send the commands?
Computing point-to-point distances goes more easily in rectilinear coordinates, so I un-tweaked my polar-modified
superformula function to return the points in rectangular coordinates. I’d originally thought a progressive scaling factor would be interesting, but it never happened.
The coordinate pruning occurs in the
supershape function, which now contains a loop to scan through the incoming list of
points from the
superformula function and add a point to the output
path only when it differs by enough from the most recently output point:
path =  path.append(Coordinate(width * points, height * points)) outi = 0 xp, yp = points[outi], points[outi] for i in range(len(points))[1:]: x,y = width * points[i], height * points[i] dist = sqrt(pow(x - xp,2) + pow(y - yp,2)) if dist > 60 : path.append(Coordinate(x, y)) outi = i xp, yp = x, y path.append(Coordinate(width * points[-1], height * points[-1])) print "Pruned",len(points),"to",len(path),"points"
The first and last points always go into the output list; the latter might be duplicated, but that doesn’t matter.
Note that you can’t prune the list by comparing successive points, because then you’d jump directly from the start of a series of small motions to their end. The idea is to step through the small motions in larger units that, with a bit of luck, won’t be too ugly.
height values scale the XY coordinates to fill either A or B paper sheets, with units of “Plotter Units” = 40.2 PU/mm = 1021 PU/inch. You can scale those in various ways to fit various output sizes within the sheets, but I use the defaults that fill the entire sheets with a reasonable margin. As a result, the magic number
60 specifies 60 Plotter Units; obviously, it should have a suitable name.
Pruning to 40 PU = 1.0 mm (clicky for more dots, festooned with over-compressed JPEG artifacts):
Pruning to 60 PU = 1.5 mm:
Pruning to 80 PU = 2.0 mm:
Pruning to 120 PU = 3.0 mm:
All four of those plots have the same pens in the same order, although I refilled a few of them in flight.
By and large, up through 80 PU there’s not much visual difference, although you can definitely see the 3 mm increments at 120 PU. However, the plotting time drops from just under an hour for each un-pruned plot to maybe 15 minutes with 120 PU pruning, with 60 PU producing very good results at half an hour.
Comparing the length of the input point lists to the pruned output path lists, including some pruning values not shown above:
Prune 20 1 - m: 5.3, n1: 0.15, n2=n3: 0.80 Pruned 10001 to 4856 points 2 - m: 5.3, n1: 0.23, n2=n3: 0.75 Pruned 10001 to 5545 points 3 - m: 5.3, n1: 1.15, n2=n3: 0.44 Pruned 10001 to 6218 points 4 - m: 5.3, n1: 0.41, n2=n3: 1.50 Pruned 10001 to 7669 points 5 - m: 5.3, n1: 0.29, n2=n3: 0.95 Pruned 10001 to 6636 points 6 - m: 5.3, n1: 0.95, n2=n3: 0.16 Pruned 10001 to 5076 points Prune 40 1 - m: 3.1, n1: 0.23, n2=n3: 0.26 Pruned 10001 to 2125 points 2 - m: 3.1, n1: 1.05, n2=n3: 0.44 Pruned 10001 to 5725 points 3 - m: 3.1, n1: 0.25, n2=n3: 0.32 Pruned 10001 to 2678 points 4 - m: 3.1, n1: 0.43, n2=n3: 0.34 Pruned 10001 to 4040 points 5 - m: 3.1, n1: 0.80, n2=n3: 0.40 Pruned 10001 to 5380 points 6 - m: 3.1, n1: 0.55, n2=n3: 0.56 Pruned 10001 to 5424 points Prune 60 1 - m: 1.1, n1: 0.45, n2=n3: 0.40 Pruned 10001 to 2663 points 2 - m: 1.1, n1: 0.41, n2=n3: 0.14 Pruned 10001 to 1706 points 3 - m: 1.1, n1: 1.20, n2=n3: 0.75 Pruned 10001 to 4446 points 4 - m: 1.1, n1: 0.33, n2=n3: 0.80 Pruned 10001 to 3036 points 5 - m: 1.1, n1: 0.90, n2=n3: 1.40 Pruned 10001 to 4723 points 6 - m: 1.1, n1: 0.61, n2=n3: 0.65 Pruned 10001 to 3601 points Prune 80 1 - m: 3.7, n1: 0.95, n2=n3: 0.58 Pruned 10001 to 3688 points 2 - m: 3.7, n1: 0.49, n2=n3: 0.22 Pruned 10001 to 2258 points 3 - m: 3.7, n1: 0.57, n2=n3: 0.90 Pruned 10001 to 3823 points 4 - m: 3.7, n1: 0.25, n2=n3: 0.40 Pruned 10001 to 2161 points 5 - m: 3.7, n1: 0.47, n2=n3: 0.30 Pruned 10001 to 2532 points 6 - m: 3.7, n1: 0.45, n2=n3: 0.14 Pruned 10001 to 1782 points Prune 120 1 - m: 1.9, n1: 0.33, n2=n3: 0.48 Pruned 10001 to 1561 points 2 - m: 1.9, n1: 0.51, n2=n3: 0.18 Pruned 10001 to 1328 points 3 - m: 1.9, n1: 1.80, n2=n3: 0.16 Pruned 10001 to 2328 points 4 - m: 1.9, n1: 0.21, n2=n3: 1.10 Pruned 10001 to 1981 points 5 - m: 1.9, n1: 0.63, n2=n3: 0.24 Pruned 10001 to 1664 points 6 - m: 1.9, n1: 0.45, n2=n3: 0.22 Pruned 10001 to 1290 points
Eyeballometrically, 60 PU pruning halves the number of plotted points, so the average data rate jumps from 9600 b/s to 19.2 kb/s. Zowie!
Most of the pruning occurs near the middle of the patterns, where the pen slows to a crawl. Out near the spiky rim, where the points are few & far between, there’s no pruning at all. Obviously, quantizing a generic plot to 1.5 mm would produce terrible results; in this situation, the SuperFormula produces smooth curves (apart from those spikes) that look just fine.
The Python source code as a GitHub Gist:
Saw this after fat-fingering my PIN at a drive-up ATM:
That’s off-putting, isn’t it?
We recently had one of those rare “Get the fuck off the road” incidents on Raymond. To set the stage, we’re on our way for groceries and I’m towing the trailer.
The rear view shows the second car behind us veering far to the right side of the lane, trying to see around the car ahead of him, with much blowing of horn:
The big GMC had been following us at a reasonable distance from the Juliet roundabout as we trundled along Raymond at about 12 mph, riding out of the Door Strike Zone for well and good reason.
The GMC passed us at the end of the median, which let the impatient driver zoom up next to us. You can’t hear the horn that will blow as he pulls up next to me:
Our usual route takes us into Davis St, so Mary’s already leaning into the right turn. I think he intended to go straight on Raymond for at least another block to the arterial, but he made an abrupt right turn into Davis St directly in front of me:
Perhaps that’s to Teach Us A Lesson after all the horn-blowing?
I always ride behind Mary and slightly to her left, so that if / when bad shit goes down, I can bring it down on me, rather than her. In this case, she was safely beyond what was about to happen:
The wide-angle lens is deceiving, as I’m less than three feet from the car and closing rapidly; I’m obviously not turning as sharply as he expected and I’m not slowing to avoid a collision. There’s a parked car just ahead of Mary, to her right, and her path is as far to the right as it can get.
He apparently realized that Teaching Me A Lesson would produce a nasty scuff on the side of his shiny black car and, perhaps having spotted the helmet camera, a nasty loss in the ensuing insurance squabble. He also wasn’t willing to swing wide, head-on into the oncoming lane of Davis, so he stopped dead in the intersection:
That’s fine with me.
I continued wide past the parked car on Davis. He accelerated hard, decided, once again, not to ram me from behind, turned abruptly left into the parking lot, and proceeded to the eastbound arterial:
I’m stopped in that picture to aim the helmet camera backwards over my left shoulder. The car behind the white one is parked near the intersection, just to my right in the previous picture.
As nearly as I could make out, he shouted, in addition to the usual obscenities, “Roads are for automobiles!”, a surprisingly articulate word under the circumstances. Evidently, he hadn’t noticed NYSDOT’s “Share the Road” signage helpfully posted on the far end of Raymond.
Elapsed time from the Juliet roundabout to the parking lot: 45 seconds.
Maybe he had a cake in the oven?