Daily Digest — 2026-05-28

26 newsletters today.

In this digest


Abandoned Futures

The Martin P6M SeaMaster: The Jet-Powered Flying Submarine Killer That Could Have Given America a Mobile Nuclear Strike Force at Sea

2026-05-28

In 1955, the Glenn L. Martin Company rolled out of its Middle River, Maryland plant something that should not have been possible: a swept-wing, four-engine jet bomber that took off from water. The P6M SeaMaster was a 190,000-pound flying boat designed to skim the wavetops at Mach 0.9, deliver nuclear weapons or sea mines anywhere on the planet, and return to a tender ship rather than a fixed airbase. It actually worked. Then the Navy killed it in August 1959 — three weeks before the production aircraft were due for fleet delivery.

The strategic logic was elegant. In the early 1950s, the Navy was losing the nuclear mission to the Air Force's land-based bombers. Aircraft carriers couldn't yet operate aircraft heavy enough to carry early hydrogen bombs. Admiral Arleigh Burke's Seaplane Striking Force concept solved this: SeaMasters would deploy from anywhere with a sheltered cove, refueled and rearmed by submarine tenders (the converted USS Albemarle) or even submarines themselves. No airfields to bomb, no carriers to sink — a dispersed, mobile, ocean-going strike fleet.

The engineering was extraordinary. Four Pratt & Whitney J75 turbojets mounted in pairs above the wing root to keep intakes clear of spray. A rotating bomb bay door that sealed watertight — the aircraft could taxi, submerge the lower hull, and the weapons bay stayed dry. A T-tail to clear engine exhaust. Hydroskis under development for higher takeoff speeds. The XP6M-1 prototype first flew on July 14, 1955. The YP6M-1 pre-production aircraft hit 646 mph at sea level — faster than any contemporary land-based bomber at that altitude.

Why did it die? Three reasons converged:

  • Two fatal crashes (December 1955 and November 1956) caused by a flight control system that over-amplified pilot inputs at high speed. Both prototypes broke up in mid-air. The cause was eventually identified and fixed.
  • The Polaris submarine-launched ballistic missile succeeded faster than anyone predicted. The USS George Washington launched its first Polaris in July 1960. Why fly a bomber when you can shoot a missile from underwater?
  • Budget cannibalization. The Navy chose to fund supercarriers and Polaris boats. SeaMaster cost $44 million per aircraft in 1959 dollars — roughly $470 million today.

The Navy scrapped all completed airframes. Not a single intact P6M survives.

Why revisit this now? The Pacific theater of 2026 has resurrected every problem SeaMaster was designed to solve. Chinese DF-26 and DF-27 missiles can range every fixed US airbase in the Indo-Pacific. Carriers are increasingly vulnerable to hypersonic anti-ship weapons. The strategic appeal of dispersed, water-based aviation — operating from atolls, lagoons, and protected anchorages with no runway signature — has never been higher. DARPA's Liberty Lifter program (2022–present) is explicitly reviving large seaplane concepts for exactly this reason.

Modern materials would transform the design. Carbon-fiber composites would shed 30% of the structural weight that aluminum required. Modern FBW flight controls would have prevented both fatal crashes — the failure mode was a known, solvable problem we now solve routinely. Geared turbofans like the PW1000G would cut fuel burn by 35% and triple range. Stealth-shaped hulls (already studied for the cancelled Lockheed CL-1373 in the 1970s) would reduce radar return. And the weapons bay that once held a single B43 nuclear bomb could now carry 20+ LRASM or JASSM-ER cruise missiles, turning each aircraft into a distributed strike node.

The SeaMaster wasn't a bad idea. It was a correct idea that Polaris briefly made unnecessary — and that the geography of modern great-power competition has made urgent again.

Key Takeaway: The P6M SeaMaster proved in 1959 that runway-independent jet strike aviation was technically achievable; modern composites, fly-by-wire, and Pacific geopolitics now make its core concept more strategically relevant than at any point since its cancellation.

Daily Automotive Engines

Oil Pump Pressure Regulation Spring Rates: Tuning the Heart of the System

2026-05-28

Every fixed-displacement oil pump produces far more flow than the engine needs at high RPM. The pressure relief spring is the single component that decides what pressure the engine actually sees — and its rate is one of the most consequential tuning decisions in the entire lubrication system.

The relief valve is dead simple: a spring pushes a piston (or ball) closed against a seat. When oil pressure exceeds the spring's preload force divided by the piston area, the piston cracks open and dumps excess flow back to the sump or pump inlet. Spring rate and preload set the regulation point. Stiffer spring = higher cracking pressure. Longer preload (shimming) = higher cracking pressure with the same spring.

Here's the rule of thumb engine builders live by: 10 psi of oil pressure per 1000 RPM, minimum, at operating temperature. A 7000 RPM engine wants at least 70 psi at redline. But you don't want much more than that — every extra psi is parasitic horsepower the crankshaft pays for, and excessive pressure can blow out filter bypass valves, balloon oil filter cans, or aerate oil through over-pressurized squirters.

Real-world example: The LS-series Chevy small block ships with a ~70 psi relief spring. Builders running high-RPM solid-roller cams swap to the Melling 10295 high-pressure spring (roughly 85 psi crack), because aggressive lifters and tight bearing clearances at 7500+ RPM demand more pressure to maintain hydrodynamic film thickness. Conversely, LS guys building street motors with loose clearances often shim down the stock spring to reduce parasitic loss and oil temperature.

Spring rate calculation is straightforward. If your relief piston has a 0.5" diameter (area = π × 0.25² = 0.196 in²), and you want it to crack at 75 psi:

  • Required force = 75 psi × 0.196 in² = 14.7 lbs
  • If the spring is compressed 0.4" at the closed position, required spring rate = 14.7 / 0.4 = ~37 lb/in

A few practical gotchas:

  • Cold-start spike: 40W oil at startup can hit 100+ psi against a 70 psi spring because the spring can't dump flow fast enough through the relief orifice. This is normal and self-limiting.
  • Spring fatigue: Relief springs sag over 100k miles, dropping regulation pressure 5–10 psi. Common cause of "low oil pressure" complaints on aged engines — replace the spring before condemning the pump.
  • Don't shim blindly: Adding a washer under the spring raises pressure, but if you exceed the pump's mechanical capacity (gear tip speed cavitation), you'll get pressure oscillation, not steady increase.
See it in action: Check out How to Regulate, Adjust the Pressure of an Unloader by 4000PSI to see this theory applied.
Key Takeaway: The oil pressure your gauge reads isn't set by the pump — it's set by a single spring deciding when to dump excess flow, and 10 psi per 1000 RPM is the floor you tune to.

Daily Debugging Puzzle

C++'s vector<bool> Proxy Trap: When auto Captures a Reference You Didn't Ask For

2026-05-28

This function is supposed to atomically swap a flag to false and return whatever it was before — a classic test-and-clear primitive. The caller uses the returned value to decide whether to run a one-time initialization.

#include <vector>
#include <iostream>

bool test_and_clear(std::vector<bool>& flags, std::size_t i) {
    auto previous = flags[i];   // snapshot the old value
    flags[i] = false;           // clear it
    return previous;            // return what it WAS
}

int main() {
    std::vector<bool> needs_init = {true, true, true};

    if (test_and_clear(needs_init, 0)) {
        std::cout << "initializing slot 0\n";
    } else {
        std::cout << "slot 0 already initialized\n";
    }
}

The vector clearly starts with true at index 0. So test_and_clear should snapshot true, write false, and return true. Initialization should run.

It doesn't. The program prints "slot 0 already initialized". And every subsequent call agrees — the flag was apparently never set.

The Bug

std::vector<bool> is the standard library's most infamous wart: it isn't a container of bool. It's a bit-packed specialization, and operator[] returns a proxy object of type std::vector<bool>::reference, not a bool. That proxy holds a pointer to the underlying word plus a bitmask — it's a live reference to the bit.

When you write auto previous = flags[i];, type deduction picks std::vector<bool>::reference, not bool. You did not snapshot a value. You bound a proxy that aliases the very bit you're about to overwrite. The next line, flags[i] = false;, flips the bit — and previous sees the new value, because it is the bit. The return previous; then implicitly converts the (now-cleared) proxy to bool and reports false.

