Daily Digest — 2026-06-18

26 newsletters today.

In this digest


Abandoned Futures

The Integral Fast Reactor: The Self-Recycling Nuclear Reactor Argonne Proved Safe in 1986 and Congress Killed Three Years Before First Power

2026-06-18

On April 3, 1986, engineers at Argonne National Laboratory-West in Idaho did something that should have rewritten nuclear history. With the EBR-II reactor running at full power, they shut off the primary coolant pumps and deliberately disabled the automatic scram system. By every conventional metric, this was a recipe for a meltdown. Instead, the reactor's temperature rose briefly, the metallic fuel expanded, neutron leakage increased, the fission rate dropped, and the reactor quietly shut itself down. Then they repeated the experiment, this time killing the heat sink. Same result. Twenty-three days later, Chernobyl exploded.

The reactor that proved it could not melt down was the prototype for the Integral Fast Reactor (IFR) — a program directed by Charles Till at Argonne from 1984 to 1994. The IFR was not a paper concept. It was an engineered, demonstrated, complete nuclear fuel cycle.

The design solved nuclear power's three hardest problems simultaneously:

  • Inherent safety. The metallic U-Pu-Zr alloy fuel had strong negative temperature feedback. Sodium coolant ran at atmospheric pressure — no high-pressure steam explosion risk, no LOCA in the conventional sense.
  • Waste destruction. As a fast-spectrum reactor, it could fission the long-lived transuranic actinides (americium, neptunium, curium) that make spent fuel radiotoxic for 300,000 years. IFR waste returns to background radioactivity in roughly 300 years.
  • Closed fuel cycle. Pyroprocessing — electrorefining spent fuel in molten salt at 500°C — recovered fuel on-site without ever isolating pure plutonium. The proliferation pathway that haunts PUREX reprocessing simply did not exist. The "product" was always contaminated with higher actinides and fission products, unusable for a weapon without further reprocessing nobody had built.

By 1994, Argonne had: a 20-MW operating prototype with three decades of run time, a working pyroprocessing facility, demonstrated passive safety, and a full-scale commercial design (the ALMR/PRISM, a partnership with General Electric) sitting at the NRC.

Then in October 1994, the Clinton administration — pushed by Secretary of Energy Hazel O'Leary and senators including John Kerry — canceled the program. The stated reasoning was nonproliferation policy and the assertion that the U.S. didn't need plutonium-based fuel cycles. Congress appropriated $32 million to terminate a program that was three years from a commercial demonstration. EBR-II was defueled and entombed.

Why it works in 2026: Every objection has dissolved.

  • The waste problem the IFR solved is now the binding constraint on nuclear expansion — Yucca Mountain is dead, dry-cask interim storage is politically radioactive, and Finland's Onkalo took 40 years to permit a single repository.
  • The proliferation argument was always weakest against IFR specifically; pyroprocessing's contaminated product is the least weaponizable reprocessing output.
  • GE Hitachi's PRISM is a direct IFR descendant. TerraPower's Natrium (Bill Gates, Wyoming, scheduled 2030) uses sodium-cooled fast reactor architecture lifted from this work. Oklo's Aurora, licensed by the NRC in 2024 after a previous denial, is metallic-fuel fast reactor lineage.
  • Advanced manufacturing makes the sodium loop components (intermediate heat exchanger, EM pumps) an order of magnitude cheaper than 1994.

The IFR existed. It worked. The engineering was done. Restarting the program today means finishing a job that was 90% complete when it was deliberately stopped.

Key Takeaway: The Integral Fast Reactor demonstrated passive safety, transuranic waste destruction, and proliferation-resistant fuel recycling in a working prototype — and was canceled in 1994 for policy reasons that the next thirty years of nuclear politics have systematically invalidated.

ArXiv Paper Digest

PuDGhost: Experimental Analysis of Computation Result Corruption in Processing-using-DRAM Operations on Real DRAM Chips and Implications for Future Systems

2026-06-18

Authors: Daichi Tokuda, İsmail Emir Yüksel, Tatsuya Kubo, Ataberk Olgun

ArXiv: 2606.19119v1

PDF: Download PDF

For decades, computers have followed a simple division of labor: memory stores data and processors compute on it. The problem? Constantly shuttling data back and forth between the two is slow and burns enormous amounts of energy — sometimes more than the computation itself. This bottleneck has a name: the "memory wall."

One promising end-run around this wall is called Processing-using-DRAM (PuD). The clever idea: DRAM chips are already massive grids of cells arranged in rows and columns. If you activate multiple rows simultaneously, the electrical interactions between them naturally produce logical operations (AND, OR, NOT) on the bits stored in those rows. In other words, your memory becomes a giant, free computer — no data movement required.

This paper asks an uncomfortable question: does PuD actually work reliably on real, modern DRAM chips? The authors took commercial DRAM and ran extensive experiments. Their finding, which they call PuDGhost, is troubling:

  • As DRAM gets denser (cells packed closer together to increase capacity), neighboring cells start interfering with each other electrically.
  • When you perform a PuD operation on one set of rows, that activity can silently corrupt unrelated data stored in nearby rows — rows that weren't part of the computation at all.
  • This is essentially a computational version of the famous Rowhammer attack, but instead of malicious activity flipping bits, it's the chip's own intended computation that produces corruption as a side effect.

The implications are significant. PuD has been pitched as a transformative architecture for AI workloads, databases, and any application that grinds through large amounts of memory. But if running PuD operations can corrupt the very data they're supposed to operate on — or worse, data belonging to other processes — then the whole paradigm needs guardrails before it can ship in real systems.

The authors don't just diagnose the problem; they sketch implications for future systems: error-correction schemes, data-placement policies that keep "computational" rows away from sensitive ones, and refresh strategies that account for the disturbance PuD introduces. The takeaway is that researchers can't just simulate PuD on idealized models — the physics of real chips is messier than the theory assumes.

Why it matters: Processing-in-memory is one of the most hyped escapes from the memory-wall bottleneck, and this paper shows it has a fundamental reliability problem on real hardware that the field has to solve before it can be trusted in production systems.

Daily Automotive Engines

Turbocharger Turbine Wheel Hub-to-Tip Ratio: Why Exducer Geometry Limits Spool

2026-06-18

The hub-to-tip ratio on a turbine wheel is the ratio of the hub diameter (the solid center boss the blades attach to) divided by the tip diameter (the outer swept circle) at the exducer — the discharge side where exhaust exits axially. It looks like a throwaway number on a spec sheet, but it controls how much exhaust energy the wheel can actually extract before choking.

Why it matters: exhaust gas enters radially at the inducer and exits axially at the exducer. The annular flow area at the exducer equals π/4 × (tip² − hub²). A fat hub shrinks that annulus, restricting discharge flow and raising backpressure. A skinny hub opens flow area but leaves less material to anchor the blades against centrifugal load — and at 150,000 RPM with blade tips seeing 500 m/s, that material has a job.

Typical ranges:

  • 0.35–0.40: Small, high-spool turbines (e.g., factory 1.5L turbos). Fat hub, low inertia, fast response, but flow-limited up top.
  • 0.40–0.50: Mid-range performance turbines (Garrett G-series, BorgWarner EFR). Balanced spool vs top-end.
  • 0.50–0.60: Large diesel and big-power gas turbines. Skinnier hub relative to tip, more flow area, but the wheel is physically bigger so inertia stays manageable.

Real-world example: The Garrett GTX3582R Gen II turbine wheel runs roughly 65mm tip / 28mm hub, giving a hub-to-tip ratio around 0.43. Compare to a Cummins HE351VE diesel turbine at roughly 60mm tip / 33mm hub — ratio near 0.55. The diesel wheel runs higher backpressure tolerance, lower EGTs, and lives in a torque-dominated rev band; the gas wheel needs to flow hard up to 8,000+ RPM and accepts a slightly more restrictive annulus to gain rotor stiffness.

Rule of thumb: For a target horsepower (gas), pick exducer tip diameter at roughly 1 mm per 12 HP, then size the hub for a ratio between 0.40 and 0.50. Below 0.38, blade root stress climbs sharply; above 0.55 on a gas turbine, you're choking flow at high RPM.

Engineers also watch the exducer trim (exducer² / inducer² × 100). Hub-to-tip and trim work together — a high-trim wheel with a fat hub looks flowy on paper but bottlenecks at the discharge annulus. Always check both numbers before believing the marketing.

