MoreRSS

site iconRuben SchadeModify

Sydney, Australia.  An aspiring human, into retrocomputing, writing in coffee shops, anime, and tinkering with server hardware.
Please copy the RSS to your reader, or quickly subscribe to:

Inoreader Feedly Follow Feedbin Local Reader

Rss preview of Blog of Ruben Schade

#Vietnam2026 Arriving in Ho Chi Minh City

2026-06-08 09:18:30

My inlaws and I had so much fun in Vietnam last year that we deciced to come back again, if only for a short week this time owing to available leave and other commitments. The plan this week is to stay around Ho Chi Minh City and the southern part of Vietnam, and explore some of the sights we ran out of time to explore last time. Last time was also a bit of a wirlwind, so I didn’t get as much time to write about it.

If I hadn’t made it clear last time, Vietnam is one of my new all-time favourite places. I half joked before that if someone said they had a week to spend somewhere I’d reflexively say “Japan”, but now I’d give serious consideration to here as well. The atmosphere, art, food, sights, and history are unparalleled. I’m frankly angry at myself that I could have come here all the time when I lived in Singapore and Malaysia, but the stars never lined up.

Before this trip, Clara and I got to use the company card to get into the Amex Lounge in Sydney Airport which means… pancake machine! This contraption has featured on this blog multiple times over the years, which a normal person might find embarrasing. Surprisingly for the first time ever, we were turned back from the lounge owing to overcrowding and had to go back after 15 minutes. It’s a hard life being me.

The trip to Vietnam from Sydney was blissfully uneventful. Vietnam Airlines is one of the best carriers I’ve ever flown on, especially in economy. If Singapore Airlines is a 10, and Scoot is a 1 (ironically, given they’re owned by SIA), I’d rate them an 8 alongside Cathay Pacific. The highlight was a nice slice of cake with a Viet-style black coffee shortly after the first meal service :).

I had the inflight entertainment screen on the map as I always do, and I’m always struck at just how big and empty Australia is. The vast majority of us on the continent live, work, and travel in that temperate strip of coast with trees, rain, and green grass, but it’s really not that far before you’re probably in one of the most desolate places in the world. The views out the windows are just an endless expanse of orange rock.

We landed in Ho Chi Minh City, and that humidity and heat hit us as soon as the doors opened! Our 787 Dreamliner was parked in the middle of the tarmac alongside much of Vietnam Airlines’ fleet, and we were bundled into low-floor buses to the terminal. We had flown into SGN from Da Lat on our last trip, but this was our first international arrival to it.

Alas, fate can be a cruel mistress sometimes. I wrote last year how working in IT makes me a nervous traveller, because I know all the ways things can go wrong. We managed to time our arrival for an outage that took out Vietnam’s immigration system! We were extrodinarily lucky to be ahead of the queue, because after two hours of sitting on the floor we were able to go through first, and get to the taxi ranks at the front of the terminal before the crush of people from dozens of backlogged flights did. We were there so long, bags were being offloaded from the carousels to make space for all the other inbound flights. Oh well, at least we got through in the end.

The cab ride from the airport to the hotel hit so different from last time. In 2025 we were being driven through the late night fog and lights of Hanoi, but this time we were driving through Hi Chi Minh City and pointing out all the things we recognised. Vinomilk! I love exploring new places, but it’s just as fun returning to a friend too.

By this point we’d been travelling the whole day, so we went to stretch our legs and get some food. The whole area around the City Hall and Opera House was open to pedestrians, which was so much fun to wander around. We ended up at the Saigon Centre and had some bun cha at a small restaurant upstairs. We first had this in Hanoi, and while this was no patch on something more authetic, it was sill SO GOOD. I swear even “average” Viet food in Vietnam is still wonderful.

We also snuck in a tasty tea as a nightcap. I was delighted to see Chagee also had Da Hong Bao, just like Auntea Jenny I blogged about in Sydney recently, and of course it was SO GOOD. I got the “cloud” version which was a bit sweeter than I’d normally have, but it was a holiday treat :).

We walked back to the hotel surrounded by all the lights and sounds, passing the Town Hall and the Opera House. A week doesn’t seem like long enough, but I’m so happy to be here.


By Ruben Schade in Sydney, 2026-06-08.

When the train becomes a limo

