Daily Digest — 2026-08-22

25 newsletters today.

In this digest


Abandoned Futures

The SNECMA C.450 Coléoptère: The Annular-Wing Tail-Sitter VTOL That Hovered on a Ring in 1959 and Crashed on Its Ninth Flight, Taking the Whole Concept With It

2026-08-22

On 6 May 1959, a French test pilot named Auguste Morel lit an Atar 101 E.V. turbojet at Melun-Villaroche airfield and lifted a machine that looked like a lipstick tube standing on a doughnut. The SNECMA C.450 Coléoptère ("beetle") was a tail-sitting VTOL with an annular wing — a complete cylindrical ring, 3.2 meters in diameter, wrapped around the aft fuselage. No conventional wing, no separate horizontal stabilizer. The ring itself provided lift in horizontal flight, acted as a shroud around the exhaust in hover, and gave the pilot four small castoring wheels to land on.

The idea traced back to Austrian aerodynamicist Helmut von Zborowski, who had joined SNECMA after the war and patented the annular-wing concept in the early 1950s. Von Zborowski's math said a ring wing would give better lift-to-drag than a conventional planform at supersonic speeds, generate no wingtip vortices, and — critically — let a tail-sitting fighter transition to horizontal flight by simply pitching over 90 degrees. No tilting engines, no rotating wings, no ducted fans. Just one jet and one ring.

SNECMA built the C.450-01 around a modified Atar turbojet producing about 3,700 kgf of thrust — enough to lift the 3-ton airframe with margin. The pilot sat in a tilting seat that rotated so he wasn't lying on his back during hover. Control in the vertical regime came from four swiveling exhaust vanes in the jet efflux, with puffer jets bled from the compressor for roll. In eight flights between May and July 1959, Morel got the Coléoptère to hover at 800 meters, translate horizontally at low speed, and demonstrate stable vertical landings. The French air ministry was cautiously optimistic; a supersonic follow-on, the C.470, was already on the drawing board.

The ninth flight, on 25 July 1959, killed it. Morel attempted a transition to horizontal flight, lost pitch control as the aircraft entered a dangerous nose-up attitude, and ejected at low altitude. He survived with severe injuries; the Coléoptère was destroyed. Post-crash analysis identified the core problem: the pilot had no attitude reference during transition. Looking straight up through a narrow canopy at empty sky, with no horizon and sluggish gyro instruments, Morel simply couldn't tell which way the aircraft was pointing. The annular wing itself worked. The human in the loop didn't.

SNECMA cancelled the program within months. The tail-sitter concept died across the industry — Convair's XFY-1 Pogo and Lockheed's XFV-1 had hit the same wall in the US in 1955 for the same reason.

Sixty-seven years later, every one of those objections has evaporated:

  • Attitude reference: MEMS IMUs cost $5 and update at 1 kHz. Fly-by-wire holds attitude precisely; the pilot commands velocity vectors, not stick positions. This is exactly how quadcopters transition.
  • Transition control: modern flight computers can blend thrust-vectoring, control surfaces, and puffer jets seamlessly. The F-35B does this every landing.
  • Annular wing aerodynamics: CFD has confirmed von Zborowski's math. Ring wings show up in modern drone concepts (Lockheed's Ring-Wing UAV studies, several eVTOL patents) precisely because they eliminate tip vortices and package neatly.
  • Uncrewed operation: the pilot-disorientation problem simply doesn't exist for a drone.

A modern Coléoptère — unmanned, fly-by-wire, with a small turbofan or electric ducted fan — would be a compact loitering VTOL that launches from a pad the size of a manhole cover and cruises horizontally on ring-wing lift. The concept was killed by 1959 avionics, not 1959 aerodynamics.

Key Takeaway: The Coléoptère proved a ring-wing tail-sitter could hover and transition — it just needed a flight computer instead of a disoriented human, and 2026 has that computer in every hobby drone.

ArXiv Paper Digest

The Third Restructuring of Software Form: From the Three-Tier Architecture to Storage, Models, and Agents

2026-08-22

Authors: Wei Lin, Tao Zhou, Zhaofei Xie, Changgui Hong

ArXiv: 2608.20201v1

PDF: Download PDF

For decades, software has been built roughly the same way: a presentation layer (the buttons and screens you click), a logic layer (the code that decides what happens when you click), and a data layer (the database where stuff gets stored). This "three-tier architecture" has been the default blueprint for everything from banking apps to e-commerce sites. This paper argues that we're now living through a fundamental break from that pattern — and that the new blueprint has only three parts, but they're radically different.

The authors frame software history as three eras:

  • Software 1.0: Humans write explicit instructions. Behavior is determined by code.
  • Software 2.0: Humans provide data and let machine learning models figure out the rules. Behavior is determined by training data.
  • Software 3.0: Humans provide context and goals, and reasoning models figure out what to do. Behavior is determined by context and reasoning.

In this new world, they claim the three-tier stack collapses into a new trio:

  • A generalized database — not just a table of rows, but a unified store for everything the system remembers: files, vector embeddings, past conversations, world state. Memory becomes a first-class primitive rather than an afterthought.
  • A large model — the reasoning engine that replaces most hand-written business logic. Instead of coding "if user does X, then Y," you describe the goal and the model reasons about it.
  • Agents — the actors that take goals, call tools, invoke the model, read and write memory, and actually get things done in the world.

The key insight is that the interface between components has shifted from function calls to natural language and context. In the old architecture, layers communicated through rigid APIs — a frontend calls a specific backend endpoint with specific parameters. In the new one, components exchange goals, memories, and reasoning traces. This changes almost everything downstream: how you version software (prompts and context, not just code), how you test it (behavior is probabilistic), how you debug it (traces of reasoning, not stack traces), and how you architect it (storage and memory design become as important as model choice).

It's a position paper, not an experimental one — the authors aren't proving the shift with benchmarks, they're naming a pattern they see forming across the industry and arguing developers should design for it explicitly rather than accidentally.

Why it matters: If the authors are right, the mental model most engineers use to structure applications is about to be replaced, and teams still building "frontend + backend + database" may find themselves architecturally out of step with where the industry is heading.

Daily Automotive Engines

Timing Chain Sprocket Hardness and Wear: Why Soft Sprockets Eat Chains Alive

2026-08-22

You can install the best chain money can buy, but if the sprocket teeth are soft, that chain will elongate in 40,000 miles. The sprocket is half of every meshing pair, and its surface hardness controls how the tooth flanks wear under the constant hammering of chain rollers.

The wear mechanism: Every time a chain roller engages a sprocket tooth, it slides against the tooth flank before seating in the root. This sliding contact is a mix of rolling and scuffing — and it happens millions of times per hour. If the tooth flank is softer than the chain roller, the tooth wears into a hook shape. Once hooked, the chain climbs the tooth under load, stretching the pin-bushing joints and accelerating chain elongation.

Hardness targets:

  • Sintered powder-metal sprockets (most modern OEM cam sprockets): 55–62 HRC surface hardness, softer core around 30–40 HRC for fatigue resistance
  • Induction-hardened steel sprockets (crank sprockets, performance cams): 58–63 HRC on tooth flanks, 0.5–1.5 mm case depth
  • Chain rollers: typically 60–64 HRC — slightly harder than sprockets by design, so the (cheaper, easier to replace) chain wears the sprocket rather than vice versa... except the sprockets need to be hard enough to survive the chain's service life

The mismatch problem: Aftermarket sprockets are notorious for being soft. A billet-machined 4140 sprocket that skips heat treatment might measure 25–30 HRC. It looks beautiful, but it'll be hooked in 15,000 miles. This is why the BMW N63 timing chain failures traced partly to soft OEM sprocket coatings — the chains stretched fast because the sprockets provided no wear surface.

The Ford Modular 5.4L 3V lesson: The infamous phaser and chain failures on the 2004–2010 3-valve engines involved sprocket wear as a contributor. The cam phaser sprocket teeth wore into a scalloped pattern, letting the chain slap against the guides. Owners who caught it early replaced the sprockets with harder aftermarket units and got another 100k miles.

