Daily Digest — 2026-09-03

26 newsletters today.

In this digest


Abandoned Futures

The Intel iAPX 432: The 1981 Object-Oriented Capability Processor Intel Bet the Company On, Killed in 1986, and That Every Secure Chip in 2026 Is Now Rediscovering

2026-09-03

In 1975 Intel started a project called the 8800. It was not a follow-on to the 8080. It was supposed to obsolete the entire idea of a microprocessor. Six years and hundreds of millions of dollars later it shipped as the iAPX 432, and Intel spent the next five years quietly walking away from every idea in it. In 2026, ARM, Google, and the UK Ministry of Defence are shipping silicon that reinvents those same ideas one at a time.

The 432 was a capability-based, object-oriented processor. Every memory reference went through a hardware-checked capability descriptor — a 128-bit token that named an object, its type, and the operations permitted on it. There were no raw pointers. The CPU enforced type safety, bounds, and access rights on every load. Garbage collection was a hardware primitive. Interprocess communication was a single instruction. Multiprocessor cache coherency was in the ISA. The intended systems language was Ada, which the Department of Defense had just mandated.

The chip set was staggering for 1981: the 43201 instruction decoder and 43202 execution unit formed the General Data Processor, joined by the 43203 Interface Processor for I/O. Roughly 225,000 transistors across two dies in 5-micron NMOS — bigger than a 68000, on a process that could barely hold them. Chief architect Justin Rattner (later Intel CTO) had built a processor that read a program's semantics before it read its bytes.

Then engineers ran benchmarks. The 432 was 5 to 10 times slower than an 8086 running at the same clock. Every instruction paid capability-lookup tax. The compiler couldn't hoist checks the hardware insisted on redoing. Ada was immature and generated bloated code. The two-chip GDP couldn't be pipelined the way Motorola pipelined the 68020. A 1982 New York University study famously showed the 432 losing to a VAX-11/780 by margins so large that Intel's own marketing stopped citing performance.

Meanwhile the IBM PC shipped with an 8088. The 80286 arrived in 1982, the 80386 in 1985. Every dollar of customer demand went to x86 compatibility. Intel officially killed the 432 in 1986 and redirected the team into what became the i960 — a conventional RISC that stripped out every capability feature.

Why it works now. The 432 was crushed by three constraints that no longer bind:

  • Silicon budget. A capability tag that cost 40% of a 1981 die costs rounding-error area on a 3nm node. Cambridge's CHERI project (started 2010) added capability enforcement to a MIPS, then RISC-V, then ARMv8 core with ~7% performance overhead — a number Intel would have killed for in 1982.
  • Compiler maturity. LLVM can lower C and Rust to capability instructions automatically. The 432 needed hand-written Ada; CHERI-Clang recompiles FreeBSD.
  • The threat model changed. In 1982 nobody was chaining ROP gadgets across memory-safety bugs. In 2026 memory-safety CVEs are ~70% of all critical vulnerabilities. Hardware-enforced object bounds and non-forgeable pointers are suddenly worth a 7% tax.

ARM's Morello prototype (2022) is a Neoverse N1 with CHERI capabilities — capability descriptors, sealed objects, hardware type enforcement. It is, feature for feature, an iAPX 432 that happens to be 40 years faster. Google's silicon team has been evaluating CHERI-RISC-V for Android since 2024. The UK's Digital Security by Design programme has committed £70 million to shipping it.

The 432 wasn't wrong. It was early, in the specific technical sense that its per-check overhead was 100x what silicon could hide. That number crossed the viability threshold around 2015. Everyone building "secure processors" now is quietly finishing Justin Rattner's homework.

Key Takeaway: The iAPX 432 wasn't a bad architecture — it was a 2020s architecture built on 1981 silicon, and every capability-based secure processor shipping today is quietly finishing the job Intel abandoned in 1986.

ArXiv Paper Digest

SchedBlame: Who Ran While You Waited? Culprit-Attributed CPU Contention for Containers on Stock Kernels

2026-09-03

Authors: Hao Li, Tonghao Zhang, Honglei Wang

ArXiv: 2609.02052v1

PDF: Download PDF

Imagine you're running a busy restaurant kitchen where multiple chefs share the same stove. One chef's dish keeps coming out late, and you need to know why. Every existing tool can tell you "this chef waited 20 minutes for a burner" — but none can tell you which other chef was hogging it. That's the exact problem this paper tackles, except the "kitchen" is a Linux server and the "chefs" are containers (think Docker) competing for CPU time.

