<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: unscaled</title><link>https://news.ycombinator.com/user?id=unscaled</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 11 Oct 2026 08:20:59 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=unscaled" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by unscaled in "Don't couple your Go code to GitHub"]]></title><description><![CDATA[
<p>> One of the good features of Go is that you namespace your code with the location to fetch the code.<p>Then the rest of the article explains why this is NOT a good feature in practice.<p>I don't think it's unworkable either, but this is one of these little thing that Go decided to do different and convinced its fans that this is a great idea and all the other languages where doing it wrong. After a couple of road bumps appeared, instead of admitting there are some advantages to having official package names, we're now told that everybody should just set up their own custom domain with an nginx server or a Go Vanity URLs forwarder to serve traffic for their GitHub-hosted packages.</p>
]]></description><pubDate>Sun, 27 Sep 2026 22:31:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=49871469</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49871469</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49871469</guid></item><item><title><![CDATA[New comment by unscaled in "Go Concurrency Distilled"]]></title><description><![CDATA[
<p>Managing channels and making sure they are closed just once is quite messy compared to other languages. The Go channel axioms[1] don't make much sense: why does closing a channel multiple times panic, but reading from a closed channel returns a zero value?<p>Kotlin gets this right. On send/receive, you can use trySend or tryReceive if you want to avoid exceptions. Considering Kotlin also has coroutines and structured concurrency, concurrency in Kotlin feels more ergonomic to me than Go. At least if you want to get concurrent code with least amount of bugs and not just least amount of extra keywords.<p>[1] <a href="https://dave.cheney.net/2014/03/19/channel-axioms" rel="nofollow">https://dave.cheney.net/2014/03/19/channel-axioms</a></p>
]]></description><pubDate>Sun, 27 Sep 2026 01:02:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=49862257</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49862257</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49862257</guid></item><item><title><![CDATA[New comment by unscaled in "SAML: A fractal of bad design"]]></title><description><![CDATA[
<p>XML did not become more complex following 2002. DTD, Namespaces, Comments, processing instructions, CData, attribute vs. child dichotomy - all of these things exited from day 0.<p>XML Schema (just like JSON schema) did not. When we're talking about a "simple format" in terms of security we are talking about parsing footguns like these features, not about complexities that may exist with any wire format such as schema and data validation.<p>Were there any better formats for simple messages back in 2002?<p>I would argue that yes.<p>1. ASN.1 is horribly complex, but PKCS #7 (Cryptographic Message Syntax, a.k.a. CMS) was already established, and it was better than XML Signatures in one regard: it did not try to fuse the signed content with its envelope. But this probably wasn't he best choice.<p>2. If all you needed is a bag of keys and values, you could easily go with an RFC 822 style header + values format (which worked well for both email protocols and HTML). As a bonus S/MIME was already well established at this point, so you had an obvious way to sign this data.<p>3. Simple binary formats like XDR (used by NFS) or simple textual formats like LDIF or the RFC 822 header format mentioned above could be freely combined with any existing signature protocol that did not mandate structured data (i.e. every signature protocol in existence before XML Signature came in).<p>4. An even better approach of course, would have been to say no to <i>fine-grained</i> cryptographic agility[1]. That was a terrible mistake, but it was the default design choice back in 2002, and it's hard to single out OASIS. The JOSE/JWT authors should have known better though. You could have define a couple of ciphersuites/version, and a simple, fixed signature protocol for each version.<p>5. The best approach would have been to just avoid signatures completely and require TLS, but this wasn't viable back in 2002. Even OAuth 1.0 and OpenID 1.0,  which came out several years later, included their own cryptographic signatures, but their schemes were still far simpler than SAML.<p>I think the key takeaway today is that SAML is no longer necessary today. TLS is not an option for secure web resources. There are no features of SAML that cannot be supported by OAuth or OIDC (only security misfeatures). All IdPs and most products support OIDC. In fact, OIDC is probably more well-supported than SAML.<p>SAML is only used because of enterprise inertia and self-inflicted FUD. As a professional, we should treat SAML with the the same disdain we've directed
we've directed towards Internet Explorer 6. This is an insecure legacy technology that presents a drag on the entire industry.<p>---<p>[1] <a href="https://www.blockchaincommons.com/musings/musings-agility/" rel="nofollow">https://www.blockchaincommons.com/musings/musings-agility/</a></p>
]]></description><pubDate>Wed, 23 Sep 2026 14:04:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49816358</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49816358</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49816358</guid></item><item><title><![CDATA[New comment by unscaled in "SAML: A fractal of bad design"]]></title><description><![CDATA[
<p>OIDC spec has a limited third-party initiated flow[1] that redirects to the RP (equivalent to SP in SAML), which then starts a regular OIDC flow that is indistinguishable from an RP-initiated flow.<p>This flow is safe against CSRF, since no authentication data is carried together with the flow. The only other safety issue I can see is using target_link_uri for CSF. The spec clearly mentions that this URL has to be filtered or ignored by the RP.<p>Instead of treating the (horrible) technical implementation as a feature, it addresses the real user-facing feature: I want to be able to click on a link on my IdP dashboard and be redirected to the app. The login would still be seamless, since you already have an SSO session active with the IdP.<p>[1] <a href="https://openid.net/specs/openid-connect-core-1_0.html#ThirdPartyInitiatedLogin" rel="nofollow">https://openid.net/specs/openid-connect-core-1_0.html#ThirdP...</a></p>
]]></description><pubDate>Wed, 23 Sep 2026 05:26:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=49811985</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49811985</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49811985</guid></item><item><title><![CDATA[New comment by unscaled in "SAML: A fractal of bad design"]]></title><description><![CDATA[
<p>What is prventing OIDC-based IdP from initiating login? You just need to know the login URI:<p><a href="https://openid.net/specs/openid-connect-core-1_0.html#ThirdPartyInitiatedLogin" rel="nofollow">https://openid.net/specs/openid-connect-core-1_0.html#ThirdP...</a></p>
]]></description><pubDate>Wed, 23 Sep 2026 05:16:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=49811937</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49811937</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49811937</guid></item><item><title><![CDATA[New comment by unscaled in "SAML: A fractal of bad design"]]></title><description><![CDATA[
<p>There is nothing left from the OpenID 1.0 and 2.0 protocol in OpenID Connect, except for the core features (identity federation, identity information encoding and updates).<p>OpenID Connect is basically OpenID reimagined on top of OAuth 2.0, with using JWT for the identity data.<p>The core OpenID Connect spec is still purely a federated identity standard. There are many other standards pushed by the OpenID foundation, but OpenID Connect itself was never meant to be anything more. The main feature differentiator from the OG OpenID is that it's built on top of OAuth, so you can add other features supported by OAuth (like authorization) ad-hoc.</p>
]]></description><pubDate>Wed, 23 Sep 2026 05:10:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=49811904</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49811904</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49811904</guid></item><item><title><![CDATA[New comment by unscaled in "SAML: A fractal of bad design"]]></title><description><![CDATA[
<p>JWT has two out of the three issues mentioned above:<p>1. It has the ill-conceived "alg": "none". But this feature made breaking JWT so easy and low stakes, that many libraries have removed this feature completely, or just disabled it by default.<p>Modern RFCs that mandate JWT use in servers (e.g. RFC 9068) often explicitly forbid this, and the latest BCP for JWT (RFC 8725) recommends that libraries only accept or generate tokens with "none" when the user _explicitly_ requests that. And yet, we're still seeing "alg": "none" vulnerabilities even to this day. I'm not sure if it made sense to support "alg": "none" in the first place, but if we ended up doing that, the RFC should have been much more strict about this.<p>2. The other issue is mixing up asymmetric and symmetric encryption. You can't embed the HMAC password directly in the user-generated message; but if the library is not built securely, it would just treat the public key itself as the HMAC key when it gets an HMAC alg in the header. This makes forging tokens quite trivial if the library is misconfigured.<p>JWT is not nearly as bad SAML and its designers learned some important lessons (simpler base format, no canonicalization or embedded signatures), but this is still a design-by-committee standard that didn't properly involve. The full JOSE standard (including JWA) is even worse, but fortunately JWA doesn't get used a lot.</p>
]]></description><pubDate>Wed, 23 Sep 2026 05:04:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=49811861</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49811861</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49811861</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>Have you worked on large (>500KLOC) codebases with an agent?<p>Yes. But keep in mind KLOCs are not easily comparable across languages. Java is notoriously verbose. A 500KLOC codebase in Java would usually be half that size  in Rust. If your argument is that large codebases makes life harder for agents, you should go with a less verbose language.<p>I'm not sure what "manual optimization" means (isn't it a bit of an oxymoron when the agent does it?), but if your agent has the proper tools (e.g. ast-grep, rg, semble) it can deal with large codebases. Would the agent create slop? Yes. But it wouldn't be worse on the slop that humans created on every moderately-sized Java project I've worked on.<p>> in fact, agent-written code in a low-level language gets pretty slow well below that size<p>I've never seen this happening. I've seen agents writing suboptimal Rust code (e.g. copies instead of Cow). But while this occassionally happens with Rust, I've never seen an agent optimizing for Java where necessary (e.g. using object pools to avoid GC churn). Java is not magic.</p>
]]></description><pubDate>Wed, 16 Sep 2026 04:40:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=49722168</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49722168</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49722168</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>I think Java explicitly refused to take some of the best features of Kotlin, like extension methods, context parameters and operator overloading.</p>
]]></description><pubDate>Wed, 16 Sep 2026 04:31:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=49722110</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49722110</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49722110</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>> Most organizations that use Java tend to be pretty conservative with their technology picks<p>That part i s true.<p>> with newer Java versions the only real gap with Kotlin is null-safety<p>But that part isn't. Kotlin has:<p>- Structured Concurrency: Coming to Java sometime in the future, but it's been in preview for very long now.<p>- Standalone functions that don't have to live in classes<p>- Properties<p>- Property delegation<p>- Data classes: more powerful than records. Can be used for large DTOs that you can modify with copy(). Java needs something like Lombok to make records more useful.<p>- Extension methods<p>- Context parameters<p>- Operator overloading<p>- Implementation delegation<p>- Inline functions (which can receive returning closures and reified types)<p>- Block syntax (supports `it` for unnamed arguments)<p>- Sequence abstractions: more powerful and more efficient than Java streams due to the inlining and block syntax.<p>This is just a partial list, but Kotlin clearly has a lot of things that Java doesn't. If you only personally care about NPEs that's fine, but that's not the only thing.</p>
]]></description><pubDate>Wed, 16 Sep 2026 04:29:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=49722094</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49722094</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49722094</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>> Hiring developers is easy<p>> And that "team" nowadays may also consist of many AI agents.<p>And that's the part where the hireability arguments collapse. Sure Claude Code works pretty well with Java. It also works well with Typescript, Python, Go and Rust. It would use types on all of these languages, and run a type checker or LSP on the dynamic ones. And while Java is statically typed, Rust has a stricter type system that prevents some types of runtime bugs that Java's type system won't like data races and forgetting to release a resource.</p>
]]></description><pubDate>Wed, 16 Sep 2026 04:18:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=49722033</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49722033</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49722033</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>Sure it does:<p><a href="https://github.com/uber-go/nilaway" rel="nofollow">https://github.com/uber-go/nilaway</a><p>Not exactly the same solution as JSpecify, since it doesn't rely on annotations, but it's also more ergonomic.<p>I'm not comparing this to "null-restricted types", since that's a draft JEP that hasn't made it even into a preview feature. Go also had multiple proposals for explicit nilability in types, and while they probably have less prospect of ever seeing the light of day compared to Project Valhalla, as things currently stand, Go is in the same position as Java: They are both extremely prone to NEPs out-of-the-box and they both have external tooling that can help you avoid them.<p>Java null checkers have more comprehensive coverage potential compared to Go, but Go is the more ergonomic one here. You don't need a single extra annotation on your code.</p>
]]></description><pubDate>Tue, 15 Sep 2026 20:06:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=49718136</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49718136</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49718136</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>Go panics.</p>
]]></description><pubDate>Tue, 15 Sep 2026 19:53:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=49717977</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49717977</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49717977</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>Congratulations. You've added another build tool and sprinkled your code with ugly annotations and ifs and Optional Optional.of(x).map(y) all over the place to get the same thing you'd get by moving to Kotlin.<p>I get it why this seems like a less drastic change, but this saddens me. Kotlin solves more issues with the type system (smart casts, reified types, immutability by default), without sacrificing readability. Unless I can see a solution in Java that makes dealing with NPEs as easier for lazy developers as ignoring them, I don't consider it a solved issue.</p>
]]></description><pubDate>Tue, 15 Sep 2026 19:52:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=49717969</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49717969</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49717969</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>While Java can outperform Go in some cases, the situation is very much the opposite when it comes to Rust.<p>I also don't see the case for stability. Yes, if you're still on JDK 8, it would probably chug on for a couple of years. But we were talking about greenfield projects and newer JDK go EOL much faster. If you want patches, you'll have to run your app to a newer JDK, which may break a couple of things. Rust (within the same edition) or Go (within the same major version) break less than that.<p>As far as runtime compatibility goes, Rust and Go apps ship with the runtime. This can be better or worse for you, depending on what is your upgrade story, but I don't see a clear winner here. What I would give to Java over Rust is that you will have far fewer dependencies to take care of if you need to upgrade. But the same goes for Go.<p>For observability, I feel that with Rust you have a bit less that you need to observe (no GC to worry about). Tokio tracing is great, but observability requires a bit more effort. The go observability story is far worse. So Java probably has an edge here, but not something that ever felt like a game changer. My impression is that for most of the enterprise shops that love Java, observability means collecting unstructured log files through NFS and trying to find a needle in the haystack with primitive tools, but I've been out of touch with this world for a couple of years.<p>Productivity is something that is dead if you are AI-heavy. Sure, many shops are still wary about AI, and I totally get why, but this is a battle that's already been lost. Without AI, I would say I was about 3 to 4 times more productive in Rust than I was in Java, but ramping up that productivity took at least 1 year of practice. It's not time most companies are willing to spend. With AI, this doesn't matter anymore, for better or worse.<p>I'm not arguing that Java is not chosen often for greenfield projects. It's clearly extremely popular in many circles, especially outside startups and big tech. But I think the reason Java is chosen have little to do with the reasons you've mentioned above and more with organizational preferences.</p>
]]></description><pubDate>Tue, 15 Sep 2026 19:44:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=49717851</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49717851</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49717851</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>I'm not sure what enterprise-level collaboration means. In my experience, "enterprise" usually means: "Let's use tools that are 10 years behind, buggier than average, and have lots of half-baked features, none of which we need".<p>I'm not sure what kind of tools you mean, but unless you're looking for something that just works exactly the way EJBs do for some mysterious reasons, I don't see why you can't do most "enterprisey" things with Rust or Go. Or Python or TypeScript for that matter.</p>
]]></description><pubDate>Tue, 15 Sep 2026 19:20:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=49717495</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49717495</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49717495</guid></item><item><title><![CDATA[New comment by unscaled in "Java 27"]]></title><description><![CDATA[
<p>> Go has null pointer dereference problem.<p>Which Java famously does not have.<p>> Rust is too low-level for typical enterprise app where requirements changes twice a day. You end up spending time and tokens fighting with borrow checker.<p>In my experience, you do not spend tokens fighting with the borrow checker anymore, newer models are smarter. But it might not be ideal for a lot of CRUD applications.<p>> C# is MS product, which is no-go for some folks.<p>This is 2026, it's not 1996 anymore. .Net works on Linux and Microsoft is as friendly towards open source and open standards as a Big Tech company can be.<p>If anything, it was Oracle which more recently sued another company for using a JDK alternative. And this was a lawsuit that, if accepted, could have put the entire idea of API compatibility in danger and deal a severe blow to the Open Source movement.<p>Anyone who is morally bothered by MS but is unfazed by this is probably just mentally stuck in the 1990s.<p>> Kotlin probably would be the answer.<p>I love Kotlin, but I'm afraid that's not the case. The conservative organizations that choose Java out of inertia, would keep choosing Java over Kotlin, even if Kotlin is a better JVM language which is facing no downside.<p>For anyone who doesn't need to be on the JVM or work with JVM tooling, Kotlin doesn't cut it. It doesn't have null pointer dereference problem in theory... Only it does in practice if you're using any Java API that may return null (all these bang-decorated "Platform types"). Generic type erasure can only be overcome in inline functions with reified types. And building and deploying artifacts without docker is still a mess.<p>I found Kotlin extremely publishing for Java shops in the past, and I've converted multiple departments totaling over hundreds of employees to use Kotlin. But that was before AI. The rationale was simple: Java is an entrenched language that leads to bloated code, slow development cycles and way too many avoidable bugs in productions. Kotlin solves some if these issues, and it's very easy to learn for a Java engineer, while still letting you keep all of your tools and libraries. And as a language (putting ecosystem aside), I find it better than either Go or Typescript, and far more ergonomic than Rust[1].<p>But all of these arguments die with AI. Rust is just as ergonomic as any other popular language today if you're using an agent, and the fact that an engineer spent their lifetime writing Spring Boot programs in Java you don't have time to let them learn a new stack from scratch doesn't matter anymore.<p>Sure, there are many companies where letting AI write the code is still not acceptable, but most of these workplaces will accept AI agents sooner than they accept Kotlin.<p>I feel a bit sad since I like many ideas about Kotlin (especially how amenable it is for making DSLs) but we've lost that opportunity<p>--<p>[1] Unless you have to write highly concurrent code without any data races.</p>
]]></description><pubDate>Tue, 15 Sep 2026 19:14:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=49717394</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49717394</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49717394</guid></item><item><title><![CDATA[New comment by unscaled in "So you want to use OpenRouter?"]]></title><description><![CDATA[
<p>OP already answered that one:<p>They used a closed list of 3 vendors in prioritized order, and got 429ed out of two of them, while the third one stopped serving the mode.<p>This is less of a problem if you're running an agent locally and routing your problem to OpenRouter - you can pin to one or two models for consistency and just switch models when something goes bad. But the article is specifically about production traffic.</p>
]]></description><pubDate>Fri, 11 Sep 2026 14:19:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=49658909</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49658909</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49658909</guid></item><item><title><![CDATA[New comment by unscaled in "Simple Is Not Small"]]></title><description><![CDATA[
<p>I think the article is a bit weak when it's making this point, because it's not about Unix pipelines. It's about POSIX shell utilities being too bare-bones.<p>But Unix pipelines are not simple too. They have a couple of nitty-gritty details that often come out and bite you.<p>1. They can only stream raw bytes, so all the programs that deal with lists like sort and uniq have to separate items using a delimiter (usually newline). If you want to process data with that delimiter in it, you're in for a ride. And if you want to write a custom tool, you have to do all the splitting yourselves (luckily it's so common most programming language will provide a ready-made facility for you to do that). This is New Jersey approach again: "I'll make my code (the OS, the shell) easier to write, and in return make life harder for my users (the tool writers)".<p>2. Error are hidden by default in shell. Nowadays you can explicitly change this behavior, but you have to remember to do `set -o pipefail` and I don't think it was always there.<p>3. There is no data typing at all. Everything is binary or text. Nowadays a lot of programs just output JSON, and the users (if they even stay inside the shell) almost always reach for jq to parse it. But jq is not a Unix philosophy program: it's an entire streaming functional programing that can do quite a lot. But even jq gets hairy when you have to do a bigger query or transformation. In that case users often reach out to Python or another language and just move the business logic there.<p>I think this fits well with what the article is trying to say: Unix pipes are pretty easy (small) to implement on your own (compare that to something like Nushell's pipes). But the moment you to do something that's a little different than the happy path it was built for, you need to go for another tool (jq) that has its own built-in pipe and small programming language, because Unix pipes won't cut it. And for more complex (hehe) things, you'll have to reach for a larger (and simpler) tool: a full-fledged programming language.</p>
]]></description><pubDate>Tue, 08 Sep 2026 03:11:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=49605311</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49605311</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49605311</guid></item><item><title><![CDATA[New comment by unscaled in "Japan tried to build an operating system for the world, the US intervened"]]></title><description><![CDATA[
<p>You can mix Japanese and Chinese with modern document authoring standards or with HTML, but the fact is that most people are too lazy to do that. It's a pet peeve of mine when a document gets displayed with a Japanese font but then falls back to another Chinese font when it encounters characters that are missing in the Japanese font. Even when the fonts look the same (or when you're using a unified CJK font like Noto), things will still look bad if the language is not specified, since some characters are written different in each language (or even different variants of Chinese), but still got unified[1].<p>I laud what TRON tried to do, but I don't think they had it right. They made the encoding too complex (especially for the 1990s) while Unicode offered a single Basic Multilingual Plane. Unicode quickly got complex too (mostly due to the mistake of adopting UCS2 and then repurposing that as UTF16 and adding surrogates, and later getting a little bit over the top with combining emojis), 
but TRON was complex in other ways. If you mixed both Chinese and Japanese in a single documents, you had a multiple encodings to care about and control characters to switch between them. Suddenly, the character encoding is not stateless anymore. You can say the same about Unicode, but the statefulness of UTF-8 or UTF-16 is local and easily recoverable. Same goes for the statefulness  combining diacritics, and bidirectional markers (which are rarely used) only affect the display. TRON code plane switches, as far as I understand, mean that even a simple text search or regex search would stop working and need to be completely redesigned, since it now has to be aware of which language we're reading right now! That's a big break, as you say.<p>> It also had a lot more characters. Unicode dropped some of the older or rare characters, meaning some people can't write their last name with the correct character on a computer with Unicode.<p>Only if they're very old and born before or during the war or its not their legal name. The Japanese government restricts the Kanji that can be used in names to Jōyō kanji (regular use kanji) and Jinmeiyō kanji (personal name kanji). Together they add up to roughly 3000 kanji. The list was back in 1991 when Unicode 1.0 was released, but it did include all of them, and many more, as did previous Japanese standards that predated TRON like JIS X 0208. I feel like the "people can't write their name" was always a bit of cope. Japan is still the country of "the nail that sticks out gets hammered". If your name falls outside of the legally allowed list of Kanji, you'll suffer even if you're running BTRON.<p>[1] <a href="https://en.wikipedia.org/wiki/Han_unification#Examples_of_language-dependent_glyphs" rel="nofollow">https://en.wikipedia.org/wiki/Han_unification#Examples_of_la...</a></p>
]]></description><pubDate>Fri, 21 Aug 2026 11:16:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=49386448</link><dc:creator>unscaled</dc:creator><comments>https://news.ycombinator.com/item?id=49386448</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49386448</guid></item></channel></rss>