Rule of thumb — the 3-HRC gap: The chain should be 2–4 HRC points harder than the sprocket. Too small a gap and both wear together (no clear sacrificial part). Too large a gap and the sprocket vaporizes while the chain looks new. A chain at 62 HRC paired with a sprocket at 59 HRC is the sweet spot: the sprocket wears slowly and predictably, giving you the interference-fit sound cues (rattle, slap) that warn of end-of-life before catastrophic failure.

Inspection tip: Pull the valve cover on a high-mileage engine and look at the cam sprocket teeth under a light. If the leading flank of each tooth is polished into a shark-fin hook shape instead of a symmetric involute curve, the sprocket is worn — replace it with the chain, not just the chain alone.

Key Takeaway: Sprockets should be 2–4 HRC points softer than the chain rollers so they wear predictably as the sacrificial part, but too soft (below ~55 HRC) turns them into chain-stretching hooks within 40,000 miles.

Daily Debugging Puzzle

JavaScript's Object.freeze Shallow Trap: The "Frozen" Config That Mutates Between Requests

2026-08-22

This module exposes a frozen default config plus a helper that returns a shallow-merged copy. The intent is airtight: callers can override top-level keys, but nothing they do should ever leak into another request's config. Object.freeze is right there. What could go wrong?

const DEFAULT_CONFIG = Object.freeze({
  version: 1,
  retry: {
    maxAttempts: 3,
    backoffMs: 500,
  },
  features: {
    darkMode: false,
    beta: [],
  },
});

function withOverrides(overrides) {
  // Shallow merge is fine — DEFAULT_CONFIG is frozen, so nobody
  // can accidentally mutate the shared defaults. Right?
  return { ...DEFAULT_CONFIG, ...overrides };
}

// --- Request A ---
const a = withOverrides({ version: 2 });
a.features.beta.push("newSearch");
a.retry.maxAttempts = 10;

// --- Request B, an hour later, totally unrelated ---
const b = withOverrides({});
console.log(b.retry.maxAttempts); // Expected 3
console.log(b.features.beta);     // Expected []

The Bug

Request B logs 10 and ["newSearch"]. Request A has permanently poisoned the "frozen" defaults, and every subsequent request inherits its mutations.

Object.freeze is shallow. It freezes only the immediate properties of the object you pass. The values of retry and features are references to separate objects that were never frozen. MDN says this plainly, but the API name lies about it — freeze sounds recursive, and the linter doesn't warn you.

Then the spread makes it worse. { ...DEFAULT_CONFIG, ...overrides } is a shallow copy: it copies the top-level property values, which for objects means copying the reference. So after the spread, a.retry === DEFAULT_CONFIG.retry. Mutating a.retry.maxAttempts writes straight through to the shared object that Request B will also receive.

Worse still: in non-strict mode, writing to a frozen property fails silently. If retry had been frozen, a.retry.maxAttempts = 10 would have no effect but throw no error. You'd have a different bug — silently-lost overrides — masquerading as the same code working correctly.

The Fix

Two options, in order of preference:

  • Return a deep clone per call. The defaults stay a template; callers get their own copy to mutate. Cheap, boring, correct.
  • Deep-freeze the defaults and require callers to clone before mutating. Enforces immutability but relocates the surprise.
function withOverrides(overrides) {
  // structuredClone gives each caller an independent deep copy.
  const cfg = structuredClone(DEFAULT_CONFIG);
  return Object.assign(cfg, overrides);
}

// Or, if you truly want frozen-all-the-way-down defaults:
function deepFreeze(obj) {
  for (const key of Object.keys(obj)) {
    const v = obj[key];
    if (v && typeof v === "object") deepFreeze(v);
  }
  return Object.freeze(obj);
}
const DEFAULT_CONFIG = deepFreeze({ /* ... */ });

The subtlety that catches teams: this bug is invisible in tests. Each test file gets a fresh module load, so DEFAULT_CONFIG resets between test runs. It only manifests in a long-lived Node process — a server handling multiple requests — where request N sees the accumulated mutations of requests 1 through N-1. Load testing catches it; unit tests never will.

Key Takeaway: Object.freeze only freezes one level deep, and a spread copies references — so a "frozen" default with nested objects is a shared mutable singleton dressed up as immutable.

Daily Digital Circuits

Non-Volatile Latches and MRAM Cells: How Hardware Remembers Bits Without Power

2026-08-22

Every storage element we've covered so far — SRAM, DRAM, flip-flops, latches — forgets everything the moment you cut power. Flash remembers, but it's slow, wears out, and needs high voltages to program. MRAM (Magnetoresistive RAM) is the interesting middle ground: SRAM-like access speed, DRAM-like density, and non-volatility that survives years without power.

The storage element is a Magnetic Tunnel Junction (MTJ): two ferromagnetic layers separated by a ~1 nm insulating oxide barrier (usually MgO). The bottom layer's magnetization is pinned. The top layer's magnetization is free — it can point parallel (P) or antiparallel (AP) to the pinned layer. Electron spin tunneling through the oxide gives you two very different resistances:

  • Parallel state (logic 0): low resistance, typically ~5 kΩ
  • Antiparallel state (logic 1): high resistance, typically ~10 kΩ

The ratio (R_AP − R_P) / R_P is the Tunnel Magnetoresistance (TMR) ratio. Modern MTJs hit TMR of 150–200%, meaning the "1" state has 2–3× the resistance of the "0" state — plenty for a sense amp to distinguish.

Writing uses Spin-Transfer Torque (STT): push a current through the MTJ in one direction and the spin-polarized electrons flip the free layer to parallel; reverse the direction and it flips to antiparallel. Write currents are typically 20–100 µA for a few nanoseconds. Reading is easy — apply a small voltage (well below the write threshold), measure the current, compare to a reference.

Real-world example: Everspin ships standalone STT-MRAM chips used in enterprise SSD write caches. When the SSD loses power mid-write, the DRAM cache would normally lose everything — instead, the controller mirrors writes into MRAM, which retains data indefinitely without the supercap-and-flush dance that battery-backed DRAM needs. TSMC and Samsung now offer embedded MRAM as a replacement for embedded flash in microcontrollers at 22nm and below, because flash doesn't scale past 28nm cost-effectively.

Rule of thumb — retention vs write energy tradeoff: The energy barrier holding the free layer in place is E_b ≈ 40–60 kT for 10-year retention at 85°C. Retention time follows τ = τ₀ · exp(E_b / kT). Doubling the barrier doesn't double retention — it squares it. But higher barriers need proportionally more write current, so designers pick E_b just high enough for their application: 60 kT for storage-class memory, 30 kT for last-level cache where you refresh often.

The catch: read disturb. Every read pushes a small current through the MTJ, and if you read the same cell billions of times, thermal jitter plus that read current can occasionally flip it. Designers keep read current ≤ 1/10 of write current to push disturb error rates below 10⁻¹⁵.

See it in action: Check out How computer memory works - Kanawat Senanan by TED-Ed to see this theory applied.
Key Takeaway: MRAM stores bits as the relative magnetization of two ferromagnetic layers separated by a nanometer of oxide — reading measures resistance, writing uses spin-polarized current to flip the free layer, and the bit survives with zero power because it's stored in physical alignment, not charge.

Daily Electrical Circuits

Series-Pass Transistor Boosters for LDO Regulators: Extending Current Beyond the Chip's Rating

2026-08-22

You picked a nice LM317 or LT1085 for your bench supply, but the load turned out to be 5 A and your regulator maxes out at 1.5 A. Rather than switching topologies, you can bolt on an external pass transistor and let the regulator IC handle the loop while a beefy PNP or P-channel MOSFET carries most of the current.

The classic circuit: Insert a small "sense" resistor RSC between VIN and the regulator's input pin. Tie a PNP power transistor (say a TIP42 or MJ2955) with its emitter to VIN, collector to the regulator's output, and base to the junction of RSC and the regulator input. When regulator input current rises high enough to drop ~0.6 V across RSC, the PNP turns on and shunts additional current around the IC to the load.

