Daily Digest — 2026-07-18

26 newsletters today.

In this digest


Abandoned Futures

The Otrag Rocket: The 1970s German Modular Booster That Assembled Space Launch Vehicles From Identical 27-Inch Tubes and Got Killed by Cold War Diplomacy

2026-07-18

In 1975, a German aerospace engineer named Lutz Kayser founded Orbital Transport und Raketen AG (OTRAG) with a heresy: rockets did not need to be exquisite. They needed to be cheap, identical, and mass-produced. His plan was to build orbital launch vehicles the way Henry Ford built Model Ts β€” by bolting together hundreds of identical low-pressure pipes.

The core unit, called a Common Rocket Propulsion Unit (CRPU), was a 27-inch diameter, 40-foot-long commercial steel tube. Inside: kerosene and nitric acid β€” storable, cheap, requiring no cryogenic infrastructure. The engine was a pressure-fed ablative nozzle costing under $1,000 to manufacture. No turbopumps. No exotic alloys. A single CRPU produced about 6,000 pounds of thrust. To build a heavy-lift booster, you simply bolted hundreds of CRPUs together in a bundle and lit them simultaneously.

Kayser projected launch costs of $500/kg to LEO in 1978 dollars β€” roughly $2,300/kg today. For context, the Space Shuttle came in at $54,000/kg. SpaceX's Falcon 9 hit $2,700/kg forty-five years later.

OTRAG needed a launch site near the equator. West Germany refused. Kayser cut a deal with Mobutu Sese Seko of Zaire, leasing a Belgium-sized chunk of Shaba Province. Between 1977 and 1979, OTRAG conducted four successful test flights from Zaire β€” the first private company in history to launch its own rocket from its own spaceport. The fourth flight reached 20 km altitude and demonstrated multi-CRPU thrust vectoring by differential throttling β€” the same technique SpaceX would later use on Falcon Heavy.

Then the diplomatic knives came out. The Soviet Union accused OTRAG of building an IRBM in Africa. France lobbied against it to protect Ariane. The United States quietly pressured Bonn over MTCR concerns. In 1979, Mobutu β€” under Franco-Soviet pressure β€” expelled OTRAG. Kayser moved to Libya in 1980, where Gaddafi funded further tests until 1987, when West Germany invoked export control law and forced the program shut. The hardware was dismantled. Kayser's patents lapsed. He died in 2017 having watched SpaceX independently reinvent his throttle-controlled cluster architecture.

Why it works now:

  • Additive manufacturing can produce pressure-fed ablative engines at $200/unit β€” Kayser assumed $1,000.
  • Modern avionics solve the "hundreds of engines firing in sync" problem that doomed the Soviet N-1. Falcon Heavy runs 27 Merlins; Starship Super Heavy runs 33 Raptors. OTRAG's math was right β€” the electronics just didn't exist.
  • Storable propellants (green hypergolics like LMP-103S) eliminate the toxicity objections against nitric acid.
  • Equatorial launch politics have relaxed: AlcΓ’ntara (Brazil), Kourou, and AndΓΈya all court commercial customers.
  • The economic case Kayser made in 1975 β€” that the cost driver is manufacturing complexity, not payload sophistication β€” is now industry orthodoxy. Rocket Lab's Rutherford engine, Firefly's Reaver, and Stoke Space's approach are all downstream of it.

A modern OTRAG-architecture booster β€” call it a bundle of 200 3D-printed methane-oxygen pressure-fed CRPUs β€” could realistically hit sub-$1,000/kg for medium-lift payloads with a development budget under $300 million. That's the price of a mid-range biotech Series B.

Key Takeaway: OTRAG proved in 1978 that mass-produced identical rocket modules could beat aerospace-grade engineering on cost by an order of magnitude β€” and got killed not by physics or economics, but by Cold War geopolitics that no longer exist.

ArXiv Paper Digest

Campaign Diagrams: Visualizing the March Through the Phases of a Workload

2026-07-18

Authors: Toluwanimi O. Odemuyiwa, John D. Owens, Michael Pellauer, Joel S. Emer

ArXiv: 2607.15225v1

PDF: Download PDF

Imagine you're trying to figure out why your machine learning model is running slowly. Is it because the GPU's math units are maxed out? Is memory bandwidth the bottleneck? Or is the whole thing waiting on data that hasn't arrived yet? Today, you basically have two tools for answering this, and both are unsatisfying.

The first is the roofline model, a beloved chart in computer architecture that plots your workload as a single dot on a graph, showing whether you're limited by compute or memory. It's elegant, but it squashes your entire program into one point β€” you lose all sense of when things happen.

The second option is profilers and traces, which show every tiny event over time. These are the opposite problem: you can see everything, but drowning in fine-grained data makes it hard to say "aha, this is the bottleneck for this phase."

This paper introduces campaign diagrams, a new visualization that sits between these extremes. The idea is to break a workload into meaningful phases β€” say, the attention phase versus the feed-forward phase of a transformer β€” and then draw each phase in a way that simultaneously shows:

  • How much compute throughput it's using (are the math units busy?)
  • How much memory bandwidth it's using (are the pipes to memory full?)
  • The total volume of compute work and memory traffic (essentially, the area of each phase)
  • The latency β€” how long the phase actually takes

All of this fits on a single figure. You can literally see a workload "march" through its phases and spot where the bottleneck shifts from compute-bound to memory-bound, or where a phase is stalling waiting on something.

The clever bit is that campaign diagrams preserve the intuition of a roofline (compute vs. memory as the fundamental axes of hardware efficiency) while restoring the missing dimension of time. If you're designing hardware, tuning a kernel, or trying to explain to your team why a particular chunk of code is slow, being able to point at a single picture that shows both "what resource is the limit" and "for how long" is genuinely useful.

It's the kind of tool that feels obvious in retrospect β€” a good sign that it fills a real gap.

Why it matters: As ML workloads grow more complex and hardware more heterogeneous, campaign diagrams give architects and performance engineers a single, intuitive picture of where time is actually being spent β€” closing the gap between oversimplified rooflines and overwhelming traces.

Daily Automotive Engines

Cylinder Head Porting: Port Floor Shaping and the Fuel Wet-Flow Problem

2026-07-18

You've spent hours smoothing the bowl, radiusing the seat, and blending the transition. Now you're staring at the port floor β€” the bottom surface of the runner from the manifold face to the bowl. Every instinct says polish it. That instinct will cost you power on a port-injected engine, and here's why: the floor is where fuel lives.

In a dry-flow world (direct injection, or a flow bench with no fuel), the floor is just another wall. Air doesn't care. But in port injection, the injector sprays toward the back of the valve, and a meaningful fraction of that fuel β€” anywhere from 10% to 40% depending on temperature, pulse width, and port geometry β€” condenses on the port walls and runs along the floor as a liquid film. This is wet flow, and it obeys different rules than air.

A mirror-polished floor is hydrophobic in the wrong way: fuel beads up, forms unpredictable puddles, and dumps into the cylinder in slugs during transients. Throttle tip-in gets a rich spike, then a lean stumble as the puddle clears. A lightly textured floor β€” think 120-grit cartridge roll finish, roughly 60–80 microinch Ra β€” holds a thin, continuous fuel film that meters into the cylinder consistently.

  • Floor shape matters more than floor finish. A slight downhill grade from the manifold face toward the bowl (2–4 degrees) uses gravity to keep fuel moving. Flat floors puddle; uphill floors puddle worse.
  • Don't raise the floor at the pushrod pinch. On pushrod heads, the floor often dips around the pushrod tube. Filling that dip with epoxy sounds smart until you realize you just created a fuel dam.
  • Match the floor to the manifold gasket. A step-up from manifold to head floor catches fuel and creates a shelf. The head floor should sit 0.010–0.020" below the manifold floor at the joint.

Real-world example: Small-block Chevy Vortec heads (906/062 castings) responded famously well to mild floor work β€” knocking down the pushrod pinch bump and maintaining a slight downhill grade. Racers who mirror-polished everything reported worse tip-in response than guys who left the floor at a 220-grit finish. The rough-floor engines made 8–12 lb-ft more from 2,500–3,500 rpm on the same dyno.

Rule of thumb: On port-injected engines, finish the floor two grit levels rougher than the roof. If the roof gets 320-grit, the floor gets 120-grit. On direct injection, ignore this entirely β€” polish freely, because no fuel ever touches that surface.

