abcedea

software engineer • uoa dropout • please consider the environment before printing this email.

A Return to The Office

Most of the nation has been working from home since about August of last year, which was when we had the last big lockdown - and subsequently gave up on the idea of doing those as a nation as it dragged-on.

This has worked out quite well for me. I've traded a small apartment and a short commute, to a home and garden with a longer one. Being able to roll directly out of bed and log-in five minutes before the work day begins has been revolutionary.

It hasn't come without downsides, however. It wouldn't be uncommon for me to go the day without physically speaking to another person, other than in the usual rituals such as stand-up. I do tend to miss the casual interactions with my colleagues. Swivelling my chair around to chat to the people next to me felt really organic, compared to a more formal and organised Slack or Teams call.

So I suppose it's no surprise that management want everyone to come in at least two days a week now. Might also have something to do with the business paying for a lease on an empty office.

Full-time back in the office is hell, as I discovered when the team was asked to come in the entire week during a crunch. Waking up early, starting my commute in the dark, and returning home in the dark sucks. And then I have to cook and clean. Gross.

The carrot in this whole situation is that we are getting our workstations and peripherals upgraded. Goddammit it's working, too.

Positive Habits

I'm trying to write more often. In a quite a nebulous hand-wavey way, I want to improve my ability to put thoughts to paper, so I can communicate more effectively. To that end, I've begun writing in a private journal about every day, and committing to write one of these blog posts weekly.

This isn't about writing a novel every other day - it's more like jotting down a few lines in a journal throughout the day, and then sitting down to research and write-up a short post on a subject that interests me at the end of the week.

Practice makes perfect, so this habit creates the occasion to do just that. I'm hoping that this will help me to improve my writing skills over time, as well as help with memory by way of the journal.

The system I'm writing this on, Listed, has the concept of the 100 day writing challenge. That's very good and all, but I'm not so sure I could do it each and every day - best to test the waters before giving it a go, lest I be disappointed.

Fixing Difficult to Search Problems

My daily driver OS is Linux Mint, which I have installed on my a pretty new "gaming" laptop. Every now-and-then, it would crash. Completely frozen, would respond to nothing except for a hard-reboot by holding the power button down. What on earth do I type into that little search box to figure out a solution to this problem?

I know that it wasn't just a graphics issue, I couldn't even SSH into the machine from another. Pings were unresponsive. Maybe I search for "Linux Mint system completely unresponsive random"? That didn't turn up any relevant results.

Maybe its something to do with my hardware? Perhaps "Linux Mint MSI laptop 2022 system frozen" would be a better search term? Nope, nothing particularly useful there either.

By pure chance, I was exploring the updater application, and noticed that I could select a different Linux kernel. I saw the one I was currently on, it was pretty old, but still supported. Oh.

There was a much newer one that I could select, so I figured sure, why not. I updated, and have not had a single crash in months. Incredible!

Perhaps the moral of the story is to explore more, rather than articulate more. Does that make sense? Doesn't really sound like a good moral.

Java Woes

For personal projects, as well as some other basic automation tasks, I use Jenkins to host pipelines. It's very extensible, and I really like the old-school UI. Takes me back to the times of Minecraft server plugins and such.

One of the plugins (written in Java) I used appeared to have broken - it interacted with a public API which annoyingly broke their contract without publishing a new version. It looked like a simple change to fix, so I went out and pulled the code to see if I could do it myself and create a PR. I found that somebody had already had a fix, but had been sitting unapproved in a PR since the start of the year. Uh-oh, abandonware.

It was a pretty simple plugin, really, so I figured I would just re-create it myself. I use OpenAPI quite a bit at work in C#, so I figured I would use that to generate the client, rather then manually interact with the public API like the other plugin did. All I need to do is create a new project, add a generate hook with the API's OpenAPI doc, and publish it. I do it all them time.

Oh how naïve I was. Java is quite complicated, I struggled just to get a simple project up and running. I also had no idea why clicking the green hammer wasn't producing any output, apparently I had to set up Maven? And how the hell are dependencies supposed to work, do I really have to add the transitive dependencies myself?

I spent a good couple of hours trying to get everything together, only to find out that the OpenAPI doc provided by that public API wasn't well-constructed, and would need extensive modification to get it to produce a Java project that would build without error. Real agile.

