2024: Year in Review

Reflecting on my year

Year in review Ā· Holidays Ā· Gardening Ā· Programming

I’m writing my annual review a bit later than usual this year, having just found the motivation as January 2025 draws to a close. The delay is partly due to a wonderfully busy-yet-relaxing Christmas and New Year, followed by a cold and wet January marked by occasional snowfall.

Following the excitement of our wedding year in 2023, 2024 has maintained a gentler pace. We celebrated milestones such as, naturally, our first wedding anniversary. Our travels brought us to two countries we’d never visited before. Among other highlights, we had the privilege of seeing Edvard Munch’s work including his iconic masterpiece, The Scream, at the Munch Museum in Oslo, Norway.

Holidays & Travel

In total we visited three countries! In chronological order we went to Norway, for our honeymoon. Wales, for our one year anniversary. Bulgaria, to relax in the sun at an all inclusive hotel.

šŸ‡³šŸ‡“ Oslo, Norway

This was such a great holiday! We loved it and already have plans for our next visit. It’s a very friendly and clean country. Some of our activities:

  • Fram Museum and Kon-Tiki Museum. These two museums sit side by side. The Fram Museum is dedicated to Nansen’s Fram expeditions, while the Kon-Tiki Museum showcases Thor Heyerdahl’s daring Pacific crossing on a raft.
  • Munchmuseet. A museum dedicated to Edvard Munch. There’s so much to take in that we’ll definitely be visiting again. It’s the large building on the right in the photo below.
  • The National Museum. Like the MUNCH Museum, this one deserves a second visit. A fantastic collection of art and artefacts.
  • Vigeland Sculpture Park. We had a guided tour across Oslo which ended at this park. This was very interesting and I was also excited to see the internet-famous ā€œstatue of man being attacked by babiesā€. That is not actually the meaning behind the statue, but it’s funny to phrase it that way.
  • Akershus Fortress. Built in 1299 under King HĆ„kon V, this fortress is a must-see for history enthusiasts, of which I am. We took a self-paced audio tour using our phones and earphones, which was a great way to explore while taking photos.

šŸ“ó §ó ¢ó ·ó ¬ó ³ó æ Lake Vyrnwy, Wales, UK

For our one-year anniversary, we took a weekend break toLake Vyrnwy in Wales. This was my first time driving through the Welsh countryside, and it involved many narrow winding roads that looked more like dirt paths. We loved the stunning landscapes and views, being in nature and feeling the peace, quietness, and tranquillity. It was hard to imagine anywhere more remote.

We also found a Bird hide which was really fun to sit and appreciate the wildlife. We spotted an occasional quick flash of red between the trees before it swooped into view - a woodpecker! I had never seen one in person before, that I know of, and definitely not one this close.

šŸ‡§šŸ‡¬ Obzor, Bulgaria

šŸ‡¬šŸ‡§ Various, UK

We visited quite a few other places too either locally or for days out. Some highlights include local parks we enjoy visiting regularly, one of the many museums in London, a film set location for Star Wars, and a former mine now turned mining museum.

Projects

🌻 Gardening

I love gardening, both the work itself and the results. I hadn’t done any for a couple of years (other than repotting indoor plants) and this year I was determined to get back into it. I think one thing we definitely underappreciated was the amount of space needed for various bean crops - we grew too many seedlings for the space! This is clearly something that needs keeping in mind for next growing season.

The greenhouse and the areas around it contained several plants, including some Marigolds which are good for attracting pollinators. Predictably, and despite there being just over sixty carrot plants, the carrots were a couple of centimetres at most. This has been a bit of a recurring theme over the years. I’m almost tempted to just try grow them in bags of sand with plant feed thrown in next year.

The greenhouse seemed to attract a lot of pollinators this year. I haven’t seen this many insects in my greenhouses before, so I’m taking this as a good sign. šŸ

For a while there was even a small spider that had setup it’s web between two bean poles; it was a whole ecosystem in there.

