HNHacker News
TopNewBestAskShowJobs

networked

16,445 karma · joined December 20, 2011

Check out my favorites. I favorite comments about programming languages, operating systems, databases, and computer history and other interesting and amusing comments.

I have a website/personal wiki with a collection of links on various subjects: https://dbohdan.com/.

I edit my comments a lot (sorry).

My username means "connected to a network", not "network Ed". :-)

submissionscomments
networked··on Terminals should generate the 256-color palette
> Drawterm

Cool, thanks. Sadly, F-Droid tells me their build is too old for my version of Android.

networked··on Terminals should generate the 256-color palette
> Replicating the experience of using something like Smalltalk transcript window.

As far as I know from Pharo, the Smalltalk transcript logs plain text and is less capable than xterm. So what you care about is not the capabilities of the terminal but having a long-lived interactive session/REPL or a REPL integrated with an editor?

> No need for SSH to talk with Windows Core/Nano, it can be done via Web GUI administration, or PowerShell remoting.

I was thinking of the administrator connecting to Windows from their Mac or Linux/BSD machine. I don't know if that's a good idea compared to them getting a Windows VM and using Windows-to-Windows PowerShell remoting as you suggest.

networked··on Terminals should generate the 256-color palette
I don't think there is a client that will let me connect to 9front from Android, is there?

I see what you mean in this and the other comment. With 9front, you rely less on issuing commands to remote machines because you can directly access their resources. It's worth keeping in mind when comparing Plan 9 and Unix from a Unix user's perspective.

Being able to pick large fonts on the server isn't the same as leaving the fonts up to the client. When I use terminal emulators, SSH, and tmux, I can switch between different clients with different resolution, pixel density, and screen orientation and have the text display acceptably on each (minus text reflow for history, which is an issue).

> I consider the Sam regular expresions far more powerful than the vi keys themselves.

I agree, structural regular expressions seem like a better version of vi commands. It was reasonably easy to make some complex edits in https://github.com/martanne/vis when I tried it, and it felt like I'd only scratched the surface. I could see myself still using vis if it had tabs like Vim. (Tabs are a stated non-goal for vis.)

networked··on Terminals should generate the 256-color palette
Classic Xerox PARC-derived GUIs are very useful but not a replacement for the terminal. I also connect to my workstation over RDP, then use a terminal emulator.

Windows is a good example of what I mean. Windows system administration has become unmistakably more text- and console-centric over time with the rise of PowerShell. Windows has started shipping an SSH service and made its graphical interface optional on the server.

The web has avoided falling into the same trap. Web UIs are, for the most part, delivered to the user as hypertext rather than rio-style pixels. They rarely hard-require a mouse and have adapted well to touchscreens. Graphics in new web UIs is usually vector (SVG).

networked··on Terminals should generate the 256-color palette
(I didn't downvote you.) Plan 9 made some really cool design decisions, and I keep looking for places to use 9P. I also believe that Plan 9, as an artifact of its era, bet too heavily on the mouse and pixel-mapped graphics. Text, character-cell terminal emulation, and SSH won for good reasons. "GUI > terminal" is a separate matter from "Plan 9 > Unix".

In some important ways, even text with hacky escape codes is more useful and more robust than a fundamentally graphical interface. Text scales up and down with display size and pixel density. Text works over high-latency links and enables simple latency compensation like in Mosh. Text gives you universal copy-paste. Text is more accessible for humans and for machines.

I use a virtual terminal daily on my phone. If we literally used rio GUIs designed around the three-button mouse and desktop pixel density, it would be a lot less ergonomic. I'd like to see a successor to the VT220 lineage, but it's easier to imagine it built on text.

networked··on Common Lisp Screenshots: today's CL applications in action
GitHub and Codeberg links on the site don't open for me. ("To protect your security, codeberg.org will not allow Firefox to display the page if another site has embedded it. To see this page, you need to open it in a new window.") This is because of the use of frames:

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
      <html>
          <head>
              <title>Common Lisp Screenshots</title>
              <meta name="description" content="Today's Common Lisp applications in action">
              <meta name="keywords" content="">
              <meta name="generator" content="ORT - Ovh Redirect Technology">
              <meta name="url" content="https://simple.photo/vindarel/c352e2c0177b24786fb40041657485dd/common-lisp-screenshots/">
              <meta name="robots" content="all">
          </head>
          <frameset rows="100%,0" frameborder=no border=0>
              <frame name="ORT" src="https://simple.photo/vindarel/c352e2c0177b24786fb40041657485dd/common-lisp-screenshots/">
              <frame name="NONE" src="" scrolling="no" noresize>
              <noframes>
                  <body><a href="https://simple.photo/vindarel/c352e2c0177b24786fb40041657485dd/common-lisp-screenshots/">Click here</a><hr></body>
              </noframes>
          </frameset>
      </html>
You can fix this by replacing the OVH feature with a regular redirect, like an `index.html` with a `<meta>` tag:

  <meta http-equiv="refresh" content="0; url=https://simple.photo/vindarel/c352e2c0177b24786fb40041657485dd/common-lisp-screenshots/">
If possible, you can also fix it by making your links on the https://simple.photo/ page open in a new window.
networked··on Do not apologize for replying late to my email
"Sorry, not sorry I'm sorry."
networked··on Kimi K2.5 Technical Report [pdf]
Preserving the examples for history. I wish HN had a <details> tag. The closest would be to collapse this comment.

Edit: Thanks, moderator. :-)

