<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: mgsloan2</title><link>https://news.ycombinator.com/user?id=mgsloan2</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 30 Apr 2026 08:45:09 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=mgsloan2" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by mgsloan2 in "Dotter: Dotfile manager and templater written in Rust"]]></title><description><![CDATA[
<p>My homedir is just a git repo, similar to <a href="https://www.atlassian.com/git/tutorials/dotfiles" rel="nofollow">https://www.atlassian.com/git/tutorials/dotfiles</a>.  The .git folder has a different name so that git commands aren't accidentally applied to it.  What I love most about this is keeping my homedir clean - I can see what files are new (untracked) and either delete them or add to .gitignore</p>
]]></description><pubDate>Thu, 11 Sep 2025 05:39:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=45208198</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=45208198</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45208198</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Keyboards from my collection (2023)"]]></title><description><![CDATA[
<p>Very fun to peruse! Curious why the olivetti typewriter has such strangely shaped key caps.<p>While it seems like OLPC didn't really achieve the full vision of the project, I have some anecdata of success - my coworker got an OLPC when young (otherwise without access to computers), learned to code on it, and is now an awesome programmer.</p>
]]></description><pubDate>Tue, 02 Sep 2025 06:50:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=45099881</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=45099881</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45099881</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Zedless: Zed fork focused on privacy and being local-first"]]></title><description><![CDATA[
<p>Collection of data from code completions is off by default and opt-in.  It also only collects data when one of several allowlisted opensource licenses are present in the worktree root.<p>Options to disable crash reports and anonymous usage info are presented prominently when Zed is first opened, and can of course be configured in settings too.</p>
]]></description><pubDate>Wed, 20 Aug 2025 23:45:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=44967656</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=44967656</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44967656</guid></item><item><title><![CDATA[New comment by mgsloan2 in "MCP doesn't need tools, it needs code"]]></title><description><![CDATA[
<p>You could, but it is extremely expensive to train an LLM that is competitive on coding evals.  So, I was assuming use of a model someone else trained.<p>Also, if it is only trained on code, it's likely to miss out on all the world knowledge that comes from the rest of the data.</p>
]]></description><pubDate>Tue, 19 Aug 2025 01:18:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=44947236</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=44947236</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44947236</guid></item><item><title><![CDATA[New comment by mgsloan2 in "MCP doesn't need tools, it needs code"]]></title><description><![CDATA[
<p>Sounds like cool stuff, along the lines of structure editing!<p>The question is not whether it can work, but whether it works better than an edit tool using textual search/replace blocks.  I'm curious what you see as the advantage of this approach?  One thing that comes to mind is that having a cursor provides some natural integration with LSP signature help<p>Yes agentic loop with diagnostic feedback is quite powerful.  I'd love to have more controllable structured decode from the big llm providers to skip some sources of needing to loop - something like <a href="https://github.com/microsoft/aici" rel="nofollow">https://github.com/microsoft/aici</a></p>
]]></description><pubDate>Tue, 19 Aug 2025 01:11:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=44947205</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=44947205</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44947205</guid></item><item><title><![CDATA[New comment by mgsloan2 in "MCP doesn't need tools, it needs code"]]></title><description><![CDATA[
<p>I agree the current way tools are used seems inefficient.  However there are some very good reasons they tend to operate on code instead of syntax trees:<p>* Way way way more code in the training set.<p>* Code is almost always a more concise representation.<p>There has been work in the past training graph neural networks or transformers that get AST edge information.  It seems like some sort of breakthrough (and tons of $) would be needed for those approaches to have any chance of surpassing leading LLMs.<p>Experimentally having agents use ast-grep seems to work pretty well. So, still representing a everything as code, but using a syntax aware search replace tool.</p>
]]></description><pubDate>Mon, 18 Aug 2025 15:33:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=44941762</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=44941762</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44941762</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Wild – A fast linker for Linux"]]></title><description><![CDATA[
<p>See for example <a href="https://opensource.google/documentation/reference/using/agpl-policy" rel="nofollow">https://opensource.google/documentation/reference/using/agpl...</a><p>> Code licensed under the GNU Affero General Public License (AGPL) MUST NOT be used at Google.</p>
]]></description><pubDate>Sat, 25 Jan 2025 06:40:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=42819928</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=42819928</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42819928</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Studies suggest a drug-free nasal spray could ward off respiratory infections"]]></title><description><![CDATA[
<p>Doesn't seem like its proven to work, but looks like it can be purchased, called "Profi Nasal Spray".</p>
]]></description><pubDate>Sat, 05 Oct 2024 18:28:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=41751863</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=41751863</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41751863</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Writing documentation for your house"]]></title><description><![CDATA[
<p>Whoah, that interpretation seems pretty wild to me.  They put a lot of effort into building a pizza oven and someone else tore it down, and they should feel nothing about this?!  If an artist sells their painting they shouldn't care if the new owner paints over a section?<p>Beyond the sentimental attachment to the pizza oven, I'd be bothered by the sheer inefficiency of it.</p>
]]></description><pubDate>Wed, 29 Nov 2023 06:20:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=38456187</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=38456187</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=38456187</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Ask HN: Could you share your personal blog here?"]]></title><description><![CDATA[
<p><a href="https://mgsloan.com" rel="nofollow noreferrer">https://mgsloan.com</a> - 11 posts about unorthodox computer ergonomics. 6 posts about Haskell ideas / weird tricks.  Haven't posted in a couple years but would like to get back to it.  Notable HN discussions:<p>- <a href="https://news.ycombinator.com/item?id=28118381">https://news.ycombinator.com/item?id=28118381</a> - Supine Computing (2019)<p>- <a href="https://news.ycombinator.com/item?id=21842663">https://news.ycombinator.com/item?id=21842663</a> - Outdoor Computing with a Deck Desk</p>
]]></description><pubDate>Wed, 05 Jul 2023 00:53:52 +0000</pubDate><link>https://news.ycombinator.com/item?id=36594372</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=36594372</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=36594372</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Fairbuds XL review: noise-cancelling headphones you can fix"]]></title><description><![CDATA[
<p>Same path for me, I like the v-moda headphones a lot, but the hinge mechanism is way too fragile, and the charge port broke, so the bluetooth pair was my last v-moda headphone.  I also switched to beyerdynamic and have been very happy with them.  Only downside of this durability is that they are not foldable - would be great to have headphones with a high durability folding mechanism</p>
]]></description><pubDate>Sun, 14 May 2023 18:28:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=35940138</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=35940138</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35940138</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Fairbuds XL review: noise-cancelling headphones you can fix"]]></title><description><![CDATA[
<p>I love this concept!  When I got tired of replacing headphones in the past I got some beyerdynamic dt770 modded by jfunk.org.  They are repairable and durable.  Though they are not natively bluetooth, can use a short cable + qudelix 5k to make them wireless.  No noise cancelling.<p>Would be very nice to have durable / repairable noise cancelling headphones.  These headphones from fairbuds look great overall, but I'm skeptical of the durability of the hinges.</p>
]]></description><pubDate>Sun, 14 May 2023 18:25:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=35940107</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=35940107</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35940107</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Switching from C++ to Rust"]]></title><description><![CDATA[
<p>> if your type-system is sufficently strong to express this<p>No fanciness needed, just plain old sum types.  It is certainly possible to express those invariants directly in languages with a dependent type systems or refinement types like in liquid haskell - see <a href="https://ucsd-progsys.github.io/liquidhaskell-tutorial/Tutorial_05_Datatypes.html" rel="nofollow">https://ucsd-progsys.github.io/liquidhaskell-tutorial/Tutori...</a>.  It's typically much easier to reason about and use sum types, though.<p>Of course these examples are trivial and silly, but I see instances of these patterns all the time in big co software, and of course usually the invariants are far more complex but many could be expressed via sum types.  I've seen loads of bugs from constructing data that invalidates assumptions made elsewhere that could have been prevented by sum types, as well as lots of confusion among engineers about which states some data can have.<p>> Field X is only set if field Y is true<p>Original gnarly C style pattern:<p><pre><code>    struct TurboEncabulatorConfig {
        // When true, the turbo-encabulator must reticulate splines, and 'splines'
        // must be non-null. When false, 'splines' must be null.
        bool reticulate_splines;
        struct Splines *splines;
    };
