Daily Digest — 2026-05-26

26 newsletters today.

In this digest


Abandoned Futures

The Boeing X-20 Dyna-Soar: The Reusable Spaceplane the Air Force Killed in 1963 — Twenty Years Before the Shuttle Flew Worse

2026-05-26

On December 10, 1963, Secretary of Defense Robert McNamara walked into a press briefing and canceled the most advanced aerospace project in the world. The Boeing X-20 Dyna-Soar — short for "Dynamic Soarer" — had consumed $660 million (roughly $6.7 billion in 2026 dollars), employed over 7,000 engineers across 11 prime contractors, and was within 18 months of its first piloted flight. A full-scale mockup existed. Six pilots had been selected, including a young Neil Armstrong. Boeing's Seattle plant had begun cutting metal on the flight vehicle. And then it was simply gone.

What it was: The X-20 was a single-pilot, delta-winged spaceplane designed to be launched atop a Titan III booster, perform military missions in low Earth orbit — reconnaissance, satellite inspection, even bombardment — and then glide back to a conventional runway landing at speeds up to Mach 18. Unlike the ballistic Mercury capsules splashing into the ocean, Dyna-Soar would land on skids at Edwards Air Force Base like an airplane. The program had been running since 1957, evolving out of Walter Dornberger's wartime Silbervogel antipodal bomber concept.

The engineering was genuinely radical for 1963:

  • René 41 superalloy structural skin, with molybdenum leading edges and a zirconia-coated nose cap rated for 4,300°F reentry temperatures — passive thermal protection, no ablation, fully reusable.
  • Hot structure design — the airframe itself absorbed and radiated heat, eliminating the Shuttle's notoriously fragile silica tile system that would later kill Columbia.
  • Cross-range capability of 1,500 nautical miles, allowing the pilot to choose landing sites after a single orbit — something the Shuttle could barely match.
  • Pilot-in-the-loop reentry control via a side-stick controller, decades before fly-by-wire was standard.

Why it died: McNamara's cancellation rationale was that Dyna-Soar lacked a defined mission — was it a bomber? A reconnaissance platform? A satellite interceptor? The Air Force kept changing the answer. Money was redirected to the Manned Orbiting Laboratory (MOL), which was itself canceled in 1969 without ever flying a crew. The real killer was bureaucratic: McNamara's systems-analysis Pentagon demanded mission-justified cost accounting, and a do-everything spaceplane couldn't survive that scrutiny. Meanwhile NASA's Apollo program was vacuuming up the political oxygen.

Why 2026 should resurrect the architecture: Every problem that killed the Shuttle — fragile tiles, multi-month turnaround, no abort modes during ascent — Dyna-Soar had already solved with 1963 metallurgy. Now consider what we have:

  • Ultra-high-temperature ceramics (HfB₂-SiC composites) push passive thermal limits past 5,400°F.
  • Additive-manufactured René 41 and Inconel 718 structures cut hot-structure airframe weight by 40%.
  • SpaceX's reusable Falcon 9 / Starship boosters provide the launch cadence the Titan III never could.
  • Modern fly-by-wire and GN&C eliminate the cross-range navigation problem entirely.

The Sierra Space Dream Chaser, flying cargo to the ISS in 2024, is essentially a fat Dyna-Soar with composite skin — vindication, 61 years late. The Air Force's own X-37B has flown seven classified missions performing exactly the orbital-inspection role Dyna-Soar was designed for. We rebuilt the concept piecemeal, badly, after throwing away the original.

Key Takeaway: Dyna-Soar wasn't canceled because it didn't work — it was canceled because no one could agree on what it was for, and we spent the next 60 years rebuilding pieces of it under different names.

Daily Automotive Engines

Oil Pump Pickup Tube Design and Oil Starvation

2026-05-26

The pickup tube is the unsung hero hanging off the bottom of your oil pump — a simple piece of bent steel tubing with a screen on the end, submerged in the oil pan. It's the straw your engine drinks through, and if it ever loses its grip on the oil, your bearings start eating themselves within seconds.

The geometry that matters: The pickup sits roughly 1/4" to 3/8" off the pan floor. Too close and it restricts flow (the pump fights to pull oil through a narrow gap); too far and it sucks air during low oil levels or hard cornering. The screen mesh is typically 40-60 microns — coarse enough to flow freely but fine enough to catch chunks before they wreck the pump gears.

How starvation happens:

  • Lateral g-forces slosh oil away from the pickup. A Corvette pulling 1.0g in a right-hand corner shoves all the oil to the left side of the pan — pickup gulps air.
  • Hard braking drives oil forward, away from rear-mounted pickups.
  • Acceleration squat sends oil rearward in a front-pickup pan.
  • Pickup tube cracks at the weld joint where it meets the pump body — common on high-mileage LS engines where vibration fatigues the brazed joint. The pump now sucks air from the crack instead of oil from the pan.

Real-world example: The C5/C6 Corvette LS engines are famous for spinning rod bearings on track days. The factory pan is shallow (for ground clearance) and the pickup gets uncovered in sustained high-g corners. The fix is a deeper Accusump-fed pan, a trap-door baffled pan (like the Improved Racing kit), or — better — a dry sump conversion. GM eventually addressed this with the Z06 dry sump system from the factory.

Rule of thumb — pickup-to-pump matching: The pickup tube ID should be at least as large as the pump inlet, and ideally 10-15% larger to avoid cavitation. A 5/8" pump inlet wants a 3/4" pickup tube. Cavitation at the pickup creates vapor bubbles that collapse inside the pump, eroding the gear faces and causing pressure fluctuations that show up as needle-bouncing on your gauge.

Installation gotcha: Always tack-weld or use a support brace on the pickup tube. The factory press-fit into the pump body relies on a friction joint that can vibrate loose. A pickup that drops 1/2" in the pan during a 7000 RPM pull will uncover itself and end your engine before you can lift off the throttle.

See it in action: Check out What Oil starvation can do to your Engine by DieselBullet to see this theory applied.
Key Takeaway: The oil pickup tube is a simple part with zero tolerance for error — proper height, secure mounting, and a baffled pan are the only things standing between your bearings and a catastrophic oil-starvation event.

Daily Debugging Puzzle

JavaScript's Object.keys Integer Key Trap: The Insertion Order That Isn't

2026-05-26

This function tracks the order in which API endpoints first appear in a request log. It returns the list of unique endpoint names in first-seen order, which the downstream scheduler uses to round-robin between them fairly.

// Returns unique endpoints in the order they were first seen.
function endpointOrder(requests) {
    const counts = {};
    for (const endpoint of requests) {
        counts[endpoint] = (counts[endpoint] || 0) + 1;
    }
    return Object.keys(counts);
}

const log = [
    'api/users',
    'api/posts',
    '404',          // numeric error-code "endpoint" used by a legacy probe
    '503',
    'api/login',
    'api/users',
];

console.log(endpointOrder(log));
// Expected: ['api/users', 'api/posts', '404', '503', 'api/login']
// Actual:   ['404', '503', 'api/users', 'api/posts', 'api/login']

The function looks airtight. Modern JavaScript engines have preserved object property insertion order since ES2015, so iterating Object.keys should just give back what you put in, right?

The Bug

JavaScript's "insertion-order" guarantee for plain objects has a sharp asterisk that bites surprisingly often. The actual OrdinaryOwnPropertyKeys algorithm orders keys in three buckets:

  1. Integer-indexed keys — string keys that round-trip through ToString(ToUint32(key)) (i.e., look like canonical non-negative 32-bit integers) — appear first, in ascending numeric order.
  2. Other string keys — in insertion order.
  3. Symbol keys — in insertion order.

