<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: sgsjchs</title><link>https://news.ycombinator.com/user?id=sgsjchs</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 21 Jun 2026 11:59:36 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=sgsjchs" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by sgsjchs in "Open source AI must win"]]></title><description><![CDATA[
<p>Make multiple nodes do the same job, compare results.</p>
]]></description><pubDate>Sat, 13 Jun 2026 11:53:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48516349</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=48516349</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48516349</guid></item><item><title><![CDATA[New comment by sgsjchs in "Show HN: Mediator.ai – Using Nash bargaining and LLMs to systematize fairness"]]></title><description><![CDATA[
<p>You have it backwards.<p>This formal game-theoretic notion of fairness acknowledges that power disparity exists and that having less power than your counterparty allows them to inflict greater disutility on you without you being able to inflict disutility on them in turn to discourage this.<p>On the other hand, fairness "in the usual sense", pretends power disparity doesn't exist and that, say, an armed robber is not allowed to take your stuff when you have nothing to defend yourself with. Which in reality only works as long there is a powerful third party (the state) that will inflict disutility on the robber for it.</p>
]]></description><pubDate>Tue, 21 Apr 2026 11:37:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=47847398</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=47847398</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47847398</guid></item><item><title><![CDATA[New comment by sgsjchs in "We mourn our craft"]]></title><description><![CDATA[
<p>Does it really matter that English is not as precise if the agent can make a consistent and plausible guess what my intention is? And when it occasionally guesses incorrectly, I can always clarify.</p>
]]></description><pubDate>Sat, 07 Feb 2026 21:02:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=46927975</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=46927975</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46927975</guid></item><item><title><![CDATA[New comment by sgsjchs in "Some C habits I employ for the modern day"]]></title><description><![CDATA[
<p>It's the other way around.</p>
]]></description><pubDate>Sat, 24 Jan 2026 19:46:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46746962</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=46746962</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46746962</guid></item><item><title><![CDATA[New comment by sgsjchs in "The inefficiency of RL, and implications for RLVR progress"]]></title><description><![CDATA[
<p>The trick is to provide dense rewards, i.e. not only once full goal is reached, but a little bit for every random flailing of the agent in the approximately correct direction.</p>
]]></description><pubDate>Sun, 30 Nov 2025 13:09:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=46096349</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=46096349</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46096349</guid></item><item><title><![CDATA[New comment by sgsjchs in "Embracing the parallel coding agent lifestyle"]]></title><description><![CDATA[
<p>I, too, enjoy the craftsmanship, but at the end of the day what matters is that the software works as required, how you arrive at that point doesn't matter.</p>
]]></description><pubDate>Fri, 10 Oct 2025 09:21:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=45536830</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45536830</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45536830</guid></item><item><title><![CDATA[New comment by sgsjchs in "Show HN: I built a web framework in C"]]></title><description><![CDATA[
<p>> I still don't understand this decision.<p>Variable declaration `T v;` means "declare `v` such that expression `v` has type `T`". Variable declaration `T *p` means declare `p` such that the expression `*p` has type `T`". etc.</p>
]]></description><pubDate>Thu, 09 Oct 2025 23:48:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=45534192</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45534192</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45534192</guid></item><item><title><![CDATA[New comment by sgsjchs in "Should I choose Ada, SPARK, or Rust over C/C++? (2024)"]]></title><description><![CDATA[
<p>But in C that's just syntax sugar for pointer math.</p>
]]></description><pubDate>Mon, 06 Oct 2025 16:42:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=45493241</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45493241</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45493241</guid></item><item><title><![CDATA[New comment by sgsjchs in "Should I choose Ada, SPARK, or Rust over C/C++? (2024)"]]></title><description><![CDATA[
<p>You very rarely would actually want scalar types which don't map directly to hardware supported ones anyway.</p>
]]></description><pubDate>Mon, 06 Oct 2025 16:32:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=45493149</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45493149</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45493149</guid></item><item><title><![CDATA[New comment by sgsjchs in "Pass: Unix Password Manager"]]></title><description><![CDATA[
<p>Why would you want to store arbitrary individual passwords instead of deriving them with on demand from the service name/domain and a common secret?</p>
]]></description><pubDate>Sun, 14 Sep 2025 01:13:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=45236618</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45236618</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45236618</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>Indeed, the "valid but unspecified state" refers only to some types defined in the he standard library. It essentially means that you can only call methods which have no preconditions and don't depend on what that state is, e.g. assignment or destruction, or something like string::clear or vstring::assign if you want defined outcomes. In general each type is free to guarantee whatever the author wants about the moved from state, e.g. moved-from std::unique_ptr is always null.</p>
]]></description><pubDate>Mon, 08 Sep 2025 22:47:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=45175115</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45175115</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45175115</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>> No, the class can use a sentinel value internally only to mark moved-from objects. That's exactly where we actually started the conversation.<p>The issue is that the "moved-from" state is exposed to the user when the moves are not destructive. The author of the class has to consider behavior for every method in sentinel state, even when it's just to assert that the state isn't sentinel or "lol it's UB". And the user has to be careful not to accidentally misuse an object in sentinel state. Just like how every time you touch a nullable pointer you have to consider if it can be null and what to do in that case. As long as the sentinel state is exposed at all (via non-destructive move), there is little gain in not providing full support for it. However, with destructive moves the sentinel value either doesn't exist at all or only exists completely internally as an optimization, and all this mental overhead disappears.</p>
]]></description><pubDate>Mon, 08 Sep 2025 17:22:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=45171042</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45171042</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45171042</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>> Again, I don't see what this has to do with destructive moves. If you want a socket class that always refer to an open socket, you can already do that.<p>Technically you can, but it's unreasonable to create an os-level socket just to put into the moved-out object where it will be immediately destroyed again. This is not an issue when the moves are destructive.<p>> How is this supposed to work? The very point of your socket class is that it always contains a valid socket handle. Once you introduce a sentinel value, you are back to square one. If the optional class is able to construct a socket with the sentinel value, so is the user.<p>That's not true. The sentinel value need not be exposed in the public interface of the class, it can only be accessible via the customization point of the optional.</p>
]]></description><pubDate>Mon, 08 Sep 2025 11:11:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=45166891</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45166891</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45166891</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>> what difference would it make<p>The same difference as making pointers always non-nullable and reintroducing nullability via an optional wrapper only when semantically appropriate.<p>> what could you possibly do with an arbitrary user-defined class<p>Just add some customization points to std::optional so that users can define which value of the class to treat as noneopt internally.</p>
]]></description><pubDate>Sun, 07 Sep 2025 22:52:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=45162933</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45162933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45162933</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>You don't need optional in this case, the assignment would just destroy the old socket and immediately move the new one in its place.</p>
]]></description><pubDate>Sun, 07 Sep 2025 22:40:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=45162847</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45162847</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45162847</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>> And what's the underlying value of such a default constructed socket? I assume it would be -1 resp. INVALID_SOCKET<p>No, as explained, the default value would be the result of `::socket` call, i.e. a fresh OS-level socket.<p>> So you essentially must wrap it in an optional if you want to use it as a member variable.<p>No, you only must wrap it if you really want this closed state to exist.<p>> Sure, you can implement a socket class like that, but it's neither necessary nor idiomatic C++.<p>Obviously. Because the moves are not destructive. If they were, this design would be superior. And the wasted space for optional is solvable, just like for non-nullable pointers.</p>
]]></description><pubDate>Sun, 07 Sep 2025 10:52:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=45157076</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45157076</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45157076</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>Reopen by constructing and assigning a new socket.</p>
]]></description><pubDate>Sun, 07 Sep 2025 09:34:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=45156729</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45156729</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45156729</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>In this case, I would want the address family and protocol to be statically known, so it would have default constructor. But for example, a file might not have one, sure. As for closing before lifetime ends, why? I can just end lifetime. Wrap it in an optional if the type system can't figure it out like with a struct member.</p>
]]></description><pubDate>Sun, 07 Sep 2025 09:33:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=45156728</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45156728</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45156728</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>If the moves were destructive, I'd design it to have the default constructor call `::socket` and destructor call `::close`. And there wouldn't be any kind of "closed" state. Why would I want it?</p>
]]></description><pubDate>Sun, 07 Sep 2025 01:05:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45154357</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45154357</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45154357</guid></item><item><title><![CDATA[New comment by sgsjchs in "The repercussions of missing an Ampersand in C++ and Rust"]]></title><description><![CDATA[
<p>A socket.</p>
]]></description><pubDate>Sat, 06 Sep 2025 20:34:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=45152628</link><dc:creator>sgsjchs</dc:creator><comments>https://news.ycombinator.com/item?id=45152628</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45152628</guid></item></channel></rss>