</code></pre>
Rust (let's ignore pointer vs value distinction):<p><pre><code>    enum TurboEncabulatorConfig {
        NonReticulatingConfig,
        ReticulatingConfig { splines: Splines },
    }
</code></pre>
> If field X is non-null then field Y must be null and vice-versa.<p>Original gnarly C style pattern:<p><pre><code>    struct TurboEncabulatorConfig {
        // When non-null, lunar_waneshaft must be null. 
        struct Fan *pentametric_fan;
        // When non-null, pentametric_fan must be null.
        struct Shaft *lunar_waneshaft;
    };
</code></pre>
Rust:<p><pre><code>    enum TurboEncabulatorConfig {
        PentametricTurboEncabulator { pentametric_fan: Fan },
        LunarTurboEncabulator { lunar_waneshaft: Shaft },
    }</code></pre></p>
]]></description><pubDate>Tue, 14 Mar 2023 03:19:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=35146975</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=35146975</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35146975</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Switching from C++ to Rust"]]></title><description><![CDATA[
<p>In my experience with languages that lack concise sum types and pattern matching, you end up with data types that have lots of implicit invariants.  If you find yourself writing docs or thinking in your head things like "Field X is only set if field Y is true" or "If field X is non-null then field Y must be null and vice-versa", then these are indications that sum types would model the data better.  Then these invariants can be followed by construction, and it becomes clear what's available at data access - great for interface clarity, robustness, dev tools, morale, etc.<p>Relatedly, storing booleans is a smell, imho typically an enum or sum type is always better in languages that have concise syntax for these. True and False are meaningless without context, and so can easily lead to errors where they are provided to a different context or generally misused due to a misunderstanding about the meaning.</p>
]]></description><pubDate>Tue, 14 Mar 2023 00:46:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=35145651</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=35145651</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35145651</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Git-sim: Visually simulate Git operations in your own repos"]]></title><description><![CDATA[
<p>Yeah, but ref-log is scary to beginners (I suppose rebase is too!).  Rebase was a poor example, but even so, it is way easier to copy a snapshot number out of your cli and restore than it is to dig through your reflog for the right sha<p>ref-log doesn't save you in <i>so many situations</i>.  As you point out, you have to commit all the time for it to save you.  Even then, git repo corruption is possible and then you are hosed.<p>For example:<p>* a hard reset clears your working copy changes<p>* you pop a stash you didn't mean to, atop your working copy changes.  Now your working copy changes are intermixed with the stash and you have to manually decouple them.<p>* you accidentally stage hunks to your index and its tricky to unstage them because they are adjacent to other hunks<p>Such a tool also saves you from accidentally saving over your work in the text editor.  It generally makes it so that you don't need to be as careful.<p>So, generally, git commands that affect your working copy are not undo-able and can be very time consuming to undo if you have no proper time machine underneath your repo.  I happily have experienced the bliss of having this reassurance, but it is only within a proprietary env.</p>
]]></description><pubDate>Mon, 23 Jan 2023 00:35:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=34483988</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=34483988</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34483988</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Git-sim: Visually simulate Git operations in your own repos"]]></title><description><![CDATA[
<p>Pretty cool!<p>One idea I really like for avoiding VCS operation anxiety for beginners and experts alike is a filesystem layer that allows revert to any historical state.  You just have your bash prompt output the current snapshot number, and then can use that as the revert target if there's a botched rebase or so. Unfortunately I do not know of a nicely packaged way to do this, or how to do it at all with OSS tools (but I bet it is feasible!).</p>
]]></description><pubDate>Sun, 22 Jan 2023 18:16:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=34480384</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=34480384</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34480384</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Supine Computing (2019)"]]></title><description><![CDATA[
<p>That is true, this is my parent's hammock.  I own a dutchware chameleon hammock - see this post about using it for computing <a href="https://mgsloan.com/posts/ergo-update-hammock-under-deck/" rel="nofollow">https://mgsloan.com/posts/ergo-update-hammock-under-deck/</a></p>
]]></description><pubDate>Tue, 10 Aug 2021 14:51:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=28129563</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=28129563</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28129563</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Supine Computing (2019)"]]></title><description><![CDATA[
<p>Some have swappable cables!  Ergodoxes typically use TRRS audio cables.  Keyboardio uses ethernet between the two halves.<p>There are also some fully wireless split keyboards like the southpaw centromere.  I found the thumb keys to be too inward / too few for my taste.</p>
]]></description><pubDate>Tue, 10 Aug 2021 14:50:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=28129554</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=28129554</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28129554</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Supine Computing (2019)"]]></title><description><![CDATA[
<p>Hah, yes experimenting in life is good :)<p>If you want to see more wildness, a couple of my other posts are more unusual:<p>* <a href="https://mgsloan.com/posts/polarizer-glasses/" rel="nofollow">https://mgsloan.com/posts/polarizer-glasses/</a>
* <a href="https://mgsloan.com/posts/tree-based-computing/" rel="nofollow">https://mgsloan.com/posts/tree-based-computing/</a></p>
]]></description><pubDate>Tue, 10 Aug 2021 14:48:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=28129519</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=28129519</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28129519</guid></item><item><title><![CDATA[New comment by mgsloan2 in "Supine Computing (2019)"]]></title><description><![CDATA[
<p>For a while I had a misting setup during the summer, at my deck desk.  I didn't have any trouble with electronics.  These days I'm in Colorado which tends to be relatively dry.<p>One solution to sun is to use shade strategically - <a href="https://mgsloan.com/posts/tree-based-computing/#handling-the-sun" rel="nofollow">https://mgsloan.com/posts/tree-based-computing/#handling-the...</a></p>
]]></description><pubDate>Tue, 10 Aug 2021 14:47:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=28129510</link><dc:creator>mgsloan2</dc:creator><comments>https://news.ycombinator.com/item?id=28129510</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28129510</guid></item></channel></rss>