<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: bwhmather</title><link>https://news.ycombinator.com/user?id=bwhmather</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 09 May 2026 02:56:56 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=bwhmather" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by bwhmather in "StarFighter 16-Inch"]]></title><description><![CDATA[
<p>You are not wrong!  That certainly looks like the intention.</p>
]]></description><pubDate>Thu, 07 May 2026 13:59:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48049560</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=48049560</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48049560</guid></item><item><title><![CDATA[New comment by bwhmather in "StarFighter 16-Inch"]]></title><description><![CDATA[
<p>I'm also the happy owner of a StarLite Mk IV.  The perfect travel laptop.  Thin, light, fanless, excellent keyboard and touchpad, matt screen, rock solid chassis, good battery life.  I'm dreading the day when it finally breaks as there's nothing comparable on the market today.  I wish they could do another run.<p>Very different niche from the StarFighter but StarLabs make excellent machines.</p>
]]></description><pubDate>Wed, 06 May 2026 12:47:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=48035594</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=48035594</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48035594</guid></item><item><title><![CDATA[New comment by bwhmather in "Ask HN: Can I see your scripts?"]]></title><description><![CDATA[
<p>I use this script, saved as `rerun`, to automatically re-execute a command whenever a file in the current directory changes:<p><pre><code>    #!/usr/bin/sh

    while true; do
        reset;
        "$@";
        inotifywait -e MODIFY --recursive .
    done
</code></pre>
For example, if you invoke `rerun make test` then `rerun` will run `make test` whenever you save a file in your editor.</p>
]]></description><pubDate>Mon, 15 Aug 2022 12:50:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=32469012</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=32469012</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32469012</guid></item><item><title><![CDATA[Show HN: BDC – Ergonomic, sub 1KiB virtual DOM library]]></title><description><![CDATA[
<p>BDC is a simple library for updating the DOM to match a javascript description.
Does not require JSX or a compilation step.<p><pre><code>    clobber(
      document.body,
      h("marquee", [
        h("span", {"style": "font-weight: bold"}, "Hello"), ", ",
        h("blink", "world"), "!",
      ]),
    );
</code></pre>
Very fast to first render, moderately slow on subsequent updates.<p>Prompted by the post on millionjs, which compiles user code to hit the same outrageously small size target.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=32293880">https://news.ycombinator.com/item?id=32293880</a></p>
<p>Points: 23</p>
<p># Comments: 4</p>
]]></description><pubDate>Sun, 31 Jul 2022 07:17:11 +0000</pubDate><link>https://github.com/bwhmather/bdc-js</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=32293880</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=32293880</guid></item><item><title><![CDATA[Show HN: SSort – The Python source code sorter]]></title><description><![CDATA[
<p>Hi HN - SSort is a tool I've been working on that sorts the contents of python modules in dependency order.  It's like isort, but for the rest of the file.<p>It's starting to get a bit of momentum.  We have users across a few different companies and some consistent contributors (thank you, in particular, jgberry).  We're reaching a point of stability, and would like to gather some final feedback before hitting the big 1.0.</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=31395133">https://news.ycombinator.com/item?id=31395133</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Mon, 16 May 2022 09:52:27 +0000</pubDate><link>https://github.com/bwhmather/ssort</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=31395133</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=31395133</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>Have pushed fix as version 0.10.0.  Thank you very much for reporting.</p>
]]></description><pubDate>Tue, 08 Feb 2022 23:59:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=30266614</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30266614</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30266614</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>By the way, I have raised a ticket to finalize method order before 1.0 release (<a href="https://github.com/bwhmather/ssort/issues/11" rel="nofollow">https://github.com/bwhmather/ssort/issues/11</a>).  Please follow and comment if you would like to see a change.</p>
]]></description><pubDate>Tue, 08 Feb 2022 23:43:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=30266485</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30266485</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30266485</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>I'll try to add some better ones over the weekend.  This should be a start.</p>
]]></description><pubDate>Tue, 08 Feb 2022 23:38:56 +0000</pubDate><link>https://news.ycombinator.com/item?id=30266449</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30266449</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30266449</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>It is a bit backwards, but in exchange you get predictability<p>With backwards sorting you know that, unless there is a cycle, you can always scroll up from a call site to find the definition or down from a definition to see where it is used.  With forwards sorting you can scroll down to find a definition, unless the function was imported, or used as a decorator somewhere, or called by something that was used as a decorator, or used in some other way that I haven't thought of.<p>My personal experience is that this predictability is hugely useful.  It almost entirely obviates the need for jump-to-definition within a module, and gives modules a very obvious shape and structure.</p>
]]></description><pubDate>Tue, 08 Feb 2022 22:00:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=30265412</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30265412</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30265412</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>Will do.  Examples directory isn't terribly helpful as documentation as it mostly contains real code with problematic syntax (and compatible licensing) that tripped up ssort when I ran it on a copy of my pip cache.  I will move it into tests to avoid confusion</p>
]]></description><pubDate>Tue, 08 Feb 2022 19:39:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=30263448</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30263448</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30263448</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>Implementation details at the top.  Python is a scripting language so modules are actually evaluated from top to bottom.  Putting high level logic up top is nice when you just have functions, which defer lookup until they are called, but you quickly run into places (decorators, base classes) where it doesn't work and then you have to switch.  Better to use the same convention everywhere.  You quickly get used to reading a module from bottom to top.</p>
]]></description><pubDate>Tue, 08 Feb 2022 19:07:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=30262936</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30262936</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30262936</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>isort only sorts imports.  ssort will sort all other statements within a module so that they go after any other statements they depend on.  The two are complementary and I usually run both.</p>
]]></description><pubDate>Tue, 08 Feb 2022 18:59:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=30262817</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30262817</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30262817</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>One thing worth mentioning is that the `git blame` ignore file trick doesn't work as well with ssort as it does with black because the changes ssort makes tend to be much less local.</p>
]]></description><pubDate>Tue, 08 Feb 2022 17:54:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=30261837</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30261837</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30261837</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>Yup, that's a bug.  All assignments are treated as properties and moved to the top.  Fix to follow shortly.</p>
]]></description><pubDate>Tue, 08 Feb 2022 17:53:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=30261814</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30261814</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30261814</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>I've had the same problem with pydantic.  Currently, properties are special cased and moved to the top.  Everything else, including classes, is grouped with methods.  Meta classes will end up somewhere in the middle, which is probably the worst possible case.<p>SSort is currently used for several hundred kilobytes of python so I'm wary, but if I'm going to make a breaking change before 1.0 then I think this is likely to be it.</p>
]]></description><pubDate>Tue, 08 Feb 2022 17:48:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=30261723</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30261723</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30261723</guid></item><item><title><![CDATA[New comment by bwhmather in "Django: Reformatted code with Black"]]></title><description><![CDATA[
<p>Shameless plug:  For people who like black, I've been working on ssort[0], a python source code sorter that will organize python statements into topological order based on their dependencies.  It aims to resolve a similar source of bikeshedding and back and forth commits.<p>0: <a href="https://github.com/bwhmather/ssort" rel="nofollow">https://github.com/bwhmather/ssort</a></p>
]]></description><pubDate>Tue, 08 Feb 2022 16:55:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=30260874</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=30260874</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30260874</guid></item><item><title><![CDATA[New comment by bwhmather in "Fortunately, I don't squash my commits"]]></title><description><![CDATA[
<p>Commit history serves two largely separate purposes:<p>1) To provide a code-level record of what has changed in individual files and why.<p>2) To provide a high-level record of what features were introduced and what bugs were fixed over a period of time.<p>Often people will forget about one of them when arguing for a particular approach.<p>Squashing can make 2 easier but annihilates 1.  Rebasing gives you 1 but makes 2 difficult, or requires that you track high level changes in an external system.  In theory, approaches using merge commits can give you both but they are often difficult to apply in practice.</p>
]]></description><pubDate>Mon, 05 Oct 2020 12:13:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=24686987</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=24686987</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=24686987</guid></item><item><title><![CDATA[New comment by bwhmather in "Deposit of rare-earth minerals off Japan could supply world for centuries (2018)"]]></title><description><![CDATA[
<p>To access an equivalent amount of mass from the moon you would need to strip mine it to a depth of about 23.5km.  On earth it would be about 1km.  Your point about losing a lot of it as reaction mass still stands, but 4% of the moon is actually quite a lot.</p>
]]></description><pubDate>Fri, 31 May 2019 15:51:33 +0000</pubDate><link>https://news.ycombinator.com/item?id=20062015</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=20062015</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20062015</guid></item><item><title><![CDATA[New comment by bwhmather in "Fast incremental sort"]]></title><description><![CDATA[
<p>The smoothsort variant of heap sort might be a better alternative.  It can be implemented in-place like an ordinary heap sort, but unlike an ordinary heap sort the root will be at the end of the heap where you want the elements to end up when they've been popped.  The whole array, including the fully sorted part, will remain a valid heap so you can continue to add new elements efficiently.</p>
]]></description><pubDate>Sun, 24 Apr 2016 19:32:32 +0000</pubDate><link>https://news.ycombinator.com/item?id=11560989</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=11560989</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=11560989</guid></item><item><title><![CDATA[New comment by bwhmather in "Systemd has 6 service startup notification types, and they're all wrong"]]></title><description><![CDATA[
<p>Option 1 is already provided.  The sd_notify function is simply a convenience wrapper for sending messages on a socket specified by the NOTIFY_SOCKET environment variable.<p>See the notes in sd_notify(3) or <a href="https://lists.debian.org/debian-ctte/2013/12/msg00230.html" rel="nofollow">https://lists.debian.org/debian-ctte/2013/12/msg00230.html</a> for a simple alternative implementation.  Admittedly could be better documented.<p>edit: point to notes section</p>
]]></description><pubDate>Wed, 28 May 2014 13:06:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=7809675</link><dc:creator>bwhmather</dc:creator><comments>https://news.ycombinator.com/item?id=7809675</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=7809675</guid></item></channel></rss>