2026-06-05 18:55:58

Sometimes Sydney Trains runs a special train, just for me! Or at least, I pretend they do. How luxurious.

An empty train carriage

As an aside, for those of you who live in cities with double deck train carriages, do you sit upstairs or down? I tend to sit downstairs, because the rocking motion of taller carriages is reduced slightly… though I admit the upper deck is more fun when I know I’ll be crossing the Harbour Bridge.


By Ruben Schade in Sydney, 2026-06-05.

The fewest enabled features security model

2026-06-05 12:18:00

Calling this a security model is probably a stretch, but the first thing I do when installing any web-facing software is determine which features I can remove, disable, or otherwise make unavailable.

I’ll review:

  • Dependencies, to see if I can avoid installing any. For example, I don’t need XML-RPC packages if I never intend to use features that depend on them, and won’t ever have them enabled or exposed.

  • Plugins, add-ons, extensions, and extra themes which are moved, then deleted when confirmed they’re extraneous.

  • Features which I disable in configuration files or the web UI (I don’t edit source files if I can help it though, so I don’t deviate from upstream and cause problems with updates).

  • Endpoints I can block (or selectively expose) at the web server without breaking the core functionality of the software.

Admittedly, “core functionality” is a load-bearing phrase. What one person might consider such, I may not. But being the sysadmin, I get to make this choice based on my understanding of what the client, project, or family needs. I’ve been surprised by how few people notice or care, and when they do, it’s easy to selectively enable what’s needed.

(I’ll spare you from my usual rose-tinted, retrocomputer-tinged nostalgic view of software, though I’ll note it’s interesting how little core functionality has expanded over time. The 2006 WordPress install that ran this site for years would do what the vast majority of web writers would want today, which is also reflected in what I disable in modern versions. Maybe that’s a topic for another time).

I install software like this for a few reasons. It presents a smaller attack surface for when vulnerabilities are inevitably discovered. The software tends to perform better, and more predictably. It also has fewer places and moving parts for things to go wrong, because we all know things will go wrong.

Granted, I can see theoretically how doing this could backfire, but I’ve yet to encounter any meaningful side effects in practice. Installing software like this also takes significantly more time than a default install at the outset, but I’d argue the benefits in the long run are worth it.


By Ruben Schade in Sydney, 2026-06-05.

Finding a bug in Textpattern’s URL resolution logic

2026-06-04 21:18:58

I’ve been migrating WordPress blogs I host for people over to Textpattern. It’s a quality of life thing for all parties involved. In the process of replicating how people had their WordPress sites configured, I uncovered a subtle bug in the way Textpattern resolves URLs.

tl;dr: If your article links 404, define an empty section with something other than the side default URL pattern, and your links will work again. This will be addressed in 4.9.2.

How Textpattern defines pretty URLs

By default, Textpattern’s article URL pattern (what WordPress calls a permalink structure) uses your standard GET request scheme:

http://example.com/?=messy

If you want pretty URLs, Textpattern supports the following schemes:

  • /id/title
  • /section/id/title
  • /section/category/title
  • /year/month/day/title
  • /breadcrumb/title
  • /section/title
  • /title

Textpattern will write the appropriate Apache configuration for you if you select one. nginx can also be configured to do this with similar config to what you’d use for MediaWiki, WordPress, and the like. As a very basic (and incomplete) example:

upstream php {
    server unix:/var/run/php-fpm.sock;
}
   
server {
    [...]
    index index.php index.html;
    
    location / {
        try_files $uri $uri/ /index.php?$is_args$args;
    }
    
    location ~ \.php$ {
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $request_filename;
         fastcgi_pass php;
    }
}

To change to one of these patterns:

  1. Log into your Admin interface
  2. Go to AdminPreferencesSite
  3. Change the Article URL pattern to what you want

If you’re using the default theme, or using one that’s been written to handle URLs properly (cough, turns out one of mine wasn’t), this should be reflected on your site immediately.

Adding a forward slash

This is where a key difference between WordPress and Textpattern appears. Pretty URLs in WordPress always end with a forward slash /. By contrast, Textpattern only appends forward slashes to list pages by default.

This is how a blog post URL would appear:

  • wordpress.example.com/blog-post/
  • textpattern.example.com/blog-post

Stef Dawson explains in a post from 2022:

