<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: boris</title><link>https://news.ycombinator.com/user?id=boris</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 29 Apr 2026 07:59:58 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=boris" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by boris in "Three constraints before I build anything"]]></title><description><![CDATA[
<p>> Commands in a CLI … I think what makes for good product design is having a very small number of primitives.<p>Small but not too small. Case in point: shell scripts (POSIX shell, bash) where the scripting part was decided to be modelled as commands thus not introducing another bunch of concepts. We all know what the result is (hot, slow mess).</p>
]]></description><pubDate>Mon, 27 Apr 2026 06:24:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=47918330</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=47918330</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47918330</guid></item><item><title><![CDATA[New comment by boris in "The Cost of a Closure in C"]]></title><description><![CDATA[
<p>GCC (libstdc++) as all other major C++ runtimes (libc++, MSVC) implements the small object optimization for std::function where a small enough callable is stored directly in std::function's state instead of on the heap. Across these implementations, you can reply on being able to capture two pointers without a dynamic allocation.</p>
]]></description><pubDate>Thu, 11 Dec 2025 11:14:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=46229992</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=46229992</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46229992</guid></item><item><title><![CDATA[New comment by boris in "Flow: Actor-based language for C++, used by FoundationDB"]]></title><description><![CDATA[
<p>The strangest thing about Flow is that its compiler is implemented in C#. So if you decide to use it in your C++ codebase, you now have a C#/.Net dependency, at least at build time.</p>
]]></description><pubDate>Mon, 08 Dec 2025 15:36:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=46193472</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=46193472</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46193472</guid></item><item><title><![CDATA[New comment by boris in "Memory Safety for Skeptics"]]></title><description><![CDATA[
<p>I believe the point is if something is UB, like NULL pointer dereference, then the compiler can assume it can't happen and eliminate some other code paths based on that. And that, in turn, could be exploitable.</p>
]]></description><pubDate>Tue, 11 Nov 2025 05:10:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=45884331</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45884331</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45884331</guid></item><item><title><![CDATA[New comment by boris in "OpenBSD 7.8"]]></title><description><![CDATA[
<p>What is the filesystem story in OpenBSD? Anything CoW/snapshot'able on the horizon?</p>
]]></description><pubDate>Wed, 22 Oct 2025 09:02:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=45666491</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45666491</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45666491</guid></item><item><title><![CDATA[New comment by boris in "The evolution of Lua, continued [pdf]"]]></title><description><![CDATA[
<p>What would be the SQLite's equivalent to indexing starting from 1, not 0? Off the top of my head I can't think of anything that would go so much against the grain.</p>
]]></description><pubDate>Tue, 07 Oct 2025 16:15:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=45505051</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45505051</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45505051</guid></item><item><title><![CDATA[New comment by boris in "Shoes, Algernon, Pangea, and sea peoples"]]></title><description><![CDATA[
<p>> We have been optimized very hard by evolution to be good at running, so there shouldn’t be any “easy” technologies that would make us dramatically faster or more efficient.<p>I wonder if these new shoes have the same affect on natural (i.e., non-paved) surfaces? Plus, they all look quite high off the ground (probably all those plates and foam need space) and that doesn't help with stability when running over rocks, etc.</p>
]]></description><pubDate>Sun, 28 Sep 2025 05:18:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=45401952</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45401952</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45401952</guid></item><item><title><![CDATA[New comment by boris in "If all the world were a monorepo"]]></title><description><![CDATA[
<p>There is a parallel with database transactions: it's great if you can do everything in a single database/transaction (atomic monorepo commit). But that only scales so far (on both dimensions: single database and single transaction). You can try
distributed transactions (multiple coordinated commits) but that also has limits. The next step is eventual consistency, which would be equivalent to releasing a new version of the component while preserving the old one and with dependents eventually migrating to it at their own pace.</p>
]]></description><pubDate>Sat, 20 Sep 2025 06:06:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=45310852</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45310852</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45310852</guid></item><item><title><![CDATA[New comment by boris in "Ban me at the IP level if you don't like me"]]></title><description><![CDATA[
<p>Yes, I've seen this one in our logs. Quite obnoxious, but at least it identifies  itself as a bot and, at least in our case (cgit host), does not generate much traffic. The bulk of our traffic comes from bots that pretend to be real browsers and that use a large number of IP addresses (mostly from Brazil and Asia in our case).<p>I've been playing cat and mouse trying to block them for the past week and here are a couple of observations/ideas, in case this is helpful to someone:<p>* As mentioned above, the bulk of the traffic comes from a large number of IPs, each issuing only a few requests a day, and they pretend to be real UAs.<p>* Most of them don't bother sending the referrer URL, but not all (some bots from Huawei Cloud do, but they currently don't generate much traffic).<p>* The first thing I tried was to throttle bandwidth for URLs that contain id= (which on a cgit instance generate the bulk of the bot traffic). So I set the bandwidth to 1Kb/s and thought surely most of the bots will not be willing to wait for 10-20s to download the page. Surprise: they didn't care. They just waited and kept coming back.<p>* BTW, they also used keep alive connections if ones were offered. So another thing I did was disable keep alive for the /cgit/ locations. Failed that enough bots would routinely hog up all the available connections.<p>* My current solution is to deny requests for all URLs containing id= unless they also contain the `notbot` parameter in the query string (and which I suggest legitimate users add in the custom error message for 403). I also currently only do this if the referrer is not present but I may have to change that if the bots adapt. Overall, this helped with the load and freed up connections to legitimate users, but the bots didn't go away. They still request, get 403, but keep coming back.<p>My conclusion from this experience is that you really only have two options: either do something ad hoc, very specific to your site (like the notbot in query string) that whoever runs the bots won't bother adapting to or you have to employ someone with enough resources (like Cloudflare) to fight them for you. Using some "standard" solution (like rate limit, Anubis, etc) is not going to work -- they have enough resources to eat up the cost and/or adapt.</p>
]]></description><pubDate>Mon, 25 Aug 2025 07:49:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=45011356</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45011356</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45011356</guid></item><item><title><![CDATA[New comment by boris in "SQLite (with WAL) doesn't do `fsync` on each commit under default settings"]]></title><description><![CDATA[
<p>The main reason you would attach a database and then jump through hoops like qualifying tables is to have transactions cover all the attached databases. If you don't need that, then you can just open separate connections to each database without needing to jump through any hoops. So the fact that WAL does not provide that is a big drawback.</p>
]]></description><pubDate>Sun, 24 Aug 2025 18:21:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=45006424</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=45006424</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45006424</guid></item><item><title><![CDATA[New comment by boris in "Lessons learned from building a sync-engine and reactivity system with SQLite"]]></title><description><![CDATA[
<p>I would say there is no certainty with eventual consistency, only hope.</p>
]]></description><pubDate>Sun, 17 Aug 2025 10:19:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=44930465</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44930465</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44930465</guid></item><item><title><![CDATA[New comment by boris in "Lessons learned from building a sync-engine and reactivity system with SQLite"]]></title><description><![CDATA[
<p>> And because Electric syncs every change granularly, you are certain that the state of your local database is exactly the same as the server's.<p>I don't see how this certainty follows from "granularity" (whatever that means in this context). I believe to have such a certainty one would need the synchronization to happen within a single transaction that spans both client and server databases.</p>
]]></description><pubDate>Sun, 17 Aug 2025 08:23:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=44929892</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44929892</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44929892</guid></item><item><title><![CDATA[New comment by boris in "I made a real-time C/C++/Rust build visualizer"]]></title><description><![CDATA[
<p>> It also has 6 seconds of inactivity before starting any useful work. For comparison, ninja takes 0.4 seconds to start compiling the 2,468,083 line llvm project. Ninja is not a 100% fair comparison to other tools, because it benefits from some “baked in” build logic by the tool that created the ninja file, but I think it’s a reasonable “speed of light” performance benchmark for build systems.<p>This is an important observation that is often overlooked. What’s more, the changes to the information on which this “baked in” build logic is based is not tracked very precisely.<p>How close can we get to this “speed of light” without such “baking in”? I ran a little benchmark (not 100% accurate for various reasons but good enough as a general indication) which builds the same project (Xerces-C++) both with ninja as configured by CMake and with build2, which doesn’t require a separate step and does configuration management as part of the build (and with precise change tracking). Ninja builds this project from scratch in 3.23s while build2 builds it in 3.54s. If we omit some of the steps done by CMake (like generating config.h) by not cleaning the corresponding files, then the time goes down to 3.28s. For reference, the CMake step takes 4.83s. So a fully from-scratch CMake+ninja build actually takes 8s, which is what you would normally pay if you were using this project as a dependency.</p>
]]></description><pubDate>Thu, 14 Aug 2025 19:09:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=44904365</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44904365</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44904365</guid></item><item><title><![CDATA[New comment by boris in "Converting a large mathematical software package written in C++ to C++20 modules"]]></title><description><![CDATA[
<p>> Header units are supposed to partially address this but right now they are not supported in any build systems properly (except perhaps msbuild?).<p>They are supported in build2 when used with GCC (via the module mapper mechanism it offers). In fact, I would be surprised if they were supported by msbuild, provided by "properly" we mean without having to manually specify dependencies involving header units and without imposing non-standard limitations (like inability to use macros exported by header units to conditionally import other header units).</p>
]]></description><pubDate>Wed, 02 Jul 2025 03:38:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=44440057</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44440057</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44440057</guid></item><item><title><![CDATA[New comment by boris in "Jepsen: TigerBeetle 0.16.11"]]></title><description><![CDATA[
<p>> In other words, hypothetical improvements by AWS (and other Clouds) are extremely overrated.<p>Interesting, in a recent thread (I think it was about Redis going back open source) an AWS employer was bragging about substantial concurrency optimizations they implemented in Valkey. At the time I thought it could have been a great differentiator to keep proprietary but perhaps they decide to sacrifice it to help make sure Valkey takes over the Redis midshare.</p>
]]></description><pubDate>Fri, 06 Jun 2025 19:07:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=44203993</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44203993</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44203993</guid></item><item><title><![CDATA[New comment by boris in "Jepsen: TigerBeetle 0.16.11"]]></title><description><![CDATA[
<p>I watched that but I don't see it as convincing. Let's take the AWS example brought up in the talk. The "compete on the interface, not (open source) implementation" idea I think misses (at least) the following points:<p>1. AWS will take your initial and ongoing investment in the implementation but they don't have to share theirs with you. Specifically, they will take your improvements but their own improvements (say some performance optimizations) they can keep to themselves. It's good business sense if it allows them to further differentiate their "improved" offering from your "vanilla" service.<p>2. Competing on the the interface in this case really means competing on related services like management, etc. So your thesis is that you will provide a better/cheaper managed service than AWS. Even if that's true (a big if), most of the time the decision which service to use will have little to do with technical merit. I.e. we already use AWS, have SLA painfully negotiated, get volume discounts, etc. Do we really want to go through all of this with another vendor just for one extra service.<p>Just a couple of thoughts that will hopefully help you sharpen your thesis.</p>
]]></description><pubDate>Fri, 06 Jun 2025 17:03:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=44202876</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=44202876</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44202876</guid></item><item><title><![CDATA[New comment by boris in "Ask HN: What are good high-information density UIs (screenshots, apps, sites)?"]]></title><description><![CDATA[
<p>In our package repository web  interface we aimed for high information density over design fluff: <a href="https://cppget.org" rel="nofollow">https://cppget.org</a> Especially our builds page.</p>
]]></description><pubDate>Thu, 08 May 2025 14:34:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=43926449</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=43926449</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43926449</guid></item><item><title><![CDATA[New comment by boris in "GCC 15.1"]]></title><description><![CDATA[
<p>In GCC 14, C++ modules were unusable (incomplete, full of bugs, no std modules, etc). I haven't tried 15 yet but if that changed, then it definitely qualifies for a "great improvement".</p>
]]></description><pubDate>Fri, 25 Apr 2025 16:34:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=43795633</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=43795633</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43795633</guid></item><item><title><![CDATA[New comment by boris in "FOSS infrastructure is under attack by AI companies"]]></title><description><![CDATA[
<p>Thanks for sharing. If I understood correctly, you have rate-limiter specific urls (those with commit ids) that are infrequently requested by users but frequently by bots. Which means, provided the bots continue trying to request them, any user request will most likely end up being denies. In this case a simpler solution might be to just block such urls outright. The only advantage of your more complex  solution that I can see is that if the bots stop requesting these urls, they will again become accessible to the normal users. Or am I missing something?</p>
]]></description><pubDate>Thu, 20 Mar 2025 18:50:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=43427356</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=43427356</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43427356</guid></item><item><title><![CDATA[New comment by boris in "FOSS infrastructure is under attack by AI companies"]]></title><description><![CDATA[
<p>> How do they know that these are LLM crawlers and not anything else?<p>I can tell you what it looks like in case of a git web interface like cgit: you get a burst of one or two isolated requests from a large number of IPs each for very obscure (but different) URLs, like a file contents at a specific commit id. And the user agent suggesting  it's coming from IPhone or Android.</p>
]]></description><pubDate>Thu, 20 Mar 2025 18:33:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=43427131</link><dc:creator>boris</dc:creator><comments>https://news.ycombinator.com/item?id=43427131</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43427131</guid></item></channel></rss>