How the loop stays honest: The regulator still senses its output pin voltage and adjusts its internal pass element. If the load pulls harder, the regulator tries to source more current, RSC drops more voltage, and the PNP delivers proportionally more. The regulator effectively becomes the error amplifier for the composite pass device.

Sizing RSC: Rule of thumb — pick RSC so the PNP starts conducting at roughly half the IC's rated current. For a 1.5 A LM317, target turn-on at 750 mA:

  • RSC = VBE(on) / Ithreshold = 0.6 V / 0.75 A ≈ 0.82 Ω
  • Power dissipation at 5 A total (with IC handling ~750 mA, PNP handling ~4.25 A): PRSC ≈ (0.75)² × 0.82 = 0.46 W → use a 1 W resistor

Concrete example: A 12 V → 5 V @ 5 A supply. Voltage across the PNP is 7 V, so at 4.25 A it dissipates ~30 W. That transistor needs a serious heatsink (θJA under ~3 °C/W with a 25 °C ambient to stay below 125 °C junction). The LM317 dissipates only about 5 W — a modest TO-220 heatsink handles it.

Gotchas:

  • No current limit on the PNP. The IC's internal foldback protects only its own path. Add a base resistor plus a small current-sense circuit if short-circuit survival matters.
  • SOA matters more than average power. A dead short at 12 V into a saturated PNP will vaporize it long before thermal limits engage. Bipolars have secondary breakdown; MOSFETs handle SOA better for this trick.
  • Stability: The added PNP adds a pole. Keep the output cap ESR in the range the regulator's datasheet requires, and add 10 nF from base to emitter of the PNP to damp oscillations.
Key Takeaway: A pass transistor booster turns any linear regulator into a high-current supply by using a sense resistor to steal excess current — but you inherit responsibility for the transistor's SOA and short-circuit protection.

Daily Engineering Lesson

Ackermann Steering Geometry: Why Inner and Outer Wheels Turn at Different Angles

2026-08-22

When a car turns a corner, the inner and outer front wheels trace circles of different radii around a common center point. If both wheels pointed the same direction, one would have to scrub sideways — burning rubber, wasting energy, and destroying tires. Ackermann geometry solves this by steering the inner wheel at a sharper angle than the outer wheel, so both wheel axes intersect at a single point on the extended rear-axle line.

The rule comes from pure geometry. If your wheelbase is L and your track width (distance between front wheels) is W, and the turn radius to the vehicle centerline is R, then:

  • Inner wheel angle: tan(δᵢ) = L / (R − W/2)
  • Outer wheel angle: tan(δₒ) = L / (R + W/2)

For a car with L = 2.7 m, W = 1.5 m, turning at R = 10 m: δᵢ ≈ 16.3°, δₒ ≈ 14.1°. That 2.2° delta between wheels is what pure Ackermann demands.

How it's built into the linkage: the steering tie rods don't run parallel to the axle. Instead, the steering arms angle inward so that when you imagine lines drawn through each kingpin and steering-arm ball joint, they meet at the center of the rear axle. This trapezoidal linkage automatically produces the correct differential angle as the wheels turn.

Real-world twist: race cars often use anti-Ackermann. At high speed, tires generate lateral force through slip angle, and the outer tire (which carries more load due to weight transfer) actually wants a larger steer angle than the inner tire to reach its peak grip. Formula 1 and many circuit cars deliberately invert the geometry — the inner wheel turns less than the outer. Passenger cars, which mostly do low-speed parking-lot maneuvers where scrub matters more than slip-angle optimization, stick with true Ackermann or a compromise between the two.

Rule of thumb: If your vehicle spends most of its life at parking-lot speeds (delivery vans, forklifts, cars), design for full Ackermann. If it lives on a racetrack at high lateral g, bias toward parallel or anti-Ackermann. Off-road vehicles with wide tires often compromise because tire scrub costs less than steering effort on loose terrain.

You can spot the geometry visually: park a car, turn the wheel fully, and look down at the front tires. The inner tire will be cranked noticeably harder than the outer — that's Ackermann working.

See it in action: Check out Ackerman Steering - Explained by Engineering Explained to see this theory applied.
Key Takeaway: Ackermann steering angles the inner wheel more sharply than the outer so both wheels roll around a common turn center without scrubbing — a purely geometric consequence of wheelbase and track width.

Forgotten Darkroom

The 1908 Secret to Great Home Portraits: Photograph the Empty Room First

2026-08-22

Book: Complete self-instructing library of practical photography; Volume VI: At-Home Portraiture, Flashlight, Interiors, Lenses by J. B. Schriever (1908)

Read it: Internet Archive

Buried in the preface of a 1908 photography manual is a piece of advice that would save half the amateur portrait photographers on Instagram from their worst mistakes. The editors of the American School of Art and Photography in Scranton, Pennsylvania, wrote something that reads like it was written for TikTok creators wondering why their bedroom videos look flat:

"As a foundation for portrait work in the home, a knowledge of the photographing of interiors is most essential. This teaches us the handling of furniture and similar accessories; the treatment and control of light in small areas; the correct judging of exposures under difficult circumstances."

In other words: before you photograph a person in a room, you must first master photographing the empty room. Schriever's editors treated this as so obvious it barely needed defending. Move the sofa. Study how afternoon light bounces off the wallpaper. Learn what your window does to shadow at 3 p.m. versus 5 p.m. Only then are you ready to put a human being into that space.

The book continues:

"From this branch of the work, it is but a step to the introduction of figures into the picture, and portraiture in the home follows as a natural sequence. We can thus see that successful At-home Portraiture is dependent, to a great extent, on the correct handling of interiors."

Why This Was Forgotten

Modern smartphone cameras hide the problem. Automatic exposure, HDR, and computational photography paper over the very difficulties Schriever's students were trained to see: mixed light temperatures, harsh window contrast against dim interior walls, reflections from polished wood, the way a low ceiling crushes a portrait. The camera "solves" these — badly — and calls it good enough.

But look at any professional portrait photographer's behind-the-scenes footage today and you'll see the 1908 workflow in disguise:

  • They walk into the room before the subject arrives
  • They rearrange furniture and clear "accessories"
  • They test exposures on the empty space to learn its light
  • They pick their angle based on what the room does, not what the person looks like

Ahead of Its Time?

Not exactly — this was probably common knowledge in 1908, when every studio photographer had trained in a rigid apprenticeship. What's remarkable is that a mass-market self-instruction book, aimed at amateurs sitting at home in Scranton, took the trouble to explain it. The democratization of photography created a market for teaching the fundamentals, and this one fundamental — the room is the portrait; the person is just the subject — got lost as cameras got smarter and cheaper.

The next time your kitchen selfie looks weirdly ugly and you can't tell why, blame the room. J. B. Schriever would have told you to photograph it empty first.

The forgotten claim: A good home portrait begins by mastering the empty room's light and geometry — the person is the last variable added, not the first.

Forgotten Patent

Léon Theremin's "Method of and Apparatus for the Generation of Sounds": The 1928 Patent That Invented Touchless Control — and Now Reads Every Finger on Every Smartphone

2026-08-22

On December 5, 1925, a Russian physicist named Lev Sergeyevich Termen — known in the West as Léon Theremin — filed a US patent application from New York for a device you could play by waving your hands in empty air. On February 28, 1928, the USPTO granted him US Patent 1,661,058, "Method of and Apparatus for the Generation of Sounds." It was the first patent for an electronic musical instrument, and the first patent for touchless human-machine interaction.

The trick was capacitance. Theremin's device had two antennas — a vertical rod for pitch, a horizontal loop for volume. Each antenna formed one plate of a capacitor; the player's hand formed the other. Move your hand closer, the capacitance rises; move it away, it falls. Inside the cabinet, two radio-frequency oscillators ran at nearly the same frequency, and the hand-antenna capacitor pulled one of them slightly. The circuit subtracted the two RF signals — a technique called heterodyning — and the audible difference frequency drove a loudspeaker. Wave your hand, change the pitch. No keys, no strings, no contact.