You never know how well you have it until you try something new. Java is so much more complicated than I had previously thought, and there are so many ways to do simple things like dependency and build management. The .NET ecosystem certainly has problems of its own, but its so much simpler and quicker to get up and running. Modern .NET has considered the development experience from the ground up, and it really shows.

Enterprice Resource Planning, For the Home

I live in a flat which I share with some really good friends; meals are planned and shared to lighten the load and costs between us all, same with household supplies. Because of the distributed nature of this setup, it can be time-consuming to organise the grocery shopping and meal plans each week.

As an avid homelabber, I spend plenty of time lurking in the r/homelab and r/selfhosted subreddits, and I came across a self-hosted application called grocy - which promised to help with this organisation. I was desperate to make it easier to plan things out for the week, so I launched a Docker instance and started exploring.

Now, my flat has a fair bit of organisation through the use of Trello, and I have some extensive automation set up using the built-in Butler, but none of this was particularly helpful for this task because there was no inventory tracking. It was more suited to things like chores, where a cards would come in and be randomly assigned on a schedule.

So by tracking inventory with grocy, I had hoped that automating groceries would be easier, and lessen the time that I had to personally invest in managing the household, distributing it amongst the rest of my flatmates. So I gave it a go, and everyone was on board to try it out.

I ended up cancelling the trial after a week. I found it didn't lighten the workload at all, quite the opposite. With grocy, you must scan groceries in and consume things out, or the automation I was hoping for - minimum stock amounts, adding recipes to a shopping list - just doesn't work. The flatmates would often forget to consume what they used, and of course we weren't too particular about stock-takes and inventory as it would just take too much time.

Another thing we all found way too difficult was manually adding all the products. You have to define the products before you can add them to the shopping list or recipes, which doubles the effort required to do what was previously a simpler task - throwing some free-form text on a checklist.

We ended up switching back to Trello for the grocery list, but with a few changes; we now have new columns/lists in the board for recipes and the meal plan. Recipes have an ingredients checklist, which gets copied to the grocery checklist when moved to the meal plan - all automated with Butler, of course. This makes planning for the next week much simpler and faster, which was one of the things I was hoping to achieve with grocy.

Grocy certainly has a purpose, but unfortunately it wasn't for us. We're a busy bunch with not much time to spare on household duties, so we were not able to put in the effort required to get the gains promised by the system.

After Hours On-Call Support

The company I work for is the antithesis of Google; where Google kills products almost religiously, my workplace has deprecated almost nothing in thirty years of existence, but still loves to ship new products and systems.

There are valid reasons for this operating strategy; our customers appreciate the long-term support and reliability, but couple this with an unprecedented shortage of software engineers in the industry, and you have a recipe for trouble.

I'm on the after hours on-call roster, which is voluntary. There are not many others on this list, and the number of services we monitor is high - as well as a catch-all Jira service desk that is routed to my team.

With so many things that could fail, the likelihood of receiving a callout is very high. There can be massive gaps of several months between callouts, interspersed with so-called "hell weeks", where there can be a callout almost every night.

Being called-out this often is a problem, but I always come-up empty when thinking of a solution. The business wants high-availability for all services, but we don't have the head-count to work on reliability of those services.

Monitoring your Self-Hosted Estate

If you build and develop a system with paying customers, you know that tracking and publishing service uptime is absolutely critical to build trust. If your customers don't trust that your system will be up and available when they need it, its unlikely that they will remain your customers for very long. Hosting a central web page where customers can view and track outage events over time builds that trust, and helps with communicating these events as they happen.

I believe that the same things are valuable in the self-hosting/homelab world - only, your "customers" are your friends and family.

Of course, you don't need to treat the end users of your self-hosted systems in quite the same way as a business would treat customers, but it is valuable to monitor the various services you may be hosting to allow yourself to be pro-active with issues. Personally, I get a little frustrated when anything I host goes down, and having several people tell me its down is unhelpful. I would rather share a link to a status page where they can see progress and status, and forget about it. If things go down in the future, they'll go direct to the status page instead of badgering me.