This is the same shape of bug as a dangling iterator, but with a wonderful twist: the proxy doesn't even need the original vector to be reallocated to mislead you. Mutation alone is enough, because the proxy never had its own storage.

The fix is to force the conversion to bool at capture time, before the mutation:

bool test_and_clear(std::vector<bool>& flags, std::size_t i) {
    bool previous = flags[i];   // explicit type forces a copy to bool
    flags[i] = false;
    return previous;
}

Or, if you're committed to auto, cast explicitly: auto previous = static_cast<bool>(flags[i]);. Either way, the goal is to materialize the bit's value into a real bool variable before you go scribble on its storage.

Related landmines from the same specialization: auto& r = v[0]; won't even bind because the proxy is a prvalue; std::vector<bool> doesn't satisfy the Container requirements (no data() returning bool*); range-for with auto& gives you the proxy too, with the same aliasing hazard. The standards committee has tried to deprecate this specialization for over a decade and failed. Until they succeed, prefer std::vector<char>, std::deque<bool>, or std::bitset when you want predictable semantics — and never let auto deduce a bit reference behind your back.

Key Takeaway: vector<bool>'s operator[] returns a live proxy, not a bool — so auto x = v[i]; captures a reference to the bit you're about to overwrite, not a snapshot of its value.

Daily Digital Circuits

Memory BIST and March Algorithms: How Hardware Tests SRAM Cells for Every Possible Stuck Bit

2026-05-28

Logic BIST tests random combinational paths, but memories need their own test discipline. A modern SoC has hundreds of SRAM instances totaling tens of megabits, and external testers can't poke every cell through a narrow JTAG pin — the test would take hours per chip. Memory BIST (MBIST) embeds a small controller next to each SRAM that walks every address with carefully crafted patterns, all running at functional clock speed.

The patterns aren't random. They're March algorithms — sequences of read/write operations applied in a strict address order (ascending ⇑ or descending ⇓). The classic March C- algorithm has six elements:

  • ⇕ (w0) — write 0 to every cell, any order
  • ⇑ (r0, w1) — read 0, write 1, ascending
  • ⇑ (r1, w0) — read 1, write 0, ascending
  • ⇓ (r0, w1) — read 0, write 1, descending
  • ⇓ (r1, w0) — read 1, write 0, descending
  • ⇕ (r0) — read 0, any order

Total operations: 10N for N cells. A 1 Mbit SRAM at 1 GHz finishes in 10 ms. Compare that to a tester applying patterns through a 50 MHz JTAG: 200× slower.

