Daily Digest — 2026-07-15

26 newsletters today.

In this digest


Abandoned Futures

The Rocketdyne Aerospike Engine (XRS-2200): The Altitude-Compensating Rocket Engine That Flew on Paper, Fired on Test Stands, and Got Cancelled 90 Seconds Before the X-33 Would Have Proven It

2026-07-15

Every conventional rocket engine is a compromise. A bell nozzle is optimized for exactly one atmospheric pressure β€” pick sea level and you lose 15% efficiency in vacuum; pick vacuum and the exhaust separates at liftoff and shakes your engine apart. The linear aerospike solves this by inverting the geometry: instead of exhaust expanding inside a bell, it expands against a wedge-shaped ramp with the atmosphere itself forming the outer boundary. As altitude increases, ambient pressure drops, and the exhaust plume naturally widens to compensate. One engine, optimal thrust from pad to orbit.

Rocketdyne started working on aerospikes in 1960 under contract to NASA Marshall. By 1972 they had run a 250,000-lbf toroidal aerospike on the test stand for a cumulative 73 minutes across 82 firings β€” more hot-fire time than the F-1 had accumulated at first flight. The engine worked. Isp was within 2 seconds of predictions. Then Nixon picked the Space Shuttle's SSME configuration in 1972 and aerospike work was mothballed for 24 years.

It came back in 1996 as the propulsion system for Lockheed Martin's X-33 VentureStar β€” a suborbital demonstrator for a single-stage-to-orbit reusable launcher. Rocketdyne built the XRS-2200: a linear aerospike with 20 individual thrust cells firing against two ramp surfaces, 204,000 lbf sea-level thrust, LH2/LOX, throttleable from 40% to 119%, with differential throttling for pitch and yaw β€” no gimbals, no hydraulics, just varying thrust across the cell array. Two XRS-2200s were built. Both were successfully hot-fired at Stennis in 2001, accumulating 14 tests and hitting design performance.

By then the X-33 was already dead. NASA had cancelled the program on March 1, 2001 β€” not because the engines failed, but because the composite liquid hydrogen tank did. The multi-lobed tank delaminated during pressurization tests in November 1999. Lockheed proposed switching to aluminum (heavier, but proven); NASA declined and killed the whole vehicle. The XRS-2200 engines β€” fully tested, flight-rated, sitting on stands β€” were shipped to storage at Stennis and Marshall. They have never fired again. The full-scale RS-2200 that would have flown VentureStar itself was never built.

Why revisit it in 2026? Three things have changed:

  • Composite cryotanks now work. SpaceX's carbon-fiber LOX tank testing (2016), Rocket Lab's Electron composite tanks, and Boeing's 5.5-meter linerless hydrogen tank (2021) have all demonstrated what defeated the X-33. The tank problem is solved.
  • Additive manufacturing collapses the cost. The XRS-2200's 20 thrust cells were individually machined β€” the reason aerospikes were historically 3Γ— the cost per pound of thrust vs. bell engines. Relativity Space and Ursa Major are now 3D-printing regeneratively cooled chambers in weeks. An aerospike is essentially a linear array of small chambers β€” the exact geometry additive manufacturing is best at.
  • Reusability changes the math. The aerospike's altitude compensation is worth 8-14% payload on a single-stage vehicle. That was marginal in 1996 when boosters were expendable. On a reusable SSTO, that margin is the difference between "closes" and "impossible."

Small players are picking it up. ARCA Space flew a small linear aerospike in 2019 (crashed, but flew). Pangea Aerospace in Spain hot-fired a methalox aerospike in 2021. RocketStar and Rocket Crafters both have programs. None of them have Rocketdyne's 40 years of data or a proven 204,000-lbf test article sitting in a warehouse.

The XRS-2200 was flight hardware. It has never been declassified test data β€” it's just parked.

Key Takeaway: The aerospike engine wasn't cancelled because it failed β€” it was orphaned by an unrelated tank failure, and the composite tanks and additive manufacturing that would rescue it are both mature technologies in 2026.

ArXiv Paper Digest

Software Supply Chains are Dead: Use-Case-Oriented Regeneration

2026-07-15

Authors: Tanmay Singla, James C. Davis

ArXiv: 2607.13021v1

PDF: Download PDF

For the last two decades, the software industry has run on a simple bargain: instead of writing code yourself, you pull in someone else's library. Need to parse a date? There's a package for that. Need to left-pad a string? There's (famously) a package for that too. The tradeoff was always assumed to favor reuse β€” why reinvent the wheel when npm, PyPI, and Maven Central have millions of them ready to go?

Singla and Davis argue that bargain is quietly falling apart, and it's time to rethink how we source code from scratch.

Two forces are colliding. On one side, supply chain attacks have gotten brutal. Malicious packages, typosquatted names, compromised maintainer accounts, and injected backdoors (think SolarWinds, xz-utils, the endless parade of npm incidents) mean that every dependency you pull is a potential attacker foothold. Auditing thousands of transitive dependencies is effectively impossible for most teams.

On the other side, generative AI has crashed the cost of writing code yourself. That utility function you would have grabbed from a library? An LLM can now spit out a tailored version in seconds β€” one that does exactly what you need and nothing more.

The authors call their alternative use-case-oriented regeneration. The idea: instead of importing a general-purpose dependency with hundreds of features you'll never use (and hundreds of attack surfaces you didn't ask for), you describe the specific behavior you need and have an AI generate a narrow, purpose-built implementation that lives inside your own codebase. No external trust required. No transitive dependencies. No mystery maintainers.

The key insight is that the economic logic of dependencies has inverted. Reuse made sense when writing code was expensive and trust was cheap. Now writing code is cheap and trust is expensive. So the rational move flips: generate locally, own the code, review it once, and skip the supply chain entirely.

The paper isn't claiming every library disappears overnight β€” you're not going to regenerate PostgreSQL from a prompt. But for the vast middle layer of small utilities, glue code, and single-purpose helpers that dominates most dependency trees, regeneration could plausibly replace importation. It's a provocative reframing that treats the supply chain not as infrastructure to be secured, but as a category to be shrunk.

Why it matters: If AI-generated local code becomes the default for small utilities, the entire software supply chain security problem changes shape β€” from "audit millions of packages" to "review your own generated code."

Daily Automotive Engines

Mean Piston Speed: The Hidden Limit That Kills Engines Before RPM Does

2026-07-15

Everyone obsesses over redline RPM, but engine builders quietly watch a different number: mean piston speed (MPS). It's the average velocity of the piston over one crankshaft revolution, and it's the real predictor of durability, ring wear, and rod bolt survival.

The formula is dead simple:

MPS (ft/min) = Stroke (inches) Γ— RPM Γ· 6

Or in metric: MPS (m/s) = 2 Γ— Stroke (m) Γ— RPM Γ· 60

The industry rules of thumb:

  • Under 4,000 ft/min (20 m/s): Passenger-car territory. Indefinite durability with normal maintenance.
  • 4,000–4,500 ft/min: Performance street engines. Reliable but wear accelerates.
  • 4,500–5,000 ft/min: Race-bred street engines (LS7, S65 BMW V8). Requires premium materials.
  • Above 5,000 ft/min (25 m/s): Pure race territory. F1 hits ~25 m/s; short-block life measured in hours.

Concrete example β€” why a Coyote outlives a Hemi at the same RPM:

A 5.0L Coyote has a 92.7 mm stroke (3.65"). At 7,500 RPM redline:
MPS = 3.65 Γ— 7,500 Γ· 6 = 4,563 ft/min

A 6.4L Hemi has a 90.9 mm stroke (3.58") but redlines at 6,400 RPM:
MPS = 3.58 Γ— 6,400 Γ· 6 = 3,819 ft/min

Despite the Coyote screaming 1,100 RPM higher, its piston is only traveling 20% faster than the Hemi's β€” well within the envelope its forged internals were designed for.

Why MPS matters more than RPM:

  • Inertial loads scale with the square of piston speed. Double the MPS, quadruple the rod bolt tension at TDC on the exhaust stroke.
  • Ring/bore friction is proportional to MPS. Faster piston = more heat in the ring pack = shorter ring life.
  • Oil film shear at the wrist pin and rod journal depends on velocity, not RPM.

The stroker paradox: Adding stroke gives you torque cheaply, but it also raises MPS at any given RPM. That 383 stroker built from a 350 block? Its 3.75" stroke hits 4,500 ft/min at 7,200 RPM β€” where the original 3.48" stroke wouldn't get there until 7,750 RPM. Stroke it, and you must lower your redline to preserve durability.

See it in action: Check out What Killed The Rotary Engine? by Engineering Explained to see this theory applied.
Key Takeaway: Redline is marketing; mean piston speed is engineering β€” keep it under 4,500 ft/min for street reliability, regardless of what tach number that requires.

Daily Debugging Puzzle

C++'s std::sort Strict Weak Ordering Trap: The Comparator That Crashes on Ties

2026-07-15

This function sorts employees by salary, highest first. It compiled cleanly, passed all unit tests with distinct salaries, and shipped to production. Then payroll ran a quarterly report on 50,000 rows where hundreds of employees shared the same salary band. The service segfaulted.

#include <algorithm>
#include <vector>
#include <string>

struct Employee {
    std::string name;
    int salary;
};

// Sort employees by salary, highest first.
void sortBySalary(std::vector<Employee>& employees) {
    std::sort(employees.begin(), employees.end(),
        [](const Employee& a, const Employee& b) {
            return a.salary >= b.salary;  // highest first
        });
}

int main() {
    std::vector<Employee> team;
    for (int i = 0; i < 10000; ++i)
        team.push_back({"emp" + std::to_string(i), 50000});
    sortBySalary(team);  // may crash, hang, or corrupt memory
}

The Bug

The comparator uses >= instead of >. That single character violates C++'s strict weak ordering requirement, and the standard says the resulting behavior is undefined. Not "arbitrary order" β€” undefined. Real implementations of std::sort have crashed, looped forever, or written past the end of the input.

The requirement is subtle. A comparator comp(a, b) must be irreflexive: comp(a, a) must be false. With >=, comparing any element to itself returns true, claiming an element is strictly ordered before itself. It also violates antisymmetry: when a.salary == b.salary, both comp(a, b) and comp(b, a) return true, telling the algorithm that a < b and b < a simultaneously.

Introsort β€” libstdc++'s std::sort β€” uses this predicate to decide partition boundaries. When the predicate lies, elements can be swapped past the partition sentinel, and the quicksort inner loop's pointer arithmetic walks off the end of the array. On small inputs with distinct keys the bug hides. On large inputs with duplicates it detonates, because introsort's quickselect pivots keep landing on equal-valued runs and each recursive step compounds the corruption.

The fix is one character:

void sortBySalary(std::vector<Employee>& employees) {
    std::sort(employees.begin(), employees.end(),
        [](const Employee& a, const Employee& b) {
            return a.salary > b.salary;  // strict >, not >=
        });
}

With >, equal salaries make the comparator return false in both directions, which correctly encodes "these are equivalent under this ordering." std::sort is then free to leave equivalent elements in any order (it isn't stable β€” use std::stable_sort if you need insertion order preserved among ties).

The same trap lurks in every language that lets you pass a Boolean less-than predicate: Rust's sort_by expects an Ordering, which sidesteps this. But Python's functools.cmp_to_key, Java's Comparator, and JavaScript's Array.sort all inherit it β€” a comparator that returns 0 for "equal" but returns non-zero for compare(x, x) will silently produce nonsense output in Python and Java, and in C++ will corrupt memory.

How to catch it: compile with libc++ or libstdc++ in debug mode (-D_GLIBCXX_DEBUG). Both ship comparator validators that call your predicate with equal arguments and abort if it returns true. Run this in CI on realistic data β€” not the tiny distinct-value fixtures that let this bug ship.

Key Takeaway: A sort comparator must return false when its arguments are equal β€” >= and <= violate strict weak ordering and hand std::sort a license to corrupt memory.

Daily Digital Circuits

Fanout-of-4 (FO4) Delay: The Technology-Independent Yardstick of Digital Speed

2026-07-15

Ask a hardware engineer "how fast is your logic?" and they won't say picoseconds β€” they'll say FO4s. The fanout-of-4 delay is the propagation delay of a standard inverter driving four identical copies of itself. It's the industry's favorite unit of delay because it normalizes away process, voltage, and temperature: 10 FO4 at 180nm and 10 FO4 at 5nm both mean "ten inverters of work."

Why four? Logical effort theory says the optimal fanout for a chain of inverters (minimizing total delay) is roughly e β‰ˆ 2.7. But four is close enough, easy to lay out on a test structure, and gives a "typical" load β€” most gates in real designs drive somewhere between 2 and 6 fanouts. Not too lightly loaded (dominated by intrinsic delay), not too heavily loaded (dominated by wire).

The rule of thumb: FO4 delay in picoseconds β‰ˆ 0.5 Γ— (drawn gate length in nm). At 45nm, that's ~22 ps. At 14nm, ~7 ps. At 5nm (effective), ~2 ps. Voltage scaling and finFET geometry break this a bit at bleeding-edge nodes, but it's still the mental math engineers use.

How it shapes design: A pipeline stage's clock period, expressed in FO4s, tells you what kind of animal you're building:

  • ~30–40 FO4/cycle: ASIC / low-power SoC β€” relaxed timing, easy synthesis
  • ~15–20 FO4/cycle: Modern out-of-order CPU (Apple M-series, AMD Zen) β€” aggressive but sustainable
  • ~8–12 FO4/cycle: Superpipelined machines (Pentium 4, IBM Power6) β€” deep pipes, high frequency, painful design
  • <6 FO4/cycle: Custom-designed dynamic logic; you're a rare bird

Concrete example: Suppose you're targeting 4 GHz on a 7nm process. Cycle time = 250 ps. FO4 β‰ˆ 3.5 ps. Budget = 250 / 3.5 β‰ˆ 71 FO4 per cycle β€” but subtract clock skew (~5 FO4), setup time (~2 FO4), flip-flop clock-to-Q (~3 FO4), and jitter margin (~4 FO4), and you're left with about 57 FO4 of pure combinational logic. If your critical path has 12 gates averaging 5 FO4 each, you're already at 60 β€” over budget. Time to retime, pipeline, or restructure.

The beauty of FO4 is portability. A block that closes at 20 FO4 on 28nm will close at 20 FO4 on 7nm β€” the numerator and denominator both shrink together. That's why architects reason in FO4 during early exploration, long before a physical library exists.

Key Takeaway: FO4 is the process-independent currency of digital delay β€” measure your critical path in FO4s and you'll know instantly whether you're building a lazy ASIC or a bleeding-edge CPU.

Daily Electrical Circuits

Schottky Diode OR-ing for Battery Backup: The Simplest Redundant Power Circuit

2026-07-15

Before ideal diode controllers became cheap, engineers used Schottky diode OR-ing to combine two power sources. It's still the go-to solution when you need dead-simple, no-firmware, cost-optimized redundancy β€” think RTC backup, memory retention supplies, or small IoT devices switching between wall power and a coin cell.

The circuit is trivial: two Schottky diodes, anodes tied to their respective sources (main supply and backup battery), cathodes joined at the load. Whichever source is higher wins β€” its diode conducts, the other reverse-biases. If main power drops below the battery voltage minus a diode drop, the battery seamlessly takes over. No glitches, no switching transients, no controller IC.

Why Schottky, not standard silicon? Forward drop. A 1N4148 costs you 0.7V; a BAT54 costs about 0.3V at low current. For a 3.3V rail fed from a 3.6V lithium primary, that difference is the gap between "works" and "browns out." Schottkys also switch fast enough that the load capacitance holds the rail steady during the handoff.

Key design considerations:

  • Reverse leakage: Schottkys leak β€” often 1-100 Β΅A at rated reverse voltage, and it doubles roughly every 10Β°C. For a coin cell backup, this leakage drains your battery even when main power is present. Pick a low-leakage part (BAT54 series is ~2 Β΅A typical) or you'll murder a CR2032 in months.
  • Reverse charging: Never OR a rechargeable NiMH with a primary lithium β€” if the diode fails shorted, you can force-charge a non-rechargeable cell and cause venting or fire.
  • Voltage headroom: Whatever downstream regulator you feed must tolerate V_source βˆ’ V_F. An LDO with 200 mV dropout fed from 3.3V through a Schottky sees ~3.0V β€” cutting it close for a 2.8V rail.

Real-world example: A datalogger runs from a 5V USB supply and falls back to a 3V CR2032 for the RTC and SRAM during outages. Two BAT54s OR the sources; the RTC sees ~4.7V during USB operation and ~2.7V on battery. The RTC's spec sheet lists 1.8V minimum, so we're fine. Estimated battery leakage: 2 Β΅A Γ— 24 h Γ— 365 d β‰ˆ 17.5 mAh/year β€” a CR2032 (220 mAh) lasts over a decade.

Rule of thumb: Load current Γ— V_F = power dissipated in the diode. Above roughly 100 mA continuous, the Schottky loss (30-50 mW) becomes wasteful and you should switch to an ideal diode controller with a MOSFET pass element.

See it in action: Check out How to Add a Diode ORing or Battery Backup Circuit Using the MAX40200 Ideal Diode by maxim integrated to see this theory applied.
Key Takeaway: Schottky OR-ing gives you zero-firmware, glitch-free power redundancy for milliamp loads, but watch reverse leakage draining your backup battery and never mix rechargeable and primary cells.

Daily Engineering Lesson

Silent Chain (Inverted-Tooth Chain): Quiet, High-Speed Power Transmission Through Meshing Link Plates

2026-07-15

Roller chain slams a cylindrical roller into a sprocket tooth every pitch. That impact is why roller chain gets loud above about 1,500 ft/min and why chordal action limits smoothness. Silent chain β€” also called inverted-tooth chain β€” solves both problems by replacing the roller with stacks of flat steel link plates whose lower edges are ground into two straight flanks meeting at a tooth-like point. Those flanks slide onto the sprocket tooth flanks instead of hammering into them.

A silent chain is built up from hundreds of individual link plates pinned together in staggered rows. Width is set by how many plates you stack side-by-side; you can literally buy chain by the inch of face width. Load capacity scales linearly with width, so a 3-inch-wide silent chain of a given pitch carries roughly three times the load of a 1-inch chain β€” a design freedom roller chain doesn't offer without jumping to a bigger pitch.

Guide plates keep the chain tracking on the sprocket. Center-guide designs run a taller plate down a groove machined into the sprocket teeth; side-guide designs use taller outer plates that straddle the sprocket. Center guides tolerate misalignment better; side guides are cheaper.

Where it shows up: automotive engine timing drives (Ford Modular V8, most modern Toyotas), machine-tool spindle drives, industrial pump and blower drives, and printing-press power trains. Anything spinning fast that can't tolerate the noise or the Β±Β½-pitch position error of roller chain is a candidate. Silent chains routinely run at 3,000–8,000 ft/min where roller chain would scream and shake itself apart.

Rule of thumb for chain speed:

  • V (ft/min) = pitch (in) Γ— teeth on driver Γ— RPM Γ· 12
  • A Β½-inch-pitch silent chain on a 25-tooth sprocket at 3,600 RPM: V = 0.5 Γ— 25 Γ— 3,600 Γ· 12 = 3,750 ft/min β€” comfortable for silent chain, marginal for standard roller chain.

Design gotchas:

  • Silent chains stretch just like roller chain as the pin/plate joints wear. Tensioners are mandatory on long spans and on any timing application.
  • They're directional in some designs β€” the tooth flank angle is optimized for one rotation direction. Check the manufacturer's arrow.
  • Lubrication is not optional. Silent chain running dry wears the pin bores fast and the whole chain elongates unevenly.
  • Cost is 3–5Γ— a roller chain of equivalent capacity. Justify it with noise, speed, or smoothness requirements, not raw torque.

The tradeoff is straightforward: you pay more up-front for a chain that runs quieter, faster, and smoother than roller chain, at the cost of tighter lubrication requirements and specialty sprockets.

See it in action: Check out Everyone Mocked His Civilian Tech, Until He Built A DF-5C Missile For Only $120K! by Revel Manga Chronicles to see this theory applied.
Key Takeaway: Silent chain replaces roller chain's hammering rollers with sliding link-plate teeth, buying you higher speed and lower noise at the cost of specialty sprockets and mandatory lubrication.

Forgotten Books

When a Trade Journal Was Also a Widow's Pension: The Honeyman Fund of 1884

2026-07-15

Book: The Journal of Horticulture, Cottage Gardener, and Home Farmer by Robert Hogg (1880)

Read it: Internet Archive

Buried in the editorial front-matter of a Victorian gardening magazine sits a quiet piece of forgotten social infrastructure β€” one that has almost nothing to do with horticulture and everything to do with how ordinary working people once cared for one another.

In the July 1884 preface, editor Robert Hogg reports on the death of a contributor:

"with one lamentable exception, the late Mr. Alexander Honeyman, our old friends remain with us... we rejoice to state that the [widow] and fatherless have been cheered and benefited during the past half year. We can state nothing that can be more acceptable to all than that Mrs. Honeyman has been placed in a position to bring up her family in a befitting manner, mainly by the aid of the sum that was contributedβ€” namely, Β£141 5s. id."

Hogg then thanks his readers β€” "the students in horticulture and frugal self-sacrificing gardeners for their mites, and the affluent" β€” for their contributions.

Who Robert Hogg was: A Scottish pomologist and one of the most influential horticultural writers of the 19th century, Hogg literally wrote the book on British fruit (The Fruit Manual, 1860). He edited this journal from 1858 until his death in 1897, corresponding with head gardeners at country estates, cottage growers, and colonial correspondents from India to Canada.

The forgotten mechanism: Β£141 5s. 1d. in 1884 is roughly Β£20,000 today β€” a sum raised entirely through unsolicited reader donations to support the family of a contributor most subscribers had never met. This was not charity in the modern sense. Trade journals across Victorian Britain β€” for printers, engineers, seamstresses, gardeners β€” routinely operated as informal mutual-aid networks. The Gardeners' Royal Benevolent Institution (founded 1839) formalised the practice for horticulturalists, but as Hogg's note shows, ad-hoc collections through journals were faster and more personal.

What was lost: The idea that a subscription to a trade publication also enrolled you in a community with obligations. Modern equivalents exist β€” GoFundMe campaigns, professional benevolent funds β€” but they lack the weekly, page-by-page reinforcement of belonging that a Victorian journal provided. Hogg didn't just publish grape-pruning advice; he curated a moral economy in which a Sussex cottage gardener and a Derbyshire estate head-gardener both understood they were expected to send a few shillings when a colleague died.

The parallel to modern platforms is striking. Substack, Patreon, and Discord communities are rediscovering, awkwardly and often accidentally, what Victorian trade journals institutionalised: a periodical is not a product but a covenant. The horticultural underclass of 1884 knew this instinctively. We are relearning it slowly, one crowdfunded funeral at a time.

The forgotten claim: Victorian trade journals functioned as informal insurance networks β€” subscribers routinely pooled significant sums to support the widows and orphans of fellow contributors they had never met.

Forgotten Darkroom

The Photoshop Brush of 1909: How Photographers Painted With Developer

2026-07-15

Book: Complete self-instructing library of practical photography, Volume VIII: Studio Portraiture by J. B. Schriever, American School of Art and Photography (1909)

Read it: Internet Archive

Buried in the table of contents of a 1909 correspondence-course textbook is a chapter title that sounds almost impossible to modern ears:

CHAPTER XXXI β€” Brush Development, or Local Treatment of Negative While Developing

The book is Volume VIII of J. B. Schriever's Complete Self-Instructing Library of Practical Photography, a ten-volume mail-order curriculum published by the American School of Art and Photography in Scranton, Pennsylvania. Schriever was a working portraitist who turned his studio expertise into the era's dominant home-study photo course, sold to aspiring professionals who couldn't apprentice in a city studio. Volume VIII alone covers everything from portrait composition (with a chapter by the modernist critic Sadakichi Hartmann) to "Studio Bookkeeping" and "The Ownership of Photographic Negatives."

Brush development was a technique that has almost entirely vanished from practical photography, and it is astonishing. Instead of dunking a glass plate negative into a tray of developer and hoping the highlights and shadows resolved acceptably, the photographer would lay the wet plate flat and, with a soft camel-hair brush, paint developer onto specific regions β€” a face, a sleeve, a dark corner β€” controlling the density of individual areas by hand, in real time, as the image emerged.

Over-exposed sky? Brush developer only onto the ground, letting the sky under-develop. A shadowed cheek in a portrait? Dab extra developer there while restraining it on the forehead. It was, in effect, dodging and burning applied at the chemistry level β€” before the image was even fixed.

  • Modern silver-based photographers still know this exists, but almost nobody teaches it. Contemporary "lith printing" hobbyists occasionally use a variant, swabbing developer onto paper with cotton pads.
  • The technique was reliable enough that Schriever devoted an entire chapter of a professional-training volume to it, alongside industrial techniques like pyro development and intensification.
  • It required judgment that no automated process could replicate β€” the photographer had to read the emerging image through red safelight and decide, second by second, where to apply more or less activity.

What's striking is how directly this maps onto Photoshop's Adjustment Brush, Lightroom's local masks, and every "dodge and burn" YouTube tutorial made in the last decade. The digital revolution didn't invent local tonal control β€” it just automated a manual craft that took studio apprentices years to master. When you drag a feathered brush across a RAW file to lift a shadow, you are performing the ghost of a gesture that a Scranton correspondence student was practicing in 1909, holding a wet glass plate at arm's length and dabbing at it with a sable brush.

The chapter sits next to another lost gem: "Child Portraiture by the Ordinary Window" β€” a whole methodology for shooting kids using nothing but a north-facing window, no strobes, no reflectors. The 1909 photographer worked with less and demanded more of themselves. Their tools were their hands.

The forgotten claim: Portrait photographers in 1909 routinely painted liquid developer onto specific regions of a wet negative with a brush to control local tonality by hand β€” the direct analog ancestor of every digital "dodge and burn" tool in use today.

Forgotten Patent

Morton Heilig's "Sensorama Simulator": The 1961 Patent a Hollywood Cinematographer Filed for a Multi-Sensory VR Arcade β€” Half a Century Before the Meta Quest

2026-07-15

In January 1961, a Hollywood cinematographer named Morton Heilig filed US Patent 3,050,870, titled "Sensorama Simulator." It was granted on August 28, 1962. The drawings look like something out of a 1950s pulp magazine: a hooded arcade cabinet with a chin rest, twin peep-hole viewers, a vibrating seat, and small nozzles pointing at the user's face.

It was, in every meaningful sense, the first virtual reality machine.

Heilig wasn't an engineer. He was a filmmaker who had spent time in Rome after WWII and become obsessed with a question: why does cinema only use two senses? In 1955 he published an essay called The Cinema of the Future arguing that the next art form would engage sight, sound, smell, touch, and even balance. The Sensorama was that theory built in plywood and steel.

What it did: The patent describes a self-contained booth where a single viewer would lean into a face mask and experience a short film with:

  • Stereoscopic 3D color video (dual 35mm film strips, one per eye)
  • Stereo sound piped through side speakers
  • A vibrating seat synchronized to the film
  • Fans that blew wind at variable speed to simulate motion
  • Aroma emitters that released scents on cue via a rotating drum of chemicals

Heilig produced several short films for it. The most famous was a motorcycle ride through 1960s Brooklyn β€” you'd feel the seat rumble, wind on your face, hear the engine pan between your ears, and smell exhaust when you passed a truck, then pizza when you drove by a shop. Another was a belly dancer sequence with perfume. Another simulated a helicopter flight.

Then it failed. Heilig couldn't raise money. Arcade operators wouldn't buy a $10,000 booth that only served one person at a time. He also filed US Patent 2,955,156 in 1957 for a "Stereoscopic-Television Apparatus for Individual Use" β€” literally the first head-mounted display, with two CRT tubes, wide-angle lenses, and stereo earphones strapped to a face frame. Nobody wanted that either. Heilig died in 1997, three years after the disastrous Nintendo Virtual Boy and decades before the Oculus Rift Kickstarter.

The modern connection is uncanny. Read the 1961 patent claims and check them against today:

  • Meta Quest, Apple Vision Pro, PSVR2: Heilig's HMD patent is their direct ancestor. Ivan Sutherland's 1968 "Sword of Damocles" HMD borrowed the form factor.
  • 4DX cinemas: The South Korean chain CJ 4DPlex now operates over 800 theaters worldwide grossing hundreds of millions annually. Their feature list β€” motion seats, wind, water spray, scent, strobes β€” is a line-by-line reimplementation of the Sensorama, just scaled to a room.
  • Apple's "spatial video" on iPhone 15 Pro and Vision Pro: exactly Heilig's stereoscopic capture-and-playback pipeline, now digital.
  • Automotive and flight simulators: motion platforms, wind, vibration β€” all standard.
  • Olfactory displays: still a research niche (see OVR Technology, FeelReal), but they cite Heilig by name.

The wildest part: Heilig's patent even anticipated the economic model. His 1955 essay proposed distributing content on standardized "experience reels" that operators could swap in and out β€” essentially an app store for immersive media. He was inventing the Meta Quest Store in Eisenhower's America.

Key Takeaway: Morton Heilig's 1961 Sensorama patent specified stereoscopic 3D, spatial audio, motion, wind, and scent in a single immersive cabinet β€” every feature the modern VR and 4DX industries are still assembling, 65 years later.

Daily GitHub Zero Stars

nickelz34/Emerald-Guide

2026-07-15

Language: TypeScript

Link: https://github.com/nickelz34/Emerald-Guide

Emerald-Guide is a free, ad-free, offline-friendly walkthrough web app for PokΓ©mon Emerald, one of the most beloved entries in the Game Boy Advance era. Built in TypeScript and deployed via GitHub Pages, it aims to recreate the feel of the classic Prima strategy guides β€” with clear maps, narrative-style story prose, and comprehensive coverage of the Hoenn region and its postgame content.

What makes this project stand out from the countless PokΓ©mon wikis and fan sites out there:

  • No ads, no trackers, no popups. Anyone who has tried to look up a gym leader's team on a mainstream gaming site knows the pain of wading through autoplay video ads and cookie banners. This is a refreshing antidote.
  • Offline-friendly. Perfect for the actual use case β€” playing on a handheld emulator or original hardware without wanting to keep a browser tab loaded.
  • Prima-style prose. Rather than dry data tables, the guide leans into narrative writing that captures the storytelling feel of the official 2003-era strategy books. That's a distinctive editorial choice.
  • Postgame coverage. The description promises help "cleaning up" Hoenn after the main story, which is often where community guides fall apart.

The tech stack is straightforward: TypeScript with a static site deployment, which fits the offline-first goal well. A service worker approach would let the whole guide be cached locally after first visit β€” ideal for a nostalgic side project.

Who would benefit: Anyone doing a PokΓ©mon Emerald replay or nuzlocke run, retro handheld enthusiasts (Miyoo Mini, Anbernic, etc.) who want a companion guide on a second device, and speedrun-adjacent players who need quick trainer team references without SEO-bloated fan wiki fluff. It's also a good reference project for anyone building offline-first PWAs with TypeScript.

Why check it out: A lovingly-crafted, ad-free retro game guide that treats its readers like humans instead of ad impressions β€” exactly the kind of small-web project worth supporting.

Daily Hardware Architecture

The 4K Aliasing False Dependency: Why Loads and Stores 4096 Bytes Apart Look Identical to Your CPU

2026-07-15

When a load executes speculatively before an earlier store's address is known, the CPU has to guess whether they alias. To make that decision fast, the memory disambiguation hardware compares only the low 12 bits of the addresses β€” the page-offset bits that don't require the TLB. If those 12 bits match, the load stalls, waiting for the store to resolve. If they differ, the load proceeds.

Twelve bits covers exactly 4096 bytes. So any two addresses that are an integer multiple of 4KB apart have identical low bits and look aliased, even when they refer to completely different pages. The store might write to virtual address 0x7f00_1040 and the load might read 0x7f01_2040 β€” different pages, different cache lines, no real conflict β€” but the low 12 bits (0x040) match, and the CPU treats the load as if it might depend on the store.

The penalty isn't a full pipeline flush; it's a partial replay. The load gets held in the load queue until the store's full physical address is computed, then re-executed. On Skylake-class cores this costs roughly 5–7 cycles per event. In a tight loop, that's a 20–40% throughput hit.

Real-world example: A common bug pattern is copying between two buffers allocated with posix_memalign(..., 4096, ...) or mmap. Both buffers get page-aligned addresses. Now every store to dst[i] aliases with the load of src[i] at the same offset. A memcpy loop that should hit ~1 element/cycle drops to ~0.7. Fix: offset one buffer by 64 bytes (a cache line) so the low 12 bits diverge.

Rule of thumb: If two hot pointers differ by exactly N Γ— 4096 bytes and you're doing interleaved reads and writes, expect ~15% throughput loss. Check with perf stat -e ld_blocks_partial.address_alias on Intel β€” that counter fires once per aliasing event.

Why doesn't the CPU just compare more bits? Because bits above 12 require the TLB translation to be complete, and the whole point of speculative load execution is to not wait for that. The 12-bit compare is a deliberate accuracy-vs-latency tradeoff β€” the CPU accepts some false positives to avoid stalling every load on TLB latency.

AMD Zen has similar behavior but with slightly different penalty characteristics; the aliasing window is still 4KB because page size is the fundamental constraint.

Key Takeaway: Because memory disambiguation uses only the low 12 bits of an address, any two pointers separated by an exact multiple of 4KB will falsely appear to alias β€” silently costing 5–7 cycles per interleaved load/store pair.

Hacker News Deep Cuts

Tutorial: Algebraic Foundations Powering FlashAttention

2026-07-15

FlashAttention is one of those algorithms that quietly rewrote what's possible in modern LLM training. It made attention IO-aware β€” recognizing that the bottleneck in transformer inference isn't FLOPs but memory bandwidth between HBM and on-chip SRAM. Every serious ML engineer has heard of it. Very few can actually explain the math behind why the online softmax trick works, or how the block-wise recomputation preserves numerical equivalence with the naive attention formulation.

This tutorial promises to fill exactly that gap. The URL β€” "learning-flashattention-the-hard-way-part-1" β€” signals the right pedagogical instinct. Not a hand-wavy overview. Not a code walkthrough that skips the derivations. The algebraic foundations. That means:

  • The log-sum-exp trick and its numerical stability properties
  • How the online softmax maintains a running normalizer that can be corrected after seeing each new block, without a second pass over the data
  • The associativity properties that make tiled matrix multiplication mathematically equivalent to the full computation
  • Why the backward pass can recompute activations instead of storing them β€” the memory-compute tradeoff that unlocks longer contexts

Content like this is genuinely rare. Tri Dao's original papers are dense, and most secondary explanations either stay too surface-level ("it tiles the attention matrix!") or dive straight into CUDA kernels without motivating why the algorithm is correct. A tutorial that patiently builds the algebra from first principles is exactly what practitioners moving from "user of FlashAttention" to "implementer of custom attention variants" need.

The value multiplies when you consider the current landscape: ring attention, sliding-window attention, PagedAttention, FlashAttention-3 β€” all descendants of the same core algebraic insight. Understanding the foundations means understanding the whole family tree. It's the difference between memorizing a formula and being able to derive the next variant yourself.

A Part 1 suggests a series, which is even better. This is the kind of long-form technical writing that ages well β€” the algebra won't change even as the kernels do. If riftstack.ai keeps this quality up, it's worth bookmarking regardless of whether individual posts hit the front page.

Why it deserves more upvotes: Rigorous mathematical explanations of FlashAttention are surprisingly scarce, and this tutorial targets the exact gap between paper-level abstraction and kernel-level implementation that most engineers get stuck in.

HN Jobs Teardown

Inpher: What Their Hiring Reveals

2026-07-15

Source: HN Who is Hiring

Posted by: srosenberg

Of the ten postings, Inpher is the most revealing because it's the only one betting the entire company on a technology bet β€” privacy-preserving computation β€” rather than a market bet. The framing "privacy and security are foundational to the future of computing" is a manifesto, not a job description, and that tells you everything about who they're trying to attract.

The tech stack (by omission). Notice what's missing: no React, no Postgres, no Kubernetes, no AWS. Compare that to the Vienna posting one slot down, which lists seven technologies in one line. Inpher lists zero. That's deliberate β€” when your product is secure multi-party computation and homomorphic encryption, the stack is C++, Rust, and hand-tuned linear algebra over finite fields. You don't advertise it because the candidates who matter already know, and the candidates who'd be excited by "we use React" would be miserable debugging lattice-based crypto primitives at 3am.

What the posting reveals about stage. Three offices (NYC, Lausanne, Paris), $14M raised, "veteran founders" and "world-renowned cryptographers." This is Series A, deeply technical, and enterprise-focused. The Lausanne office is the tell β€” that's EPFL territory, where a huge chunk of applied cryptography research happens. They're co-located with their talent pipeline. The NYC HQ signals they're selling to financial services, which is the only vertical currently willing to pay real money for FHE/MPC today.

Skills and trends highlighted. This posting is a leading indicator for the confidential computing wave that's since become mainstream (Intel SGX, AWS Nitro Enclaves, Apple's Private Cloud Compute). In 2020, betting a company on this was contrarian. Inpher was hiring for a thesis β€” regulated industries would eventually need to compute on data they legally couldn't see β€” that has aged well.

Green flags:

  • "Small team of veteran founders" β€” no LinkedIn-flavored buzzwords, just credentials
  • Direct email to the poster β€” real engineers actually read applications
  • Three offices but "onsite" β€” they value in-person cryptography whiteboarding, which is honest about how hard the work is

Red flags:

  • Only $14M raised for three international offices is thin β€” the burn math is tight, and privacy-tech has notoriously long enterprise sales cycles
  • "Software Engineers" as a single undifferentiated role suggests the org is small enough that role definition hasn't happened yet β€” you'll wear every hat
  • No comp band listed (unlike Fold's transparent $110k-140k) β€” expect below-market cash offset by equity in a moonshot
The signal: When a company omits its tech stack entirely and leads with founder credentials, they're not hiring generalists β€” they're hiring true believers in a technical thesis that hasn't paid off yet.

Daily Low-Level Programming

The PR_SET_MM_EXE_FILE prctl: How CRIU Rewrites /proc/self/exe Without execve()

2026-07-15

Every process has a kernel-tracked pointer to the file it was execve()'d from. That pointer is what /proc/self/exe resolves to, what readlink on /proc/<pid>/exe returns, and what appears in /proc/<pid>/maps as the main binary. It lives in mm_struct.exe_file β€” a reference-counted struct file* stashed on the process's memory descriptor. Normally, only execve() can change it, because normally the identity of your binary is fixed at exec time.

But sometimes it isn't. CRIU (Checkpoint/Restore In Userspace) restores a process from a saved image without doing an execve(): it forks a clone, maps the original binary back in with mmap(), and reconstructs the address space page by page. Everything works β€” except /proc/self/exe, which still points to the CRIU restorer binary, not the original. That leak breaks anything that reads /proc/self/exe to find its own binary (Java, Go runtimes, dynamic linkers doing self-relocation).

The fix is prctl(PR_SET_MM_EXE_FILE) (added in Linux 3.18). You open the target binary, pass the fd, and the kernel swaps mm->exe_file to point at it. From that instant, /proc/self/exe resolves to the new file.

It's not a free lunch. The kernel enforces several rules:

  • The fd must reference a file that is executable (has an executable mmap of it in your address space, in older kernels) or has the executable bit set.
  • The caller needs CAP_SYS_RESOURCE. Not root, but close.
  • Pre-5.11 kernels only allowed this once per mm_struct. After 5.11, unlimited, because container runtimes needed to update exe multiple times during nested restore.

Concrete example: a Go binary calls os.Executable(), which reads /proc/self/exe. Under CRIU restore without PR_SET_MM_EXE_FILE, it returns /usr/sbin/criu. With the prctl, it correctly returns /opt/myapp/server. Same PID, same address space, but the kernel's "what am I?" pointer got rewritten mid-flight.

Rule of thumb: anything you find in /proc/<pid>/ that looks immutable β€” exe, cmdline, auxv, arg_start/env_start β€” has a corresponding PR_SET_MM_* subcommand. There are ~15 of them. They exist entirely so that userspace restore tools can lie to the kernel about identity without going through execve().

The clever bit: because mm->exe_file is just a refcounted struct file*, the swap is atomic from the reader's perspective. A concurrent readlink("/proc/self/exe") sees either the old or new path, never a torn result.

Key Takeaway: The kernel's idea of "which binary is this process" is a mutable pointer, and prctl(PR_SET_MM_EXE_FILE) is the only supported way to change it without execve() β€” which is exactly what CRIU needs to restore a process without re-exec'ing it.

RFC Deep Dive

RFC 4707: Netnews Administration System (NAS)

2026-07-15

RFC: RFC 4707

Published: 2006

Authors: P. Grau, V. Heinau, H. Schlichting, R. Schuettler

By 2006, Usenet was already a shadow of its 1990s self, yet it remained a sprawling federation of thousands of independently administered news servers exchanging articles across dozens of hierarchies (comp.*, rec.*, de.*, fj.*, and countless regional trees). Coordinating this mess β€” who carries which groups, who is a hierarchy maintainer, which control messages are legitimate, which PGP key signs the checkgroups for a given hierarchy β€” was still being done by hand, with news admins emailing each other and manually editing active, newsgroups, and control.ctl files. RFC 4707 proposed a machine-readable fix: the Netnews Administration System.

The problem. Usenet's control-message system (RFC 5537's ancestors) let anyone forge newgroup or rmgroup messages. Admins defended themselves with control.ctl, a text file listing which PGP-signed senders were trusted for each hierarchy. But that file was maintained out-of-band, by ISC and volunteers, and every news server had a slightly different copy. Meanwhile, information about hierarchies β€” description, language, moderation policy, contact address, expiry rules β€” lived in scattered README files with no schema.

The design. NAS defines an XML-based repository containing three kinds of records:

  • Hierarchy records β€” one per top-level tree, listing the maintainer, contact, PGP key fingerprint used to sign control messages, default moderation status, and a human-readable description in multiple languages.
  • Newsgroup records β€” one per group, with description, charter URL, moderator address if applicable, expected traffic volume, and language.
  • Server records β€” describing news servers, which hierarchies they carry, peering contacts, and administrative policy.

Each record has a globally unique identifier, a version number, and a signature from the authoritative maintainer. Servers fetch NAS data over HTTP (or NNTP), verify signatures, and use it to auto-generate their control.ctl, newsgroups, and even active configuration. A distributed replication model β€” modeled loosely on DNS β€” lets hierarchy owners publish updates that propagate without a central authority.

Design decisions worth noting. The authors chose XML at the peak of XML enthusiasm; a modern respin would obviously use JSON or YAML. They deliberately avoided requiring a central registry, learning from earlier attempts (ISC's ftp.isc.org hosting of control.ctl was a convenient de facto center, but also a single point of failure and a political flashpoint). Cryptographic identity is bound to the hierarchy, not to a person β€” so if the de.* maintainer changes, the key rolls without every downstream server having to be reconfigured. Language tags follow RFC 3066, so a Japanese group can carry a description readers in fj.* can render natively.

Why it never took over. NAS arrived at the wrong moment. Usenet text traffic was collapsing as web forums, blogs, and eventually Reddit absorbed community discussion. What remained of high-volume Usenet had migrated to binaries groups run by commercial providers who had no interest in cooperative administration schemas. A few implementations appeared (INN had experimental support), but critical mass never happened.

Why it still matters. NAS is a beautifully clean example of the recurring problem of federated metadata distribution: how do you let independent operators publish authoritative information about their piece of a namespace, cryptographically verifiable, without a central registry? The same problem shows up today in Fediverse instance directories, DNSSEC trust anchors, WebFinger, DID documents, and package registry mirroring. Reading RFC 4707 is like finding a well-drawn map of a country most people forgot existed β€” and realizing the roads it sketches are the same ones we're paving today under different names.

Why it matters: A late-era Usenet spec that quietly anticipated the federated, cryptographically-signed metadata distribution problems the Fediverse and decentralized identity systems are re-solving today.

Stack Overflow Unanswered

how to get IDT handler address in assembly

2026-07-15

Stack Overflow: View Question

Tags: assembly, x86, nasm, interrupt, bootloader

Score: 5 | Views: 171

The asker is writing a minimal protected-mode bootloader in NASM and wants to install an IDT entry for the keyboard interrupt (IRQ1, vector 0x21 once PIC is remapped, or 0x09 by default). The IDT entry format is the sticking point: it's an 8-byte structure that splits the 32-bit handler address into two non-contiguous 16-bit halves β€” offset bits [15:0] at bytes 0-1, and offset bits [31:16] at bytes 6-7, with a segment selector, reserved byte, and type/attr byte sandwiched in between. The asker doesn't know how to compute those low and high halves from a label at assembly time.

Why this is more interesting than it looks: The naive C-brain approach would be to write helper code that shifts and masks at runtime. But an IDT entry is data β€” it wants a compile-time constant expression. NASM's expression evaluator can do this directly, and knowing the idiom unlocks a whole class of firmware/OS-dev tasks (GDT descriptors, ACPI tables, page directory entries with split fields).

The idiom in NASM:

kbd_handler:
    ; ... push regs, read port 0x60, EOI, iret ...
    iret

idt_start:
    ; vector 0x21 (after PIC remap) β€” vectors 0..0x20 zeroed above
    dw kbd_handler & 0xFFFF        ; offset [15:0]
    dw 0x08                        ; kernel code selector
    db 0                           ; reserved
    db 0x8E                        ; present, ring 0, 32-bit interrupt gate
    dw (kbd_handler >> 16) & 0xFFFF ; offset [31:16]
idt_end:

idt_descriptor:
    dw idt_end - idt_start - 1
    dd idt_start

The & and >> operators evaluate at assembly time because kbd_handler resolves to an absolute address (given the [org 0x7c00] the bootloader uses).

Gotchas the asker will hit next:

  • ORG matters. With [org 0x7c00], labels are already absolute β€” good. Without it, kbd_handler would be a file offset and the CPU would jump into the weeds.
  • Bootloader lives at 0x7c00, but only 512 bytes. A handler + IDT plus the boot signature is tight. Realistically this belongs in a stage 2 loaded elsewhere.
  • PIC still needs remapping. In real mode, IRQ1 fires vector 0x09, which overlaps CPU exception vectors in protected mode. Without remapping the master PIC (ICW1-ICW4 to ports 0x20/0x21), a keyboard press will look like an invalid opcode fault.
  • Unmask IRQ1 and sti. Easy to forget after loading the IDTR with lidt [idt_descriptor].
  • Selector 0x08 must match a valid 32-bit code segment in the GDT with the correct DPL, or the CPU raises #GP on delivery instead of dispatching.
The challenge: IDT entries look like a runtime problem but are really an assembler-expression problem β€” knowing NASM can split a label with & 0xFFFF and >> 16 at build time is the whole trick.

Daily Software Engineering

The 2Q Cache Eviction Pattern: LRU's Smarter Cousin That Filters Scan Traffic

2026-07-15

Plain LRU has a fatal weakness: a single large scan pollutes the cache. Read a table front-to-back once and you evict every hot page in favor of pages you'll never look at again. 2Q β€” introduced by Johnson and Shasha in 1994 β€” fixes this by demanding a page prove it's worth keeping before promoting it to the main cache.

The structure uses three queues:

  • A1in (FIFO): newly-seen pages land here. Small β€” typically 25% of cache size.
  • A1out (ghost FIFO): keys only (no data) of pages evicted from A1in. Sized around 50% of cache.
  • Am (LRU): the "hot" main cache. Gets the remaining 75%.

The admission rules are what make it clever:

  • First access β†’ insert into A1in.
  • Hit while still in A1in β†’ do nothing. Don't promote yet. This is the anti-scan trick.
  • Miss, but key is in A1out (was evicted recently) β†’ this page has earned it. Promote to Am.
  • Hit in Am β†’ normal LRU move-to-front.

Concrete example. PostgreSQL's original buffer manager used pure LRU and suffered badly on sequential scans of large tables β€” a `SELECT COUNT(*)` on a 10GB table would flush the 1GB buffer pool. With 2Q, those scan pages cycle through A1in and get evicted before they ever touch Am. Meanwhile, an index page you hit twice within a few minutes (once, evicted to A1out, hit again) gets promoted and stays. PostgreSQL eventually adopted a variant of this idea in its clock-sweep algorithm; MySQL's InnoDB buffer pool uses a similar "young/old sublist" split that's essentially 2Q with different naming.

Rule of thumb for sizing. A1in should hold roughly the working set of a single scan burst β€” 20–25% of total cache is a good default. A1out (ghost entries) should be about 50% of cache size; too small and legitimately hot pages don't get a second chance, too large and you waste memory on keys. Am absorbs the rest. If your hit rate on Am is below 80%, A1in is probably too big; if promotion rate to Am is near zero, A1out is too small.

The cost: three data structures instead of one, plus you're storing "ghost" keys that hold no value. In exchange you get scan resistance essentially for free β€” which is why nearly every serious database buffer manager uses some flavor of it.

Key Takeaway: 2Q protects hot data from scans by requiring pages to be re-referenced after eviction before earning a spot in the main LRU β€” a second-chance filter that costs a little memory and dramatically improves hit rates under mixed workloads.

Tool Nobody Knows

ltrace: strace's Sibling That Shows You Every Library Call, Not Just Syscalls

2026-07-15

Everyone reaches for strace when a program misbehaves. But strace only shows the kernel boundary β€” the moment your process finally begs the OS for something. The interesting bugs usually live one layer up: in libc, OpenSSL, libcurl, or that in-process plugin loader. That's where ltrace earns its keep. It intercepts every dynamic library call by hooking the PLT/GOT, so you see malloc, fopen, SSL_read, and dlopen the way strace shows read and mmap.

Install it: apt install ltrace or the equivalent. Then start where you'd normally start with strace:

$ ltrace ls /tmp
__libc_start_main(0x402a10, 2, 0x7ffc..., 0x40b1c0 <unfinished ...>
strrchr("ls", '/')                                     = nil
setlocale(LC_ALL, "")                                  = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale")       = "/usr/share/locale"
malloc(120)                                            = 0x55c1e2a3d2a0
opendir("/tmp")                                        = 0x55c1e2a3d3f0
readdir(0x55c1e2a3d3f0)                                = 0x55c1e2a3d420
...

Summarize instead of firehose. Just like strace -c, ltrace -c gives a call/time histogram. Perfect for hunting malloc storms or catching an accidental O(nΒ²) strlen:

$ ltrace -c -f ./myapp
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 41.22    0.180432          14     12683 malloc
 30.05    0.131522          13      9812 free
 12.78    0.055930         203       275 SSL_read
  8.11    0.035497           9      3719 __ctype_b_loc

Filter by function or library. The full trace is noisy β€” narrow it to what you care about. Discover where an opaque binary reads its config:

$ ltrace -e 'fopen+open+openat+access' ./mystery-daemon 2>&1 | head
fopen("/etc/mystery/config.yml", "r") = 0x55...
access("/var/lib/mystery/license", F_OK) = 0
openat(AT_FDCWD, "/etc/hosts", O_RDONLY) = 5

Or watch every call into a specific shared library β€” invaluable for figuring out which crypto stack a stripped binary is really using:

$ ltrace -l 'libssl*' -l 'libcrypto*' ./client https://example.com

Catch plugin loading in the act. Watching dlopen/dlsym tells you exactly which shared objects a process resolves at runtime, and which symbols it grabs β€” often the fastest way to reverse-engineer a plugin ABI:

$ ltrace -e 'dlopen+dlsym+dlerror' -f -p 12345
[pid 12345] dlopen("plugins/auth_ldap.so", RTLD_NOW) = 0x7fa...
[pid 12345] dlsym(0x7fa..., "auth_init")            = 0x7fa...b210

Attach to something already running. Same -p PID semantics as strace. Add -f to follow forks. Add -S and you get syscalls interleaved with library calls in one unified stream β€” the closest thing Linux has to a poor-man's userland dtrace -F:

$ ltrace -S -f -p $(pgrep nginx | head -1)

Caveats to know before you swear by it. ltrace only sees dynamically-linked calls β€” statically-linked binaries (hi, Go) show nothing useful. It's slower than strace because it single-steps through the PLT. And on distros with full RELRO the PLT is sometimes read-only in a way that breaks tracing; run against a debug or non-hardened build if you hit weirdness. None of this makes it less brilliant when the bug is above the syscall layer.

Key Takeaway: strace shows what your program asks the kernel; ltrace shows what it asks its libraries β€” and most bugs live in that second, chattier layer.

What If Engineering

What If We Launched Airliners with Electromagnetic Catapults Like Aircraft Carriers?

2026-07-15

The USS Gerald R. Ford's EMALS (Electromagnetic Aircraft Launch System) flings a 45-tonne F/A-18 from zero to 240 km/h in 91 meters β€” roughly 3g of acceleration. Commercial airliners need a 3,000-meter runway to reach VR (rotation speed) using thrust alone, burning enormous fuel and generating community-shattering noise. What if we scaled EMALS up and launched Boeing 737s off a 500-meter linear motor track instead?

The energy problem

A loaded 737-800 weighs about 79,000 kg with rotation speed β‰ˆ 77 m/s (150 knots). Kinetic energy at launch:

KE = Β½ Γ— 79,000 Γ— 77Β² β‰ˆ 234 MJ

Over a 500 m track, mean acceleration is vΒ²/(2d) = 77Β²/1000 β‰ˆ 5.9 m/sΒ² (~0.6 g). That's comfortable β€” well under a Six Flags launch coaster and imperceptible compared to an F-18 cat shot. Passengers keep their coffee.

Power delivery

Peak mechanical power occurs at release: F Γ— v = (79,000 Γ— 5.9) Γ— 77 β‰ˆ 36 MW. Averaged over the 13-second stroke, delivered energy divided by time gives ~18 MW mean. You cannot pull 36 MW from a grid transformer without collapsing the substation, so you do what EMALS does: flywheel energy storage. Ford-class uses four 121-tonne composite flywheels spinning at 6,400 rpm. Sized for a 737, you'd need roughly 300 MJ of usable storage (including ~70% end-to-end efficiency) β€” about 1.5Γ— the Ford system per launch pad. Fed by a modest 2–3 MW grid connection, it recharges between departures.

What you get

  • Runway shrinks from 3 km to ~1 km. The 500 m catapult accelerates the aircraft to rotation speed; the remaining runway is just an abort strip and unstick margin. LaGuardia's constrained footprint suddenly triples in usable land.
  • Takeoff fuel savings: ~600 kg per departure. A 737 burns roughly 800 kg of Jet-A from brake release to 1,500 ft. About 234 MJ goes into kinetic energy; the rest is heat, noise, and drag. Electric catapult efficiency is ~70% vs. jet engine takeoff efficiency of ~25%, so grid-electricity substitution eliminates ~600 kg COβ‚‚-equivalent per flight. Global commercial aviation performs ~100,000 departures/day β†’ ~22 million tonnes COβ‚‚/year from takeoff alone.
  • Noise collapses. The engines still spool up for the climb-out, but the piercing takeoff-thrust roar over the perimeter fence vanishes. Airports near neighborhoods (Heathrow, San Diego) get their curfews back.

Where physics pushes back

The nose gear is the killer. Carrier aircraft have reinforced launch bars welded to a beefed-up nose strut designed for 3g shots. A 737's nose gear was engineered for gentle rolling loads β€” hooking a catapult shuttle to it at 0.6g Γ— 79 tonnes = 465 kN of drawbar force would peel it off the airframe. Retrofit is impossible; every airliner would need a structural redesign around a belly-mounted tow point, adding perhaps 400 kg of steel per aircraft.

Second: rejected takeoffs. Once the shuttle releases, the plane is committed above V1 in 13 seconds β€” no gradual abort window. Engine failure during the stroke means the shuttle must decelerate 79 tonnes plus itself. EMALS has a water-brake absorber; scaled up, it's a swimming pool of energy dissipation under every runway.

Key Takeaway: The energy math works trivially at ~0.6g and saves ~22 million tonnes of COβ‚‚ annually, but you'd have to redesign the landing gear of every airliner on Earth β€” the airframe, not the catapult, is the binding constraint.

Wikipedia Rabbit Hole

PAVE PAWS

2026-07-15

Somewhere on Cape Cod, a windowless concrete pyramid tilts its face toward the northern sky. It has no moving parts. It doesn't spin, it doesn't tilt, it doesn't hum with the servo whine of a rotating dish. And yet, since 1980, it has been watching for the end of the world β€” specifically, for submarine-launched ballistic missiles rising out of the Atlantic on a trajectory toward Washington.

This is PAVE PAWS: the Phased Array Warning System, one of the strangest-looking pieces of Cold War infrastructure still in operation. The name "PAVE" is one of those wonderful Air Force code prefixes with no real meaning β€” officially it's just a program identifier, though pilots joke it stands for "Precision Avionics Vectoring Equipment." PAWS is the honest half: Phased Array Warning System.

Here's the thing that makes it beautiful: a phased array radar can point its beam without physically moving. Instead of aiming an antenna, PAVE PAWS aims a wavefront. Each of its 1,792 active elements emits the same signal, but with tiny, computer-controlled time delays. When the wavefronts from all those elements meet in the sky, they constructively interfere in one specific direction β€” and that direction can change thousands of times per second. If you've ever seen a marching band spell out letters by turning cards, that's exactly the principle, except the "cards" are radio phases and the "letters" spell out where the beam is looking.

Two pyramid faces, tilted 20Β° back and covering 240Β° of azimuth, mean the radar can effectively watch an entire hemisphere of ocean. The active elements produce over 145 kW of RF β€” enough that the sites had to be studied for years for health effects on nearby Cape Cod residents, and enough that the beam can spot a basketball-sized object 3,000 miles away.

If you've heard of AESA radars in modern fighter jets like the F-35, PAVE PAWS is their giant, geriatric ancestor. Same principle, forty years earlier, at building scale. The technology bloomed here first because ballistic missile detection needed something dishes couldn't provide: the ability to track dozens of incoming warheads simultaneously, not sequentially. A spinning dish sees one thing at a time. A phased array sees everything, everywhere, all at once β€” a decade before that became a movie title.

  • Original sites: Cape Cod (MA), Beale AFB (CA), Clear (AK), Thule (Greenland), and Fylingdales (UK)
  • Range: ~3,000 miles for objects the size of a small vehicle
  • Also doubles as a space surveillance sensor β€” tracking thousands of orbital objects between apocalypse-watching shifts

The Cape Cod site was almost decommissioned in 2011 as budget cuts loomed. It was saved partly because it turned out to be irreplaceable for tracking space debris β€” including, occasionally, defunct satellites tumbling toward reentry over populated areas. The doomsday machine found a second career as a cosmic janitor.

Down the rabbit hole: A concrete pyramid built to see incoming nuclear warheads now spends most of its time cataloguing space junk β€” and it does it without a single moving part.

Daily YT Documentary

Sniper Duels | A TF2 Mini-Documentary

2026-07-15

Sniper Duels | A TF2 Mini-Documentary

Channel: TableCroissants (2620 subscribers)

Most of today's crop is either hashtag-spam shorts, AI-narrated filler, or vague personal vlogs. The TableCroissants mini-documentary on Team Fortress 2 sniper duels stands out as the one entry that actually promises to teach something specific: the mechanics, psychology, and unwritten etiquette of one of the most iconic 1v1 subgames in multiplayer FPS history.

TF2's Sniper class has been the subject of nearly two decades of community study β€” headshot hitboxes, scope-in timing, quickscope versus fully-charged shots, sightline theory, and the strange mutual-respect rituals that develop when two snipers repeatedly duel across a map. A good mini-doc on the topic can pull from a genuinely deep well: pro Highlander play, community jump maps, and the way Valve's netcode quirks shape which duels are winnable.

The channel is small (2.6k subs) but the tongue-in-cheek framing ("the subspecies of Snipers is a fascinating study") suggests a nature-documentary parody style β€” a format that, when done well, teaches real game mechanics under the guise of comedy. If you've ever played TF2, or you're curious how competitive communities develop informal codes of conduct around specific mechanics, this is the pick of the batch.

Caveat: the rest of the list is notably weak today, so this wins partly by default β€” but it's a legitimately interesting niche topic.

Why watch: A nature-doc-style breakdown of TF2's sniper-vs-sniper duels, blending game mechanics with the informal etiquette that competitive communities develop around them.

Daily YT Electronics

Protect Your Soldering Iron from Overheating Using Just 1 DiodeπŸ”₯

2026-07-15

Protect Your Soldering Iron from Overheating Using Just 1 DiodeπŸ”₯

Channel: Creative time (120 subscribers)

Most of the candidates in this batch are shorts, hashtag spam, or product promos, so the pickings are thin β€” but this one actually teaches a useful, generalizable electronics concept, so it's the clear winner.

The trick here is the classic half-wave rectification hack: wiring a single power diode in series with an AC-powered soldering iron. Because the diode blocks one half of every AC cycle, the iron only sees current roughly half the time, which cuts the average power delivered to the heating element by about 50%. The result is a simple "half-power" switch that keeps a cheap, non-thermostatic iron from cooking itself (and its tip) when left idle between joints.

It's worth watching because the same principle shows up all over hobby electronics β€” dimming incandescent bulbs, running small AC motors slower, extending the life of resistive heaters. Understanding why one diode changes average power (and why it doesn't work on DC or on triac-controlled loads) is a genuinely useful bit of intuition. For a beginner with a $5 iron and no temperature control, it's also a practical mod that costs pennies and can meaningfully extend tip life by preventing oxidation from prolonged overheating.

Caveat: at 120 subs and a short runtime, expect a quick demo rather than a deep theory lesson β€” but the core idea is solid and worth the couple of minutes.

Why watch: A one-diode half-wave rectifier trick that halves the power to an AC soldering iron β€” a tiny mod that illustrates a broadly useful electronics principle.

Daily YT Engineering

12. MEMS Actuation Explained

2026-07-15

12. MEMS Actuation Explained

Channel: Dimuthu (80 subscribers)

MEMS (Micro-Electro-Mechanical Systems) sit at a fascinating intersection of solid-state physics, mechanical engineering, and semiconductor fabrication β€” and actuation is the hardest half of the story. Reading the world with a sensor is one thing; forcing a sliver of silicon a few microns wide to move reliably, repeatably, and without tearing itself apart is another problem entirely.

This video, part of what appears to be a structured lecture series (episode 12), tackles the actuation side head-on: how do you generate useful mechanical force at scales where gravity is irrelevant, surface adhesion dominates, and traditional motors are meaningless? Expect coverage of the main actuation families β€” electrostatic (comb drives and parallel-plate designs used in accelerometers and DLP mirrors), piezoelectric (the workhorse of inkjet printheads and precision positioning), thermal (bimorph and hot-arm designs), and likely magnetic or electromagnetic variants.

What makes small-channel lecture content like this worth your time is that it's typically pitched at engineering students rather than a general audience, so the physics stays intact. You'll get the actual scaling laws that explain why electrostatics dominates at micro scales while magnetics dominates at macro scales β€” a genuinely counterintuitive result rooted in how force scales differently with size for each mechanism.

If you've ever wondered how the accelerometer in your phone or the tiny mirrors in a projector chip actually push themselves around, this is the foundational knowledge.

Why watch: A rigorous walkthrough of how engineers coax motion out of silicon at scales where our everyday intuitions about force and inertia stop working.

Daily YT Maker

I Made CNC Inlay Cutting Boards β€” But This Moment Mattered Most

2026-07-15

I Made CNC Inlay Cutting Boards β€” But This Moment Mattered Most

Channel: Woodshop Therapy (1320 subscribers)

CNC inlay work is one of those techniques that looks like magic until you understand the geometry behind it β€” and walnut end-grain cutting boards are already a demanding project before you add contrasting wood species set flush into the surface. This video promises both: a full build of end-grain boards featuring rockfish, crab, and marlin inlay designs.

End-grain construction is a serious woodworking topic on its own. The grain orientation makes the boards gentler on knife edges, but it also means the wood moves seasonally in ways face-grain doesn't, and it tears out aggressively under a router bit. Combining that with CNC inlays β€” where a male and female pocket have to mate perfectly with the right V-bit angle, depth calculations, and glue-up strategy β€” is a real test of toolpath planning.

The title hints the maker also spends time on why the project mattered to them personally, which tends to make small-channel woodworking content more watchable than a straight process video. Expect a mix of Fusion or VCarve setup, fixturing for end-grain stock, and finishing techniques appropriate for food-contact surfaces.

Good pick for anyone considering their first CNC inlay project or looking to level up from face-grain boards.

Why watch: A rare combination of end-grain cutting board construction and multi-species CNC inlay work, with the maker's personal angle keeping it from feeling like a dry tutorial.

Daily YT Welding

Forging a Sharp Knife from Steel Bearing Balls | Amazing Metalworking

2026-07-15

Forging a Sharp Knife from Steel Bearing Balls | Amazing Metalworking

Channel: Skill Foundry (126 subscribers)

Bearing balls are made from high-carbon chromium steel (usually AISI 52100), which is one of the most sought-after materials in knife-making circles. It holds a razor edge, resists wear, and forges beautifully once you can get past its stubborn round shape. This video follows the full journey of turning a pile of those small spheres into a finished blade.

The tricky part with bearing balls is consolidation: you need to weld them together into a single billet before you can even begin shaping a knife. That means bringing them to a bright orange heat, containing them in a jig or canister, and hammering carefully so they fuse without trapping scale or creating cold shuts. Once forged into a bar, the smith draws it out, profiles the blade, normalizes it, quenches in oil, and tempers.

Watching a smaller channel work through this process is more rewarding than the polished factory clips β€” you get to see the real challenges of forge welding a difficult material, and the payoff of a finished knife made from what most people would throw in the scrap bin.

Why watch: A start-to-finish demonstration of forge-welding 52100 bearing steel into a working knife β€” a challenging technique that turns discarded hardware into premium blade stock.

All newsletters