The problem in plain terms: When you pack many containers onto one machine to save money (which basically every cloud provider does), they fight for CPU. When one gets slow, operators today can only see victim-side signals — metrics that say "container A waited a lot" but not "container B is the reason." Finding the culprit currently requires either patching the Linux kernel (which most people can't do on cloud VMs), running heavyweight tracing (too expensive to leave on all the time), or making statistical guesses (unreliable when multiple victims exist at once).

What SchedBlame does: It's a lightweight monitoring tool that runs on a stock, unmodified Linux kernel and directly attributes CPU contention to the specific container causing it. Instead of just recording "you waited," it records "you waited, and here's exactly who was running instead of you." It does this by hooking into the kernel's scheduler using eBPF (a modern Linux feature that lets you safely run small programs inside the kernel without patching it) to capture the moment one task gets kicked off the CPU in favor of another — and then rolls those events up per-container.

Why the trick is clever: The naive approach — trace every context switch everywhere — generates so much data it slows the whole machine down. SchedBlame's insight is that you only need to record blame events when a container is actually being starved, and you can aggregate the culprits cheaply on-the-fly rather than post-processing terabytes of traces. That makes it cheap enough to leave running 24/7 in production.

Who cares:

  • Cloud operators debugging "noisy neighbor" complaints from customers
  • SRE teams running mixed workloads (batch jobs next to latency-sensitive services)
  • Kubernetes shops where pod density is squeezed for cost — this is where noisy neighbors hurt most

Anyone who's ever stared at a Grafana dashboard showing high CPU wait and thought "yes, but why?" has felt this exact pain.

Why it matters: Turns a decades-old blind spot in Linux — knowing your container is slow but not knowing who's stealing your CPU — into a cheap, always-on production signal that works without kernel patches.

Daily Automotive Engines

Camshaft Duration at 0.050" Lift: The Industry-Standard Measurement That Actually Matters

2026-09-03

When a cam grinder advertises "230 degrees of duration," that number is almost always measured at 0.050 inches of tappet lift, not at the moment the lobe first cracks the valve open. This convention exists because the ramp portions of a cam lobe — the "clearance ramps" and initial opening — barely flow any air and vary wildly between grinders. Duration at 0.050" gives a repeatable, apples-to-apples comparison.

Advertised duration vs. 0.050" duration: Advertised duration is typically measured at 0.006" lift (or sometimes when the lifter first starts to move). This includes all the slow-motion ramp area where the valve is barely off its seat. Advertised numbers are always larger — often by 50 to 70 degrees — and are essentially marketing fluff.

Rule of thumb for street vs. race:

  • Stock cam: ~195–210° at 0.050"
  • Mild street performance: 210–225° at 0.050"
  • Aggressive street/strip: 225–245° at 0.050"
  • Full race: 250°+ at 0.050"

Why 0.050" matters for airflow: Below about 0.050" lift, a valve barely flows any meaningful CFM — the port is essentially closed by the valve head shrouding the seat area. Real airflow begins once the valve is well off the seat, so duration at 0.050" correlates strongly with the amount of time the engine actually breathes.

Concrete example: A Comp Cams XE274H Chevy small-block cam has advertised duration of 274°/286° (intake/exhaust) but only 230°/236° at 0.050". That 44-degree difference is entirely opening and closing ramp — motion that moves the lifter but doesn't flow appreciable air. Two cams with identical advertised duration can have drastically different 0.050" numbers depending on ramp aggressiveness, and the one with more 0.050" duration will make more top-end power (at the cost of low-end torque and idle quality).

Simple calculation — cam "aggressiveness": Subtract 0.050" duration from advertised duration. A difference under 50° indicates an aggressive lobe with fast ramps (more area under the lift curve, more airflow for a given duration). A difference over 65° means a soft, slow-ramping lobe — often gentler on valvetrain but less efficient at making power.

This is why comparing cams by advertised duration is nearly useless — a "280-degree cam" from one grinder may behave like a "260-degree cam" from another. Always compare at 0.050".

See it in action: Check out Body Identical Hormones Don
#39;t Need To Come From A Compounding Pharmacy (1) by Dr. Mary Claire Haver, MD to see this theory applied.
Key Takeaway: Duration at 0.050" lift is the only camshaft spec worth comparing between grinders because it filters out the marketing-friendly but airflow-irrelevant ramp motion of advertised duration numbers.

Daily Debugging Puzzle

Go's sql.Rows.Next() Loop Trap: The Query That "Succeeds" With Half the Rows

2026-09-03

This function loads all users with a given role. It compiles, passes tests against a happy-path SQLite in the test suite, and ships to production. Then, one afternoon, half of the admin dashboard's user list vanishes — but no error is logged, no alert fires, and the query re-run from a psql shell returns every row. The Go code just quietly returned a shorter slice.

func GetUsersByRole(db *sql.DB, role string) ([]string, error) {
    rows, err := db.Query(
        "SELECT name FROM users WHERE role = $1", role,
    )
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var names []string
    for rows.Next() {
        var name string
        if err := rows.Scan(&name); err != nil {
            return nil, err
        }
        names = append(names, name)
    }
    return names, nil
}

The Bug

The loop condition rows.Next() returns false for two reasons: iteration finished normally, or the driver hit an error while streaming rows from the server. There is no way to tell the two apart from inside the loop. The only signal is rows.Err(), which you must call after the loop exits.

What kinds of errors surface here? Network hiccups mid-result-set. Server-side timeouts on long queries. TLS renegotiation failures. Row-encoding errors from a driver that only discovers a bad column type partway through streaming. A connection killed by the DBA's pg_terminate_backend. None of these produce an error from db.Query — that call only initiates the query; the rows arrive lazily as the driver reads from the socket. When the socket dies at row 47 of 200, Next() returns false, the loop exits cleanly, and you return 46 names with a nil error.

This is worse than a crash. A crash is loud. This silently returns a truncated dataset. Downstream code — a permission check, a billing rollup, a "notify all admins" fan-out — operates on the partial slice with full confidence. In an admin-notification path, missing users don't get paged. In a "delete users not in this list" reconciliation, missing users get deleted.

The defer rows.Close() line looks like a safety net but doesn't help: Close's error is discarded, and even if you captured it, the underlying iteration error is only reliably exposed through rows.Err().

The Fix

Always call rows.Err() after the loop, before returning the results:

    for rows.Next() {
        var name string
        if err := rows.Scan(&name); err != nil {
            return nil, err
        }
        names = append(names, name)
    }
    if err := rows.Err(); err != nil {
        return nil, err
    }
    return names, nil

A few adjacent notes worth internalizing:

  • rows.Scan errors are returned inline, so checking them inside the loop is correct — but scan errors and iteration errors are disjoint failure modes. You need both checks.
  • The same pattern applies to *sql.Row's cousin, QueryRow, only there the deferred error surfaces from Scan itself, so a single check suffices.
  • If you use sqlx, Select and Get handle this for you; the bug reappears the moment you drop back to raw rows.Next().
  • A linter rule (rowserrcheck in golangci-lint) exists specifically for this. Turn it on. It catches every instance in a codebase in about two seconds and has essentially zero false positives.

The reason this pattern is a trap and not just an oversight is that the loop looks exhaustive. In every other Go iteration idiom — range over a slice, a channel, a map — loop exit means "done." sql.Rows is one of the few standard-library iterators where loop exit means "done or broken," and you have to ask a follow-up question to find out which.

Key Takeaway: After every for rows.Next() loop, call rows.Err() — otherwise mid-stream driver failures return a silently truncated result set with a nil error.

Daily Digital Circuits

Wake-Up and Select Logic in Out-of-Order Schedulers: How Hardware Fires Dependent Instructions the Cycle After Their Producer Completes

2026-09-03

Tomasulo tells you what reservation stations do, but the real question is: how does an instruction sitting in one know, within a single cycle, that its operand just became available? That's the job of wake-up and select logic, and it's one of the tightest, most power-hungry loops in a modern CPU.

Every entry in the issue queue holds two source tags — the physical register numbers it's waiting on. When any function unit completes, it broadcasts its destination tag on a set of tag CAM lines that run past every issue queue entry. Each entry XORs the broadcast tag against its stored source tags with a CAM cell. A match asserts a "ready" bit for that operand. When both operand bits are ready, the entry raises a request line.

Then select logic picks winners: multiple entries may become ready in the same cycle, but the machine can only issue N of them (issue width). A priority tree — usually oldest-first, sometimes a matrix arbiter — picks up to N requesters and generates grant signals. Grants gate the operands out of the physical register file (or the bypass network) and drive them to the function units.

Here's the killer constraint: wake-up + select + operand-read must all fit in one cycle if you want back-to-back dependent instructions. Consider a chain ADD r1, r2, r3ADD r4, r1, r5. If the first ADD finishes in cycle T, the second must issue in cycle T+1. So the T→T+1 boundary contains: broadcast r1's tag → CAM match → operand-ready OR → request → priority select → grant → operand mux. That whole loop is the "scheduler critical path" and it's often what caps your frequency.

Rule of thumb: the wake-up CAM has O(W × N) cells, where W = issue width and N = queue size. Doubling issue width roughly doubles wake-up power and often lengthens the critical path by ~15%. That's why Intel's Skylake stuck at 4-wide issue for years — the scheduler loop wouldn't shrink at higher frequency without exploding power.

Concrete example: AMD's Zen 4 has a 96-entry integer scheduler, 4 ALU ports, 3 AGU ports. That's 7 destination tags broadcasting per cycle across ~192 source-tag CAM cells (96 × 2). Each broadcast burns picojoules; Zen 4 spends roughly 8% of core power just on scheduler wake-up. Some designs (POWER, older Alpha) split the queue into per-port sub-queues to shrink the CAM at the cost of load-balancing headaches.

When you hear an architect say "we couldn't afford another issue port," this is what they mean: not silicon area, but that one-cycle CAM loop that everything else waits on.

Key Takeaway: Wake-up and select is the one-cycle CAM-broadcast-plus-arbitration loop that decides which ready instructions issue next, and its critical path is usually what limits how wide a superscalar core can grow.

Daily Electrical Circuits

Op-Amp Slew Rate: The Hidden Bandwidth Limit That Doesn't Show Up on Bode Plots

2026-09-03

You designed an op-amp circuit with 10 MHz gain-bandwidth product, verified the small-signal Bode plot, and cranked up the signal. Suddenly a 100 kHz sine wave looks like a triangle wave. Welcome to slew rate limiting — the large-signal cousin of bandwidth that ambushes designers who only think in small-signal terms.

Slew rate (SR) is the maximum rate the output can change, in volts per microsecond. It's set by the internal compensation capacitor Cc and the tail current Itail of the input differential pair: SR = Itail / Cc. When the input step is large enough to steer all the tail current into one side, the compensation cap charges at a constant rate — the amplifier becomes an integrator, not a linear system.

The full-power bandwidth formula: for a sine wave Vp·sin(2πft), the peak slope is 2πfVp. To avoid distortion:

  • fmax = SR / (2π · Vp)

Concrete example: the classic LM358 has SR = 0.6 V/μs. You want a 10 V peak-to-peak sine wave (Vp = 5 V) at the output. Maximum undistorted frequency:

  • fmax = (0.6 × 106) / (2π × 5) ≈ 19 kHz

Even though the LM358's GBW is 1 MHz, above 19 kHz your 10 Vpp sine wave turns into a lopsided triangle. Drop the amplitude to 100 mVp and you get back to nearly the full 1 MHz — small signals don't slew-limit.

Practical consequences:

  • Audio amplifiers need SR ≥ 2πfmaxVp. For a 20 Vp output at 20 kHz: SR ≥ 2.5 V/μs. Use ≥ 5 V/μs for margin against harmonic distortion.
  • Video and pulse circuits care about rise time. A slew-limited op-amp gives tr ≈ ΔV / SR, independent of frequency response.
  • Comparator misuse: using a slow op-amp as a comparator gives output slew times measured in microseconds, wrecking timing accuracy.
  • Slew-induced distortion (SID/TIM): even at frequencies below fmax, transients that momentarily exceed SR cause the feedback loop to open briefly — audible as harsh distortion on percussive material.

Rule of thumb: pick SR at least 3–5× the theoretical minimum. For general-purpose 12 V systems handling signals up to 100 kHz, target 20+ V/μs (LM7171, LT1360, AD8065 territory). For precision DC work you often want a slow op-amp on purpose — high SR usually costs input offset voltage.

Key Takeaway: Gain-bandwidth product tells you the small-signal limit; slew rate tells you the large-signal limit — always compute fmax = SR/(2πVp) for your worst-case output swing before trusting the datasheet's headline bandwidth number.

Daily Engineering Lesson

Viscous Dampers for Seismic and Wind Protection: Turning Building Motion into Heat

2026-09-03

Tuned mass dampers cancel motion with a counter-oscillating weight. Viscous dampers take a different approach: they let the building move, but they bleed the kinetic energy out as heat by forcing silicone fluid through small orifices. No tuning, no resonant frequency to match, no giant pendulum eating floor space — just a piston-and-cylinder shock absorber the size of a semi trailer, bolted diagonally into the structural frame.

The physics is the same as an automotive shock absorber, scaled up 1000x. When the building sways, the diagonal brace containing the damper stretches or compresses. That motion drives a piston through a cylinder of viscous silicone fluid. Fluid squeezes through calibrated orifices in the piston head, and the pressure drop across those orifices generates a resisting force. That force, multiplied by the velocity of the piston, is power dissipated as heat.

The defining equation is F = C · v^α, where C is the damping coefficient, v is piston velocity, and α (typically 0.3–1.0) is the velocity exponent. A linear damper (α=1) gives force proportional to velocity — predictable but grows fast at high speeds. A nonlinear damper (α≈0.4) caps force at high velocities, protecting the structural connections during extreme events while still absorbing energy at low speeds.

Real-world example: Torre Mayor in Mexico City — 55 stories, sitting in one of the most seismically active capitals on Earth — uses 98 Taylor Devices viscous dampers arranged in diagonal and chevron braces throughout its megaframe. During the 2003 Colima earthquake (M7.6), occupants reported barely feeling the shaking. The dampers dissipated roughly 40–50% of the earthquake's input energy as heat, while the surrounding older buildings sustained damage. Each damper is roughly 20 feet long and rated for over 250 tons of force.

Rule of thumb for sizing: Target a supplemental damping ratio of 15–30% of critical. A bare steel frame has intrinsic damping of only 1–2%. Adding viscous dampers to reach 20% cuts peak displacement roughly by a factor of √(0.20/0.02) ≈ 3x, and cuts peak acceleration by a similar amount — which is what actually determines whether people get thrown out of bed or filing cabinets tip over.

Key design considerations:

  • Velocity-dependent, not displacement-dependent — dampers do nothing under static wind load; they only work when the building is actively moving.
  • Out of phase with springs — peak damper force occurs at zero displacement (max velocity), so damper forces don't add to peak column stresses.
  • Fluid seals are the weak point — silicone fluid must stay contained for 50+ years with zero maintenance access.
  • Thermal capacity — a major earthquake dumps megajoules into the fluid in seconds; the cylinder mass acts as the heat sink.
See it in action: Check out Fluid Viscous Dampers! by Civil Tech Zoners to see this theory applied.
Key Takeaway: Viscous dampers protect buildings by converting sway velocity into heat through fluid orifices, adding 15–30% supplemental damping without needing to match any specific frequency.

Forgotten Books

The 1901 Textile Manual That Warned You About Buying Clothes Under Store Lights

2026-09-03

Book: Colour-matching on textiles : a manual intended for the use of dyers, calico printers, and textile colour chemists by David Paterson (1901)

Read it: Internet Archive

Anyone who has bought a navy suit under fluorescent department-store lighting only to discover in the parking lot that it is actually black — or worse, a muddy purple — has personally rediscovered a phenomenon that David Paterson tried to warn the industrial world about in 1901.

Paterson's Colour-matching on Textiles was a working manual for dyers and calico printers, aimed squarely at practical shop-floor problems. Its most striking feature was a coloured frontispiece plate showing the same swatches of dyed cloth twice, side by side, under two different light sources. The caption is matter-of-fact:

"This Plate illustrates the abnormal modification in some dyed shades under artificial light. See Chapter IX."

In the preface, Paterson lays out why this deserved a whole book of its own:

"The subject is a comprehensive one, comprising as it does the study of colour-perception, the qualities of daylight, the optical properties of the fibres and dyestuffs employed, and also the influences of artificial illumination on colour appearances."

What Paterson was documenting — with dyed patterns bound into the appendix so a working colourist could compare fabric-to-fabric — is now called metamerism. Two samples can reflect light in ways that appear identical under daylight, yet diverge sharply under gaslight, incandescent bulbs, or fluorescents, because the spectral output of each light source is different and the dyes reflect different portions of the spectrum. It is not an illusion or a rare edge case; it is baked into how pigments and human vision interact.

Paterson was not the first to notice this — dyers had grumbled about "gaslight shades" for decades — but his manual is a remarkably early attempt to treat it as a systematic problem rather than a mysterious nuisance. He anticipated by roughly half a century the standardised viewing booths (using calibrated D65 daylight and CWF fluorescent lamps) that the textile, paint, cosmetics, and automotive industries now consider mandatory. Modern colour scientists have entire ISO standards devoted to metameric index calculation. Paterson essentially wrote the practitioner's version in 1901, with actual dyed cloth glued into the back so you could see the effect with your own eyes under your own lamp.

The forgotten part isn't the phenomenon itself — it's the habit of skepticism Paterson was trying to teach. Victorian dyers were expected to internalise that a colour match is only valid under a specified light. Today most consumers have lost that instinct entirely. We buy foundation makeup under LED store lights, judge paint chips under warm household bulbs, and match socks in dim closets, then blame ourselves for the mismatch. Paterson's manual quietly insisted that the light source is half the equation — a piece of practical wisdom that would save shoppers real money if it were still common knowledge.

The next time a "black" shirt turns out to be dark brown in sunlight, remember: a Scottish colour chemist bound the warning into his book 124 years ago, with actual fabric samples, because he assumed no one would believe it otherwise.

The forgotten claim: Two colours that match under one light source can look completely different under another — a fact Victorian dyers treated as fundamental, and modern shoppers keep painfully rediscovering.

Forgotten Darkroom

The Analog Asset Management System That Tracked a Single Chrysanthemum Photo for Twelve Years

2026-09-03

Book: Chrysanthemum azaleamum by McFarland, J. Horace (John Horace), 1859-1948 (1923)

Read it: Internet Archive

What looks at first glance like nonsense OCR is actually one of the most sophisticated commercial photography tracking systems ever built — and it ran on paper. The "book" is really a card catalog from J. Horace McFarland's horticultural photography archive, and each card followed a single glass negative from creation through every commercial use across decades.

Look at what one card records for a single chrysanthemum negative:

THIS NEGATIVE HAS BEEN USED... Used ae Gelber Cuatuoe (h-b~ $0... Enel we W-25-57 on order? x¢ 972... /b-2-59 tw edlew... 8-AV-62trmds KF Y/277A

Decoded from the handwriting: this single flower photograph was used in the Gelber Catalogue in June 1950, re-licensed on order #972 in November 1957, appearing again in June 1959, and still generating revenue in August 1962. One negative, twelve years of tracked commercial reuse, every transaction penciled onto the same card.

Who was McFarland? John Horace McFarland (1859–1948) ran Mount Pleasant Press in Harrisburg, Pennsylvania — the printer that produced nearly every serious American nursery catalog of the early 20th century. He was also the first president of the American Civic Association and lobbied Theodore Roosevelt so effectively that historians credit him as a critical force behind the creation of the National Park Service in 1916. On the side, he built what may have been the largest horticultural photo archive in North America.

The cards reveal his system:

  • Unique ID first: Every negative got a serial number (3XX2094, 3XX2101, etc.) — years before Kodak standardized negative numbering.
  • Provenance tracked: "Origin" recorded which nursery or garden supplied the specimen, so the botanical claim could always be traced back.
  • Reuse logged, not assumed: Every reprint, every catalog placement, every color-plate order was added to the card. The negative wasn't sold — it was licensed, again and again.
  • Color coordination: Notations like "COLOR NO. 3-361" cross-referenced to a master color chart, so a chrysanthemum photographed in 1933 could be reprinted with matching hues in 1962.

Why this matters now: Every stock photography agency, every Digital Asset Management (DAM) platform, every Adobe Bridge metadata field is doing exactly what McFarland's card system did — tracking a unique asset, its provenance, its color profile, and its licensing history. Getty Images did not invent this workflow in 1995; a Pennsylvania printer had it running by 1923, powered by pencils and a filing cabinet.

The forgotten skill isn't the archive itself — it's the discipline that made it work. A photographer today shoots 2,000 frames of a wedding and never opens 1,900 of them again. McFarland treated each negative as an income-producing asset for the rest of its physical life. The card that started as "Chrysanthemum, variety Michael, October 1923" was still earning royalties when Eisenhower was president.

The forgotten claim: A single well-catalogued photograph can generate revenue for forty years — but only if you build the tracking system to prove it, and the discipline to update the card every single time.

Forgotten Patent

Stephanie Kwolek's "Optically Anisotropic Aromatic Polyamide Dopes": The 1965 DuPont Discovery That Invented Kevlar — and Now Reinforces Every Fiber-Optic Cable, Mars Parachute, and Lithium Battery on Earth

2026-09-03

In 1964, DuPont chemist Stephanie Kwolek was assigned a mundane problem: find a lighter, stiffer fiber to replace steel tire cord before the coming gasoline crunch made fuel economy urgent. What she found instead was a class of polymers so strange her colleagues almost threw it away.

Working with rigid-rod aromatic polyamides — molecules that refused to coil like normal polymer chains — Kwolek produced a solution in 1965 that looked wrong. Polymer solutions are supposed to be clear and syrupy. Hers was cloudy and thin, like watered milk. The lab technician running the spinneret initially refused to push it through the equipment, worried the odd fluid would clog the machinery. Kwolek insisted. The fibers that came out were five times stronger than steel by weight.

The cloudy appearance was the key: the rigid molecules were spontaneously lining up into liquid crystals even in solution. When forced through a spinneret, they emerged already aligned — the fiber inherited a molecular orientation no spinning process could otherwise achieve. Kwolek had discovered the first synthetic liquid-crystalline polymer.

The core patent — US 3,671,542, "Optically Anisotropic Aromatic Polyamide Dopes," filed May 1970 and granted June 1972 — describes the sulfuric-acid solutions of poly-paraphenylene terephthalamide (PPTA) that make Kevlar spinnable. Follow-on patents including US 3,819,587 (1974) cover the fibers themselves. Commercial Kevlar shipped in 1971.

Why the technique was ahead of its time. Polymer science in 1965 assumed you strengthened fibers by drawing them — physically stretching a cooled thread to align its molecules. Kwolek's approach inverted this: get the molecules to align themselves in solution, then just extrude them. This liquid-crystal-polymer (LCP) principle now underlies:

  • Ultra-high-modulus fibers — Vectran (used in the airbags that landed the Mars Pathfinder and Perseverance rovers), Zylon (fencing gear, tethers), Twaron (competitor to Kevlar)
  • LCP films and connectors — every high-frequency 5G/mmWave flex circuit uses Vectra or Zenite LCP substrates because they don't absorb radio energy the way conventional plastics do
  • Fiber-optic strength members — nearly every submarine cable, aerial fiber run, and FTTH drop has yellow aramid yarn (Kevlar or a cousin) as its tensile core; the glass fiber carries data, the aramid carries the load
  • Lithium-ion separators and structural batteries — aramid nanofiber separators are being commercialized because they don't melt during thermal runaway the way polyethylene does
  • Bulletproof vests — the IACP estimates 3,000+ U.S. police lives saved since 1975
  • Aerospace composites — Boeing 787 secondary structures, helicopter rotor blades, spacecraft micrometeoroid shielding

The "too modern" quality. Kevlar wasn't just a stronger material — it was the first commercial proof that molecular self-organization could beat mechanical processing. That idea is now the foundation of everything from block-copolymer lithography (semiconductor patterning at 7nm and below) to self-assembling peptide scaffolds in tissue engineering to DNA origami. The industrial recipe of "dissolve, let the molecules line themselves up, then freeze the alignment" traces directly to that cloudy beaker in 1965.

Kwolek received a $10,000 bonus and, decades later, the National Medal of Technology. DuPont's Kevlar business now exceeds $1B/year. And when NASA needed a fabric that could survive the 1,500°C descent of the Perseverance rover's supersonic parachute, they didn't invent something new — they wove Kwolek's fiber.

Key Takeaway: Kwolek's willingness to spin a "wrong-looking" solution in 1965 revealed that molecules can align themselves — the founding principle behind every liquid-crystal polymer, self-assembled nanomaterial, and Kevlar-reinforced cable in use today.

Daily GitHub Zero Stars

dee0917/apex-commerce-ai

2026-09-03

Among a sea of randomly-named repos with no descriptions, apex-commerce-ai stands out with an audaciously ambitious tagline: "The Universe-First Autonomous E-Commerce Engine (v12.0)." That's the kind of description that either signals a joke, a manifesto, or a genuinely interesting experiment — and any of those are worth a click.

The project appears to be an early-stage attempt at building a fully autonomous e-commerce platform, presumably one that handles product sourcing, listing, pricing, marketing, and fulfillment with minimal human input. The "v12.0" versioning on a zero-star repo hints at either a private iteration history the developer is finally publishing, or a stylistic choice meant to convey maturity. Either way, it's intriguing.

What makes this worth a look:

  • Ambitious scope — autonomous commerce is a hard problem that touches LLMs, agents, payments, inventory, and marketing automation all at once.
  • Solo-dev energy — the phrasing suggests a builder with a strong vision, not a corporate skunkworks. These are often the most creative repos to browse.
  • Reference material — even if the code is rough, the architecture choices (agent frameworks, LLM orchestration, storefront integrations) could spark ideas for your own projects.

Who might find it useful:

  • Indie hackers experimenting with agentic AI for dropshipping or print-on-demand businesses.
  • Developers curious how someone tries to wire together LLMs, e-commerce APIs (Shopify, WooCommerce), and payment rails into a single autonomous loop.
  • Anyone researching the "AI agent + real business" intersection who wants to see raw, uncensored attempts rather than polished demos.

The lack of stars means you'll be one of the first to peek behind the curtain. Repos like this are often more valuable for their attempted architecture than their working code — you get to see how a builder thinks about the problem before the design ossifies.

Why check it out: A solo builder's audacious swing at fully autonomous e-commerce — worth a peek for anyone interested in agentic AI applied to real revenue-generating systems.

Daily Hardware Architecture

The Uop Cache's Fetch-Address-Based Set Indexing: Why Two Loops at Different Addresses Never Conflict

2026-09-03

The uop cache (Intel calls it the DSB — Decoded Stream Buffer) is a set-associative structure, and like any cache it needs a way to map addresses to sets. The choice Intel made is subtle and has real performance consequences: the set index is derived from the fetch address of the 32-byte instruction window, not from the individual uop's logical address or its position within a basic block.

On Skylake through Alder Lake, the DSB has 32 sets, 8 ways per set, and holds up to 6 uops per line. The set index comes from bits [9:5] of the fetch address — meaning any two 32-byte code windows whose linear addresses differ by a multiple of 1024 bytes (32 sets × 32 bytes) will land in the same set and compete for the same 8 ways.

This produces a counterintuitive result: two hot loops at different addresses almost never conflict, because random code layout scatters them across the 32 sets. But aligned code layout — say, functions padded to 1KB boundaries, or a jump table where every entry sits at a 1024-byte offset — can pile every hot fetch window into a single set, exhausting the 8 ways and evicting uops that were about to be re-fetched.

Concrete example: A tight inner loop of 96 bytes (three 32-byte fetch windows) normally occupies 3 sets, 1 way each — trivial to fit. But if a linker aligns hot functions to 1024-byte boundaries, and the loop body sits alongside 7 other similarly-aligned hot code paths, all 8 ways in that set fill up. Adding a 9th hot path evicts one — and if that eviction hits your loop, you fall back to legacy decode at ~4 uops/cycle instead of DSB's 6 uops/cycle. On a workload where the front-end was already the bottleneck, this is a measurable 30%+ throughput loss.

Rule of thumb: If perf stat shows idq.dsb_uops dropping while idq.mite_uops rises during a specific phase, and your linker aggressively aligns functions to power-of-two boundaries ≥1KB, suspect DSB set conflicts. The fix is often as simple as passing -falign-functions=32 instead of -falign-functions=1024 to your compiler.

The deeper lesson: DSB capacity in uops (about 1536 on Skylake) tells you nothing about whether your code fits. Set conflicts can make a 96-byte loop uncacheable while a 4KB loop with scattered addresses fits comfortably. Effective DSB capacity is not a number — it's a distribution.

See it in action: Check out CompTIA A+ Core 1 (220-1201) Full Certification Course by PowerCert Animated Videos to see this theory applied.
Key Takeaway: The uop cache indexes by 32-byte fetch window address, so aligned code layouts concentrate hot paths into a few sets and cause conflict evictions long before total uop capacity is reached.

Hacker News Deep Cuts

Io_uring I/O Can Outlive a Reaped Process

2026-09-03

There's a comfortable mental model that most systems programmers carry around: when a process dies, the kernel cleans up after it. File descriptors close, memory unmaps, pending syscalls unwind. It's one of the load-bearing assumptions behind supervisors, crash-only software, and every "just kill -9 it" ops runbook ever written.

This post from the YDB team pokes a rather alarming hole in that assumption. With io_uring, in-flight I/O operations submitted to the kernel's shared ring buffer can outlive the process that submitted them — even after the process has been reaped and its PID is gone. The kernel worker threads servicing those operations don't know or care that userspace has departed; they continue writing to buffers, touching files, and completing operations that belong to a ghost.

Why this matters for anyone building storage engines, databases, or high-throughput I/O layers:

  • Restart safety is broken. If your supervisor kills a process and immediately restarts it, the new instance can race against zombie writes from the previous instance. Corruption follows.
  • Buffer lifetime is subtle. Any memory registered with the ring — including buffers passed by pointer to a write — must remain valid until the kernel is truly done with it, not until the process exits. This inverts normal RAII assumptions.
  • File descriptor recycling gets scary. A pending write against fd 7 in the dead process could land in whatever fd 7 becomes in the new one, if you're not careful about how sockets and files are handed off.
  • Container and cgroup boundaries don't help. The kernel worker threads sit outside the process's own accounting in ways that surprise you.

YDB is a distributed SQL database, so this isn't academic hand-wringing — they hit these issues while trying to use io_uring for its promised throughput wins over epoll and threaded I/O. The post is worth reading because it's a concrete case study of how a "faster syscall interface" is actually a fundamentally different lifetime model glued onto a POSIX process abstraction that wasn't designed for it.

As io_uring adoption grows in databases (ScyllaDB, TigerBeetle, Ceph experiments) and language runtimes (Rust's tokio, Node's libuv exploration), these subtleties will bite more people. Better to read the postmortem than write your own.

Why it deserves more upvotes: A concrete, hard-won lesson about how io_uring quietly violates the "process death cleans up I/O" assumption that decades of Unix programming is built on.

HN Jobs Teardown

EverQuote: What Their Hiring Reveals

2026-09-03

Source: HN Who is Hiring

Posted by: kwanlee

EverQuote is a publicly-traded insurance marketplace, but this posting isn't for the core marketplace team — it's a manager (klee) using a personal Gmail-style alias ([email protected]) to recruit for a brand-new business line. That framing alone tells you almost everything.

The stack is a "greenfield inside a giant" tell. The list — reactjs/nextjs/python/redis/kafka/aurora/stream/pandas/graphql/mobile — is not a coherent product architecture. It's a wish-list spanning three distinct problem domains:

  • Consumer-facing product: React, Next.js, GraphQL, mobile — a modern SSR-rendered funnel, probably for quote flows.
  • Event-driven backend: Kafka + Redis + Aurora — classic "we're going to ingest carrier data and user events at volume" pattern.
  • Analytics/ML plumbing: Python + Pandas + "stream" — someone wants to do real-time pricing, risk scoring, or lead-quality models.

No single engineer uses all of that. Listing it means the team is small enough that individuals wear all three hats, or they haven't decided the architecture yet and are hedging.

What it reveals about the company. EverQuote's existing business is lead generation — they sell consumer leads to insurance agents. The phrasing "building a new business in the insurance space" and "forever transform the industry" strongly suggests they're moving downstream: becoming a carrier, MGA, or direct-to-consumer policy seller rather than a lead broker. That's the natural evolution for any lead-gen business that's tired of watching its buyers capture the margin. The Kafka/Aurora/Pandas combo fits underwriting and policy servicing far better than lead routing.

Skills and trends. The posting rewards senior generalists comfortable in distributed teams — no juniors, no specialists. "Great organization and documentation" and "distributed teams" appear before any technical requirement, which signals async remote work is the operating model, not an accommodation. This mirrors a broader 2026 pattern: insurtech and fintech are still buying senior full-stack talent, and the differentiator is written-communication discipline, not framework fluency.

Red flags. The post is a wall of text with no salary band, no equity mention, no team size, and no product name. The klee+careers alias suggests hiring is being handled personally by one manager rather than through a recruiter or ATS — fine for a founder, awkward for a public-company skunkworks. "Forever transform the industry" is boilerplate.

Green flags. A named human accepting direct email, remote-friendly by default, and an honest admission that this is a new business (not "join our rocket ship"). Senior-only hiring for a greenfield build is the correct call.

The signal: Established lead-gen players are quietly using their cash flow to build downstream insurance products, and they're staffing those bets as small senior-generalist pods rather than replicating the parent org.

Daily Low-Level Programming

The Kernel's Deferred Work Queue (irq_work): Running Code From NMI Context Without Deadlocking

2026-09-03

When code runs in NMI (Non-Maskable Interrupt) context, it faces a brutal constraint: it can preempt anything, including code holding spinlocks the NMI handler might want. Take a lock in an NMI? Instant deadlock if the interrupted code already held it. Call printk()? It grabs the console lock. Wake a task? Scheduler locks. The NMI handler is effectively forbidden from touching most of the kernel.

The irq_work subsystem (kernel/irq_work.c) solves this. It lets NMI (or any hardirq) context enqueue a callback that runs shortly afterward in a safer context — typically at the tail of the next interrupt, after locks would have been released.

How it works: Each CPU has two lock-free lists: raised_list (needs immediate self-IPI) and lazy_list (runs on the next tick). You allocate a struct irq_work, set a callback function, and call irq_work_queue(). The subsystem uses cmpxchg to atomically push onto the per-CPU list, then triggers a self-IPI via the APIC. When that IPI fires, irq_work_run() drains the list and invokes each callback — now in a normal hardirq context where sleeping is still forbidden, but console locks, scheduler wakeups, and most spinlocks are safe.

Real-world example: perf sampling. When the PMU overflow interrupt fires as an NMI (because you're profiling kernel code that runs with interrupts disabled), the handler needs to wake up the userspace perf process reading the ring buffer. But wake_up() grabs the runqueue lock — a spinlock. From NMI context, that's a potential deadlock. The solution: the NMI handler writes the sample into the ring buffer (lock-free by design), then enqueues an irq_work whose callback calls wake_up() from safe context. Same pattern for printk() from NMI — the message goes into a lock-free log buffer, and an irq_work flushes it to the console later.

The cost: Enqueuing is roughly one cmpxchg plus an IPI (~1000 cycles for the self-IPI round trip on modern x86). The callback runs within microseconds. Compare that to attempting the work in NMI directly, which risks locking up the entire machine.

Rule of thumb: If your handler runs in a context where in_nmi() returns true, you can only touch: (1) percpu variables, (2) lock-free structures, (3) atomic operations, and (4) irq_work_queue(). Everything else — printk, wakeups, allocations, most locks — must be deferred. The irq_work indirection typically adds under 10 microseconds of latency, which is negligible compared to debugging a kernel hang caused by an NMI-context deadlock.

Key Takeaway: irq_work is the kernel's escape hatch for NMI handlers to safely trigger scheduler wakeups, printks, and other lock-taking work by deferring it a few microseconds to the next interrupt exit.

RFC Deep Dive

RFC 2780: IANA Allocation Guidelines For Values In the Internet Protocol and Related Headers

2026-09-03

RFC: RFC 2780

Published: 2000

Authors: S. Bradner, V. Paxson

RFC 2780 is one of those quiet, load-bearing documents that most engineers never read but whose consequences they encounter every day. It doesn't define a protocol. It defines who gets to hand out numbers in the fixed-width fields of IP, TCP, UDP, and the various IP-in-IP encapsulations — and, crucially, what process someone must go through to obtain one.

By 2000, the IETF had a problem. Fields like the IPv4 Protocol byte, the IPv6 Next Header byte, the Differentiated Services codepoint, and TCP/UDP port numbers were being requested by everyone from serious protocol designers to random vendors who wanted "their" number burned into a wire format. IANA had no consistent rulebook. Some fields were handed out first-come-first-served; others required an RFC; others were governed by informal tradition. Bradner (of "rough consensus and running code" fame) and Paxson wrote RFC 2780 to formalize this.

The document leans on RFC 2434's allocation-policy vocabulary — Standards Action, IESG Approval, Expert Review, Specification Required, First Come First Served — and assigns one to each field of the core internet headers:

  • IPv4 Version field (4 bits): Standards Action. Only 16 values exist ever; you don't hand these out lightly. This is why IPv5 was never really "a thing" (it was reserved for ST, the experimental Stream Protocol) and why IPv6 got version 6.
  • IPv4 Protocol / IPv6 Next Header (8 bits): IESG Approval or Standards Action. One byte, 256 values, shared across TCP (6), UDP (17), ICMP (1), GRE (47), ESP (50), SCTP (132), and so on. Precious real estate.
  • IPv4 TOS / DiffServ field: Standards Action for the codepoint pool, with a chunk reserved for experimental and local use. This is the plumbing behind every QoS deployment.
  • TCP/UDP ports: divided into well-known (0–1023, IESG Approval), registered (1024–49151, Expert Review), and dynamic (49152–65535, no registration). This is the framework that governs whether you can "claim" port 5432 for your database protocol.
  • TCP option numbers: Standards Action, because a bad TCP option can subtly break middleboxes worldwide.

The genius of RFC 2780 is that it made scarcity legible. Before it, arguing about whether IANA should give your startup a protocol number was a political fight. After it, you could point at a table and say "this field requires Standards Action; write a draft and get it through the IESG." It converted a social process into a procedural one.

It matters today in ways most engineers don't realize. Every time you see a QUIC deployment negotiating over UDP (protocol 17, allocated long before this RFC but grandfathered under its rules), every time a new IPv6 extension header proposal stalls in the IETF, every time someone laments that we can't just "add a new IP protocol number for X" — you are watching RFC 2780 do its job. It's also why RFC 6335 later had to update the port-number rules: the registered range was filling up, and Expert Review needed teeth.

There's a subtle philosophical point buried here too. Bradner and Paxson explicitly write that these fields belong to the Internet community, not to IANA or the IETF. IANA is a custodian, not an owner. That framing — number space as commons — has quietly shaped every subsequent registry debate, from ASN allocation to the DNS root zone.

Why it matters: RFC 2780 is the constitution of the internet's number registries — the reason your vendor can't just squat on IP protocol 143 and call it theirs.

Stack Overflow Unanswered

How are loops that modify a state implemented in SSA form?

2026-09-03

Stack Overflow: View Question

Tags: compiler-construction, computer-science, ssa, advice

Score: 0 | Views: 207

The asker wrote a simple strlen loop and is puzzled by what they see in Clang's LLVM IR: a mysterious phi instruction. They understand that Static Single Assignment (SSA) means every variable is assigned exactly once — but their loop clearly reassigns len and str on every iteration. How can both things be true?

Why it's interesting: SSA is the backbone of every modern optimizing compiler (LLVM, GCC's GIMPLE, V8's TurboFan, Cranelift), and phi nodes are the single cleverest idea in the whole formalism. They're also the point where most people bounce off SSA on first contact, because the name is borrowed from mathematics but the meaning is completely operational.

The core idea: a phi node isn't a computation — it's a selector keyed on control flow. It says "the value of this SSA name depends on which predecessor block we came from." For the strlen loop, the IR conceptually looks like:

entry:
  br label %loop

loop:
  %len.i   = phi i32  [ 0,        %entry ], [ %len.next, %loop ]
  %str.i   = phi i8*  [ %str.arg, %entry ], [ %str.next, %loop ]
  %c       = load i8, i8* %str.i
  %str.next= getelementptr i8, i8* %str.i, i32 1
  %len.next= add i32 %len.i, 1
  %cond    = icmp ne i8 %c, 0
  br i1 %cond, label %loop, label %exit

exit:
  ret i32 %len.i

Each SSA name (%len.i, %len.next, etc.) is assigned exactly once — the invariant holds. The mutation-over-time that the C source expresses is now encoded as a graph edge: control flow from entry supplies the initial value, control flow from the backedge supplies the updated value.

Direction toward a solution:

  • Read Cytron et al. (1991), "Efficiently Computing Static Single Assignment Form" — the original algorithm using dominance frontiers.
  • Or, for a much gentler modern take, Braun et al. (2013), "Simple and Efficient Construction of SSA Form" — used by Cranelift and easier to implement from scratch.
  • Play with clang -O0 -S -emit-llvm vs. -O1. At -O0, Clang emits alloca/load/store for every local and lets the mem2reg pass introduce phis later. That two-stage lowering is often clearer to trace than reading fully-SSA IR.

Gotchas: phi nodes must be the first instructions in a block, must have exactly one entry per predecessor, and reason purely about the incoming edge, not the block. And crucially: memory is not in SSA in LLVM — only registers/values are. Loads and stores model the mutable heap. That's why the C pointer-walk survives as load instructions rather than as SSA renaming of the bytes themselves.

The challenge: Understanding that a phi node isn't arithmetic — it's a control-flow-aware selector that lets SSA preserve its "assigned once" invariant even in the presence of loops.

Daily Software Engineering

The Egalitarian Paxos (EPaxos) Protocol: Leaderless Consensus for Geo-Distributed Systems

2026-09-03

Multi-Paxos and Raft both funnel every write through a single leader. That leader becomes a latency floor: if your leader is in Virginia and your user is in Tokyo, every write pays a 150ms trans-Pacific round trip before it even starts replicating. Egalitarian Paxos (EPaxos) throws out the leader entirely. Any replica can commit any command, and the protocol only coordinates when commands actually conflict.

The trick is command interference. EPaxos tracks which commands conflict (e.g., two writes to the same key). Non-conflicting commands commit in one round trip to a fast quorum. Conflicting commands pay an extra round trip to establish ordering. Because most workloads have low conflict rates, the average latency drops dramatically.

The fast path: a replica receives a command, sends it to a fast quorum (⌈3F/2⌉ replicas in a 2F+1 cluster), and if all agree the command doesn't interfere with anything they've seen, it commits. One round trip. Done.

The slow path: if any replica reports interference, the coordinator falls back to a classic quorum (F+1) and explicitly records dependencies. Two round trips. Still no leader.

Real-world example: a globally distributed key-value store with replicas in Virginia, Frankfurt, and Tokyo. With Raft and a Virginia leader, a Tokyo user's write costs ~150ms one-way to Virginia plus replication. With EPaxos, the Tokyo replica coordinates locally with its nearest fast quorum. If nobody else is writing to the same key (the common case), the write commits in ~80ms — nearly half the latency. CockroachDB and Cassandra's LWT-like paths borrow ideas from this space for the same reason.

Rule of thumb: EPaxos wins when your conflict rate is below ~25%. Above that, the slow-path overhead swamps the fast-path savings and you'd have been better off with Multi-Paxos. Measure conflict rate as: (commands that touched an already-in-flight key) / (total commands). If you can't estimate it, assume workloads with a hot key distribution (Zipfian) will exceed the threshold quickly.

The catch: EPaxos is significantly more complex to implement correctly than Raft. Dependency graphs must be tracked, transmitted, and executed in a consistent order across replicas. Recovery after a failure requires reconstructing the interference graph from surviving replicas — a subtle protocol that has had published bugs. Most teams reach for Raft first; EPaxos only earns its complexity when geo-latency is the dominant cost.

Key Takeaway: EPaxos eliminates the leader bottleneck by making non-conflicting commands commit in one round trip from any replica, trading protocol complexity for dramatically lower latency in geo-distributed, low-conflict workloads.

Tool Nobody Knows

dc: The 1971 RPN Calculator That Predates C and Still Fits in a Pipeline

2026-09-03

Everyone knows bc. Almost nobody remembers that bc was originally a front-end that compiled to dc bytecode — the "d" and "c" both stand for calculator, and dc is the older one. It shipped in Unix v1. It predates C. And it's still sitting in /usr/bin on every Linux and BSD box you touch, quietly guaranteed by POSIX.

Under the hood it's a reverse Polish notation calculator with arbitrary precision arithmetic, 256 named registers (each of which is itself a stack), macros, and conditional execution. Which is a fancy way of saying dc is Turing complete — the smallest programmable language POSIX guarantees on your system.

The basics that bite people

Push operands, then the operator. p prints the top of stack without popping. k sets decimal precision. i and o set input and output base.

$ echo '2 3 + p' | dc
5

$ echo '20 k 22 7 / p' | dc
3.14285714285714285714

$ echo '2 1000 ^ p' | dc
10715086071862673209484250490600018105614...   # 302 digits, no bignum library needed

Base conversion without leaving the shell

Every developer eventually needs to turn 0xDEADBEEF into decimal, or a decimal into binary. Most reach for Python. dc does it in one pipe:

$ echo '16 i DEADBEEF p' | dc
3735928559

$ echo '16 o 3735928559 p' | dc
DEADBEEF

$ echo '2 o 255 p' | dc
11111111

Set the input base first (16 i). After you change it, following digits are parsed in the new base — including any digits meant to set the output base afterward. That subtlety is where every first-time user eats it.

Macros: where dc stops being a calculator

Anything between [ and ] is a string. Store in register S with sS, load with lS, execute with x.

# Define "square" as dup-multiply, apply to 7
$ dc -e '[d*]sS 7 lSx p'
49

# Compose it: fourth power = square of square
$ dc -e '[d*]sS 3 lSx lSx p'
81

Conditional operators (=r, <r, >r) pop two values and run register r's macro if the relation holds. Combine that with a macro that reloads itself and you have loops. That is genuinely all you need to write real programs — Rosetta Code has full dc implementations of factorial, Fibonacci, primality, and RPN evaluators, most under 100 bytes.

Why reach for dc when bc, python, or a browser tab exists?

  • Pipeline-native. No interactive prompt noise, no ceremony. Drop it between awk and tee and it Just Works.
  • Startup cost. A dc invocation runs an order of magnitude faster than python -c. Inside a tight shell loop that matters.
  • Arbitrary precision by default. No from decimal import, no --mathlib flag. 2 10000 ^ just works and prints all 3011 digits.
  • Guaranteed present. POSIX requires it. Every stripped-down container, every busybox rescue disk (with the right applet set), every embedded target that ships a real userland has it.

The one real gotcha is that RPN gets unforgiving once expressions nest. Past three operators, break into newlines and use # comments (GNU extension) or write the intent above the invocation. Otherwise you will be debugging stack order at 2am, and that is not what a wizard-tier tool should be reduced to.

Key Takeaway: dc is the smallest Turing-complete language POSIX guarantees on your system — reach for it when you want arbitrary precision arithmetic or base conversion in a pipeline without paying the startup cost of a real interpreter.

What If Engineering

What If Cargo Ships Used Skyscraper-Sized Flettner Rotors Instead of Sails?

2026-09-03

Anton Flettner's 1924 Buckau crossed the Atlantic using two spinning steel cylinders instead of sails. The trick: the Magnus effect. A vertical cylinder rotating in a crosswind drags air around one side and pushes it away on the other, generating lift perpendicular to the wind. Modern rotor sails from Norsepower and Anemoi are typically 20–35 m tall and 3–5 m in diameter — bolted onto tankers, they trim 5–20% off fuel bills. Fine. But what happens if we scale one to Burj Khalifa dimensions?

Let's design a monster: 300 m tall, 30 m diameter, mounted on a 400-m Valemax-class ore carrier. Two of them.

The spin problem hits first

Magnus lift peaks around a spin ratio α = (surface velocity)/(wind velocity) of 3–4, giving lift coefficients up to CL ≈ 10 — versus 1.5 for a good airfoil. In a 15 m/s wind (Beaufort 7), we need surface velocity ≈ 60 m/s, so ω = 60/15 = 4 rad/s → 38 RPM.

Sounds modest until you check hoop stress. For a thin-walled steel cylinder of radius R spinning at ω, σ = ρsteel · ω² · R² = 7850 · 16 · 225 ≈ 28 MPa. Steel yields at ~250 MPa, so we're fine on tensile — but that assumes we don't ovalize under wind loading, which for a 30-m diameter thin shell is the real killer. Skin thickness has to be ≥50 mm, and internal ring stiffeners every ~10 m of height. Structural mass alone: ~4,500 tonnes per rotor.

The thrust is comical

Magnus lift: L = ½ · ρair · v² · Aprojected · CL

L = 0.5 × 1.225 × 15² × (30 × 300) × 10
  = 12.4 MN per rotor

That's 2,500 kN of usable forward thrust after resolving the vector (rotors point lift ~forward-quartering to the wind). For comparison, a Valemax's 30 MW diesel puts out around 3,500 kN at cruise. Two of these rotors match the engine on a good sailing day — the ship becomes a wind-primary vessel with a diesel trim tab.

The ship capsizes

Here's where it collapses. The heeling moment from one rotor:

M = L × (H/2 + freeboard) ≈ 12.4×10⁶ × 175 m
  = 2.2 GN·m

A Valemax has a metacentric height GM ≈ 5 m and displacement ~400,000 tonnes. Restoring moment at 10° heel: Δ · g · GM · sin(10°) ≈ 3.4 GN·m. So a single gust past design wind puts the deck rail underwater. You'd need to widen the beam by ~40% or add 80,000 tonnes of ballast — killing cargo capacity.

Power to spin them

Skin friction on a smooth 30-m cylinder at 60 m/s in air: torque ≈ ½ρ · Cf · v² · (2πR) · H · R. With Cf ≈ 0.003: ~800 kW per rotor just to overcome aero drag on the spinning surface. Plus bearing losses. Call it 1.2 MW each — 8% of the thrust power you're generating. Net-positive, but the bearings themselves are the size of wind turbine yaw rings.

The sensible version

Scale everything by ⅓ (100 m tall, 10 m dia), put four on a ship, and you get ~5 MN total thrust with a heeling moment the hull can actually handle. Which is roughly what Norsepower is already planning for 2027 newbuilds — just not calling them skyscrapers.

Key Takeaway: Flettner rotors scale beautifully in thrust (linearly with height × diameter × wind²) but the heeling moment scales with height squared — the ship capsizes long before the physics of the rotor gives up.

Wikipedia Rabbit Hole

Amplified piezoelectric actuator

2026-09-03

Squeeze a quartz crystal and it produces a tiny voltage. Reverse the process — apply voltage to certain ceramics — and they physically deform. But here's the frustrating catch that engineers have wrestled with for a century: the deformation is absurdly small. A stack of piezoelectric ceramic the size of a sugar cube might extend by roughly 0.1% of its length when you dump hundreds of volts across it. That's tens of micrometers of motion — invisible to the naked eye, and useless for most mechanical applications.

So how do we get from "invisible twitch" to actuators that steer satellite mirrors, focus space telescopes, and drive fuel injectors in Formula 1 engines? Enter the amplified piezoelectric actuator (APA), a beautifully elegant piece of mechanical judo invented in the 1990s.

The trick is to wrap the piezoelectric stack inside a flexible metal shell — usually a flattened oval or diamond shape. When the stack pushes outward along its long axis, the oval shell squeezes vertically, converting the small horizontal expansion into a much larger perpendicular contraction. It's the same principle as squeezing an egg lengthwise to make it bulge sideways, but run in reverse. Depending on the geometry, amplification factors of 5x, 10x, or even 20x are achievable, turning micrometers into hundreds of micrometers.

You lose force in proportion to what you gain in displacement — that's just leverage — but crucially, you keep most of the piezoelectric stack's other magic properties:

  • Nanometer resolution — position control is limited only by your voltage source's stability
  • Response times measured in microseconds — orders of magnitude faster than any electric motor
  • No wear — no bearings, no gears, no lubricant, just elastic deformation
  • Works in vacuum, cryogenic temperatures, and strong magnetic fields — which is why they're beloved in space instruments and MRI-compatible robotics

If you've ever seen a spectacular ground-based astronomy photo, an APA probably helped. Adaptive optics systems use arrays of piezoelectric actuators to reshape mirrors thousands of times per second, cancelling out atmospheric turbulence in real time. James Webb's mirror segments are aligned with similar tech. The Mars rovers' sample-handling mechanisms use them. Your inkjet printer squirts droplets with a related mechanism — a piezo bender flexes a tiny chamber and ejects ink at up to 50,000 drops per second.

The Wikipedia article gets into some genuinely clever variants: double-amplified designs that cascade two shells for 100x amplification, and hybrid systems that combine piezo speed with the long stroke of a stepper motor. There's also a fascinating mode where you use the actuator in reverse — letting a vibration compress it — and harvest microwatts of electricity from the resulting voltage, which is how some self-powered wireless sensors work.

Down the rabbit hole: The same mechanical trick that lets a quartz sliver in your watch keep time to seconds per year is also what points the Hubble Space Telescope — and it does so by squishing an oval like an egg.

Daily YT Documentary

Soviet Architecture Still Dominates This City

2026-09-03

Soviet Architecture Still Dominates This City

Channel: Railway Retro (2910 subscribers)

This video takes viewers into Transnistria, a breakaway state wedged between Moldova and Ukraine that most maps still don't formally recognize. It's a genuine geopolitical oddity — a Soviet-flavored republic that never got the memo that the USSR dissolved in 1991 — and its capital, Tiraspol, functions as a living museum of late-Soviet urban planning.

Railway Retro focuses on the architecture and urban fabric: the microrayon housing blocks, the monumental civic buildings, the hammer-and-sickle iconography that still adorns the flag and public spaces. Rather than treating this as spectacle, the video uses the built environment to explain how Soviet planners organized cities around collective infrastructure — centralized heating, ground-floor commercial strips, tram networks — and why those patterns persist decades after the ideology that produced them collapsed.

For anyone interested in urban planning, post-Soviet geography, or frozen-conflict states, this is a rare on-the-ground look at a place foreign journalists rarely reach. The small-channel format means it's more observational travelogue than polished documentary, but that's part of the charm — you get the streetscape without the usual sensationalism that surrounds Transnistria coverage.

Why watch: A grounded architectural tour of one of Europe's strangest unrecognized states, showing how Soviet-era urban design still shapes daily life.

Daily YT Electronics

How to Mill Your Own PCB: Gerber to CNC in FlatCAM (Cubiko CNC)

2026-09-03

How to Mill Your Own PCB: Gerber to CNC in FlatCAM (Cubiko CNC)

Channel: Tasty Tech Harbour (4640 subscribers)

Home PCB fabrication is one of those skills that sits at a genuinely useful intersection of electronics, CAD, and CNC machining — and this video walks through the specific choke point where most hobbyists get stuck: translating Gerber and Excellon drill files into actual CNC toolpaths a mill can execute.

FlatCAM is the de facto open-source tool for this job, but it's notoriously fiddly. You have to think about isolation routing (the width and number of passes around each trace), tool diameter compensation, cut depth for the copper layer versus the board outline, drill sequencing, and how to align the double-sided workflow if you need it. Getting any one of those wrong produces either shorted traces, lifted copper, or broken end mills.

A step-by-step walkthrough tied to a real machine (the Cubiko CNC) is valuable because it grounds the abstract FlatCAM settings in concrete choices — feed rates, spindle speeds, and end mill selection that actually work rather than theoretical defaults. For anyone who wants faster iteration than mail-order fab houses allow, or who wants to prototype RF and analog boards where turnaround matters, this is the exact skill to learn.

Bonus: milling teaches you to respect trace width and clearance rules in a way that ordering boards never does.

Why watch: A concrete walkthrough of the trickiest step in home PCB milling — turning EDA output into working CNC toolpaths.

Daily YT Engineering

Closed Loop Thermal Control

2026-09-03

Closed Loop Thermal Control

Channel: Scott Staker (0 subscribers)

Most of today's candidates are exam-prep MCQs, hashtag-stuffed Shorts, or generic "what is a control system" overviews. This one stands out because it starts from a concrete, honest observation: a course lab that mapped a sensor reading directly onto a PWM fan output. That "works" — but as the description points out, it's open loop. The system has no target. Ambient shifts, load changes, or sensor drift will silently push the output away from where you actually want it.

Turning that same setup into a closed loop is one of the cleanest introductions to feedback control you can get, because the hardware is unchanged — only the logic differs. You go from "read temperature → set fan" to "read temperature → compute error against setpoint → drive fan to minimize error." That single conceptual jump is exactly where PID, hysteresis, integrator windup, and setpoint tracking all originate, and it's much easier to internalize when you've felt the limits of the naive version first.

Zero-subscriber channels are usually a gamble, but the description is written by someone who clearly understands why the distinction matters, not just the vocabulary. For a viewer building thermal management, motor control, or any regulated system, watching someone walk through the open-to-closed-loop conversion on real hardware is more instructive than another block-diagram lecture.

Why watch: A hands-on conversion of an open-loop fan controller into a real closed-loop thermal system — the clearest way to feel why feedback matters.

Daily YT Maker

n8n vs Zapier vs Make: I Built the Same Automation 3 Times ($20 vs $89 vs $9/mo)

2026-09-03

n8n vs Zapier vs Make: I Built the Same Automation 3 Times ($20 vs $89 vs $9/mo)

Channel: ProvingStack (0 subscribers)

Most "tool comparison" videos are surface-level feature checklists cribbed from marketing pages. This one takes a much more useful approach: the creator builds the same four-step automation three separate times — once each in n8n, Zapier, and Make — with a stopwatch running and every friction point documented. That head-to-head methodology is the whole reason to watch, because it surfaces the things you only learn by actually shipping: which platform's error handling saves you at 2am, which one's data-mapping UI turns a 10-minute build into an hour, and where the pricing model quietly punishes you as your workflow scales.

For anyone weighing which no-code automation platform to commit to — whether you're a solo maker wiring up a home dashboard, a small-business owner stitching together SaaS tools, or a developer deciding whether self-hosted n8n is worth the ops overhead versus paying Zapier — this kind of empirical, apples-to-apples comparison is genuinely rare. The price framing in the title ($20 vs $89 vs $9/mo) hints that total cost of ownership will be part of the analysis, not just build experience.

It's a brand-new channel with zero subscribers, so quality is a gamble, but the premise and structure are exactly right: pick a real task, build it three ways, report what actually happened. That's the kind of comparison content that's useful years after publication.

Why watch: A hands-on, stopwatch-timed build of the same automation across all three major no-code platforms — the kind of empirical comparison that beats any spec-sheet review.

Daily YT Welding

I Built the Ultimate 3-in-1 Workbench (Welding, Table Saw, Assembly)

2026-09-03

I Built the Ultimate 3-in-1 Workbench (Welding, Table Saw, Assembly)

Channel: Builder and Maker (893 subscribers)

Most of this week's candidate pool leaned heavily on Shorts-format hashtag spam and thinly disguised product promos for pre-made 3D welding tables. This build video from Builder and Maker stands out as the only one that shows a real multi-day fabrication project from planning to finished piece.

The premise is genuinely useful for anyone working in a cramped shop: a single 4x6 ft heavy-duty bench that combines a welding surface, an integrated table saw, and an assembly station. Combining a woodworking tool with a welding surface is not trivial — sparks, sawdust, flatness tolerances, and vibration all pull in different directions, so the design decisions here are worth studying even if you never build the exact same thing.

Expect to see practical fabrication techniques: squaring a large frame, welding heavy tube steel without warping, flush-mounting a table saw insert, and integrating storage without compromising rigidity. For a small-channel maker, this kind of long-form project video is where you actually learn — you see the mistakes, the workarounds, and the "why I did it this way" reasoning that gets cut from polished shop tours.

At under 1k subscribers, this creator is exactly the kind of builder worth supporting: real project, real shop, real welding.

Why watch: A rare full-length build video showing how to combine welding, sawing, and assembly stations into one rigid, space-saving shop bench.