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.
 
 