Daily Digest — 2026-06-28

25 newsletters today.

In this digest


Abandoned Futures

The Mars Excursion Module (MEM): The 1960s Crewed Mars Lander NASA Designed Down to the Last Bolt and Cancelled Before Apollo 11 Even Launched

2026-06-28

In August 1966 β€” three years before Neil Armstrong stepped onto the Moon β€” Philco-Ford delivered a 600-page final report to NASA's Marshall Space Flight Center titled "Mars Excursion Module Study." It was a complete engineering design for a vehicle to land humans on Mars and return them to orbit. The contract number was NAS8-20262. The first crewed landing was scheduled for November 1981.

The MEM was the lander half of NASA's EMPIRE (Early Manned Planetary-Interplanetary Roundtrip Expeditions) and follow-on UMPIRE studies, which proposed using a Saturn V derivative and NERVA nuclear-thermal upper stage to push a 6-crew vehicle to Mars on a roughly 640-day conjunction-class trajectory. Wernher von Braun personally championed the architecture in his August 1969 memo to Vice President Agnew, two weeks after Apollo 11 splashed down. He proposed twin nuclear-powered ships departing Earth orbit in November 1981.

The MEM itself was a marvel:

  • Biconic lifting-body aeroshell, 30 feet across at the base β€” the same general shape SpaceX is now using on Starship's nose
  • Mass at Mars arrival: ~44,000 lb, with a crew of three descending while three orbited (Apollo architecture, scaled up)
  • Surface stay: 10 to 40 days
  • Ascent stage burned FLOX (fluorine-oxygen) / methane β€” yes, methane, sixty years before Starship
  • Powered by a SNAP-8 radioisotope generator for surface power
  • Hypersonic entry from Mach 27 using a 70-degree blunt cone, decelerating to subsonic at ~20,000 ft for a tail-first powered landing

Why did it die? Three reasons, all political, none technical:

  1. Nixon's 1970 budget gutted post-Apollo planning. NERVA was cancelled in 1972 despite passing all ground tests (the NRX-A6 ran at full power for 62 minutes). Without nuclear-thermal propulsion, the mass budget for Mars collapsed.
  2. Vietnam. NASA's budget fell from 4.4% of federal spending in 1966 to 1% by 1975.
  3. The Shuttle decision. NASA traded deep-space capability for a low-Earth-orbit truck that ended up costing more per flight than a Saturn V.

Why it's viable now: Every technical obstacle Philco-Ford flagged in 1966 has been solved or is being solved:

  • Methane propulsion is now flight-proven (Raptor, BE-4)
  • Hypersonic biconic entry has been validated by Mars Science Laboratory and Perseverance β€” the MSL aeroshell is geometrically close to the MEM's
  • NERVA's successor, DRACO (DARPA/NASA, contracted to Lockheed/BWXT in 2023), is targeting a 2027 in-space demonstration of a nuclear-thermal stage with nearly twice the specific impulse of chemical engines β€” exactly the capability that died with NERVA
  • Closed-loop life support has been continuously operated on ISS for 25 years
  • Lifting-body precision landing at Mars density was demonstrated by Perseverance's Sky Crane in 2021

The MEM wasn't science fiction. It had a part number, a contractor, a launch date, and a crew size. NASA didn't fail to design a Mars lander. NASA designed one β€” and then watched the political wind change and put the binders on a shelf at Marshall, where the original Philco-Ford volumes still sit in the archive.

Key Takeaway: The Mars Excursion Module was a fully-engineered crewed Mars lander cancelled in 1968 not because the engineering didn't close, but because nuclear-thermal propulsion was killed for political reasons β€” and now that DRACO is reviving the exact capability NERVA lost, the 1981 mission becomes the 2035 mission with sixty years of detours in between.

ArXiv Paper Digest

Beyond Objects

2026-06-28

Authors: Daniel Jackson

ArXiv: 2606.27258v1

PDF: Download PDF

For over fifty years, object-oriented programming (OOP) has been the dominant way to think about building software. The core idea sounds intuitive: software should mirror reality. If your app deals with users, orders, and products, then you should have User, Order, and Product classes β€” each bundling the data and the behavior that "belongs" to that thing. Daniel Jackson, an MIT professor and longtime software design researcher, argues in this paper that this foundational assumption is actually wrong β€” and that decades of pain in software engineering can be traced back to it.

The problem with objects. Jackson's central complaint is that real-world functionality almost never lives cleanly inside one object. Consider a "checkout" feature in an e-commerce app. Which class owns it? The Cart? The Order? The Payment? The User? In practice, the logic gets smeared across all of them, with each object holding a fragment. This is what he calls fragmentation: a single coherent behavior gets shattered into pieces scattered across the codebase, and you have to mentally reassemble it every time you want to understand or change it.

The decades of patches. Jackson points out that much of software engineering's history since OOP has been an attempt to paper over this exact problem. Design patterns (Visitor, Strategy, Observer), aspect-oriented programming, dependency injection frameworks, domain-driven design's "bounded contexts" β€” all of these, he argues, are workarounds for the fact that objects don't actually carve software at its natural joints.

The alternative: concepts. Jackson proposes organizing software not around things (objects) but around concepts β€” independent units of user-facing functionality. A concept like "reservation," "upvoting," or "trash bin" is self-contained: it has its own state, its own actions, and its own purpose, and you can understand it without knowing about the rest of the system. Concepts are then composed together (he calls this "synchronization") to build full applications. Crucially, the same concept (say, "comments") can be reused across wildly different apps because it isn't tangled with any particular domain object.

The paper is partly a postmortem of OOP's limitations and partly a manifesto for what comes next. Jackson has been developing "concept design" for years; this piece is his clearest argument for why the industry should move on from the object-first mindset entirely.

Why it matters: A leading software design researcher argues that the object-oriented paradigm β€” the default mental model for most working programmers β€” has been quietly causing structural problems for decades, and proposes a concrete alternative.

Daily Automotive Engines

Exhaust Header Primary Tube Length and Scavenging

2026-06-28

Headers don't just route spent gas out β€” they use pressure waves to pull exhaust out of the cylinder during valve overlap. Get the primary tube length right and you'll add 15-25 hp with no other changes. Get it wrong and you'll lose torque exactly where you need it.

Here's the physics: when the exhaust valve opens, a high-pressure pulse rockets down the primary tube at roughly the speed of sound (around 1,700 ft/sec in hot exhaust gas, ~2x ambient sound speed). When that pulse hits the collector β€” where multiple primaries merge β€” it reflects back as a negative pressure wave (rarefaction). If that low-pressure wave arrives back at the exhaust valve during overlap (when intake and exhaust valves are both open), it literally sucks fresh charge through the cylinder. This is scavenging, and it boosts volumetric efficiency above 100%.

The catch: pulse timing depends on RPM. A tube tuned for 7,000 rpm scavenging is too long at 3,000 rpm β€” the wave arrives after the valve has closed and does nothing. Too short, and the positive pulse can reflect back early and actually push exhaust into the next cylinder.

Rule of thumb for primary length (inches, from valve to collector):

  • L β‰ˆ (850 Γ— ED) / RPM_target βˆ’ 3
  • Where ED = exhaust duration in crank degrees from valve opening to BDC (typically ~85-95Β°)

Example: targeting peak torque at 6,500 rpm with 90Β° of effective duration: L = (850 Γ— 90) / 6500 βˆ’ 3 β‰ˆ 11.8 inches. That's why NASCAR Cup headers run roughly 30-34" primaries (tuned for 8,500-9,500 rpm), while a truck header making torque at 3,500 rpm wants 40"+ primaries β€” often impossible to package, which is why truck headers are usually shorty designs that sacrifice scavenging for fitment.

Primary diameter matters too. Bigger isn't better. A 1.75" primary on a 350 hp small-block scavenges beautifully; bump it to 2.0" and gas velocity drops, killing the pressure pulse. Target ~280-320 ft/sec mean gas velocity at peak power. Diameter is sized to total flow, length is sized to RPM.

The collector is equally critical. A 4-into-1 design gives the strongest single rarefaction pulse β€” great for high-RPM peak power. A 4-2-1 (tri-Y) pairs cylinders 540Β° apart in firing order so two smaller pulses combine, broadening the torque curve. Honda's S2000 famously used 4-2-1 to get scavenging from 3,000 rpm all the way to 9,000.