🧩 Maze Generation/Solving

This is a really cool and unexpected long term project! My wife noticed me reading a post on, probably, Hacker News about maze generation and solving algorithms and in particular this book. A few months later she bought me it as a Christmas present. How sweet is that!?

The thing I really like about this book and project is it’s different to a lot of every day software engineering, I can take it at my own pace, it’s very creative and open ended, and it’s very fun. I’ve decided it’s a long term project, something I will always pick up and work on and build more with.

I’m writing this in C#/.NET with my usual emphasis on high cohesion and loose coupling. The current implementation features both a terminal application and an Avalonia-based desktop UI leveraging the MVVM Toolkit.

As I always do, I’ve kept the domain logic cleanly separated from the presentation layers, allowing the image renderer to operate seamlessly across both interfaces without any knowledge of where it’s being called from. This separation of concerns has, predictably, already paid dividends in terms of maintainability and testing.

The book covers a variety of generation algorithms and their benefits, path traversal algorithms used to solve mazes, generating easy and hard mazes, custom shaped mazes, colouring maze cells as a function of distance between cells, and even multi-dimensional mazes. I recommend this book highly.

As you will see, I have mainly created square and rectangular mazes so far. I’m slowly making my way to the chapters where circular, hexagonal, and even arbitrary shape mazes are discussed.

As I described before, I’m working my way through it and revisiting sections at my own pace. This has led me to extending several covered topics with my own features and takes. For example, the book does not cover creating animated mazes, as that is a fairly subjective and context dependant feature. I implemented this, which involved refactoring the algorithms and setting the surrounding machinery up such that it is possible to single-step the entire process.

The simplified version of this is as follows. It’s a simple API, consumers can either run the algorithm ā€œall at onceā€ or single-step it. The single-step ability is used by the previously mentioned animation feature. In ā€œall at onceā€ mode the completed maze is rendered, using SkiaSharp, to disk. For the animation, I once again use SkiaSharp to render to disk, but then once it’s completed I then manually run FFmpeg to create GIF’s and MP4’s.

I experimented with doing all of this in memory before writing each frame to disk, but this obviously results in a lot of memory being used. The natural next step is invoking FFmpeg as part of the generation and rendering process, so I don’t need to rely on my terminal history to remember the vast and complex FFmpeg flags!

Additionally, I wrote a simple terminal renderer, which can be seen in the second to last image. In the following image I display calculate statistics in the form of a table and bar graph using Spectre.Console.

This ā€œcoloured as a function of distance between start and endā€ feature results in some very cool art with patterns ranging from vibrant to neutral pastel.

I generated some with random colours to showcase here. I’ve generated various sizes, colours, normal, and animated examples.

Of course, these coloured mazes are more of a fun and engaging visualisation of maze and algorithm complexity and creation, and not typical of a maze someone would be challenged to solve, as the colour would make them too easy! In the next section, I’ve included some plain mazes with annotations and routes, which I will explain in greater detail in the next section.

šŸ’» Avalonia Desktop App

This was the first time I’ve built something with Avalonia. This is a pretty good successor/alternative to WPF, but even with MVVM Toolkit there are some parts I don’t like too much. This is a post about my year, so I will leave those complaints in a note.

It feels great working on a proper, native, cross-platform, desktop application. Currently I haven’t implemented a custom renderer, perhaps to enable interaction with individual cells and routes in the maze with Avalonia controls, instead I simply render the maze as an image as shown previously. Allowing this kind of interaction is something I will create once more of the maze types are implemented.

The first screenshot is XAML mostly taken from the layout control documentation, explaining the odd colour choices. The second screenshot is using the simple theme and with more maze settings. The third screenshot is debugging the route annotation and visualisation.

The fourth screenshot demonstrates one of my favourite features. If a maze is no longer constrained to have its start and end along the edge, then you can instead find the two nodes in the cell graph that have the greatest distance - this allows for finding the most difficult route in the maze, allowing for challenging mazes to be chosen.

