RSSAmplifier

Blog

boringcactus

boringcactus.comRSS feed ↗39 posts

Latest posts

I Was Previously Job Hunting

My employer’s remote work policies are changing, but I was granted an exception, so I am not looking for a new job anymore. Previously: My employer’s remote work policies are changing, and Salt Lake City isn’t “commutable distance” from Boston, so I’m looking for a new job. If you’re hiring software developers (remote in the US, or hybrid in Salt Lake City) to work on something that’s prosocial…

A 2025 Survey of Rust GUI Libraries

I did this in 2020 and then again in 2021 , but I’m in the mood to look around again. Let’s look through Are We GUI Yet? and see what’s up these days. The task today is to have a text label and an input field that can change the text in the label. In React, for example, this is basically free: const Demo = ( ) => { let [ state , setState ] = useState ( "Hello, world!" ) ; return ( < div > < p > {…

Status Update

been a minute, hasn’t it? i’ve been mostly active on cohost , but it’s shutting down. this means two things: i expect to be more active on here moving forwards, because cohost was the easiest place i had to do long-form writing, and i haven’t made this blog much easier to write on but it has the advantage of not being read-only as of last week. at some point soon i will be importing some to most…

Eggbug Forever: a custom minion mod for FFXIV

The real eggbug was the friends we made along the way. We carry him with us forever. A very simple import of Xenon Fossil’s low-poly eggbug model replacing the Wind-up Airship and/or the Great Serpent of Ronka (the Great Serpent animations are adorable but the rigging is a little janky so the Wind-up model may be better for gposing). XIV Mod Archive | Heliosphere (30 Sep 2024) eggbug forever. see…

Abdication Is Not Simplicity, or cat -v Considered Harmless

in some sense, the Brainfuck programming language is extremely simple. it only has eight instructions! an intermediate programmer could write an interpreter in an afternoon! that's so simple it borders on trivial! specifically, Brainfuck is simple to implement . using Brainfuck, on the other hand, is so self-evidently a bad idea that it's the entire point. even the Wikipedia “hello world” snippet…

the browser is a terrible place for art

condensation on the shower door is a more stable platform to develop for than the web. i’ve grumbled repeatedly before about how the web’s lack of actual versioning is a nightmare hellscape from satan, but i may as well rehash that even though it’s not the thing i’m mad about now. Java 9, for example, adds some features that were not present in Java 8, and you can decide whether to develop for…

No Man’s Sky …unless?

i chose to build a hazard control room instead of a tavern in my settlement; my citizens aren’t very happy, but my colony was in debt. i don’t speak the language very well, though, so when i talk to the citizens i don’t know what they’re saying. and it’s not particularly my colony, so much as i saved them from Sentinels one time and was immediately elected mayor. the second decision i had to make…

i got ⋖Builder of the Realm⋗ on the cloud DC

i had hoped to get ⋖Honorary Academic⋗ but obviously that's not happening. also, it's basically impossible to finish the lv50 quests since they all require tier 3 combat materia which nobody has (i tried transmuting but it's very inefficient so i didn't get anything good). however, i did still level all the DoH/DoL through ARR in less than a week. never do this. if you aren't aware, FFXIV is…

25-Hour Time (and the Secret Third Half of the Day)

you know how if you're up past midnight, on some level it's still the same day until you go to bed, no matter what the calendar says? well, if you've ever wished that there was notation to unambiguously refer to a current date and time when the current date is somewhat vibes-based, you're actually in luck, because this is a solved problem, although depending on your preferred time notation it may…

the Derivative Gardens Misattribution-OnlyCommercial-ShareUnlike 6.9 Unportable License

You are free to: Share — copy and redistribute the material in any medium or format Adapt — remix, transform, and build upon the material Under the following terms: Misattribution — You must give slightly inaccurate credit and provide a link to the wrong license. You may do so in any unreasonable manner. OnlyCommercial — You may not use the material for noncommercial purposes. Additional…

two heresies about link rot

the term itself is fascinating. there is nothing natural or organic about a hyperlink, i've never seen anyone call a working link alive, and yet a broken link is dead and links becoming broken over time is rot. the breaking of a link can, depending on the context, be frustrating, tragic, amusing; this it has in common with the more conventional kind of death. but we recognize that to live is to…

UUID versions through the ages

UUIDs are neat. y'know, cfbff0d1-9375-5685-968c-48ce8b15ae17 type of shit. if you're like me until a few days ago, all you know about the types of UUID is that v4 is the good one. but why are there other ones? is there a secret better one? why are the dashes asymmetrical? let's take a (roughly paraphrased from wikipedia and probably not quite accurate) look. wait why even sometimes you need an ID…

some axes for a taxonomy of open source

maintenance effort and expectations: professionally maintained / casually maintained / not maintained source of priorities: owner-driven / community-driven desire for input: PRs welcome / issues welcome / view-only license standards: bare minimum / give code back / don't be evil / be specifically good how bills get paid: not users' problem / crowdfunding / selling support / we productized the…

writing balanced elevenary in the ogham script

for no particular reason digits, from negative five to positive five: ᚅ ᚄ ᚃ ᚂ ᚁ ᚋ ᚆ ᚇ ᚈ ᚉ ᚊ (romanized as N S F L B M H D T C Q) radix point ᚖ (left as . when romanizing) a few nice values: ᚆᚅᚈᚖᚆᚊᚇᚋᚅ , ᚈᚊᚇ , ᚈᚖᚇᚅᚆᚊᚆ fuck around with it y'self: https://codepen.io/boringcactus/pen/abGwgoG

A 2021 Survey of Rust GUI Libraries

(Note from the future: I did this again in 2025 .) A year and a half ago I looked at a bunch of different Rust GUI libraries ; that's a long time, so let's see if things have changed. As before, some context: List of libraries is drawn from Are We GUI Yet . I work on Windows, and I am lazy; as such, any library that requires more setup on Windows than "add it to Cargo.toml " is disqualified. I'm…

An Anti-License Manifesto

software licenses are unavoidably a legal tool. the legal system, in the US and approximately everywhere else, is not a machine that leads to justice. therefore, software licenses do not lead to justice. we cannot software license our way to a better world. as such, we should and must software license our way to a stranger world. permissive licenses and copyleft licenses are both tools of the…

How to Develop a Deeply Unhealthy Relationship with Twitter

Follow some cool people on Twitter. Spend time on Twitter. See a cool person quote tweet some dipshit to be mad about them, or retweet a reply to some dipshit that dunks on or dismantles them, or say something controversial yet correct where you just know a bunch of the replies and quote tweets are going to be dipshits. Think to yourself "damn, it sucks that people on here are being dipshits. but…

Non-FSF Copyleft Usage

The Free Software Foundation has decided they'd rather hang out with a sex pest than have an ounce of credibility, so fuck em. Let's look at the copyleft licenses they didn't write and see how they're used. I'll be using the Blue Oak Council's list of copyleft licenses here, because I don't know of a good other way to find specifically copyleft licenses. I'll be searching GitHub for…

Cactus&#39;s Obvious, Intuitive Naming Scheme

It's well-established that naming things is one of the two hardest problems in computer science (along with cache invalidation and off-by-one errors). So I solved naming. If you've got a project that needs a name, here you go. The ingredients are simple: Your name. The word "obvious". A good adjective. The kind of thing you've made. The canonical example, from which this scheme was…

Can We Please Move Past Git?

Git is fundamentally a content-addressable filesystem with a VCS user interface written on top of it. — Pro Git §10.1 Most software development is not like the Linux kernel's development; as such, Git is not designed for most software development. Like Samuel Hayden tapping the forces of Hell itself to generate electricity, the foundations on which Git is built are overkill on the largest scale,…

Every President Sucked

(Not exhaustive; based on cursory readings of parts of Wikipedia articles .) Washington thought it was morally acceptable to own human beings as property. Adams signed the Alien and Sedition Acts , which were xenophobic and authoritarian. Jefferson thought it was morally acceptable to own human beings as property. Madison thought it was morally acceptable to own human beings as property. Monroe…

Not "Any Purpose"

A program is free software if the program's users have the four essential freedoms: The freedom to run the program as you wish, for any purpose (freedom 0). – the Free Software Definition , emphasis mine Goddamn, what the fuck? What the fuck, what the fuck? Goddamn, what the fuck? What the fuck? Goddamn, what the fuck What the fuck, what the— What the fuck? What the fuck? What the fuck? – 745…

Crowbar: Turns out, language development is hard

(Previously in Crowbar: Defining a good C replacement , Simplifying C's type names ) Originally, I hadn't decided whether Crowbar should be designed with an eye towards compiling to C or with an eye towards compiling directly. Compiling to C massively cuts down the scope of Crowbar as a project, but compiling directly gives me more comprehensive control over what all happens. I figured I wouldn't…

Crowbar: Simplifying C&#39;s type names

(Previously in Crowbar: Defining a good C replacement .) I've been working intermittently on drawing up a specification for Crowbar , a C replacement aiming to be both simpler and safer. I'm still nowhere near done, but I'm proud of the concept I've reached for type names, and I want to explain it in depth here. The Problem C declarations are known to be a nuisance in nontrivial cases. There's a…

Crowbar: Defining a good C replacement

I like Rust a lot. That said, the always-opinionated, often-correct occasionally-correct Drew DeVault raises some good points in his blog post Rust is not a good C replacement . He names some attributes that C has and Rust lacks which he thinks are required in a good C replacement. So what can we say are some features of a hypothetical good C replacement? Portability Per Drew, "C is the most…

A Survey of Rust Embeddable Scripting Languages

Rust is a nice programming language. But it's only ever compiled, so if you want behavior that can be edited at runtime, you have to either anticipate and implement every single knob you think might need adjusting or let users write code in some other language that you then call from Rust. Lua is (to my knowledge) the most common language for this use case in general, but I don't really like using…

A Survey of Rust GUI Libraries

(Note from the future: I did this again in 2021 and in 2025 .) a popular trend in the Rust community is to ask "Are We X Yet" for various things that it would be nice to be able to develop easily in Rust - game and web are the most prominent ones as far as i can tell - and one such question is Are We GUI Yet . that's a good question; are we GUI yet? Are We GUI Yet has a list of libraries for…

Post-Open Source

i'm writing this like a day after big mozilla layoffs that included a lot of people working on cool and important shit. the consensus i'm seeing is that it reflects mozilla's search for profit over impact, mismanagement, and disproportionate executive compensation. this is taking place in a larger trend of corporatization of open source over the past several years, an ongoing open source…

Monads, Explained Without Bullshit

edit 2025-03-04 : this explanation is bad in the same way that most monad explanations are bad: it doesn’t address why the abstraction of “monad” is valuable. the first explainer i’ve seen that actually explains why it’s worth understanding is Demystifying monads in Rust through property-based testing ; go read that instead. there's a CS theory term, "monad," that has a reputation among extremely…

What, Then, Shall We Do?

america is at a crossroads of sorts. widespread dissatisfaction with how governments at all levels handled the COVID-19 pandemic, decades of police brutality overwhelmingly targeting POC, two presidential candidates nobody (or at least nobody worth a damn) really likes. we (by which i mean the american left, broadly speaking) see these futures unfold before us, and ask ourselves "what, then, shall…

Setting Up A Police Scanner With An RTL-SDR

so my city has a community-run police scanner broadcast on the internet, but the person who runs it is a bootlicker who's been threatening to shut it down if people are using it to make trouble for the cops. so i figured i'd set up my own. this is how i did it, hope it's useful. shopping you'll need an RTL-SDR unit . i recommend the dipole antenna kit as well, so you don't need to make any…

Lifehack: Running An Entire Desktop Session Remotely With MobaXterm

Since my university has gone as remote as possible due to coronavirus, I was looking at ways to run an entire desktop session remotely over SSH, using MobaXterm because it is very cool. Here are the two steps to doing that. Open your MobaXterm settings, go to the X11 tab, and make sure that the server display mode is set to windowed mode. If you run individual programs over X11 forwarding, this is…

Rust 2020: Write Once, Run Anywhere

thing that is cool: writing the same codebase and having it run on desktop, mobile, and web thing that is lame: JavaScript is the only language where people really do that right now, outside of big commercial game engines things that need to happen for Rust to get there: promote more platforms to tier 1, or maybe introduce a "tier 1.5" where std is guaranteed to work but rustc and cargo are not…

Email Notifications for SSH Logins From Scratch

I just spent a while trying to make this happen, so I'm putting this here so I don't have to redo all that research next time. Configuring Email This guide from Linode explains how to install and configure Postfix, which you'll need. Be careful, though: when it says [mail.isp.example] the [] aren't just to indicate placeholders. You do need a literal [] around your hostname in your Postfix…

Announcing vidslice

I just released version 1.0 of vidslice , a wxPython GUI that wraps ffmpeg and youtube-dl to make "give me from 1:03-1:15 of this youtube video" really easy to do. More details are in the project README.

Futures

I'm going to be graduating from college in December and I'm a little bit freaking out. Not because I don't have a plan, but because I have six plans. Melody the grad student I may hate college, but that doesn't mean I'm not good at it. I'm still not entirely sure if it's college in general I hate or just my college in particular, but I've got a hunch it's the latter. In that case, I could…

Some Thoughts About Work

I think there are three things that can make work rewarding: Working with cool people Working on cool things Working in cool ways Right now (summer of 2018) I am working with cool people but on boring things in less-than-ideal ways. I think that's the main reason I don't really enjoy this internship. But hey, it'll be over in two weeks. Working with cool people It's nice to work with cool people.…

Slicing and Dicing Images with GIMP and Python

Let's say you have one big image (say, a Telegram sticker) and you need to dice it into a bunch of smaller images (say, Discord emoji). GIMP can let you do that manually, but frankly so can simpler tools. GIMP also has powerful scripting support with Python (and also Scheme, but miss me with that) that can let us do that automatically. TL;DR how do i do the thing Save your large image somewhere…

Windows, Vim, and Python: An Unholy Trinity of Pain

Last summer I figured I'd learn Vim. That did not go well. I started by stealing somebody's .vimrc , as is natural. In this case the person from whomst I lifted my .vimrc was a Python dev, and I was working in Python at the time, so that was a reasonable choice. But once I opened an actual Python file I got an error message that Vim couldn't find Python. I did some research and it turned out that…