To use this website fully, you first need to accept the use of cookies. By agreeing to the use of cookies you consent to the use of functional cookies. For more information read this page.

Jamie Balfour'sPersonal blog

Two years to the week after opening my domain for the first time I have decided it's time for a completely new domain.

My brother and I have been speaking about having one domain which we share but each have subdomains on, so without further ado, let me introduce the domain and the subdomain. will now redirect to my new domain automatically. This process will take a while to complete so you'll have to bear with me whilst this happens.

Further, my new email is just which is much cleaner.

As of today, you can download ZPE 1.10.4 from my website. This version includes passing by reference and by value and not just one or the other. Although there are not a ton of features in this version, the by reference and by value update is one of the most significant updates yet!

CSS Tricks, one of my favourite websites for non-standard CSS ideas, is now going to be acquired by DigitalOcean. I mean this is big news, I've been using DigitalOcean since about late 2017 and they've been amazing. It's actually good that it's DigitalOcean and not some other company that couldn't be trusted to make a good job of it.

You can read more on the CSS Tricks website here.

Exceptional Elephant brings a big new feature that really makes the new version more powerful than ever. 

ZPE had for a long time relied heavily on using by value passing of variables to functions, both internal and externally, and this became even more confusing when the new reference types came to ZPE (aka ZPETypes). For example, the list_add_element function would actually modify the original list passed into it, whereas other functions would simply copy the list and change it. No longer do any of these predefined functions copy the value passed but will always modify the version passed to it.

So, passing by reference is very important. But then so is passing by value. Now you can specify this by running list_add_element(&$l) to pass by reference, passing the original list through or by value by simply writing list_add_element($l). It's also important to note that with any programming language and runtime, and not just YASS, that passing by reference is considerably faster.

I've been wanting to this feature into ZPE for a good few years but it was tricky. Since ZPETypes have been included it's been much clearer to me that it was easy enough to do.

Over the last six or seven years, many of my followers will know that I have been developing ZPE and its accompanying YASS language. They've come a long way since the beginning both in terms of speed and performance. ZPE is 50x faster than it was when I first developed it (version 1.2), and 10x faster than it was five years ago. These are crazy stats when you think about it. But on top of all of that, hundreds of features being added makes it bigger and bigger.

ZPE and YASS functions work on many operating systems. They are inherently designed in the underlying implementation to work on each operating system (and yes, I do have to build separate ones for each operating system) which of course requires a lot of testing.

At the end of 2020, I separated the Windows library from the main ZPE package, thus taking away the Windows operating system elements from ZPE. This included writing to the registry, a different beep function compared with Linux and macOS, as well as things like Windows Jump Lists. Generally, the move has made sense. 

So without further ado, I'm really pleased to announce there will now be three separate libraries for each of the main operating systems that ZPE is designed for:

  • lib_windows
  • lib_macos
  • lib_linux

What this means is that these libraries will directly overwrite parts of the ZPE package, such as for Windows the beep function, on macOS the menu bar will be able to switch to the macOS system menu and on Linux there will be more support for Linux command line. These libraries are going to be developed bit by bit over the next few months to make ZPE even more specific to the operating system.

Last night I finished working on ZPE 1.10.2, the latest version of ZPE. ZPE has been the centre of focus for me recently due to the need to redevelop the editor from scratch. I say this because the editor used JavaFX and since the decision to remove JavaFX from the JRE in the latest versions, I decided to make things easier and go for a simple Swing interface. 

Swing didn't work too well the last time I used it to build the editor, in fact, download an old version to see what I mean. But the new version is so much better. There are still one or two features missing from ZPE's editor that were featured previously but they will come soon.

In the ever-changing environment that is tech, ZPE needs to change to keep up with the developments in Java.

Recently I announced ZPE would move to use GraalVM instead of the JVM so that it can run much faster. Performance tests showed huge increases in performance, but it came with an issue - the editor no longer worked. So I moved back to the JVM, but it wasn't long before the JDK stopped bundling JavaFX which the editor is built with. This means bundling JavaFX JARs with ZPE, making it 10x larger than it currently is. The result of this is that I have decided to split the runtime from the editor and over the next few months the editor will be removed (again) and separated. 

I will look to build a simple Swing-based editor in the package to allow for continuity in the package. I will also be looking to move the JavaFX editor to a separate package that I will add to GitHub.


I spent a good five or six hours rebuilding the editor using Swing and it looks so much better on my Mac already! Every feature from the JavaFX editor has been brought to the Swing editor already and ZPE 1.10.2 will be out this evening! 

Since I got my house nearly a year ago, I've been very busy with my network infrastructure. This involved installing my home security system, getting my home server running (which is my Home Bridge, Plex server, my PBX server, home web server, company web server backup server, SSH server and DDNS server updater), installing home phones, setting up my smart home such as all my bulbs, switches and everything else, and of course, connecting my computers to it. It's taken a while, but one thing that's been changing more and more is I'm using Power Over Ethernet (PoE) for more and more devices.

In the past, my PoE uses have been fairly limited to just my SIP phones but this week I ditched the power adapter for my SmartThings hub and my Ring base station after getting new PoE splitters. I'm also going to be replacing all the switches across the house with PoE switches to allow me to ditch power adapters elsewhere too. I'm still installing my CAT cables across the house and have been considering CAT8, but it's difficult to justify considering the price and the lack of flexibility on the cables.

In a few weeks, I will also be posting a YouTube video for the first time in years with a little look around my house one year on.

I know it's been a while since I last updated Velocity Web Server (VWS) and it's partly because of a lack of time but also because of my lack of commitment to the project in the first place. 

The last few months have been really centered on the rebuild of the DASH project, which has become so much more than it used to be but also have been focused on the latest versions of ZPE which have come on really well over the last few months. There have also been some issues with ZPE that are still on going and needing fixed, which has drawn a large portion of my development time. Don't forget on top of all of that, I run a business!

Velocity is next on my sprint board and will get some time again very soon.

Posted by jamiebalfour04 in General

The celebrations had been running for two hours but are now coming to a close as New Zealand now enters 2022, with pretty much the rest of the world, including us, still in 2021!

Happy New Year New Zealand!

Powered by DASH 2.0 (beta)
Code previewClose