Each March element catches specific fault models. Stuck-at faults (cell permanently 0 or 1) fall to any read. Transition faults (cell can hold a value but can't switch one direction) need a write-then-read pair — element 2 catches "can't go 0→1," element 3 catches "can't go 1→0." Coupling faults (writing cell A flips cell B) require both address directions: a fault where the aggressor sits at a lower address only shows up when you traverse upward, and vice versa. Address decoder faults (two addresses select the same cell) get caught when one cell's expected value disagrees with what's read.

Real-world example: ARM's Cortex-M7 cache RAMs ship with embedded MBIST controllers that run March C- at boot and report pass/fail through a status register. Automotive ISO 26262 ASIL-D parts run MBIST every power-on and periodically during idle, because a stuck cell in a safety-critical RAM is a fatal hazard. The controller typically adds ~2% area overhead per SRAM — cheap insurance.

Rule of thumb: If your design has more than ~100 kbit of embedded RAM, MBIST pays for itself in test time alone. For N-bit memories, budget 10N to 17N cycles depending on fault coverage needed (March C- = 10N, March SS for stuck-open faults = 22N).

Key Takeaway: MBIST controllers run March algorithms — ordered read/write sequences in both address directions — to catch stuck-at, transition, coupling, and decoder faults in 10N–22N cycles, fast enough to test megabits of on-chip SRAM in milliseconds.

Daily Electrical Circuits

Widlar Current Source: Generating Microamp Bias Currents Without Giant Resistors

2026-05-28

The basic current mirror sets output current equal to the reference current — fine when you need milliamps, but painful when you need microamps. Generating 1 µA from a 15 V rail with a standard mirror demands a 15 MΩ resistor: impractical on a PCB, impossible on an IC die. The Widlar current source, invented by Bob Widlar at Fairchild in 1967, solves this elegantly by adding a single emitter resistor to the output transistor.

The topology: two matched NPN transistors Q1 and Q2 with bases tied together. Q1 is diode-connected and sets the reference current I_REF through a resistor from V_CC. Q2's emitter, however, goes to ground through resistor R_E. That resistor degenerates Q2, dropping its V_BE relative to Q1's — and since collector current depends exponentially on V_BE, even a tiny voltage drop slashes the output current dramatically.

The governing equation comes from KVL around the base-emitter loop:

V_BE1 = V_BE2 + I_OUT × R_E

Substituting the Ebers-Moll relation V_BE = V_T × ln(I_C / I_S) and assuming matched transistors:

I_OUT × R_E = V_T × ln(I_REF / I_OUT)

where V_T ≈ 26 mV at room temperature. This is transcendental — solve iteratively or graphically.

Worked example: You want I_OUT = 5 µA from I_REF = 1 mA. Plug in: 5 µA × R_E = 26 mV × ln(1000/5) = 26 mV × 5.30 = 137.8 mV. So R_E = 137.8 mV / 5 µA = 27.6 kΩ. Compare that to the 3 MΩ a plain mirror would need to drop 15 V at 5 µA — Widlar buys you a 100× reduction in resistor area.

Rule of thumb: Each decade of current ratio (I_REF/I_OUT) costs roughly 60 mV across R_E. Want 100× reduction? Budget ~120 mV. This is why Widlar shines in IC design where chip real estate is gold.

Real-world use: The classic µA741 op-amp uses a Widlar source to generate the ~19 µA tail current for its input differential pair from a ~700 µA reference. Without it, the input stage bias resistor alone would consume more die area than the rest of the op-amp combined.

Tradeoffs: Output impedance is higher than a plain mirror (good — R_E provides local feedback), but temperature coefficient is worse because V_T drifts at +0.085 mV/°C. For precision µA references, pair Widlar with a bandgap or use a PTAT-corrected topology. Also, mismatched V_BE between Q1 and Q2 from process variation directly adds error — use matched transistor pairs (LM394, MAT12) for discrete builds.

Key Takeaway: A Widlar current source uses emitter degeneration on the output transistor to generate microamp bias currents from milliamp references, trading a single small resistor for what would otherwise require megohm values.

Daily Engineering Lesson

Soft Starters: Reducing Inrush Current Without the Cost of a VFD

2026-05-28

When a three-phase induction motor starts across-the-line (direct connection to full voltage), it draws 600-800% of its full-load current for several seconds. That inrush sags the supply voltage, trips breakers, slams the driven load with full starting torque, and wears out couplings, belts, and gearboxes. A soft starter sits between the contactor and the motor, ramping voltage up gradually so current and torque rise smoothly instead of slamming on.

How it works: Three pairs of back-to-back SCRs (thyristors), one pair per phase, phase-chop the AC waveform. By delaying the SCR firing angle, the RMS voltage delivered to the motor is reduced. The starter ramps the firing angle from near-180° (nearly off) down to 0° (full conduction) over a programmed ramp time, typically 5-30 seconds. Once at full voltage, an internal bypass contactor shorts out the SCRs to eliminate conduction losses during run.

Soft starter vs. VFD — when to pick which:

  • Soft starter: Controls voltage only, frequency stays at 60 Hz. Cheaper (roughly 1/3 the cost of a VFD), smaller, simpler. Used when you only need to reduce starting stress — fans, pumps, conveyors, compressors that run at fixed speed.
  • VFD: Controls voltage AND frequency. Required when you need variable running speed, regenerative braking, or precise torque control.

The torque tradeoff: Motor torque scales with the square of voltage. If you reduce starting voltage to 50%, you get only 25% of locked-rotor torque. This is fine for centrifugal loads (pumps, fans) where load torque is low at zero speed, but a soft starter will stall a high-inertia or high-breakaway load like a loaded conveyor or a positive-displacement compressor.

Rule of thumb — initial voltage setting: Set the initial voltage just high enough that the motor breaks free and begins accelerating within 1-2 seconds. Typical starting voltage is 30-50% for centrifugal loads, 50-70% for constant-torque loads. If you hear the motor "growl" without turning, the initial voltage is too low.

Real-world example: A 75 HP irrigation pump on a rural feeder previously caused lights to dim across the property and occasionally tripped the utility's recloser when starting. Adding a soft starter with a 10-second ramp dropped peak inrush from ~520 A to ~180 A, eliminated the voltage flicker, and stopped water-hammer in the discharge piping because the pump now reaches full speed gradually instead of slamming pressure into the column.

Watch out for: Soft starters generate harmonics during the ramp (because they're phase-chopping), so they shouldn't run continuously in reduced-voltage mode — always size for the bypass contactor to engage at full speed. Also, they don't reduce steady-state running current; that's a VFD job.

See it in action: Check out Full Voltage Starters vs Soft Starters vs VFDs by Activated Sludge Guide to see this theory applied.
Key Takeaway: A soft starter ramps motor voltage with phase-controlled SCRs to cut inrush current and mechanical shock during starting, but it can't regulate running speed — pick it over a VFD only when fixed-speed operation with gentler starts is all you need.

Forgotten Books

The Ten-Thousand-Recipe Book: A Pre-Internet Stack Overflow

2026-05-28

Book: Henley's Twentieth Century Formulas, Recipes and Processes by Gardner D. Hiscox (1916)

Read it: Internet Archive

Before you could Google "how do I remove rust from a sewing machine" or "what's a good formula for shoe blacking," there was Henley's — a single volume containing, by its own boast, ten thousand selected household and workshop formulas, aimed at "manufacturers, mechanics, housekeepers and home workers" alike.

Gardner D. Hiscox, who also wrote on compressed air and gas engines, framed the project with a striking editorial philosophy in the preface:

"In addition to exercising the utmost care in selecting his materials from competent sources, the Editor has also modified formulas which were obviously ill adapted for his needs, but were valuable if altered. Processes of questionable merit he has discarded."

Read that again. In 1916, a single man — working from "foreign technological periodicals and books" he was "specially translating" — was running what we'd now call content moderation on practical human knowledge. He was vetting silver-plating processes, hair tonics, ink recipes, leather dyes, and explosive compounds, deciding which to include, which to fix, and which to throw out as bunk.

The forgotten idea isn't a recipe. It's the model itself: a curated, single-authority compendium where the editor takes responsibility for telling you what works. The promise on the cover — "money-saving methods for the practical use of" everyone — assumes a reader who would actually make their soap, their varnish, their photographic developer, their cement.

What's striking from a modern vantage:

  • The book treats the housewife, the mechanic, and the factory manufacturer as the same kind of reader — someone who solves problems with chemistry and labor, not with a purchase.
  • It assumes a world where knowing how to compound something yourself was cheaper than buying it. The subtitle of one edition literally swaps "money-saving" for "money-making" — these recipes were small-business starter kits.
  • Hiscox's editorial stance — "questionable merit he has discarded" — is exactly the trust model the open internet abandoned, and the one Wikipedia, Stack Overflow, and now LLMs have spent decades trying to rebuild at scale.

Henley's was reprinted constantly from 1907 through the mid-20th century. Real copies sit on the shelves of restoration shops, museum conservators, and old-house tinkerers to this day, because for many lost trade processes — japanning, daguerreotype repair, period-correct gilding — the book is still the easiest reference in English.

What we lost wasn't the recipes. They're scanned, free, indexable. What we lost was the posture: the assumption that an ordinary person, given a vetted formula and a few hours, could just make the thing rather than buy it. Henley's 10,000 entries are a monument to a civilization of makers — and an implicit indictment of one that mostly clicks "Add to Cart."

The forgotten claim: A single curated reference of 10,000 vetted formulas once let ordinary households and small workshops manufacture almost anything they needed — a model of trusted practical knowledge that predates and outperforms much of what replaced it.

Forgotten Darkroom

The CIA's 1952 Infrared Lantern: Spy Tech Built From a Pyrex Chimney and a Bakelite Ring

2026-05-28

Book: PROGRESS REPORT ON OPERATION DIOGENES by CIA Reading Room (1952)

Read it: Internet Archive

Buried in a declassified February 1952 CIA memo — part of something called Operation Diogenes — is a remarkably candid engineering status report on a problem most people in 1952 didn't know existed: how to build a portable lamp that emitted a powerful invisible beam.

"First tests of the third model of filtered lamp were run on the night of 12 February 1952 in the field and the next morning in the laboratory. The model was satisfactory as a powerful source of a near infrared beam… but was not satisfactory in the respects listed below. Most significant was the failure of the lamp to burn in the laboratory without damage to the filter assembly."

The author — name redacted — then lists the gritty mechanical failures of his third prototype:

"Overheating of Butyrate Filter Assembly — The top of butyrate cylinder is damaged where it attaches to bakelite ring. Correction probable by using pyrex chimney 7 1/2 inches long in place of present chimney approximately 5 1/4 inches long."

What you're reading is a tinkerer's bench notes for a covert near-infrared illuminator. The principle: a hot incandescent or gas-mantle source emits a huge tail of infrared light. Wrap it in a butyrate (cellulose acetate plastic) filter that absorbs all the visible wavelengths, vent the heat through a Pyrex chimney, and you have a "lamp" that produces no light a human eye can see — but floods the area in IR. Pair it with an early image-converter scope (the kind developed for the WWII Sniperscope) and you can see in total darkness while remaining, to anyone without such a scope, invisible.

Was it ahead of its time? In a sense, no — the Germans had IR "Vampir" sights on rifles by 1944, and US Army M3 Carbines had IR scopes in the Pacific. What's striking here is the miniaturization and concealment problem. The author isn't building a tank-mounted unit; he's hand-fabricating a portable field lamp, and his enemy is thermodynamics: the butyrate plastic melts because it sits too close to a Coleman-style mantle. His fix — a longer Pyrex chimney to move the hot zone away from the filter — is exactly the trick lantern makers had used for a century.

The forgotten knowledge here isn't the IR principle itself. It's that cellulose-acetate (butyrate) sheet was, for a brief window in the early 1950s, the cheap go-to material for IR-pass / visible-block filters. Photographers and astronomers later switched to Wratten gelatin filters (#87, #87C, #88A) and eventually dichroic glass and silicon. But for a field operative needing meters of curved filter wrapped around a hot lantern, butyrate plastic was the only thing both transparent to IR and formable on a budget.

Modern readers will recognize the descendant immediately: every covert security camera with an "invisible" 940 nm LED ring around the lens, every game-camera that "flashes" without spooking deer, every night-vision device whose IR illuminator floods a hallway. The CIA in 1952 was essentially trying to build the same thing with a kerosene mantle and a plastic cylinder — and the engineer reporting back was honest enough to admit his lamp kept catching fire.

The forgotten claim: Cellulose butyrate plastic, paired with a Pyrex lamp chimney, was the CIA's 1952 recipe for a hand-portable infrared illuminator — the direct ancestor of every "invisible flash" night-vision camera in use today.

Forgotten Patent

Bell Labs' "Solar Battery": The 1954 Patent That Turned Sunlight Into Electricity — and Powered the Space Age

2026-05-28

On March 5, 1954, three Bell Telephone Laboratories researchers — Daryl Chapin, Calvin Fuller, and Gerald Pearson — filed US Patent 2,780,765, titled "Solar Energy Converting Apparatus." It was issued in 1957. The filing described a device that did something almost magical for its time: it took ordinary sunlight, with no moving parts and no fuel, and turned it directly into useful electrical current at an efficiency high enough to actually power equipment. They called it the "solar battery." We call it the silicon solar cell.

The trio had stumbled onto the breakthrough almost by accident. Fuller, a chemist, was perfecting controlled doping of silicon for transistor work. Pearson noticed that one of Fuller's silicon samples produced a surprisingly strong current when exposed to light. Chapin, meanwhile, had been hunting for a power source for telephone repeaters in remote tropical regions where dry-cell batteries kept failing in the heat. Selenium cells existed since the 1880s but converted less than 0.5% of sunlight into electricity — useless for real power. By April 1954, the team had pushed silicon to 6% efficiency — a more than tenfold leap. The New York Times announced it could herald "the harnessing of the almost limitless energy of the sun."

The patent's claims are remarkably modern. It describes a thin wafer of p-type silicon with a shallow n-type diffused layer near the surface, forming the now-ubiquitous p-n junction. Light photons knock electrons across the junction, generating a voltage. The drawings show grid contacts on top to collect current while letting light through — the same fingered electrode pattern visible on rooftop panels today. They even describe series and parallel cell arrays to scale voltage and current. A diagram in column 4 shows a tiny module spinning a fan. Read the patent in 2026 and almost nothing in the geometry would look out of place on a modern production line.

Bell saw it as a telecom power source, but the technology found its first killer app in space. In 1958, Vanguard 1 — the fourth satellite ever launched — carried six small solar cells based directly on the Chapin-Fuller-Pearson design. Vanguard's chemical battery died in weeks; its solar cells kept its beacon transmitting for seven years. Every satellite, Mars rover, and space station since has been a descendant of that 1954 patent. The International Space Station alone spreads roughly 2,500 square meters of silicon wafers across its solar wings.

Terrestrially, the patent's payoff took longer. At $286 per watt in 1956 dollars, the original cells were absurdly expensive — fine for satellites, hopeless for houses. But the physics was exactly right; only manufacturing needed catching up. Today, utility-scale silicon panels routinely hit 22-24% efficiency at under $0.20 per watt — a price drop of roughly five orders of magnitude. In 2024, solar PV became the largest source of new electricity generation worldwide, with installed capacity passing 2 terawatts. Every one of those panels is still, fundamentally, a Chapin-Fuller-Pearson p-n junction.

The most striking thing about Patent 2,780,765 is what it didn't need: no exotic materials, no quantum dots, no perovskites. Just silicon, boron, phosphorus, and sunlight. The 1954 device hit 6%; perovskite-silicon tandems in 2025 labs hit 34%. The whole 70-year journey from telephone-pole power to global energy transition has been refinement, not reinvention.

Key Takeaway: The silicon solar cell wasn't invented to save the planet — it was invented to power tropical telephone lines — but the 1954 Bell Labs patent contained essentially every design feature of today's terawatt-scale solar industry.

Daily GitHub Zero Stars

IAmThermite/fabscan

2026-05-28

Language: Unknown

Link: https://github.com/IAmThermite/fabscan

fabscan is a card scanner project for Flesh and Blood, the popular trading card game from Legend Story Studios. While the repo is still in early days (no description-heavy README, no stars yet), the premise is immediately compelling to anyone who has tried to manage a physical TCG collection: point a camera at a card, get structured data back.

Card scanning is a deceptively hard problem. It typically involves:

  • Image capture and preprocessing — handling glare, angle, and lighting from a phone or webcam
  • Card identification — either via OCR on the card name/set symbol, or perceptual hashing against a reference image database
  • Set and edition disambiguation — the same card may exist in multiple printings with different values
  • Data lookup — joining against a card database (something like the fabdb.net or fabrary.net APIs) to fetch rulings, prices, and metadata

What makes this interesting in the Flesh and Blood ecosystem specifically is that FaB doesn't have the same level of tooling maturity as Magic: The Gathering. MTG has Delver Lens, ManaBox, and TCGPlayer's scanner — FaB players largely log collections by hand or in spreadsheets. A working open-source scanner would be a genuinely useful contribution to that community.

Who would benefit:

  • FaB collectors wanting to inventory binders without typing 500 card names
  • Local game store owners processing trade-ins and singles
  • Hobbyist devs interested in mobile computer vision projects with a clear, bounded scope

Even if the current state is just a scaffold, the project is worth watching — and contributing to, if you play the game and write code. The intersection of "niche TCG" and "computer vision side project" is exactly the kind of weekend-hack territory where a single dedicated maintainer can build something the community actually uses.

Why check it out: An open-source card scanner for Flesh and Blood — filling a real tooling gap in a TCG community that's been underserved compared to Magic.

Daily Hardware Architecture

The Micro-Op Queue: How CPUs Buffer Decoded Instructions Between the Front-End and the Back-End

2026-05-28

Modern x86 CPUs have a deep impedance mismatch between fetch/decode and execution. The front-end fetches 16-32 bytes of variable-length instructions per cycle and decodes them into fixed-width µops. The back-end consumes µops at a rate dictated by scheduling, port pressure, and memory stalls. These rarely match cycle-to-cycle. The micro-op queue (also called the IDQ — Instruction Decode Queue) is the elastic buffer between them.

On Intel Skylake-derived cores, the IDQ holds 64 µops per thread (128 total with SMT). It accepts µops from three sources: the legacy decoders (up to 5 µops/cycle), the µop cache (up to 6 µops/cycle), and the microcode sequencer (4 µops/cycle for complex instructions like CPUID or string ops). It feeds the renamer at up to 6 µops/cycle on Sunny Cove and later.

Why does an elastic buffer matter? Three reasons:

  • Decoupling stalls: If the back-end stalls on an L3 miss, the front-end keeps decoding into the IDQ. When execution resumes, those µops are ready instantly — no decode latency on the critical path.
  • Smoothing bursts: The µop cache can deliver 6 µops in one cycle, then 0 the next when the line boundary hits. The IDQ smooths this into steady issue to the renamer.
  • Loop Stream Detector hand-off: When the LSD detects a loop that fits entirely in the IDQ (≤64 µops, no calls/returns), it locks the queue and replays µops from it, shutting down fetch and decode entirely. This is a major power win for tight inner loops.

Real-world example: A matrix multiplication kernel with a 40-µop inner loop runs out of the LSD on Skylake. The front-end clock-gates the decoders and µop cache, dropping front-end power by ~30%. Unroll that loop to 80 µops and you lose LSD eligibility — the µop cache fires every cycle instead, and your perf/watt drops measurably even though IPC is unchanged.

Rule of thumb: If your hot loop body decodes to under 64 µops, the LSD will run it. Check with perf stat -e idq.dsb_uops,idq.mite_uops,lsd.uops — if lsd.uops dominates, you're in the sweet spot. Roughly: 1 x86 instruction ≈ 1.1 µops for typical integer code, so ~55 instructions fits.

AMD Zen calls its equivalent the Op Queue, holds 72 µops, and similarly powers down upstream stages when running from it. The principle is universal: any time two pipeline domains run at different rates, you need a queue to absorb the variance, or you pay the cost of the slower one on every cycle.

See it in action: Check out Event-Driven Architecture: Explained in 7 Minutes! by Alex Hyett to see this theory applied.
Key Takeaway: The micro-op queue decouples the bursty, variable-rate front-end from the steady-rate renamer, and doubles as the buffer the Loop Stream Detector locks down to power-gate fetch and decode on tight loops.

Hacker News Deep Cuts

Complete Table of Canon Autofocus and Exposure Metering Sensors

2026-05-28

This is the kind of obsessive, deeply researched reference document that the early web was built on — and which has become genuinely rare. The author has assembled what appears to be a comprehensive cross-referenced table of every autofocus and exposure metering sensor Canon has ever shipped in their EOS SLR and DSLR lineup, spanning roughly four decades of camera engineering history.

Why does this matter to a technical audience?

  • It's a primary-source engineering archive. Canon doesn't publish this information in any consolidated form. Sensor part numbers, AF point counts, cross-type vs. line sensors, metering zone configurations, and the lineage of how these subsystems evolved are scattered across service manuals, patents, and marketing materials. Pulling them into one table is genuine archival work.
  • The AF/metering subsystem is where camera engineering gets interesting. The image sensor gets all the marketing attention, but the autofocus module — a separate optical path with its own dedicated sensor, microlens array, and signal processing — is arguably more technically intricate. Phase-detection AF involves splitting incoming light, measuring disparity across baseline-separated sensor pairs, and feeding that into focus motor control loops. Tracing how Canon evolved from single-point AF in the EOS 650 (1987) through to the 191-point systems of modern cameras is a real engineering story.
  • It's useful for hardware hackers and repair folks. Anyone working on camera repair, modding, or buying used gear benefits enormously from knowing which body shares AF modules with which — informs parts compatibility, calibration approaches, and what failure modes to expect.
  • The genre itself is worth celebrating. Single-domain reference sites maintained by individual enthusiasts (think the old Wikipedia of consumer electronics, or sites like Camerapedia) are increasingly displaced by SEO-optimized content farms. When someone publishes a meticulous table on their personal site with no ads and no tracking, that's worth pointing at.

The domain name — "exclusivearchitecture.com" — suggests this might be one entry in a broader collection of technical articles, which is the kind of rabbit hole HN readers tend to enjoy disappearing into for an afternoon. The "C-EOS-SD" in the URL hints there are companion documents covering related Canon subsystems.

It's the sort of post that lands at 1 point because it's too niche for the front page algorithm, but exactly the sort of thing that justifies HN's existence as a place where deep, narrow expertise still gets a hearing.

Why it deserves more upvotes: Decades of Canon AF/metering sensor engineering catalogued in one place — the kind of obsessive single-purpose reference document the modern web rarely produces anymore.

HN Jobs Teardown

Adyen: What Their Hiring Reveals

2026-05-28

Source: HN Who is Hiring

Posted by: janbernhart

Of the ten postings on this thread, Adyen's is the most strategically revealing — precisely because it's the shortest. A multibillion-dollar payments processor describes its entire engineering organization in three sentences, and every word is load-bearing.

The stack tells the story. Java on the back-end, Linux as the platform, PostgreSQL as "a big" user. Notice what's absent: no microservices buzzwords, no Kubernetes, no Kafka, no "polyglot persistence," no ML/AI sprinkle. This is a payments company that handles transaction volume for Uber, Spotify, Microsoft, and McDonald's — and they're proudly running a Java monolith pattern on Postgres. That's a deliberate flex. When you settle billions in payments, boring infrastructure is the feature. Postgres at Adyen's scale implies serious in-house expertise in partitioning, replication, and consistency tuning — the kind of thing you only commit to when you've decided correctness beats novelty.

"Speed is the foundation" repeated three times — think fast, work fast, launch fast — is the giveaway about culture and stage. Adyen is publicly traded, ~$50B+ market cap, and still pitching itself as a high-velocity shop. The subtext: they're defending against Stripe, Checkout.com, and a thousand fintech startups by refusing to slow down into enterprise paralysis. Hiring "Software Engineers (Java) & Infrastructure" together — not split — suggests they still expect engineers to own systems end-to-end rather than throwing work over a platform-team wall.

Green flags:

  • Relocation and visa supported — concrete commitment, not just "we're open to it." This is a company actually hiring globally, not LinkedIn-theater hiring.
  • "Ownership from inception to implementation" — implies low handoff, low ticket-shuffling.
  • "Critical mindset, care about quality and security" — payment companies that say this mean it; the alternative is regulatory fines.
  • Direct email to a named human ([email protected]), not a careers-portal black hole.

Red flags:

  • Amsterdam-onsite only. In a 2020 thread asking for more REMOTE clarity (see ristos's complaint right above), Adyen is firmly butts-in-seats. Fine for them; limiting for candidates.
  • No salary band. Dutch market norms aside, every other comparable posting in this batch (Alpha at $120–180k) is now disclosing.
  • The terseness itself is a signal: Adyen doesn't need to sell hard, which is great if you're already convinced and rough if you're evaluating cold.

The trend it highlights: while the rest of the thread chases ML/AI (Apple, Stay Nimble, One Medical's "AI/ML"), the most profitable company in the list is hiring for Java and Postgres. Infrastructure boringness is a competitive moat in regulated industries.

The signal: In fintech, the companies winning aren't the ones with the newest stack — they're the ones who picked a boring stack a decade ago and got world-class at running it.

Daily Low-Level Programming

AVX-512 Frequency Throttling: Why Vectorizing Your Code Sometimes Makes the Whole Server Slower

2026-05-28

Wide vector instructions don't come free. When a core executes AVX-512 (and to a lesser extent AVX2) instructions, it activates a much larger swath of silicon — 512-bit ALUs, wider data paths, and additional FMA units. That silicon draws more current than the chip's voltage regulators can sustain at peak turbo frequency, so the CPU downclocks the offending core (and on older Skylake/Cascade Lake, the entire socket) to stay within its power and thermal envelope.

Intel divides instructions into three "license levels":

  • License 0: scalar and light 128/256-bit code — full turbo.
  • License 1: heavy 256-bit (AVX2 FMA) or light 512-bit — moderate downclock (~200–400 MHz).
  • License 2: heavy 512-bit (AVX-512 FMA) — aggressive downclock, sometimes 30–40% off base.

The transition isn't instant. The core enters the lower license immediately upon executing a qualifying instruction, but it stays in that license for roughly 2 milliseconds after the last one — a hysteresis window so the voltage rail doesn't oscillate. So a single stray AVX-512 instruction in a tight scalar loop can crater throughput for millions of cycles afterward.

Real-world example: glibc's memcpy on Skylake-X used AVX-512 for large copies. A web server doing one big memcpy per request would knock the core into License 2; subsequent scalar request-parsing code ran at 2.4 GHz instead of 3.5 GHz until the 2 ms window expired. Cloudflare measured this in production and disabled AVX-512 in their build — the scalar penalty on hot paths outweighed the vectorized memcpy win. The same issue bit numpy users who saw single-threaded scripts get slower after upgrading to AVX-512-enabled BLAS.

Rule of thumb: AVX-512 pays off only when the vectorized region runs for at least ~20 µs of continuous SIMD work. Below that, the frequency penalty during the surrounding scalar code (lasting 2 ms) dwarfs the speedup. Compute the breakeven: if vectorization is 3× faster but the core runs at 0.75× frequency for 2 ms afterward, you need ~500 µs of scalar work after the SIMD region to break even.

Ice Lake and newer chips reduced the penalty dramatically — per-core voltage domains mean one core's AVX-512 no longer drags down its neighbors, and the downclock magnitude shrank. Sapphire Rapids made the License 2 penalty nearly negligible. But you still need to cat /proc/cpuinfo | grep avx512 and check the microarchitecture before assuming wide vectors are a win.

Key Takeaway: AVX-512 puts the core into a lower-frequency license that persists for ~2 ms after the last wide vector instruction, so sporadic SIMD bursts can slow down the scalar code that surrounds them more than they speed up the vectorized region itself.

Reddit Small Subs

Why do I keep getting holes at the end of my welds?

2026-05-28

Subreddit: r/welding

Discussion: View on Reddit (184 points, 51 comments)

A newer MIG welder at a fab shop noticed a recurring defect: small pinholes appearing at the termination of his welds. He posted photos hoping the more experienced crowd could diagnose it — and they did, in detail. The thread turned into a small clinic on weld terminations, shielding gas behavior, and crater fill technique.

The diagnosis from veteran welders converged on a few overlapping causes:

  • Crater porosity — When you release the trigger, the puddle shrinks rapidly. Gases dissolved in the molten metal (CO₂, hydrogen, nitrogen) get trapped as the puddle freezes too fast to let them escape. The result: pinholes, often arranged in a tight cluster at the end of the bead.
  • Loss of shielding gas at the stop — Pulling the gun away too quickly removes the gas cup before the puddle has solidified. Atmospheric nitrogen and oxygen rush in and contaminate the still-liquid metal. Several commenters emphasized holding the gun in position for 1–2 seconds after releasing the trigger to let post-flow do its job.
  • No crater fill technique — Experienced welders described "back-stepping" or whipping back into the puddle just before stopping. This builds up the crater so it doesn't form a thin, gas-trapping pocket as it cools.
  • Contamination — Mill scale, oil, galvanizing residue, or moisture on the base metal can outgas during the weld. The end of the bead is where you most often see it because that's where heat builds up and the puddle stays liquid longest.

One particularly useful comment broke down the physics: a MIG puddle is a tiny pool of liquid steel saturated with dissolved gases. While the arc is active, gases keep getting pushed out by stirring and shielding. The moment you stop, all that motion ends — and whatever gas is left has milliseconds to escape before solidification traps it.

The practical fixes are simple and worth memorizing: pause the gun in place after releasing the trigger, use a back-step or whip at the termination, and clean the metal more aggressively than you think you need to. A welder also noted that if your machine has a "crater fill" setting or burnback adjustment, this is exactly what it's for.

This is a perfect example of why r/Welding is valuable for new tradespeople — a beginner gets specific, mechanical explanations from people who've solved the same problem hundreds of times.

Why read this: A clear, practical breakdown of why MIG welds get pinholes at the termination and three simple technique fixes that solve it.

RFC Deep Dive

RFC 5987: Character Set and Language Encoding for HTTP Header Field Parameters

2026-05-28

RFC: RFC 5987

Published: 2010

Authors: Julian Reschke

If you've ever wondered why Content-Disposition headers in HTTP downloads contain bizarre-looking strings like filename*=UTF-8''r%C3%A9sum%C3%A9.pdf with that strange double-apostrophe sequence, RFC 5987 is the answer. It's the unsung hero that lets your web app serve a file named "日本語.pdf" or "café-menu.docx" without mangling it into gibberish.

The Problem: HTTP headers, by tradition rooted in RFC 822 and its descendants, are ASCII-only. But filenames, content descriptions, and other parameter values frequently need to carry non-ASCII characters — accented Latin letters, Cyrillic, CJK ideographs, emoji. For years, browsers each invented their own incompatible workarounds: IE used raw percent-encoded UTF-8, Firefox tried RFC 2231, Safari did something else. The result was that Content-Disposition: attachment; filename="..." was a minefield, and developers resorted to user-agent sniffing just to make downloads work cross-browser.

The Design: RFC 5987 takes the encoding mechanism originally defined in RFC 2231 (which was built for MIME email headers) and ports a subset of it to HTTP. The author, Julian Reschke — a longtime HTTPbis contributor — deliberately stripped out the parts of RFC 2231 that nobody implemented correctly, particularly multi-line parameter continuations. What's left is the clean part: the ext-value syntax.

The format is three fields separated by single quotes:

  • charset — almost always UTF-8; ISO-8859-1 is also allowed for legacy reasons
  • language — an optional RFC 5646 language tag; usually left empty (hence the doubled '')
  • value-chars — the actual string, with non-ASCII bytes percent-encoded

The asterisk suffix on the parameter name (e.g., filename* versus filename) is the signal that this is an extended-format value. Crucially, the spec allows both forms to appear side-by-side: a server can send filename="resume.pdf"; filename*=UTF-8''r%C3%A9sum%C3%A9.pdf. Old clients use the ASCII fallback; modern clients prefer the starred version.

Why It Matters Today: Every time a user downloads a file with a non-English name from Gmail, Dropbox, GitHub, or your company's intranet, RFC 5987 is doing the work. It's referenced by RFC 6266 (the modern Content-Disposition spec), RFC 8187 (which obsoleted 5987 with minor tweaks), and is baked into countless web framework helpers — Django's FileResponse, Express's res.download(), ASP.NET's File() action result. If you've ever called one of those, you've shipped RFC 5987 to production.

Quirks: The language tag field exists almost as a vestige. Reschke kept it for symmetry with RFC 2231 and MIME, but in practice no implementation does anything with it. The doubled apostrophes are a visual oddity that confuses every developer on first encounter — they're not a typo, they're two empty field delimiters around an omitted language tag. Also worth noting: RFC 5987 was superseded in 2017 by RFC 8187, which made UTF-8 mandatory and dropped ISO-8859-1 support. The wire format is unchanged.

It's a small, focused RFC — about 12 pages — but it's a textbook example of standards work: take a messy de-facto situation, pick the cleanest of the competing implementations, document it precisely, and shepherd browsers toward convergence.

Why it matters: RFC 5987 is the reason file downloads with non-ASCII filenames work the same way in every browser — a tiny encoding convention quietly powering internationalized web apps everywhere.

Stack Overflow Unanswered

lock free ring buffer works on x86 but breaks on ARM - memory barriers not helping?

2026-05-28

Stack Overflow: View Question

Tags: c, concurrency, arm, memory-barriers

Score: 1 | Views: 211

The asker has a single-producer / single-consumer ring buffer in C that runs cleanly on x86 (Intel i7) but intermittently corrupts data on a Cortex-A53. They've added memory barriers and the problem persists. This is the classic "my lock-free code works on x86 but explodes on ARM" trap.

Why it's hard. x86 has a strong memory model (TSO): stores from a single core become visible to other cores in program order, and loads are not reordered with earlier loads. So a lot of "lock-free" code that's quietly wrong appears correct on x86 because the hardware papers over missing synchronization. ARMv8 has a weak memory model — independent loads and stores can be reordered, and writes can become visible to other cores in different orders unless you tell the CPU otherwise.

Most likely root causes.

  • Wrong barrier on the wrong side. For an SPSC ring you need release semantics when the producer publishes a new head (so the payload writes are visible before the index update) and acquire semantics when the consumer reads head (so payload reads happen after seeing the new index). A single __sync_synchronize() on one side isn't enough.
  • Plain (non-atomic) loads/stores of the indices. The compiler can hoist, fuse, or tear them. Barriers are useless if the access itself isn't atomic. Use atomic_load_explicit/atomic_store_explicit with memory_order_acquire and memory_order_release.
  • False sharing. Head and tail on the same 64-byte cache line cause ping-ponging that doesn't cause corruption but masks ordering bugs by changing timing.

Direction to a fix. Rewrite with C11 atomics:

// producer
memcpy(&buf[head], src, n);
atomic_store_explicit(&g_head, (head + n) & mask, memory_order_release);

// consumer
size_t h = atomic_load_explicit(&g_head, memory_order_acquire);
if (h != tail) { memcpy(dst, &buf[tail], ...); ... }

The acquire/release pair maps to LDAR/STLR on ARMv8, which is exactly what you need — and it's cheaper than a full DMB ISH.

Gotchas. Cortex-A53 is in-order but still reorders memory operations (it's the memory subsystem, not the pipeline, that matters). If the ring buffer is shared with a peripheral or DMA engine, you also need DMB OSH / DSB and possibly non-cacheable mappings — acquire/release only synchronize between CPU cores. And don't trust testing: a working run proves nothing on weak-memory hardware. Run TSan, or stress with perf and pin producer/consumer to different cores.

The challenge: Code that "passes" on x86 isn't lock-free-correct — it's just running on hardware generous enough to forgive missing acquire/release semantics that ARM exposes ruthlessly.

Daily Software Engineering

The Bloom Filter: Saying "Definitely Not" Fast and Cheap

2026-05-28

A Bloom filter is a probabilistic data structure that answers one question: "Have I seen this item before?" Its answer is either "definitely not" or "probably yes". It never says "definitely yes," and it never misses a real hit. False positives are allowed; false negatives are impossible. That asymmetry is exactly what makes it useful.

Mechanically, it's a bit array of size m and k independent hash functions. To insert an item, hash it k ways and set those bits to 1. To check membership, hash the same way and inspect those bits — if any bit is 0, the item was never inserted. If all are 1, it might have been inserted (or some combination of other items happened to set those exact bits).

Real-world example: Chrome's malicious URL detection. Chrome can't ship a list of every dangerous URL to your machine — that's gigabytes. Instead, it ships a Bloom filter. When you click a link, Chrome checks the filter locally. If the answer is "definitely not malicious," the page loads instantly with zero network calls. If it's "probably malicious," Chrome makes a (slower) authoritative API call to Google's Safe Browsing service to confirm. The filter eliminates 99%+ of those expensive calls.

Cassandra uses Bloom filters per SSTable to skip disk reads for keys that aren't there. CDNs use them to avoid origin fetches for known-missing assets. Databases use them in join optimizations.

The sizing rule of thumb: for n items and target false-positive rate p:

  • Bit array size: m ≈ -n · ln(p) / (ln 2)²
  • Hash functions: k ≈ (m/n) · ln 2

Concretely: 1 million items at 1% false-positive rate needs ~9.6 bits per item (~1.2 MB) and 7 hash functions. Compare that to a HashSet storing 1M 50-byte URLs — that's 50+ MB. You get a 40x memory reduction for accepting a 1% false-positive rate.

Where it bites you:

  • You can't delete from a standard Bloom filter — clearing bits would create false negatives for other items sharing those bits. Use a Counting Bloom filter (counters instead of bits) if you need deletes, at ~4x the memory cost.
  • Sizing is fixed at creation. If you exceed your planned n, the false-positive rate degrades fast. Scalable Bloom filters chain multiple filters to grow dynamically.
  • It's a filter, not a cache. A "probably yes" answer still requires the authoritative lookup. The value is in skipping the lookup on the "definitely not" path.

Reach for it when your hot path does many membership checks against a large set, the cost of a real lookup is high (disk, network), and a small false-positive rate is tolerable because you verify on the slow path anyway.

See it in action: Check out let s implement a bloom filter extremely random blog posts by CodeHelp to see this theory applied.
Key Takeaway: Bloom filters trade a tunable false-positive rate for massive memory savings, letting you cheaply reject the 99% of queries that would otherwise hit slow storage.

Tool Nobody Knows

script and scriptreplay: Terminal Session Recording Since 1979

2026-05-28

Every few years some kid rediscovers terminal recording and writes a tool named after a Greek letter. Meanwhile, script(1) has been quietly recording sessions since 3BSD shipped it in 1979, and its sibling scriptreplay(1) plays them back with the original keystroke timing intact. Both ship in util-linux on every Linux box you'll ever touch. No daemon. No JSON. No tarball of someone's JavaScript player. Just two binaries and a plain text log.

The basic loop:

$ script --timing=demo.tim demo.log
Script started, output file is demo.log
$ uname -a
$ ps aux | head -5
$ exit
Script done.

$ scriptreplay --timing=demo.tim demo.log

That second command isn't printing the file — it's re-playing the entire session at the original speed, including the pauses while you thought about what to type. Speed it up with --maxdelay 0.5 to cap dead air, or --divisor 4 for a 4x replay. The log itself is just raw bytes (escape codes and all), so cat demo.log shows the final state and grep works against it.

Why it beats the alternatives. asciinema is fine, but it requires an interpreter to play back, ships a custom JSON format, and tempts you to upload sessions to a third party. script outputs plain bytes and a timing file that's literally delay bytecount\n lines. You can hand-edit it. You can tail -f the log while the session runs. You can pipe it through ansifilter for a clean transcript. Try that with a JSON blob.

The flags nobody reads. Modern script (util-linux 2.32+) has grown teeth:

  • --log-io combined.log — record stdin and stdout interleaved. Audit logging gold.
  • -E never — disable the ^[ escape prefix so embedded editors don't get confused.
  • -c "command" — record a single non-interactive command. Perfect for cron-driven captures.
  • -a — append to existing logs across sessions.
  • --command with -q — silent recording for unattended jobs.

The trick that earns its keep. Use it as a bug-report machine. Ask the user to run:

$ script -t 2>repro.tim repro.log -c "./our-broken-tool --verbose"

They mail you two files. You run scriptreplay and watch the exact failure unfold at real speed — every misread prompt, every twenty-second pause where they panicked, every typo they backspaced through. No more "works on my machine" because you're literally watching their machine.

Another use. Recording long-running deploys to an append log:

$ script -af -t 2>>/var/log/deploy.tim /var/log/deploy.log

Six months later when someone asks "what exactly did we type on the night of the outage," you have it byte-for-byte, with timing. auditd tells you which syscalls fired. script tells you what the human actually saw on the glass.

Gotcha. script allocates a PTY, so anything checking isatty(0) will behave as if a human is present. Usually what you want. Occasionally not — pipe-aware tools may emit color codes and progress bars that pollute the log. Use TERM=dumb inside the recorded shell to tame them.

Key Takeaway: Before you reach for asciinema or a screen recorder, remember that script -t and scriptreplay have been waiting in /usr/bin the entire time, producing plain-text logs you can grep, edit, and replay without anyone's runtime.

What If Engineering

What If Skyscrapers Harvested Their Own Sway for Electricity?

2026-05-28

Every tall building moves. Taipei 101 sways up to a meter at the top in a typhoon. The One World Trade Center drifts about 30 cm in everyday wind. Engineers have spent decades trying to stop this motion with tuned mass dampers — giant pendulums that fight the building's natural frequency. But damping is just controlled energy dissipation. What if we converted that energy to electricity instead of bleeding it off as heat?

The hardware already exists — sort of. Taipei 101's damper is a 660-tonne steel sphere suspended on 42-meter cables, hanging in the atrium between floors 87 and 92. In a typhoon it swings up to 1.5 m horizontally. Replace its viscous shock absorbers with linear induction generators (basically a stationary maglev launcher in reverse) and you have a regenerative damper.

Back-of-envelope: how much power?

For a pendulum of length L = 42 m with horizontal displacement x = 1 m, the lift height is:

h ≈ x² / (2L) = 1 / 84 ≈ 0.012 m

Potential energy per swing:

E = mgh = 660,000 × 9.81 × 0.012 ≈ 78 kJ

The pendulum's natural period is T = 2π√(L/g) ≈ 13 s. Two energy peaks per cycle, so we harvest ~156 kJ every 13 s. Assuming 60% conversion efficiency (a generous but plausible figure for linear generators):

P ≈ 156,000 × 0.6 / 13 ≈ 7.2 kW

That's during a typhoon. Disappointing? Yes. The instinct that a 660-ton pendulum should produce megawatts is wrong — gravitational PE scales linearly with mass but only quadratically with the small displacement.

Everyday wind is where it gets interesting. Skyscrapers oscillate continuously at amplitudes of 5–30 cm. Energy per cycle scales as x², so you'd think this is hopeless — but the building does this all the time, 365 days a year. At 10 cm amplitude, you get roughly 70 W of continuous output. That's ~600 kWh per year per building. Pathetic per square meter compared to a rooftop PV panel.

The real prize is something else. A regenerative damper that dynamically tunes itself by varying electrical load could outperform passive dampers in suppressing motion — which is structurally valuable. Reduced peak sway means lighter steel framing. If you save 2% on the structural mass of a 100,000-tonne building at $3,000/tonne of installed steel, that's $6 million — dwarfing decades of electricity output.

Scaling up. Suppose every supertall (300m+) building on Earth installed one. There are ~200 such buildings. Average output ~50 kW each in active winds × 30% capacity factor ≈ 26 GWh/year total. That's enough to power roughly 2,400 American homes. Globally negligible.

But here's the catch the physics gives us for free: the building's natural frequency is fixed by its geometry and mass distribution. Any energy-harvesting damper must resonate near that frequency, and the building's modal mass at the top is limited. You cannot make this much bigger without making the building wobblier — defeating the point.

Key Takeaway: Regenerative dampers on skyscrapers are technically elegant and produce real electricity, but the physics caps the harvest at kilowatts — their value lies in better motion control, not power generation.

Wikipedia Rabbit Hole

Piezo ignition

2026-05-28

Every time you click the ignitor on a gas grill and hear that satisfying snap followed by a whoosh of flame, you are witnessing a tiny act of controlled violence against a crystal. No batteries. No wires going anywhere useful. Just a spring-loaded hammer crushing a chunk of quartz hard enough to produce roughly 15,000 volts — enough to leap a 6 mm air gap and ignite propane.

The principle behind it was discovered in 1880 by Pierre Curie (yes, that Curie, husband of Marie) and his brother Jacques. They noticed that certain crystals — quartz, tourmaline, Rochelle salt — produced a measurable electric charge when squeezed. Stress on the lattice displaces positive and negative ions just slightly, creating a voltage across the crystal's faces. The name comes from the Greek piezein, "to press."

For decades it was a laboratory curiosity. Then World War I demanded sonar to hunt U-boats, and Paul Langevin used piezoelectric quartz to generate and detect underwater sound waves. That single application — using a crystal as both speaker and microphone — kicked off the entire field of ultrasonics and eventually gave us:

  • The quartz clock in your wristwatch (a crystal vibrating at exactly 32,768 Hz)
  • The resonator driving the clock of nearly every microcontroller ever built
  • Medical ultrasound imaging
  • Inkjet printer heads that squirt droplets by flexing
  • The accelerometers in your phone

But piezo ignition is the principle distilled to its rawest form. A typical grill ignitor contains a small spring, a hammer, and a lead zirconate titanate (PZT) ceramic — a synthetic piezoelectric far stronger than natural quartz. Pressing the button cocks the spring; releasing it slams the hammer into the crystal with several hundred newtons of force over a few microseconds. The resulting voltage spike is so brief and so high that it ionizes air molecules into a plasma channel — a spark.

The strange part is that this is mechanically identical to how a vinyl record player works, just inverted. A turntable cartridge with a piezoelectric element converts the tiny mechanical wiggles of a stylus into a voltage your amplifier can read. Same effect, reversed direction, six orders of magnitude smaller. The ignitor screams; the record player whispers.

Here's the kicker: this also runs backward. Apply a voltage to a piezo crystal and it physically deforms — and this is how piezoelectric motors achieve nanometer-precise positioning in scanning tunneling microscopes, the instruments that let humans first see individual atoms. So the same physics that lights your hamburger also lets researchers image gold atoms on a silicon surface.

One charming detail: some early lighters used Rochelle salt — literally the same crystal you can grow from cream of tartar in your kitchen — as their piezo element. The chemistry of grandma's pantry, weaponized into a spark.

Down the rabbit hole: The same physical effect that ignites your grill with a thumb-press also positions the probes that let humans photograph individual atoms — separated only by scale.

Daily YT Documentary

Philadelphia Street Crisis 2026: How Fentanyl & Soaring Rent Destroyed Kensington | Documentary

2026-05-28

Philadelphia Street Crisis 2026: How Fentanyl & Soaring Rent Destroyed Kensington | Documentary

Channel: Hero Spiderman POV (3510 subscribers)

Kensington, Philadelphia has become one of the most studied urban crises in modern America — a neighborhood where the collision of the synthetic opioid epidemic, xylazine ("tranq"), and a brutal housing market has produced street conditions that public health researchers, harm reduction workers, and city planners are still trying to understand. This documentary takes viewers into that intersection, examining how a single ZIP code became a case study in how drug supply chains, deindustrialization, and rent inflation compound on each other.

What it covers: the shift from heroin to fentanyl to fentanyl-xylazine mixtures and the medical consequences (necrotic wounds, altered overdose response), the economics of why displaced residents end up concentrated in specific corridors, and how rising rents in adjacent neighborhoods push vulnerability inward rather than dispersing it.

A note on quality: the channel name ("Hero Spiderman POV") and sensationalized title are red flags, and this may lean more toward street-footage documentary than rigorous analysis. But among this batch — mostly festival trailers and award ceremony recaps — it's the only entry that attempts to explain a real, ongoing public health and urban policy phenomenon. Worth watching with a critical eye for which claims are sourced versus narrated.

Why watch: A ground-level look at how fentanyl, xylazine, and housing economics intersect to create one of America's most-discussed urban crises.

Daily YT Electronics

Designing a PCB | Ep. 3

2026-05-28

Designing a PCB | Ep. 3

Channel: JurassicVader (3960 subscribers)

Most of today's candidates were hashtag-laden Shorts showing finished circuits with little explanation. This entry from JurassicVader stands out because it's part of a structured mini-series walking through the actual process of designing a printed circuit board, rather than just showing off a finished result.

PCB design is one of those skills that sits awkwardly between hobby electronics and professional engineering. Beginners can solder a breadboard, but the leap to a custom board involves schematic capture, footprint selection, net classes, design rules, trace width calculations, and layout decisions that affect signal integrity and manufacturability. Episode 3 in a daily series suggests the creator is breaking these concepts into digestible chunks — likely covering a specific stage of the workflow (routing, component placement, or DRC checks) rather than rushing through everything at once.

For viewers who've been meaning to graduate from perfboard projects to having boards fabricated at JLCPCB or OSH Park, watching someone reason through their decisions in real time is far more valuable than a polished tutorial that hides the trade-offs. The small subscriber count (under 4k) often correlates with creators who explain their thinking honestly rather than performing expertise.

Note: Without Episodes 1 and 2 for context, some terminology may land better if you watch the series in order.

Why watch: A bite-sized episode in a structured PCB design walkthrough — the kind of practical skill-building that breadboard tutorials rarely deliver.

Daily YT Engineering

Materials Science Explained: Stress-Strain Curve, Fatigue & Why Materials Fail

2026-05-28

Materials Science Explained: Stress-Strain Curve, Fatigue & Why Materials Fail

Channel: STEPX Journal (134 subscribers)

The stress-strain curve is one of those foundational diagrams that every mechanical, civil, and materials engineer is expected to read fluently — yet it's often taught as a static picture to memorize rather than a story about what atoms are actually doing as a specimen is pulled apart. This video walks through the curve as a physical narrative: the linear elastic region where atomic bonds stretch reversibly, the yield point where dislocations begin to slip irreversibly, strain hardening as those dislocations tangle, and finally necking and fracture.

What makes it worth watching over a textbook chapter is the connection to failure modes. The video ties the curve to fatigue — the slow, cyclic accumulation of microcracks that brings down bridges, aircraft wings, and rotating shafts at stresses well below the yield point. Understanding why a ductile material can fail in a sudden, brittle-looking way after millions of cycles is genuinely useful intuition for anyone specifying materials or interpreting failure reports.

STEPX Journal also has a cluster of companion videos posted the same day (steel, non-ferrous metals, crystal structures), so if this one lands, there's a coherent mini-curriculum to follow. The production is modest — small channel, 134 subscribers — but the scope is exactly right: one concept, explained with the physics behind it rather than just the formula.

Why watch: A clear walk-through of the stress-strain curve that connects elastic/plastic behavior to real-world fatigue failure, not just textbook definitions.

Daily YT Maker

Bechtel Innovation Design Center: Purdue's Maker Space

2026-05-28

Bechtel Innovation Design Center: Purdue's Maker Space

Channel: Purdue Office of Future Engineers (3240 subscribers)

Neither candidate is a stellar fit for an in-depth maker tutorial, but this walkthrough of Purdue's Bechtel Innovation Design Center is the more educational of the two. Marina guides viewers through one of the most well-equipped university maker spaces in the country — a facility that mixes traditional machine shop tools with modern digital fabrication gear.

For anyone curious about what a serious maker space looks like at scale, this tour offers a useful reference point. Expect to see CNC machines, 3D printers, laser cutters, woodworking equipment, electronics benches, and welding bays — alongside the safety training and shop-management systems that keep a multi-discipline facility running.

The video is most valuable as a planning resource: if you're setting up a community workshop, school makerspace, or even thinking about how to organize your own home shop, seeing how Bechtel zones its tools and workflows can spark practical ideas. It's also a useful preview for prospective engineering students weighing schools by hands-on opportunities.

Note: this is more of an overview tour than a deep technical tutorial, so go in expecting orientation rather than a how-to. The other candidate (a dice-making vlog from a 113-subscriber channel) had even less instructional content, making this the clearer pick.

Why watch: A practical look at how a top-tier university maker space organizes tools, training, and workflows across disciplines.

Daily YT Welding

grinding process of tungsten electrode

2026-05-28

grinding process of tungsten electrode

Channel: DHARAMA SE SIKHO (90 subscribers)

Most of today's batch is repetitive TIG-on-stainless footage with hashtag-stuffed titles, but this one zooms in on a fundamental that beginners constantly get wrong: how to grind a tungsten electrode. The quality of your TIG arc starts at the tungsten tip, and most arc-wander, wide-bead, and contamination problems trace back to bad prep.

The key principle the video demonstrates is grinding longitudinally — with the grit lines running along the length of the electrode, not around it. Circumferential grind marks act like little reflectors that scatter the arc, causing it to wander off the joint line. Longitudinal striations channel the electrons straight off the tip, giving you a tight, focused arc cone.

Other details worth watching for: the taper angle (typically 2–2.5× the electrode diameter for DC work on steel), keeping a tiny flat or "land" on the very tip to prevent the point from balling off and dropping into the puddle, and using a dedicated grinding wheel so you don't contaminate the tungsten with steel or aluminum particles.

It's a short, focused clip from a tiny channel — exactly the kind of single-skill tutorial that's more useful than another full-process montage. If you've ever wondered why your arc dances around instead of biting where you point it, this is the first place to look.

Why watch: Tungsten prep is the single most overlooked TIG fundamental, and grinding direction directly controls arc stability.

All newsletters