See it in action: Check out 2-strokes don’t need backpressure! by MotoIQ to see this theory applied.
Key Takeaway: The port floor carries liquid fuel in port-injected engines, so a textured, downhill-graded floor delivers more consistent fueling than a mirror polish that lets fuel puddle and slug.

Daily Debugging Puzzle

Go's sync.Once.Do Panic Trap: The Initializer That Runs Exactly Never Again

2026-07-18

This handler loads config lazily on first request, using sync.Once to make the load thread-safe. If the disk read fails, the initializer panics; the outer handler recovers and returns 500. The team's runbook says: fix the config file, and the next request will re-read it and succeed.

var (
    once   sync.Once
    config *AppConfig
)

func GetConfig() *AppConfig {
    once.Do(func() {
        data, err := os.ReadFile("/etc/app/config.json")
        if err != nil {
            panic(fmt.Sprintf("config load failed: %v", err))
        }
        var c AppConfig
        if err := json.Unmarshal(data, &c); err != nil {
            panic(err)
        }
        config = &c
    })
    return config
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    defer func() {
        if x := recover(); x != nil {
            log.Printf("recovered: %v", x)
            http.Error(w, "internal error", 500)
        }
    }()
    cfg := GetConfig()
    respond(w, cfg)
}

The first request panics because the config file was missing. Ops fixes it within seconds. Every subsequent request still returns 500 β€” forever. Restarting the process is the only cure.

The Bug

sync.Once guarantees the function runs at most once β€” whether it succeeds, panics, or gets killed by runtime.Goexit. The stdlib implementation is roughly:

func (o *Once) doSlow(f func()) {
    o.m.Lock()
    defer o.m.Unlock()
    if o.done.Load() == 0 {
        defer o.done.Store(1)
        f()
    }
}

Notice the ordering: defer o.done.Store(1) is registered before f() runs. When f() panics, the deferred store still executes on the way out, marking the Once as complete. The panic propagates up to your recovery handler β€” but the Once is now sealed. Every future Do takes the fast path, skips your initializer, and returns immediately. config stays nil for the process lifetime, and respond(w, cfg) nil-derefs into a fresh panic on every request.

This is documented ("If f panics, Do considers it to have returned; future calls of Do return without calling f"), but the guarantee is exactly the opposite of what a caller who recovers wants. sync.Once is designed for initializations that cannot fail β€” package-level state, sync.Pool factories, atomic wiring. It is not a retry primitive.

The Fix

If initialization can fail, don't use sync.Once. Use a mutex and check the result explicitly:

var (
    mu     sync.Mutex
    config *AppConfig
)

func GetConfig() (*AppConfig, error) {
    mu.Lock()
    defer mu.Unlock()
    if config != nil {
        return config, nil
    }
    data, err := os.ReadFile("/etc/app/config.json")
    if err != nil {
        return nil, fmt.Errorf("config load failed: %w", err)
    }
    var c AppConfig
    if err := json.Unmarshal(data, &c); err != nil {
        return nil, err
    }
    config = &c
    return config, nil
}

Now every failed attempt leaves config == nil, and the next caller retries. For read-heavy workloads, promote to a sync.RWMutex with a fast-path read lock. Go 1.21's sync.OnceValue and sync.OnceValues have the same panic-sealing semantics, so wrap the initializer to return an error rather than panic if you want them to interoperate with retries.

Key Takeaway: sync.Once treats a panicking function as "done" β€” recovering the panic doesn't unseal the Once, so any initializer that can fail needs a mutex-and-nil-check pattern instead.

Daily Digital Circuits

Round-Robin Arbiters: How Hardware Gives Every Requester a Fair Turn Without Starving Anyone

2026-07-18

When N masters share a resource β€” a memory port, a bus, a crossbar output β€” an arbiter picks the winner every cycle. A fixed-priority arbiter is trivial (whoever has the lowest index wins), but it starves low-priority requesters when high-priority ones are always active. A round-robin arbiter fixes this by rotating who gets priority, so every requester is guaranteed service within N cycles.

The naive implementation: keep a pointer p to "who won last time." Next cycle, start scanning from (p+1) mod N and pick the first requester found. Update p to the winner. This works but the mod-N wrap-around is expensive β€” you need a wide priority encoder that "starts from the middle."