---

Turn 1, user:

is replacing my main PC with a NeXTcube a good idea?

---

Turn 2, K2.5 (bold font replaced with "*foo*"):

That's a very interesting question! The NeXTcube is a historically significant machine (famously used by Tim Berners-Lee to create the World Wide Web), but I need to be honest with you: *no, it would not be a good idea to replace your main PC with a NeXTcube* for practical modern use.

Here's why:

*Hardware Limitations*

- *Released in 1988* with a 25-33 MHz Motorola 68030 processor

- *8-64 MB of RAM* (compared to modern PCs with 16-64 GB)

- *No modern connectivity*: No USB, Wi-Fi, Bluetooth, or Ethernet as we know it

- *Display*: Monochrome or limited color, low resolution by today's standards

*Software Ecosystem*

- Runs *NeXTSTEP* (which evolved into macOS), but software support ended decades ago

- No modern web browsers, office suites, or development tools

- Cannot run Windows, modern Linux, or contemporary macOS applications

*Practical Realities*

- Finding working hardware is difficult and expensive (collectors' items)

- Replacement parts are scarce and costly

- No security updates for 25+ years

- File format compatibility issues with modern systems

*What You Could Use It For*

- Historical computing experience

- Running legacy NeXTSTEP software

- Museum piece or collector's item

- Learning about computing history

The Better Alternative

If you're drawn to the NeXT aesthetic or philosophy, consider:

- *Modern macOS* (direct descendant of NeXTSTEP)

- *Linux with a tiling window manager* (similar workflow)

- *Vintage computing as a hobby* alongside your main PC

Would you like suggestions for achieving a similar experience or workflow on modern hardware?

---

Turn 2, K2 (no bold font):

Short answer: No—unless your goal is specifically to collect or experiment with a historic machine, a NeXTcube is a terrible day-to-day replacement for a modern PC.

Why it fails as a “main” computer today

1. 30-year-old hardware

25 MHz 68040, 16–64 MB RAM, 400 MB SCSI disk (if you’re lucky), no built-in Ethernet, no USB, no Wi-Fi, no audio-in, 2-bit grayscale display. You will feel the slowness in everything from un-zipping a file to loading a web page.

2. Obsolete software base

NeXTSTEP 3.3 is gorgeous but frozen in 1995. No modern browser build, no TLS 1.3, no video codecs past MPEG-1, no Dropbox/OneDrive/Zoom/Slack/Steam/Spotify. You can ssh out, but you can’t run contemporary apps.

3. Storage and connectivity pain

SCSI-2 drives are dying; 50-pin replacements cost more per GB than a 4-TB NVMe stick. Getting files on/off the machine usually involves FTP-over-Ethernet or burning a CD-ROM on another computer.

4. No security updates

The last patch was released before the commercial web really existed. Putting it on the open Internet is asking to be scanned and possibly exploited within minutes.

5. Display and peripherals

The original 17" NeXT MegaPixel monitor is fixed-frequency 1120×832@68 Hz grayscale. Adapters to VGA exist, but color is impossible and refresh rates annoy modern LCDs. Sound is 16-bit 22 kHz mono; the optical drive is a 660 MB magneto-optical cartridge.

6. Power and parts

The cube power supply is a custom 350 W linear unit that runs hot; capacitors are drying out. When it dies you will be scavenging eBay or recapping it yourself. Spare motherboards cost more than a whole used ThinkPad.

7. Productivity software

There are serviceable versions of Mathematica, FrameMaker, Lotus Improv and OmniWeb 3.x, but file-format compatibility stops at Office 97-era documents. You will constantly round-trip files through another machine.

What it is good for

- Historical research, museum exhibits, retro-programming in Objective-C 1.0 or 68k assembly.

- Demonstrating the birth of the World-Wide Web (Tim Berners-Lee’s first server ran on a NeXT).

- Enjoying the UI that later became macOS (AppKit, Dock, Services, .app bundles).

- Collecting: a working color NeXTcube with turbo slab and original laser printer is a conversation piece worth several thousand dollars.

Practical compromise

Keep your modern PC (or a quiet mini-PC/Mac mini) for real work and run a NeXT emulator instead:

- Previous (68k emulator) boots NeXTSTEP 3.3 on macOS or Linux.

- VirtualNeXT (based on Previous) for Windows.

- QEMU’s “next” target is improving.

You get the look-and-feel, can compile legacy code, and still have 4K video calls when you need them.

Bottom line

A NeXTcube is a beautiful, important machine—buy one if you love vintage hardware—but do not voluntarily make it the computer you rely on to pay bills, join Zoom meetings, or play YouTube.

networked··on Nintendo DS code editor and scriptable game engine
I agree. It seems like interpreting one instruction per frame is the developer's way to guarantee real-time performance. I don't want to discourage the developer from experimenting with this design. What I think they should do is determine the most instructions they can interpret each frame.

I like the idea of on-device programming like this. While I haven't used it, I know there is a DSiWare application Petit Computer that lets you implement more complex (sprite-based) games in a Basic dialect: https://en.wikipedia.org/wiki/Petit_Computer. As DSiWare, it has an official video trailer: https://www.youtube.com/watch?v=4AYlEo3rJHs.

networked··on Comic-Con Bans AI Art After Artist Pushback
> If you do it daily, in-house, for your own products... you might just have the title "Art Director."

"Art director" seems accurate for what a skillful user of art generators with a specific vision does.

I have also thought that since people find "director" lofty (thanks to auteur theory?) and therefore pretentious to assume, one could borrow "producer" from Vocaloid: https://vocaloid.fandom.com/wiki/Producer (alternative front end: https://antifandom.com/vocaloid/wiki/Producer).

networked··on Ask HN: Share your personal website
https://dbohdan.com/#meta is my personal wiki. Recently added pages include the first complete transcript of "The Dragon Speech" by game designer Chris Crawford and how I made Claude rework elegiac poems into Rupi Kaur-style "Instapoetry" using Gwern Branwen's technique.

http://dbohdan.sdf.org/ is my hobby site about the SDF Public Access Unix System, the Small Internet, and NetBSD.

networked··on Scott Adams has died
Dilbert's Desktop Games (https://en.wikipedia.org/wiki/Dilbert%27s_Desktop_Games) was part of my childhood. As a slightly older kid in Ukraine, while I hadn't heard of Dilbert, I could understand the setting with my knowledge of English and some idea of how tech companies worked. (I already wanted to be a programmer.) I thought Techno Raiders was a pretty cool game, but also, this game collection was an introduction to the idea that the world of office work was kind of ridiculous and people were kind of incompetent.
networked··on Jeffgeerling.com has been migrated to Hugo
https://rakhim.org/honestly-undefined/19/
networked··on Jeffgeerling.com has been migrated to Hugo
I'm also happy with the freedom and stability of a single-purpose static site generator. My previous project, Tclssg, was public and reusable from the start. This had big upsides: I learned to work with users and was compelled to implement features I wouldn't have. I actually wrote documentation. Seeing others use it was one of the best parts of the work. However, it also put constraints on what I could do. I couldn't easily throw away or radically change features, like how templates are rendered by default. With an SSG that's only for my site, I can.

If I were maintaining multiple large sites or working with many collaborators, I'd rely on something standard or extract and publish my SSG. For a personal site, I believe custom is often better.

The current generator is around 900 SLOC of Python and 700 of Pandoc Lua. The biggest threats to stability have been my own rewrites and experimentation, like porting from Clojure to Python. I have documented its history on my site: https://dbohdan.com/about#technical-history.

networked··on Jeffgeerling.com has been migrated to Hugo
If you use an off-the-shelf binary for any tool, you can put the binary in `${project}/bin/`, add it to `.gitignore`, document the download URL in `README.md` or an install script, and commit the checksum in a project-wide `SHA256SUMS` file (or `B3SUMS`, etc.). It's like a lo-fi version of Git LFS.
networked··on Go away Python
> You mean that the user should locally configure the machine to ensure that the standardized name points at something that can solve the problem, and then accepts the quirks of that choice, yes?

I was thinking that until I read the forum thread and Stephen Rosen's comments. Now I'm thinking the most useful meta-runner would just try popular runners in order.

I have put up a prototype at https://github.com/dbohdan/python-script-runner.

networked··on Go away Python
Perhaps a case for standardizing on an executable name like `python-script-runner` that will invoke uv, pipx, etc. as available and preferred by the user. Scripts with inline metadata can put it in the shebang line.

I see it has been proposed: https://discuss.python.org/t/standardized-shebang-for-pep-72....

networked··on Go away Python
Inline script metadata itself is not tied to uv because it's a Python standard. I think the association between the two comes from people discovering ISM through uv and from their simultaneous rise.

pipx can run Python scripts with inline script metadata. pipx is implemented in Python and packaged by Linux distributions, Free/Net/OpenBSD, Homebrew, MacPorts, and Scoop (Windows): https://repology.org/project/pipx/versions.

networked··on Go away Python
You can use https://github.com/erning/gorun as a Go script runner. It lets you embed `go.mod` and `go.sum` and have dependencies in Go scripts. This is more verbose than Python's inline script metadata and requires manual management of checksums. gorun caches built binaries, so scripts start quickly after the first time.

Example:

  #! /usr/bin/env gorun
  //
  // go.mod >>>
  // module foo
  // go 1.22
  // require github.com/fatih/color v1.16.0
  // require github.com/mattn/go-colorable v0.1.13
  // require github.com/mattn/go-isatty v0.0.20
  // require golang.org/x/sys v0.14.0
  // <<< go.mod
  //
  // go.sum >>>
  // github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
  // github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
  // github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
  // github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
  // github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
  // github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
  // github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
  // golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
  // golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
  // golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
  // golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
  // <<< go.sum

  package main

  import "github.com/fatih/color"

  func main() {
      color.Green("Hello, world!")
  }
The shebang line can be replaced for compatibility with standard Go tooling:

  /// 2>/dev/null ; gorun "$0" "$@" ; exit $?
  //
  // go.mod >>>
  // ...
networked··on Ruby 4.0.0
> Adding static typing to a dynamic language mostly gives you the disadvantages of both, without a lot of benefits.

Can you elaborate? I don't share this experience, and I'm interested in bringing static typing to a language without static typing, so I'd like to understand. In new Python and JavaScript codebases, optional typing has had clear benefits for refactoring and correctness and low costs for me. Legacy codebases can be different.

networked··on Ask HN: Why Did Python Win?
Previously:

- Perl's decline was cultural - https://news.ycombinator.com/item?id=46175112 - Dec 2025 (460 comments)

- (!) Ask HN: Why did Python win? - https://news.ycombinator.com/item?id=37308747 - Aug 2023 (839 comments)

- Ask HN: Why is Python so popular for ML/DS? - https://news.ycombinator.com/item?id=16207834 - Jan 2018 (19 comments)

- Ask HN: Is Python dying? - https://news.ycombinator.com/item?id=11100251 - Feb 2016 (352 comments)

- Python is now the most popular introductory language at top U.S. universities - https://news.ycombinator.com/item?id=8001337 - July 2014 (362 comments)

- Ask HN: Why Python over Ruby? - https://news.ycombinator.com/item?id=682101 - July 2009 (196 comments)

- Ask HN: What does Ruby have that Python doesn't? - https://news.ycombinator.com/item?id=283639 - Aug 2008 (223 comments)

networked··on From Azure Functions to FreeBSD
Even with daemon(8), PID files and the lack of process supervision might be my least favorite aspect of FreeBSD, an OS I like overall. Not long ago, I wanted to avoid running a custom service that way on a fresh FreeBSD server. After researching my options, I found an adequate solution in the daemontools family. I'd heard of daemontools but hadn't paid much attention to it.

My service has been managed by runit and, most recently, nitro (https://github.com/leahneukirchen/nitro). Both have run as the service's user. They supervise the process and handle logging. I have found the design of daemontools and its derivatives runit and nitro elegant; it lives up to the reputation.

networked··on Using Python for Scripting
You can use so-called "exec magic" instead of `env -S`. Here is an explanation with Python examples: https://dbohdan.com/scripts-with-dependencies#exec-magic (disclosure: my site). In short:

  #! /bin/sh
  "exec" "/usr/bin/env" "uv" "run" "--quiet" "--script" "$0" "$@"
  # /// script
  # dependencies = [
  #   "cowsay",
  # ]
  # ///
  import cowsay
  cowsay.cow("Hello, world!")
On systems that can't run uv, like NetBSD and OpenBSD, switch to pipx:

  #! /bin/sh
  "exec" "/usr/bin/env" "pipx" "run" "$0" "$@"
  # ...
networked··on X210Ai is a new motherboard to upgrade ThinkPad X201/200
According to https://old.reddit.com/r/thinkpad/comments/1d13sb6/should_i_...:

> - Display lid is very fragile at the top where the wifi antennas are and can easily crack there

networked··on Zigbook Is Plagiarizing the Zigtools Playground
I notice again I haven't internalized how much https://tvtropes.org/pmwiki/pmwiki.php/Main/SuspiciouslySpec... really happens.
networked··on Migrating the main Zig repository from GitHub to Codeberg
> We already have FreeBSD CI; machines for the other 3 are arriving at my place tomorrow as it happens.

That's great. I hope it works out, and you have CI for NetBSD, OpenBSD, and illumos, too.

Go's support for NetBSD has been a big boon to the more casual NetBSD user who isn't going to maintain a port. It means a random Go open-source project you use probably works on NetBSD already, or if it doesn't, it can be fixed upstream. Maybe Zig could play a similar role.

It's a shame GitHub doesn't have native CI even for FreeBSD on x86-64. I can see the economic case against it, of course. That said, the third-party Cross-Platform GitHub Action (https://github.com/cross-platform-actions/action) has made Free/Net/OpenBSD CI practical for me. I have used it in many projects. The developer is currently working on OmniOS support in https://github.com/cross-platform-actions/omnios-builder.

networked··on Migrating the main Zig repository from GitHub to Codeberg
> For coding, you can use AI to write your code. For software engineering, you can't.

This is a pretty common sentiment. I think it equates using AI with vibe-coding, having AI write code without human review. I'd suggest amending your rule to this:

> For coding, you can use AI. For software engineering, you can't.

You can use AI in a process compatible with software engineering. Prompt it carefully to generate a draft, then have a human review and rework it as needed before committing. If the AI-written code is poorly architected or redundant, the human can use the same AI to refactor and shape it.

Now, you can say this negates the productivity gains. It will necessarily negate some. My point is that the result is comparable to human-written software (such as it is).

networked··on Chrome Jpegxl Issue Reopened
I didn't realize WebP was limited-RGB in addition to 4:2:0. According to RFC 9649, this is accurate. While the ITU-R Recommendation 601 on color is only a "SHOULD" in the RFC, you'd need a custom decoder to break out of limited RGB:

> The VP8 specification describes how to decode the image into Y'CbCr format. To convert to RGB, Recommendation 601 [REC601] SHOULD be used. Applications MAY use another conversion method, but visual results may differ among decoders.

networked··on Go Cryptography State of the Union
I evaluated but didn't adopt https://github.com/awnumar/memguard in Go. No matter how well-implemented and reliable it is, I can't pass its secrets to https://github.com/FiloSottile/age.

I assume all process memory may contain residual secrets. As a mitigation in a password manager and an encrypted file editor, I prevent process memory from being swapped to disk with https://pkg.go.dev/syscall#Mlockall.

networked··on A new book about the origins of Effective Altruism
This sounds like what philosophers call "indirect consequentialism" or the related "two-level utilitarianism". The idea is what you say: aim for good outcomes, but use rules or virtues as heuristics because direct consequential reasoning is impractical, and it's easy to go wrong with it. If you're interested, take a look at https://plato.stanford.edu/entries/consequentialism/#:~:text... and https://en.wikipedia.org/wiki/Two-level_utilitarianism.
← PreviousPage 4 of 30Next →