Theremin had built the prototype in 1920 at Petrograd's Physico-Technical Institute while researching gas dielectrics. He demonstrated it to Lenin in 1922 (Lenin reportedly played a passable "Skylark"), toured Europe and America with it, and licensed manufacturing to RCA. Then in 1938 Soviet agents pulled him back to Moscow, where he spent years in a sharashka — a prison laboratory — inventing surveillance gear for the NKVD. His most famous prison invention was "The Thing": a passive resonant cavity, no battery, no active electronics, hidden inside a carved wooden Great Seal that Soviet schoolchildren gifted to the US Ambassador in 1945. When a Soviet transmitter aimed a microwave beam at the embassy, the cavity re-radiated the ambassador's voice back. It went undetected until 1952.

Both inventions have modern descendants everywhere:

  • Capacitive touchscreens. The screen you're reading this on is a grid of tiny capacitors. Your finger — a lossy conductor at ground potential — perturbs the local field exactly the way Theremin's pitch antenna sensed his hand. Apple's 2007 iPhone patents cite decades of intermediate capacitive-sensing work, but the fundamental physics is Theremin's.
  • Proximity and gesture sensing. Every phone that dims its screen when you hold it to your ear, every laptop trackpad, every elevator button that lights up before you touch it — all use capacitive coupling to a human body. Google's Project Soli radar and automotive "kick to open" trunks are direct spiritual descendants of pitch-antenna control.
  • Heterodyne detection. The RF beat-frequency trick that turned tiny capacitance changes into audible tones is the same principle used in every superheterodyne radio, every FM tuner, and every software-defined radio front end.
  • Passive RFID and backscatter. "The Thing" — a resonant cavity that modulated a reflected illuminating signal — is the direct ancestor of passive RFID tags, battery-free sensors, and ambient backscatter Wi-Fi. Every contactless credit card owes something to Theremin's prison workshop.

The patent itself is short and startlingly readable: Theremin claims a musical instrument "controlled solely by the movement of the player's hand in space." Ninety-eight years later, that sentence describes not just a niche instrument played by Clara Rockmore and used in Star Trek theme music, but the primary input modality of the pocket computer in nearly every human hand on Earth.

Key Takeaway: Theremin's 1928 patent turned the human body into half of a capacitor — the same physical trick that now senses every finger on every touchscreen and reads every gesture in every proximity sensor.

Daily GitHub Zero Stars

drash3103/CARLA_Safety_Case

2026-08-22

Language: Jupyter Notebook

Link: https://github.com/drash3103/CARLA_Safety_Case

Amid a sea of randomly-named placeholder repos in today's zero-star batch, this one stands out immediately: a Jupyter Notebook project referencing CARLA, the open-source autonomous driving simulator originally born out of Intel Labs and the Computer Vision Center in Barcelona. The name — CARLA_Safety_Case — signals something more ambitious than a homework dump: it's tackling the safety assurance side of self-driving, not just the perception or control side that gets most of the hobbyist attention.

A "safety case" in the automotive world is a structured, evidence-backed argument that a system is acceptably safe for its intended operational design domain. Think ISO 26262, ISO 21448 (SOTIF), and UL 4600. Building one for a simulated autonomous vehicle in CARLA is a genuinely useful exercise because it forces you to:

  • Define concrete operational design domain boundaries (weather, road types, traffic density)
  • Enumerate hazards and triggering conditions the ego vehicle might encounter
  • Run scenario-based testing in a reproducible simulator rather than hand-waving about real-world miles
  • Produce quantitative evidence — collision rates, near-miss counts, time-to-collision distributions — you can actually cite

Because the language is Jupyter Notebook, the repo likely walks through scenario setup, metric collection, and analysis in an inspectable, teachable way. That's exactly the right medium for a safety case: reviewers need to follow the argument, not just trust a binary.

Who benefits? Grad students in automotive safety or robotics, functional-safety engineers curious how simulator-based evidence compares to track testing, ML practitioners moving from pure perception into full-stack AV work, and anyone teaching a course on autonomous vehicle validation who wants a concrete starting point. Even reading the notebooks cold would be a useful primer on how simulation, metrics, and safety argumentation fit together.

Why check it out: A rare zero-star repo tackling the underappreciated safety-argumentation side of autonomous driving using CARLA — practical fodder for anyone learning AV validation.

Daily Hardware Architecture

The BTB's Two-Level Hierarchy: Why Modern CPUs Have a Small Fast BTB and a Large Slow One

2026-08-22

The Branch Target Buffer stores where taken branches go, so the front-end can fetch the target on the same cycle it predicts the branch. But there's a brutal physics problem: a BTB big enough to cover a real program's branch working set is too slow to hit in one cycle at 5 GHz. The solution modern CPUs converged on is a two-level BTB: a tiny L1 BTB that answers in one cycle, and a much larger L2 BTB that answers in three to five cycles.

The L1 BTB on Golden Cove holds about 128 entries. The L2 BTB holds roughly 12,288. When a fetch address is looked up, both are queried. If L1 hits, the front-end redirects immediately with zero bubble. If L1 misses but L2 hits, the front-end fetches sequentially for a few cycles, then redirects — you eat a 3-5 cycle front-end bubble but avoid a full misfetch. If both miss, the branch is either not-taken (fine) or discovered late at decode, which is much more expensive.

Real example: A JIT-compiled JavaScript workload with 30,000 hot branches will blow past L1 BTB capacity almost immediately. Every hot branch that hits L2 costs a few bubbles per execution. If your loop body contains 8 branches and 6 miss L1 BTB, you're eating ~24 cycles of front-end stall per iteration on top of the actual work. This is why LLVM's -fprofile-use can produce 15-20% speedups on branch-heavy code: PGO lets the linker cluster hot branches into fewer cache lines, keeping the branch density per fetched line low enough that L1 BTB doesn't thrash.

Rule of thumb: If your hot code path contains more than ~100 distinct taken branches within tight loops, expect L1 BTB pressure. Divide your hot branch count by L1 BTB capacity: a ratio above 1.0 means every iteration will trigger L2 lookups. A ratio above 4-5 means you're effectively running with no L1 BTB at all.

The tag structures are asymmetric too. L1 BTB is often fully-associative or highly associative with a fast CAM; L2 BTB is set-associative like a regular cache, because a CAM at 12K entries would draw too much power. That's why L2 BTB has capacity misses (fits fine but wrong set) as well as pure evictions. The mental model to keep: L1 BTB is the "recent branch" cache, L2 BTB is the "recognized branch" cache, and anything past L2 is treated as if it's the first time the CPU has ever seen that branch.

Key Takeaway: Modern CPUs hide BTB latency behind a two-level hierarchy where the tiny L1 answers in one cycle and the large L2 costs a small bubble, so branch-dense code that overflows L1 BTB pays measurable front-end stalls even when predictions are correct.

Hacker News Deep Cuts

A Conversation with Cinematographer Vilmos Zsigmond

2026-08-22

Vilmos Zsigmond is one of the towering figures of American cinematography — the Hungarian émigré who, alongside László Kovács, smuggled footage of the 1956 Soviet invasion of Budapest out of the country before eventually shaping the visual language of the New Hollywood era. His filmography reads like a syllabus: McCabe & Mrs. Miller, Deliverance, Close Encounters of the Third Kind (for which he won the Oscar), The Deer Hunter, Blow Out. He died in 2016, so any surfaced conversation is necessarily archival — and that alone makes it worth reading.

Why should a technical audience care about a cinematographer interview? Because Zsigmond was a working engineer of light. He pioneered techniques that are now foundational vocabulary: flashing the negative to desaturate and control contrast on McCabe & Mrs. Miller, the zoom-and-dolly counter-move on Deliverance, the diffusion and smoke work that gave Close Encounters its otherworldly volumetric quality decades before real-time volumetric rendering existed in game engines. Every DP working today with LUTs, RAW workflows, and virtual production is building on choices Zsigmond made with film stock, lab chemistry, and a light meter.