Anything with a ‘list’ context gets a trailing slash, which indicates there’s more under here.

Any individual single content (article, image, etc) gets no trailing slash to denote it’s a final endpoint.

Textpattern’s behavior is consistent with other software like MediaWiki. But it differs from WordPress. Fortunately, Textpattern now has an option to define what gets a / appended, which you can access here:

  1. Log into your Admin interface
  2. Go to AdminPreferencesSite
  3. Change the Add a trailing slash to URLs to what you want

There are three options:

  • No: Don’t append / at all
  • List: Only append / to lists (Textpattern default)
  • Yes: Append / everywhere (WordPress default)

When I set this to Yes, I have URLs that look the same as WordPress. Awesome!

404s for articles

As of writing this post, this logic fails in the current 4.9.1 version of Textpattern where the following two conditions are met:

  • Article URL Pattern = /title
  • Add a trailing slash to URL = Yes

Configuring your site as such results in Textpattern returning a 404 for articles with or without a forward slash. This is independent of whatever redirections you configure in Apache or nginx:

  • textpattern.example.com/blog-post/
  • textpattern.example.com/blog-post

After hacking on this for a while without success, I raised the isue on the helpful forums, and @etc figured out the problem:

It happens (whatever server) when only one (default) url pattern is used site-wise. URL resolution logic is simplified in this case, but probably too much. Will fix in 4.9.2. Meanwhile, if you create an empty section and assign it a different (from default) url scheme, it should work.

This works. By creating a new section, and assigning it a different URL pattern, the schemes site wide aren’t simplified, and work as expected.

To spell out if you get stuck:

  1. Log into your Admin interface
  2. Go to PresentationSections
  3. Click New section
  4. Enter workaround (or whatever) for the name and title
  5. Under Article URL pattern, choose anything other than Default
  6. Press Save

Now pages will render with the forward slash, and the defined URL scheme. Yay! I can now continue to import these WordPress sites. The last piece is to find a tag system that works for people.

In other news, I should get around to learning some PHP. Most of the stuff I host and run for people uses it.


By Ruben Schade in Sydney, 2026-06-04.

Painting parts beige for retro towers (eventually)

2026-06-02 15:57:03

So here’s the thing. Late last year I bought the excellent SilverStone FLP02, a retro-themed computer case with modern component support. It was absolutely, jaw-droppingly gorgeous, and has easily become my favourite modern case alongside the legendary NCASE M1. It’s big, relatively easy to work in with just a few caveats (a topic for another time), and yet looks the part so well. I’ve since moved our FreeBSD bhyve/jail server into our FLP02, and am giving serious consideration to an additional one for my desktop in the loungeroom. It’s that good!

I subsequently received email from angry people asking me what the point was, which I answered in a detailed reply. Turns out that just made them more cranky, because they thought I was mocking them somehow. Perish the thought!

The case out of its confides

But use of such a case poses a problem, and it’s the same one the plagued seemingly all beige computer towers at the tail end of what I call the Golden Era of computer cases. Which I suppose should really be called the Beige Era. The era when computer case manufacturers thought the buying public should be able to buy whatever colour they want, as long as it matches a Model T Ford. It was such a disappointing development. If we were going to replace beige—a colour mostly unique to computers in the consumer electronics space—why did it have to be the most boring colour (or lack thereof) of all time? But I digress.

The biggest problem beige towers face is the pairing of drives and peripherals. During that transition period between awesome beige and mediocre black, you were lucky to get a part that matched. Black optical drives in beige cases, and beige disk drives in black cases became a distressingly common sight. Retrospectively, I have friends who harbour a nostalgic attachment to that anti-design. To them, a beige case doesn’t look complete if it doesn’t have a mismatched drive.

I respect that position, but it’s not for me. I grew up with beige DIY towers with beige drives, and that’s what I want for this glorious FLP02 damn it! I want stuff to match, even though I concede plenty of people mismatched components owing to price, convenience, and/or availability.

Which leads us to this contraption pictured here:

Pictures of the drive cage with the black front.

This is a drive cage, designed to slot into two 5.25-inch drive bays and hold three 3.5-inch hard drives. While the FLP02 is stupendously wonderful, it technically has fewer internal drive bays for storage than the Antek Three Hundred I used to use, which resulted in me needed to purchase additional drive capacity. This drive cage allows me to mount an 80 mm Noctua fan (itself beige!) into the front, and keep three additional drives cool. I have a separate post about how this works pending.

