<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: glyph</title><link>https://news.ycombinator.com/user?id=glyph</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 25 Jun 2026 03:43:09 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=glyph" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by glyph in "I think I'm done thinking about GenAI for now"]]></title><description><![CDATA[
<p>I appreciate your commitment to being open to the possibility of being surprised. And I do wish I _could_ find a context in which I could be comfortable doing this type of personal experiment. But, I do remain confident in my own particular course of action chosen in the face of incomplete information.<p>Again, it's tough to talk about this while constantly emphasizing that the CVE at best a tiny little data point, not anywhere close to a confirmation bullseye, but my model of this process would account for it. And the way it accounts for it is in what I guess I need to coin a term for, "vigilance decay". Sort of like alert fatigue, except there are no alerts, or hedonic adaptation, for when you're not actually happy. You need to keep doing the same kinds of checks, over and over, at the same level of intensity forever to use one of these tools, and humans are <i>super</i> bad at that; so, at some point in your list, you developed the learned behavior "hey, this thing is actually getting <i>most</i> of this stuff right, I am going to be a little less careful".  Resisting this is nigh impossible.  The reason it's less of a problem with human code review is that as the human seems to be getting better at not making the mistakes you've spotted before, they actually <i>are</i> getting better at not making those mistakes, so your relaxed vigilance is warranted.</p>
]]></description><pubDate>Fri, 06 Jun 2025 00:20:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=44196785</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=44196785</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44196785</guid></item><item><title><![CDATA[New comment by glyph in "I think I'm done thinking about GenAI for now"]]></title><description><![CDATA[
<p>I haven't personally tried the specific tool that you have, but I have tried a variety of other tools and have had pretty negative experiences with them.  I have received a lot of feedback telling me that if I tried out an agentic tool (or a different model, or etc etc etc, as I covered in the post, the goal posts are endlessly moving) I would like it, because the workflow is different.<p>I was deliberately vague about my direct experiences because I didn't want anyone to do… well, basically this exact reply, "but you didn't try my preferred XYZ workflow, if you did, you'd like it".<p>What I saw reflected in your repo history was the same unpleasantness that I'd experienced previously, scaled up into a production workflow to be even <i>more</i> unpleasant than I would have predicted.  I'd assumed that the "agentic" stuff I keep hearing about would have <i>reduced</i> this sort of "no you screwed up" back-and-forth.  Made particularly jarring was that it was from someone for whom I have a lot of respect (I was a BIG fan of Sandstorm, and really appreciated the design aesthetic of Cap'n Proto, although I've never used it).<p>As a brutally ironic coda about the capacity of these tools for automated self-delusion at scale, I <i>believed</i> the line "Every line was thoroughly reviewed and cross-referenced with relevant RFCs, by security experts with previous experience with those RFCs.", and in the post, I accepted the premise that it worked.  You're not a novice here, you're on a short list of folks with world-class appsec chops that I would select for a dream team in that area.  And yet, as others pointed out to me post-publication, CVE-2025-4143 and CVE-2025-4144 call into question the efficacy of "thorough review" as a mechanism to spot the sort of common errors likely to be generated by this sort of workflow, that 0xabad1dea called out 4 years ago now: <a href="https://gist.github.com/0xabad1dea/be18e11beb2e12433d93475d72016902" rel="nofollow">https://gist.github.com/0xabad1dea/be18e11beb2e12433d93475d7...</a><p>Having hand-crafted a few embarrassing CVEs myself with no help from an LLM, I want to be sure to contextualize the degree to which this is a "gotcha" that <i>proves</i> anything.  The main thrust of the post is that it is grindingly tedious to conclusively prove anything at all in this field right now.  And even experts make dumb mistakes, this is why the CVE system exists.  But it does very little to <i>disprove</i> my general model of the likely consequences of scaled-up LLM use for coding, either.</p>
]]></description><pubDate>Thu, 05 Jun 2025 23:27:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=44196583</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=44196583</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44196583</guid></item><item><title><![CDATA[New comment by glyph in "HN bans Hector Martin’s home IP address"]]></title><description><![CDATA[
<p>Martin writes on Mastodon: “So apparently dang and the HN crowd are so upset I wrote some messages for HN visitors to our website, that they now banned my home IP address ”</p>
]]></description><pubDate>Mon, 02 Oct 2023 15:04:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=37739068</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=37739068</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37739068</guid></item><item><title><![CDATA[HN bans Hector Martin’s home IP address]]></title><description><![CDATA[
<p>Article URL: <a href="https://social.treehouse.systems/@marcan/111165462856319954">https://social.treehouse.systems/@marcan/111165462856319954</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=37739067">https://news.ycombinator.com/item?id=37739067</a></p>
<p>Points: 39</p>
<p># Comments: 24</p>
]]></description><pubDate>Mon, 02 Oct 2023 15:04:03 +0000</pubDate><link>https://social.treehouse.systems/@marcan/111165462856319954</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=37739067</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37739067</guid></item><item><title><![CDATA[New comment by glyph in "PGP signatures on PyPI: worse than useless"]]></title><description><![CDATA[
<p>Also, if you really want a "fancy checksum" for verifying package installs, there's already a better feature in pip that actually works and is well-supported: <a href="https://pip.pypa.io/en/stable/topics/secure-installs/" rel="nofollow">https://pip.pypa.io/en/stable/topics/secure-installs/</a></p>
]]></description><pubDate>Sun, 21 May 2023 18:03:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=36023311</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=36023311</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36023311</guid></item><item><title><![CDATA[New comment by glyph in "PGP signatures on PyPI: worse than useless"]]></title><description><![CDATA[
<p>There are other efforts underway to mitigate these threats (which could be subject to their own critiques, but let's not get into that here) but PGP has had 20 years to prove its utility in this area and it has resoundingly proved that it (A) does not address the threats it purports to and (B) introduces tons of confusing complexity into processes which are not benefiting from it.<p>Let me restate that: <i>it is not free</i> to continue supporting PGP.  It has a tremendous cost both in its own maintenance and its opportunity cost.  Every moment spent attempting to mitigate its fundamentally broken design is a moment that could instead be put into designing something new, that works properly and doesn't require dragging around the massively bloated corpse of 1999-era cryptographic engineering.</p>
]]></description><pubDate>Sun, 21 May 2023 18:01:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=36023289</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=36023289</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36023289</guid></item><item><title><![CDATA[New comment by glyph in "Data Classification: Does Python still have a need for class without dataclass?"]]></title><description><![CDATA[
<p>why do you think you can't define `__aenter__` and `__aexit__` on a dataclass?</p>
]]></description><pubDate>Wed, 15 Feb 2023 01:25:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=34798834</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=34798834</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34798834</guid></item><item><title><![CDATA[New comment by glyph in "Attrs – the Python library everyone needs (2016)"]]></title><description><![CDATA[
<p>To start with, the non-`@dataclass` version here doesn't tell you what types `name` and `age` are (interesting that it's an int, I would have guessed float!).  So right off the bat, not only have you had to type every name 3 times, you've also provided me with less information.<p>> I'm not writing an eq method or a repr method in most cases, so it just doesn't add much for the cost.<p>That's part of the appeal.  With vanilla classes, `__repr__`, `__eq__`, `__hash__` et. al. are each an independent, complex choice that you have to intentionally make every time.  It's a lot of cognitive overhead.  If you ignore it, the class might be fit for purpose for your <i>immediate</i> needs, but later when debugging, inspecting logs, etc, you will frequently have to incrementally add these features to your data structures, often in a haphazard way.  Quick, what are the invariants you have to verify to ensure that your `__eq__`, `__ne__`, `__gt__`, `__le__`, `__lt__`, `__ge__` and `__hash__` methods are compatible with each other?  How do you verify that an object is correctly usable as a hash key?  The testing burden for all of this stuff is <i>massive</i> if you want to do it <i>correctly</i>, so most libraries that try to eventually add all these methods after the fact for easier debugging and REPL usage usually end up screwing it up in a few places and having a nasty backwards compatibility mess to clean up.<p>With `attrs`, not only do you get this stuff "for free" in a convenient way, you also get it implemented in a way which is very consistent, which is correct by default, and which also provides an API that allows you to do things like enumerate fields on your value types, serialize them in ways that are much more reliable and predictable than e.g. Pickle, emit schemas for interoperation with other programming languages, automatically provide documentation, provide type hints for IDEs, etc.<p>Fundamentally attrs is far less code for far more correct and useful behavior.</p>
]]></description><pubDate>Wed, 29 Dec 2021 00:49:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=29720318</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=29720318</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29720318</guid></item><item><title><![CDATA[New comment by glyph in "Attrs – the Python library everyone needs (2016)"]]></title><description><![CDATA[
<p>Not that attrs or dataclasses has particularly significant attack surface, but when considering stdlib vs. 3rd-party you also have to consider the amount of maintenance and the release cadence.  Attrs can release every few months if the rate of change demands it, whereas the stdlib has a fixed yearly release schedule that is tied to interpreter versions.  Attrs has a small, focused development team whereas the stdlib is maintained by developers who are stretched very thin, and many packages within it are effectively abandoned.  Upgrading dataclasses means upgrading <i>everything</i> in the stdlib at the same time, whereas attrs can be upgraded independently, by itself.<p>Supply chain attacks are a complex and nuanced topic so there are plenty of reasons to be thoughtful about adopting new dependencies, but it's definitely not as simple as "just use the stdlib for everything".</p>
]]></description><pubDate>Wed, 29 Dec 2021 00:40:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=29720233</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=29720233</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29720233</guid></item><item><title><![CDATA[New comment by glyph in "Attrs – the Python library everyone needs (2016)"]]></title><description><![CDATA[
<p>To the runtime-validation point; our team used attrs with runtime validation enforced everywhere (we even wrote our own wrapper to make it <i>always</i> use validation, with no boilerplate) and this ended up being a <i>massive</i> performance hit, to the point where it was showing up close to the top of most profile stats from our application.  Ripping all that out made a significant improvement to interactive performance, with zero algorithmic improvements anywhere else.  It really is <i>very</i> expensive to do this type of validation, and we weren't even doing "deep" validation (i.e. validating that `list[int]` really did include only `int` objects) which would have been even more expensive.<p>Python can be used quite successfully in high-performance environments if you are judicious about how you use it; set performance budgets, measure continuously, make sure to have vectorized interfaces, and have a tool on hand, like PyO3, Cython, or mypyc (you should probably NOT be using C these days, even if "rewrite in C" is the way this advice was phrased historically) ready to push very hot loops into something with higher performance when necessary.  But if you redundantly validate everything's type on every invocation at runtime, it does eventually become untenable for anything but slow batch jobs if you have any significant volume of data.</p>
]]></description><pubDate>Wed, 29 Dec 2021 00:36:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=29720197</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=29720197</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29720197</guid></item><item><title><![CDATA[New comment by glyph in "No More Stories"]]></title><description><![CDATA[
<p>This is why consensus is a <i>collection</i>. Sometimes dialectical analysis is good; thesis, antithesis, synthesis is a tried and true formula that often works. But not always! Sometimes one side is just horseshit that gets mindlessly repeated in the interest of “balance”. In either case I’m not suggesting that the consensus ruthlessly censor dissenting views, rather that in order to make <i>sense</i> out of dissenting views, the strongest forms of each argument need to be presented together alongside accountability: editorial moderation and fact-checking.<p>Even in the cases where the truth really is somewhere in the middle between two opposing camps, reading a sequence of side A #1, side B #1, side A #2, side B #2, in disconnected stories gives you a very skewed view subject to recency bias. For example you can’t easily check the history to see if a claim B is making in their second story was already debunked by A in their first one, and it’s a huge waste of time and energy for A to have to spend all their media budget just refuting that claim over and over because B keeps bringing it up every time there’s no fact checker <i>right</i> in front of them to call them on it (and even sometimes if there is).<p>In other words the current media environment rewards being loud, wrong, simple and repetitive far over and above even the normal human bias for such things. It reinforces our worst cognitive habits.</p>
]]></description><pubDate>Fri, 17 Dec 2021 19:17:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=29597007</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=29597007</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29597007</guid></item><item><title><![CDATA[New comment by glyph in "I Want a New Duck (2020)"]]></title><description><![CDATA[
<p>The results of the poll are in, and 59.6% of the 699 respondents said that they're either using it already or will be using it within the year.  This isn't necessarily a representative sample, my followers are probably on the more advanced end of the Python spectrum, but 700 people (including myself) isn't nothing, either.  I think it's likely that type annotations will be available for the majority of Python libraries.</p>
]]></description><pubDate>Sun, 21 Mar 2021 04:00:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=26528009</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=26528009</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26528009</guid></item><item><title><![CDATA[New comment by glyph in "I Want a New Duck (2020)"]]></title><description><![CDATA[
<p>This made me curious, so I’m taking a poll.<p><a href="https://twitter.com/glyph/status/1372640855807250432?s=21" rel="nofollow">https://twitter.com/glyph/status/1372640855807250432?s=21</a></p>
]]></description><pubDate>Thu, 18 Mar 2021 23:59:23 +0000</pubDate><link>https://news.ycombinator.com/item?id=26508890</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=26508890</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26508890</guid></item><item><title><![CDATA[New comment by glyph in "I Want a New Duck (2020)"]]></title><description><![CDATA[
<p>Just speaking for myself here, I didn’t realize the power of static typing for years and years because the main languages I used with “static types” were C-style; i.e. type checking without null checking. I was vaguely aware of “better” systems but since I had such a wealth of experience with compile-time type-checking catching ~zero bugs, it didn’t seem worthwhile to investigate, and my toy projects didn’t make it clear what I was missing. Having used Mypy in a large practical situation for a couple of years, one of the MAIN advantages of it is the None checking! I would get probably 60% of the utility out of a type checker that could <i>only</i> check for None.<p>Having had this experience now it’s much easier to appreciate the practical benefits of systems like Rust and Haskell, where the type checker is doing real work.</p>
]]></description><pubDate>Thu, 18 Mar 2021 23:54:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=26508860</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=26508860</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26508860</guid></item><item><title><![CDATA[New comment by glyph in "I Want a New Duck (2020)"]]></title><description><![CDATA[
<p>Mypy itself uses this extensively; it was developed because typechecking itself was getting too slow. So it’s seen some practical real-world use. It’s not a panacea (heck, it’s barely documented) but it’s an appealing option if you have some clear hotspot in Python that you need to optimize.</p>
]]></description><pubDate>Thu, 18 Mar 2021 23:48:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=26508821</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=26508821</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26508821</guid></item><item><title><![CDATA[New comment by glyph in "I Want a New Duck (2020)"]]></title><description><![CDATA[
<p>The post isn't about performance, and is aimed at people using Python for whatever reason, so, sure, retrofit away.<p>That said, if you care about the performance improvements that typing can give you with Mypy, you might want to look here:<p><a href="https://github.com/mypyc/mypyc-benchmark-results/blob/master/reports/summary-main.md" rel="nofollow">https://github.com/mypyc/mypyc-benchmark-results/blob/master...</a><p>It won't be going toe to toe with Rust any time soon, but a 4x to 17x speedup is nothing to sneeze at.</p>
]]></description><pubDate>Thu, 18 Mar 2021 20:01:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=26506939</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=26506939</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=26506939</guid></item><item><title><![CDATA[New comment by glyph in "Never run ‘python’ in your downloads folder"]]></title><description><![CDATA[
<p>No.</p>
]]></description><pubDate>Fri, 28 Aug 2020 02:03:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=24300700</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=24300700</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24300700</guid></item><item><title><![CDATA[New comment by glyph in "Never run ‘python’ in your downloads folder"]]></title><description><![CDATA[
<p>There’s no error in the original example; in Python, the ability to participate in inheritance diamonds with arbitrary other classes is a feature which must be explicitly documented and maintained. James Knight wrote a really good piece on this many years ago: <a href="https://fuhm.net/super-harmful/" rel="nofollow">https://fuhm.net/super-harmful/</a><p>The solution is just to avoid inheritance. It’s full of terrible pitfalls in most languages, but Python more than most.</p>
]]></description><pubDate>Tue, 25 Aug 2020 02:49:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=24267727</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=24267727</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24267727</guid></item><item><title><![CDATA[New comment by glyph in "Python 2.7.18, the last release of Python 2"]]></title><description><![CDATA[
<p>The reason the crypto module was using this particular deprecated feature is that it hasn't been updated <i>at all</i> in 8 years.<p>The OP should have dropped it because it's unmaintained, and a maintained replacement has existed for a long time: <a href="https://cryptography.io/" rel="nofollow">https://cryptography.io/</a><p>This is an especially important consideration for security-critical libraries like cryptographic libraries.</p>
]]></description><pubDate>Tue, 21 Apr 2020 03:02:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=22931405</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=22931405</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=22931405</guid></item><item><title><![CDATA[New comment by glyph in "Using attrs for everything in Python"]]></title><description><![CDATA[
<p>It's not an "in-joke".  It follows conventions set by the Python language:<p>- "def" instead of "define"<p>- "cls" instead of "Class"<p>- "sys" instead of "system"<p>- "os" instead of "operating_system_facilities"<p>- "ntpath" instead of "windows_path_names"<p>- "abc" instead of "abstract_base_classes"<p>Python <i>aggressively</i> abbreviates almost everything in common use.  If it were in the stdlib, perhaps it would be the built-in names "attrs" and "attrib" rather than having dots in them, but the names would indubitably still be very short.</p>
]]></description><pubDate>Sat, 27 Aug 2016 19:31:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=12373795</link><dc:creator>glyph</dc:creator><comments>https://news.ycombinator.com/item?id=12373795</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12373795</guid></item></channel></rss>