25 newsletters today.
Abandoned Futures
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:
Why did it die? Three reasons, all political, none technical:
Why it's viable now: Every technical obstacle Philco-Ford flagged in 1966 has been solved or is being solved:
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.
ArXiv Paper Digest
2026-06-28
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.
Daily Automotive Engines
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):
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.
Daily Debugging Puzzle
bufio.Scanner 64KB Token Trap: The Log Parser That Stops Reading Halfway2026-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
}
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.
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.
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
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:
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.
Daily Electrical Circuits
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):
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).
Daily Engineering Lesson
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:
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:
Where they fail:
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.
Forgotten Books
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.
Forgotten Patent
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 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.
Daily GitHub Zero Stars
2026-06-28
Language: Unknown
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:
Who might find it useful:
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.
Daily Hardware Architecture
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:
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.
Hacker News Deep Cuts
2026-06-28
Link: https://github.com/HailToDodongo/pyrite64
HN Discussion: 1 points, 0 comments
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:
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:
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.
HN Jobs Teardown
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:
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).
Daily Low-Level Programming
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:
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.
RFC Deep Dive
2026-06-28
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.
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.CAPABILITIES response under an AUTHINFO line. Clients no longer have to guess or probe.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.
Stack Overflow Unanswered
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:
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.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.
Daily Software Engineering
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:
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:
Tool Nobody Knows
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:
ulimit β ulimit affects the current shell and its descendants. It cannot touch an already-running process. Period.prlimit is hot-patching.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.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:
CAP_SYS_RESOURCE (usually root).open(); the process needs to retry./proc/sys/fs/nr_open β check that ceiling if your new value gets clipped.launchctl limit gets you partway there for launchd-managed daemons.ulimit manages your shell's children; prlimit manages any PID on the box β including the one you cannot afford to restart.
What If Engineering
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β¦
Wikipedia Rabbit Hole
2026-06-28
Wikipedia: Read the full article
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:
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.
Daily YT Documentary
2026-06-28
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.
Daily YT Electronics
2026-06-28
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.
Daily YT Engineering
2026-06-28
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.
Daily YT Maker
2026-06-28
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.
Daily YT Welding
2026-06-28
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.
