<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: pyjarrett</title><link>https://news.ycombinator.com/user?id=pyjarrett</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 15 Apr 2026 04:24:47 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=pyjarrett" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by pyjarrett in "Axios compromised on NPM – Malicious versions drop remote access trojan"]]></title><description><![CDATA[
<p>I used to, but the knowledge of .NET seems mostly transferrable to C#.  It's super useful to do `dotnet fsi` and then work out the appropriate .NET calls in the F# repl.</p>
]]></description><pubDate>Tue, 31 Mar 2026 15:36:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=47588948</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=47588948</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47588948</guid></item><item><title><![CDATA[New comment by pyjarrett in "Axios compromised on NPM – Malicious versions drop remote access trojan"]]></title><description><![CDATA[
<p>These are the big ones I use, specifically because of the standard libraries:<p>Python (decent standard library) - It's pretty much everywhere.  There's so many hidden gems in that standard library (difflib, argparse, shlex, subprocess, cmd)<p>C#/F# (.NET)<p>C# feels so productive because of how much is available in .NET Core, and F# gets to tag along and get it all for free too.  With C# you can compile executables down to bundle the runtime and strip it down so your executables are in the 15 MiB range.  If you have dotnet installed, you can run F# as scripts.</p>
]]></description><pubDate>Tue, 31 Mar 2026 11:34:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=47585839</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=47585839</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47585839</guid></item><item><title><![CDATA[New comment by pyjarrett in "If you don't opt out by Apr 24 GitHub will train on your private repos"]]></title><description><![CDATA[
<p>It doesn't take much power or time to run your own local git server.  My first one which lasted years was parts I mangled together from old computers from garage sales.<p>There's instructions on running a Git server in the git book: <a href="https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols" rel="nofollow">https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protoco...</a></p>
]]></description><pubDate>Fri, 27 Mar 2026 22:20:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=47549141</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=47549141</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47549141</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ask HN: Share your personal website"]]></title><description><![CDATA[
<p><a href="https://pyjarrett.github.io/" rel="nofollow">https://pyjarrett.github.io/</a></p>
]]></description><pubDate>Wed, 14 Jan 2026 20:52:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=46623161</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=46623161</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46623161</guid></item><item><title><![CDATA[New comment by pyjarrett in "Two and a Half Years in GameDev"]]></title><description><![CDATA[
<p>I played an incredibly amount of SimCity 2000 and SimCity 3000, and Metropolis 1998 looks *amazing.*</p>
]]></description><pubDate>Sun, 06 Jul 2025 17:57:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=44482727</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=44482727</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44482727</guid></item><item><title><![CDATA[New comment by pyjarrett in "An Introduction to Modern CMake"]]></title><description><![CDATA[
<p>FASTBuild[0] is super fast for large projects and comes with distributed builds and caching out of the box.  It requires a bit of effort to set up, but it supports globbing sources, there's no separate generate build step, and it can also make Visual Studio solutions.<p>[0]: <a href="https://www.fastbuild.org/docs/home.html" rel="nofollow">https://www.fastbuild.org/docs/home.html</a></p>
]]></description><pubDate>Wed, 16 Apr 2025 01:26:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=43700419</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43700419</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43700419</guid></item><item><title><![CDATA[New comment by pyjarrett in "Vets Who Code"]]></title><description><![CDATA[
<p>Another great resource for vets getting started in software development (and other fields) is American Corporate Partners[1].  I had a great mentor through that group.<p>[1]: <a href="https://www.acp-usa.org/" rel="nofollow">https://www.acp-usa.org/</a></p>
]]></description><pubDate>Wed, 02 Apr 2025 20:49:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=43561376</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43561376</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43561376</guid></item><item><title><![CDATA[New comment by pyjarrett in "You Need Subtyping"]]></title><description><![CDATA[
<p>> However, existing programming languages have little or no subtyping<p>Every "type" you use in Ada is actually a subtype.<p>In Ada, "A subtype of a given type is a combination of the type, a constraint on values of the type, and certain attributes specific to the subtype".<p>You don't ever refer to actual types in Ada, since creating a type with "type" actually creates an anonymous type and the name refers to the first subtype.[1]<p><pre><code>    type Token_Kind is (
       Identifier,
       String_Literal,
       --  many more ...
    
       -- These are character symbols and will be part of Token_Character_Symbol.
       Ampersand,
       --  ...
       Vertical_Bar,
    );
    
    --  A subtype with a compile-time checked predicate.
    subtype Subprogram_Kind is Token_Kind
    with Static_Predicate => Subprogram_Kind in RW_Function | RW_Procedure;
    
    subtype Token_Character_Symbol is Token_Kind range Ampersand .. Vertical_Bar;
</code></pre>
> If you have a pointer with more permissions, it should still be usable in a place that only requires a pointer with fewer permissions<p>This is exactly how "accessibility" of access types works in Ada[2].  If you have a pointer ("access type") to something on the heap, you can use it wherever an anonymous access type can be used.  You can also create subtypes of access types which have the constraint of a "null exclusion".<p>[1]: <a href="https://ada-lang.io/docs/arm/AA-3/AA-3.2#p1_3.2.1" rel="nofollow">https://ada-lang.io/docs/arm/AA-3/AA-3.2#p1_3.2.1</a><p>[2]: <a href="https://ada-lang.io/docs/arm/AA-3/AA-3.10" rel="nofollow">https://ada-lang.io/docs/arm/AA-3/AA-3.10</a></p>
]]></description><pubDate>Sat, 29 Mar 2025 15:22:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=43516244</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43516244</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43516244</guid></item><item><title><![CDATA[New comment by pyjarrett in "We're Still Not Done with Jesus"]]></title><description><![CDATA[
<p>> no one cared back then if he was real,<p>This was directly addressed in 2 John 7<p>"I say this because many deceivers, who do not acknowledge Jesus Christ as coming in the flesh, have gone out into the world."</p>
]]></description><pubDate>Wed, 26 Mar 2025 01:26:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=43477909</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43477909</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43477909</guid></item><item><title><![CDATA[New comment by pyjarrett in "I stopped everything and started writing C again"]]></title><description><![CDATA[
<p>> Plenty of ways to trigger undefined behavior<p>I'm curious about this list, because it definitely doesn't seem that way these days.  It'd be interesting to see how many of these are still possible now.</p>
]]></description><pubDate>Wed, 12 Mar 2025 23:40:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=43348879</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43348879</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43348879</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ask HN: What less-popular systems programming language are you using?"]]></title><description><![CDATA[
<p>Ada<p>The open source tooling has significantly improved since I started using it in the last five years.</p>
]]></description><pubDate>Sat, 01 Mar 2025 21:28:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=43223861</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=43223861</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=43223861</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ada's dependent types, and its types as a whole"]]></title><description><![CDATA[
<p>About two years ago, I was able to dive into the Ada reference manual formatter which has initial commit of March 2000 and is about 45k lines of code, and add MDX output pretty easily.<p>Other languages focus on terseness and expressiveness.  Ada expresses a bunch of constraints directly and forces you to do things in organized ways (e.g. use namespaces appropriately).</p>
]]></description><pubDate>Sat, 28 Dec 2024 17:12:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=42532490</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=42532490</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42532490</guid></item><item><title><![CDATA[New comment by pyjarrett in "A Random Walk Through Ada (2014)"]]></title><description><![CDATA[
<p>The big reason for `out` only is "I want to write here, but I don't care about the initial value."  It's a more explicit version of the C++ `Foo& outFoo` output parameter paradigm.<p>> When "out" and "in out" parameters are distinguished, there is no need for the existence of constructors as a separate concept.<p>I don't agree with this.  You can get I need to do things "post-init" with controlled types, or use a `return X : Thing do ... end return` block.  Constructors help ensure invariants.  You can make a type `is private` to prevent instantiation, only allowing creation via functions (sort of like Rust `new` associated functions), or initialization via an `out` param.  It's OK but not perfect, but you can also tag on a `Type_Invariant` aspect if there are conditions which have to be met by a type.  My big problem with Controlled types is that forces a type to be `tagged` (i.e. it has a vtable) which means it affects storage layout of values of that type, which isn't a problem in C++.<p>You can forbid copies by making something a `limited` type, but you'd have to write your own "Move" equivalent, and some of the containers have `Move` subprograms implemented to transfer contents.  Limited types might elide the copy when returned from a function, but it's been a while since I looked at those rules.</p>
]]></description><pubDate>Sat, 09 Nov 2024 15:25:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=42094898</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=42094898</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42094898</guid></item><item><title><![CDATA[New comment by pyjarrett in "A Random Walk Through Ada (2014)"]]></title><description><![CDATA[
<p>I recently started writing Ada again, a couple of years after I did a bunch of projects with it.  The amazing things is how easy it is to go back and update old code due to how much semantic information gets embedded in it and how few symbols it uses.</p>
]]></description><pubDate>Sat, 09 Nov 2024 13:32:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=42094318</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=42094318</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42094318</guid></item><item><title><![CDATA[New comment by pyjarrett in "Four Months with Ada"]]></title><description><![CDATA[
<p>That's because I took it down over two years ago and moved most of the content to ada-lang.io when I set that up.  This was an anecdotal blog post so it didn't get moved over.</p>
]]></description><pubDate>Wed, 19 Jun 2024 12:42:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=40727729</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=40727729</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40727729</guid></item><item><title><![CDATA[New comment by pyjarrett in "How to read C type declarations (2003)"]]></title><description><![CDATA[
<p>Ada syntax is close to what you described:<p><pre><code>    Foo : array (Positive range 1 .. 100) of access function return access Integer;</code></pre></p>
]]></description><pubDate>Fri, 17 May 2024 10:32:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=40388358</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=40388358</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=40388358</guid></item><item><title><![CDATA[New comment by pyjarrett in ""No way to prevent this" say users of only language where this regularly happens"]]></title><description><![CDATA[
<p>Ada is used quite often in embedded systems.<p>- <a href="https://blog.adacore.com/ada-on-any-arm-cortex-m-device-in-just-a-couple-minutes" rel="nofollow">https://blog.adacore.com/ada-on-any-arm-cortex-m-device-in-j...</a><p>- <a href="https://github.com/AdaCore/Ada_Drivers_Library">https://github.com/AdaCore/Ada_Drivers_Library</a></p>
]]></description><pubDate>Wed, 20 Mar 2024 23:50:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=39773411</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=39773411</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39773411</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ada 95: The Craft of Object-Oriented Programming"]]></title><description><![CDATA[
<p>> you don't have to go full functional verification<p>The amazing thing to me is that Ada code can call SPARK code just fine, and there's crates of SPARK code in Alire that you can use.  It's a huge boost of confidence in the quality of a library that you're using when it has some form of verification.</p>
]]></description><pubDate>Sun, 03 Mar 2024 18:18:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=39582933</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=39582933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39582933</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ada 95: The Craft of Object-Oriented Programming"]]></title><description><![CDATA[
<p>> the code to SPARK and proving the absence or runtime error<p>I wrote Rob Pike's simple regex from the "Practice of Programming" in Ada/SPARK and it blew my mind that I actually managed to prove an absence of runtime error (guaranteed no overflow or out of bounds).</p>
]]></description><pubDate>Sun, 03 Mar 2024 00:38:20 +0000</pubDate><link>https://news.ycombinator.com/item?id=39577230</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=39577230</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39577230</guid></item><item><title><![CDATA[New comment by pyjarrett in "Ada 95: The Craft of Object-Oriented Programming"]]></title><description><![CDATA[
<p>This is an awesome feature, combined with appropriate type and bounds checking and prevents so many errors.  It can also avoid resorting to a heavier-weight map type.<p>Ada has this as well, including using any arbitrary continuous range for array indexing which handles remapping indices for you.  e.g. if the key range is 20-40 the language handles associating it with array indices for you.</p>
]]></description><pubDate>Sat, 02 Mar 2024 15:46:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=39573304</link><dc:creator>pyjarrett</dc:creator><comments>https://news.ycombinator.com/item?id=39573304</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=39573304</guid></item></channel></rss>