Key Takeaway: Hub-to-tip ratio on the turbine exducer sets the tradeoff between discharge flow area and blade root strength — too fat chokes the wheel, too skinny risks blade failure at peak RPM.

Daily Debugging Puzzle

Python's heapq Tie-Breaker Trap: The Priority Queue That Crashes on Equal Priorities

2026-06-18

This scheduler pushes (priority, task) tuples onto a heap and pops them in priority order. It works perfectly in every unit test. Then production starts throwing TypeError at 3 a.m.

import heapq

class Task:
    def __init__(self, name, payload):
        self.name = name
        self.payload = payload

def schedule(tasks):
    queue = []
    for priority, task in tasks:
        heapq.heappush(queue, (priority, task))

    order = []
    while queue:
        _, task = heapq.heappop(queue)
        order.append(task.name)
    return order

# Tests pass — all priorities are distinct
print(schedule([
    (3, Task("backup",  {"size": 100})),
    (1, Task("alert",   {"level": "high"})),
    (2, Task("cleanup", {"files": 50})),
]))  # ['alert', 'cleanup', 'backup'] ✓

# Production: two alerts fire in the same second
print(schedule([
    (1, Task("alert_a", {"id": 1})),
    (1, Task("alert_b", {"id": 2})),   # same priority!
    (2, Task("cleanup", {"files": 50})),
]))
# TypeError: '<' not supported between instances of 'Task' and 'Task'

The Bug

Python's heapq orders tuples lexicographically. When two priorities tie, it falls through to compare the next element — the Task object itself. Task has no __lt__, so Python raises TypeError.

This is one of the nastiest bugs in the Python standard library because it is data-dependent and silent until the data collides:

  • Unit tests with distinct priorities never trigger the secondary comparison.
  • Replacing Task with a dict or list would also fail — dicts aren't orderable, lists compare element-by-element and may recurse into the payload.
  • Using a dataclass(order=True) "fixes" the crash but introduces a worse bug: heap order now depends on attribute values, so identical-priority tasks pop in arbitrary semantic order, breaking FIFO guarantees callers may rely on.
  • It can hide for months if your real-world priority values are timestamps or UUIDs that rarely collide — until clock resolution or a batch insert produces a duplicate.

The correct fix is the same trick Python's own queue.PriorityQueue docs recommend: insert a monotonically increasing tiebreaker between the priority and the payload, so ties resolve by insertion order and the payload is never compared.

import heapq
import itertools

def schedule(tasks):
    queue = []
    counter = itertools.count()        # unique, monotonic, cheap
    for priority, task in tasks:
        heapq.heappush(queue, (priority, next(counter), task))

    order = []
    while queue:
        _, _, task = heapq.heappop(queue)
        order.append(task.name)
    return order

itertools.count() yields integers, integers are always orderable, and ties are now broken by insertion order — giving you a deterministic, stable priority queue. next(counter) is atomic at the bytecode level, so it's safe even under the GIL with multiple producers, though a true multi-threaded queue should use queue.PriorityQueue anyway.

If you want LIFO behavior for ties (e.g., newest-first within a priority class), negate the counter: (priority, -next(counter), task). Either way, the payload never participates in the comparison — which is the whole point.

Key Takeaway: When pushing tuples onto a heap, always insert a unique tiebreaker between the priority and any non-orderable payload — otherwise ties silently fall through to comparing your objects, and your tests won't catch it until two priorities collide in production.

Daily Digital Circuits

Adiabatic Logic: How Hardware Recovers Switching Energy Instead of Dumping It as Heat

2026-06-18

Every time a CMOS gate switches, it pays a tax: E = ½CV² per transition, dumped into the substrate as heat. Charge a 10 fF node to 1 V and you've burned 5 fJ — gone forever the moment the PMOS pulls it high through a constant supply. Adiabatic logic refuses to pay that tax. Instead of switching against a fixed rail, it charges the load through a slowly ramping power-clock, then recovers the stored charge back into the source on the way down.

The physics: dissipation in a resistive charging path scales as (RC/T) · CV², where T is the ramp time. Make T much greater than RC and the energy dissipated per cycle approaches zero — asymptotically. The price is speed. You're trading frequency for energy, and the recovery is incomplete in practice (10–50% of CV² is typical), but that's still 2–10× better than static CMOS at the same activity factor.

How it actually works: replace VDD with a trapezoidal or sinusoidal power-clock φ. A standard CMOS gate is rewired so its pull-up network connects to φ instead of VDD. As φ ramps up, the output follows through the pull-up. As φ ramps back down, the charge on the output capacitance flows backward through the same network into φ — which is now a falling rail acting as a charge sink. The power-clock generator (typically a resonant LC tank with a small inductor) catches that returning charge and reuses it on the next cycle. The inductor is the trick: it converts the charge sloshing back and forth into a near-lossless oscillation, with only the inductor's series resistance and switch losses to make up.

Real-world example: 2QN2P and Positive-Feedback Adiabatic Logic (PFAL) families have shipped in passive RFID tags and implantable medical devices, where the entire chip runs on microwatts harvested from an RF field. A PFAL-based 13.56 MHz NFC tag can run its logic at 100 kHz on 1–2 µW — roughly 5× lower than a static CMOS equivalent. The slow ramp isn't a problem because the harvested RF carrier is the power-clock — you get the sinusoid for free.

Rule of thumb: energy savings ≈ 2RC/T compared to static CMOS. If your gate's RC is 100 ps and you ramp φ over 10 ns, you dissipate roughly 1/50th of CV² per transition — assuming an ideal resonant driver. Below T ≈ 5·RC, recovery collapses and you're back to dumping heat.

The catch: routing four-phase overlapping power-clocks across a chip is brutal, leakage doesn't recover at all (it just leaks), and the resonant tank adds area. Adiabatic logic lives in the ultra-low-power niche, not the mainstream.

Key Takeaway: Adiabatic logic ramps its supply slowly and recovers charge through an LC tank, trading frequency for an asymptotic approach to zero switching energy — useful when your power budget is microwatts, not watts.

Daily Electrical Circuits

Magnetoresistive Sensors: Reading Magnetic Fields with AMR and GMR Technology

2026-06-18

Hall effect sensors are the workhorses of magnetic sensing, but when you need to detect weak fields — the Earth's magnetic field for a compass, a tiny bias magnet on a wheel for ABS speed sensing, or current-induced fields below 1 mT — you reach for a magnetoresistive sensor instead. These devices change their electrical resistance in response to a magnetic field, and they're roughly 100× more sensitive than typical Hall elements.

There are three flavors you'll encounter:

  • AMR (Anisotropic Magnetoresistance): A permalloy (NiFe) thin film whose resistance varies with the angle between current flow and magnetization direction. Sensitivity around 1–3 mV/V per Oersted. Saturates around 2–5 mT.
  • GMR (Giant Magnetoresistance): Stacks of alternating ferromagnetic and non-magnetic layers (a few nm each). Resistance changes by 10–20% with field. The discovery won the 2007 Nobel Prize in Physics and revolutionized hard drive read heads.
  • TMR (Tunneling Magnetoresistance): Magnetic tunnel junctions with an insulating barrier. Resistance changes 100%+ with field. Highest sensitivity, used in modern HDDs and MRAM.

The classic AMR sensor (like Honeywell's HMC1001 or NVE's AA-series) is built as a Wheatstone bridge of four magnetoresistive strips arranged so the field affects opposite arms differently. Power the bridge with 5 V, and you get a differential output of a few millivolts at full-scale field. Feed that into an instrumentation amp with a gain of 100–500, and you have a usable signal.

Real-world example: An automotive wheel speed sensor uses a GMR bridge facing a ferromagnetic tone wheel. Each tooth passing the sensor swings the local field by a few hundred microtesla, producing roughly 50 mV peak-to-peak at the bridge output. A Schmitt-triggered comparator converts this to clean digital pulses for the ABS controller — reliable down to 0 RPM, unlike inductive variable-reluctance sensors that go silent at low speed.

The flipping problem: AMR sensors suffer from polarity ambiguity. A strong field perpendicular to the easy axis can flip the magnetization domains, swapping the sensor's output polarity. The fix is a set/reset strap — an on-chip coil you pulse with ~3 A for a few microseconds to realign all domains before each measurement. This is essential for electronic compasses.

