<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: cafxx</title><link>https://news.ycombinator.com/user?id=cafxx</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Tue, 14 Apr 2026 17:17:12 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=cafxx" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by cafxx in "Go Proposal: Secret Mode"]]></title><description><![CDATA[
<p>Filed a CL for this, hopefully it gets merged ~soon.<p><a href="https://go-review.googlesource.com/c/go/+/729920" rel="nofollow">https://go-review.googlesource.com/c/go/+/729920</a></p>
]]></description><pubDate>Mon, 15 Dec 2025 01:11:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=46269120</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46269120</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46269120</guid></item><item><title><![CDATA[New comment by cafxx in "Go Proposal: Secret Mode"]]></title><description><![CDATA[
<p>That's not how it's implemented (it returns false if you're inside a Do() on a unsupported platform), although I agree the wording should be clearer.</p>
]]></description><pubDate>Sun, 14 Dec 2025 00:18:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46259581</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46259581</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46259581</guid></item><item><title><![CDATA[New comment by cafxx in "Go Proposal: Secret Mode"]]></title><description><![CDATA[
<p>I find this example mildly infuriating/amusing:<p><pre><code>    func Encrypt(message []byte) ([]byte, error) {
        var ciphertext []byte
        var encErr error
    
        secret.Do(func() {
            // ...
        })
        
        return ciphertext, encErr
    }
</code></pre>
As that suggests that <i>somehow</i> for PFS it is critical that the ephemeral key (not the long-term one) is zeroed out, while the plaintext message - i.e. the thing that in the example we allegedly want secrecy <i>for</i> - is totally fine to be outside of the whole `secret` machinery, and remain in memory potentially "forever".<p>I get that the example is simplified (because what it should actually do is protect the long-term key, not the ephemeral one)... so, yeah, it's just a bad example.</p>
]]></description><pubDate>Sun, 14 Dec 2025 00:03:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=46259495</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46259495</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46259495</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>The point is that no-one is thinking to add knobs, or allow alternative GCs.</p>
]]></description><pubDate>Sat, 13 Dec 2025 00:24:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=46250702</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46250702</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46250702</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>> GOGC was introduced in Go 1.5<p>yes, that's quite literally what I meant by "GOGC has always been there". 1.5 was released 10 years ago, just 3 years after 1.0.<p>So to summarize: there is one knob (that has been there from basically the beginning), plus a second one (if you squint hard enough: GOMAXMEM), and absolutely no plans to add further ones, or to add alternative GCs.</p>
]]></description><pubDate>Fri, 12 Dec 2025 02:18:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=46240149</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46240149</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46240149</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>Your previous message was referring to Go "getting" knobs, but GOGC has always been there.<p>The older GC algorithm won't stay, IIRC the plan is for it to be removed in 1.27 (it's kept for now just to give a fallback in case of bugs in the first release).</p>
]]></description><pubDate>Thu, 11 Dec 2025 21:04:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=46237129</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46237129</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46237129</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>I still would be wary, even in that case. Go does not guarantee that the address of an allocation won't change over the lifetime of the allocation (although current implementations do not make use of this).<p>If you really store just references to the same arena, better to use an offset from the start of the arena. Then it does not matter whether allocations are moved around.</p>
]]></description><pubDate>Thu, 11 Dec 2025 14:50:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=46232054</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46232054</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46232054</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>Not sure what you are referring to. There are no knobs involved in the things I mentioned (aside from the one to enable the experiment, but that's just temporary until the experiment completes - one way or the other).</p>
]]></description><pubDate>Thu, 11 Dec 2025 14:45:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=46232001</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46232001</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46232001</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>> If you really want an arena like behavior you could allocate a byte slice and use unsafe to cast it to literally any type.<p>A word of caution. If you do this and then you store pointers into that slice, the GC will likely not see them (as if you were just storing them as `uintptr`s)</p>
]]></description><pubDate>Thu, 11 Dec 2025 03:05:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=46227177</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46227177</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46227177</guid></item><item><title><![CDATA[New comment by cafxx in "Golang's big miss on memory arenas"]]></title><description><![CDATA[
<p>There's a bunch of activity ongoing to make things better for memory allocation/collection in Go. GreenTeaGC is one that has already landed, but there are others like the RuntimeFree experiment that aims at progressively reduce the amount of garbage generated by enabling safe reuse of heap allocations, as well as other plans to move more allocations to the stack.<p>Somehow concluding that "By killing Memory Arenas, Go effectively capped its performance ceiling" seems quite misguided.</p>
]]></description><pubDate>Thu, 11 Dec 2025 03:00:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46227146</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=46227146</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46227146</guid></item><item><title><![CDATA[New comment by cafxx in "Disk write buffering and its interactions with write flushes"]]></title><description><![CDATA[
<p>I think that the idea of not initiating writeback immediately derives mostly from the days of spinning rust, where read latencies would be noticeably impacted if you initiated writeback too aggressively: reads, contrary to writes, are synchronous by default, and spinning rust rarely allowed high (by modern standards) IOPS, so it made a lot of sense to buffer writes as much as possible to minimize the number of I/O operations spent on writes, as this would leave as many of those IOPS as possible available for reads.<p>This is probably much less of a concern today, as NVMe drives - beside having many orders of magnitude higher IOPS capacity - also have (at least on paper) much better hardware support for high I/O concurrency. It may still make sense, even today, if your hardware (or stack) limits IOPS.</p>
]]></description><pubDate>Fri, 22 Mar 2024 06:52:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=39788005</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=39788005</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39788005</guid></item><item><title><![CDATA[Show HN: Make your API cacheable and save millions: the new Mercari Master API]]></title><description><![CDATA[
<p>Article URL: <a href="https://engineering.mercari.com/en/blog/entry/20231217-the-new-mercari-master-api/">https://engineering.mercari.com/en/blog/entry/20231217-the-new-mercari-master-api/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=38716034">https://news.ycombinator.com/item?id=38716034</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Thu, 21 Dec 2023 01:31:59 +0000</pubDate><link>https://engineering.mercari.com/en/blog/entry/20231217-the-new-mercari-master-api/</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=38716034</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38716034</guid></item><item><title><![CDATA[Show HN: Mgo: build a single Go binary optimized for all GOAMD64 variants]]></title><description><![CDATA[
<p>mgo builds the same program once for each GOAMD64 variant, and then bundles all of them with a launcher that at runtime picks the correct one for the local system. Handy if you have CPU-heavy workloads, but you can't assume which processor they run on; we use it in our kubernetes workloads to reduce CPU usage by ~3%.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=38677815">https://news.ycombinator.com/item?id=38677815</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 18 Dec 2023 00:18:24 +0000</pubDate><link>https://github.com/CAFxX/mgo</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=38677815</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38677815</guid></item><item><title><![CDATA[New comment by cafxx in "GPTs: Custom versions of ChatGPT"]]></title><description><![CDATA[
<p>Would be nice also if they fixed the ubiquitous "network errors" that happen approximately every single time...</p>
]]></description><pubDate>Mon, 06 Nov 2023 19:31:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=38167608</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=38167608</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38167608</guid></item><item><title><![CDATA[New comment by cafxx in "Mistral 7B"]]></title><description><![CDATA[
<p>Not to be the devil's advocate here, but almost certainly it can be the case that data was used to define heuristics (potentially using automated statistical methods) that a engineer then formalized as code. Without that data that specific heuristic wouldn't exist, at least very likely not in that form. Yet that data does not have to be included in any open source release. And obviously you as a recipient of the release can modify the heuristic (or at least, you can modify the version that was codified), but you can not reconstruct it from the original data.<p>I know my example is not exactly what is happening here, but the two sound pretty affine to me and there seem to be a fairly blurry line dividing the two... so I would argue that where "this must be included in a open source release" ends and "this does not need to be included in a open source release" starts is not always so cut and dry.<p>(A variant of this, that happens fairly frequently, is when you find a commit that says something along the lines of "this change was made because it made an internal, non-public workload X% faster"; if the data that measurement is based upon did not exist, or if the workload itself didn't exist, that change wouldn't have been made, or maybe it would have been made differently... so again you end up with logic due to data that is not in the open source release)<p>If we want to go one step further, we could even ask: what about static assets (e.g. images, photographs, other datasets, etc.) included in a open-source release... maybe I'm dead wrong here, but I have never heard that such assets must themselves be "reproducible from source" (what even is, in this context, the "source" of a photograph?).<p>That being said, I sure wish the training data used for all of these models was available to everyone...</p>
]]></description><pubDate>Wed, 27 Sep 2023 23:20:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=37682836</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=37682836</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37682836</guid></item><item><title><![CDATA[New comment by cafxx in "Any sufficiently advanced uninstaller is indistinguishable from malware"]]></title><description><![CDATA[
<p>...or maybe Windows should just offer an API for marking a file for deletion once it's not in use anymore (I understand unlink semantics may not be possible, but that's not what my suggestion above is saying)</p>
]]></description><pubDate>Wed, 13 Sep 2023 05:31:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=37492571</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=37492571</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37492571</guid></item><item><title><![CDATA[New comment by cafxx in "Designing a new concurrent data structure"]]></title><description><![CDATA[
<p>Or you could simply invoke a GC periodically (or every N times a key is removed from the map, or similar schemes).<p>Another simple way, if we don't like the idea of triggering GCs manually,is to allocate the same buffer both off-heap and on-heap: use the off-heap one for actual key storage, and the on-heap one just to generate heap memory pressure.</p>
]]></description><pubDate>Tue, 29 Aug 2023 19:18:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=37312528</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=37312528</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37312528</guid></item><item><title><![CDATA[New comment by cafxx in "Designing a new concurrent data structure"]]></title><description><![CDATA[
<p>Why not just allocating the blobs off-heap? (That is something you probably want to do anyway if it's cryptographic material, to avoid being at the mercy of the GC leaving copies around)<p>ByteBuffer.allocateDirect should do that IIRC. This allows you to use the standard ConcurrentHashMap while being able to get a stable pointer for use by the rust logic.</p>
]]></description><pubDate>Mon, 28 Aug 2023 22:36:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=37301267</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=37301267</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37301267</guid></item><item><title><![CDATA[New comment by cafxx in "Asteroid ZTm0038 with a >3% impact probability"]]></title><description><![CDATA[
<p>'Oumuamua was closer to 8:1 <a href="https://en.wikipedia.org/wiki/%CA%BBOumuamua" rel="nofollow noreferrer">https://en.wikipedia.org/wiki/%CA%BBOumuamua</a></p>
]]></description><pubDate>Tue, 15 Aug 2023 21:43:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=37139648</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=37139648</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37139648</guid></item><item><title><![CDATA[New comment by cafxx in "Optimizing a ring buffer for throughput (2021)"]]></title><description><![CDATA[
<p>In the example you linked it's comparing two threads reading from the same or separate cache lines, no? If so, that's not really the point I was referring to (as the two variables I mentioned as example are accessed by a single thread, not by two threads).</p>
]]></description><pubDate>Tue, 27 Jun 2023 10:19:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=36491026</link><dc:creator>cafxx</dc:creator><comments>https://news.ycombinator.com/item?id=36491026</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36491026</guid></item></channel></rss>