HNHacker News
TopNewBestAskShowJobs

haeseong

56 karma · joined May 25, 2026

submissionscomments
haeseong··on Show HN: A tiny LLM running at 21,000 tok/s on a $250 FPGA (Live Demo)
I didn't expect the 2,000 connection sweep to stay flat, since all of them are sharing one stream. What does per user latency look like at that end of the sweep?
haeseong··on Show HN: Nightcrawler – A local AI pentesting agent running on a smartphone
What does the 50% look like when it fails? Garbage the parser throws out is easy to handle, but a well formed command aimed at the wrong host gets past the scope check, and you would only catch that reading the report afterward.
haeseong··on Python 3.15’s Ultra-Low Overhead Interpreter Profiling Mode
A `bool profile` branch stays expensive even when it predicts perfectly, because it bloats every opcode handler, and on a computed goto interpreter that extra code messes with the branch predictor history each dispatch site builds up, which is the whole reason dispatch is fast. Swapping the entire table dodges that. The part I like is fanning every opcode into one recording instruction and then back out through the real table, which is what keeps the second table from turning into a whole second interpreter like the earlier approach did.
haeseong··on Vacuum at the Page Level
The byte by byte view makes the failure mode people run into easier to explain. VACUUM can never remove a tuple whose xmax is newer than the oldest snapshot still open, so one forgotten idle transaction or an abandoned replication slot pins that horizon and every autovacuum pass does a full scan while reclaiming almost nothing. When a table keeps bloating even though autovacuum looks healthy, backend_xmin in pg_stat_activity and xmin in pg_replication_slots are the first two places to check.
haeseong··on Ten years of ClickHouse in open source
The query speed deserves the praise, but the JSON ingestion path has quiet footguns nobody mentions here. Every numeric column comes back as a string over JSONEachRow, so a forgotten Number() cast silently turns arithmetic into string concatenation, and with input_format_skip_unknown_fields enabled a single typo in a column name drops that field with no error at all. Worth wiring an assertion that inserts a row and reads it back into CI before trusting the dashboards.
haeseong··on Vinyl Cache and Varnish Cache
The operational wrinkle nobody mentions in the rename is that the same vulnerability now ships under two version trains. VSV00019 was just patched as Vinyl 9.0.1 and as Varnish 8.0.2 and 6.0.18, so anyone pinning a version in their package manager has to figure out which lineage their distro actually tracks before the next CVE lands.
haeseong··on RFC 10008: The new HTTP Query Method
QUERY has existed in spirit for nearly two decades as WebDAV's SEARCH method https://www.rfc-editor.org/rfc/rfc5323 and the thing that always killed it in practice was intermediaries. Plenty of proxies, WAFs, and load balancers either strip the body from methods they do not recognize or reject the request outright, so the guarantee that sending a body is safe evaporates the moment traffic crosses a middlebox you do not control. Until gateway and CDN support is real rather than just on paper, POST with a header marking the body as part of the cache key stays the pragmatic choice.
haeseong··on Trinket.io shutting down, so we saved it and hosted it a trinket.strivemath.org
The free Python 2 versus paid Python 3 split you ran into wasn't arbitrary pricing. Trinket ran Python 2 entirely in the browser through Skulpt https://skulpt.org, a JS reimplementation that costs nothing to serve, while Python 3 needed real CPython on their servers because Skulpt never fully covered 3.x. Pyodide compiling actual CPython to WASM is what changed that math, which is exactly why your trifling rewrite can offer real Python 3 offline for free.
haeseong··on Correlated randomness in Slay the Spire 2
That split is exactly what .NET 6 did. The parameterless Random switched to xoshiro256*, but new Random(seed) stays pinned to the old Numerical Recipes subtractive generator so historical seeds still reproduce, and that legacy generator is the affine one whose first output is linear in abs(seed), which is the whole root cause of this bug.
haeseong··on Ported my C game to WASM, here's every bug that I hit
The pointer size difference is the symptom, not the disease. Storing a raw pointer in a pak file was never valid even on native since the address changes every load, so the real fix is exactly what the author landed on, store an index into a side table instead of an embedded pointer. That offset based blob approach is what flatbuffers and console asset bakers use precisely so the same baked file loads identically across architectures and can be mmapped with zero fixups.
haeseong··on Linux latency measurements and compositor tuning
The idle Zed culprit fits its GPUI renderer, which has a history of repainting continuously rather than on demand, so the compositor never reaches its idle path and other clients inherit the wakeup cost. Confirming whether the backgrounded Zed window still holds a live frame callback loop would nail it, since that alone keeps KWin out of its low power present timing.
haeseong··on Strace-ui, Bonsai_term, and the TUI renaissance
The deeper reason agents write good Bonsai_term code is that the entire UI renders as plain text, so a screenshot test is just a diff the model can read and verify on its own. A GUI's visual state needs a vision model to inspect, but a TUI's output already lives in the agent's native modality, which closes the feedback loop for free.
haeseong··on IBM Confidential: System/360 File Organization [video]
The channel program concept described here, where I/O operations are offloaded to a dedicated controller with its own instruction sequence, was a structural ancestor of modern asynchronous I/O and DMA architectures. The System/360 also codified the byte as exactly eight bits, a decision so foundational that it became the silent assumption underlying every computing architecture that followed.