Rule of thumb: For sensitivity, TMR > GMR > AMR > Hall, roughly by factors of 10. For ruggedness and dynamic range, the order reverses. Pick AMR for ±2 mT precision work (compasses, low-current sensing), GMR for ±30 mT industrial speed/position sensing, and Hall for >10 mT applications where you don't need high resolution.

See it in action: Check out What are Magnetoresistive Materials? GMR and CMR Materials by Engineering Physics by Sanjiv to see this theory applied.
Key Takeaway: Magnetoresistive sensors deliver Hall-beating sensitivity for weak-field applications by exploiting how magnetic fields modulate the resistance of carefully engineered thin films arranged in a Wheatstone bridge.

Daily Engineering Lesson

Manometers: Measuring Pressure with a Column of Liquid

2026-06-18

Before Bourdon tubes and digital transducers, engineers measured pressure by watching how high a fluid climbed in a tube. The manometer is still the most fundamental pressure instrument: it has no moving parts, no calibration drift, and its accuracy depends only on fluid density and gravity — both knowable to many decimal places. It's the reference standard everything else gets calibrated against.

The three common configurations:

  • U-tube manometer: A glass U filled with liquid (water, mercury, or colored oil). Connect one leg to the pressure source and leave the other open to atmosphere. The height difference between the two legs gives you gauge pressure directly.
  • Well (cistern) manometer: One leg is replaced by a large reservoir. Because the reservoir's level barely changes, you only read one scale — convenient but slightly less accurate.
  • Inclined manometer: The reading leg is tilted at a shallow angle (often 10°). A small pressure produces a long fluid travel along the tube, multiplying resolution. Used for HVAC duct pressures of a few inches of water column.

The governing equation is just hydrostatics:

ΔP = ρ · g · h

where ρ is fluid density, g is gravity, and h is the height difference between the two fluid columns.

Quick rules of thumb (at standard gravity, room temperature):

  • 1 inch of water column ≈ 249 Pa ≈ 0.036 psi
  • 1 inch of mercury ≈ 3,386 Pa ≈ 0.49 psi
  • 1 mm of mercury (1 torr) ≈ 133 Pa

Worked example: An HVAC technician connects a water-filled U-tube across a filter to check for clogging. The water on the upstream leg sits 1.2 inches lower than the downstream leg. Pressure drop = 1.2 × 249 Pa = 299 Pa, or about 0.043 psi. If the filter's clean-condition spec is 0.25 inches w.c. and the dirty-replacement threshold is 1.0 inch w.c., this filter is overdue.

Why fluid choice matters: Water is cheap and visible but limited to a few psi (a 10 psi reading needs a 23-foot tube). Mercury is 13.6× denser, so the same column measures 13.6× more pressure — that's why blood pressure and barometers historically used mercury. Lighter oils (specific gravity 0.8) extend resolution for very low pressures.

The catch: manometers are slow, fragile, orientation-sensitive, and only practical for gauge or differential measurements where one side can vent. Above ~30 psi or in vibrating environments, switch to a Bourdon gauge or transducer.

See it in action: Check out Measuring Pressure With Barometers and Manometers by Professor Dave Explains to see this theory applied.
Key Takeaway: A manometer turns pressure into a visible liquid height through ΔP = ρgh — no calibration needed, just gravity, density, and a ruler.

Forgotten Books

The 1914 Chemistry Class That Taught Applications First, Theory Second

2026-06-18

Book: Elementary household chemistry; an introductory textbook for students of home economics by Snell, John Ferguson, 1870- (1914)

Read it: Internet Archive

Buried in the preface of a 1914 textbook is a pedagogical philosophy that today's education-reform crowd thinks they invented. John Ferguson Snell, Professor of Chemistry at Macdonald College, McGill University, opens his textbook with this declaration:

The principle which has been kept constantly in mind is to introduce the applications of chemistry to household affairs as early and as often as possible and to present only such portions of the subject matter of theoretical chemistry as is essential to the comprehension of these applications. In this way the student's interest is enlisted and maintained — a most important consideration in the teaching of an applied science.

That's "problem-based learning" and "just-in-time theory" delivered straight, more than a century before they became conference-circuit buzzwords. Snell is openly inverting the standard chemistry curriculum: don't drill students on the periodic table and stoichiometry until their eyes glaze over, then promise that one day it'll be useful. Start with why the bread rises, then introduce only the theory needed to explain it.

The context makes it more interesting. Snell explains that this book exists because:

The recent development of courses of instruction in Home Economics in America has created a field for textbooks pre­pared to meet the special needs of this new class of students.

So who were these students? Women. Home Economics in 1914 was the back door through which serious science education reached women in American and Canadian universities at scale. The "household chemistry" framing was partly genuine pedagogy, partly a cultural compromise — you could teach a woman acid-base chemistry as long as you called it "laundry." And under that compromise, Snell ended up doing something pedagogically radical: he stripped chemistry of its theory-first scaffolding and rebuilt it around real problems.

What modern readers should notice:

  • The applied-science track was taught to women. The "real" chemistry — theory-first, abstract — was reserved for the men in the engineering and pre-med tracks. The applications-first approach we now consider progressive was, at the time, considered the lesser path.
  • Snell's audience had "no previous instruction in the science." He is writing for absolute beginners and refusing to drown them in theory. Compare this to the modern intro chem course that still front-loads electron orbitals before students have lit a Bunsen burner.
  • "Household Chemistry" as a discipline is gone. It got absorbed into food science, materials science, and (depressingly) reduced to TikTok cleaning hacks. The pedagogical insight was lost along with the field.

The thing that's been forgotten isn't a recipe or a remedy — it's an entire curricular philosophy. Snell built a working applications-first chemistry course in 1914, watched it succeed with students who'd never seen a test tube, and wrote down exactly why it worked. A hundred-plus years later, ed-tech companies are charging tuition to rediscover the same principle.

The forgotten claim: A 1914 chemistry professor demonstrated that teaching applications first and theory only as needed was the most effective approach for beginners — a "modern" pedagogical insight that was already in print and being used in classrooms before WWI.

Forgotten Darkroom

The Lost Craft of Mercurializing a Photograph

2026-06-18

Book: Photography in a nut shell; or, The experience of an artist in photography, on paper, glass and silver by M. P. Simons (1858)

Read it: Internet Archive

Open the table of contents of Montgomery P. Simons's 1858 manual and you find a sequence of chapter titles that read less like a photography book and more like a small alchemy textbook:

CLEANING AND POLISHING THE PLATE 17
COATING THE POLISHED PLATE 19
TIMING THE PLATE IN THE CAMERA 21
TO MERCURIALIZE THE PLATE 23
CLEARING THE PLATE WITH HYDRO-SULPHATE OF SODA 24
GILDING THE PICTURE 25
...
CHEMICAL BOXES IN WINTER 32
CHEMICAL BOXES IN SUMMER 33

Simons was a Philadelphia daguerreotypist and a teacher of the craft, also known for his earlier Plain Instructions for Coloring Photographs. His "little manual" was, as he put it in his own dedication,

TO THE Memory of the Immortal DAGUERRE, TO WHOSE BRIGHT GENIUS AND GENEROUS HEART, THE WORLD IS INDEBTED FOR THE BEAUTIFUL ART OF PHOTOGRAPHY.

What is genuinely forgotten here is not a single recipe but an entire vanished profession. To make a photograph in 1858, a working artist had to:

  • Polish a silver-plated copper sheet to mirror brightness with rouge and buffs.
  • "Coat" it by suspending it over open boxes of iodine and bromine vapors, watching the surface change color through yellow, rose, and violet to judge sensitivity.
  • Expose it in the camera.
  • Mercurialize it — literally develop the latent image by holding the plate over a tray of heated liquid mercury, letting the vapor amalgamate with the exposed silver-halide grains.
  • "Clear" it in hyposulphite, then gild it with a gold-chloride solution to tone and protect the image.

The single line "TO MERCURIALIZE THE PLATE" hides a daily occupational hazard that modern photographers cannot imagine. Mercury vapor is now a regulated industrial poison; the studios of the 1850s were essentially low-grade mercury workshops, and tremor, irritability, and tooth loss among veteran daguerreotypists are now recognized as classic signs of chronic mercurialism — the same "mad hatter" syndrome that afflicted felt-makers.