I prefer finding beige components when I can for new and old builds alike, but when that isn’t possible I’ve developed a system that (mostly) works using these three cans:

The three cans of primer, paint, and top coat

They are, from left to right:

  1. A self-etching primer. I like the White Knight Rust Guard SLS the most, though I’ve had success with others too. Primer gives your paint better adhesion, and self-etching means you don’t need to do any manual work to rough up the surface to accept the paint. This is especially important for smooth painted surfaces or bare metal, though it’s also worked great on rougher powder-coated computer parts for me.

  2. A colour, of course. Rust-Oleum Chalked Chiffon Cream is brighter than the beige used in computer components, but it’s the closest match I’ve found thus far after exhaustive testing.

  3. A top coat to protect the painted surface. I like Rust-Oleum’s Satin Clear, becuase it gives a similar finish to the powder-coated surfaces on beige powder coatings.

Painting takes a while, but I’ve found being slow and building up very thin coats works best. My approach:

  1. Wipe down and clean the item to paint with isopropyl alcohol until there isn’t any dust, fluff, or other detritus across the surface. If you don’t, and you paint over the top, you’ll get a lump that will have to be sanded down, and likely result in you repainting the whole thing.

  2. Place a tarp down over a table or other surface outside, and weigh it down with some heavy objects. We use a few large stone coasters. Don a mask too; you don’t need to vape paint, let alone anything else.

  3. Place the item to be painted on top of the tarp.

  4. Shake the cans vigorously for at least a minute. In cold weather, use a hair dryer to heat the can and its contents slightly (though obviously not too long). This is a tip multiple artists and industrial designers have told me about, before you write an email telling me this is a bad idea.

  5. Hold your can about 20-30 cm away from the part, and spray across the surface with your primer, overlapping a little with each pass. I find two coats works best, with at least an hour between each coat. The cans claim they dry in less than ten minutes, but yeah, nah.

  6. Spray three to four thin coats of your beige coloured analogue, leaving at minimum an hour in between again. Err on the side of not applying enough instead of applying too much. You can always build up more layers, but if you apply too much at once, it’ll goop up, take forever to dry, and will get stuff stuck to it. Every mistake I’ve made has been down to impatience.

  7. Finish it off with one or two coats of clear satin finish.

This is what my drive case part looked like after two coats of the coloured paint. You can see the lower edge is slightly darker than the rest, so I went over that area a bit more on a subsequent pass. Note also the droplets of rain on the tarp, which required me to pause painting last week (cough).

The mostly painted cage front.

Once I’d finished, I attached it back to the drive cage and installed it into the FLP02, along with the Noctua fan and the supplied dust filter. Success!

The drive cage inside the FLP02, showing a slight difference in tone.

As you can tell, the colour isn’t exactly the right shade of beige, but it’s still a significant improvement (to me) over the matte black of the previous part. If anything, slightly yellowed case parts look closer to it, so this approach works especially well for older towers.

Now I just need a SATA DVD-RW in the appropriate beige colour, and another drive sled to arrive from SilverStone (post incoming!), and this build will be done. What an awesome case. What a fun time!


By Ruben Schade in Sydney, 2026-06-02.

Married 🪐

2026-05-30 21:50:45

The Pyrmont registry office venue.

Clara and I finally tied the knot after more than a decade. It was a short ceremony at the Pyrmont registry with close family, but it was lovely. The celebrant joked that it was “her first Sanrio wedding” on account of all of Clara’s Pompompurins, many of which her brother and fiancé brought for her. It was adorable.

We met at our university anime club. We hung out, and gradually it turned into something more. Our first “date” involved us sitting at a bubble tea shop and talking from midday until closing time. That’s been our vibe ever since, from travel, to cosplaying as Yuki and Kyon from Suzumiya Haruhi, to planning dinner.

In some ways this was merely codifying something we had already built for many years, but it didn’t make it any less meaningful. I wish my mum were alive to have met her; I know she would have loved her too.

We’ll be back in Vietnam in a couple of weeks for a short family trip again to celebrate, which will be lovely.


By Ruben Schade in Sydney, 2026-05-30.