The parallels to software craft are worth noting:

  • Constraint-driven creativity: film had a fixed dynamic range and no undo. Every setup was a commitment. That discipline produced a rigor that "shoot everything, fix in post" workflows have lost.
  • The tool is the aesthetic: Zsigmond understood that his choice of stock, filtration, and processing wasn't neutral — it encoded a point of view. Same lesson applies to picking a language, a framework, or a model.
  • Collaboration under pressure: his working relationships with Altman, Spielberg, De Palma, and Cimino are case studies in how a technical specialist earns creative authority.

Cinemasojourns tends to publish long, unrushed interviews with older craftspeople — the kind of primary-source material that gets harder to find as its subjects pass on. This is exactly the sort of oral-history work that will be valuable in twenty years and nearly impossible to reconstruct.

HN's front page today has three coding agents and a robot sprinter. It could stand to make room for the man who taught Spielberg how to point a camera at a UFO.

Why it deserves more upvotes: A rare primary-source conversation with one of the most influential cinematographers of the 20th century — technical craft at its highest level, and the kind of oral history that vanishes if no one bothers to read it.

HN Jobs Teardown

CNN Digital: What Their Hiring Reveals

2026-08-22

Source: HN Who is Hiring

Posted by: stuross

Of all the postings in this thread, CNN Digital's is the most revealing — precisely because it's the shortest. Three roles, a personal Gmail-adjacent contact address ([email protected]), and no careers-page link. This is a hiring manager fishing on HN, not a recruiting funnel. That informality is the story.

The stack: Node.js, Vue, Postgres, Redis for a "green field webapp for cnn.com." Vue over React is the eyebrow-raiser here — most US media orgs of CNN's scale defaulted to React years ago (NYT, WaPo, Bloomberg). Vue suggests either a specific senior engineer's preference driving the choice, or a deliberate bet on developer ergonomics over the React hiring pool. Postgres + Redis is the boring-and-correct pairing: relational source of truth, Redis for session/cache/rate-limiting. Nothing exotic, which for a news site under constant traffic-spike pressure is a green flag.

Company stage and direction: The phrase "green field webapp for cnn.com" is the tell. CNN.com is one of the oldest continuously-operating major websites on the internet. A greenfield rewrite in 2020 means the existing property has accumulated enough legacy debt (likely a PHP/Java monolith with a CMS wrapped around it) that they're eating the cost of a parallel rebuild. The SRE role explicitly asking for CloudFormation/Terraform in AWS with many managed services confirms this is a cloud-native re-platforming, not a lift-and-shift.

The tech manager role — "3-5+ years, previous dev work required, focusing on hiring and guiding dev effort" — is the giveaway that they're staffing up a team, not filling a gap. They need someone to run interviews because the volume is coming.

Skills/trends highlighted:

  • Managed AWS services over self-hosted — CNN is done running its own Kafka/Elasticsearch clusters
  • Infrastructure-as-code is table stakes for SRE roles now, not a nice-to-have
  • Player-coach engineering managers with recent hands-on coding experience — the pure-people-manager EM archetype is out of fashion

Red flags: The posting is too terse. No salary range, no team size, no mention of the existing platform being replaced, no explanation of what "Remote" means at a media company with two named office cities. Applying via a personal email to a manager (rather than an ATS) means your application lives or dies by one person's inbox hygiene. For a senior candidate that's fine — you're probably already talking to Stuart. For anyone cold-applying, this is a coin flip.

Green flag: A named human being publicly attaching their email to a hiring post signals accountability. Compare to Intercom's wall of Greenhouse links where you're candidate #4,000 in a pipeline.

The signal: Legacy media is quietly running greenfield cloud rewrites of their flagship properties, and the ones that succeed will be the ones whose EMs still write code.

Daily Low-Level Programming

The Hazard Pointer: How Lock-Free Data Structures Safely Reclaim Memory Without Garbage Collection

2026-08-22

Lock-free data structures have a fundamental problem: when Thread A removes a node from a list, Thread B may still be reading it. If A frees the memory, B dereferences a dangling pointer. RCU solves this by waiting for a grace period, but RCU requires quiescent states that user-space threads rarely reach naturally. Hazard pointers solve it differently: each thread publishes the pointers it's currently dereferencing, and reclaimers avoid freeing anything that appears in some other thread's hazard slots.

The mechanics: each thread owns a small array (typically 1–8 slots) of hazard pointers in a globally visible array. Before dereferencing a shared pointer, a thread does:

  • Load the shared pointer P.
  • Store P into its own hazard slot with a release store (making the announcement visible).
  • Re-read the shared pointer and verify it still equals P. If not, retry — the node may have been unlinked and freed before the announcement was visible.
  • Now safe to dereference.

When a thread wants to free a node, it doesn't free immediately. It appends the node to a per-thread retired list. When that list crosses a threshold (typically R = 2 × N × K, where N is thread count and K is slots per thread), it performs a scan: collect all hazard pointers across all threads into a hash set, then free every retired node not in the set. The rest go back on the retired list for the next scan.

Real-world example: Facebook's Folly library ships folly::hazptr, used in their concurrent hash maps and MPMC queues that back much of the TAO social graph cache. Meta measured hazard-pointer reads at ~5ns per access versus ~50ns for shared_ptr's atomic refcount — an order of magnitude faster because the "acquire" is a single relaxed store instead of a locked increment that bounces the cache line between cores.

Rule of thumb: hazard pointers give you O(1) reads and amortized O(N·K) reclamation cost per free. If you have N threads each with K hazard slots and retire batches of size R = 2NK, then each scan reclaims at least NK nodes for O(NK) work — amortized O(1) per free. Compare to RCU, which has zero read overhead but unbounded grace-period latency; hazard pointers cost a store per read but bound memory usage at O(N·K·R).

The subtle bug: forgetting the re-read after publishing. Without it, you can announce a hazard for a node that was already unlinked and freed — a use-after-free the mechanism was designed to prevent.

See it in action: Check out CppCon 2016: “A lock-free concurrency toolkit for deferred reclamation and optimistic speculation
quot; by CppCon to see this theory applied.
Key Takeaway: Hazard pointers make lock-free reclamation safe by having each thread publicly announce which pointers it's dereferencing, so reclaimers know exactly what memory is still in use — at the cost of one release-store and a re-read per access.

RFC Deep Dive

RFC 7440: TFTP Windowsize Option

2026-08-22

RFC: RFC 7440

Published: 2015

Authors: Patrick Masotta

The Trivial File Transfer Protocol was born in 1981 (RFC 783, Karen Sollins) and standardized in RFC 1350 in 1992. Its defining feature was stubbornness: send a 512-byte block, wait for an ACK, send the next block, wait for an ACK. Lockstep. On a 100 ms link this caps throughput at roughly 5 KB/s regardless of how fat your pipe is. That was fine when TFTP's job was loading a diskless workstation's kernel across a coax segment. It became painful the moment TFTP escaped the LAN.

And TFTP never went away. You use it every day without noticing. PXE boot pulls pxelinux.0 and its config over TFTP. Cisco IOS, Juniper Junos, Arista EOS, and countless embedded devices still upgrade firmware via TFTP. VoIP phones fetch provisioning files over TFTP. Emergency recovery images live on TFTP servers. It is the plumbing under datacenter provisioning.

The problem RFC 7440 solves. Imaging a rack of forty servers over stock TFTP could take hours because each 512-byte block costs a full round trip. Even with the blksize option from RFC 2348 (which allows larger blocks, sometimes up to the path MTU), you are still one-block-per-RTT. This is the sender's fault, not the network's.

The design. RFC 7440 introduces a single new option negotiated during the read/write request: windowsize. The client requests a window of N blocks (1–65535). The server sends N consecutive blocks, then pauses for a single ACK acknowledging the last received block number. Acknowledgements are cumulative: one ACK for the whole window. On timeout or a gap detected via a stale ACK, the sender rewinds to the block after the last acknowledged one and continues from there. That is the whole mechanism.

  • No per-packet ACKs, no selective ACKs, no reordering logic.
  • No congestion control. TFTP still doesn't do that; the RFC waves at operator judgement.
  • Fully backwards compatible: servers that don't understand the option omit it from their OACK and the client falls back to windowsize 1.
  • Combined with a blksize near the path MTU, a window of 8–16 turns TFTP from a curiosity into a serviceable bulk transport, easily saturating gigabit LANs.

