<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: jcrites</title><link>https://news.ycombinator.com/user?id=jcrites</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 27 Apr 2026 13:05:23 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jcrites" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jcrites in "Launch HN: Enhanced Radar (YC W25) – A safety net for air traffic control"]]></title><description><![CDATA[
<p>I think this is ultimately true, in a sense, but the challenge is correctly handling all of the edge-cases. It's a challenging problem tantamount to the self-driving car problem.<p>It happens by humans over VHF because a lot of unpredictable things happen in busy airspace, and it would require a massive investment for machines to automate all of it.<p>I'm also not sure that people would accept the safety risk of airplanes' autopilots being given automated instructions by ATC over the air. There's a large potential vulnerability and safety risk there. I think there's some potential for automation to replace the role of ATC currently, but I suspect it would still be by transmitting instructions to human pilots, not directly to the autopilot.<p>Lastly, for such a system to ever be bootstrapped, it would still need to handle all of the planes that didn't have this automation yet; it would still need to support communicating with pilots verbally over VHF. An entirely AI ATC system, that autonomously listens to and responds by voice over VHF seems like a plausible first step though.</p>
]]></description><pubDate>Wed, 05 Mar 2025 01:02:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=43261436</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=43261436</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43261436</guid></item><item><title><![CDATA[New comment by jcrites in "20k federal workers take "buyout" so far, official says"]]></title><description><![CDATA[
<p>Doesn't the budget to pay these people already exist? They are current employees, after all. Their terminations will still <i>shrink</i> the budget, just not as soon as a termination without a severance package.<p>Maybe there are some legal differences in offering what would otherwise be wages as a lump-sum payment, but the budget for those wages already exists (else they could not be employed).</p>
]]></description><pubDate>Thu, 06 Feb 2025 02:59:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=42958477</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42958477</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42958477</guid></item><item><title><![CDATA[New comment by jcrites in "Implementation of a RingBuffer in Java with optional FIFO like semantics"]]></title><description><![CDATA[
<p>True, but you can say `new Object[capacity]` and cast it to type `T[]`.</p>
]]></description><pubDate>Wed, 05 Feb 2025 20:34:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=42954712</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42954712</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42954712</guid></item><item><title><![CDATA[New comment by jcrites in "Implementation of a RingBuffer in Java with optional FIFO like semantics"]]></title><description><![CDATA[
<p>Looking at the source, I don't think there's an actual need for the constructor to take a `Class<T>` type. It's used internally to initialize an array [1]:<p><pre><code>  this.entries = (T[]) Array.newInstance(type, capacity);
</code></pre>
However, I think this alternative would work equally well, and would not require a `Class<T>` parameter:<p><pre><code>  this.entries = (T[]) new Object[capacity];
</code></pre>
There are some other choices in the library that I don't understand, such as the choice to have a static constructor with this signature:<p><pre><code>  public static RingBuffer<Object> create(final int capacity) {
    return create(capacity, false);
  }
</code></pre>
This returns the type `RingBuffer<Object>`, which isn't as useful as it could be; with appropriate idiomatic use of generics it could return a `RingBuffer<T>`:<p><pre><code>  public static <T> RingBuffer<T> create(final int capacity, final boolean orderedReads) {
    return new RingBuffer<>(capacity, orderedReads);
  }