Keeping with the self-hosted nature of my homelab, I also self-host the monitoring tool - I use Uptime Kuma. Just as an aside: try not to host your monitoring tools alongside the things they are monitoring - they might end up going down together, and it would ruin the entire point. I host my instance on a DigitalOcean VM to keep it entirely separate from my home infrastructure, but using a Raspberry Pi in a different room or at a friends house would also do nicely.

I also find another benefit in monitoring your hosted services in a central location; you automatically get a tested inventory of everything you manage. It can be hard to track what you have hosted, since self-hosting can be quite low-friction (if you're doing it right). I can spin-up a Docker container, and completely forget about it. Maybe it goes into a crash-loop, using up resources, and I'm none the wiser until it starts affecting other services. If I always add a monitor to every service I spin-up, I can know when its misbehaving and make a decision of if it should still be there.

So yeah, monitoring your uptime can be a good idea for a homelabber, too. You can avoid getting snippy with your friends and family when things go down, and it can also help keep your digital estate under control. It might also serve as bragging rights, displaying all the services your host and their uptime.

You can have a nosy at my personal public status page here, if you'd like.

Rust

The Rust programming language has been one of those things that I want to get into, but have just been struggling to get my head around. I've seen the light, but how the hell do I use it? From the outside, it looks so different to anything I've used before.

For example; I had learned to program originally in PHP, but when I realised that it was certainly not the language for me long-term, I was able to step into C# with very little resistance. I've found myself having to read documentation very frequently with Rust, it's not as intuitive in comparison.

That being said, the effort that has gone into education with Rust is phenomenal. The compiler errors are quite clear and visual, and there are help commands that give you examples on errors, and how to get around them. This is primarily how I had been learning: find a thread from the web and the Rust docs to give me examples on what I'm trying to do, coding it, and then using the help commands when it inevitably goes wrong.

Additionally, the build system through Cargo work exactly as I had hoped it would. The projects I work on tend to be quite complicated, with many external dependencies in different languages - and I'm of the opinion that each individual application/library/crate/etc should be responsible for wrangling its own dependencies at build time, so I was pretty thrilled when I found out about Cargo build scripts. The build script for one of my Rust projects builds a .NET project, and consumes its output. It works pretty well!

So yeah, I keep getting these little tastes of Rust, and I'm liking what I'm seeing so far.

New Years Resolutions

Its getting real close to that time of year again, where we all pretend to perform some serious introspection and decide that we have no real issues other than superficial. We all decide we want to start going to the gym, but then give up after a month or so.

I had some thoughts about this - not so much about what my resolutions will be, more about how I think I should set them.

Holding myself to a SMART goal seems unreasonable given the context. The time span for a New Years resolution is far too long, and because of this I would set a goal that's more difficult to achieve.

The goals never stick, because I'm gonna do what I want to. If the goal was fun and achievable I would be doing it already.

That's why this year, I'm not setting goals - I'm setting a direction.

By direction, I mean something like "focus on health". Its non-specific and un-measurable so that you won't be disappointed if you don't achieve it, but at the same time provides the same amount of motivation you would have early in the New Year.

Its a way of remembering and focusing on what was important to you at the time, and hopefully re-discovering that mindset that lead you to it. You can use it to inform decisions, and prioritise against other tasks in your day-to-day.

Write your direction on a sticky note and put it on your mirror, on the back of your front door, or at eye level by your toilet. For the non-psychopaths amongst us, try pinning it in your Notes app.

Distro-Hopping

After spending an entire year of promising myself I wouldn't distro-hop into another Linux OS any more, I thought I would reward myself by installing another OS. Linux Mint this time.

Can't say its entirely my own fault though - I tried updating Ubuntu 20.04 to 21.10, but apparently I didn't have enough space in my boot partition to upgrade, and I couldn't resize my other partitions to make room. I would have had to re-install anyway.

May as well have made that something new and exciting!

I've used Mint before, and I was totally fine with it last time before switching to Debian (then Ubuntu). My problem is just that I want a bit of change every now-and-then, so I swap Cinnamon for GNOME.

I could probably just switch out my desktops instead of re-installing, which I may look at doing this time if I have the need. Though, this is what I said to myself last time, and look how that turned out.

Vagrant is definitely going to be something to look at, for the future.