See it in action: Check out EQUAL LENGTH tubular vs. LOG manifolds (headers) - SCAVENGING and EXHAUST BACK PRESSURE EXPLAINED by driving 4 answers to see this theory applied.
Key Takeaway: Header primary length tunes a reflected negative pressure wave to arrive at the exhaust valve during overlap β€” get the length right for your target RPM and the engine scavenges itself, breathing better than atmosphere alone allows.

Daily Debugging Puzzle

Go's bufio.Scanner 64KB Token Trap: The Log Parser That Stops Reading Halfway

2026-06-28

This function reads a log file and counts how many lines contain "ERROR". It looks textbook β€” open, defer close, scan, count. It passes every unit test against the synthetic fixtures. In production it returns plausible numbers. But the on-call engineer swears there were more errors than this.

package main

import (
    "bufio"
    "os"
    "strings"
)

// CountErrors scans a log file and returns the number of lines
// containing the substring "ERROR".
func CountErrors(path string) (int, error) {
    f, err := os.Open(path)
    if err != nil {
        return 0, err
    }
    defer f.Close()

    count := 0
    scanner := bufio.NewScanner(f)
    for scanner.Scan() {
        if strings.Contains(scanner.Text(), "ERROR") {
            count++
        }
    }
    return count, nil
}

The Bug

bufio.NewScanner ships with a default maximum token size of 64 KiB (bufio.MaxScanTokenSize = 64 * 1024). The instant the scanner encounters a line longer than that β€” a fat JSON-encoded log entry, a Java stack trace, a base64-blob attachment β€” Scan() returns false and stashes bufio.ErrTooLong inside scanner.Err().

The for-loop's exit condition can't distinguish "clean EOF" from "I gave up". The code never calls scanner.Err(), so the error is swallowed. Worse, the scanner doesn't just truncate the offending line β€” it abandons it and every line after it. One oversized line halfway through a 10 GB file means you've counted errors from the first 30% of the file and silently dropped the rest. The function returns (count, nil) with a straight face.

This bug is invisible in tests because fixtures are usually small and uniform. It only bites on real-world data β€” exactly when you need the tooling to work.

The Fix

Two changes: enlarge the buffer to accommodate realistic line sizes, and always check scanner.Err() after the loop so a truncation failure is surfaced rather than hidden.

func CountErrors(path string) (int, error) {
    f, err := os.Open(path)
    if err != nil {
        return 0, err
    }
    defer f.Close()

    count := 0
    scanner := bufio.NewScanner(f)
    // Allow lines up to 10 MiB; starting buffer is 64 KiB and grows.
    scanner.Buffer(make([]byte, 64*1024), 10*1024*1024)

    for scanner.Scan() {
        if strings.Contains(scanner.Text(), "ERROR") {
            count++
        }
    }
    if err := scanner.Err(); err != nil {
        return count, err  // surface ErrTooLong, I/O errors, etc.
    }
    return count, nil
}

If your input genuinely has no bound on line length, ditch Scanner entirely and use bufio.Reader.ReadString('\n') or ReadBytes, which grow as needed and report partial reads via io.EOF instead of giving up. The Scanner API is optimized for the common case; it trades correctness on pathological input for a clean iterator interface, and that trade is hidden behind a friendly-looking for scanner.Scan().

The deeper lesson: any iterator whose stop condition is a bare bool is hiding an error channel somewhere. In Go, that channel is almost always a separate Err() method, and "I forgot to check it" is one of the most reliable ways to ship a silent data-loss bug.

Key Takeaway: bufio.Scanner silently abandons the rest of the file when a line exceeds 64 KiB β€” always raise Buffer() for unknown inputs and always check Err() after the loop.

Daily Digital Circuits

Edge-Triggered vs Level-Sensitive Latches: Why Most Storage Elements Snapshot Instead of Stream

2026-06-28

You've seen flip-flops and latches mentioned dozens of times. Now the foundational distinction that determines whether your design is timing-safe or a race-condition factory: level-sensitive latches are transparent, while edge-triggered flip-flops sample at an instant.

A level-sensitive latch (the SR latch, the D latch) has an enable signal. When enable is high, the output follows the input β€” it's a wire. When enable goes low, the output freezes at whatever the input was. The "transparent window" lasts as long as enable is asserted. If the input changes three times while enable is high, the output changes three times.

An edge-triggered flip-flop samples only at the instant of a clock edge (rising or falling). For a vanishingly small moment around that edge β€” the setup/hold window β€” the input must be stable. Everywhere else, the input can wiggle freely and the output doesn't care.

Why this matters in practice: Imagine a 4-stage shift register built from D latches all sharing one enable line. When enable goes high, data races through all four stages in a single transparent window because each latch is just a wire. You get one stage of shifting per enable pulse-pair, not per stage. Build it from edge-triggered flip-flops and each rising clock edge cleanly advances data exactly one stage. This is why SIPO/PISO shift registers always use flip-flops.

