Wednesday, July 1, 2026

Always Be Closing!

During our site-to-site standup, I mentioned to the SFO guy that I'm currently bogged down with cases. However, it doesn't matter if I have 10 cases or 22 cases, I make sure I clear my queue at the end of the day. This is mainly because I got a bad experience where I left a case unanswered overnight, sent a reply the next day, resolved the case with the first response, and still got a bad CSAT. Comment from the customer? "Took too long to respond."

SFO guy then says, "Always be closing. Always be closing." Didn't get the reference, so he sent me this YouTube link and told me to watch it. How come I've never heard of this movie before?!

Saturday, June 27, 2026

The Push-Up Challenge

For some unknown reason, an ad for The Push-Up Challenge popped up on my feed. Intrigued, I clicked on the link. Supposed to be Australia's largest mental health and fitness event. Participants complete 3,307 push-ups in 24 days, from 3-26 June. This number represents the number of lives lost to suicide in Australia in 2024. People get a bit of exercise and raise funds at the same time. Win-win.

I've been doing pushups for the past few years, and I'm currently at 50 per day. I reckon pushing myself to do 80 shouldn't be too hard. And if I do the pushups twice a day, I can hit 160 pushups per day and beat the 3307 target. So I signed up for an account and downloaded the app.

The app gives you daily push-up targets that relate to an important Mental Health Fact. End of the day, you log your pushups and track your progress. Because I do fixed 160 pushups every day, I didn't use the app much.

By 26th of June, I've done 3840 pushups in 24 days. Because I didn't advertise my donation page, I raised zero dollars, but I did improve my pushup game. After the challenge, I went back to 80 pushups per day. Let's see how much I can do next year.



Saturday, December 6, 2025

Bose to Sonos


With the second death of my Bose SoundTouch 20 Portable, I decided to try out Sonos.

How's the sound quality difference? I can't tell because I got the ZonePlayer, instead of actual Sonos speakers.

Sonos ZP100 is the company's first ever product. Introduced back in 2005, I'm surprised these things are still working. Lots for sale on Facebook Marketplace and cheap compared to RRP.

ZP100 and ZP80 are the OG Sonos products. ZP100 comes with a built-in 50W amplifier and a 4-port switch. Paired with my Voll A44 bookshelf speakers, the combo works pretty well. The ZP100 is S1 only and there is no way to upgrade to S2. In a way, that might be a blessing in disguise. S2 is a disaster when it first came out. Maybe S2 got better now, but maybe S1 still more stable, even if it might have less features.

That said, it's a pain connecting to my shared music folder. Took me a while to get it working with my QNAP NAS. Had to enable SMBv1 (on the QNAP) to even get Sonos to see my NAS. Even then, it can only see the Multimedia top folder, and not Multimedia\Audio\Music\Tagged folder that I intended. So what happened is that the ZP100 is indexing ALL my Multimedia content, instead of just the Tagged music albums, and this is taking a looong time.

Solution, create a top-level Tagged shared folder my other Synology NAS and connect that to the Sonos instead. Problem is, Sonos kept saying incorrect username or password, when I know that's not the case. Enabled SMBv1 support and NTLMv1 auth, which I've proven to be required (based on the Synology logs), but still no go.

Gave up using a native integration to the NAS. Used Plex as the bridge instead. Works well enough for me.

Interesting fact. Using Symfonium, I was able to cast / stream FLACs to the Sonos using Chromecast, but the audio sounds average. Tested the same FLAC file using Plex and the resulting audio quality is much much better.



Thursday, August 7, 2025

Film Seen No More

Throwback Thursday had me reminiscing about my marriage proposal during the screening of Married Life (2007) at the Civic Theatre (McMahon Street, Hurstville) organized by Film Seen.

My girlfriend and I used to watch (cheap) movies there, but after we got married and eventually moved suburb, we haven't gone back for many, many years. Did a bit of searching and looks like Film Seen is no more. Can't even access the website. The Wayback Machine's last snapshot for the site was dated June 13, 2025, and this is the blurb on the homepage:

In 2004 local film enthusiasts, with the generous support of Georges River Council and key sponsors, established a local, non-profit community cinema for the St. George region.

There was a great need for a film group to quench local film enthusiasts’ desire for a forum that allowed for the viewing and discussion of a variety of films.

The Film Seen promoted appreciation of a wide range of culturally diverse films, which were of particular interest to the locals residing in the St. George area. These included foreign films, independent films, arthouse films, classics and short/feature films by local film makers.

The Film Seen has shown movies from many countries including Argentina, Sweden, Israel, Japan, China, Russia, Iraq, India, Italy, Saudi Arabia, Korea, France, Holland, Germany, Canada, Belgium, the Netherlands, Denmark, Ireland, Scotland, New Zealand, England, the USA and Australia and on a number of occasions the movies’ Directors have attended for Q & A sessions with our audience.

As an Incorporated Association, attendance at screenings was by membership of the Association. Screenings were usually held on the third Sunday each month at the Civic Theatre, MacMahon Street, Hurstville.

The Film Seen concluded its screenings at the Civic Theatre with the last screening on Sunday 16 June, 2024. We thank our audience members for their strong support over our twenty years operation.

Sad to see that Film Seen is no more. I personally don't know of any other community cinemas. That said, below is a list of their screenings throughout the years. I plan to watch as many of the films as possible:

Here's to you, Graham, Robin & Brian!

Wednesday, July 30, 2025

Docker default-address-pools

Have a bunch of new applications I wanted to add to Portainer, so needed to fix Docker's 29-network issue ASAP. Can't keep deleting other containers every time a new container needs to be added.

As a refresher, Docker's default config only gives you 32 subnets:

  • 172.16.0.0/12   /16   16 subnets: 172.{16,17,18,...,31}.0.0/16
  • 192.168.0.0/16   /20   16 subnets: 192.168.{0,16,32,…,240}.0/20

Once you've hit the limit and try to spin up another Docker container, you get below error message from Portainer - all predefined address pools have been fully subnetted

When I try to change the size of the default address pools in /etc/docker/daemon.json, I get this error message - unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '"' after object key:value pair

Maybe I'm not supposed to touch the existing pools??

One solution to try is this: (without breaking existing containers/networks)
{
   "default-address-pools": [
        {
            "base":"172.17.0.0/12",
            "size":16
        },
        {
            "base":"192.168.0.0/16",
            "size":20
        },
        {
            "base":"10.99.0.0/16",
            "size":24
        }
    ]
}

First two are the default docker address pools, while the last one is the new private network. Did this and got the same error as last time.

This time, I ran the file through a JSON validator, and found my mistake. I appended the default-address-pools section to the existing config, but forgot to separate them with a comma. Below is the working config:

{
    "data-root": "/mnt/dietpi_userdata/docker-data",
    "log-driver": "journald",
    "log-level": "warn",
    "debug": false,
   "default-address-pools": [
        {
            "base":"172.17.0.0/12",
            "size":16
        },
        {
            "base":"192.168.0.0/16",
            "size":20
        },
        {
            "base":"10.99.0.0/16",
            "size":24
        }
    ]
}

Did a "sudo service docker restart" and no more errors.

Sunday, June 1, 2025

29 Docker Networks

At some point in a homelabber's journey, they will start hitting some limits. You can always add more memory, more storage, but if you don't change the Docker default, you can only run 29 Docker containers. Ought to be enough for anybody, right? Not for me!

Apparently, Docker by default supports up to 32 subnets only. Excluding the host, bridge and none networks, you get 29 remaining. I found out the hard way today.

Was trying to add Caddy and kept getting deploy errors from Portainer. Log says "all predefined address pools have been fully subnetted". I have no idea internal networks are being allocated every time I spin up a container. Checked the networks and most of them are /16 or /20. No way each container needs that many IP addresses.