Why cumulative ACKs and not sliding windows? Because TFTP's implementations are tiny. TFTP servers ship in ROM monitors, PXE stacks, bootloaders, and 20 KB embedded binaries. A cumulative-ACK burst is trivial to add; a real sliding window with per-packet state is not. The RFC deliberately kept the state machine within reach of a bootloader author.

Nice piece of trivia. Patrick Masotta wrote Serva, a Windows-based PXE/TFTP server used widely by IT sysadmins for OS deployment. He implemented windowsize in Serva first, measured that it made TFTP roughly two orders of magnitude faster on typical LANs, and then wrote up the operational experience as an RFC. It is a textbook case of "rough consensus and running code" — a single vendor codifying a de facto improvement so other implementations could interoperate. Within a few years, dnsmasq, tftpd-hpa, and most enterprise switch TFTP clients supported it.

The lesson for modern engineers. Lockstep protocols age catastrophically the moment latency exceeds their assumptions. If you find yourself designing an ACK-per-message request/response and it will ever cross a WAN, a satellite link, or even a congested LAN, batch your acknowledgements. RFC 7440 shows how cheap the fix can be — a handful of new lines in the state machine, and a 30-year-old protocol becomes usable again.

Why it matters: The reason your PXE boots and switch firmware pushes don't take all afternoon anymore is a 2015 RFC that finally taught the 1981-vintage TFTP protocol to stop waiting for an ACK after every single 512-byte block.

Stack Overflow Unanswered

Is __vmalloc(size, GFP_NOWAIT) really guaranteed not to sleep?

2026-08-22

Stack Overflow: View Question

Tags: linux, linux-kernel, vmalloc, advice

Score: 0 | Views: 91

The asker is writing a kernel module that needs to allocate several gigabytes of virtually-contiguous memory. They want fail-fast semantics: if the memory isn't available immediately, return NULL rather than block waiting for reclaim or compaction. They noticed __vmalloc() accepts a GFP mask and reasonably ask: does passing GFP_NOWAIT actually guarantee the call won't sleep?

Why this is hard: The GFP contract is straightforward for kmalloc/alloc_pages: __GFP_DIRECT_RECLAIM is the "may sleep" bit, and GFP_NOWAIT clears it. But vmalloc is not a simple page allocator. It does at least three things that can each block independently:

  • Allocates a range from the vmalloc virtual address space (alloc_vmap_area) — this takes a spinlock, but under fragmentation may need to purge lazy-freed areas, which historically has taken mutexes.
  • Allocates the backing physical pages one-by-one (or in batches on modern kernels) via the page allocator with the caller's GFP mask.
  • Populates page tables (vmap_pages_range), which itself needs to allocate PTE/PMD pages — and here's the gotcha: those internal allocations historically used GFP_KERNEL, not the caller's flags.

The direction to a real answer: Look at mm/vmalloc.c in the version you're targeting. Since ~5.2, __vmalloc_node_range() propagates the caller's gfp_mask to alloc_pages_bulk and, importantly, Michal Hocko's series ensured page-table allocations in the vmap path honor GFP_NOWAIT when passed. So on a modern kernel, __vmalloc(size, GFP_NOWAIT) should be non-blocking for the allocation itself. But:

  • alloc_vmap_area can still call cond_resched() paths and, when the vmap space is fragmented, trigger purge_vmap_area_lazy() which grabs vmap_purge_lock (a mutex). At multi-GB sizes this is not hypothetical.
  • Getting gigabytes without __GFP_DIRECT_RECLAIM will almost certainly fail on a running system — GFP_NOWAIT only draws from free lists and per-CPU caches. You're asking the allocator to hand you millions of 4K pages from what's already immediately available.
  • If you truly need "no sleep, ever" (e.g., atomic context), the right tool is GFP_ATOMIC, and even then vmap-area purge can be a hazard — consider pre-allocating at module init.

Practical suggestion: pre-reserve the vmalloc region with get_vm_area() at init when sleeping is fine, then populate lazily. Or use vmalloc_huge() to reduce PTE pressure. If it must be runtime, wrap the call in might_sleep()-assertion tests (CONFIG_DEBUG_ATOMIC_SLEEP) on your target kernel to empirically confirm.

The challenge: vmalloc's GFP contract is subtler than the page allocator's because the call has multiple internal allocation sites (vmap area, backing pages, page-table pages) that each need to honor the flag — and historically not all of them did.

Daily Software Engineering

The Push vs Pull Deployment Model: Who Initiates the Update?

2026-08-22

Once you've committed to GitOps and Configuration as Code, you still have to answer a boring-sounding question with big operational consequences: who initiates the deployment — a central system pushing to targets, or the targets pulling from a source of truth?