Equally forgotten is the seasonal craft buried in the chapters CHEMICAL BOXES IN WINTER and CHEMICAL BOXES IN SUMMER. Iodine and bromine sublime at very different rates at 5°C versus 30°C, so a photographer's exposure times, coating times, even the geometry of the sensitizing box had to be re-tuned twice a year. Simons's contingency table — TOO MUCH BROMINE, TOO LITTLE BROMINE, TOO LITTLE IODINE — is essentially a diagnostic flowchart for a process whose chemistry drifted with the weather.

The modern echo is unmistakable. When a phone photographer complains that night-mode looks "off," a silicon image-signal processor is doing in milliseconds what Simons did by sniffing a vapor box and counting Mississippis. The chemistry got hidden, not eliminated; we just outsourced the seasonal recalibration to firmware.

The forgotten claim: Every early photograph was developed in mercury vapor by an artisan who had to retune their chemistry between summer and winter — a toxic, seasonal craft that vanished so completely we forgot it was ever a job.

Forgotten Patent

Edmond Becquerel's "Actino-Electric Effect": The 1839 Discovery That Invented the Solar Cell — at Age 19, in His Father's Paris Laboratory

2026-06-18

In 1839, a 19-year-old physics apprentice named Alexandre-Edmond Becquerel was tinkering in his father's lab at the Muséum National d'Histoire Naturelle in Paris. He built a deceptively simple device: two platinum electrodes coated with silver halide (silver chloride or silver bromide), immersed in a mild acidic electrolyte. When he shined sunlight on one of the electrodes, a current flowed. In the dark, it stopped. He had just discovered the photovoltaic effect — the direct conversion of light into electricity.

Becquerel published his findings in Comptes Rendus de l'Académie des Sciences that same year, calling it the "effet électrique sous l'influence des rayons solaires" (electric effect under the influence of solar rays). Patents in France at the time treated such academic discoveries as scientific priority claims rather than industrial filings, but his published apparatus is the prior-art root of every solar cell that followed. The mechanism he stumbled into was nothing less than quantum: photons knocking electrons across an energy barrier at the electrode–electrolyte interface — though quantum mechanics wouldn't exist for another 86 years.

What he actually built:

  • A "wet cell" photovoltaic device — basically a battery whose voltage depended on illumination
  • Platinum electrodes (one coated with light-sensitive silver halide) submerged in dilute acid
  • A galvanometer registering a small but reproducible current when light hit the coated electrode
  • Demonstrated wavelength dependence: blue and violet light produced more current than red — a hint of the photon-energy relationship Einstein would formalize in 1905

The forgotten decades. Nobody knew what to do with it. Becquerel went on to invent the phosphoroscope and discover fluorescence; his son Henri would discover radioactivity in 1896 (winning the 1903 Nobel with the Curies). The photovoltaic effect sat dormant for 44 years until Charles Fritts built a selenium solar cell in 1883 (~1% efficiency) — and then another 71 years until Daryl Chapin, Calvin Fuller, and Gerald Pearson at Bell Labs filed the silicon p-n junction solar cell in 1954 (U.S. Patent 2,780,765, ~6% efficiency).

The modern echo is uncanny. Becquerel's wet cell — a liquid electrolyte sandwiched between a light-absorbing electrode and a counter-electrode — is structurally identical to the dye-sensitized solar cell (DSSC) patented by Michael Grätzel and Brian O'Regan in 1991 (U.S. Patent 5,084,365). Grätzel cells use titanium dioxide coated with a light-absorbing dye, immersed in an iodide electrolyte. They're the direct conceptual descendant of Becquerel's 1839 apparatus — a "wet" photovoltaic that bypasses expensive silicon. Grätzel cells now power calculators, IoT sensors, and indoor light-harvesting devices, hitting ~13% efficiency in lab settings.

Even more striking: the perovskite solar cells sweeping research labs today (efficiencies above 26% as of 2025) often borrow the dye-sensitized architecture — a thin absorber layer on a mesoporous scaffold with a charge-transport medium. The cells the world is racing to commercialize for next-generation photovoltaics are, in their lineage, Becquerel's apparatus with better chemistry.

A teenager in 1839, with platinum, silver salts, and a jar of acid, sketched the architecture that humanity would spend the next two centuries refining — and is only now learning to mass-produce.

Key Takeaway: The photovoltaic effect was discovered by a 19-year-old in 1839 using wet chemistry — and the dye-sensitized and perovskite solar cells driving today's renewable revolution are direct architectural descendants of his original jar of acid and silvered platinum.

Daily GitHub Zero Stars

AudiEtoffe/joy2midi

2026-06-18

joy2midi is a delightfully practical little Python utility that bridges two worlds that rarely talk to each other: gamepads and MIDI. The premise is simple — plug in any joystick or controller, and the tool maps its buttons, triggers, and analog sticks to MIDI messages that any DAW, synth, or hardware instrument can understand. No proprietary software, no expensive MIDI controllers, just a $15 thrift-store gamepad turned into an expressive musical instrument.

What makes this interesting:

  • Accessibility angle. MIDI controllers with knobs and pads cost real money. A used Xbox controller costs almost nothing and has 14+ inputs, including two pressure-sensitive analog sticks perfect for pitch bend, modulation, or filter sweeps.
  • Expressive potential. Analog triggers and sticks give you continuous controllers — something traditional keyboard MIDI doesn't easily provide. Imagine bending notes with your thumb while triggering drums with the face buttons.
  • Live performance hack. A wireless gamepad is more roadworthy than most boutique controllers, and you can wander the stage with it.
  • Accessibility for musicians with disabilities. Gamepad ergonomics have been refined over decades for one-handed and adaptive use — there's real overlap with adaptive music tech.

The repo just landed today with zero stars, so the documentation is probably sparse and the code likely needs polish — but the concept is the kind of thing that hobby DAW users, chiptune artists, and modular synth tinkerers love to fork and extend. It's also a great learning project: Python, pygame (or similar) for joystick input, mido or rtmidi for MIDI output. Small surface area, clear value.

Worth grabbing if you make music in Ableton, FL Studio, Reaper, or any DAW that accepts virtual MIDI input — or if you're learning Python and want a project where the output is genuinely fun.

Why check it out: Turns any gamepad lying in your drawer into a free, surprisingly expressive MIDI controller for music production.

Daily Hardware Architecture

The DRAM Row Buffer: Why Sequential Access Is 10x Faster Than Random

2026-06-18

Inside every DRAM chip, the actual storage is a 2D grid of capacitors organized into rows (typically 8KB wide) and columns. But you can't read a capacitor directly — the charge is too small. Instead, every bank has a row buffer: a strip of sense amplifiers that latches an entire row at once. All reads and writes actually touch the row buffer, not the cells themselves.

This creates three dramatically different access scenarios:

  • Row buffer hit: The row you want is already open. Just send a column address (CAS). ~13ns.
  • Row buffer miss (empty): No row is open. Activate the row (RAS, ~14ns) then CAS. ~27ns.
  • Row buffer conflict: Wrong row is open. Precharge to close it (~14ns), activate new row, then CAS. ~40ns.

That's roughly a 3x latency swing based purely on whether the previous access touched the same row. And because activating a row is destructive (it drains the capacitors and refreshes from the sense amps), you literally cannot skip the precharge step on a conflict.

Concrete example: Walking a 1GB array sequentially gives you ~128 row buffer hits per row (8KB / 64B cache line). Random access into the same array gives you almost guaranteed row conflicts on every access — the DDR5 spec lists tRC (row cycle time) around 45ns, so you're capped at ~22M accesses/sec per bank. Sequential streaming on the same hardware hits 100M+ accesses/sec per bank. Same bytes, same chip, ~5-10x throughput difference.

Why banks exist: Modern DRAM has 16-32 banks per rank precisely so the memory controller can overlap the precharge/activate latency of one bank with column accesses on another. This is why memory controllers aggressively interleave addresses across banks — a 4KB page typically spans multiple banks so even "random" access within a page gets some parallelism.

Rule of thumb: If your working set's stride matches the row size (often 8KB), you'll get worst-case row conflicts. The classic pathology is striding through a column of a large matrix where each element lands in the same bank but a different row. Either tile your access pattern, or transpose.

The page policy the memory controller uses matters too: open-page keeps rows open speculating on locality (great for sequential), close-page precharges immediately (better for random). Server BIOSes often expose this.