šŸ”  Word Search Generation

This is another fun project I’ve decided will be a long-term project, too - something I can always work on at my own pace. As I’ve written about in previous yearly review posts (2022, 2023), I like to build a Christmas project for my family to have fun with. In the last couple of years, I made a quiz.

One year, it was simple Christmas questions; the following year, it was a musical quiz where players had to guess from four choices which song they just heard. At the end, a scoreboard is shown for everyone to see. That’s also my plan for next Christmas, but this year, I made something entirely different - a word search generator.

I printed smaller versions to stick on the inside of Christmas cards for some relatives and A4-size ones for the Polish side of the family for Wigilia. It was great fun and rewarding seeing everyone in groups trying to be the first to find all the words!

Depending on who the word search was printed for, it would either contain only English words or a mixture of English and Polish words.

There are some overlaps with the maze project. Firstly, the implementation of a grid allowing for accessing state about a cell and it’s neighbours. Secondly, the rendering of the grid. This is definitely something I keep thinking about: perhaps both projects can be part of a ā€œpuzzlesā€ project where similar types and logic can be reused?

It works by placing a word in a random and checking if it will fit within the grid. If it does, it will proceed to the next word. If it does not, it will backtrack and try another position until it’s exhausted all possible attempts. It uses a stack where each item is a grid. Only grids with a successfully placed word are pushed to the stack.

I have not yet implemented this ā€œstep by stepā€ like the maze project, so there are no animations just yet.In the screenshots below various options are used to generate the maze. Size of the grid, number of words, how many rows and columns, etc.

I was fortunate enough to find some good quality clip art for the background images.

Career

If I’m honest, I don’t feel enthused with my career this year. Because I want this yearly review to be positive and enjoyable, I will condense it to a tiny summary.

My year involved navigating organisational politics, legacy systems, bureaucracy, and frustrating fake agile processes that inspired a rant about pointless standups. On a positive note, this job gives me a good life-work balance despite these challenges, as I stated last year.

What kept me going despite the professional challenges this year were:

  • My awesome wife
  • Gardening
  • Days out and travelling abroad
  • The weather was all over this year, but when it was hot, it was amazing
  • Personal projects including the maze project and other software projects

Yearly Goal Review

  • In the last two reviews, I wrote that I would like to build some native desktop applications with WPF or Avalonia, and I have achieved that this year. The maze project has an Avalonia-based component. I’m looking forward to working on this more.
  • Homelab and IT infrastructure. Next year, I plan on developing my homelab and finally hosting some services and applications that my family or I need. Some of these include:
    • A proper networking setup with Ubiquiti equipment for unified management
    • Security and access: Network segmentation, VLANs, Cloudflare, Caddy, HTTPS, custom DNS, LetsEncrypt
    • Infrastructure-as-code using Ansible and/or NixOS for automated deployment, including secret management
    • Comprehensive backup strategy with restic and Synology NAS (onsite/offsite)
    • Centralized monitoring, observability, and alerting system
    • Various user services including PaperlessNGX for document management
    • Network-based CCTV
  • In the last two reviews, I wrote that I would like to implement some systems where Obsidian notes are synced with notes section of my site. I still have not done this, I think, because I have been becoming irritated by Obsidian’s UX/UI. I still use it, but there are some small and distracting visual problems. There are few alternatives, so I will persist and eventually implement this.
  • Electronics and embedded systems projects. I haven’t been able to work on this as much as I did in the previous yearly reviews, though next year, I intend to continue to learn Rust for embedded systems and then create the project I have in mind. I have been deeply enjoying reading about Hubris: small open-source operating system for deeply-embedded computer systems. and the blog posts from one of the maintainers about it.
  • 🌻 More gardening. I loved gardening this year, and I’m looking forward to it next year. It’s very rewarding and it’s good for overall health too.
Want to leave a comment? Reply

Stay up to date

Subscribe to my newsletter to stay up to date on my articles and projects