Push model. A CI/CD system (Jenkins, GitHub Actions, Ansible Tower, ArgoCD's push mode) holds credentials to your production environments and, on merge, connects out and applies changes. The controller is the actor; the target is passive.

Pull model. An agent runs on each target (Flux, ArgoCD, Puppet agent, Chef client, kubelet reading manifests from Git). It periodically polls a source of truth and reconciles local state to match. The target is the actor; the controller is passive infrastructure.

The security asymmetry is the biggest tradeoff. Push means your CI system holds production credentials — kubeconfig files, cloud IAM keys, SSH keys — that can modify every environment. Compromise the CI system (or a build pipeline script) and you own production. Pull inverts this: the target only needs read access to Git and a container registry. There's no inbound path from the internet to your cluster's control plane, and no shared credential to steal.

The drift-correction asymmetry is the second. Push happens on merge, then stops. If someone kubectl edits a deployment at 3am, the push system doesn't know until the next merge — the drift lives until then. Pull agents reconcile on a schedule (Flux defaults to every minute), so drift is corrected within a poll interval. This is why "GitOps" is usually pull-based: the guarantee "Git is truth" requires continuous reconciliation, not one-shot application.

Real-world example: A fintech startup was running Jenkins-based push deploys to 40 Kubernetes clusters across regions. Jenkins held cluster-admin kubeconfigs for all of them. A supply-chain compromise in a build plugin gave an attacker access to those credentials — game over across every region. Post-incident, they moved to Flux: each cluster pulls from a Git repo, no inbound access, no shared credentials. Jenkins now only writes YAML to Git.

Rule of thumb: If your reconciliation loop is slower than your mean-time-to-drift, you don't have GitOps — you have Git-triggered scripts. Push is fine for immutable infrastructure (baked AMIs, container images) where drift is architecturally impossible. Pull is essential for mutable runtime state (Kubernetes objects, config maps) where humans and controllers can both write.

Push doesn't scale to hundreds of edge locations either — each target is an outbound connection the controller has to manage. Pull scales naturally: add a target, it starts polling.

See it in action: Check out CI/CD Tutorial using GitHub Actions - Automated Testing
amp; Automated Deployments by Tom Shaw to see this theory applied.
Key Takeaway: Push deployment centralizes credentials and applies on merge; pull deployment inverts the trust model and continuously reconciles — pick pull whenever drift is possible and truth must be enforced, not just declared.

Tool Nobody Knows

faketime (libfaketime): LD_PRELOAD Your Way to Time Travel Without Touching the System Clock

2026-08-22

You need to test what your code does on Feb 29, 2028. Or verify that a certificate expiration path triggers cleanly. Or reproduce the bug that only happened at 03:14:07 UTC on January 19, 2038. The naive fix — sudo date -s ... — reaches out and yanks the wall clock for every process, breaks systemd timers, confuses your SSH session's Kerberos ticket, and if you're on a laptop, chrony will happily undo it 30 seconds later. There's a better way that's been sitting in Debian since 2007.

libfaketime is an LD_PRELOAD shim that intercepts time(), gettimeofday(), clock_gettime(), and friends — for one process and its children only. The system clock stays untouched. Cousin to eatmydata, same trick, different syscall family.

# Absolute time
faketime '2038-01-19 03:14:07' date
# → Tue Jan 19 03:14:07 UTC 2038

# Relative offsets — d/y/h/m/s
faketime '-3 years' openssl x509 -in cert.pem -noout -dates
faketime '+45 days' ./run_billing_job.sh

# ISO 8601 also works
faketime '2028-02-29T12:00:00' python -c 'import datetime; print(datetime.date.today())'

The real trick is the -f advanced format, which supports rate multipliers. Freeze time entirely, or make it march 10× faster to test a 24-hour cron in under three hours:

# Freeze — every call returns the same instant
faketime -f '2025-06-15 12:00:00 x0' bash
# now `sleep 5; date` returns the same timestamp

# Accelerate 60×: one wall-second = one faked-minute
faketime -f '@2025-01-01 00:00:00 x60' ./long_running_daemon

# Time drifts +1 second per real second, starting an hour ahead
faketime -f '+1h i1.0' ./scheduler_test.py

The killer application is testing TLS chains without waiting years. Every developer who's ever debugged a cert-expiry bug has faked the system clock and regretted it:

# What does our client do the day after this cert expires?
faketime "$(openssl x509 -in server.crt -noout -enddate | cut -d= -f2) + 1 day" \
  curl -v https://internal-api.example.com/

# Simulate an already-expired intermediate CA
faketime '2040-01-01' openssl s_client -connect example.com:443 -servername example.com

Point it at a whole test suite — pytest, go test, cargo test, whatever — and the tests see a world where it's already 2038:

FAKETIME='2038-01-19 03:14:08' pytest tests/test_timestamps.py
FAKETIME_NO_CACHE=1 FAKETIME='@1234567890' go test ./...

Environment variable form is usually what you want inside CI, because it propagates to fork()-ed children automatically. Combine with a per-process control file (FAKETIME_TIMESTAMP_FILE) and you can advance time from another shell while the process is running — perfect for testing token-refresh loops.

The fine print, learned the hard way:

  • Statically-linked binaries (Go binaries built without cgo, musl static builds) don't honor LD_PRELOAD. Rebuild with dynamic linkage or use faketime's -m flag which asks the kernel via ptrace instead — slower but works.
  • CLOCK_MONOTONIC is faked by default (set FAKETIME_DONT_FAKE_MONOTONIC=1 if it breaks your event loop).
  • Anything that reads /proc/uptime or asks the kernel directly (via vDSO without the libc wrapper) bypasses it. Rare in practice.
  • Databases with their own timekeeping (Postgres now() uses the server's clock — but connect from a faketime'd client and clock_timestamp() at the client library level lies happily).

The Debian package is faketime; on Fedora/RHEL it's libfaketime. Zero configuration, zero dependencies, works on anything glibc-based going back 15+ years.

Key Takeaway: When you need to test time-dependent code, don't touch the system clock — LD_PRELOAD a lie into one process with faketime, including rate multipliers for accelerated or frozen time.

What If Engineering

What If We Built a Skyscraper-Sized Ionic Wind Generator That Moved Air Without Fans?

2026-08-22

Ionic wind — electrohydrodynamic (EHD) thrust — has no moving parts. You stretch a thin corona wire at ~30 kV between grounded collector electrodes. The wire ionizes nearby air molecules; the field slings the ions toward the collector, and collisions with neutral molecules drag the bulk air along. MIT flew a 5 kg airplane on it in 2018. Could we scale it up to replace every fan and blower in a skyscraper?

The physics ceiling. The static pressure an ionic wind stage can produce is bounded by the electric field it can sustain before arcing — roughly Paschen-limited to ~30 kV/cm in dry air. Working through the momentum balance, a single stage delivers roughly:

ΔP ≈ J·d/μ_ion

where J is corona current density (~1 mA/m² practical), d is electrode gap (~5 cm), and μ_ion ≈ 2×10⁻⁴ m²/(V·s) is ion mobility. That gives ΔP ≈ 0.25 kPa per stage, and typical demonstrations achieve 5–20 Pa. Air velocity: 1–3 m/s. Efficiency (kinetic power out / electrical in) hovers at 1–3%. A good centrifugal fan hits 70%.

Sizing a Manhattan tower. A 100-story office building needs ~150 m³/s of outdoor ventilation air (ASHRAE 62.1, roughly 10 L/s per occupant × 15,000 occupants). At 2 m/s ionic wind velocity, that requires 75 m² of open corona array — a full wall on one facade. Fine, architecturally. But duct static pressure in a real high-rise is 500–1500 Pa. A single ionic stage delivers 10 Pa. You'd need 50–150 stages in series, each drawing its own corona current, cascaded through the tower's air handling shafts. Total electrode wire length: hundreds of kilometers.

The power bill. Moving 150 m³/s against 800 Pa is 120 kW of pneumatic work. At 70% fan efficiency that's a 170 kW electrical load. At 2% EHD efficiency it's 6 MW — the peak load of a small neighborhood, just for ventilation. You'd offset the entire rooftop PV array before breakfast.

The ozone problem. Corona discharge in air produces ozone at roughly 1–10 g per kWh of corona power. Even at the low end, 6 MW × 1 g/kWh = 6 kg/hour of O₃ spilling into the ventilation stream. OSHA's 8-hour limit is 0.1 ppm. You'd need catalytic MnO₂ scrubbers on every stage — adding pressure drop the ionic wind can't overcome. It's a snake eating its tail.

Where it actually shines. Ionic wind wins where fans lose: silence and zero maintenance. A hospital operating theater, a semiconductor cleanroom laminar-flow hood, a data center hot-aisle skim — anywhere the pressure drop is <50 Pa and noise <20 dBA matters more than watts. Frore Systems already ships silicon MEMS ionic-wind chips cooling laptops. Scaling to skyscrapers fails on ozone and efficiency; scaling to every ceiling tile as a distributed, whisper-quiet air-mover at 1 m/s local velocity is genuinely plausible. Think of it as the LED of ventilation: pointless for lighthouses, transformative once you sprinkle it everywhere small.

The tower-scale version is a cautionary tale about swapping high-efficiency mechanical systems for exotic solid-state ones — the joule tax is brutal. But the underlying physics still deserves its niche: any application where a rotating blade is worse than a 2% efficient wall of wire.

Key Takeaway: Ionic wind can't replace skyscraper HVAC — 2% efficiency plus ozone poisoning kills it — but it wins wherever silence and zero-maintenance beat raw thermodynamic efficiency, making it the LED of local airflow rather than the fan of the future.

Wikipedia Rabbit Hole

Domino computer

2026-08-22

Every computer you've ever used — from the phone in your pocket to the datacenter humming somewhere in Virginia — is, at its philosophical core, a system for propagating a signal through logic gates. Usually we do this with electrons racing through doped silicon at billions of operations per second. But you can also do it with dominoes falling on a table. Slowly. Very slowly. And it still counts as a computer.

A domino computer works by exploiting the one property dominoes are famous for: a falling tile knocks over the next tile. That's your signal. A standing domino means "0," a fallen one means "1" (or vice versa — the convention doesn't matter, as long as you're consistent). From this single mechanical primitive, you can build every logic gate a real CPU uses:

  • AND gates require two incoming domino chains to arrive at a junction simultaneously to knock down the output tile.
  • OR gates are trivial — two chains converging on one tile, either one will topple it.
  • NOT gates are the clever part: you use a fast "clock" chain to knock over the output by default, and a slower input chain that, if triggered, blocks the clock from reaching it.

Once you have AND, OR, and NOT, you have functional completeness — you can build anything a Turing machine can compute, given enough dominoes and enough time. In 2012, mathematician Matt Parker organized a public build at Manchester's Science Festival that used roughly 10,000 dominoes to add two 4-bit binary numbers. The "computation" took several seconds to propagate and was, of course, single-use — every falling domino is a bit that has to be manually reset before you can run the program again.

This is where the domino computer stops being a novelty and starts being genuinely instructive. It exposes something usually hidden by the abstraction of silicon: computation is physical. Every logical operation is a real event in the world that dissipates energy and takes time. Silicon transistors just do it so fast and so tiny that we forget. Domino gates make the physics of information visible — you can literally watch a bit travel down a wire.

It also connects to a serious idea in theoretical computer science: ballistic computing. Researchers have proposed reversible computers built from billiard balls bouncing off carefully placed walls, where the collisions serve as logic gates. Domino computers are the irreversible, gravity-powered cousin. Both prove the same point Charles Babbage was making with his brass gears in the 1830s — the substrate of a computer is arbitrary. Logic is logic.

The Wikipedia article notes that the largest domino computers built have implemented full binary adders, and enthusiasts have sketched designs for domino-based sorting networks and even simple memory cells (though "memory" is generous when your bits fall over permanently).

Down the rabbit hole: The same Boolean algebra that powers your CPU can be executed by a line of falling tiles — computation is a pattern, not a material.

Daily YT Documentary

Deep Dive: James Webb Space Telescope finds 'hidden stars' making the universe's 1st galaxies…

2026-08-22

Deep Dive: James Webb Space Telescope finds 'hidden stars' making the universe's 1st galaxies…

Channel: FactVerse (561 subscribers)

When the James Webb Space Telescope started peering back toward the dawn of the universe, astronomers expected to see faint, small galaxies flickering into existence. Instead, they saw something puzzling: the earliest galaxies looked too bright and too massive for their age. For a while, this seemed to threaten the standard cosmological model itself.

This video walks through the emerging explanation — that a population of "hidden stars" in those early galaxies has been inflating our brightness measurements, making the galaxies appear far more massive than they actually are. It's a great example of how a single unexamined assumption (in this case, the stellar mass-to-light ratio in the early universe) can ripple outward into what looks like a crisis in physics.

The channel does a solid job unpacking why JWST's infrared sensitivity matters, what "redshift" actually tells us about looking back in time, and how astronomers reconcile new observations with existing models rather than throwing them out. It's the kind of science communication that respects the process: not "Einstein was wrong!" but "here's the specific parameter we mis-estimated, and here's how we know."

At 561 subscribers, this is a small channel doing genuine explainer work on a live area of astrophysics research — worth supporting.

Why watch: A clear walk-through of how JWST's "impossibly bright" early galaxies are being explained by hidden stellar populations rather than a broken cosmological model.

Daily YT Electronics

How to Control an LED Light Using a 12V Relay

2026-08-22

How to Control an LED Light Using a 12V Relay

Channel: Technical_Tec (1790 subscribers)

Honestly, this batch is thin — most entries are low-effort "spin a DC motor to light some bulbs" demos or hashtag-stuffed Shorts. This relay tutorial is the least bad option and actually attempts to teach a fundamental building block of electronics: using a low-current control signal to switch a higher-current load.

A 12V SPDT relay is one of the first components a hobbyist encounters when they outgrow direct microcontroller drive. The video walks through the relay's coil-versus-contact sides, wiring the common, normally open, and normally closed terminals, and connecting an LED load through the switched side. Even though the load here is just an LED (which obviously doesn't need a relay), the wiring pattern is identical to what you'd use to switch a motor, lamp, or mains-adjacent AC load from a 5V logic signal.