Key Takeaway: DRAM isn't random-access at the physical level — it's row-access — so two loads to the same 8KB row are 3x faster than two loads to different rows in the same bank.

Hacker News Deep Cuts

Deegen: A JIT-Capable VM Generator for Dynamic Languages [pdf]

2026-06-18

Building a fast virtual machine for a dynamic language is one of the most labor-intensive undertakings in systems programming. V8, LuaJIT, PyPy, and HHVM each represent person-decades of work — hand-tuned interpreters, tiered JITs, inline caches, deoptimization machinery, garbage collector integration. The dirty secret is that most of this complexity is mechanical: once you've decided your bytecode semantics, the interpreter loop, the baseline JIT, and the inline cache plumbing follow predictable patterns. But "predictable" doesn't mean "easy" — getting them all correct and fast has historically required a small army of compiler engineers.

Deegen attacks this problem at the meta level. Rather than writing yet another VM, the authors built a generator that takes a high-level bytecode semantics description and emits a complete VM, including a tiered JIT compiler. The paper is from the same research line as LuaJIT Remake (the previous Deegen-adjacent work that produced a Lua interpreter outperforming LuaJIT's interpreter despite being auto-generated).

Why this matters to a technical audience:

  • It collapses the cost of language experimentation. If you want a competitive JIT for your DSL, niche scripting language, or research vehicle, you currently can't have one. Deegen suggests a path where bytecode semantics alone get you a tiered JIT for free.
  • The interpreter generation technique is itself interesting. Prior work showed that LLVM-compiled, tail-call-based interpreters can match or beat hand-tuned assembly. Extending that to baseline JIT codegen — where you have to emit machine code that handles inline caches, side exits, and OSR — is a much harder problem.
  • It pushes back on the "JITs must be hand-written" orthodoxy. Copy-and-patch compilation, meta-tracing (RPython/PyPy), and now Deegen's approach all suggest the next generation of dynamic-language runtimes might be generated rather than authored.

The PDF is from Fredrik Kjolstad's group, which has a strong track record in compiler-generation research (TACO, the tensor compiler, came from the same lab). That pedigree alone makes it worth a read for anyone interested in compilers, language runtimes, or the gap between declarative specification and machine-code-quality output.

This is the kind of paper that sits at one upvote on a Wednesday morning and then resurfaces six months later when someone notices a startup or research group built something on it.

Why it deserves more upvotes: A serious academic attempt to make tiered JITs as easy to ship as interpreters — a potential generational shift in how dynamic language runtimes get built.

HN Jobs Teardown

Airbnb: What Their Hiring Reveals

2026-06-18

Source: HN Who is Hiring

Posted by: ssk2

Of the eleven postings in this thread, Airbnb's is the most revealing — not because it says the most, but because of what a hyperscaler chooses to emphasize when fishing for senior talent on Hacker News.

The role: Staff Software Engineer on Cloud Infrastructure, onsite in San Francisco/San Jose. The team owns "compute clusters, cloud deployments and service discovery infrastructure" serving ~1,500 internal product engineers and "many tier 0 services."

1. Tech stack (by inference): The posting deliberately avoids name-dropping, but the vocabulary is telling. "Compute clusters" + "service discovery" + "tier 0" is the standard Kubernetes-plus-service-mesh dialect of 2020-era infra teams. Airbnb famously runs on AWS with a heavy Kubernetes investment (their SmartStack/Synapse service discovery tooling was open-sourced years ago and they've been migrating off it). The fact that this team still exists as a distinct org — rather than "Platform" or "Developer Productivity" — signals they're still operating their own abstractions on top of EC2 rather than going all-in on managed services like EKS/Fargate.

2. Stage & direction: The 1,500-engineer figure is the real headline. That's not a startup problem — that's a platform-team-as-internal-SaaS problem. They need a Staff engineer because the org has outgrown the "smart senior who knows everything" model and needs someone who can set technical direction across multiple squads. The "strict requirements for scale and robustness" framing suggests they've had recent reliability incidents — tier 0 language usually shows up in postings after a postmortem.

3. Skills & trends: Cloud infra at FAANG-adjacent scale is increasingly about multi-tenancy of internal customers, not raw scale. The ideal candidate isn't a distributed-systems researcher — it's someone who can negotiate SLOs with 1,500 product engineers and ship migrations without breaking them. This mirrors the broader 2020 trend of "Platform Engineering" emerging as a discipline distinct from SRE.

4. Flags:

  • Green: Posted by an actual engineer ("I've worked at a few companies…") rather than a recruiter — suggests the team has hiring autonomy.
  • Yellow: Onsite-only in March 2020, when the rest of the thread is going remote. Airbnb's travel-dependent business was about to implode within weeks of this posting — anyone who joined faced the May 2020 layoffs.
  • Red: No mention of compensation, no mention of the team's recent wins, no specifics on what's broken. Vague seniority pitches often mean "we need someone to absorb on-call without complaining."
The signal: When a hyperscaler hires Staff infra engineers with vague "tier 0" language and no comp transparency, they're recruiting for organizational scar tissue, not greenfield work.

Daily Low-Level Programming

The Kernel Same-Page Merging Daemon (KSM): Deduplicating Identical Pages Across Processes

2026-06-18

You run 50 VMs on one host, each booting the same Linux image. Each has a kernel text segment, glibc, sshd — identical bytes sitting in 50 different physical pages. KSM (Kernel Same-page Merging) is the kernel daemon that finds those duplicates and collapses them into one shared, copy-on-write page.

The mechanism: a kthread (ksmd) periodically scans pages that processes have voluntarily registered via madvise(MADV_MERGEABLE). It maintains two red-black trees:

  • Unstable tree: pages indexed by content hash, candidates for merging. Entries can change because the underlying page is still writable.
  • Stable tree: already-merged pages, write-protected. Indexed by full byte comparison (not hash — collisions would be catastrophic here).

When ksmd scans a candidate page, it computes a checksum. If the checksum is stable across two scans (meaning the page hasn't changed), it looks in the stable tree for a byte-exact match. Match found? The PTE is rewritten to point at the shared page, marked read-only, refcount bumped, and the original physical page is freed. No match? It's added to the unstable tree to wait for a future twin.

The catch is the write fault. The moment any process writes to a merged page, the CPU traps, the kernel allocates a fresh page, copies, and rewires that one PTE — classic COW. So KSM trades CPU (scanning, hashing, comparing) for RAM. On a host running identical VMs, savings of 30-50% of guest memory are routine; KVM enables it by default for guest pages.

Concrete example: A QEMU process backing a VM calls madvise(guest_ram, size, MADV_MERGEABLE) on its allocated guest RAM. Twenty VMs each have a 4 KB page containing the zeroed BSS of init. ksmd finds them, leaves one physical page, and frees nineteen. That's 76 KB recovered from one merge — multiply across millions of pages.

Rule of thumb: KSM's cost is roughly proportional to pages_to_scan × scan_frequency_hz. Default tuning (/sys/kernel/mm/ksm/pages_to_scan = 100, sleep 20 ms) scans ~5000 pages/sec ≈ 20 MB/sec — under 1% of one core. Bump pages_to_scan to 1000 on a busy hypervisor and you'll see one core pinned at 15-25%, but merge-rate climbs proportionally.

Security wrinkle: Merging is observable. A write to a merged page is measurably slower than a write to a private one (the COW fault). This is the basis of the Flush+Reload-class cross-VM attacks; production hypervisors often disable KSM across security domains or use merge_across_nodes=0 to at least confine it within a NUMA node.

Key Takeaway: KSM trades CPU cycles for RAM by content-hashing user-registered pages and collapsing duplicates into shared COW mappings — invaluable for dense VM hosting, but the write-latency asymmetry it creates is a side channel.

RFC Deep Dive

RFC 4791: Calendaring Extensions to WebDAV (CalDAV)

2026-06-18

RFC: RFC 4791

Published: 2007

Authors: C. Daboo, B. Desruisseaux, L. Dusseault

If you've ever wondered how your iPhone's Calendar app talks to your work calendar server, or how Thunderbird syncs with Fastmail, or how a Nextcloud instance shares events with macOS — the answer, almost certainly, is CalDAV. RFC 4791 is the protocol that quietly powers most non-Google, non-Microsoft calendaring on Earth.

The problem. By the mid-2000s, calendar data had a standard format (iCalendar, RFC 5545) but no standard way to share it. Every vendor had its own proprietary server protocol: Exchange used MAPI/RPC, Lotus Notes had NRPC, Oracle had its own thing. Open-source clients couldn't interoperate, and users couldn't move between platforms without losing their data. What was needed was an open, HTTP-based protocol that any client could speak.

The clever design decision: build on WebDAV. Rather than invent a new protocol from scratch, the authors layered calendaring on top of WebDAV (RFC 4918) — HTTP's extension for collaborative file management. A calendar becomes a collection (think: directory), and each event or task is a resource (think: file) containing an iCalendar object. To create an event, you PUT an .ics file. To delete it, you DELETE it. To list events, you use WebDAV's PROPFIND. This means CalDAV inherits HTTP authentication, TLS, ETags for conflict detection, and all the existing tooling for free.

The novel parts. CalDAV adds a few essential pieces WebDAV alone can't provide:

  • The MKCALENDAR method — a new HTTP verb to create a calendar collection (distinct from a generic WebDAV collection).
  • The REPORT method extensions: calendar-query lets clients ask "give me all VEVENTs between July 1 and July 31 that match these filters" without downloading the entire calendar. calendar-multiget fetches a known set of resources in one round trip.
  • Server-side expansion of recurring events — the server can expand a weekly meeting into individual instances within a date range, so dumb clients don't have to implement RFC 5545's gnarly recurrence rules.
  • Free-busy queries via VFREEBUSY, enabling "find a time" features across users.

Why it matters today. Apple bet heavily on CalDAV — macOS Calendar, iOS Calendar, and iCloud all speak it natively. Google supported it until 2024 when they restricted it to Workspace accounts, but the protocol still underpins essentially every non-Microsoft, non-Google calendar service: Fastmail, Nextcloud, Radicale, SOGo, Baïkal, Posteo, Mailbox.org, and self-hosted setups worldwide. Its sibling CardDAV (RFC 6352) does the same for contacts. If you own your data and aren't paying Microsoft or Google, you're almost certainly using CalDAV.

The quirks. The XML payloads are verbose — a simple query is hundreds of bytes of namespaced XML. The recurrence expansion rules in RFC 5545 are notoriously hard to get right, and CalDAV servers have historically disagreed on edge cases (timezones around DST transitions, EXDATEs on infinite recurrences). And because every event is a separate HTTP resource, syncing a large calendar can mean thousands of requests — though the sync-collection REPORT (RFC 6578) later helped enormously.

The history. Lisa Dusseault was a key WebDAV editor at the IETF; Cyrus Daboo went on to author the CardDAV spec and now works at Apple on calendaring; Bernard Desruisseaux came from Oracle, which had a major calendaring product. The collaboration across vendor lines is part of why CalDAV won where proprietary protocols stalled.

Why it matters: CalDAV is the open, HTTP-based protocol that quietly powers nearly every calendar app outside the Google/Microsoft walled gardens — a textbook case of solving an interop problem by layering cleanly on top of existing web standards.

Stack Overflow Unanswered

Some questions about ARM/ARM64 write combine(NORMAL_NC) memory attribute read/write and memory barriers

2026-06-18

Stack Overflow: View Question

Tags: caching, architecture, arm, hardware, arm64

Score: 2 | Views: 122

The asker wants to validate DDR by writing a value then reading it back, mapping the page as Normal Non-Cacheable (Normal_NC) — a "write-combining" attribute commonly used for framebuffers and device memory. Their test code issues a store, a dsb sy, then a load, and they're trying to reason about whether the load is guaranteed to see DRAM (not a merge buffer) and whether the barrier is sufficient.

This question is interesting because Normal_NC sits in a confusing middle ground of the ARM memory model. Unlike Device memory, Normal_NC accesses can be gathered, merged, reordered, and speculatively prefetched — but they are not cached in L1/L2. So intuition from x86 WC memory only partially carries over.

Key technical points:

  • Write merging buffers are not caches. A pending store in the CPU's write-combine buffer hasn't reached DRAM yet, even though there's no cache line. A subsequent load to the same address may be satisfied from the merge buffer (store-to-load forwarding), which defeats the purpose of "did it actually land in DDR?"
  • dsb sy drains the write buffer to the point of coherency/serialization, but the architectural guarantee is that prior memory accesses are complete with respect to the shareability domain — not that they've physically reached the DRAM cell. For most SoCs the memory controller acknowledges the write before the DRAM array commits.
  • Speculative reads on Normal memory are permitted, which means the read could be issued before the architectural sequence point unless ordered.

Direction for an answer:

  • For DDR integrity testing (stuck bits, weak cells), you cannot rely on the CPU's load returning what hit DRAM. You need either (a) a cache/buffer-flush instruction sequence with sufficient delay or temperature stress, or (b) a memory controller scrubber / built-in self-test, or (c) accesses through a path that bypasses CPU buffering entirely (e.g., DMA engine reads).
  • For ordering-only purposes, dsb sy between the store and load is the correct barrier; adding isb doesn't help (ISB is for context-synchronization, not data ordering).
  • Mapping the region as Device-nGnRnE instead of Normal_NC would prevent gathering and merging, giving a much stronger "this store left the CPU" guarantee — at significant performance cost.

Gotchas: write-combining behavior is implementation-defined within architectural limits, so two different SoCs (even both ARMv8.2) can give different observable results for the same code. And on real hardware, the DDR controller's own write buffer and refresh cycles further blur "did it reach the cell."

The challenge: The asker conflates "the store completed architecturally" with "the bit physically flipped in the DRAM array" — and the ARM memory model only guarantees the former.

Daily Software Engineering

The Hazard Pointer Pattern: Safe Memory Reclamation Without Garbage Collection

2026-06-18

In a lock-free data structure, one thread can be reading a node while another thread wants to delete it. If you free the memory while the reader is still dereferencing the pointer, you get a use-after-free. Garbage-collected languages dodge this entirely. In C++, Rust (with raw pointers), or any kernel code, you need hazard pointers.

The idea is small: before a thread accesses a shared pointer, it publishes that pointer in a per-thread "hazard slot" — a single-writer, multi-reader location. When another thread wants to free a node, it doesn't free it immediately. It puts the node on a retire list. Periodically, the retiring thread scans every other thread's hazard slots. If the node isn't published by anyone, it's safe to free. If it is, leave it on the list and try again later.

Concrete example — a lock-free stack pop:

  • Thread A reads top, gets node X. Before dereferencing X to read X->next, it writes X into its hazard slot.
  • Thread A re-reads top to confirm X is still there (the publish must happen-before the use). If it changed, retry.
  • Thread B pops X concurrently, succeeds the CAS, and calls retire(X).
  • B scans hazard slots, sees A still holds X, leaves X on its retire list.
  • Later, A finishes its read and clears its hazard slot. Next scan, X is reclaimable.

Rule of thumb on overhead: set the retire-list threshold to 2 × (number of threads) × (hazard pointers per thread). With 16 threads and 2 hazards each, you scan when the retire list hits 64. That keeps the amortized scan cost O(1) per retire — each retired node is examined a constant number of times before being freed.

Hazard pointers beat the alternatives in specific ways. Reference counting on every access destroys cache lines under contention. RCU (read-copy-update) is faster for reads but requires quiescent-state detection, which is awkward in user space. Epoch-based reclamation is simpler but a single stuck thread blocks all reclamation forever — a memory leak waiting to happen. Hazard pointers bound the unreclaimed memory per thread, so one slow reader can't starve the whole system.

The catch: hazard pointers require discipline. You must publish before dereferencing, and you must re-validate after publishing. Forget the re-read, and you've published a pointer to a node that was already freed before you announced your interest. C++26 standardized std::hazard_pointer precisely because rolling your own is a footgun.

See it in action: Check out [KAIST CS492C, 2020 Fall] Safe Memory Reclamation (Hazard Pointers) by KAIST Concurrency and Parallelism Laboratory to see this theory applied.
Key Takeaway: Hazard pointers let lock-free readers announce "I'm using this" so concurrent deleters defer reclamation — trading a tiny per-access publish for the ability to free memory safely without a GC.

Tool Nobody Knows

smem: The Memory Accountant That Stops RSS From Lying to You

2026-06-18

Every time you've added up the RSS column from ps and gotten a number bigger than your actual RAM, that's because RSS double-counts shared pages. Two processes both linked against libc.so? Each one's RSS includes the full library. Sum across hundreds of processes and the books no longer balance.

The kernel has known the answer since 2007: PSS (Proportional Set Size) divides each shared page by the number of processes sharing it, and USS (Unique Set Size) is the memory only this process holds — i.e., what you'd actually reclaim by killing it. Both live in /proc/<pid>/smaps. Almost nothing exposes them sanely. smem does.

Install: apt install smem / pacman -S smem. It's about 1,000 lines of Python.

Top processes by what they actually cost:

$ smem -k -s pss -r | head
  PID User     Command                         Swap      USS      PSS      RSS
 4821 shaun    /usr/lib/firefox/firefox          0     842.3M   891.4M   1.4G
 5102 shaun    /opt/google/chrome/chrome         0     612.1M   698.7M   1.9G
 5103 shaun    /opt/google/chrome/chrome         0     410.5M   473.2M   1.7G

Note Chrome: RSS says 1.9G, PSS says 698M. The PSS column is what disappears from free -m if you kill it. The RSS column is fiction.

Group by user, with totals that actually sum correctly:

$ smem -u -k -t
User         Count     Swap      USS      PSS      RSS
root            89    1.2M     1.4G     1.7G     3.9G
shaun          124    2.1M     5.8G     6.4G    12.1G
www-data        12    0       312.0M   367.0M   624.0M
-----------------------------------------------------------
               225    3.3M     7.5G     8.5G    16.6G

Per-library breakdown — find the shared libraries that are actually heavy:

$ smem -m -k -s pss -r | head -5
Map                                          PIDs   AVGPSS      PSS
[heap]                                        198    18.2M     3.6G
<anonymous>                                   847     2.1M     1.8G
/usr/lib/x86_64-linux-gnu/libxul.so             3   201.4M   604.3M

Filter to a process tree, get a real number:

$ smem -k -P chrome -t
  PID User     Command                         Swap      USS      PSS      RSS
 5102 shaun    chrome --type=renderer            0     612.1M   698.7M   1.9G
 5103 shaun    chrome --type=renderer            0     410.5M   473.2M   1.7G
 5099 shaun    chrome --type=gpu-process         0      89.2M   102.4M   384.1M
-----------------------------------------------------------------------------
                                                0     1.1G     1.3G     4.0G

The killer feature: charts in your terminal, no DISPLAY required when paired with cairo:

$ smem --pie name -o memory.png        # who owns the RAM, visually
$ smem --bar pid -c "command pss uss"  # bar chart of top consumers

Running inside a container where /proc/meminfo lies about the host? Pass the real cgroup limit:

$ smem -k --realmem=2G -p           # show PSS as % of actual limit

And the most under-used flag: --capture-mode writes a tarball of /proc you can analyze later, on a different machine, with the same tool — perfect for postmortems where the OOM has already happened and you only have a snapshot from sosreport.

Why not pmap, ps, top, or htop? pmap -x shows mappings but no PSS sum. ps/top have no PSS column at all. htop finally added it, but only per-process — no group-by-user, no per-library aggregation, no totals that match free. smem's sums always match reality because the math is correct.

Key Takeaway: RSS lies about memory because shared pages get counted N times — smem reads /proc/<pid>/smaps and gives you PSS and USS, the only per-process numbers that actually add up to your real RAM usage.

What If Engineering

What If We Built a Skyscraper-Sized Magnetohydrodynamic Chimney to Generate Power from a Coal Plant's Exhaust?

2026-06-18

Magnetohydrodynamic (MHD) generators extract electricity directly from a flowing ionized gas — no turbines, no moving parts. You shove hot conductive plasma through a magnetic field, and the Lorentz force separates positive and negative charges onto electrodes. The Soviets actually ran a 25 MW MHD topping cycle (U-25) in Moscow in the 1970s. The problem has always been that you need 3,000 K exhaust to get meaningful ionization, and at those temperatures your channel walls vaporize in hours.

So: what if we built a single colossal MHD channel — a 500-meter-tall chimney, 30 m in diameter, sitting atop a 1 GW coal plant — and used the entire flue-gas stream as our working fluid? Could we recover the 35% of fuel energy currently dumped as heat?

The seeding problem

Flue gas at 1,800 K is essentially non-conductive. To get usable conductivity (~10 S/m), you seed it with cesium or potassium carbonate, which ionize easily. Cesium gives the best yield but costs ~$60,000/kg. A 1 GW plant pushes ~1,200 kg/s of flue gas; seeding at 1% mass fraction means 12 kg/s of cesium. That's $43 million per hour. Potassium at 0.5% is more realistic: ~$200/hour in seed, plus a downstream electrostatic precipitator to recover 99% of it (the Soviets managed 95%).

The chimney as a generator

Power density in an MHD channel scales as P = σ·u²·B²·(1-K)·K, where σ is conductivity, u is gas velocity, B is magnetic field, and K is the load factor. Plug in σ = 10 S/m, u = 800 m/s (subsonic flue gas), B = 5 T (a serious superconducting magnet wrapping the chimney), K = 0.5:

P = 10 × 800² × 5² × 0.25 = 40 MW/m³

The channel volume is roughly π × 15² × 500 = 350,000 m³, but only the first ~50 meters runs hot enough for real conductivity. That gives an active volume of ~35,000 m³ and a theoretical output of ~1.4 TW — which is absurd. In practice you're limited by the gas's thermal energy: 1,200 kg/s × 1,200 J/kg·K × 800 K cooling ≈ 1.15 GW of available heat. At MHD efficiency of ~25%, that's 290 MW of bonus electricity stacked on top of your existing steam cycle.

The 5-tesla problem

Wrapping a 30-meter-diameter superconducting solenoid is, frankly, unhinged. ITER's 13 m bore central solenoid stores 6.4 GJ. Scaling roughly with B²·V, our chimney coil stores ~150 GJ — equivalent to 36 tons of TNT in magnetic field energy. A quench would vaporize the chimney. You'd need a segmented array of warm-bore resistive magnets instead, eating ~50 MW just to run, dropping net gain to ~240 MW.

The wall problem nobody solved

Slag from coal ash deposits on electrodes, shorting them out. The Soviets never ran U-25 continuously for more than 250 hours. With modern ceramic-matrix composites (HfC coatings, melting point 4,200 K) you might reach 5,000 hours — still a maintenance nightmare versus a steam turbine's decade-long runs.

Plant efficiency would jump from 35% to roughly 47% — comparable to a modern combined-cycle gas plant, but applied to coal. Which is the real irony: we'd be making the dirtiest fuel almost as efficient as the cleanest, just in time for nobody to want it.

Key Takeaway: A 500-meter MHD chimney could squeeze ~240 MW of bonus electricity from a coal plant's waste heat, but a 150-gigajoule superconducting magnet and slag-coated electrodes make the steam turbine look downright reasonable.

Wikipedia Rabbit Hole

Thermoacoustics

2026-06-18

Put a heated metal mesh inside a glass tube, and under the right conditions the tube will scream — a pure, sustained tone loud enough to hurt your ears, powered by nothing but a temperature difference. This is the Rijke tube, a parlor demonstration from 1859, and it's also the gateway to one of the strangest corners of engineering: machines that pump heat with sound, and machines that make sound from heat.

Thermoacoustics is the physics of how pressure waves and temperature gradients feed each other. In a normal sound wave, gas parcels compress (warming slightly) and expand (cooling slightly) as they oscillate. Usually this is a footnote. But if you place those oscillating parcels against a solid surface with a steep temperature gradient — a "stack" of thin plates or a porous ceramic — something remarkable happens. The gas picks up heat at one end of its swing and dumps it at the other. Run it one way and you have a heat pump driven by sound. Run it the other way and a temperature difference spontaneously generates a roaring acoustic wave, which can drive a piston or a linear alternator.

The clever part: there are no moving parts in the hot zone. No pistons, no rotating shafts, no sliding seals. The "working fluid" oscillates itself. That makes thermoacoustic engines astonishingly reliable — Los Alamos has built ones that ran for years without maintenance — and it makes them attractive for places where moving parts are nightmares:

  • Cryogenic cooling for superconducting magnets and infrared sensors, where vibration from a mechanical compressor would ruin the measurement.
  • Space probes — NASA has tested thermoacoustic Stirling generators that turn the heat from a radioisotope source directly into electricity via a resonant gas column.
  • Natural gas liquefaction, where the waste heat from the gas itself could, in principle, drive the very refrigerator that liquefies it.

The connection to the Stirling engine is intimate — a thermoacoustic engine is essentially a Stirling cycle where the displacer and piston have been replaced by a resonant standing wave. Robert Stirling patented his hot-air engine in 1816 thinking about coal mine safety; two centuries later, his cycle is running silently in the form of sound waves bouncing between mesh screens.

There's a dark twin to all this: combustion instability. When the flame inside a rocket engine or gas turbine happens to release heat in phase with a pressure oscillation in the chamber — what's called a positive Rayleigh index — the chamber becomes its own thermoacoustic amplifier. The F-1 engines on the Saturn V suffered exactly this, and engineers spent years tuning baffles to prevent self-destructive screaming at thousands of hertz.

So the same physics that lets you build a fridge with no moving parts can also tear a rocket apart. The only difference is whether the heat release and the pressure wave are in love, or just acquaintances.

Down the rabbit hole: The same effect that lets a heated wire mesh make a glass tube shriek is what nearly destroyed the Saturn V's engines — and what now silently cools satellites in orbit.

Daily YT Documentary

Heart's Secret Signals Brain vs Independent Action #sleepsolution #science #facts #film #horror

2026-06-18

Heart's Secret Signals Brain vs Independent Action

Channel: MASKE (631 subscribers)

Note: this batch was thin — most candidates were trailers, hashtag-spam shorts, or logo compilations. This one wins by default, but the underlying topic is genuinely interesting.

The video tackles a real and underappreciated piece of neuroscience: the intrinsic cardiac nervous system, sometimes called the "little brain in the heart." The human heart contains roughly 40,000 sensory neurons that form their own semi-autonomous network, capable of processing information and influencing rhythm independently of signals from the brain. It's why a transplanted heart — completely severed from the central nervous system — keeps beating and adapting.

The Turkish-language description frames the question directly: is the heart just a pump, or does it have a mind of its own? Expect coverage of vagal feedback loops, the heart-brain axis, and how cardiac neurons store a kind of "memory" that influences emotional regulation and sleep.

The hashtag-spammed title is unfortunate, and the production is clearly a small-channel effort, but the science being discussed is legitimate and rarely covered outside specialist channels. Worth a watch if you're curious about why "gut feelings" and "heart feelings" aren't just metaphors.

Why watch: A small-channel dive into the heart's own neural network — a real but underappreciated piece of neuroscience.

Daily YT Electronics

How to Simulate your Raspberry Pi Pico projects directly in Wokwi before building them in hardware!

2026-06-18

How to Simulate your Raspberry Pi Pico projects directly in Wokwi before building them in hardware!

Channel: RLC-EEE (516 subscribers)

Wokwi is one of the most useful tools to enter the embedded developer's toolkit in recent years — a browser-based simulator that models microcontrollers, peripherals, and even timing-sensitive interactions with surprising fidelity. This tutorial walks through setting up a Raspberry Pi Pico project inside Wokwi from scratch, including wiring up components on the virtual breadboard, loading MicroPython or C code, and stepping through execution to verify behavior before committing to physical hardware.

For hobbyists and students, the appeal is obvious: you can iterate on a design in seconds rather than minutes, catch logic bugs without burning flash cycles, and share fully reproducible projects via a single URL. The video covers the practical workflow — creating a new simulation, adding peripherals like LEDs, buttons, and sensors, debugging code interactively, and understanding where the simulator's limitations lie (analog behavior, RF, and certain timing edge cases don't always match silicon).

What makes this worth watching over the official docs is the hands-on framing: rather than enumerating features, the presenter shows the typical develop-test-debug loop you'd actually use when prototyping. If you've been hesitant to commit to a Pico project because you don't have parts on hand, or you want a faster feedback loop while learning, this is a low-friction entry point. The channel is small (516 subs) but the production is clean and the content is focused on practical EE education.

Why watch: A practical intro to Wokwi's Pico simulator that lets you prototype embedded projects entirely in the browser before touching real hardware.

Daily YT Engineering

The Smaller Prototype Fighter that Forced the Future (ep27)

2026-06-18

The Smaller Prototype Fighter that Forced the Future (ep27)

Channel: WWIDO Infinite Learning (690 subscribers)

Honest caveat: this week's candidate pool was thin. Most entries were Shorts, hashtag spam, day-X CAD vlogs from an 11-subscriber channel, or generic AI-narrated "explore the science" compilations. This Bf 109 prototype deep-dive is the only candidate with substantive engineering content, so it wins by default — but it's a genuinely worthwhile watch on its own merits.

The episode focuses on the design philosophy behind the Bf 109 prototype rather than its combat history. Willy Messerschmitt's team made a series of unconventional trade-offs that became foundational to modern fighter design: an airframe deliberately built smaller than the engine it was designed around, flush-riveted stressed-skin monocoque construction, automatic leading-edge slats, and an undercarriage attached to the fuselage rather than the wings (which made wing removal trivial for field maintenance, at the cost of a notoriously narrow track).

What makes the video useful is that it explains why each compromise was made — the weight-to-power calculus, the manufacturing constraints of mid-1930s Germany, and how each "flaw" was actually a deliberate optimization for a specific mission profile. It's a concrete case study in how requirements drive geometry, which is a lesson that translates directly to any engineering discipline.

At 690 subscribers, the channel is exactly the kind of overlooked technical creator worth supporting.

Why watch: A clear case study in how mission requirements and manufacturing constraints force specific design trade-offs in airframe engineering.

Daily YT Maker

I Made Something

2026-06-18

I Made Something

Channel: LearnWithPeet (159 subscribers)

Peet introduces Zed, a custom Raspberry Pi desktop companion built entirely from scratch. Unlike the typical Pi tutorial that just walks through flashing an SD card, this project sits at the intersection of physical fabrication, embedded electronics, and software design — the kind of multi-discipline build that's genuinely instructive to watch from a small maker channel.

Desktop companion projects are a great vehicle for learning because they force you to make real decisions about enclosure design, display selection, power delivery, and interaction patterns. A Raspberry Pi gives you enough horsepower to run animated faces, voice processing, or even small local models, but it also forces you to think carefully about heat, mounting, and how to expose GPIO without breaking the form factor.

The understated title — "I Made Something" — and the modest framing of "what it can do right now" suggest this is an honest progress update rather than an over-polished reveal, which usually translates into more candid explanations of trade-offs and dead-ends. For viewers interested in starting their own desk-companion or smart-object builds, seeing someone at the 159-subscriber level walk through their work is often more replicable than a slick channel's six-figure build.

Note: the candidate pool was unusually weak this round — many entries were Shorts or hashtag spam. This one stood out as the only substantive maker project on offer.

Why watch: A from-scratch Raspberry Pi desktop companion build that touches fabrication, electronics, and software in one approachable small-channel project.

Daily YT Welding

Forming FHA Drip Edge Pieces at FRSA 2026

2026-06-18

Forming FHA Drip Edge Pieces at FRSA 2026

Channel: Roll Former LLC (354 subscribers)

Roll Former LLC brought their FHA Drip Edge Machine to the Florida Roofing & Sheet Metal Association expo, and this clip shows the portable roll former producing finished drip edge profiles on the show floor. Drip edge is the L-shaped (or T-shaped) sheet metal flashing that runs along the eaves and rakes of a roof — its job is to direct water away from the fascia and into the gutter rather than letting it wick back under the shingles and rot the deck.

The "FHA" profile is a Florida-specific high-wind variant with a longer kickout leg, designed to meet the state's tightened roofing code after the post-Andrew rewrites. What's worth watching here is the roll forming process itself: instead of bending each piece on a brake, a coil of pre-painted aluminum or galvanized steel is fed through a series of staged rollers that progressively form the profile as it travels through the machine. It's a great example of continuous forming vs. discrete bending — higher throughput, consistent geometry, and on-site production from a single coil.

For roofers, sheet metal fabricators, or anyone curious about job-site machinery, it's a quick look at how specialty trim gets made where it's installed rather than shipped pre-formed.

Why watch: A clear look at portable roll forming producing a code-specific roofing profile, illustrating how progressive rollers replace a brake for high-volume trim work.

All newsletters