So why do latches exist at all? Three reasons:

  • Half the transistors. A D latch is ~6 transistors; a master-slave flip-flop is ~12+. In dense register files (think x86's physical register file with hundreds of entries), latches save enormous area.
  • Time borrowing. A transparent latch lets a slow combinational path "borrow" time from the next stage β€” the data arrives late, but as long as it's stable before the latch closes, it propagates immediately. Flip-flops can't do this; data missing the edge is data missed.
  • Lower clock-to-Q delay. Latches add only one gate delay when transparent; flip-flops add two (master + slave).

Rule of thumb: If a master-slave flip-flop has total setup+hold+clk-to-Q of ~150ps at 7nm, two back-to-back pulse latches with a 100ps pulse width can implement the same storage with ~80ps overhead β€” but only if your CAD tool can verify the pulse never gets wider than the shortest combinational path between latches (or data races through two stages).

Real-world example: Intel's Pentium 4 famously used pulse-latch-based design throughout its critical paths to hit 3+ GHz at 130nm; AMD's contemporary Athlon used flip-flops and ran ~25% slower per clock-period budget but was vastly easier to verify.

See it in action: Check out He Was Only a Fruit Vendor, Why Were the FBI and Star Destroyers Escorting Him? by COMICS STORM to see this theory applied.
Key Takeaway: Latches are transparent and cheap but dangerous; flip-flops snapshot at an edge and are safe but expensive β€” high-performance designs mix both, verification tools earn their licensing fees holding it all together.

Daily Electrical Circuits

Maximum Power Point Tracking (MPPT) Circuits: Squeezing Every Watt from a Solar Panel

2026-06-28

A solar panel is a nonlinear current source. Its I-V curve has a distinctive knee, and somewhere on that knee sits a single operating point where P = V Γ— I is maximized β€” the Maximum Power Point (MPP). Connect the panel directly to a battery and you'll clamp it to the battery voltage, which is almost never at the MPP. A 100W panel might deliver only 60W. MPPT circuits dynamically adjust the load impedance the panel sees, keeping it parked at the MPP as sunlight, temperature, and shading change.

Architecturally, an MPPT controller is a DC-DC converter (usually buck, sometimes boost or buck-boost) with a smart control loop. Instead of regulating output voltage, the loop regulates the input voltage to whatever value extracts maximum power. The converter's duty cycle becomes the knob that transforms the panel's V_MPP into whatever the battery needs.

The most common tracking algorithm is Perturb and Observe (P&O):

  • Measure V_panel and I_panel, compute P = V Γ— I
  • Perturb the duty cycle by a small step Ξ”D
  • If P increased, keep stepping the same direction; if P decreased, reverse
  • Repeat every few milliseconds

P&O oscillates around the MPP by Β±Ξ”D β€” a fundamental tradeoff between tracking speed and steady-state efficiency. Incremental Conductance is smarter: it uses dI/dV = -I/V at the MPP, so it knows when to stop perturbing. Better for fast-changing irradiance (passing clouds).

Concrete example: A 36-cell panel rated 100W, V_MPP β‰ˆ 18V, I_MPP β‰ˆ 5.5A, charging a 12V lead-acid battery (float ~13.8V). Direct connection: panel pulled to 13.8V, output β‰ˆ 13.8V Γ— 5.7A β‰ˆ 79W (and you've shifted off the knee β€” likely much worse). With a buck MPPT: panel stays at 18V Γ— 5.5A = 99W input, converter at 96% efficiency delivers ~95W to the battery at 13.8V (β‰ˆ6.9A charging current). You gained 20% β€” pure software cleverness on top of a switching converter you'd build anyway.

Rule of thumb for step size: Ξ”D β‰ˆ 0.5–1% of full duty cycle per iteration, with a 1–10 ms update rate. Too small and you can't keep up with clouds; too large and steady-state ripple eats your efficiency gain. A panel's MPP voltage drifts about -0.4%/Β°C with cell temperature, so cold mornings shift V_MPP up noticeably β€” your tracker handles this automatically.

Watch for: local maxima under partial shading (bypass diodes create multiple peaks β€” P&O can get stuck on the wrong one), and input capacitor sizing (must hold V_panel stable between perturbations, typically 470Β΅F–2200Β΅F).

See it in action: Check out Fundamental Guide on Solar Panels and Their Application - MPPT PWM Buck Battery Charger by Flyandance to see this theory applied.
Key Takeaway: An MPPT is just a DC-DC converter whose control loop regulates input voltage to maximize input power, typically gaining 15–30% over direct battery connection.

Daily Engineering Lesson

Vortex Shedding Flow Meters: Measuring Flow by Counting the Wake of a Bluff Body

2026-06-28

Drop a cylinder into a flowing stream and the fluid can't stay attached to its back side. Instead, alternating vortices peel off one side, then the other, forming a KΓ‘rmΓ‘n vortex street. The shedding frequency is almost perfectly proportional to flow velocity over a wide range β€” which is the entire basis of the vortex flow meter.

The governing relationship is the Strouhal number:

  • St = f Β· d / v
  • f = shedding frequency (Hz), d = bluff body width (m), v = fluid velocity (m/s)
  • For a properly shaped bluff body (typically trapezoidal or T-shaped), St β‰ˆ 0.27 and stays nearly constant from Reynolds number ~10,000 up to ~7,000,000

That constancy is the magic trick. Frequency depends only on velocity and a fixed geometric dimension β€” not on fluid density, viscosity, temperature, or pressure. The meter becomes a digital pulse generator: count pulses, get volumetric flow.

How the pulses get detected: the vortices create alternating pressure differentials across the bluff body. A piezoelectric crystal, capacitive sensor, or thermistor mounted in or just downstream of the shedder picks up the oscillation. No moving parts in the flow path β€” just a stationary obstruction and a sensor.

Real-world example: a 4-inch (102 mm) vortex meter measuring steam in a process plant has a shedder bar ~25 mm wide. At 15 m/s steam velocity, f = 0.27 Γ— 15 / 0.025 β‰ˆ 162 Hz. Counting pulses for one second gives you the average velocity directly. Multiply by cross-sectional area (0.0081 mΒ²) and you have 0.122 mΒ³/s of volumetric flow β€” and since steam density is known from pressure/temperature, you also get mass flow.

Where vortex meters dominate:

  • Steam metering (their killer app β€” they tolerate high temperature, no moving parts to seize)
  • Compressed air and industrial gases
  • Clean liquids like water, solvents, and process chemicals
  • Cryogenic services

Where they fail:

  • Low flow β€” below ~Re 10,000, vortex shedding becomes erratic; meters have a hard low-end cutoff (turndown typically 20:1 to 30:1)
  • Pulsating flow β€” reciprocating compressors upstream wreck the signal
  • Dirty or slurried fluids β€” particulates erode the shedder edge, drifting the K-factor
  • Two-phase flow β€” bubbles or droplets disrupt clean shedding

Installation rule of thumb: 15–20 pipe diameters of straight run upstream, 5 downstream. Vortex meters are exceptionally sensitive to swirl from elbows and valves β€” worse than orifice plates. Flow conditioners can shorten the upstream requirement but add pressure drop.

See it in action: Check out My Chat Group Connects Different Worlds, and I Became a Millionaire Just by Selling Bread! by COMICS STORM to see this theory applied.
Key Takeaway: Vortex meters convert flow velocity into a pure frequency signal by exploiting the constant Strouhal number of a bluff body's wake β€” giving you a digital, moving-part-free measurement that's ideal for steam but useless on dirty, pulsating, or low-flow service.

Forgotten Books

The 1919 Forge Master Who Warned That Better Instruments Wouldn't Replace the Craftsman

2026-06-28

Book: Forge-practice and heat treatment of steel by Bacon, John Lord, Markham, Edward Russell, 1860- (1919)

Read it: Internet Archive

In 1919, as American industry was being transformed by precision instruments β€” pyrometers that could read steel temperatures to the degree, Brinell and Rockwell testers that could quantify hardness, and a whole new vocabulary of "scientific management" β€” a construction engineer named John Lord Bacon and his collaborator Edward R. Markham slipped a quiet warning into the preface of the third edition of a small technical manual.

The introduction of heat measuring and hardness testing instruments, together with various other modern appliances, and up to date systems of doing work have made necessary a broader knowledge of heat-treating methods than was formerly the case: for after all the most important factor is the man doing the work.

Read that last clause again. In a book celebrating the arrival of measurement, the authors insist β€” almost defensively β€” that the instruments don't displace the craftsman. They make him more necessary, not less.

Bacon was an instructor in Forge Practice and Machine Design at Lewis Institute in Chicago (later absorbed into the Illinois Institute of Technology), and Markham described himself as a "Consulting Engineer Specializing in Heat Treatment of Steel." These were not romantic anti-modernists. They were engineers who wrote a textbook published by John Wiley & Sons, the same press that helped lay the foundation of American industrial education. They wanted their book on the desks of factories that were buying pyrometers.

And yet they understood something that the next century of industry would repeatedly forget and rediscover: a tool that returns a number does not return a decision. A pyrometer can tell you the steel is at 1450Β°F. It cannot tell you whether this particular billet, hammered this way, for this part, is ready to quench. That judgment lives in a person who has burned, cracked, and over-tempered enough pieces to feel the difference.

The earlier preface, written by Bacon alone, made the same argument about pedagogy:

The author believes that the text book should be used to explain principles and give examples, not to give minute explicit directions for making a set of exercises.

In other words: don't teach the recipe. Teach the principle, and let the student earn the recipe by ruining a few pieces of steel.

What's striking is how directly this maps onto modern debates about automation and AI. Every generation hears the same promise β€” that the new instrument will deskill the work, that judgment will become an interface, that the craftsman is obsolete. And every generation discovers, around the time the instruments are fully deployed, that someone still has to interpret the readout, recognize the edge case, and decide when the standard procedure doesn't apply.

Bacon and Markham wrote that line in 1919, watching forge shops fill up with thermocouples. The diagnosis travels remarkably well to a 2026 reader watching codebases fill up with copilots.

The forgotten claim: Precision instruments don't replace the craftsman β€” they raise the bar on the judgment he still has to supply.

Forgotten Patent

Edouard Belin's "Belinograph": The 1913 Patent That Sent Photos Over Phone Lines β€” and Invented the Wirephoto, the Fax, and the Modern Image Scanner

2026-06-28

On a Paris afternoon in 1907, a French engineer named Γ‰douard Belin placed a photograph of a man's face on a rotating drum, shone a light on it, and watched a selenium photocell translate the image's light and dark patches into electrical pulses. Those pulses traveled down an ordinary telephone wire to a receiver across the room, where a synchronized stylus etched the same face onto carbon paper. The Belinograph was born.

Belin patented refined versions of the device in French Patent 440,597 (1912) and US Patent 1,074,098 (filed 1912, granted September 30, 1913). The mechanism was elegant: the sending drum and receiving drum spun in lockstep using tuning-fork synchronization. A photocell scanned the original line-by-line in a tight helix, converting brightness to current. At the far end, the current modulated either ink intensity or a chemical reaction on coated paper. A full photograph transmitted in roughly 12 minutes over standard phone lines.

The first transatlantic Belinograph transmission happened in 1921 β€” a photograph sent from Annapolis to Belin's lab outside Paris. By 1925, AT&T's commercial "Wirephoto" service (licensed from Belin's principles) let the New York Times publish overseas photographs in next-day editions. The 1937 Hindenburg disaster reached American newspapers as Belinograph images within hours.

What's astonishing is what Belin actually invented:

  • The flatbed scanner β€” every modern scanner is a Belinograph drum unrolled flat, with a CCD sensor in place of the selenium cell.
  • The fax machine β€” Group 3 fax (the standard from 1980 to today) uses the exact line-by-line raster scan Belin patented in 1912, just digitally encoded.
  • Progressive image transmission β€” the idea that an image arrives as a sequence of scan lines, not all at once, is foundational to JPEG progressive rendering and to how every web browser streams an image as it downloads.
  • Wirephoto journalism β€” the entire visual culture of 20th-century newspapers, magazines, and eventually internet news depends on the assumption that an image taken in one place can appear in another within hours. Belin made that assumption real.

The mechanism is also a perfect early example of analog-to-digital-to-analog signal conversion: a continuous image becomes a serial electrical waveform, travels through a narrow-bandwidth channel, and reconstitutes as a continuous image. Replace the selenium cell with a CMOS sensor, the telephone line with TCP/IP, and the carbon stylus with a laser printer β€” you have a 2026 multifunction office device. The architecture didn't change; only the components got smaller and faster.

Belin kept inventing. His 1922 "Belino" portable let war correspondents send field photographs from any hotel with a phone jack β€” the spiritual ancestor of every photojournalist uploading from a war zone via satellite phone today. He also built early television scanners in the 1920s that influenced both John Logie Baird's mechanical TV and later electronic systems.

Could the Belinograph be rebuilt better today? It already has been β€” roughly 400 million times. Every smartphone with a "scan document" feature is running Belin's 1912 algorithm in software, sampling the image as a raster of brightness values and transmitting them serially over a wireless link. The selenium photocell became a silicon photodiode; the tuning fork became a quartz crystal; the phone line became Wi-Fi. The idea β€” an image is just a sequence of light measurements β€” is unchanged after 114 years.

Key Takeaway: Γ‰douard Belin's 1913 Belinograph established that any image can be decomposed into a serial stream of brightness samples and reconstructed elsewhere β€” the foundational architecture behind every fax machine, flatbed scanner, wirephoto service, and progressive JPEG since.

Daily GitHub Zero Stars

Chijioke12/3dcargame

2026-06-28

Language: Unknown

Link: https://github.com/Chijioke12/3dcargame

This is a delightfully unusual project: a 3D racing game built for KaiOS, the lightweight operating system that powers feature phones like the Nokia 8110 4G, JioPhone, and various low-cost devices popular across Africa, India, and emerging markets. While the rest of the gaming world chases photoreal 4K experiences on RTX hardware, this developer is squeezing 3D rendering out of a platform that typically tops out at a 240Γ—320 screen, a numeric keypad, and a few hundred megabytes of RAM.

What makes this interesting:

  • Constrained-platform engineering. KaiOS apps are essentially HTML/CSS/JavaScript bundles running on a Gecko fork. Implementing anything resembling 3D β€” even pseudo-3D scanline tricks Γ  la OutRun, or a minimal software rasterizer β€” is a genuine technical challenge on this hardware.
  • Audience that's usually invisible. Feature-phone users in the Global South are a massive, often-ignored market. Building games for them is meaningful work, not just a curiosity.
  • D-pad and numeric-keypad input design. No touchscreen, no gamepad β€” just T9-style keys. Designing a racing game around that input scheme forces thoughtful UX decisions.

Who might find it useful:

  • KaiOS / feature-phone developers looking for an example codebase of something more ambitious than a to-do app.
  • Web devs curious about low-end JavaScript performance β€” the same tricks (manual canvas pixel manipulation, avoiding GC, lean asset loading) apply to old Android Go devices and smart TVs.
  • Hobbyists drawn to retro-style pseudo-3D racers in the lineage of Pole Position or Lotus Turbo Challenge.

The repo has zero stars and no documentation yet, but the niche alone makes it worth a peek. If the author adds a README and a short demo video, it could easily attract the KaiOS dev community on GitHub.

Why check it out: A 3D racing game for KaiOS feature phones is exactly the kind of constrained, against-the-grain hardware project that produces the most creative engineering.

Daily Hardware Architecture

The Memory Controller's Write Drain Policy: Why DRAM Writes Get Batched and Delayed

2026-06-28

DRAM has a dirty secret: writes are slower than reads, not because the cells take longer, but because switching the bus from read mode to write mode (and back) costs cycles you'll never get back. A read-to-write turnaround on DDR5 burns roughly 7-15 ns of dead bus time. Do that on every write and you waste 30%+ of your memory bandwidth on direction-change overhead.

The memory controller's solution: don't drain writes when they arrive β€” hoard them in a write queue, then flush them in a burst. This is the write drain policy.

Two thresholds control it:

  • High watermark β€” when the write queue fills past, say, 32 of 64 entries, the controller stops accepting new reads and aggressively drains writes until the queue empties.
  • Low watermark β€” when the queue empties to, say, 8 entries, the controller flips back to read mode and resumes serving loads.

Between watermarks, reads have priority. The controller only pays the read→write→read turnaround penalty twice per drain cycle, instead of once per write. If you drain 24 writes in a burst, you've amortized the ~15 ns turnaround across all 24 — about 0.6 ns of overhead per write instead of 15.

Real-world example: a database doing a checkpoint flushes thousands of dirty pages. Without write batching, every flushed cache line would force a bus turnaround, and the checkpoint would crawl. With drain policy, the controller pools the writes and rips through them in a burst β€” checkpoint throughput can be 3-5Γ— higher.

But there's a cost: reads issued during a drain burst sit and wait. If your latency-sensitive request lands right when the controller starts a write drain, you eat tens to hundreds of nanoseconds of unexpected stall. This is one reason why "tail latency" on memory-bound workloads gets ugly under write pressure β€” your p99 reads are the ones that arrived during a drain.

Rule of thumb: if your workload is read-dominated (>80% reads), drain policy is invisible. If it's write-heavy or mixed, every read has a probability roughly equal to (write queue occupancy / queue depth) of getting stuck behind a drain. A 50%-full write queue means roughly half your reads may hit drain stalls.

Some controllers expose tuning knobs (Intel's WrPreEmpt, AMD's write drain thresholds in BIOS) to bias the policy toward latency or bandwidth depending on workload.

See it in action: Check out He begins with the weakest goblin, obtains a unique-tier talent, and becomes the ruler of all realms by Blue Whale Comics Review to see this theory applied.
Key Takeaway: Memory controllers batch writes into bursts to amortize the bus-turnaround penalty, trading write latency for bandwidth β€” and quietly creating read-latency spikes whenever a drain kicks in.

Hacker News Deep Cuts

Pyrite64: N64 game-engine and editor using Libdragon and tiny3d

2026-06-28

Homebrew development for the Nintendo 64 has long been one of the most punishing corners of the retro scene. The console's bizarre architecture β€” the Reality Coprocessor with its programmable RSP microcode, the cache-hostile RDRAM, the legendarily painful texture cache β€” has historically meant that anyone wanting to ship an N64 game needed to write half a graphics pipeline from scratch. Pyrite64 is part of a quiet revolution that's finally making this hardware approachable.

The project layers a complete game engine and editor on top of two important pieces of modern N64 infrastructure:

  • Libdragon β€” the open-source N64 SDK that replaced Nintendo's proprietary, NDA-encumbered libultra. It's GCC-based, MIT-licensed, and means you no longer need a leaked devkit to build for the platform.
  • tiny3d β€” a newer custom RSP microcode that delivers dramatically better triangle throughput than libultra's stock microcodes, with proper perspective-correct texturing and a friendlier API.

What makes Pyrite64 noteworthy isn't just that it runs on real hardware β€” it's that the author (HailToDodongo, who also maintains tiny3d) is packaging an actual editor workflow on top of this stack. Historically the N64 homebrew flow has been: write C, cross-compile, copy to flashcart, pray. Adding an editor with scene composition, asset import, and iteration loops is the kind of tooling jump that 8- and 16-bit homebrew scenes went through years ago but which the N64 has stubbornly resisted.

For a technical audience this is interesting on several fronts:

  • Microcode engineering β€” tiny3d is one of the few non-Nintendo RSP microcodes that actually ships in real projects, and Pyrite64 is a window into what you can build on top of custom microcode.
  • Constrained-system design β€” 4MB of RAM, a 4KB texture cache, no shaders. Every decision in the engine is a study in deliberate tradeoffs.
  • Editor architecture for embedded targets β€” round-tripping assets and scene data into a system this small is non-trivial.

The N64 homebrew renaissance β€” see also the recent flood of new commercial N64 releases on cartridge β€” is being quietly enabled by exactly these kinds of projects. Pyrite64 deserves more eyes simply because it's the kind of foundational tooling that determines whether a homebrew scene stays a hobbyist curiosity or grows into something that ships polished games.

Why it deserves more upvotes: A working game engine plus editor for the notoriously hostile N64 hardware, built on modern open microcode β€” exactly the kind of foundational tooling the retro homebrew scene has been waiting decades for.

HN Jobs Teardown

Nova Credit: What Their Hiring Reveals

2026-06-28

Source: HN Who is Hiring

Posted by: hairysmelly

Of the ten postings in this thread, Nova Credit's is the most strategically revealing β€” not because of what it explicitly lists, but because of the structural problem the company is quietly solving and what it implies about the future of identity infrastructure.

The business model is the tell. Nova Credit is building cross-border credit bureau interoperability β€” convincing foreign credit bureaus (Experian UK, CIBIL India, Circulo de Credito Mexico, etc.) to share data with US lenders in a way that complies with the FCRA. That is fundamentally a data integration and regulatory arbitrage business dressed up as a fintech consumer product. The fact that they're onsite-only in SF or NYC, even in a thread where Red Hat is going fully remote and Code for America embraces REMOTE, signals heavy reliance on in-person work with regulated partners (banks, lenders, compliance officers).

Stage signals:

  • ~50 people + $50M Series B (Kleiner, Index, Canapi, General Catalyst) = post-product-market-fit, scaling distribution. Canapi specifically is the banking consortium fund β€” that's a strategic, not financial, lead. They have customer pipeline locked in.
  • The pitch leads with TAM ("millions of immigrants") and lender ROI ("new consumers for lenders") β€” they're selling to enterprises now, not chasing growth metrics.
  • The truncated posting cuts off the actual roles, which is itself a tell: the founder is pitching the mission, not the engineering puzzle. They're hiring for belief, not stack-curiosity.

What the posting doesn't say is loud. No mention of Python, Go, ML, or a specific stack. Compare to Proton (explicit Android/iOS/Go/SRE) or TestDome (Vue.js + ASP.NET Core). Nova Credit is hiring people who can navigate FCRA compliance, ECOA, GDPR cross-border data transfer, and bank procurement cycles β€” the engineering is table stakes; the moat is legal and partnership work.

Green flags: Concrete mission with a real underserved market (immigrant credit access is genuinely broken), tier-1 investors with strategic value, sane headcount-to-funding ratio (~$1M raised per employee β€” not bloated).

Red flags: Onsite-only in March 2020 when the thread is full of "currently remote during quarantine" notes (Clyde) suggests cultural inflexibility β€” or, more charitably, regulated workflows they can't move home. Either way, candidates should ask. Also: cross-border credit data is a wedge product. The question is whether they become the rails for global identity verification (huge) or get acquired by Experian (fine, but capped).

The signal: The most valuable fintech infrastructure plays in 2020 aren't building new financial products β€” they're arbitraging the seams between regulatory regimes that legacy bureaus never bothered to bridge.

Daily Low-Level Programming

The Tickless Kernel and NO_HZ_FULL: Why Stopping the Timer Interrupt Made Servers Faster

2026-06-28

For decades, Linux ran a periodic timer interrupt β€” the "tick" β€” at 100, 250, or 1000 Hz on every CPU. Each tick the kernel updated jiffies, charged CPU time to the running task, checked for scheduling decisions, expired timers, and ran RCU callbacks. On an idle core, this meant waking up 1000 times a second to do almost nothing. On a busy core running one pinned thread, it meant 1000 unwanted context switches per second into kernel mode.

The tickless kernel (NO_HZ) fixed this in stages:

  • CONFIG_NO_HZ_IDLE (2007): when a core goes idle, cancel the next tick. Reprogram the hrtimer to fire only when the next real timer is due. Idle cores stop waking up, saving power on laptops and reducing wakeups on packed servers.
  • CONFIG_NO_HZ_FULL (2013): even when a core is running a task, skip the tick β€” provided exactly one runnable task is on that CPU. The scheduler has nothing to decide. The accounting can be deferred. RCU callbacks get offloaded to housekeeping CPUs.

The catch with NO_HZ_FULL: it isn't free, and it isn't automatic. You boot with nohz_full=2-15 isolcpus=2-15 rcu_nocbs=2-15, dedicate CPU 0–1 as housekeeping cores, pin one userspace thread per isolated CPU, and ensure nothing else schedules there. Add a second runnable task and the tick comes right back.

Real-world example: high-frequency trading and DPDK packet-processing rigs. A market-data handler pinned to an isolated NO_HZ_FULL core can run a tight poll loop on a NIC ring buffer for seconds without a single kernel entry. Without it, every millisecond the timer interrupt would evict ~32 KB of L1-D, blow away branch predictor state, and add 3–8 Β΅s of jitter β€” catastrophic when your tail-latency SLO is 10 Β΅s. Cloudflare's published packet-processing measurements showed p99.99 latency dropping from ~80 Β΅s to ~12 Β΅s after enabling NO_HZ_FULL with proper isolation.

Rule of thumb: at HZ=1000, a tick costs roughly 1–3 Β΅s of direct work plus another 2–5 Β΅s of cache pollution. That's ~0.5% CPU overhead you can't see in top β€” and 100% of your jitter budget if you care about microsecond tails.

Check whether a core is actually tickless: cat /proc/interrupts | grep LOC and watch the per-CPU local timer interrupt count. On an isolated NO_HZ_FULL core running one busy thread, that counter should increment maybe once per second (for vmstat updates), not 1000 times.

Key Takeaway: NO_HZ_FULL eliminates the periodic timer interrupt on cores running exactly one task, trading configuration complexity for the microsecond-scale jitter elimination that latency-critical workloads require.

RFC Deep Dive

RFC 4643: Network News Transfer Protocol (NNTP) Extension for Authentication

2026-06-28

RFC: RFC 4643

Published: 2006

Authors: J. Vinocur, K. Murchison

Usenet predates the World Wide Web by more than a decade, and its transport protocol β€” NNTP, defined in 1986's RFC 977 β€” was designed in an era when "authentication" meant "you're on a trusted host that peers with my trusted host." Servers exchanged news articles freely. There were no passwords, no accounts, no rate limits. By the late 1990s, that model was collapsing. Commercial ISPs were selling Usenet access to millions of subscribers, spammers had discovered the network's open relay-like properties, and operators desperately needed a way to say "prove who you are before I let you post." RFC 4643 is the formal, standards-track answer to that need.

The problem it solves. Before 4643, NNTP authentication existed only as an informational hack β€” RFC 2980's AUTHINFO USER / AUTHINFO PASS commands, lifted almost verbatim from FTP. Every implementation interpreted it slightly differently. There was no negotiation, no advertisement of mechanisms, no way to plug in modern auth like Kerberos or one-time passwords, and no clear interaction with TLS. RFC 4643 cleans all of this up and binds it properly to RFC 3977 (the modern NNTP rewrite from the same year).

Key design decisions.

  • Two mechanisms, one framework. The RFC defines AUTHINFO USER/PASS (the legacy username/password flow, retained for compatibility) and AUTHINFO SASL, which delegates to the Simple Authentication and Security Layer (RFC 4422). SASL is the same plumbing used by IMAP, SMTP submission, XMPP, and LDAP β€” so NNTP suddenly inherited PLAIN, CRAM-MD5, DIGEST-MD5, GSSAPI, EXTERNAL, and anything else SASL gained later.
  • Capability advertisement. The server lists supported mechanisms in its CAPABILITIES response under an AUTHINFO line. Clients no longer have to guess or probe.
  • TLS-aware. Plaintext mechanisms must be refused unless the connection is encrypted (or the server is explicitly configured to permit them). This was a notable hardening β€” RFC 2980 had no such requirement, and many Usenet passwords had been crossing the wire in the clear for years.
  • State reset on success. After successful authentication, the server resets to an "initial" state β€” any selected newsgroup is forgotten β€” so authorization decisions apply uniformly. A small detail, but it prevents whole classes of "I authenticated after selecting a restricted group" bugs.
  • Reject-on-fail, retry permitted. Failed AUTHINFO doesn't drop the connection; the client may try again with a different mechanism. This matters for clients walking a capability list from strongest to weakest.

Why it still matters. Usenet didn't die β€” it shrank into a quieter, paid corner of the internet dominated by binary groups and a handful of text-discussion holdouts. Every major commercial provider (Giganews, Eweka, Newshosting) authenticates with AUTHINFO as defined by 4643, almost universally over TLS on port 563 (NNTPS). If you've ever configured a newsreader in the last fifteen years, you've used this RFC. More broadly, 4643 is a clean case study in retrofitting authentication onto a protocol designed without it β€” a pattern that recurred for SMTP (RFC 4954), IMAP (RFC 3501), and others, all leaning on SASL to avoid reinventing the wheel. The lesson is consistent: when you bolt auth onto a legacy protocol, advertise capabilities, defer to SASL, and require TLS for anything that sends a password in cleartext.

Quirky history. The authors, Jeffrey Vinocur and Ken Murchison, were also instrumental in the broader NNTP modernization effort β€” RFCs 3977, 4642 (TLS for NNTP), 4643 (this one), and 4644 (streaming feeds) all shipped together in October 2006, a coordinated cleanup of a protocol that had been frozen for two decades. It's one of the more thorough "let's bring this old workhorse into the modern era" efforts the IETF has ever produced.

Why it matters: RFC 4643 is the template for retrofitting modern, SASL-based, TLS-aware authentication onto a legacy plaintext protocol β€” and it's why your newsreader can still log in safely twenty years later.

Stack Overflow Unanswered

External-memory approach for BPE training where merges depend on text adjacency (160 GB corpus)

2026-06-28

Stack Overflow: View Question

Tags: rust, data-structures, nlp, stringtokenizer, memory-access

Score: 0 | Views: 58

The asker is training a BPE tokenizer with "supermerges" (arXiv 2504.00178) on a 160 GB corpus. Standard BPE only needs a word-frequency dictionary because merges happen within tokens β€” order between words is irrelevant. Supermerges break that assumption: they merge adjacent words in the running text, so training must see the corpus as a sequence, not a multiset. That defeats every shortcut that makes classical BPE training tractable.

Why it's hard: Each merge iteration rewrites the sequence (every chosen pair collapses to a new symbol), shifts adjacency boundaries, and changes the counts of neighboring pairs. With 160 GB of tokens you cannot keep the sequence in RAM, and you cannot reduce it to a frequency table because the adjacency graph itself is the input. Naively re-scanning the whole corpus per merge means thousands of full passes over disk β€” the linear regression the asker fit almost certainly extrapolates to weeks or months.

A workable direction β€” incremental external-memory BPE:

  • Encode the corpus once as a packed u32/u64 stream on disk (memory-mapped). Treat it as an array of symbol IDs, not text.
  • Build a global pair-count table in a single streaming pass: a HashMap<(u32,u32), u64>, or better, a count-min sketch followed by an exact recount for the top-K candidates. This fits in RAM even when the corpus doesn't.
  • Maintain an inverted index from pair β†’ file offsets where that pair occurs, written to disk as sorted runs (one append-only file per pair, or a single sorted-by-pair file built with external mergesort). This is the key data structure: it turns "find every occurrence of the winning pair" from a 160 GB scan into a localized read.
  • Per merge iteration: pick the top pair, stream its occurrence list, rewrite those positions in the mmap'd corpus (collapsing two symbols into one, marking the freed slot with a tombstone or using a gap-buffer/rope-of-chunks layout), and emit delta updates to the pair-count table: βˆ’1 for the four neighbor pairs that disappeared, +1 for the two new neighbor pairs that appeared. Append the new pair's positions to its inverted-index file.
  • Chunk the corpus by document boundaries so writes stay sequential within a chunk and you can parallelize across chunks with Rayon β€” supermerges presumably don't cross document boundaries anyway.

Gotchas: tombstones balloon over many iterations β€” periodically compact each chunk. The inverted-index files for very common pairs (early iterations) will be enormous; a hybrid of "scan if pair frequency > threshold, index otherwise" avoids paying index-maintenance cost for pairs you'd read sequentially anyway. Watch for the classic BPE bug where overlapping occurrences of the same pair (e.g. AAA with pair (A,A)) get double-merged β€” use a left-to-right greedy sweep within each occurrence list. Finally, the delta updates must be applied atomically per position, since a single merge changes counts for both neighbors; doing them out of order corrupts the table.

The challenge: Supermerges turn BPE from a frequency-counting problem into a sequence-rewriting problem, forcing you to invent an external-memory data structure that supports both random localized updates and global top-pair queries over 160 GB.

Daily Software Engineering

The Pessimistic Concurrency Control Pattern: When Conflicts Are Too Expensive to Retry

2026-06-28

Optimistic concurrency control bets that conflicts are rare and retries are cheap. Pessimistic concurrency control makes the opposite bet: it assumes conflicts are likely or that retrying is catastrophically expensive, so it acquires a lock before touching the data and holds it until the transaction commits. Other transactions wait. No CAS gymnastics, no retry storms β€” just an old-fashioned queue.

The trade-off is brutal but honest. You give up throughput and concurrency in exchange for predictability. A transaction that grabs the lock will either succeed or deadlock β€” it will never do five seconds of work only to be told "someone else got there first, start over."

When pessimistic wins:

  • High contention. If 80% of transactions touch the same row, optimistic retries will thrash. Locking serializes them cleanly.
  • Long or expensive transactions. Recomputing a 10-second report after a conflict is worse than waiting 10 seconds for a lock.
  • Side effects mid-transaction. If your transaction sends an email or charges a card before commit, you cannot safely retry.
  • Hard external invariants. Seat booking, inventory decrement, financial ledger entries β€” anywhere "looked fine when I checked" isn't good enough.

Real-world example: An airline seat-booking service. Two agents try to sell seat 14C at the same time. With optimistic control, both read "available," both write "sold," and the version check rejects one β€” but only after the customer's card was authorized. With SELECT ... FOR UPDATE, the first agent's transaction locks row 14C; the second blocks until the first commits, then re-reads and sees "sold." No double-booking, no refund flow, no apology email.

Rule of thumb: If your retry rate under optimistic control exceeds ~10–15%, switch to pessimistic. Below that, the lock overhead and reduced concurrency cost more than the occasional retry. Measure conflict rate in production before choosing β€” most teams pick a strategy by reflex and pay for it later.

The pitfalls are real:

  • Deadlocks. Always acquire locks in a consistent order (e.g., by primary key ascending). Set a lock timeout β€” never wait forever.
  • Lock duration. Hold locks for the shortest possible window. Do all reads and computation before the locked section if you can.
  • No long-running user think time inside the lock. Locking a row while a user fills out a form is how you destroy throughput. Use a soft application-level reservation with a TTL instead.
  • Lock escalation. Some databases promote row locks to table locks under pressure. Know your engine's behavior.
See it in action: Check out They Abandoned Me For A Fake Heirβ€”Now I
#39;M A Billionaire CEO
amp; They Beg Me To Help Them by King's Manhwa Recap2 to see this theory applied.
Key Takeaway: Pessimistic locking trades concurrency for certainty β€” use it when conflict rates are high or retries have real-world side effects you can't undo.

Tool Nobody Knows

prlimit: Change a Running Process's ulimit Without a Restart

2026-06-28

The scenario: a long-running daemon starts spitting too many open files. You can't restart it β€” it has state, sessions, in-flight requests. ulimit only affects the current shell. Editing the systemd unit requires a restart. /proc/<pid>/limits is read-only. Stuck?

Not if you know about prlimit, which hides in the util-linux package on every modern Linux box. It wraps the prlimit(2) syscall added in 2.6.36 β€” the one that finally let you read and modify the rlimits of an arbitrary PID.

Inspect a running process:

$ prlimit --pid 12345
RESOURCE   DESCRIPTION                       SOFT      HARD UNITS
AS         address space limit          unlimited unlimited bytes
CORE       max core file size                   0 unlimited bytes
CPU        CPU time                     unlimited unlimited seconds
DATA       max data size                unlimited unlimited bytes
NOFILE     max number of open files          1024      4096
NPROC      max number of processes           7831      7831
STACK      max stack size                 8388608 unlimited bytes
...

Already nicer than grepping through /proc/<pid>/limits. But the real trick β€” change them live, no restart, no LD_PRELOAD, no gdb attach:

$ sudo prlimit --pid 12345 --nofile=65536:65536

The next open() call in that process just works. The daemon doesn't know anything happened.

It also doubles as an inline ulimit for new commands β€” useful for ad-hoc sandboxing without writing a systemd unit:

$ prlimit --as=1G --core=0 --nofile=4096 ./build.sh

Caps address space to 1 GB, disables core dumps, sets the open-file limit, then exec's the script.

Why this beats the alternatives:

  • vs ulimit β€” ulimit affects the current shell and its descendants. It cannot touch an already-running process. Period.
  • vs editing the systemd unit and restarting β€” needs a restart. Stateful daemons hate that. prlimit is hot-patching.
  • vs echo > /proc/<pid>/limits β€” that file is read-only. The kernel only exposes a setter through the prlimit syscall, which is exactly what this binary calls.
  • vs writing C with setrlimit() β€” that only changes your own limits. You'd need prlimit() anyway, and at that point just shell out to the tool.

A real production scenario: SSH onto a box where Postgres is logging "too many open files". cat /proc/$(pidof postgres)/limits shows NOFILE=1024. A restart drops every connection. Instead:

$ sudo prlimit --pid $(pidof -s postgres) --nofile=65536:65536

Bleeding stopped. Then go fix the unit file so it survives the next reboot.

The full list of limits it speaks: CPU time, file size, data, stack, core size, RSS, NPROC, NOFILE, locked memory, address space (AS), file locks, pending signals, msgqueue size, nice ceiling, RT priority, RT runtime. Almost all of those are essentially unreachable from userland unless you know prlimit exists.

Caveats worth knowing:

  • A process can raise its own soft limit up to the hard limit, but raising the hard limit needs CAP_SYS_RESOURCE (usually root).
  • Limit changes apply to subsequent syscalls only. Bumping NOFILE does not retroactively forgive an already-failed open(); the process needs to retry.
  • NOFILE is also bounded by /proc/sys/fs/nr_open β€” check that ceiling if your new value gets clipped.
  • POSIX rlimits are per-process, not per-thread. All threads in the process see the new limit.
  • Linux-only. macOS has no equivalent syscall; launchctl limit gets you partway there for launchd-managed daemons.
Key Takeaway: ulimit manages your shell's children; prlimit manages any PID on the box β€” including the one you cannot afford to restart.

What If Engineering

What If We Built a Skyscraper-Sized Vortex Tube to Air-Condition a City Without Refrigerant?

2026-06-28

The Ranque-Hilsch vortex tube is one of thermodynamics' more delightful curiosities: feed compressed air into a swirl chamber, and it spontaneously splits into a hot stream (up to +200Β°C) and a cold stream (down to βˆ’50Β°C) at opposite ends. No moving parts. No refrigerant. No magic β€” just angular momentum redistribution as outer gas layers do compressive work on inner ones. Industrially, they're used for spot-cooling CNC tooling. Could we scale one up to cool, say, Manhattan in July?

Manhattan's peak summer cooling load is roughly 10 GW thermal. We want a cold stream about 20 K below ambient (so ~15Β°C output on a 35Β°C day).

The mass flow:

Q = ṁ Β· cp Β· Ξ”T
10Γ—10⁹ W = ṁ Β· 1005 J/(kgΒ·K) Β· 20 K
ṁ β‰ˆ 500,000 kg/s

That's half a million kilograms of cold air per second. At 6 bar and 290 K, density is ~7 kg/mΒ³, so we need ~70,000 mΒ³/s of pressurized airflow β€” equivalent to ~250 large turbofan engines feeding the inlet continuously.

The tower dimensions. Vortex tubes scale poorly because the swirl Reynolds number grows linearly with diameter, but viscous dissipation in the boundary layer doesn't help separation β€” the effect actually degrades above ~10 cm diameter as turbulent mixing erases the temperature gradient. To preserve the effect, we'd need a bundle of, say, 10⁢ parallel 5-cm tubes, each handling 0.07 mΒ³/s. A 200-meter-tall tower 80 m on a side, packed with vertical tubes like a monstrous heat exchanger, gets us there geometrically.

The fatal number β€” energy. Vortex tube COP (cooling delivered Γ· compression work input) is brutally low: roughly 0.1–0.2 in the regime we want. To deliver 10 GW of cooling:

P_compressor β‰ˆ 10 GW / 0.15 β‰ˆ 67 GW electricity

Compare that to a conventional vapor-compression chiller (COP β‰ˆ 4) at 2.5 GW, or a district-scale absorption chiller running on waste heat at essentially free marginal cost. The vortex tower would burn through ~27Γ— more electricity than existing technology β€” roughly the entire summer output of every nuclear plant in the Northeast, just to cool one borough.

Why this is so bad: A vortex tube is fundamentally a throttling device dressed up with rotation. The total enthalpy is conserved (it's adiabatic), so you're not creating cold β€” you're sorting molecules by kinetic energy and throwing half away as a hot exhaust. Half your compressed air leaves as 200Β°C waste that you then have to dump to ambient, taking ~80% of your input work with it.

The compressor heat problem compounds. Compressing 70,000 mΒ³/s of air to 6 bar adiabatically heats it to ~230Β°C. Before it enters the tubes, you must intercool it back to ambient β€” itself requiring another ~40 GW of heat rejection through cooling towers. The Hudson River would visibly warm.

The one redeeming pitch: in places with stranded curtailed renewables (West Texas wind at midnight), maybe a vortex AC tower is acceptable as an inefficient-but-mechanically-trivial heat sink β€” no refrigerant leaks, no compressors with moving seals, just a giant whistle. It's the thermodynamic equivalent of heating your house by lighting a $100 bill: it works, but…

Key Takeaway: Vortex tubes elegantly demonstrate that "no moving parts" and "no refrigerant" don't buy you a free lunch β€” entropy still demands payment, and at city scale the bill is 27Γ— worse than a boring heat pump.

Wikipedia Rabbit Hole

Thermopile

2026-06-28

Somewhere on Mars right now, the Perseverance rover is humming along on electricity generated by a brick that has no moving parts, no solar panels, and no fuel tank. It's just a chunk of plutonium-238 wrapped in a clever stack of metal junctions called a thermopile β€” and the physics behind it was discovered in 1821 by a Baltic German physicist who thought he'd found magnetism.

A thermopile is what you get when you take a thermocouple β€” two dissimilar metals joined at a point, which generates a tiny voltage when heated β€” and wire dozens or hundreds of them in series. Each junction contributes a few microvolts per degree of temperature difference. Stack enough of them and you've turned an imperceptible thermoelectric whisper into a usable current. The trick exploits the Seebeck effect: charge carriers in a hot conductor diffuse toward the cold end, creating a voltage gradient. No combustion, no turbines, no light β€” just a temperature difference.

You've almost certainly encountered one without realizing it:

  • Gas appliances. That pilot light on an old water heater? Its flame heats a thermopile that generates just enough current (around 750 millivolts) to hold the gas valve open. Blow out the flame and the voltage collapses, the valve snaps shut, and your basement doesn't fill with methane. It's a safety system that runs on its own heat β€” no batteries, no wiring to the house.
  • Forehead thermometers. The non-contact infrared thermometers that became ubiquitous in 2020 use a tiny thermopile to detect the infrared radiation from your skin.
  • Spacecraft RTGs. Radioisotope thermoelectric generators on Voyager, Cassini, Curiosity, and Perseverance use thermopiles to convert the heat from decaying plutonium-238 directly into electricity. Voyager 1's thermopiles have been quietly working since 1977.

What makes thermopiles fascinating from an engineering standpoint is what they aren't. They're not efficient β€” typical conversion is 5–8%, terrible compared to a turbine. But they have no moving parts, which means no wear, no lubrication, no maintenance, and no failure modes beyond the slow degradation of the materials themselves. For a probe headed to Saturn, "reliable for 40 years" beats "efficient" every time.

The materials matter too. Modern high-temperature thermopiles often use exotic semiconductors like bismuth telluride, lead telluride, or silicon-germanium alloys, chosen for their unusually steep Seebeck coefficients. This is the same family of materials being explored for waste-heat recovery in car exhausts and industrial smokestacks β€” quietly harvesting energy that would otherwise just warm the atmosphere.

And here's the strangest part: Seebeck himself never understood what he'd discovered. He insisted until his death that the effect was magnetic β€” the deflection of his compass needle, he thought, came from a thermally induced magnetic field, not a current. He was technically right about the magnetism (a current does produce one) but wrong about the cause. The thermoelectric revolution he kicked off was built on a misdiagnosis.

Down the rabbit hole: A device with no moving parts, invented from a misunderstood compass experiment in 1821, is the reason Voyager is still phoning home from interstellar space.

Daily YT Documentary

The Engineers Tried to Stop Challenger They Were Ignored πŸš€

2026-06-28

The Engineers Tried to Stop Challenger    They Were Ignored  πŸš€

Channel: What Really Went Wrong (85 subscribers)

On the night of January 27, 1986, engineers at Morton Thiokol begged NASA to delay the Challenger launch. Their concern was specific and technical: the rubber O-rings sealing the solid rocket booster joints lost resilience in cold weather, and the forecast called for temperatures near freezing β€” far below anything the seals had ever been tested at. They had data. They had a recommendation. And they were overruled.

This video walks through one of the most studied case studies in engineering ethics. It's not just a disaster recap β€” it's a story about how organizational pressure, schedule politics, and the reversal of a "prove it's safe" standard into "prove it's unsafe" led to seven deaths and the loss of an orbiter. Roger Boisjoly's warnings, the infamous late-night teleconference, and the management decision to "take off your engineering hat and put on your management hat" are all part of why this incident still appears in engineering curricula four decades later.

From a tiny 85-subscriber channel, but the topic is meaty enough that even a modest production can do it justice. Worth watching if you're interested in how good engineers fail to be heard inside bad decision-making structures.

Why watch: A clear-eyed look at how Challenger was lost to organizational failure rather than technical mystery β€” the warnings existed, in writing, the night before.

Daily YT Electronics

4 signals on a 2 channel scope (Part 2) real automotive example Hyundai/Genesis/Kia Theta III engine

2026-06-28

4 signals on a 2 channel scope (Part 2) real automotive example Hyundai/Genesis/Kia Theta III engine

Channel: FixitMyWay (1670 subscribers)

This is a genuinely clever piece of practical instrumentation: using AC coupling capacitors to stack four independent waveforms onto a two-channel oscilloscope. It's the kind of trick that bridges textbook circuit theory and bench reality β€” exactly the sort of technique a hobbyist or working tech won't find in a datasheet.

The premise is simple but elegant. By summing signals through coupling caps (which block DC offset while passing the AC component), you can offset each waveform vertically on the same trace and read them as if they were on separate channels. Part 2 takes it out of the theoretical realm and into a real diagnostic scenario: a Hyundai/Kia/Genesis Theta III engine, capturing what appears to be cam/crank or injector timing relationships during a normal temperature condition.

What makes this worth the time is the dual payoff β€” you learn an electronics technique (signal mixing via passive components) and see how it solves a real automotive diagnostic problem where channel count is the bottleneck. For anyone with a budget two-channel scope, this effectively doubles its capability for free. The automotive context also forces clarity: you have to interpret the resulting trace, not just admire it.

Educational, hands-on, and immediately applicable β€” a strong pick from a small channel that's clearly aimed at working diagnosticians.

Why watch: Learn how to view four waveforms on a two-channel scope using AC coupling capacitors, applied to a real engine diagnostic.

Daily YT Engineering

Forensic Engineering Masterclass: The Science of Reconstructing Failure

2026-06-28

Forensic Engineering Masterclass: The Science of Reconstructing Failure

Channel: Darkside Tales Films (56 subscribers)

Most engineering content explains how things are built. This video tackles the inverse β€” how investigators methodically reverse-engineer a catastrophe to determine why something failed. Forensic engineering sits at the intersection of materials science, structural mechanics, fracture analysis, and legal evidence-handling, and it's a discipline most working engineers never formally study.

The session frames forensic engineering as a rigorous scientific process rather than a detective story. Expect coverage of how investigators preserve a failure scene, sequence the timeline of fracture propagation, distinguish primary failure modes from secondary damage, and use techniques like fractography (reading the surface markings on a broken part) to identify whether a component failed from fatigue, overload, corrosion, brittle fracture, or manufacturing defect. These are the same methods used in the post-mortems of bridge collapses, aircraft accidents, and pressure vessel ruptures.

What makes this worth your time over the other failure-themed videos in the feed: it's a methodology lecture, not a highlight reel of disasters. You walk away with a mental framework for how engineers establish causation under uncertainty β€” a skill that transfers to debugging, root-cause analysis, and any work where you have to reason backwards from a broken outcome to a hidden cause.

Note: The channel is small (56 subscribers) and the production is lecture-style rather than cinematic, but the substance is the draw here.

Why watch: Learn the structured investigative methodology engineers use to reconstruct why something failed β€” a transferable framework for root-cause reasoning under uncertainty.

Daily YT Maker

How to Make an Automatic Day & Night Light CircuitSimple 12V Automatic Street Light Circuit Using

2026-06-28

How to Make an Automatic Day & Night Light CircuitSimple 12V Automatic Street Light Circuit Using

Channel: Hi Tech Electrician (343 subscribers)

Of a slate dominated by Shorts, hashtag spam, and "make $5k/month with AI" grift, this is the rare candidate that actually teaches a concrete, buildable circuit. It walks through an automatic day/night switch built around an IRFZ44N N-channel MOSFET, a 100Ξ© resistor, and an LDR (light-dependent resistor) β€” the same basic topology used in real streetlight controllers.

What makes this worth the time over the dozens of "automatic night light" Shorts on YouTube is that it uses a MOSFET rather than the usual BJT or relay. That choice matters: the IRFZ44N can switch significant 12V loads with almost no gate current, which means the LDR voltage divider alone is enough to drive it β€” no transistor stage, no comparator IC, no microcontroller. It's a good study in how a single voltage-divider node tied to a high-impedance gate gives you a clean threshold switch for nearly free.

For anyone learning analog electronics, this is a useful pattern to internalize before reaching for an ESP32 or Arduino. The same circuit scales from a hobby LED strip up to a real driveway light with the right MOSFET and supply.

Caveat: the title is a bit mangled and the channel is small, but the content is a legitimate component-level tutorial rather than a sped-up build montage.

Why watch: A minimal, MOSFET-based dusk-to-dawn switch that teaches how a high-impedance gate lets an LDR directly control a real 12V load with no active stage in between.

Daily YT Welding

How to Build a Durable Garden Table | Welding Project

2026-06-28

How to Build a Durable Garden Table | Welding Project

Channel: MR Welding (99 subscribers)

Honest note up front: this week's candidate pool is thin. Several entries are hashtag-spam shorts for 3D welding tables, a clickbait crosspost, and a "plans coming soon" teaser with no actual build content. This garden table build from MR Welding β€” a tiny 99-subscriber channel β€” is the one video here that promises a complete, step-by-step fabrication walkthrough.

Outdoor furniture is a genuinely useful first or second welding project. It demands square frames, consistent joint prep, and finishing decisions that actually matter: a table left in the weather will telegraph every skipped step within a season. Watch specifically for how the builder handles tube selection and wall thickness (square tube vs. angle iron changes both rigidity and weld difficulty), joint fit-up before tacking (gaps on outdoor furniture become rust pockets), and weld sequencing to control distortion across a wide tabletop frame.

The other thing worth paying attention to on garden builds is corrosion protection β€” whether the maker grinds welds flush, seals tube ends to keep water out of the interior cavities, and what primer/paint system they choose. These details separate a table that lasts five years from one that lasts twenty. Small-channel project videos like this often show the unglamorous prep work that polished channels edit out, which is exactly where beginners learn the most.

Why watch: A full start-to-finish outdoor furniture build from a 99-sub channel is a good chance to study fit-up, distortion control, and weatherproofing on a realistic beginner project.