<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: cryptonector</title><link>https://news.ycombinator.com/user?id=cryptonector</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 19 Aug 2026 06:44:00 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=cryptonector" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by cryptonector in "Flock impersonates journalist in order to cancel his hotel reservations"]]></title><description><![CDATA[
<p>Perhaps Flock would say that since they were denying the journalist a pass, they should also deny them the room block discount.  The hotel could just charge the journalist the difference rather than cancel their room though.</p>
]]></description><pubDate>Tue, 18 Aug 2026 22:25:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=49353643</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49353643</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49353643</guid></item><item><title><![CDATA[New comment by cryptonector in "Claude: System Prompts"]]></title><description><![CDATA[
<p>Arguably humans need clothing and food a lot more than we need AI.</p>
]]></description><pubDate>Mon, 17 Aug 2026 15:09:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=49332317</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49332317</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49332317</guid></item><item><title><![CDATA[New comment by cryptonector in "A spectre is haunting Unicode"]]></title><description><![CDATA[
<p>I also see the same, and I suspect it is due to the lack of a precomposition for n̈.</p>
]]></description><pubDate>Mon, 17 Aug 2026 14:51:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=49332025</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49332025</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49332025</guid></item><item><title><![CDATA[New comment by cryptonector in "A spectre is haunting Unicode"]]></title><description><![CDATA[
<p>Can you fill us in on this history?<p>My understanding is that decompositions for <i>Latin</i> scripts was just natural typewriter-style constructions, while precompositions for <i>Latin</i> scripts was also natural to simplify table-driven transcoding between Unicode and ISO-8859.<p>Similar considerations probably applied in the case of Hiragana (I'm guessing) and other scripts.<p>Besides, combining marks (decomposition) allow for creating new glyphs based on existing ones even where Unicode does not define them.<p>Once two or more ways existed to write any given glyph the canonical equivalence problem immediately arose, and the UC was aware of it immediately, thus we get two basic NFs (NFD, NFC).<p>When it comes to the semantics of glyphs, whatever the UC intended is one thing, but how natural language evolves to use those glyphs is another.  So to some degree what the UC intended is a footnote, and what matters is how people use Unicode.</p>
]]></description><pubDate>Mon, 17 Aug 2026 14:48:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49331975</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49331975</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49331975</guid></item><item><title><![CDATA[New comment by cryptonector in "Anthropic's ‘watermark’ text adulteration in Claude is a perversion of writing"]]></title><description><![CDATA[
<p>People already are, and do.</p>
]]></description><pubDate>Mon, 17 Aug 2026 04:57:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=49326700</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49326700</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49326700</guid></item><item><title><![CDATA[New comment by cryptonector in "A quick look at zero-knowledge proofs"]]></title><description><![CDATA[
<p>Consider ZK password proof protocol: at enrollment (password set / change) the server -or a third party it trusts- knows the password and computes a verifier, while at login time the server uses the verifier to validate that the client knows the password but without the client revealing the password to the server.  The client could perhaps have found an alternative password that matches the same verifier, but the ZKPP's security characteristics are supposed to make that exceedingly difficult.  Meanwhile, the ZKPP is also supposed to make it exceedingly difficult to recover the password from a ZKPP exchange that any eavesdropper could record.<p>A non-augmented ZKPP protects the password from eavesdroppers, but the server's verifier is a password-equivalent (though it isn't the password, just a one-way function of it).<p>A ZKPP is the simplest ZKP application, but others work similarly.<p>In other words: you're missing everything about ZKPs.</p>
]]></description><pubDate>Mon, 17 Aug 2026 04:51:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=49326663</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49326663</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49326663</guid></item><item><title><![CDATA[New comment by cryptonector in "A spectre is haunting Unicode"]]></title><description><![CDATA[
<p>> In fact, (semantics aside, from a technical perspective) the preference should always be for modifiers rather than standalone characters [...]<p>Yes.  But the font has to be designed to allow this.<p>That means that a) lower-case letters must be small enough to allow "overstrike" with diacritical marks to render correctly, b) diacritical marks must be small enough too, c) if you want capitals to also render correctly then the font must have either a set of smaller capitals, or smaller/higher diacritics, and the renderer must scale the capitals and diacritics to fit, or change line spacing, etc.<p>Also, the 'semantics' for the _human_ reader are the same whether you use pre-composed or decomposed codepoint sequences -- the semantics for the human are about the glyph as rendered and not the details of how that glyph was obtained.<p>And to be super-pedantic (sorry!), what you call 'modifiers' are called combining marks in Unicode, and what you call 'standalone characters' are called precompositions in Unicode.  And it's not necessarily true that the rendering will _in practice_ work better with the former than the latter, but in theory absolutely it is, and in practice it almost always is for _browsers_.<p>> Difficulties in entering it or typing it out should be mitigated with client-side affordances in the UI, shortcuts, etc.<p>I really wish Windows would adopt X11-style compose key sequences.  Those are incredibly natural for all glyphs that can notionally be constructed via 'overstriking', and historically that is exactly how people did construct those with typewriters.  (I don't know, but I suspect that for typesetting it was necessary to have a type for each modified character because having decomposed movable type would probably not have been robust enough.)</p>
]]></description><pubDate>Sun, 16 Aug 2026 18:31:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=49322446</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49322446</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49322446</guid></item><item><title><![CDATA[New comment by cryptonector in "A spectre is haunting Unicode"]]></title><description><![CDATA[
<p>n̈ renders fine on my browser, but there is no compose-key sequence for it on my system.<p>I suspect the reason it renders fine is that 'n' in the font I'm using is small enough that the combining mark can be rendered by "overstriking" a diaeresis.</p>
]]></description><pubDate>Sun, 16 Aug 2026 18:20:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=49322362</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49322362</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49322362</guid></item><item><title><![CDATA[New comment by cryptonector in "A spectre is haunting Unicode"]]></title><description><![CDATA[
<p>> but only as a y with a diæresis<p>&aacute; (á) is also an 'a' with a diacritical acute accent.  If you mean that ÿ should not have a precomposition in Unicode, well, why not, especially if it really is used in "a handful of proper nouns in French and Hungarian".<p>Remember, the reason we have combining marks is that that is in fact how many of these characters were composed in actual use, especially with typewriters.  Heck, 1966 US-ASCII / ECMA-6 (1985), section 5, describes the use of backspace/overstrike in US-ASCII for composition of such characters!  That comes from typewriter use.  And that's where compose-key sequences generally come from, too.<p>So it's not at all surprising that given that ÿ has _some_ use, therefore a) it is a valid glyph to construct with combining diaeresis, and b) that it has a precomposed codepoint in Unicode.</p>
]]></description><pubDate>Sun, 16 Aug 2026 18:18:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=49322339</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49322339</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49322339</guid></item><item><title><![CDATA[New comment by cryptonector in "Thanks to social media, canned sardines are a scarcity on the supermarket shelf"]]></title><description><![CDATA[
<p>If they are dying of hunger then the most likely cause is overfishing, far far ahead of climate change.</p>
]]></description><pubDate>Thu, 13 Aug 2026 17:42:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=49289410</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49289410</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49289410</guid></item><item><title><![CDATA[New comment by cryptonector in "To save C, we must save ABI (2022)"]]></title><description><![CDATA[
<p>I'd rather `intmax_t` be deprecated and marked for removal.  It was a terrible mistake.</p>
]]></description><pubDate>Wed, 12 Aug 2026 16:44:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=49275220</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49275220</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49275220</guid></item><item><title><![CDATA[New comment by cryptonector in "Stealing Reasoning Traces from Proprietary LLM APIs"]]></title><description><![CDATA[
<p>Encrypted state cookies solve real problems (server-side storage, latency, scaling) and are not the problem.  The problem is insufficient binding of some of a session's encrypted state cookies and others -- insufficient binding of some session state to other session state.  Here we have HTTP encrypted state cookies for identifying authenticate user IDs and maybe for identifying sessions / chats, while the reasoning traces are also encrypted state cookies but not HTTP cookies, and the latter are somehow not sufficiently bound to the former.<p>The fix is to either have per-user or per-session keys for encrypting reasoning traces, or write the user ID / account ID and maybe also session ID into the plaintext of the reasoning trace _then check that that matches the ones in the HTTP cookies when decrypting the traces_.</p>
]]></description><pubDate>Wed, 12 Aug 2026 16:43:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=49275202</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49275202</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49275202</guid></item><item><title><![CDATA[New comment by cryptonector in "Stealing Reasoning Traces from Proprietary LLM APIs"]]></title><description><![CDATA[
<p>A bit shocking.  One would think that the encrypted reasoning traces -really, encrypted state cookies- would be bound to the session or user, not just the AI provider.  That obviously is the fix.</p>
]]></description><pubDate>Wed, 12 Aug 2026 16:38:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=49275129</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49275129</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49275129</guid></item><item><title><![CDATA[New comment by cryptonector in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>Yes, of course, the tail-calling function must recognize that its continuation is a trampoline closure, pop it, then push either a new trampoline or the original closure (if no trampoline would be needed for the particular tail-call being performed).<p>Do it right and there should only ever be one trampoline closure on the stack for any chain of tail calls, making the scheme O(1) in space.<p>So the whole protocol is that when the compiler recognizes that a call is a tail call, and one that can be turned into a jump instead of call, then the compiler must emit code to<p>a) pop the current continuation (which will either be the original or a trampoline that embeds the original, and from which the original can be recovered),<p>b) pop all the previous arguments and push all the new ones (possibly some are the same, so there is room for optimization here),<p>and<p>c) push a new continuation that is either the same as the previous current continuation or else a new continuation closure that is the correct trampoline corresponding to -and embedding- the original continuation, where the original is recovered from (a).<p>The trampoline recovers the original continuation, fixes the stack depth to what the caller expects, and executes a return to the original continuation.<p>For variadic functions it has to be the case that they have used `va_start()`, consumed all variadic arguments with `va_arg()`, then called `va_end()`, leaving no active copy of the `va_list`, then the compiler can arrange to keep a hidden local variable count of stack words used by the variadic arguments that it can use to implement the above protocol correctly.</p>
]]></description><pubDate>Tue, 11 Aug 2026 18:39:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=49262633</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49262633</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49262633</guid></item><item><title><![CDATA[New comment by cryptonector in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>In particular it's that if you return the result of a function call, then it's a tail call.  For example, in `return f() + g();` neither the call to f() nor the call to g() are tail calls because they return into an expression (`+`) other than `return`.<p>If you scroll up you'll see a discussion of how the caller does the popping of arguments it pushed, so it has to be the case that if a different number of arguments were needed for a tail call then the caller will still pop the correct number of arguments, and that is where the complexity lies: because the caller does not actually know anything about the called function's tail call details, so how does one cause the correct thing to happen?  One way is by changing the calling conventions radically to ensure that either the called function cleans up the arguments before returning, or that the number of bytes to pop is effectively part of the return signature of the function (with the caller somehow being careful to check that the advertised number wouldn't destroy its frame), or just arrange to leave exactly the number of bytes on the stack that the caller expects even if one tail-calls a function that would leave a different number of bytes.</p>
]]></description><pubDate>Tue, 11 Aug 2026 18:36:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=49262603</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49262603</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49262603</guid></item><item><title><![CDATA[New comment by cryptonector in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>The trampoline must indeed be a closure, but let's say you have a chain of main() calling f() tail-calling g() tail-calling... in all cases needing a trampoline, and some being [mutually, even] recursive, and even variadic: there is only ever one live closure: the return to the main() call site to f(), so there is no unbounded stack growth due to tail-call recursion.<p>The trampoline would replace the {main retaddr, main fp}  closure with {trampoline addr, [stack byte count to pop], main retaddr, main fp} and would pop some number of bytes, either hard-coded into the the trampoline function (so you get a bunch of them) or is part of the closure.</p>
]]></description><pubDate>Tue, 11 Aug 2026 17:54:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=49261966</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49261966</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49261966</guid></item><item><title><![CDATA[New comment by cryptonector in "Exploiting System Management Mode with a very long interrupt"]]></title><description><![CDATA[
<p>I would expect a way to interrupt super-long-running instructions would be the better option, even if it was not fully backwards-compatible (say your process executing long-running instructions gets killed).</p>
]]></description><pubDate>Tue, 11 Aug 2026 04:12:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=49253300</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49253300</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49253300</guid></item><item><title><![CDATA[New comment by cryptonector in "Exploiting System Management Mode with a very long interrupt"]]></title><description><![CDATA[
<p>Well, shit.</p>
]]></description><pubDate>Tue, 11 Aug 2026 04:05:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=49253255</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49253255</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49253255</guid></item><item><title><![CDATA[New comment by cryptonector in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>I think Anton is wrong.  Since C89 and before C23 calling an `int f();` function with arguments not matching the definition's actuals is UB.  In C23 `int f();` became the same as `int f(void);`, so calling that function with any arguments is a compile-time error.<p>For variadic functions, if you use `va_start()`/`va_arg()`/`va_end()` to consume all the arguments, and leave no `va_list` alive, then the compiler can correctly generate a tail call from such functions.</p>
]]></description><pubDate>Mon, 10 Aug 2026 23:53:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=49251474</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49251474</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49251474</guid></item><item><title><![CDATA[New comment by cryptonector in "Tail-call optimization in C is relatively recent (2025)"]]></title><description><![CDATA[
<p>TFA assumes pre-C89 C, I think:<p>> The caller could see the declaration int f();, the actual call could have n>0 arguments, and the actual function could have m≤n parameters.<p>Certainly if `f()` were `int f(void);` then that wouldn't be the case.  But even for `int f();` C17 6.5.2.2p6 says that "If the number of arguments does not equal the number of parameters, the behavior is undefined."  Near as I can tell that was made UB in C89.  So TFA is a) right about K&R C, b) just wrong for pretty much all post-K&R C.  C23 makes `int f();` be the same as `int f(void);`.<p>That calling a non-variadic function with more / fewer arguments than expected by its definition is UB is enough to make TCO possible for that function's body.<p>The point about K&R C is well taken though: to turn a tail call into a jump, the caller needs to know how much to pop off the stack.<p>For variadic if you `va_start()`, `va_arg()` as needed, then `va_end()` with no `va_copy()` left alive then you can still tail-call out correctly, otherwise you can't.<p>For non-variadic functions post K&R C TCO should always be possible and not UB.</p>
]]></description><pubDate>Mon, 10 Aug 2026 23:29:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49251275</link><dc:creator>cryptonector</dc:creator><comments>https://news.ycombinator.com/item?id=49251275</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49251275</guid></item></channel></rss>