So when you set counts['404'], the engine notices '404' is an integer-index key and silently slots it ahead of any string key, sorted against other integer-index keys. '404' < '503' numerically, so they land in that order — even though '503' was inserted later, and both came after the api/* keys.

This bites anywhere user-controlled strings can resemble integers: HTTP status codes used as map keys, ZIP codes, product SKUs that happen to be all digits, year strings, language tag fragments. Your tests pass with alphanumeric fixtures and break in production the day someone logs in with username "42".

Worse, JSON.stringify uses the same key order, so serialized output silently reorders too — breaking any consumer that signs or hashes a canonical JSON form.

The fix is to stop using plain objects as ordered maps. Map preserves true insertion order for all key types, including numeric strings, and doesn't conflate property keys with array indices:

function endpointOrder(requests) {
    const counts = new Map();
    for (const endpoint of requests) {
        counts.set(endpoint, (counts.get(endpoint) || 0) + 1);
    }
    return [...counts.keys()];
}

If you must keep an object, maintain insertion order separately (e.g., a parallel array of keys), or prefix numeric keys with a non-digit sentinel ('k:404') so the engine doesn't classify them as integer-indexed.

Note that the bucket boundary is the canonical 32-bit unsigned integer form. '01', '4.0', '-1', and '4294967296' are not integer-indexed and stay in insertion order. '0', '42', and '4294967294' are. This irregularity makes the bug feel random when you first encounter it: the same code reorders some numeric strings and not others.

Key Takeaway: Plain JavaScript objects preserve insertion order only for non-integer-index string keys — use Map whenever your keys might be numeric strings and order matters.

Daily Digital Circuits

Pass Transistor Logic: How Hardware Builds Gates Without Pulling to Both Rails

2026-05-26

Standard CMOS gates use complementary pairs: a PMOS network pulls the output to VDD, an NMOS network pulls it to GND. Every input drives a gate terminal, never a source or drain. Pass transistor logic (PTL) breaks that rule. The input signal itself flows through the transistor channel to the output, with another signal controlling the gate. The transistor acts as a switch, not an amplifier.

The classic example is a 2:1 multiplexer. In CMOS, you'd need an inverter plus AOI gates — roughly 10 transistors. In PTL, you need exactly two NMOS transistors: one passes A when select is high, the other passes B when select is low. Four transistors with the complementary pass-gate (CPL) variant. That's a 2-3x area win.

But there's a brutal catch. An NMOS transistor passes a strong 0 but a weak 1. When you try to pass VDD=1.0V through an NMOS, the output only reaches VDD − Vt ≈ 0.6V because the transistor turns itself off as the source voltage approaches the gate voltage. Your "logic 1" is degraded. PMOS has the opposite problem — strong 1, weak 0.

This is why real designs use transmission gates: an NMOS and PMOS in parallel, controlled by complementary signals. Now both polarities pass cleanly. Cost: you need both the control signal and its inverse, plus 4 transistors instead of 2. Still beats full CMOS for muxes and XOR gates.

XOR is where PTL really shines. Full CMOS XOR needs 12 transistors (or 8 with shared inverters). A pass-transistor XOR with transmission gates does it in 6. Multipliers and adders — which are XOR-heavy — get noticeably smaller. ARM's early low-power cores used pass-transistor adders extensively.

Rule of thumb: threshold drop is roughly Vt ≈ 0.3-0.5V in modern processes. At VDD=1.0V, a single NMOS pass transistor delivers ~0.5-0.7V — barely above the next stage's switching threshold. After 2-3 cascaded pass transistors, you've lost so much signal that you must insert a CMOS buffer to restore levels. This is why PTL chains are kept short and always terminated by a static CMOS gate.

The other gotcha: PTL outputs aren't actively driven when all pass transistors are off. The output node floats, holding its last value on parasitic capacitance — for nanoseconds, before leakage corrupts it. Always ensure at least one pass path is enabled, or add a keeper.

See it in action: Check out This is what happens when you OVERLOAD a Resistor! #engineering #electronics #electricity by PLACITECH to see this theory applied.
Key Takeaway: Pass transistor logic builds muxes and XORs with half the transistors of CMOS by routing signals through transistor channels, but threshold drops force you to use transmission gates and periodic CMOS buffers to restore signal levels.

Daily Electrical Circuits

Class-AB Audio Output Stages: Eliminating Crossover Distortion

2026-05-26

A complementary emitter-follower (Class-B push-pull) output stage uses an NPN transistor to source current on positive swings and a PNP to sink current on negative swings. The problem: each BJT needs ~0.6 V of VBE before it turns on. Near the zero-crossing, both transistors are off simultaneously, creating a dead zone of roughly ±0.6 V where the output sticks at zero. The audible result is harsh, buzzy crossover distortion — especially obnoxious at low listening levels where the signal spends most of its time near zero.

The fix is Class-AB biasing: hold both transistors just barely conducting at idle, so when the signal crosses zero, one device is already taking over from the other. The classic technique places two diode drops between the NPN and PNP bases — typically two forward-biased diodes or, better, a VBE multiplier (a transistor with a resistor divider between collector and base, giving an adjustable, thermally-tracking bias of n·VBE).

Why the VBE multiplier matters: output transistors heat up under load, and VBE drops about 2 mV/°C. If your bias source doesn't track that drop, quiescent current rises with temperature, the transistors heat further, and you get thermal runaway — a dead amplifier with melted solder. Mounting the bias-multiplier transistor on the same heatsink as the output devices forces its VBE to fall in lockstep, holding idle current stable.

Real-world example: A 20 W into 8 Ω hi-fi amplifier output stage. Peak output current is √(2·20/8) ≈ 2.2 A. You'd choose TIP41C/TIP42C complementary BJTs, set quiescent current around 20–50 mA (enough to keep both devices in conduction through the crossover region, low enough that idle dissipation is reasonable), and add 0.22 Ω emitter degeneration resistors in series with each output transistor. Those small resistors add local negative feedback that further stabilizes bias against temperature and forces current sharing if you parallel devices.

Rule of thumb for quiescent current: set IQ so the voltage across each emitter resistor is roughly 10–25 mV. For 0.22 Ω resistors, that's 45–115 mA — the sweet spot where crossover artifacts disappear without wasting power. Adjust the VBE multiplier's trim pot while measuring this voltage with the input shorted.

Wrap the whole output stage inside a global op-amp feedback loop and residual crossover distortion drops by another 40+ dB, but the feedback can't fix what the bias gets badly wrong — start with a properly biased stage, then let feedback polish it.

See it in action: Check out Cross Over Distortion - High Power Amplifiers - Applied Electronics by Ekeeda to see this theory applied.
Key Takeaway: Class-AB biasing trickles a small quiescent current through both output transistors so neither fully turns off at the crossover — and a thermally-coupled VBE multiplier keeps that bias stable as the heatsink warms up.

Daily Engineering Lesson

Snubber Circuits: Protecting Switches from Voltage Spikes and Ringing

2026-05-26

When you switch off current flowing through any real-world load, the parasitic inductance in the wiring and the load itself fights back. The collapsing magnetic field generates a voltage spike (V = L·di/dt) that can punch through transistor junctions, weld relay contacts, or excite high-frequency ringing that radiates EMI across the entire enclosure. A snubber is a small network — usually a resistor and capacitor — placed across the switch or load to absorb that energy and damp the oscillation.

Snubbers solve a different problem than flyback diodes. A flyback diode only works for DC inductive loads and clamps voltage in one direction. Snubbers work on AC circuits, across relay contacts being arced apart, and across TRIACs and SCRs where you need to limit dV/dt (the rate of voltage change) to prevent false triggering.

The three common topologies:

  • RC snubber: Resistor in series with capacitor, placed across the switch. Most common. The cap absorbs the spike; the resistor dissipates the energy and prevents the cap from becoming a short at switch-on.
  • RCD snubber: Adds a diode to steer current. Used in flyback converters and forward converters where you need asymmetric behavior.
  • MOV (metal oxide varistor): A voltage-dependent resistor that clamps spikes above a threshold. Cheap, but degrades with every hit.

Sizing rule of thumb for an RC snubber across relay contacts:

  • Capacitor: C ≥ I²/10 microfarads, where I is the load current in amps
  • Resistor: R ≈ V/(10·I), where V is the supply voltage

Example: A 24 VDC relay switching a 2 A solenoid. C ≥ 2²/10 = 0.4 µF (use 0.47 µF), R ≈ 24/(10·2) = 1.2 Ω (use 1 Ω or 2.2 Ω). The cap must be rated for at least 2× the supply voltage; for AC mains snubbers, use an X2-rated film capacitor — never electrolytic.

A real-world gotcha: putting an RC snubber across a TRIAC controlling a motor or transformer is mandatory, not optional. The inductive load's current lags voltage, so at the natural commutation point there's still significant dV/dt — without a snubber, the TRIAC re-triggers spuriously and never turns off. Standard values are 100 Ω and 0.1 µF for typical 120/240 VAC loads.

If you hear a relay buzz or see contact pitting after a few hundred cycles, you need a snubber.

See it in action: Check out Inductive spiking, and how to fix it! by Afrotechmods to see this theory applied.
Key Takeaway: Snubbers absorb the voltage spike and damp the ringing that inductive loads create when switched, protecting contacts and semiconductors from the energy stored in parasitic inductance.

Forgotten Books

When Cars Were Just Horses With Rubber Hooves

2026-05-26

Book: American Fruit Grower 1919-05: Vol 39 Iss 5 by Unknown (1919)

Read it: Internet Archive

In a May 1919 issue of American Fruit Grower — a trade magazine read by orchardists and farmers across rural America — United States Tires ran a full-page advertisement built around an analogy that would baffle most modern readers, but which perfectly captured a country teetering between two ages of transportation:

"You Wouldn't Have Your Best Horse Poorly Shod! Unsuitable tires will cripple an automobile as surely as poorly fitted shoes will lame a horse. Your car must be properly shod to give its best and most economical work. Give it tires you know are exactly suited to its use—tires that are perfectly adapted to the roads you travel."

The ad goes on to promise "five separate types for passenger cars and both pneumatic and solid for trucks" — yes, solid rubber truck tires were still on sale in 1919, decades after pneumatic tires were invented.

The forgotten knowledge here isn't a recipe or remedy — it's a vanished mental model. In 1919, the American farmer didn't think of a car as a machine; he thought of it as a vehicle, in the older sense — something to be matched to roads the way a draft horse is matched to a plowed field versus a gravel lane. You picked tires the way you'd pick horseshoes: for the terrain, the load, and the duration of the journey. A "best horse poorly shod" was a real, painful, expensive problem any reader would have lived through.

What's striking is how right the analogy was, biomechanically. A horse's hoof is a fingernail under load; the wrong shoe causes lameness through bruising, splaying, or uneven wear. A car tire is, similarly, the only contact patch between a multi-ton machine and the ground. The 1939 Firestone ad in the same magazine archive — twenty years later — is still selling the same idea with more science: "Triple-Braced and Continuous" traction bars, tread "Guaranteed Not to Loosen," "21% Flatter Tread provides greater shoulder traction." The horse metaphor is gone, but the underlying claim — that ground contact geometry determines economy — is identical.

What modern drivers have forgotten:

  • Tires used to be matched to use case as carefully as horseshoes were. Most drivers today buy whatever the dealer puts on.
  • "All-season" tires are a postwar compromise — in 1919, a working farm might keep multiple sets.
  • The phrase "rubber meets the road" wasn't a cliché yet; it was a recent technological revelation people were still adjusting to.

The next time your EV's adaptive cruise control politely warns about reduced traction, remember: a fruit grower in 1919 was already being told, in the language of horseshoes, that the contact patch was everything.

The forgotten claim: Choosing car tires was once treated as seriously as shoeing a horse — a craft of matching contact surface to terrain, not a default purchase.

Forgotten Darkroom

The 1960 CIA Speech That Predicted Communism Would Lose — While Everyone Thought It Was The "Wave Of The Future"

2026-05-26

Book: Remarks by General C. P. Cabell, USAF Deputy Director of Central Intelligence to the Tarrant County Medical Society, Fort Worth, Texas, 20 December 1960 by CIA Reading Room (1960)

Read it: Internet Archive

In December 1960, with Sputnik recently in orbit, Castro freshly in Havana, and the West gripped by a creeping fatalism about Soviet inevitability, the Deputy Director of the CIA gave a speech to a room of Texas doctors. General Charles P. Cabell — the man who would be fired by Kennedy four months later over the Bay of Pigs — opened not with a threat assessment, but with a folksy parable about a farmer seeing his first locomotive:

"They studied it as it was standing in the station and the Mrs. turned to her husband and said, 'Pa, what do you think?' Pa said, 'It'll never run, it'll never run.' Well, the train pulled out, and, as it disappeared around a bend the Mrs. turned again and said to Pa, 'Now what do you think?' Pa shook his head, and answered, 'It'll never stop, it'll never stop!'"

Cabell was diagnosing a national mood swing. He continued:

"For years many people in this country were of the opinion that the Soviet Union could never become a going concern... More recently, however, there is a growing body of opinion abroad and in this country which is willing to grant practically unlimited capabilities and potentialities to the Soviet Union and its Communist allies. This view is also the Communist view. Moscow tells us in millions of words daily that Communism represents the wave of the future."

This is the forgotten claim: that in 1960, when Khrushchev was banging shoes at the UN and Western intellectuals were writing earnest books about convergence theory, a senior US intelligence officer was publicly arguing that the "inevitability of Communism" was itself a Soviet psyop — a manufactured perception, not an analytical conclusion. He explicitly identified elite Western pessimism as a Soviet propaganda asset.

Was he ahead of his time? Profoundly. Consider what the consensus actually was:

  • In 1961, Paul Samuelson's bestselling economics textbook projected the Soviet economy would overtake the US between 1984 and 1997.
  • JFK ran on a (fictitious) "missile gap" the Soviets supposedly enjoyed.
  • As late as 1989, the CIA's own internal estimates were still overstating Soviet GDP by roughly 2x.

Cabell, in a speech to a medical society in Fort Worth, told the truth nobody in academic economics or the punditry would admit for another thirty years: that the appearance of unstoppable momentum was being sold, and that sensible people were buying it.

His train metaphor has a modern echo. Substitute "Communism" with whatever current technology, ideology, or market trend is currently being declared inevitable — AI doom, crypto, China's rise, American decline — and Cabell's framework still cuts. The same person who once said "it'll never run" tends, with no intervening update, to say "it'll never stop." The error isn't the direction of the prediction; it's the willingness to extrapolate any momentum to infinity. Trains, in fact, run and then stop.

The forgotten claim: A 1960 CIA deputy director publicly identified Western elites' belief in "inevitable Communism" as itself a Soviet propaganda victory — three decades before the USSR collapsed and proved him right.

Forgotten Patent

Ralph Baer's "Television Gaming Apparatus": The 1968 Patent That Invented the Video Game Console — and the $20 Billion Console Industry

2026-05-26

On January 15, 1968, a 46-year-old engineer at defense contractor Sanders Associates filed a patent that would seed an entire industry — yet he did it in secret, on his own time, using a TV set, a few transistors, and a hand-drawn schematic he'd sketched on a bus-station notepad two years earlier. Ralph H. Baer's US Patent 3,728,480, "Television Gaming and Training Apparatus," described how to make a standard household television set display moving spots controlled by a player — the first video game console.

Baer, a German-Jewish refugee who'd fled the Nazis in 1938 and later served in U.S. Army Intelligence, had a flash of insight in August 1966 while waiting for a colleague outside the Port Authority Bus Terminal in New York. He scribbled a four-page memo titled "Conceptual, Game Display" describing how a TV — at the time, a one-way receiver of broadcast signals — could be hijacked to display interactive content generated by an external box. Sanders, his employer, made radar systems and missile-tracking computers. None of them had any interest in toys. Baer built it anyway, in a back room, with two engineers he convinced to help.

The patent describes the machinery with charming specificity. A small box generates two or three controllable spots on the screen — one for each player, plus a "machine-controlled" spot for a ball. Player controls are simple potentiometers (knobs) and switches. The signal is injected into the TV's antenna port as a faked RF signal, fooling the set into displaying the box's output as if it were a broadcast. Overlays — colored plastic sheets taped to the screen — provided backgrounds: a tennis court, a hockey rink, a maze. The patent's claims are remarkably broad, covering essentially any apparatus that generates player-controllable images on a standard TV.

Sanders licensed the patent to Magnavox in 1971. The resulting product, the Magnavox Odyssey, shipped in 1972 — the first home video game console. It sold 350,000 units. More importantly, a young engineer named Nolan Bushnell saw a demo at a Magnavox dealership in May 1972, then went home and had his company Atari build "Pong" — a single-game arcade machine that ripped off Odyssey's tennis game. Magnavox sued. They won. They kept winning: Sanders and Magnavox collected over $100 million in royalties from Atari, Nintendo, Coleco, Mattel, Activision, and Sega across two decades of litigation, with Baer's patent serving as the foundational prior art for the entire industry.

What makes the patent surprising isn't just that it predates Pong — it's how complete the conceptual stack is. Baer's filing describes:

  • Hit detection: comparing spot positions to determine collision (claim 6)
  • Light-gun input: a photocell-equipped rifle that detects the screen spot — the patent describes shooting-gallery games, predating Nintendo's Zapper by 16 years
  • Cartridge-style game switching: removable circuit cards that reconfigured the spot behavior — the conceptual ancestor of ROM cartridges
  • Two-player networked play over a wired link between consoles

The modern industry — Sony, Microsoft, Nintendo, Steam, the entire $200B+ gaming sector — descends directly from this filing. Every console manufacturer either licensed Baer's patent or paid damages for not licensing it. The "Brown Box" prototype Baer built in 1967 now sits in the Smithsonian. Baer received the National Medal of Technology in 2006 and kept inventing until his death in 2014 at age 92, holding more than 150 patents — including, almost incidentally, the electronic memory game Simon.

Key Takeaway: An entire $200 billion entertainment industry traces back to a four-page memo a defense engineer scribbled at a bus station, then built in secret because his employer thought games were beneath them.

Daily GitHub Zero Stars

jonnilundy/annotate-skill

2026-05-26

This is a delightful little find for anyone working with Claude Code and markdown-heavy workflows. annotate-skill is a self-contained Claude Code skill that generates a Tufte-styled HTML review surface for marking up markdown documents with inline suggestions, comments, and deletions.

If you've spent any time editing prose, technical documentation, or AI-generated drafts, you know that markdown's plain-text nature makes collaborative review awkward. GitHub PRs work for code, but reviewing a long-form document — adding margin notes, suggesting deletions, leaving questions — is genuinely painful. This skill solves that by rendering a beautiful, Edward Tufte–inspired side-margin annotation surface right in HTML.

What makes it interesting:

  • Self-contained output — no server, no dependencies, just an HTML file you can share or commit alongside the source.
  • Tufte styling — sidenotes and margin notes are a natural fit for review comments, and the typography signals "thoughtful editorial work" rather than "JIRA ticket."
  • Skill-shaped — it's packaged as a Claude Code skill, meaning Claude can invoke it on demand to produce review surfaces from any markdown file in your project.
  • Composable workflow — pairs naturally with AI-assisted writing: draft in markdown, have Claude annotate, review the HTML, accept or reject changes.

Who would find this useful:

  • Technical writers who want a lightweight review loop without dragging documents into Google Docs.
  • Bloggers and essayists using Claude as an editor and wanting to see suggested edits in context.
  • Skill authors looking at a clean reference for how to ship a focused, presentation-layer Claude Code skill.

It's a small, opinionated tool that does one thing well — exactly the kind of thing that tends to get buried under flashier repos. Worth a star and a try.

Why check it out: A beautifully-styled, self-contained Claude Code skill that turns markdown review into a Tufte-inspired editorial experience.

Daily Hardware Architecture

The Memory Renamer's Limits: Why Stack Tracking Hardware Gives Up

2026-05-26

We covered memory renaming earlier — the trick where CPUs spot push rax / pop rax pairs and forward the value through a register instead of bouncing it through L1. It's beautiful when it works. But it fails constantly, and understanding why tells you a lot about the limits of speculation.

The renamer maintains a small stack tracking structure — usually 16-32 entries — that maps recent stack store addresses to physical register tags. When a load comes through and its address matches, the CPU bypasses the cache entirely, treating the load as a register-to-register move. Apple's M-series and Intel since Ice Lake both do this. Reported speedup on call-heavy code: 5-15%.

The failure modes:

  • Address ambiguity: If RSP is computed dynamically (e.g., sub rsp, rax with a runtime value), the renamer can't statically match the offset. It gives up and falls back to the load/store queue.
  • Size mismatch: Store a 64-bit value, load 32 bits from the same address with an offset. The renamer can't slice a physical register cleanly, so it bails.
  • Aliasing through non-stack pointers: If any pointer in flight might alias the stack slot (think memcpy with a stack destination), the dependence predictor forces a real memory operation.
  • Function boundaries: Tail calls, setjmp/longjmp, and exception unwinding invalidate the tracking table. The structure is per-context and gets flushed.
  • Capacity: Deep call chains overflow the table. Once an entry is evicted, that spill goes through cache like it's 2005.

Concrete example: A recursive Fibonacci on Apple M2 — measured with MEM_LOAD_RETIRED.L1_HIT counters. Shallow recursion (depth < 16): ~85% of stack loads renamed away, never touching L1. Depth 32: drops to ~60%. Depth 64: under 30%. The table is roughly 24 entries on M2; once you blow past that, every spill is a real cache access.

Rule of thumb: Memory renaming covers leaf and shallow functions well. Once your call stack exceeds ~20 frames of active spilling, assume the renamer has tapped out and L1 latency (4-5 cycles) is back in the critical path. This is one reason aggressive inlining still matters even on CPUs with "free" stack traffic — fewer frames means more of your spills stay in the rename table.

The hardware can only track what fits in a small CAM. Software still has to be considerate.

See it in action: Check out How to Rename multiple files fast by Amit Gangania to see this theory applied.
Key Takeaway: Memory renaming eliminates stack traffic only within a small tracking window — deep call stacks, dynamic RSP, size mismatches, and aliasing all force the CPU to fall back to real cache accesses.

Hacker News Deep Cuts

A model upgrade is a release, not a setting

2026-05-26

There's a quiet category of bug that has plagued teams shipping LLM-powered features since 2023: someone bumps the model name in a config file from claude-sonnet-4-5 to claude-sonnet-4-6, the diff is one line, the PR gets a thumbs-up, and a week later customer support is fielding tickets about output formats that no longer parse, tool calls that fire in a different order, or refusals on prompts that used to work fine. This post argues that the framing is wrong from the start — a model swap isn't a config tweak, it's a dependency upgrade with the blast radius of swapping out a database engine.

The piece likely walks through why teams keep making this mistake:

  • The interface is identical. Same API endpoint, same SDK, same request shape. Nothing in the type system tells you the substrate underneath changed.
  • The "improvement" framing. Vendors market upgrades as strict wins, which discourages the regression testing you'd apply to any other dependency.
  • Eval coverage is usually thin. Most teams have unit tests for their wrapper code but no golden-output suite for the prompts themselves.

What makes this worth reading for a technical audience isn't the diagnosis — most senior engineers have been bitten by this — it's the implied prescription. If a model upgrade is a release, then it needs release infrastructure: pinned versions in production, a staging cohort, an eval suite that runs on the new model before any traffic shifts, a rollback plan, and a changelog of behavioral deltas you actually observed rather than what the vendor advertised. That's a meaningful operational shift from "let's just point at the latest" — and it has staffing and tooling implications most companies haven't budgeted for.

The broader point cuts against an industry instinct to treat foundation models as commodity utilities. They aren't. They're tightly coupled to your prompt-engineering, your tool schemas, your output parsers, and your users' learned expectations. Treating that coupling casually is how you ship outages.

Worth a read for anyone running LLM features in production — especially if your deployment story still involves an environment variable and a prayer.

Why it deserves more upvotes: A concise reframing of a real operational hazard that most teams shipping LLM features will hit but few have built process around.

HN Jobs Teardown

byte: What Their Hiring Reveals

2026-05-26

Source: HN Who is Hiring

Posted by: firloop

Of the ten postings, byte (ID 22666673) is the most revealing because the stack choices tell you exactly what kind of scaling pain they're bracing for — and the company history tells you why.

The stack is a tell. byte runs Go on Google Spanner on GCP, with native Swift/Kotlin clients. Spanner is not a default choice — it's an expensive, globally-distributed, strongly-consistent SQL database. You pick Spanner when you expect write volume that will outgrow a single Postgres primary and you refuse to give up transactional semantics. Combined with Go (chosen for concurrency and operational simplicity, not developer velocity), this is a backend built by people who have already lived through a viral consumer-app scaling event.

The context makes it obvious. The posting explicitly says "some of the same people that brought you Vine." Vine famously died in part because Twitter couldn't figure out the economics and product loop. The byte team is rebuilding the same product category with the infrastructure choices of people who got burned by under-provisioning the first time. They are not going to be caught flat-footed by a growth spike.

What the posting highlights about 2020 trends:

  • Native mobile over cross-platform. No React Native, no Flutter — pure Swift and Kotlin. For a video-creation app, the team has decided platform-native performance and camera/codec access matter more than shared codebases.
  • Managed cloud primitives over self-hosted. Spanner + GCP means they're paying Google to handle the hard distributed-systems problems so a small team can punch above its weight.
  • Creator-economy framing. "Democratize creativity" lands very differently in early 2020 than it did in 2013 — TikTok had just become culturally dominant, and byte is positioning itself as a direct challenger.

Green flags: Specific stack named, clear product thesis, remote option offered (unusual for a consumer-app startup in 2020), team with relevant prior experience.

Red flags: "Fundraised enough to get us to our next goal" is hedge-language — they haven't hit product-market fit yet, and consumer social is a brutal category where Spanner bills can outpace revenue indefinitely. The post is also thin on compensation, team size, and what "next goal" actually means.

The signal: When ex-Vine engineers reach for Spanner on day one, they're telling you that the next wave of consumer social is being built by people who refuse to relearn 2013's scaling lessons.

Daily Low-Level Programming

The x2APIC and Cluster Mode: Why 256 Cores Need a New Interrupt Routing Scheme

2026-05-26

The original APIC was designed when "many cores" meant 4. Its destination field is 8 bits, which caps the system at 256 logical CPUs — and in practice, far fewer once you reserve broadcast and cluster encodings. By the time AMD shipped 128-core EPYCs and Intel shipped 60-core Xeons with hyperthreading, the legacy xAPIC was an interrupt-routing time bomb.

x2APIC is the fix. Three things change:

  • 32-bit APIC IDs instead of 8-bit, lifting the cap from 256 to 4 billion logical CPUs.
  • MSR-based access instead of memory-mapped registers. Writing to the APIC no longer goes through the cache coherence protocol — it's a wrmsr to register 0x800–0x8FF, which is roughly 3x faster than the MMIO path because there's no cache line ping-pong on the APIC page.
  • Cluster mode for IPIs: the 32-bit ID splits into a 16-bit cluster and a 16-bit logical-ID-within-cluster bitmap. One IPI can target up to 16 CPUs in a cluster atomically.

Why cluster mode matters: In flat physical mode, sending an IPI to "all cores except me" on a 128-core box means 127 individual ICR writes. Each write stalls until the previous IPI is accepted. In x2APIC cluster mode, you send one IPI per cluster (typically 8 clusters of 16 cores), so the same broadcast becomes 8 writes — a 16x reduction in IPI emission latency. This is why Linux's flush_tlb_others() got dramatically faster around kernel 3.x when x2APIC cluster mode landed.

Real example: A TLB shootdown on a 64-core machine. In legacy xAPIC, the initiating CPU writes ICR 63 times, waiting ~100ns per send for delivery acknowledgment — about 6.3µs just emitting IPIs, before any target even handles the flush. In x2APIC cluster mode with 4 clusters of 16, it's 4 writes, ~400ns. The flush itself still takes microseconds, but the emission phase nearly disappears from the profile.

Rule of thumb: If you see cpu_flags: ... x2apic ... in /proc/cpuinfo and dmesg | grep x2apic shows "x2apic enabled," your IPI broadcasts are O(clusters), not O(CPUs). On a 96+ core machine without x2APIC (rare, but possible via BIOS misconfiguration), TLB-heavy workloads can lose 5–10% throughput purely to IPI serialization.

Gotcha: x2APIC requires interrupt remapping (the IOMMU's IR unit) to be enabled, because the 32-bit ID doesn't fit in legacy MSI message formats. Disabling VT-d in BIOS silently drops you back to xAPIC and caps you at 255 CPUs — which is why some servers refuse to boot all cores until IOMMU is on.

Key Takeaway: x2APIC replaces MMIO interrupt registers with MSRs and adds cluster mode, turning O(N) IPI broadcasts into O(N/16) — without it, modern many-core systems would drown in interrupt-routing overhead.

Reddit Small Subs

Hunting for Super Short Set Screws

2026-05-26

Subreddit: r/fasteners

Discussion: View on Reddit (3 points, 32 comments)

This post is a small masterclass in fastener design constraints. The poster has a deceptively specific need: they want to limit travel inside a threaded blind hole without a visible jam nut spoiling the aesthetic. Their ideal part is essentially an "anti-nut" — a tube with internal hex drive running all the way through, external threads on the outside, and a length shorter than any commodity set screw. With 32 comments, the thread becomes a tour of why such a simple-sounding part is surprisingly hard to source.

Several useful concepts come out in the discussion:

  • Why set screws have a minimum length. Standard set screws (ANSI/ISO) need enough body to fit a hex socket of sufficient depth to transmit torque without rounding out. Once you go shorter than roughly the diameter, the hex socket either bottoms out or becomes too shallow to drive reliably.
  • The "threaded insert" alternative. Commenters point out that threaded inserts (helicoils, Keenserts, brass press-ins) are effectively hollow externally-threaded tubes — but their threads are designed to grip a tapped host, not act as a positionable stop.
  • Standoffs and threaded couplers. Hex standoffs come close to the "anti-nut" concept but are usually too long and have external flats rather than smooth cylindrical threads.
  • Custom machining is often the real answer. Several commenters note that below a certain size, McMaster and Misumi stop carrying parts and you're looking at a screw-machine shop or making them on a lathe by parting off threaded rod and broaching a hex.
  • Drive alternatives for short fasteners. When a hex socket won't fit, options include slotted drive, spanner holes, or pin-spanner faces — each with tradeoffs in torque capacity and tool availability.

What makes this post quietly educational is that it forces you to think about why the standard catalog looks the way it does. Fastener dimensions aren't arbitrary — they're the outcome of drive geometry, thread engagement minimums, and manufacturing economics. When your application falls outside those constraints, you usually need either a creative substitution (insert, standoff, custom-cut threaded rod) or a custom part.

It's also a nice example of the value of niche subreddits: a question this specific would drown on r/DIY, but r/Fasteners delivers thoughtful, experienced answers.

Why read this: A simple "I need a really short set screw" question becomes a clear lesson in why fastener catalogs have minimum sizes and what to reach for when your part falls outside them.

RFC Deep Dive

RFC 2992: Analysis of an Equal-Cost Multi-Path Algorithm

2026-05-26

RFC: RFC 2992

Published: 2000

Authors: C. Hopps

Every time you stream a movie, load a website, or push a git commit, your packets probably traverse a network where multiple equal-cost paths exist between source and destination. How does a router decide which path each packet takes? RFC 2992 documents the algorithm — hash-threshold ECMP — that quietly powers load distribution across the modern internet's backbone and inside every hyperscale datacenter.

The problem. When a routing protocol (OSPF, IS-IS, BGP) computes shortest paths and finds N next-hops with identical cost, the router has a choice to make for every packet. Naïve approaches all have issues:

  • Round-robin per packet: distributes load evenly but reorders TCP segments, causing fast-retransmit cascades and tanking throughput.
  • Per-destination: keeps flows intact but distributes poorly when traffic is dominated by a few heavy destinations.
  • Modulo-N hashing (hash(flow) mod N): keeps flows on one path, but when N changes — a link flaps, a peer withdraws — every flow remaps to a new next-hop. Catastrophic for stateful middleboxes and NAT tables.

The hash-threshold idea. Hopps' algorithm hashes the flow's five-tuple into a large key space (say, 2^16), then divides that space into N contiguous regions, one per next-hop. A flow is assigned to whichever region contains its hash. When the number of next-hops changes from N to N+1, the regions are re-partitioned — but each flow either stays in its current region or moves to one adjacent region. Roughly 1/(N+1) of flows shift, instead of all of them. This is the same insight behind consistent hashing, applied to packet forwarding.

Why this matters today. ECMP is everywhere:

  • Datacenter fabrics: Clos / leaf-spine topologies depend on ECMP to spread east-west traffic across dozens of equal-cost uplinks. Without it, leaf-spine doesn't work.
  • BGP multipath: ISPs balance customer traffic across parallel transit links using the same hash-threshold approach.
  • LAG / 802.3ad bonding: Linux's bonding driver and switch link-aggregation use ECMP-style hashing to pick a member link.
  • Anycast load balancing: When you hit 8.8.8.8 or a CDN POP, BGP delivers you to one of many sites; ECMP inside the destination AS picks the actual server.

The dark corners. RFC 2992 also analyzes what goes wrong. Hash polarization is the big one: if every router in a path uses the same hash function on the same fields, flows that collided on router A also collide on router B, causing some paths to saturate while others sit idle. Modern silicon mitigates this by seeding each router's hash differently, or by including the TTL or a per-device salt. Another gotcha: flowlet approaches (briefly switching paths during a TCP idle gap) extend Hopps' work, used in Microsoft's CONGA and in Cisco's dynamic load balancing.

The backstory. Christian Hopps wrote this as an Informational RFC while at NextHop Technologies, a small routing-software shop. It's only about 8 pages — really a worked example with probability math, not a protocol spec. But it became the reference cited by every router vendor, every datacenter paper, and every IETF draft that touches multipath. A rare case of a short, mathy RFC quietly setting the operational standard for an entire industry.

Next time you run ip route show and see multiple nexthop lines, you're looking at hash-threshold ECMP in action.

Why it matters: Hash-threshold ECMP is the unsung algorithm that lets the internet and every datacenter fabric spread traffic across parallel links without shredding TCP flows when topology changes.

Stack Overflow Unanswered

Pi Pico Embedded Rust Always elf2uf2-r Always Produces Error: "Unrecognized ABI"

2026-05-26

Stack Overflow: View Question

Tags: rust, embedded, cortex-m, pi, raspberry-pi-pico

Score: 1 | Views: 239

The asker is trying to build a "blinky" style program in Rust for the original Raspberry Pi Pico (RP2040, Cortex-M0+). Their Cargo configuration looks textbook-correct: thumbv6m-none-eabi target, the linker flags that preserve the .boot2 section, and a runner that pipes the ELF through elf2uf2-rs so the resulting UF2 can be dropped onto the bootloader mass-storage device. Yet every build ends with elf2uf2-rs bailing out with "Unrecognized ABI".

What makes this one interesting is that the error message is misleading. elf2uf2-rs doesn't actually care about C ABI variants — it looks at the ELF's e_flags and the program headers and validates that the binary's load addresses fall inside the Pico's expected flash/SRAM regions. The "Unrecognized ABI" branch fires when the tool can't reconcile what it sees with the layout it knows for the RP2040. The common root causes are:

  • Wrong memory.x: if FLASH ORIGIN isn't 0x10000000 with the boot2 stub at offset 0, or RAM isn't 0x20000000, the load segments end up outside the known windows.
  • Missing or stale rp2040-boot2: without the second-stage bootloader in .boot2, the first 256 bytes of flash are empty, so the entry-point heuristic fails.
  • Targeting the Pico 2 (RP2350) by accident: thumbv6m-none-eabi is correct for RP2040, but if the asker actually has a Pico 2, they need thumbv8m.main-none-eabihf and a newer elf2uf2-rs (or better, picotool). The error message looks identical.
  • Cortex-M runtime mismatch: pulling in cortex-m-rt without a board-support crate like rp-pico or rp2040-hal often leaves memory.x undefined, and Cargo silently falls back to a default that doesn't match.

The direction I'd point them: first run arm-none-eabi-readelf -l target/thumbv6m-none-eabi/debug/<binary> and verify that LOAD segments start at 0x10000000 and that a .boot2 section exists and is non-empty. If .boot2 is empty, they're missing the #[link_section = ".boot2"] static from rp2040-boot2. If the load address is wrong, their memory.x is wrong or absent.

Gotcha worth flagging: elf2uf2-rs has been functionally superseded by picotool for newer setups, and the RP2040 vs RP2350 distinction trips up almost everyone buying a Pico in 2026 — the SKUs look nearly identical on the shelf.

The challenge: A misleading error message ("Unrecognized ABI") hides the real culprit, which is almost always a memory-map or boot2 problem — and the silent fallbacks in Cargo's linker config make it hard to tell which.

Daily Software Engineering

The Read Repair Pattern: Fixing Inconsistencies on the Way Out

2026-05-26

In an eventually consistent system with replicas, writes don't always land everywhere at the same time. A node might miss a write because it was offline, slow, or the network dropped a packet. Read repair says: when a client reads data and notices replicas disagree, fix the stale ones right then, as a side effect of the read.

The flow is straightforward. A coordinator queries multiple replicas (often a quorum). It compares responses using version numbers, timestamps, or vector clocks. If they disagree, the coordinator returns the freshest value to the client and writes that value back to the stale replicas. The slow replicas catch up without anyone running a separate repair job.

Concrete example: Cassandra. Suppose you write user profile user:42 with replication factor 3. Node A and B accept the write, but Node C is briefly unreachable. Later a client reads user:42 with consistency level QUORUM. The coordinator hits all three replicas. A and B return version 7; C returns version 6. The coordinator returns version 7 to the client, then asynchronously writes version 7 to C. Next read, all three agree. Cassandra also offers blocking read repair (synchronous) for stronger guarantees at the cost of latency.

Two flavors worth knowing:

  • Foreground (blocking) repair: coordinator waits for the repair write before responding. Slower reads, but the client is guaranteed the data is now consistent on the read path.
  • Background (async) repair: coordinator returns immediately and repairs in the background. Faster, but a follow-up read from the same client could briefly see the stale value if it hits an unrepaired replica.

The tradeoff: read repair is cheap because it piggybacks on traffic you're already serving. But it only fixes data that gets read. Cold data — rows nobody touches for months — stays inconsistent until something else (anti-entropy, Merkle tree sync, scheduled repair) catches it. That's why production Cassandra clusters run nodetool repair on a schedule: read repair handles the hot path, scheduled repair handles the rest.

Rule of thumb: if your read repair chance is 10% (Cassandra's default for non-quorum reads), and a row is read 100 times a day, expected time to repair is ~10 reads = a few minutes. For a row read once a week, expect days of inconsistency. Tune the chance up for hot data, or rely on quorum reads which always trigger repair on mismatch.

Read repair pairs naturally with hinted handoff (handles short outages) and anti-entropy repair (handles long-term drift). None of them alone is sufficient — together they form the convergence story for eventual consistency.

See it in action: Check out Punch needle Problems Solving - Common mistake and how to fix it. #crochet #punchneedle #handmade by Craft Mo to see this theory applied.
Key Takeaway: Read repair fixes stale replicas as a side effect of normal reads — cheap for hot data, useless for cold data, so always pair it with scheduled anti-entropy.

Tool Nobody Knows

ioping: ping for Your Disks (and Why You Stopped Trusting dd)

2026-05-26

Everyone reaches for dd if=/dev/zero of=test bs=1M count=1024 to measure disk speed, then squints at the number and pretends it means something. It doesn't. dd measures sequential bulk throughput with whatever caching the kernel feels like doing that afternoon. It tells you nothing about the thing that actually makes your database feel slow: latency.

ioping is the missing tool. Written by Konstantin Khlebnikov, it does for storage what ping does for networks — fires individual I/O requests at a path or device and reports per-request latency. Install it from your distro (apt install ioping, brew install ioping, pacman -S ioping).

The default invocation is exactly what you'd hope:

$ ioping /var/lib/postgresql
4 KiB <<< /var/lib/postgresql (ext4 /dev/nvme0n1p2): request=1 time=89.2 us
4 KiB <<< /var/lib/postgresql (ext4 /dev/nvme0n1p2): request=2 time=72.4 us
4 KiB <<< /var/lib/postgresql (ext4 /dev/nvme0n1p2): request=3 time=104  us (slow)
^C
--- /var/lib/postgresql (ext4 /dev/nvme0n1p2) ioping statistics ---
3 requests completed in 265.9 us, 12 KiB read, 11.3 k iops, 44.1 MiB/s
generated 3 requests in 2.45 s, 12 KiB, 1 iops, 4.89 KiB/s
min/avg/max/mdev = 72.4 us / 88.6 us / 104 us / 12.9 us

Real random-read latency. No buffering games — by default it uses O_DIRECT and varies offsets so the page cache can't cheat.

The flags that matter:

  • -c 20 — fixed count, then exit. Good for scripting.
  • -S 4G — work-set size. Defaults to 1 MiB, which entirely fits in cache. Bump it past your RAM if you want honest numbers.
  • -s 64k — request size. Pair with realistic values for your workload (Postgres is 8K, most filesystems prefer 4K, video editors hit 1M+).
  • -L — sequential, not random. Pair with -s 1M for honest bulk-throughput numbers that still beat dd.
  • -W — write test. Be careful; it writes to a temp file in the target directory.
  • -D — direct I/O (default on Linux, but explicit on macOS where you need it).
  • -A — async I/O. Reveals how much your storage benefits from queue depth.

The trick most people miss: compare cached vs. uncached on the same device.

$ ioping -c 10 -C /data       # -C uses page cache, shows RAM speed
$ ioping -c 10 /data          # default O_DIRECT, shows real disk

When the first reports 2 µs and the second reports 8 ms, you've just diagnosed why your "fast" NVMe-backed service is bottlenecked: someone's working set blew past the cache.

Latency distribution, not just averages:

$ ioping -c 1000 -p 100 -P 1000 /var/lib/mysql
# -p 100 prints a summary every 100 requests
# -P 1000 reports requests-per-second instead of intervals

The mdev (mean deviation) field is the one that actually predicts user complaints. A drive averaging 200 µs with mdev 800 µs has p99 latencies that will ruin somebody's afternoon — and dd would have shown you a cheerful "450 MB/s" and called it a day.

Run it against /dev/sda directly (with care, read-only) to bypass the filesystem entirely. Run it against an NFS mount to find out which of your network or your server is the bottleneck. Run it in a tight loop during a backup window to watch latency degrade in real time. It's the tool you should have been reaching for the entire time.

Key Takeaway: dd measures throughput under ideal conditions; ioping measures the latency distribution that actually determines whether your storage feels fast — and tells you when the page cache is lying to you.

What If Engineering

What If We Built a Solar Farm on the Dark Side of Mercury... Wait, There Isn't One. So Just Mercury.

2026-05-26

Mercury receives ~9,100 W/m² of solar flux — roughly 6.7× what Earth's surface gets at noon on the equator. A solar panel that yields 200 W on your roof would deliver about 1,340 W there. Tempting. Let's see what breaks.

The thermal problem dominates everything. Mercury's dayside surface hits 700 K (427 °C). Silicon photovoltaics lose roughly 0.4%/°C above 25 °C; extrapolating naively, a Si panel at 700 K would have negative efficiency — it'd be a heater. Real answer: silicon's bandgap collapses thermally and the p-n junction stops rectifying around 200 °C. You need wide-bandgap cells: GaInP/GaAs/Ge multijunctions with active cooling, or thermophotovoltaics tuned for the spectrum.

So we cheat: build at the poles. Mercury's axial tilt is only 2°, so polar crater rims see near-continuous sunlight at grazing incidence (~250 K ambient — manageable) while crater floors stay in permanent shadow at 100 K. Perfect radiator sink right next door.

Back-of-envelope: a 1 GW polar array.

  • Grazing solar flux at the rim: ~9,100 × sin(5°) ≈ 790 W/m² (about Earth-equivalent — the irony)
  • Multijunction efficiency at 250 K: ~38%
  • Required collector area: 1×10⁹ / (790 × 0.38) ≈ 3.3 km²
  • Mass at 2 kg/m² thin-film mounted on lightweight truss: ~6,600 tonnes

For comparison, the ISS took 42 launches to assemble 420 tonnes. You'd need roughly 16× that, but to Mercury — a Δv budget of ~13 km/s from LEO using gravity assists, versus 4 km/s to the Moon. Mercury is harder to reach than Pluto because you're falling into the Sun's gravity well and need to brake hard. The MESSENGER probe took 6.5 years and used six planetary flybys to shed velocity.

Now the real question: how do you get the power home?

Wires won't work — 77 million km of superconductor isn't happening. The two options:

  • Microwave beam: A 1 GW beam at 10 GHz needs a transmitter aperture of roughly D ≈ 1.22 × λ × R / d_rx. For a 10 km receiver on Earth and R = 1×10¹¹ m, transmitter diameter ≈ 370 km. Unbuildable.
  • Laser at 1 μm: Same equation gives transmitter diameter ≈ 12 m. Suddenly tractable. But atmospheric absorption + pointing stability at 0.0000007 arcseconds is its own nightmare.

The honest use case isn't powering Earth. It's powering Mercury itself — running a robotic mining operation refining the planet's iron-nickel crust (Mercury is 70% metal by mass) and slinging refined material out via electromagnetic mass driver. Mercury's escape velocity is 4.25 km/s, low enough that a 100 km railgun pulling 9 g could launch payloads on Hohmann transfers to Earth or the asteroid belt.

The structural curveball: Mercury has no atmosphere, but its day is 176 Earth days long, and the surface undergoes 600 K thermal cycling. Aluminum truss with α=23 μm/m/K expanding across 600 K means 1.4% length change — a 100 m beam shifts 1.4 m every Mercury day. You'd need invar (α=1.2) or compliant joints, not rigid welds. Anything bolted will fatigue-crack within years.

Key Takeaway: Mercury's 9 kW/m² is irresistible on paper, but thermal management, the 13 km/s gravity well, and inverse-square beaming losses mean the only economic use is in-situ — powering robotic mining of the Solar System's densest mineable body.

Wikipedia Rabbit Hole

Vacuum tube battery

2026-05-26

Imagine buying a portable radio in 1925. You bring it home, plug in... nothing. Instead, you haul out a small arsenal of three separate batteries, each with its own voltage, its own purpose, and its own alphabetical letter. Welcome to the strange, expensive, leaky world of the vacuum tube battery — an era when listening to the news literally cost you a dollar a day.

Every vacuum tube needed three different power supplies simultaneously, and engineers labeled them with disarming simplicity:

  • The A battery heated the filament — a constant drain of amps that turned the cathode hot enough to boil off electrons. Usually a wet lead-acid cell, like a tiny car battery sitting in your living room. You'd unbolt it weekly and lug it to the drugstore for recharging.
  • The B battery provided the high plate voltage — typically 45, 90, or even 135 volts of dry cells stacked in series. This is the origin of the now-archaic term "B+" that still appears in vintage schematics, and the reason a 9V battery is technically a miniature descendant of the B.
  • The C battery biased the control grid with a small negative voltage. It barely drained at all, but you needed it anyway — three batteries to hear Amos 'n' Andy.

The economics were brutal. A typical 1920s family spent more on batteries per year than on the radio itself. The A battery alone could cost the equivalent of $15 a week in today's money, and rural households without electricity had no alternative. This is why "battery eliminators" — bulky transformers that converted household AC into all three required voltages — became one of the hottest consumer products of the late 1920s, and why the development of AC-powered tubes around 1927 essentially killed an entire industry overnight.

If you've ever wondered why old radio chassis have that distinctive smell, it's partly the residue of leaked B-battery electrolyte that ate through cabinet wood for decades. And here's where it connects to something you probably know: the iconic 9-volt rectangular battery in your smoke detector? It's a direct vestige of B-battery design — six 1.5V cells stacked exactly the way Eveready stacked 60 of them to make 90V transistor radios in 1956 needed only a tiny version, and the form factor never died.

Even more delightfully obscure: portable tube radios in the 1940s used hearing-aid-style "AB packs" that combined both batteries into a single sealed unit, but the filaments were so power-hungry that a "portable" radio would die after about 20 hours of listening. Compare that to a modern smartphone playing streaming audio for days on a battery a fraction the size — a roughly 10,000-fold improvement in energy efficiency per minute of audio.

Down the rabbit hole: The 9-volt battery in your smoke detector is the last living fossil of a 1920s radio standard — and the reason your grandparents' radio bills rivaled their grocery bills.

Daily YT Documentary

Mini-Transat : Les Histoires Incroyables des Skippers Solitaires | Documentaire Mers et Océans

2026-05-26

Mini-Transat : Les Histoires Incroyables des Skippers Solitaires | Documentaire Mers et Océans

Channel: Mare Nostrum (7150 subscribers)

The Mini-Transat is one of sailing's most extreme challenges: a solo transatlantic race aboard a tiny 6.5-meter (21-foot) sailboat, with no GPS-based weather routing, no outside assistance, and no autopilot luxuries. Skippers cross roughly 4,000 nautical miles from France to the Caribbean alone, often in boats smaller than many living rooms.

This French-language documentary explores the human stories behind the race — the storms, the capsizes, the equipment failures, and the moments of triumph. It covers the unique "Mini 6.50" class of yacht, which has served as a proving ground for many of the world's top offshore sailors (including future Vendée Globe competitors). The format intentionally restricts technology and budgets, which makes it a fascinating study in seamanship, naval architecture trade-offs, and sheer mental endurance.

Expect coverage of navigation techniques without modern routing tools, the engineering choices that make these tiny boats survivable in Atlantic weather, and first-person accounts of what it actually feels like to sleep in 20-minute increments while being thrown around in a fiberglass shell for three weeks. If you're interested in offshore sailing, small-boat design, or extreme human endurance, this is a substantive watch — not a highlight reel.

Note: documentary is in French; auto-translated subtitles recommended for non-French speakers.

Why watch: A genuine deep-dive into one of sailing's most demanding solo races, blending naval engineering, weather strategy, and raw human endurance stories.

Daily YT Electronics

Multi-Robot Pianist | ECE Senior Design Project | GMU Spring 2025

2026-05-26

Multi-Robot Pianist | ECE Senior Design Project | GMU Spring 2025

Channel: JoJo (0 subscribers)

Senior design projects from university ECE programs tend to be the sweet spot for hobbyist viewers: they're more ambitious than weekend Arduino builds, but the students are still learning out loud, so they explain the why behind their design choices instead of glossing over them. This one from George Mason University tackles a genuinely tricky problem — coordinating multiple robots to play piano together.

What makes this interesting from an engineering standpoint is the layered set of challenges. You need precise mechanical actuation to strike keys at the right velocity and timing, you need synchronization across multiple independent robots (which usually means some kind of master clock or shared timing protocol), and you need a way to translate MIDI or sheet music into motion commands. Any one of those is a respectable project; doing all three together forces compromises that are educational to watch.

Compared to the rest of today's candidates — which lean heavily on the standard "ESP32 + sensor + buzzer" student project template — this one stands out for scope and originality. Expect to see servo or solenoid actuators, microcontroller-to-microcontroller communication, and the inevitable mechanical alignment issues that come with hitting physical piano keys reliably.

Why watch: A multi-robot coordination problem with real mechanical and timing constraints — meatier than the typical senior project demo.

Daily YT Engineering

Why Aircraft Frame & Stringer Spacing Is NOT Based on Strength

2026-05-26

Why Aircraft Frame & Stringer Spacing Is NOT Based on Strength

Channel: AEROSIFT PRAVAHA (14 subscribers)

This pick comes from a tiny channel (14 subscribers) that's quietly publishing some of the more counterintuitive structural-engineering content on YouTube. The premise is exactly the kind of thing that trips up students and even working engineers: if you sized aircraft frames and stringers purely for strength, you'd end up with the wrong answer. The actual driver is stability — specifically, the buckling behavior of thin skin panels under compressive and shear loads.

The same channel's companion video ("Fuselage skin panels can buckle") confirms the angle: modern semi-monocoque fuselages are deliberately designed to let skin panels buckle in service, with frames and stringers spaced to control the post-buckled load path rather than prevent buckling outright. That's a genuinely non-obvious design philosophy borrowed from Wagner's tension-field theory, and it's why you'll see characteristic diagonal wrinkling on aircraft skins under load.

If the video delivers on the title, it should walk through why panel aspect ratio, Euler column behavior of stringers between frames, and skin effective-width calculations dominate the spacing decision — not ultimate tensile strength. This is exactly the kind of "the textbook answer is wrong" insight that's worth a few minutes, especially from a creator clearly teaching from a structures background rather than chasing views.

Why watch: A rare, clearly-framed explanation of why aircraft structural spacing is governed by buckling stability — not strength — from an instructor who actually teaches the subject.

Daily YT Maker

Nightwing Gauntlets From Scratch - DIY Cosplay Build

2026-05-26

Nightwing Gauntlets From Scratch - DIY Cosplay Build

Channel: Victory boy here (207 subscribers)

Most of today's batch is hashtag-spammed Shorts and quick clickbait clips — this is the one full-length build video with a real process to follow. The creator walks through fabricating a pair of Nightwing gauntlets from scratch, which is a surprisingly rich exercise in pattern-making, foam fabrication, and finishing — the same core skills that underpin most prop and armor work.

Cosplay builds like this are an accessible entry point into fabrication because the materials are cheap (EVA foam, contact cement, craft paint) but the techniques transfer directly to more serious work: drafting flat patterns from a 3D form, scoring and heat-forming foam to get curved shells, layering for depth, and sealing/painting to fake metal. Watching someone solve the fit problem — making something that wraps a forearm cleanly and articulates at the wrist — is genuinely useful even if you have no interest in superheroes.

At 207 subscribers this is a tiny channel, so expect rough edits rather than polished tutorial production, but the build itself is the substance. Worth a watch if you've been curious about getting into foamsmithing or want to see how a hobbyist tackles a symmetric pair of wearable props without a 3D printer.

Why watch: A from-scratch foam armor build that teaches pattern-making and fabrication fundamentals applicable well beyond cosplay.

Daily YT Welding

Forging War Pick / War Hammer #blacksmith #forging #history #warhammer

2026-05-26

Forging War Pick / War Hammer #blacksmith #forging #history #warhammer

Channel: Desert Dog Studios (519 subscribers)

Note: today's batch is unusually thin — most candidates are hashtag-spammed Shorts, AI-generated "molten silver dragon sword" clickbait, or background-music factory footage with no instructional content. This is the least-bad pick, and genuinely the only one that looks like a real smith working a real project.

The medieval war pick (or horseman's pick) is an interesting subject because its design is driven entirely by a specific engineering problem: by the 14th century, plate armor had become good enough that swords and maces struggled to defeat it. The war pick concentrates the entire force of a swing onto a small hardened point, generating the pressure needed to punch through or deeply dent steel plate. The opposite side is typically a hammer face for blunt-force trauma against mail or helms.

Forging one is a useful study in asymmetric tool geometry: the smith has to draw out a long, tapered spike on one side of an eye (the hole for the handle) while keeping a squared hammer poll on the other, all without distorting the eye itself. Punching and drifting the eye, then forging the two ends in balance, is a classic test of a smith's control.

At 519 subscribers and made on viewer request, this looks like an honest workshop video rather than a content-farm reel.

Why watch: A real smith forging a historically purposeful weapon whose geometry is a direct engineering response to plate armor.

All newsletters