Checked the Docker docs (https://docs.docker.com/engine/daemon/ipv6/) and apparently below is the default config:

{

  "default-address-pools": [

    { "base": "172.17.0.0/16", "size": 16 },

    { "base": "172.18.0.0/16", "size": 16 },

    { "base": "172.19.0.0/16", "size": 16 },

    { "base": "172.20.0.0/14", "size": 16 },

    { "base": "172.24.0.0/14", "size": 16 },

    { "base": "172.28.0.0/14", "size": 16 },

    { "base": "192.168.0.0/16", "size": 20 }

  ]

}

To get more subnets, the forums suggested editing the /etc/docker/daemon.json file to add this:

{

  "default-address-pools": [

    { "base": "172.17.0.0/12", "size": 24 }

  ]

}

OR

{

  "max-networks": 100

}

Second option gave me an "invalid directive" error when I restart the docker service. With the first option, regardless of how I edit daemon.json, I always get "unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '"' after object key:value pair" error.

I'm pretty sure I'm doing it correctly, so I can only attribute it to a dietpi quirk. With that, I took the easy way out and deleted some unused containers to free up some networks, so I can deploy Caddy.

Sunday, May 25, 2025

Further Adventures with Segmented Vimeo (and NicoVideo) Videos

 As a follow-up to my previous blog post about segmented Vimeo videos, looks like a lot of things have changed since then.

Before, you could get lucky by searching through the network traffic for a direct URL for an mp4 file or even a 9-digit video file ID. Nowadays, I can't even find the master.json file to get the URL.

But I did find a playlist.json file, whose complete URL looks like this: https://vod-adaptive-ak.vimeocdn.com/exp=1746859637~acl=%2F2aed1a26-82e0-4e71-88b4-66b640063a50%2F%2A~hmac=406565bd4b1a97f835870e579db1914821de4d3308674c3679e3653ccdf5192f/2aed1a26-82e0-4e71-88b4-66b640063a50/v2/playlist/av/primary/playlist.json?omit=av1-hevc&pathsig=8c953e4f~ukiVn0xgiuGdzWbAuE_LQry4ltouJ-enH_rU-rIefIU&r=dXM%3D&rh=3fnUuf

Tried below ffmpeg command, but got an error:

ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i "https://vod-adaptive-ak.vimeocdn.com/exp=1746859637~acl=%2F2aed1a26-82e0-4e71-88b4-66b640063a50%2F%2A~hmac=406565bd4b1a97f835870e579db1914821de4d3308674c3679e3653ccdf5192f/2aed1a26-82e0-4e71-88b4-66b640063a50/v2/playlist/av/primary/playlist.json?omit=av1-hevc&pathsig=8c953e4f~ukiVn0xgiuGdzWbAuE_LQry4ltouJ-enH_rU-rIefIU&r=dXM%3D&rh=3fnUuf" -c copy video.mp4

Tried changing the URL from json to mpd, but still didn't work:

ffmpeg -protocol_whitelist file,http,https,tcp,tls,crypto -i "https://vod-adaptive-ak.vimeocdn.com/exp=1746859637~acl=%2F2aed1a26-82e0-4e71-88b4-66b640063a50%2F%2A~hmac=406565bd4b1a97f835870e579db1914821de4d3308674c3679e3653ccdf5192f/2aed1a26-82e0-4e71-88b4-66b640063a50/v2/playlist/av/primary/playlist.mpd" -c copy video.mp4

And apparently, these vimeo URLs time out and get refreshed after less than 5 minutes.

Did some searching and found a working solution: https://github.com/martiGIT/vimeo-download-by-playlist

There's another downloader that runs as a Docker container, which should also work: https://github.com/davidecavestro/vimeo-dl

While we're on the topic of dowloading videos, I found a working downloader for Niconico (aka Nico Nico Douga) videos: https://github.com/AlexAplin/nndownload

I was looking for YOASOBI's performance of Idol during the 74th NHK Kōhaku Uta Gassen (2023), and was told that it can only be found on Niconico, so here we are.    

Monday, April 28, 2025

Plex Media Server on DietPi


After more than a year of troubleshooting on and off, I managed to get the Plex app on the PS5 to connect to the Plex Media Server hosted on my DietPi.

I do have Jellyfin running on the Amazon Fire TV Stick (4K Max), but on the Sony PS5, the only option I have is Plex. The first I tried it, Plex was able to see Plex Media Server installed on the DietPi, but it just won't connect to it.

Fast-forward to today. I thought maybe after a year, whatever bug would've been fixed, so I gave it another shot.
Installation on the DietPi is pretty straightforward. Select application from the list, install, and done. Linking the Plex app to the Plex Media Server is just a matter of logging in and typing in the link code provided.

The PS5 Plex app is able to see the Plex server, the server is able to see the PS5 as a client. However, the PS5 is reporting the Plex server us unavailable / unreachable. They're on the same wired network with no firewall in between. Same problem as before.

Looked into a lot of forum posts, people talk about:
  • DNS rebinding
  • domain whitelisting
  • setting plex.direct as private domain
  • switching to public DNS servers
  • getting your own domain certificate and switching to HTTPS

In the end, I did only two things:
  1. added custom URL (https://local.ip:port and http://local.ip:port)
  2. changed PS5 DNS to the one provided by the ISP, rather than my own pihole/unbound

Connected straightaway and worked as expected.

Wednesday, March 12, 2025

Dell Wyse 5060 SSD Upgrade

I've been using a Dell Wyse 5060 thin client as a Docker box using DietPi. It came with an Apacer 64 GB SSD. With more Docker containers being added and more media (ebooks, audiobooks, documents, etc.) being uploaded, I needed to upgrade the storage.

I watched a couple of YouTube videos about it and it looks simple enough. Open up the case, remove SSD, replace with new SSD, and voila!

Prior to the hardware upgarde, I did take a backup using dietpi-backup utility. It saves the specified folders in /mnt/dietpi-backup/data, and a dietpi-backup.log is generated and a hidden .dietpi-backup_stats file records the start and end time. To make a copy of the backup for offline storage, I did a tar cvfz backup.tgz /mnt/dietpi-backup/*

Couple of things to note:

  • The SSD used is mSATA. That said, not all mSATA modules are the same size. I extracted my replacement from an ADATA SU650 SSD, and the module is wider and longer. No screw in the middle, too.
  • Because of the bigger size, a part of the aluminum shield for the memory modules had to be removed/reduced for the SSD module to fit.
  • When you run tar with a wildcard, hidden dotfiles are not captured and archived. And because the hidden .dietpi-backup_stats file was not archived by tar, dietpi-backup refused to restore my backup. I had to reconnect the original SSD, mount the USB stick, copy the missing hidden file to the USB stick, connect the new SSD, mount the USB stick, then copy over the missing hidden file.
  • OR I could've just manually create and edit a new .dietpi-backup_stats file:
    • YYYY-MM-DD_hh:mm:ss  Backup starting
    • YYYY-MM-DD_hh:mm:ss  Backup completed

The better way of performing the backup/restore is:

  1. cd /mnt/dietpi-backup; tar cvfz /root/backup.tgz . (this will archive even hidden files in /mnt/dietpi-backup)
  2. cd /mnt/dietpi-backup; tar xvfz backup.tgz or tar xvfz /root/backup.tgz (depending where tgz is located)

I also did notice that the installer didn't seem to make use of my settings for /boot/dietpi.txt. It still asked for locale, keyboard settings, layout, etc.

On first boot, make sure network connection is there. DietPi wants to do apt update as part of first boot and will complain if it can't. Restore process also requires apt update, so provide network ASAP.

Also, prior to the backup process, make sure the OS, apps and packages are up-to-date. Purge old files, logs, backups, and Docker images. This drastically reduces backup and restore times.