25 newsletters today.
Abandoned Futures
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:
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.
ArXiv Paper Digest
2026-08-22
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:
In this new world, they claim the three-tier stack collapses into a new trio:
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.
Daily Automotive Engines
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:
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.
Daily Debugging Puzzle
Object.freeze Shallow Trap: The "Frozen" Config That Mutates Between Requests2026-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 []
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.
Two options, in order of preference:
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.
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
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:
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⁻¹⁵.
Daily Electrical Circuits
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:
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:
Daily Engineering Lesson
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:
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.
Forgotten Darkroom
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."
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:
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.
Forgotten Patent
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:
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.
Daily GitHub Zero Stars
2026-08-22
Language: Jupyter Notebook
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:
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.
Daily Hardware Architecture
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.
Hacker News Deep Cuts
2026-08-22
Link: https://cinemasojourns.com/2026/08/22/a-conversation-with-cinematographer-vilmos-zsigmond/
HN Discussion: 2 points, 0 comments
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:
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.
HN Jobs Teardown
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:
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.
Daily Low-Level Programming
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:
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.
RFC Deep Dive
2026-08-22
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.
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.
Stack Overflow Unanswered
2026-08-22
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:
alloc_vmap_area) — this takes a spinlock, but under fragmentation may need to purge lazy-freed areas, which historically has taken mutexes.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.__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.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.
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
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.
Tool Nobody Knows
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:
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)./proc/uptime or asks the kernel directly (via vDSO without the libc wrapper) bypasses it. Rare in practice.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.
LD_PRELOAD a lie into one process with faketime, including rate multipliers for accelerated or frozen time.
What If Engineering
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.
Wikipedia Rabbit Hole
2026-08-22
Wikipedia: Read the full article
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:
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).
Daily YT Documentary
2026-08-22
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.
Daily YT Electronics
2026-08-22
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.
Daily YT Engineering
2026-08-22
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.
Daily YT Maker
2026-08-22
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.
Daily YT Welding
2026-08-22
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.
