Today's #FreeSoftwareAdvent appreciation is for some of the Free Software languages that bring me both joy and income: Python & Golang I've used Python at $DAYJOB since version 2.3 (it got woefully stuck at 2.4 for WAAAAY too long, and finally switched to 3.x some time in the last 2–3 years) and it simplified so many automation tasks there. I've used dozens of programming languages in my life for various tasks, and the hard part is rarely *writing* the code, but rather *reading* the code. And I find it a LOT easier to come back and read old Python code than just about any other language. Meanwhile, Golang saved my bacon on a short-term contracting project where TB of (simple) CSV files needed to be processed, cross-referenced. Being able to spin up a pool of multithreading Go processes, have built in locking and hash-map structures, and operate on raw input buffers of bytes shaved a 3-day manual process down to about an hour involving running a single command. I find it pretty readable too, feeling a bit like C while ditching some of the most cumbersome aspects.
well today's #FreeSoftwareAdvent is a bit bittersweet. Back at the beginning of the month, I plotted all the projects on my remind(1) calendar, grouping various categories together. Two days ago, lynx¹, yesterday was Dillo², and today it was supposed to be #Firefox. Yet this week has been full of sad Firefox news, with them ignoring users' desires to keep AI rubbish out of the browser (or at least relegated to an optional plugin) The browser that I started using as Netscape, grew to be Communicator, that kinda became Phoenix, then shed the non-browser functions off to Thunderbird (already got mentioned³) and became Firefox. Despite the rise of Chromium/Chrome, I still use Firefox as my daily driver web-browser for the modern web (rather than the *pleasant* web where lynx & Dillo serve me much better). What used to be a "User Agent" has become something that no longer puts the *user* first. 😢 So in this time of wishes and gifts, I wish that the Firefox leadership team would take a strong look at what they're doing and change their course. ⸻ ¹ ² ³ image
Following yesterday's installment of lightweight web-browsing with lynx(1), today in #FreeSoftwareAdvent it's the @npub13645...0gn6 project. It's pretty much everything I want from a non-JavaScript enabled browser. It's fast. It's lightweight. It runs across all the architectures I use (I can't run FF or Chromium on my macppc or i386 hardware any more due, I believe, to JIT requirements). It's customizable (I have my own preferred CSS stylesheet that tends to make everything more readable rather than the hit-or-miss partial CSS support that can cause some sites to be unreadable). I've shared the anecdote many times before, but reading the Inconsolation blog¹ a number of years ago, I used dillo and literally had over 100 tabs open, yet top(1) reported Dillo using less than 100MB of RAM. Meanwhile, opening a single blank home-page in FF or Chromium doing absolutely nothing consumed more RAM than that. 🤯 So today I'm spreading some Dillo love 🥰 ⸻ ¹
Today in #FreeSoftwareAdvent it's lynx(1). Which is amusing because it's been scheduled for today on my calendar since the beginning of the month, but @npub198t8...hasj chose to share links(1) today as well, for many of the same reasons. 😆 It's been around for decades—I used it to browse gopherspace (and maybe WAIS?) in the 90s via a 1200 baud dial-up connection to a shell account and later the nascent WWW when it arrived. Sadly, ClownFlare, Google, and anti-AI-bot/scraper tech has made many formerly-accessible-with-lynx sites now inaccessible, some blocking by User-Agent, some blocking due to the lack of JavaScript support. But it has the right amount of usability and friction, so I can use it from my command-line-only writer-deck netbook to do a little research or read some HTML documentation, without getting sucked into the modern web. My custom configuration puts it in Advanced mode (no help-bar at the bottom), specifies vi-key-bindings, a custom color-scheme, uses links-and-form-fields-are-numbered making it easy to jump to them, and text-fields-require-activation so I don't get stuck in text input boxes when using j/k to scroll up/down in the document. I also have a couple shell wrapper-functions to invoke lynx on particular URLs (Wikipedia, dictionary/thesaurus/rhyming resources, web search, etc) with the CLI arguments filled in. I also have mutt configured to show text/html messages in lynx (either using `lynx -dump` and the internal pager, or using `m` from the attachments menu to view it interactively)
Today in #FreeSoftwareAdvent it's the venerable ssh(1)/sshd(8) While I grew up in an age where telnet(1) was my only option, the ssh folks made it a pretty drop-in replacement for the sorts of things I did with telnet, so switching was easy. With the exception of when I'm rebooting or our ISP is having issues, I almost always have at least one SSH connection open and likely more than one connection to other hosts. Even in the "security" of our LAN in the house, I still SSH between machines rather than use unencrypted connections for transfer. I love being able to run things remotely and use them locally, such as $ ssh me@remote dmesg | xsel -ib to put the remote machine's dmesg output on my system clipboard or $ tar czvf - /path/to/data | ssh me@remote 'cd /destination/path ; tar xzf -' to transfer a directory tree to a remote machine. It generally has sensible defaults, allows me to force key-based authentication rather than username+password auth. It allows me to limit $DAYJOB customers to SFTP-only access within their designated chroot directories, insulating them from each other. I use it to tunnel into work and forward my RDP VM's screen so I can access it locally with rdesktop(1) So many delightful little uses. Definitely worth reading @npub13n40...3h2h's SSH book to learn more:
TIL: $HOSTALIASES in FreeBSD Apparently you can set the $HOSTALIASES environment variable in FreeBSD (and maybe some Linuxen? but not OpenBSD AFAICT) to point to an alternate hosts file (instead of the default /etc/hosts) for re-mapping particular hosts. This would let you do something like $ HOSTALIASES=$HOME/hosts.txt myprog and any name-resolution that myprog(1) does will first consult the ~/hosts.txt file.
Today in #FreeSoftwareAdvent, today it's OpenSMTPD¹. In the past I've tried to set up Sendmail, Postfix, Exim, and qmail at various junctures, but found them all unwieldy in their configuration syntax. Macros and compiling them, or digging through dozens of config files for relevant settings. Lots of "here are thousands of settings, but don't change them unless you really know what you're doing." It drove me a bit crazy. Then OpenBSD folks created OpenSMTPD. The configuration syntax was sensible and simple. It didn't try to do everything, just adequate SMTP serving with some privsep. It was easy to point it at certificates that acme-client(1) obtains for me via httpd(8) interactions scheduled in cron(8), all within the base system. It's the MTA with OpenBSD's fingerprints of simplicity & security all over it. ⸻ ¹
Today in #FreeSoftwareAdvent, I want to appreciate OfflineIMAP/mbsync. Both have served me well for bringing a remote IMAP mailbox locally and keeping it in sync across multiple machines, allowing me to mow through mail even when offline, and then have reasonable confidence that everything will just sync back up when I go online again.