The classic trick: the mask-based round-robin arbiter. Keep an N-bit mask register where bit i is 1 if requester i is eligible this round (i.e., hasn't won yet in the current rotation). Each cycle:

  • Compute masked_req = req & mask. If non-zero, pick the lowest bit of masked_req using a plain priority encoder β€” no rotation needed.
  • If masked_req == 0, refill the mask (all ones except bits already served) and pick from req directly.
  • Clear the winner's bit in the mask.

This reduces to two ordinary priority encoders running in parallel plus a mux β€” much faster than a rotating encoder, and it maps to a clean two-level circuit.

Concrete example: a DRAM controller with 4 requesters (CPU cores 0–3). All four are hammering the memory port. A fixed-priority arbiter would let core 0 monopolize; the tail cores would see infinite latency. A round-robin arbiter guarantees each core one grant per 4 cycles β€” worst-case latency is bounded at N Γ— T_serve. For a 4-cycle memory access, that's a 16-cycle upper bound on request-to-grant. This bound is what makes the design analyzable for real-time systems.

Rule of thumb: a mask-based round-robin arbiter for N requesters costs roughly 2Γ— the area of a fixed-priority arbiter of the same width. That's the fairness tax, and it's almost always worth paying anywhere you can't tolerate starvation.

Variants worth knowing: weighted round-robin (each requester gets a quota β€” bit i stays set in the mask for w_i grants before clearing); deficit round-robin (used in packet schedulers where request sizes vary); and matrix arbiters, which store an NΓ—N "who-beat-whom-most-recently" matrix β€” same fairness guarantee, different timing/area tradeoff, favored in high-radix on-chip networks.

Key Takeaway: A round-robin arbiter turns "who won last" into a mask, then uses two ordinary priority encoders to pick fairly in one cycle β€” bounding worst-case latency to N grants without the delay of a rotating encoder.

Daily Electrical Circuits

Voltage Supervisors and Power-On Reset (POR) Circuits: Guaranteeing Clean Startup and Brownout Detection

2026-07-18

Every microcontroller datasheet has a nasty little clause buried in the electrical specs: the CPU is only guaranteed to behave correctly when VDD is above some threshold (say 2.7 V) and rising cleanly. Below that, the internal logic can latch into undefined states, corrupt flash writes mid-operation, or wake up executing garbage. A voltage supervisor (also called a reset IC or brownout detector) is the tiny 3-pin chip that keeps the RESET pin asserted until the rail is legitimately alive β€” and yanks it back low the moment the rail sags.

Anatomy of a supervisor: internally it's a bandgap reference, a comparator with built-in hysteresis, and a timer. The comparator watches VDD against a factory-trimmed threshold (typical values: 2.32 V, 2.63 V, 2.93 V, 4.38 V). When VDD crosses above threshold, a monoshot holds RESET asserted for a fixed reset timeout (typically 140 ms to 200 ms) so the crystal oscillator, PLL, and internal regulators have time to stabilize. When VDD dips below threshold minus hysteresis (usually 0.5–1%), RESET fires immediately.

Output flavors matter:

  • Push-pull active-low (e.g., MAX809): drives RESET rail-to-rail. Simple, but you can't wire-OR multiple reset sources.
  • Open-drain (e.g., MCP809, TPS3839): requires an external pull-up but lets you tie in a manual reset button, watchdog output, and JTAG debugger reset all on the same node.
  • Windowed supervisors: assert reset if VDD goes either too low or too high β€” critical for FPGA cores where overvoltage kills silicon.

Real-world example: An STM32L4 running at 3.3 V has a minimum operating voltage of 1.71 V, but flash write/erase requires at least 1.71 V held stable. If your battery-powered board sees the LiPo sag to 3.0 V during an LTE burst, the internal BOR might catch it β€” but with EEPROM writes in progress, you want an external supervisor like the TPS3839L30 (3.0 V threshold, 200 ms timeout, 150 nA quiescent). Below 3.0 V, RESET pulls low, the MCU aborts cleanly, and flash contents survive.

Rule of thumb β€” picking the threshold: set it about 5–10% above the MCU's minimum guaranteed VDD, but below your nominal rail's lower tolerance. For a 3.3 V Β±5% rail feeding an MCU rated down to 2.7 V: nominal low is 3.135 V, MCU minimum is 2.7 V β€” pick a 2.93 V supervisor. That gives 200 mV margin above the MCU limit and 200 mV below the rail's worst-case low, so normal operation never trips it but a real brownout does.

Watchdog combo chips (MAX6746, TPS3813) add a second input: if your firmware fails to pet a WDI pin within a windowed interval, RESET fires. This catches software hangs the internal watchdog misses (because a runaway CPU can disable its own peripheral watchdog, but it can't reach outside the chip).

Layout gotcha: place the supervisor's VDD pin close to the MCU's VDD pin, not near the regulator output. You want it sensing what the MCU sees, including IR drops in the power trace. And decouple it with its own 100 nF β€” supervisors are comparators, and comparator noise causes reset chatter.

Key Takeaway: A voltage supervisor guarantees your MCU only runs when the rail is genuinely healthy β€” pick a threshold 5–10% above the MCU's minimum VDD but below the rail's worst-case low, and sense at the MCU, not the regulator.

Daily Engineering Lesson

Twisted Pair Wiring: Why Data and Instrumentation Cables Are Braided

2026-07-18

Look at any Ethernet cable, RS-485 run, 4-20 mA sensor wire, or telephone line and you'll find the same construction: pairs of insulated conductors twisted together at a specific pitch. That twist isn't cosmetic β€” it's a physics trick that lets low-voltage signals survive a factory floor full of VFDs, motor starters, and 480 V bus ducts.

The problem: differential signals and common-mode noise. A twisted pair carries a signal as the difference between two conductors. The receiver ignores whatever voltage both wires share. Noise from a nearby motor or fluorescent lamp couples electromagnetically into both wires β€” but only if the wires present different loop areas to the field. If one wire happens to run closer to the noise source than the other, it picks up more, the difference between them changes, and the noise becomes signal.

The fix: twist them. Each half-twist swaps which wire is on the "near" side of any external field. Over a length of cable, the induced voltages average out to nearly zero on both conductors β€” same on both means common-mode, which the receiver rejects. The tighter the twist (shorter the lay length), the better the noise cancellation and the higher the usable frequency.

Cat cable examples:

  • Cat5e: ~1.5-2 twists per inch on some pairs, up to ~4 on others, rated to 100 MHz
  • Cat6: tighter twists plus an internal plastic spline separating pairs, rated to 250 MHz
  • Cat6a/Cat7: even tighter twists plus foil shields per pair for 10 Gbps at 500-600 MHz

Different pairs in the same jacket use different lay lengths on purpose β€” if all four pairs twisted at the same pitch they'd couple into each other (crosstalk) in sync.

Rule of thumb for installers: when terminating a jack or a punch-down block, do not untwist more than Β½ inch (13 mm) of pair. The last inch of an untwisted pair is where noise sneaks in and where impedance discontinuities cause reflections. Field techs who "fan out" three inches to make terminations pretty are the reason a certified Cat6 run fails its NEXT (near-end crosstalk) test.

Instrumentation twisted pair (belden-style) uses much longer lay lengths (~2-3 inches) because the signals are DC or low-frequency 4-20 mA, but the same principle applies: run the pair, don't split it, and if you need shielding for really nasty environments, add a foil or braid and ground one end only to prevent ground loops.

See it in action: Check out Why Are Wires Twisted? Twisted Pair Explained by Audio University to see this theory applied.
Key Takeaway: Twisting a signal pair converts electromagnetic interference into common-mode noise that the differential receiver throws away β€” but only if you keep the pair twisted all the way to the terminals.

Forgotten Books

When a Skull Fracture Was an "Accomplishment": The Lost Craft of Catching Print-Shop Ghosts

2026-07-18

Book: The Wainwright star (1937-01-06) by Unknown (1937)

Read it: Internet Archive

Buried in a January 1937 issue of a small Alberta weekly is a working newspaperman's confession about a hazard that has almost completely vanished from modern life: the migrating paragraph. In the days of hot-metal typesetting, chunks of text could physically wander from one story into another during the paste-up, producing juxtapositions that ranged from absurd to actionable.

The Wainwright Star's columnist recounts visiting a magazine editor who was buried under angry mail after his publication had run this item:

"Presidentβ€”β€”β€” of the Local Union Noβ€”β€” suffered a skull fracture when he was hit by a truck while on his way to work. The editor congratulates the members of the local union on this accomplishment. If the same procedure is followed in other cities, the entire organization will benefit."

The second and third sentences were supposed to be attached to a different article β€” one about a lodge that had grown its membership. In migrating across the layout, they turned a get-well notice into what looks like open advocacy for maiming union officials. As the columnist notes, the editor spent days "writing letters explaining that he was not advocating the maiming of all or any local union officials."

He offers a second example from his own railroading days at a Mid-Western daily, where an obituary of a prominent citizen ended:

"The crowd was happy and thoroughly enjoyed itself. It was truly a gala day."

That sentence had been meant for a story about a corn festival at the county seat.

What was lost: The pre-digital editing pipeline had a physical reality that shaped an entire discipline of proof-reading. A "graf" was a metal slug you could pick up and drop into the wrong forme. Copy readers didn't just check spelling β€” they were trained to sanity-check adjacencies, because a runaway paragraph was a real thing that happened on press night. Style guides of the era included rules about closing off stories cleanly precisely so that a stray slug couldn't semantically attach to the wrong headline.

Modern readers will recognize the descendants of these ghosts:

  • The autocomplete horror β€” texting your boss what you meant to text your spouse.
  • The CMS copy-paste that carries hidden formatting into a live blog post.
  • The LLM that stitches two unrelated facts into a confidently wrong sentence.

The mechanism has changed β€” atoms became bits, bits became tokens β€” but the failure mode is identical: content that looks locally coherent while being globally nonsense. The 1937 columnist's implicit lesson is that the fix is never technological. It is a human reader whose job is specifically to ask "does this paragraph belong to this story?" That role has been quietly dissolved out of most modern publishing workflows, which is why the ghosts of the paste-up table are more common now than they were in Wainwright.

The forgotten claim: Print-era editing was a defense not just against typos but against paragraphs physically migrating between stories β€” a discipline of "adjacency checking" that our digital tools have quietly re-invented the need for, without re-inventing the job.

Forgotten Darkroom

Blaud's Pills: The Forgotten Iron Cure That Saved a Century of Anemic Women

2026-07-18

Book: The Pharmaceutical Journal Formulary: a register of formulae for medicinal preparations sold by chemists and druggists by P.J.F. (1904)

Read it: Internet Archive

Tucked into the advertising pages of this 1904 druggists' formulary β€” a fat reference volume of "known, admitted and approved" remedies for British chemists β€” is a boast that would have meant something instantly to any pharmacist of the era, and nothing at all to a modern reader:

THE LEADING HOUSE FOR BLAUD'S PILLS.

The advertiser is shouting about a product so ubiquitous in 1904 that it needed no explanation. Today, almost no one has heard of it. Yet Blaud's Pills may be the most consequential forgotten medicine of the 19th century.

The formula was devised in 1832 by Pierre Blaud, a French country doctor in Beaucaire, who was trying to cure "chlorosis" β€” the "green sickness" that turned adolescent girls pale, weak, breathless, and prone to fainting. For centuries the condition was blamed on lovesickness, corseting, or "unfulfilled womanhood." Blaud noticed that his patients recovered on a specific pill: ferrous sulfate mixed with potassium carbonate, which reacted inside the pill mass to form ferrous carbonate, protected from oxidation. He reported curing patient after patient in weeks.

He was, without knowing the biochemistry, treating iron-deficiency anemia β€” the same disorder that today affects roughly a quarter of the world's population and is still the leading nutritional deficiency on Earth.

  • The vindication: Chlorosis was not a mysterious female malady. It was iron deficiency, likely driven by menstruation combined with the low-iron diets of urban working-class girls. Blaud was right by roughly seventy years, before hemoglobin's iron content was even understood.
  • The scale: By 1900, Blaud's Pills were manufactured by essentially every major British and American pharmaceutical house. The Formulary lists them as a staple counter product. They remained on the British Pharmacopoeia until 1968.
  • The disappearance: Chlorosis itself vanished from medical literature around 1930 β€” not because iron deficiency vanished, but because fortified flour, better diets, and simpler ferrous sulfate tablets replaced the specific diagnosis and its specific pill. The disease and its cure faded together.

What's striking is how close the 19th century came to modern nutritional medicine without the theoretical framework. Blaud didn't know about hemoglobin (identified 1840), had no concept of a "vitamin" or "trace mineral" (both 20th-century ideas), and had no lab test to confirm anything. He worked from bedside observation: pale girl in, pink girl out.

The modern descendant sits on every pharmacy shelf as a $3 bottle of ferrous sulfate. Same active ion, same target condition, same slow correction over weeks. The chemistry hasn't improved much in 190 years β€” the branding just got less romantic.

The forgotten claim: A French country doctor cured iron-deficiency anemia in 1832 with a two-ingredient pill, decades before medicine understood what hemoglobin or iron deficiency actually were.

Forgotten Patent

Homer Dudley's Vocoder: The 1935 Patent That Took Human Speech Apart β€” and Rebuilt It Inside Every Cell Phone, Auto-Tune, and Siri

2026-07-18

In 1928, a Bell Labs engineer named Homer Dudley was staring at a problem that would define the century: a transatlantic telephone cable could carry only a few voice channels at a time, because each voice hogged thousands of hertz of bandwidth. Dudley asked a heretical question. What if the wire didn't have to carry the sound of the voice at all β€” only the instructions for rebuilding it on the far end?

His answer became US Patent 2,151,091, "Signal Transmission," filed October 30, 1935 and granted March 21, 1939. It is arguably the most consequential audio patent ever issued.

Dudley's insight was the source–filter model of human speech. When you talk, your vocal cords produce a buzzy pitched tone (or a hiss, for consonants like "sh"), and your mouth, tongue, and lips act as a slowly-changing filter that sculpts that tone into vowels and consonants. The source is fast and information-poor. The filter is slow and information-rich. Dudley's patent proposed sending only the filter shape β€” a handful of band-energy values updated a few dozen times per second β€” and reconstructing intelligible speech at the receiver using a locally-generated buzz and hiss. He called it the Voice Coder, shortened to Vocoder.

Bell Labs built a hand-played demo, the Voder (patent 2,121,142), and had a trained operator "play" speech on it at the 1939 New York World's Fair. Crowds heard a machine talk. It sounded uncanny β€” because it was: no human throat was moving.

Then the war came. The US Army Signal Corps took Dudley's patent and built SIGSALY, a 55-ton system deployed in 1943 that digitized, vocoded, and encrypted the Roosevelt–Churchill hotline using one-time-pad noise pressed onto phonograph records. It was the first secure digital voice link in history. Churchill's cabinet spoke through Homer Dudley's math.

The modern lineage is direct and enormous:

  • Linear Predictive Coding (LPC), invented at Nagoya and Bell Labs in the 1960s–70s, is a mathematical refinement of Dudley's source-filter idea. Every GSM, CDMA, VoLTE, WhatsApp, Zoom, and Discord voice call is a vocoder call β€” usually a CELP variant descended straight from the 1935 patent.
  • Auto-Tune (Andy Hildebrand, 1997) is a pitch-shifted vocoder. So is the "robot voice" of Kraftwerk, Daft Punk, Roger Troutman, and T-Pain. Wendy Carlos used a real analog vocoder on A Clockwork Orange in 1971.
  • Text-to-speech systems from DECtalk (which gave Stephen Hawking his voice) through Siri, Alexa, and today's neural TTS all rest on the same analysis-synthesis paradigm β€” separating what is said from how it sounds.
  • Modern neural audio codecs like Google's Lyra, Meta's Encodec, and the audio front-ends inside multimodal LLMs are, philosophically, deep-learned vocoders β€” trained to compress voice into a few kilobits per second by learning a latent source-filter representation Dudley would recognize.

What makes the patent so startling is its epistemology. In 1935, before Shannon's information theory, before the transistor, before the very idea of "digital audio" existed, Dudley proposed that meaning and signal were separable β€” that you could transmit a description of speech instead of the speech itself. Every compressed voice call and every synthetic voice you've ever heard is a footnote to that idea.

Key Takeaway: Homer Dudley's 1935 vocoder patent didn't just compress voices β€” it introduced the analysis-synthesis paradigm that underlies every cell phone codec, robot-voice pop song, and AI text-to-speech engine in existence today.

Daily GitHub Zero Stars

antaresdk/sus-core

2026-07-18

SUS Core is an ambitious attempt to bring Vue-like reactive UI patterns into Unity's UI Toolkit. If you've ever built a game UI in Unity, you know the pain: manually wiring up UXML elements to C# controllers, chasing stale references, and writing verbose imperative code to reflect state changes on screen. This project tries to fix that by introducing a declarative, reactive layer on top of UI Toolkit.

The interesting twist is the .sharq compiler β€” a custom file format that appears to compile down to Unity-compatible UI code. This is a bold design choice. Rather than shoehorning reactivity into C# with attributes or source generators, the author is building a small domain-specific language that borrows from the Vue single-file-component model, where template, script, and style live together.

Why this matters:

  • UI Toolkit is Unity's future for UI, but developer ergonomics still lag behind web frameworks. Bringing familiar patterns from Vue or Svelte lowers the learning curve for web developers moving into game dev.
  • Reactive bindings eliminate a whole class of bugs around UI/state desync β€” arguably the most common source of runtime UI issues in Unity projects.
  • A custom compiler means the author can enforce structural guarantees and potentially generate optimized C# without the runtime overhead reactive frameworks usually carry.

Who would benefit? Indie Unity developers building UI-heavy games β€” inventory systems, RPG menus, strategy game HUDs β€” where imperative UI code becomes a maintenance nightmare. Also web developers transitioning into Unity who miss the Vue/React declarative model. It's early-stage, zero-star, and probably has rough edges, but the direction is genuinely exciting.

Worth watching if the compiler proves out β€” this could become the "SvelteKit for Unity" niche if the author sticks with it.

Why check it out: A rare attempt to bring modern reactive-UI ergonomics to Unity's UI Toolkit via a custom compiler β€” a niche worth watching if you write Unity UI.

Daily Hardware Architecture

The IOMMU: How CPUs Translate Addresses for Devices That Don't Know About Virtual Memory

2026-07-18

Your CPU has an MMU that translates virtual addresses to physical ones. But when a NIC does DMA, or a GPU reads a buffer, those devices issue raw bus addresses. Without help, they can only see physical memory β€” and worse, a malicious or buggy device could DMA over your kernel. The IOMMU (Intel VT-d, AMD-Vi, ARM SMMU) is a second MMU sitting on the I/O side of the memory controller, translating device-issued addresses through page tables the OS controls.

An IOMMU serves three jobs:

  • Isolation: each device gets its own address space (a "domain"). A GPU can't DMA into memory owned by the NIC's driver.
  • Remapping: legacy 32-bit devices can be given translations into any 64-bit physical address, avoiding bounce buffers.
  • Virtualization: with SR-IOV, a VM's guest physical address gets translated straight to host physical by the IOMMU, so passthrough devices work without hypervisor traps.

The mechanism: when a device issues a DMA to address X, the transaction arrives at the root complex tagged with the device's BDF (Bus/Device/Function). The IOMMU uses BDF to look up a context entry, which points to a page table. It walks that table exactly like an MMU walks yours β€” same 4-level structure on x86, cached in an IOTLB.

Real-world example: Linux's iommu=pt (passthrough) mode is common on servers because full IOMMU translation isn't free. A DMA to an untranslated address hits the IOTLB. On miss, the IOMMU walks page tables β€” that's four memory accesses per DMA descriptor. On a 100 Gbps NIC pushing 8M packets/sec, an IOTLB miss rate of even 1% can burn measurable memory bandwidth just walking device page tables.

Rule of thumb: IOTLB entries are precious β€” usually 64 to 512 per unit. If your workload scatters DMAs across more 4K pages than the IOTLB holds, you're page-walking constantly. Fix: use hugepages for DMA buffers. One 2 MB IOTLB entry covers what would otherwise need 512 entries. NVMe drivers doing multi-queue I/O benefit hugely.

Gotcha: IOMMU invalidations are slow. When a driver unmaps a DMA region, the IOMMU must flush IOTLB entries, which requires a serialized command sent over the IOMMU's command queue. High-frequency map/unmap cycles (naive networking code) can bottleneck on invalidation throughput long before CPU or PCIe does.

See it in action: Check out But, what is Virtual Memory? by Tech With Nikola to see this theory applied.
Key Takeaway: The IOMMU is a second MMU for devices β€” it enforces isolation and enables passthrough, but its tiny IOTLB and expensive invalidations mean DMA-heavy code must use hugepages and avoid map/unmap churn.

Hacker News Deep Cuts

Martin Picard's Mitochondrial Theory of Mind

2026-07-18

Quanta Magazine profiles are usually worth reading on their own β€” the publication has a knack for finding scientists who are quietly rewriting a field's fundamental assumptions. This piece on Columbia's Martin Picard appears to be exactly that: a profile of a researcher arguing that mitochondria are not merely cellular power plants but active participants in cognition, mood, and behavior.

The dominant framing in biology textbooks has treated mitochondria as ATP factories β€” organelles you learn about once and mostly forget. Picard's work pushes back on that. His lab has been publishing evidence that mitochondria communicate with each other, respond to psychological stress, form networks that reshape based on environmental signals, and appear to influence neural function in ways that don't reduce cleanly to "energy supply." If the theory holds, it reframes a lot of adjacent questions:

  • Psychiatric disease β€” depression, bipolar disorder, and schizophrenia all have known metabolic correlates that current models struggle to explain mechanistically.
  • Aging and cognitive decline β€” mitochondrial dysfunction is already implicated, but as consequence, not cause. Picard's framing inverts that.
  • The mind-body problem β€” a mechanistic bridge between subjective psychological states and cellular biology has long been missing. Mitochondrial signaling is a plausible candidate.

For a technical audience, this matters beyond the neuroscience itself. It's a case study in paradigm inertia: a component was characterized decades ago, everyone moved on, and now new tools (single-cell imaging, mitochondrial transcriptomics, real-time bioenergetic measurement) are surfacing behaviors nobody thought to look for. Similar stories are playing out in glial cells, gut microbes, and the extracellular matrix β€” all "boring supporting infrastructure" turning out to be computationally interesting.

There's also a practical angle for anyone building models of biological systems, whether for drug discovery, computational biology, or AI-adjacent work on embodied cognition. If mitochondria are signaling nodes rather than passive utilities, then network models of cellular behavior need substantially more state per cell than most current simulations assume.

Quanta's long-form profiles tend to be careful with the science β€” they're not breathless press releases β€” so this is likely a solid entry point into Picard's actual publications rather than hype.

Why it deserves more upvotes: A serious science profile of a researcher potentially reframing mitochondria from power plants to cognitive signaling nodes β€” the kind of paradigm shift HN usually loves but somehow missed.

HN Jobs Teardown

Oracle Cloud Infrastructure: What Their Hiring Reveals

2026-07-18

Source: HN Who is Hiring

Posted by: kostar

Of the ten postings in this thread, Oracle's is the most revealing because it forces you to reconcile two things that don't usually go together: Oracle and a Scala/Akka/CQRS shop hiring on Hacker News. That tension is the story.

The stack tells you what OCI actually is. The Registry team is running Scala / Akka / Play on an Event-Sourced, Distributed system built on CQRS. This is not enterprise Java Oracle. Event Sourcing + CQRS is the pattern you reach for when you have a multi-tenant system where the audit log is the source of truth and read/write workloads diverge sharply β€” exactly what a container registry looks like: writes are rare (pushes), reads are enormous and cache-friendly (pulls during pod scheduling storms). Akka gives them backpressure and cluster sharding per-tenant. This is a stack chosen by engineers, not by a procurement committee.

What it reveals about the company. Oracle is still trying to catch ECR, GCR, and ACR β€” and the fact that they're staffing the Registry specifically signals that OCI leadership understands the container registry is table-stakes for anyone considering their cloud for Kubernetes workloads. The posting cuts off mid-sentence at "including K[ubernetes]", which is the whole pitch: we need parity with the big three or enterprises won't migrate. Hiring a senior Scala engineer in SF (not Bangalore, not Redwood Shores) means they're paying market rate to compete with the hyperscalers for the same talent pool.

Skills and trends highlighted:

  • Functional programming in production β€” the pitch "wondered what it is like to apply FP principles in a live, production environment" is aimed squarely at the Scala/Haskell/OCaml community that usually views Oracle as the enemy.
  • Event Sourcing / CQRS literacy β€” still a niche skill, and demanding it filters for engineers who've thought hard about consistency models.
  • Multi-tenant infrastructure β€” the hard problem underneath every cloud service.

Green flags: Specific tech stack, specific architectural pattern, specific team. The poster clearly works there and wrote this themselves β€” no recruiter boilerplate. Red flags: "Senior" role but no salary band, ONSITE-only in SF during what the thread implies is early COVID shelter-in-place (see Clockwise's posting), and it's Oracle β€” attrition and internal politics are the elephant. Also: a team this small betting on Akka in 2020 is a bet the Lightbend ecosystem stays healthy, which was already being questioned.

The signal: Even hyperscaler laggards are quietly staffing FP-heavy, event-sourced teams to build the boring container plumbing that decides which cloud enterprises actually pick.

Daily Low-Level Programming

The userfaultfd() Syscall: Handling Page Faults in User Space

2026-07-18

When a process touches an unmapped or lazily-populated page, the kernel normally decides what to do: allocate a zero page, read from swap, fault a file page in. userfaultfd() hands that decision to user space. You register a range of virtual memory with the kernel, and when a fault hits it, the faulting thread is parked and you get a notification on a file descriptor instead of the usual SIGSEGV or automatic backing.

Mechanically: userfaultfd(O_CLOEXEC) returns an fd. You ioctl UFFDIO_REGISTER to claim a VMA range and pick modes (UFFDIO_REGISTER_MODE_MISSING for absent pages, _WP for write-protection faults, _MINOR for pages that exist but aren't installed in the page table). Then a handler thread does read() on the fd β€” each read yields a uffd_msg containing the faulting address, thread ID, and flags. You resolve the fault by ioctl'ing UFFDIO_COPY (atomically copy a page of data into the hole), UFFDIO_ZEROPAGE, or UFFDIO_CONTINUE. Only then does the parked thread resume.

The canonical use case is live migration. CRIU and QEMU use userfaultfd for post-copy migration: the VM starts running on the destination host with an empty address space, and every fault triggers an RDMA pull of the missing page from the source. Compare this to pre-copy, where you iteratively ship dirty pages until convergence β€” post-copy guarantees a bounded switchover time, at the cost of network-latency-per-fault after the switch.

Other real uses: garbage collectors use write-protect mode to implement concurrent marking (mprotect-style, but without the mmap_lock contention and without SIGSEGV round-trips). Distributed shared memory systems fault pages in from remote nodes. Fuzzers snapshot and restore process state by write-protecting the heap and copy-on-write'ing on demand.

Rule of thumb on cost: a userfaultfd round-trip is roughly 5–15 microseconds on modern hardware β€” one context switch to the handler, one memcpy, one ioctl, one wake. Compare with a normal minor fault at ~1 ΞΌs and an anonymous-page major fault at ~10 ΞΌs from swap. So userfaultfd is cheap enough to handle sparse faults but catastrophic if you take one per 4KB of a sequential scan. Pre-fault hot regions with UFFDIO_COPY in bulk before the guest touches them.

Security note: unprivileged userfaultfd was famously abused for Dirty COW-style race widening β€” pausing a kernel copy mid-flight gave attackers unlimited time to swap the target page. Since 5.11, the vm.unprivileged_userfaultfd sysctl defaults to 0, restricting the syscall to CAP_SYS_PTRACE holders unless you opt in.

See it in action: Check out [2016] LinuxCon: Userland Page Faults and Beyond: Why, How and What
#39;s Next by Andrea Arcangeli by KVM Forum to see this theory applied.
Key Takeaway: userfaultfd turns page faults into a user-space message queue, enabling post-copy VM migration, concurrent GCs, and DSM β€” at ~10ΞΌs per fault, so it wins on sparse, latency-tolerant access patterns and loses on dense sequential ones.

RFC Deep Dive

RFC 608: Host Names On-line

2026-07-18

RFC: RFC 608

Published: 1974

Authors: Mark Krilanovich, George Gregg

Before DNS, before /etc/hosts as we know it, there was one file. RFC 608 β€” a two-page memo from January 1974 β€” announced that the Network Information Center (NIC) at SRI would maintain a single authoritative list of every host on the ARPANET, available on-line for anyone to download. This is the direct ancestor of the entire modern name-resolution stack.

The problem. By late 1973 the ARPANET had grown past the point where operators could keep host tables in their heads or in printed appendices. A user at UCLA who wanted to reach a machine at MIT needed a numeric host number (this predates dotted-quad IPv4 addressing β€” hosts had 8-bit numbers on the IMP subnet). Programs needed those numbers too, but nobody wanted to type 10 when they meant MIT-DMS. Every site had cobbled together its own local table, and the tables disagreed.

The design. The RFC is startlingly minimal. It says: the file lives at <NIC>HOSTS.TXT on the SRI-NIC server, host 10. Anyone can FTP it. It is updated as changes arrive. Each line is a mapping between an official host name, aliases, and a host number. That's it. No versioning protocol, no replication, no delegated authority. One file, one publisher, one truth. The mechanism was pure convention layered on FTP.

What this created. Every operating system on the ARPANET wrote a scraper. Sites polled HOSTS.TXT nightly (or weekly, or whenever they remembered) and regenerated their local host tables from it. This is where the file we still ship as /etc/hosts comes from β€” literally. The BSD format was designed to be easy to derive from the NIC file. When Windows put a hosts file in C:\Windows\System32\drivers\etc\, it was carrying the ghost of RFC 608 into 2026.

Why it broke. The centralized file scaled for a decade, but by the early 1980s three problems were fatal:

  • Consistency lag. A host added Monday might not appear in your local table until Friday. Newly-connected sites were unreachable by name for days.
  • Bandwidth. As the network grew to thousands of hosts, every site pulling the whole file was chewing up a nontrivial share of SRI-NIC's uplink.
  • Naming authority. A single flat namespace with one gatekeeper doesn't scale politically. Everyone wanted to run their own hosts without asking SRI for permission.

Paul Mockapetris's RFC 882/883 (1983), later 1034/1035, replaced the file with a distributed hierarchical database: DNS. The delegation model β€” you own your zone, you serve your own records β€” is a direct response to the RFC 608 model failing at scale.

Why it still matters. Every time you edit /etc/hosts to override a hostname during development, or push a HOSTS-file adblocker, or debug why nsswitch.conf prefers files over dns, you are using RFC 608's mechanism. The file predates DNS by nearly a decade and outlived it in daily use as a per-machine escape hatch. It's also a beautiful case study in starting with the simplest thing that works β€” one file, no protocol β€” and letting the failure modes teach you what the real protocol needs to be.

Why it matters: RFC 608 is the two-page memo that created /etc/hosts, established name-to-address mapping as a first-class problem, and β€” through its own scaling failures a decade later β€” motivated the entire design of DNS.

Stack Overflow Unanswered

Cortex M - linking obj to exisiting elf

2026-07-18

Stack Overflow: View Question

Tags: gcc, linker, arm, elf

Score: 1 | Views: 52

The asker has a Cortex-M firmware image they build themselves, and they want to compile a separate standalone function that calls into the already-flashed functions by their existing absolute addresses. The new function will be flashed into its own page. Nothing gets relinked; the old ELF's symbols must be treated as fixed pins the new object binds against.

What makes this interesting is that it turns the linker inside out. Normally the linker resolves symbols by placing sections and computing addresses. Here, half the symbols already have addresses baked into ROM and cannot move. You need to tell the linker "trust me, foo lives at 0x0800_1234, don't allocate anything for it."

Approach

  • Harvest the addresses. From the existing ELF, run arm-none-eabi-nm --defined-only main.elf (or objdump -t) to get every symbol you may call.
  • Generate a symbol-injection linker script. Convert that list into a fragment of PROVIDE statements:
    PROVIDE(foo = 0x08001235);
    PROVIDE(bar = 0x08002101);
    Note the Thumb LSB is set to 1. Cortex-M is Thumb-only, and the LSB tells BX/BLX to stay in Thumb state. If nm reports an even address, add 1 before feeding it to the linker.
  • Build the new object with long calls. Compile with -mlong-calls so the compiler emits movw/movt + blx instead of a 24-bit relative bl β€” otherwise you can't reach across flash from your patch page.
  • Place your patch at the target page. Give the new link a MEMORY region matching the erased page, e.g. PATCH (rx) : ORIGIN = 0x08010000, LENGTH = 2K, and a SECTIONS block placing .text there.
  • Emit a raw binary. objcopy -O binary patch.elf patch.bin so your loader can program exactly the bytes for that page.

Gotchas

  • Compiler-inserted helpers. Division, 64-bit math, memcpy for aggregates β€” the compiler may reference __aeabi_* or memcpy. Those symbols must exist in the base ELF and be pinned via PROVIDE, or your patch will fail to link (or worse, link against a fresh copy that recurses into itself).
  • LTO / GC. The base image was probably built with -ffunction-sections --gc-sections; a function you want to call may have been discarded. Verify presence in the final ELF, not the object files.
  • Constant pools and literal loads. Long calls emit a literal referencing the target address; make sure the page has room and alignment for it.
  • Static data. Calling a function that touches globals only works if the RAM layout in the running image matches what your patch expects β€” you cannot introduce new .data/.bss without a coordinated RAM plan.
  • Interrupts & cache. On M7 you'll need I-cache invalidation after programming; on all cores, disable interrupts around the page erase/program.
The challenge: You have to convince the linker that half your symbol table already lives at fixed ROM addresses while still producing position-correct code for a fresh flash page β€” a workflow the normal build system was never designed to support.

Daily Software Engineering

The LIRS Cache Eviction Pattern: Distinguishing Hot Pages from Cold Ones by Reuse Distance

2026-07-18

LRU has a well-known weakness: it treats recency as a proxy for value. A page touched once by a scan looks just as valuable as a page touched every 50ms by your hottest query. LRU can't tell them apart, so a single sequential scan can flush your working set. LFU overcorrects the other way β€” old-but-frequent pages linger forever even after the workload shifts.

LIRS (Low Inter-reference Recency Set) takes a different measurement entirely. Instead of asking "when was this page last touched?", it asks: how many distinct other pages were touched between this page's last two accesses? That distance is called IRR (Inter-Reference Recency). Low IRR means the page is genuinely hot β€” it gets reused before much else churns through. High IRR means it's cold, even if it was touched recently.

The cache is split into two logical sets:

  • LIR set (~99% of capacity): pages with low IRR β€” the confirmed hot set. Never evicted until demoted.
  • HIR set (~1% of capacity): pages on probation. Resident HIR pages can be evicted immediately; non-resident HIR pages keep only their metadata so we can measure IRR if they come back.

When a HIR page is accessed again and its measured IRR beats the worst LIR page, it gets promoted to LIR and the demoted LIR page becomes HIR. That's the key trick: pages earn LIR status by proving low reuse distance, not by being recent.

Concrete example. A reporting service caches 1000 pages. Every second, 50 hot pages are hit repeatedly. Then a nightly job scans 10,000 unique pages once. Under LRU, the scan evicts all 50 hot pages β€” the next second's traffic hits disk 50 times. Under LIRS, each scanned page enters as HIR with high IRR (nothing before, nothing after). Since scanned pages never prove low IRR, they cycle through the small HIR slice and never displace the LIR set. Hot pages stay resident. MySQL's InnoDB buffer pool uses a variant of this idea (midpoint LRU) precisely to survive scans.

Rule of thumb: allocate ~1% of cache capacity to resident HIR and keep non-resident HIR metadata for roughly 2Γ— your LIR size. That metadata is small (just a page ID and a timestamp) but essential β€” without it, you can't measure IRR when a cold page returns.

The cost: LIRS needs a "stack" (LRU-ordered list of both LIR and HIR entries, including non-resident) plus a HIR queue. More bookkeeping than CLOCK, roughly comparable to ARC. Use LIRS when scan-resistance matters and your workload has a clear hot set worth protecting.

Key Takeaway: LIRS beats LRU on scan-heavy workloads by measuring reuse distance instead of reuse time, so one-shot pages can't evict pages that are actually hot.

Tool Nobody Knows

ministat: The 300-Line BSD Tool That Tells You Whether Your Benchmark Is Actually Faster

2026-07-18

You changed a hot loop. You ran the benchmark. Old code: 1.42s. New code: 1.38s. Ship it?

No. You just committed the most common performance sin in software: reading the mean of two noisy samples and declaring victory. That 3% "improvement" might vanish tomorrow β€” or reverse. Poul-Henning Kamp got tired of watching FreeBSD hackers do this in the early 2000s and wrote ministat, a ~300-line C program that lives in FreeBSD base and packages fine on Linux (apt install ministat, brew install ministat).

It takes columns of numbers and runs Student's t-test. That's it. That's the whole thing.

# Collect 20 samples per variant β€” more is better
for i in $(seq 20); do /usr/bin/time -f %e ./old 2>>&1; done > old.txt
for i in $(seq 20); do /usr/bin/time -f %e ./new 2>>&1; done > new.txt

ministat -c 95 old.txt new.txt

Output β€” actual, not paraphrased:

x old.txt
+ new.txt
+--------------------------------------------------------------------------+
|      x                                                                   |
|   x  x     x                        +                                    |
|xx xx xx  xxxx  x           +      + ++  +  +   +                         |
|  |____AM____|                     |______MA______|                       |
+--------------------------------------------------------------------------+
    N    Min      Max     Median      Avg      Stddev
x  20  1.401    1.462     1.421    1.4235   0.017429
+  20  1.352    1.418     1.379    1.3805   0.019204
Difference at 95.0% confidence
    -0.043 +/- 0.011729
    -3.020% +/- 0.824%
    (Student's t, pooled s = 0.018349)

Three things worth staring at:

  • The ASCII box plot shows the distributions, not just means. You'll immediately spot the run where GC fired, or the outlier that was actually a background updatedb.
  • "Difference at 95.0% confidence" is what you were guessing at with your eyeballs. If ministat says "No difference proven at 95% confidence," your speedup is noise, no matter how nice the mean looked.
  • The reported delta comes with a confidence interval: -3.02% Β± 0.824%. That's the honest answer.

Why not just use hyperfine? Hyperfine runs the benchmark. Ministat analyzes samples from anywhere β€” ab latency dumps, database query timings, GC pause logs, CI build times pulled with jq. Pipe two columns of numbers in, get significance out. Hyperfine and ministat are complements: hyperfine --export-csv, then feed the columns to ministat when you want more than a single mean.

Useful flags:

  • -c 99.5 β€” tighter confidence (options: 80, 90, 95, 98, 99, 99.5). Papers usually want 99.
  • -C 3 β€” pull column 3 out of whitespace-separated data. Skips the awk step.
  • -w 74 β€” narrower plot for terminals or logs.
  • -q β€” kill the plot, just print numbers. Good for CI gates.
  • Passing 3+ files compares all against the first β€” regression bisects get compact.

The killer workflow: pipe your CI's benchmark job into a file per commit, then have a gate that runs ministat -q baseline.txt new.txt and fails only when the delta is significant and worse. You stop chasing 2% noise and stop shipping 8% regressions that hid inside variance.

Bonus history: PHK wrote it because he was tired of seeing benchmark arguments settled by whoever ran their test last. Twenty years later it's still 300 lines, still in FreeBSD base, still the correct answer.

Key Takeaway: A mean is a rumor; ministat is the evidence β€” feed it two columns of samples and it will tell you, with a t-test and a box plot, whether your "faster" is real or just variance wearing a costume.

What If Engineering

What If We Built a Skyscraper-Sized Ram Accelerator That Fired Freight Pods Between Cities Along a Buried Tube?

2026-07-18

A ram accelerator is a strange beast: a projectile shaped like the centerbody of a ramjet flies down a tube pre-filled with a premixed fuel/oxidizer gas. The projectile's own bow shock compresses the gas, ignites it behind the shoulder, and the resulting detonation pushes the projectile forward. No moving barrel parts, no plasma armatures β€” just chemistry chasing a bullet. UW-Seattle's lab has hit ~2.7 km/s with pound-scale projectiles. What if we scaled it up and buried one between Chicago and St. Louis to fling freight pods?

The setup. A 500 km buried tube, 2 m bore, pre-charged with segmented methane/oxygen mixtures at 5–50 atm. A 2-tonne pod (steel, tungsten nose) enters at Mach 3 via a light-gas gun pre-launcher, then rides staged detonations to Mach 8 (~2.5 km/s). It coasts most of the route in an evacuated section, then decelerates in a reverse ram section that extracts energy back into the working gas.

Energy budget. Kinetic energy of a 2000 kg pod at 2500 m/s:

KE = Β½ Β· 2000 Β· 2500Β² = 6.25 Γ— 10⁹ J β‰ˆ 1740 kWh

At $0.10/kWh electricity equivalent, that's $174 of energy per pod β€” cheaper than the diesel to truck 2 tonnes 500 km (roughly $200 in fuel alone). Trip time: ~3.5 minutes at cruise, vs. 7 hours by truck. A pod every 30 seconds gives ~240 tonnes/hour, comparable to a busy freight rail corridor.

Where physics starts pushing back.

  • Stagnation heating. At Mach 8 in a dense fuel mix, the nose sees stagnation temperatures near Tβ‚€ β‰ˆ TΒ·(1 + 0.2Β·MΒ²) β‰ˆ 4400 K. Tungsten melts at 3695 K. You need ablative or actively-cooled noses, and each pod loses maybe 5–10 kg of material per shot. Refurb between flights isn't optional.
  • Tube pressure integrity. Detonation peaks hit ~200 atm behind the projectile. A 2 m bore at 200 atm needs wall hoop stress Οƒ = PΒ·r/t. For steel at 400 MPa allowable, thickness = 200Β·10⁡·1 / 4Β·10⁸ = 5 cm of steel along the entire 500 km β€” that's ~6 million tonnes of pipe, roughly the steel in 700 Eiffel Towers.
  • Gas logistics. Each firing consumes the fuel mix in the accelerating section (~50 km). At 20 atm average and 2 m bore, that's ~3 tonnes of CHβ‚„/Oβ‚‚ per shot. 120 shots/hour = 8600 tonnes/day of premixed reactants. You've basically built a rocket-propellant plant next to every launch tube.
  • Seismic coupling. Each detonation dumps ~6 GJ into the tube walls in under a second β€” a magnitude 2.5 event. Fire one every 30 seconds and you're a persistent local earthquake source. Isolation mounts along the entire tube become the dominant cost.

The verdict. The energy math is startlingly favorable β€” kinetic transport is intrinsically cheap because you only pay the KE once, not continuously against rolling friction. The tube itself kills it: you're building a 500-km-long pressure vessel that also functions as a detonation chamber. Rail moves cargo at 0.02 kWh/tonne-km using 150-year-old technology. The ram accelerator moves it at 0.87 kWh/tonne-km but 100Γ— faster. It's a courier service for things that must arrive in minutes β€” organs, semiconductor masks, maybe munitions.

Key Takeaway: Chemistry-driven ram acceleration makes hypersonic freight energetically cheap, but the 500-km detonation-rated pressure tube β€” and the earthquake it produces every 30 seconds β€” is the real bill.

Wikipedia Rabbit Hole

Thin-film bulk acoustic resonator

2026-07-18

Right now, tucked inside your smartphone, there are tiny drums made of crystal being struck two billion times per second. They're called thin-film bulk acoustic resonators (FBARs), and without them, the modern wireless world would collapse into a screeching mess of overlapping signals.

Here's the problem they solve: your phone's antenna receives everything β€” Wi-Fi, LTE, 5G, your neighbor's baby monitor, cosmic microwave background. To pick out just one channel, you need a filter that's absurdly precise: it must pass, say, 2.4 GHz while brutally rejecting 2.5 GHz. Traditional inductor-capacitor filters can't come close to that sharpness at those frequencies. Ceramic filters are too big. So engineers did something wonderful: they gave up on electronics entirely and turned the signal into sound.

An FBAR is a wafer of piezoelectric material β€” usually aluminum nitride β€” sandwiched between two electrodes, suspended in mid-air over a tiny etched cavity. When your incoming radio signal hits the electrodes, the piezoelectric effect makes the crystal physically vibrate. The wafer thickness is tuned so that only one specific frequency creates a standing acoustic wave resonating between the top and bottom surfaces. Every other frequency gets swallowed. The resonance is then converted back into an electrical signal via the same piezoelectric effect. Radio in, sound in the middle, radio out.

The numbers are staggering:

  • The aluminum nitride layer is often less than a micrometer thick β€” thinner than a red blood cell.
  • Acoustic waves travel about 100,000 times slower than electromagnetic waves, which is why acoustic filters can be so much smaller than their electronic equivalents at the same frequency.
  • A single modern phone contains dozens of FBARs, one for each frequency band it needs to talk on.
  • The global market for these things is measured in billions of dollars a year, and most people have never heard the word "FBAR."

The technology has an interesting lineage. Quartz crystal oscillators β€” the ticking heart of every wristwatch since the 1970s β€” use the same piezoelectric principle, but at kilohertz frequencies. FBARs are essentially quartz watches scaled down and sped up by a factor of a million, then manufactured with the same photolithography that makes microprocessors. Agilent (later Avago, now Broadcom) commercialized them in the early 2000s, and by the time the iPhone arrived, they were already indispensable.

There's a poetic loop here worth savoring. The piezoelectric effect was discovered by the Curie brothers in 1880 by squeezing quartz crystals. A century and a half later, that same fundamental physics β€” squeeze a crystal, get electricity; apply electricity, watch it deform β€” is what allows a device in your pocket to distinguish "this millimeter of the electromagnetic spectrum" from "that millimeter of the electromagnetic spectrum" while you scroll through cat videos.

Down the rabbit hole: Every 5G connection you make routes through microscopic drums vibrating at gigahertz frequencies β€” the crystal-sound intermediary that makes modern radio possible.

Daily YT Documentary

Portrait of a Muralist on Fire (Short Documentary)

2026-07-18

Portrait of a Muralist on Fire (Short Documentary)

Channel: Mitchell Gaston (125 subscribers)

This short documentary follows Aly, a muralist working through brutal heat and exhaustion to complete a large-scale public artwork. Unlike time-lapse mural videos that skip past the hard parts, this one leans into the endurance side of the craft β€” the sun, the fatigue, the mental grind of standing on scaffolding for hours with a can of paint and a deadline.

The self-deprecating description ("an annoying man with a camera") hints at a filmmaker who's honest about the documentary process itself, which usually translates to a more intimate portrait than the polished corporate-style artist profiles you see elsewhere. At 125 subscribers, Mitchell Gaston is clearly a filmmaker early in his career, and these small-channel personal documentaries often carry more heart and specificity than big-budget productions.

Muralism is a physically demanding art form that rarely gets treated as such on camera. Most coverage focuses on the finished wall or the artist's statement. Watching someone actually endure the labor β€” scaling, sketching, mixing under a hot sun β€” gives you a real appreciation for what goes into the murals you walk past in your own city.

The other candidates skewed toward hashtag spam, Shorts, film festival promos, or generic "cinematic showcase" reels with no substantive content, making this the clear pick.

Why watch: An honest, unglamorous look at the physical endurance behind large-scale mural painting.

Daily YT Electronics

Digital Temperature Display Using Arduino | STEM Science Project

2026-07-18

Digital Temperature Display Using Arduino | STEM Science Project

Channel: BrightLab (40 subscribers)

This is a classic beginner electronics project that bundles three foundational skills into one build: reading an analog sensor, doing simple math to convert raw ADC values into meaningful units, and driving a character LCD. The LM35 is a great teaching sensor because its output is linear and calibrated in Celsius (10 mV per Β°C), which lets you see exactly how the Arduino's 10-bit ADC maps voltage to a numeric reading without the abstraction of a library doing everything for you.

Pairing an LM35 with an LCD is the natural next step after blinking an LED β€” you get sensing plus output on a real display, which starts to feel like a genuine instrument rather than a toy. The wiring is minimal (three pins on the sensor, standard HD44780 LCD hookup), so the video should be easy to follow at home even for someone still learning what a breadboard rail is for.

Caveat: the channel is very small (40 subscribers) and the description is brief, so production values may be modest β€” but the underlying project is legitimately educational and reproducible from a small parts kit.

Why watch: A tidy end-to-end intro to analog sensing and LCD output using the classic LM35, ideal for someone moving beyond blink sketches.

Daily YT Engineering

Git for Systems Engineering: Dalus Version Control

2026-07-18

Git for Systems Engineering: Dalus Version Control

Channel: Dalus (21 subscribers)

Version control is one of software engineering's most transformative practices, but systems engineering β€” the discipline that coordinates requirements, interfaces, architecture diagrams, and verification plans across mechanical, electrical, and software domains β€” has been remarkably slow to adopt it. Most systems teams still ship Word documents over email or wrestle with Requirements Management tools that don't diff, don't branch, and don't merge. This video from Dalus (a tiny 21-subscriber channel) walks through what a Git-style workflow actually looks like when applied to systems engineering artifacts rather than source code.

What makes this worth watching is the translation problem it tackles: systems engineering data is structured (requirements have IDs, traceability links, verification status), so naive text-diffing doesn't work. The video shows how Dalus models branching, merging, and change review for requirements and architecture β€” the same primitives that made Git indispensable to software teams, adapted for a domain where a "merge conflict" might mean two engineers changed the same interface spec.

Even if you never touch systems engineering tooling, the video is a useful case study in domain-specific version control design. Anyone who has thought about diffing JSON, YAML, or database schemas will recognize the same challenges here, and the solutions transfer.

Why watch: A rare, thoughtful look at applying Git's branch/merge/review model to structured systems engineering artifacts instead of plain text code.

Daily YT Maker

I Built the Worlds Ugliest CNC Table

2026-07-18

I Built the Worlds Ugliest CNC Table

Channel: Buckley Builds (367 subscribers)

Of the ten candidates, this is the only one that promises a real, narrated build with lessons learned rather than satisfying carving loops or thinly-veiled product pitches. Buckley picked up a Shapeoko Pro XL and needed a dedicated stand, so he followed a set of purchased CNC table plans β€” and by his own admission, the result was ugly.

That framing is exactly why it's worth watching. A build video where the maker openly critiques the outcome tends to be far more educational than a polished "look what I made" reel. Expect discussion of where the plans fell short, what he'd change about the torsion-box or 80/20 structure, how he handled dust collection routing, cable management, and whether the stand actually damps vibration well enough for a full-size hobby CNC. These are the practical, unsexy questions every new CNC owner runs into once the machine arrives.

The Shapeoko Pro XL is a common enough platform that his mistakes translate directly to viewers planning their own enclosure or table. And at 367 subscribers, the channel is small enough that the tone stays honest rather than sponsor-driven.

Why watch: An honest, self-critical CNC table build is more instructive than a dozen glossy shop tours.

Daily YT Welding

Watch a Branch Cutting Billhook Being Hand Forged! πŸ”₯#Blacksmith #Forging #Handmade

2026-07-18

Watch a Branch Cutting Billhook Being Hand Forged! πŸ”₯#Blacksmith #Forging #Handmade

Channel: Nande Blacksmith House (11 subscribers)

Caveat: today's crop is thin β€” nearly every candidate is a hashtag-spammed short with no real explanation. This one gets the nod because it names a specific, uncommon tool rather than just "amazing forging."

A billhook is a traditional European hand tool with a hooked blade, used for coppicing, hedgelaying, and cutting green wood β€” the curve pulls the branch into the cut rather than letting it slip away like a straight blade would. Different regions evolved wildly different billhook patterns (Yorkshire, Kent, Devon, Suffolk), and each geometry reflects the local wood and vegetation.

What makes forging one interesting is that the smith has to manage the transition from a thick spine to a thin cutting edge along a curving blade, then form the socket or tang for the handle. The curve also complicates heat treatment: you want a hard edge but a springy spine so the tool doesn't shatter when it hits a knot.

Even without narration, watching the raw stock progress into a recognizable billhook shape gives you a feel for how much material has to move and where the hammer has to land. A tiny channel (11 subs) doing an obscure traditional tool is exactly the kind of niche craft worth signal-boosting.

Why watch: A specific, regionally-distinctive traditional tool being forged from scratch β€” more focused than the generic "hot steel" shorts flooding the feed.