</code></pre>
It's possible that this code was written by someone who is still learning idiomatic Java style, or effective use of generics.<p>I'm also curious about the choice to have `get()` return `null`. I think I'd rather have seen this modeled with `Optional`. My preferred style when writing Java code is to employ non-nullable references wherever possible (though the return from `get()` is marked `@Nullable` at least).<p>[1] <a href="https://github.com/evolvedbinary/j8cu/blob/94d64cfc0ec49a34002aae136b6f080c10976748/src/main/java/com/evolvedbinary/j8cu/RingBuffer.java#L115C9-L115C64">https://github.com/evolvedbinary/j8cu/blob/94d64cfc0ec49a340...</a></p>
]]></description><pubDate>Wed, 05 Feb 2025 20:08:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=42954391</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42954391</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42954391</guid></item><item><title><![CDATA[New comment by jcrites in "I had to take down my course-swapping site or be expelled"]]></title><description><![CDATA[
<p>True, but accusing him of a violation privately, to him, is not defamation. Accusing him publicly is still probably not defamation. Whether he violated certain terms of service is something that would ultimately need to be decided by a court, so them believing he did so isn't defamation even if they're wrong.</p>
]]></description><pubDate>Thu, 09 Jan 2025 08:52:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=42643228</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42643228</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42643228</guid></item><item><title><![CDATA[New comment by jcrites in "Zig's comptime is bonkers good"]]></title><description><![CDATA[
<p>Let me take a shot at explaining continuations.<p>In normal programming, functions "return" their values. In Continuation Passing Style (CPS), functions never return. Instead, they take another function as input; and instead of returning, they call that function (the "continuation"). Instead of returning their output, they pass their output as input to the continuation.<p>(Some optimizations are used such that this style of call, the "tail call", does not cause the stack to grow endlessly.)<p>Why would you write code in this style? Generally, you wouldn't. It's typically used as an internal transformation in some types of interpreters or compilers. But conceptualizing control flow in this way has certain advantages.<p>Then there are terms like the "continuation" of a program at a certain point in the code, which just means "whatever the program is going to do next, after it returns (or would return) from the code that it's about to execute". That's what "call with current continuation" (call/cc) is about. It captures (or reifies) "what will the program do next after this?" as a function that can be called to do, well, do that thing. If your code is about to call `f();`, then the 'continuation' at that point is whatever the code will do next after `f()` returns with its return value.<p>Thus if you had some code `g(f())`, then the continuation just as you call `f()` is to call `g()`. CPS restructures this so that `f()` takes the "thing to do next" as input, which is `g()` in this case. The CPS transformation of this code would be `f(g)`, where `g` is the continuation that `f` will invoke when it's done. Instead of returning a value, `f` invokes `g` passing that value as input.<p>You can use continuations to implement concepts like coroutines. With continuations, functions never need to "return". It's possible to create structures like two functions where the control flow directly jumps between between them, back and forth (almost like "goto", but much more structured than that). Neither one is "calling" the other, per se, because neither one is returning. The control flow jumps directly between them as appropriate, when one function invokes a continuation that resumes the other. The functions are peers, where both can essentially call into the other's code using continuations.<p>That's probably a little muddy as a first exposure to continuations, but I'm curious what you think. I generally think of continuations as a niche thing that will likely only be used by language or library implementors. Most languages don't support them.<p>Also, I'd probably argue that regular asynchronous code is a better way to structure similar program logic in modern programming languages. Or at least, it's likely just as good in most ways that matter, and may be easier to reason about than code that uses continuations.<p>For example, one use-case for coroutines is a reader paired with a writer. It can be elegant because the reader can wait until it has input, and then invoke the continuation for the writer to do something with it (in a direct, blocking fashion, with no "context switch"). But you can model this with asynchronous tasks pretty easily and clearly too. It might have a little more overhead, to handle context switching between the asynchronous tasks, but unlikely enough to matter.</p>
]]></description><pubDate>Wed, 08 Jan 2025 21:45:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=42638785</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42638785</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42638785</guid></item><item><title><![CDATA[New comment by jcrites in "Terence Tao: One of my papers got declined today"]]></title><description><![CDATA[
<p>Could that also be because he reviewed the papers first and made sure they were in a suitable state to publish? Or you think it really was just the name alone, and if you had published without him they would not have been accepted?</p>
]]></description><pubDate>Wed, 01 Jan 2025 22:27:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=42569831</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42569831</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42569831</guid></item><item><title><![CDATA[New comment by jcrites in "Introducing S2"]]></title><description><![CDATA[
<p>I think they're saying that you should provide some example use-cases for how someone would use your service. High-level use-cases that involve solving problems for a business.<p>For what it's worth, I am already familiar with this design space well enough that I don't need this kind of example in order to understand it. I've worked with Kinesis and other streaming systems before. But for people who haven't, an example might help.<p>What kind of business problem would someone have that causes them to turn to your service? What are the alternative solutions they might consider and how do those compare to yours? That's the kind of info they're asking for. You might benefit from pitching this such that people will understand it who have never considered streaming solutions before and don't understand the benefits. Pitch it to people who don't even realize they need this.</p>
]]></description><pubDate>Sat, 21 Dec 2024 19:41:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=42481717</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42481717</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42481717</guid></item><item><title><![CDATA[New comment by jcrites in "Cursed Linear Types in Rust"]]></title><description><![CDATA[
<p>From context, I would infer that this means they are not changing the Java language itself. It’s a feature expressed through the existing language, like as a library feature. I could be wrong though.</p>
]]></description><pubDate>Sun, 01 Dec 2024 22:13:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=42291108</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42291108</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42291108</guid></item><item><title><![CDATA[New comment by jcrites in "Amazon S3 Adds Put-If-Match (Compare-and-Swap)"]]></title><description><![CDATA[
<p>The single best metric I've found for scaling things like this is the percent of concurrent capacity that's in use. I wrote about this in a previous HN comment: <a href="https://news.ycombinator.com/item?id=41277046">https://news.ycombinator.com/item?id=41277046</a><p>Scaling on things like the length of the queue doesn't work very well at all in practice. A queue length of 100 might be horribly long in some workloads and insignificant in others, so scaling on queue length requires a lot of tuning that must be adjusted over time as the workload changes. Scaling based on percent of concurrent capacity can work for most workloads, and tends to remain stable over time even as workloads change.</p>
]]></description><pubDate>Tue, 26 Nov 2024 18:10:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=42248233</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=42248233</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42248233</guid></item><item><title><![CDATA[New comment by jcrites in "Unsafe Rust is harder than C"]]></title><description><![CDATA[
<p>For what it's worth, I disagree. I think it would be difficult to design a language more elegant than Rust while accomplishing the same goals. Maybe those goals aren't ones that everyone cares about, and that's OK.<p>It's a language that's definitely worth learning; it expands the mind in a way that languages like Go (or Java, or any GC language) will not. There is a great beauty and elegance to its design.</p>
]]></description><pubDate>Fri, 25 Oct 2024 18:43:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=41948304</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=41948304</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41948304</guid></item><item><title><![CDATA[New comment by jcrites in "SAML: A Technical Primer"]]></title><description><![CDATA[
<p>Could you elaborate? I'm interested.</p>
]]></description><pubDate>Fri, 27 Sep 2024 22:46:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=41676265</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=41676265</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41676265</guid></item><item><title><![CDATA[New comment by jcrites in "Ask HN: What do you monitor on your servers?"]]></title><description><![CDATA[
<p>For servers, I think the single most important statistic to monitor is percent of concurrent capacity in use, that is, the percent of your thread pool or task pool that's processing requests. If you could only monitor one metric, this is the one to monitor.<p>For example, say a synchronous server has 100 threads in its thread pool, or an asynchronous server has a task pool of size 100; then Concurrent Capacity is an instantaneous measurement of what percentage of these threads/tasks are in use. You can measure this when requests begin and/or end. If when a request begins, 50 out of 100 threads/tasks are currently in-use, then the metric is 0.5 = 50% of concurrent capacity utilization. It's a percentage measurement like CPU Utilization but better!<p>I've found this is the most important to monitor and understand because it's (1) what you have the most direct control over, as far as tuning, and (2) its behavior will encompass most other performance statistics anyway (such as CPU, RAM, etc.)<p>For example, if your server is overloaded on CPU usage, and can't process requests fast enough, then they will pile up, and your concurrent capacity will begin to rise until it hits the cap of 100%. At that point, requests begin to queue and performance is impacted. The same is true for any other type of bottleneck: under load, they will all show up as unusually high concurrent capacity usage.<p>Metrics that measure 'physical' (ish) properties of servers like CPU and RAM usage can be quite noisy, and they are not necessarily actionable; spikes in them don't always indicate a bottleneck. To the extent that you need to care about these metrics, they will be reflected in a rising concurrent capacity metric, so concurrent capacity is what I prefer to monitor primarily, relying on these second metrics to diagnose problems when concurrent capacity is higher than desired.<p>Concurrent capacity most directly reflects the "slack" available in your system (when properly tuned; see next paragraph). For that reason, it's a great metric to use for scaling, and particularly automated dynamic auto-scaling. As your system approaches 100% concurrent capacity usage in a sustained way (on average, fleet wide), then that's a good sign that you need to scale up. Metrics like CPU or RAM usage do not so directly indicate whether you need to scale, but concurrent capacity does. And even if a particular stat (like disk usage) reflects a bottleneck, it will show up in concurrent capacity anyway.<p>Concurrent capacity is also the best metric to tune. You want to tune your maximum concurrent capacity so that your server can handle all requests normally when at 100% of concurrent capacity. That is, if you decide to have a thread pool or task pool of size 100, then it's important that your server can handle 100 concurrent tasks normally, without exhausting any other resource (such as CPU, RAM, or outbound connections to another service). This tuning also reinforces the metric's value as a monitoring metric, because it means you can be reasonably confident that your machines will not exhaust their other resources first (before concurrent capacity), and so you can focus on monitoring concurrent capacity primarily.<p>Depending on your service's SLAs, you might decide to set the concurrent capacity conservatively or aggressively. If performance is really important, then you might tune it so that at 100% of concurrent capacity, the machine still has CPU and RAM in reserve as a buffer. Or if throughput and cost are more important than performance, you might set concurrent capacity so that when it's at 100%, the machine is right at its limits of what it can process.<p>And it's a great metric to tune because you can adjust it in a straightforward way. Maybe you're leaving CPU on the table with a pool size of 100, so bump it up to 120, etc. Part of the process for tuning your application for each hardware configuration is determining what concurrent capacity it can safely handle. This does require some form of load testing to figure out though.</p>
]]></description><pubDate>Sat, 17 Aug 2024 19:01:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=41277046</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=41277046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41277046</guid></item><item><title><![CDATA[New comment by jcrites in ".INTERNAL is now reserved for private-use applications"]]></title><description><![CDATA[
<p>> Having DNS records leak could actually provide potential information on things you'd rather not have public.<p>This is true, but using a regular domain name as your root does not require you to actually publish those DNS records on the Internet.<p>For example, say that you own the domain `example.com`. You can build a private service `foo.example.com` and only publish its DNS records within the networks where it needs to be resolved – in exactly the same way that you would with `foo.internal`.<p>If you ever decide that you want an Internet-facing endpoint, just publish `foo.example.com` in public DNS.</p>
]]></description><pubDate>Fri, 09 Aug 2024 21:24:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=41205500</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=41205500</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41205500</guid></item><item><title><![CDATA[New comment by jcrites in ".INTERNAL is now reserved for private-use applications"]]></title><description><![CDATA[
<p>Are there any good reasons to use a TLD like .internal for private-use applications, rather than just a regular gTLD like .com?<p>It's nice that this is available, but if I was building a new system today that was internal, I'd use a regular domain name as the root. There are a number of reasons, and one of them is that it's incredibly nice to have the flexibility to make a name visible on the Internet, even if it is completely private and internal.<p>You might want private names to be reachable that way if you're following a zero-trust security model, for example; and even if you aren't, it's helpful to have that flexibility in the future. It's undesirable for changes like these to require re-naming a system.<p>Using names that can't be resolved from the Internet feels like all downside. I think I'd be skeptical even if I was pretty sure that a given system would not ever need to be resolved from the Internet. [Edit:] Instead, you can use a domain name that you own publicly, like `example.com`, but only ever publish records for the domain on your private network, while retaining the <i>option</i> to publish them publicly later.<p>When I was leading Amazon's strategy for cloud-native AWS usage internally, we decided on an approach for DNS that used a .com domain as the root of everything for this reason, even for services that are only reachable from private networks. These services also employed regular public TLS certificates too (by default), for simplicity's sake. If a service needs to be reachable from a new network, or from the Internet, then it doesn't require any changes to naming or certificates, nor any messing about with CA certs on the client side. The security team was forward-thinking and was comfortable with this, though it does have tradeoffs, namely that the presence of names in CT logs can reveal information.</p>
]]></description><pubDate>Fri, 09 Aug 2024 21:13:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=41205444</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=41205444</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41205444</guid></item><item><title><![CDATA[New comment by jcrites in "Structured logs are the way to start"]]></title><description><![CDATA[
<p>Many log aggregation stores are not optimized for performing row-level updates or deletes like this. In my experience, the majority of log aggregation stores are immutable and support primarily time-based retention only.<p>(Though perhaps one can meet compliance needs by keeping these logs only for a fixed maximum period of time, e.g. 30 days, and keeping only appropriately anonymized data longer.)</p>
]]></description><pubDate>Wed, 26 Jun 2024 23:04:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=40805549</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=40805549</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40805549</guid></item><item><title><![CDATA[New comment by jcrites in "Researchers to retract landmark Alzheimer's paper containing doctored images"]]></title><description><![CDATA[
<p>Yes, you're right. Multiple people in the thread needed to be reminded of this.<p>I wrote my comment in reply to you since you seemed to be the most active, and several of your replies were the most recent at the time I was responding.</p>
]]></description><pubDate>Thu, 06 Jun 2024 16:32:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=40599401</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=40599401</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40599401</guid></item><item><title><![CDATA[New comment by jcrites in "Researchers to retract landmark Alzheimer's paper containing doctored images"]]></title><description><![CDATA[
<p>Please consider presenting the evidence without the personal swipes, and please consider reviewing the HN Guidelines: <a href="https://news.ycombinator.com/newsguidelines.html">https://news.ycombinator.com/newsguidelines.html</a><p>> Be kind. Don't be snarky. Converse curiously; don't cross-examine. Edit out swipes.<p>> When disagreeing, please reply to the argument instead of calling names. "That is idiotic; 1 + 1 is 2, not 3" can be shortened to "1 + 1 is 2, not 3."<p>Your comments in this thread would be more constructive without the swipes.</p>
]]></description><pubDate>Thu, 06 Jun 2024 04:03:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=40593333</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=40593333</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40593333</guid></item><item><title><![CDATA[New comment by jcrites in "Encryption at Rest: Whose Threat Model Is It Anyway?"]]></title><description><![CDATA[
<p>That's workable for many situations which only require data "storage", but the moment when you require cloud-side data "processing" too, the situation changes.<p>I would agree that if you have no use-case for cloud-side data processing, then the cloud doesn't need the encryption keys; however there are a lot of use-cases for data for which processing is highly advantageous.<p>For example, if you just want to <i>store</i> data in the cloud, sure, use client-side encryption. But what if you want to query it with, using an S3 example, S3 Select or Athena or load it into a data lake? There are a lot of things one might do. It's useful to be able to query data from within the cloud – without having to transfer it out and separately decrypt it.<p>This use-case is likely one of the primary reasons why customers are willing to trust cloud providers to manage the keys too – for many data sets, though not all. And that's what technologies like cloud KMS are good for. Access to the actual keys is tightly limited within the cloud provider, both among employees and technologically, and not even other cloud services are capable of accessing them (either accessing the keys or encrypting/decrypting using them) unless you grant them explicit permission, with internal technology that enforces this.<p>Maybe you didn't intend on using "new fancy foo service" to process your stored data yesterday, but today it sounds good, so you can alter an access control grant and allow it to interact with your existing stored data and the necessary encryption keys. Maybe every time some new data arrives in S3, you want to process that data with Lambda and synchronize it with another system. Then it's helpful if you can grant Lambda permissions to decrypt the data so that it can process it :-)<p>Generic server-side encryption does do something: it protects against threats that exist at the data center layer, such as certain attacks through lower layers of infrastructure that don't necessarily involve a full compromise of the machines involved, or inappropriate disposal of old storage devices, mistakes by employees, etc. It protects against some insider attacks, just not those by capable administrators.</p>
]]></description><pubDate>Tue, 04 Jun 2024 17:51:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=40577138</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=40577138</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40577138</guid></item><item><title><![CDATA[New comment by jcrites in "In Colorado, an ambitious new highway policy is not building them"]]></title><description><![CDATA[
<p>Please take a moment to review the HN guidelines: <a href="https://news.ycombinator.com/newsguidelines.html">https://news.ycombinator.com/newsguidelines.html</a><p>> Be kind. Don't be snarky. Converse curiously; don't cross-examine. Edit out swipes.<p>> Please respond to the strongest plausible interpretation of what someone says, not a weaker one that's easier to criticize. Assume good faith.<p>> Please don't post shallow dismissals, especially of other people's work. A good critical comment teaches us something.<p>> Please don't post insinuations about [] shilling[] and the like. It degrades discussion and is usually mistaken.</p>
]]></description><pubDate>Sun, 02 Jun 2024 04:05:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=40551232</link><dc:creator>jcrites</dc:creator><comments>https://news.ycombinator.com/item?id=40551232</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40551232</guid></item></channel></rss>