If you're new to relays, the useful takeaways are: the coil and contact sides are electrically isolated, you need a flyback diode across the coil when driving from a transistor or MCU (watch whether the video mentions this — it's a common omission), and the NC/NO choice determines your default state on power loss. Skip if you already know this cold; watch if you're still fuzzy on the pinout.

Why watch: A basic but clear walkthrough of relay wiring — the foundational switching pattern behind almost every hobbyist automation project.

Daily YT Engineering

Tall Concrete Column Steel Formwork Blowout Failure Analysis

2026-08-22

Tall Concrete Column Steel Formwork Blowout Failure Analysis

Channel: 와글와글 (6330 subscribers)

Formwork blowouts are one of those construction failures that look catastrophic on video but are entirely predictable from first principles — and this case study walks through exactly why. When you pour a tall concrete column, the fresh concrete behaves like a fluid, and the hydrostatic pressure at the base scales linearly with pour height. Pour too fast, or pour too tall without letting the lower layers begin to set, and the pressure at the bottom of the form can exceed what the ties, wales, and sheathing were designed to resist. The result: the form ruptures, and several cubic meters of wet concrete evacuate the column in seconds.

What makes this worth watching is that it treats the failure as an engineering problem rather than a spectacle. Expect discussion of pour rate limits, concrete temperature effects on set time (colder concrete stays fluid longer, raising effective hydrostatic head), tie spacing calculations, and how ACI 347 and CIRIA Report 108 pressure formulas are supposed to govern the design. For anyone in structural, site, or formwork engineering, seeing a real blowout dissected against the code equations is a much more durable lesson than any classroom example.

The channel is small (~6k subs) but the framing — "engineering case study and failure analysis" — signals a real technical breakdown rather than a shock-value clip.

Why watch: A real formwork blowout dissected against the hydrostatic pressure equations that were supposed to prevent it.

Daily YT Maker

Turn a dead 3D printer into a 109,500-dollar metal cutter

2026-08-22

Turn a dead 3D printer into a 109,500-dollar metal cutter

Channel: Comparee (66 subscribers)

This is easily the standout pick from today's batch — a genuine engineering conversion project that repurposes a broken Ender-class FDM printer into a functional wire EDM (Electrical Discharge Machining) cutter, a tool that commercially runs into six figures. Wire EDM works by passing a thin electrically-charged wire through conductive metal submerged in dielectric fluid, using precisely-timed sparks to erode material rather than mechanically cutting it. It's the technology behind aerospace turbine blades and hardened tool-and-die work.

What makes this worth watching is the cross-domain reuse: the printer's existing motion system (steppers, linear rails, control board) already provides the sub-100-micron precision EDM needs. The build swaps the hotend for a wire-feed head and adds the pulse generator electronics and dielectric bath. It's a great case study in recognizing which parts of a dead machine still hold value versus what needs replacing.

Caveat: the title is somewhat clickbait-y and the video links to a paid build guide, so expect the free video to be more of an overview than a complete step-by-step. Still, even as a conceptual walkthrough, learning how EDM physics works and how CNC motion platforms are interchangeable across machining paradigms is genuinely educational.

Why watch: A rare hobbyist attempt at converting a junked FDM printer into a wire-EDM metal cutter — an accessible introduction to spark-erosion machining and creative motion-system reuse.

Daily YT Welding

You can build a box that makes an old metal lathe cut any screw thread

2026-08-22

You can build a box that makes an old metal lathe cut any screw thread

Channel: Comparee (66 subscribers)

This video tackles one of the classic frustrations of owning an older manual lathe: the limited set of threads you can cut with the factory change gears. The solution is an electronic leadscrew (ELS) — a small controller box that replaces the mechanical gear train with a stepper motor synchronized to the spindle via an encoder. Once installed, the lathe can cut essentially any metric, imperial, or custom thread pitch on demand, along with power feeds at arbitrary rates.

The featured project is NanoELS, an open-source ELS design that has become popular in the hobby machinist community. What makes this build worth watching is that it bridges two disciplines most makers keep separate: precision machining and embedded electronics. You get exposure to spindle encoder wiring, stepper motor sizing for leadscrew loads, and the closed-loop logic that keeps threading passes phase-locked to the spindle.

Even if you never build one, the video is a solid conceptual walkthrough of how threading actually works — the relationship between spindle rotation and carriage travel that change gears enforce mechanically, and how a microcontroller can enforce the same ratio in software. That mental model is useful for anyone who runs a lathe, hobby or otherwise.

The channel is tiny (66 subs), so this is a genuine small-creator find rather than a polished commercial pitch.

Why watch: A clear introduction to electronic leadscrews — the upgrade that turns a limited old lathe into a machine that can cut any thread pitch.