Jamie Balfour BSc

Welcome to my personal website!

Technology enthusiast

I am very interested in technology, particularly relating to computer science. I am most interested in web design and development.

My main hobby is programming. One of my most well known products from this is ZPE. I also am the sole creator of BalfBlog, BalfBar and BalfSlider.

A little bit about me

In 1997, when I was six years of age, I got my very first computer. I was always very interested in the ins and outs of it and dismantled it to see how it worked.

Years later, in 2016 I received my BSc (with honours) in Computer Science, obtaining a First class degree.

I'd like to welcome you to my website and hope you enjoy using it as much as I have enjoyed building it!

Google Plus
Jamie Balfour BSc
Full stack developer

Personal Blog

ZPE 1.5.2 is now available to download from my website. It is a huge update that brings so much (and removes so much). ZPE 1.5.2 is known by it's code name Pelegosto.

Let's start with what's being removed:

  • string_concatenate - added in version 1.3.0, deprecated in version 1.5.0 and now removed in version 1.5.2
  • open_remote_client - added in version 1.5.0, deprecated in version 1.5.1 and now removed in version 1.5.2.
  • open_remote_server - added in version 1.5.0, deprecated in version 1.5.1 and now removed in version 1.5.2.

Now for what's new:

  • Serialisation and deserialisation of objects and structures: objects and structures can now be saved to disk and retrieved later. This feature is a particular favourite of mine.
  • Custom keywords: finally you can customise the compiler with your own keywords and how they are interpreted. This feature is in it's early days, but it works as expected.
  • Constructors for structures: now you can instantiate a structure with a set of parameters. This feature was requested by one of the original testers of ZPE, wondering why it was you couldn't do this. Well now I've done it.
  • General improvements that fix a few bugs
  • Performance improvements, particularly with mathematics
  • The jget ZAC, based on CURL. This ZAC is designed to download a file from the central repository of ZPE tools and features. For instance running zpe -jget stdLib.zex will download the compiled standard library (now over 400 lines long). 

ZPE 1.5.3 is already underway and it's main focuses are on better structures and ZPEObjects as well as a much better compiler. So far in ZPE 1.5.3 the new -l argument for the compiler. This allows you to compile an application into a library, meaning the main function will not be included for efficiency.

Back in the days of version 1.3 it was always my intention to make it possible to add custom compiler syntax to ZPE. I did this originally in a very simple way that made it easy for me to develop but harder for others to develop. Today, version 1.5.2 brings this feature back. It improves it considerably and makes it fully possible to write your own syntax. I've even decided to make it possible to overwrite the built in keywords including things like if and while. 

How does this work?

It's not the easiest of things to explain but I will try. Firstly, when ZPE is launched it will search through all of it's plugin directories. A new directory called 'keywords' has been added to version 1.5.2. This directory contains all of the user's custom keyword plugins. The manager then adds these to the compiler based on the name value given to the keyword plugin.

The next stage is for the compiler to compile the word. The plugin handles the compilation job and can access the owning ZPE's public functions (including the new ExternalMethods object) before returning an AST.

Within the interpreter the plugin's traverse method is called. It is then the plugins job to traverse when the plugin is given an AST back (the same AST given previously) and to run it as code. It's pretty easy to do and it's designed to be easier than doing it the way the internal compiler does it.

Below is a plugin called 'jack'. It simply takes the next word and stores it as a value.

import jamiebalfour.zpe.core.AST;
import jamiebalfour.zpe.core.ZenithEngine;
public class ZenithCustomModule implements jamiebalfour.zpe.core.ZenithCustomModule {

	public String GetName() {
		return "jack";

	public AST CompileToAST(ZenithEngine z) {
		AST a = new AST();
		a.value = z.ExternalMethods.GetCurrentCompilerWord();
		return a;

	public void Traverse(ZenithEngine z, AST node) {


Below is a sample of the ZenLang code that runs this:

function main()
	jack x
	$a = 0
end function

Thanks to some of the comments I received today about my website, which were largely positive, I will be changing my website quite considerably.

The comment that has stuck with me, and it's reinforced by the fact I've thought about it myself is that my website has become too big. I've developed a plan of action to tackle this problem in as few distruptive steps as possible (since now my tutorials have been gaining more popularity and my website is being used by many, I don't want to disrupt that).

My plan is this:

  • Revert back to a single blog again, my Projects Blog will move back into my main blog. 
  • I will merge Software into my Projects section. 
  • I will create a completely new website (I've been thinking about this since early December) for my professional works

Whenever I am asked why I bothered building a personal website or why someone needs a personal website my reply is often something along the lines of 'it's fun' or 'it's my hobby'. But I very rarely touch on the benefits of my personal website.

There are a huge number of benefits to my own personal website. I get around 500 visitors a month on my website. I use it to showcase my work to potential employers, to get myself on the internet in a public way that people can connect with me through but there are also other things. I enjoy learning and teaching, so my website is also a source of information where I put tutorials to help others learn stuff that I know. 

But really what's the benefit? My first answer is that it's professional. The brand that my website pushes forward gives me a uniqueness that appears on all of my work now. The orange and blue theme of my website is also apparent on my CV, any letterheads I send and on certain emails. This looks highly professional and people like to see this. I also believe that having your own brand puts you above others who do not. 

The second reason that having a personal website is that the website is, well, personal - it's all about you. LinkedIn is great for connecting but it's full of other people too. Go to jamiebalfour.com and who do you think you are reading about? That's right, some guy called Jamie Balfour. There's nothing about John Szymanski or Murray Smith on there (well there might be). This keeps the reader focused on you. You can write soley about how good you are and all of your achievements and yeah, be a narcissist, blow your own trumpet!

The third reason I would say having a personal website is a must is because it gives people an easy way to read about you. A personal website allows people to read about you from all corners of the globe. Social media is great, but it's also ladden with other things, like other people, a like LinkedIn.

I will admit my website is more of a personal project that evolved into something more. For anyone in computer science it's pretty nice to show that you can build a website from scratch, so I did exactly that (it shows a lot of perseverance too). 

ZPE CAST or ZPE Client And Server Technology is the way in which Remote ZPE (rZPE) works. It is currently based on a point to point communication protocol through a single port. A server initiates and a client sends a request for a connection. It is currently based on a multithreaded server that opens a ZPE command line to the client. This allows remote testing and more importantly remote access to a system. It currently does not encrypt the connection, but I am working on bringing this in the near future. 

The ZPE commands that do this will soon be removed, in favour of the -n ZAC that was added in version 1.5.1. I will be redesigning the message consoles too so that when a server is connected to a client, the client opens a server and sends a request to the server it has connected to open a client and connect back, reducing the number of jobs needed by the users of each client and server.

All of this is planned for the next version of ZPE, version 1.5.2.

Also, the CLI version number put at the top of the zpe command in every version to date has been incorrect and only outputted the version number of the ZPE application. It has now been updated so that it displays the correct information, showing what version ZLC (Zenith Language Compiler) is in. As of 1.5.2 this is version 1.6. Also, the ZenEXecutable specification has changed, thus all compiled programs need to be recompiled. 

ZPE 1.5.0 brought a ton of new features that make it better than it ever was. But version 1.5.1 has brought about even more. Now version 1.5.1 which recently was released to beta users has been improved further. It's main focus has been on improving the back-end compiler, and it seriously has. The compiler now follows a different path to the interpreter, something planned for a long time. This update changed ZenEx and how it works compared with before and will mean that you will need to recompile any applications written in ZenLang.

On top of this it has received some Java-based TLC. Users who develop Java applications will have a much easier time accessing what they need, when they need it. Everything is now packaged up in to a bunch of very neat little packages and classes, rather than all residing within the ZPE package. For instance, you can now find GUI based stuff in:


And the core is now found in:


Easier by a long shot.

Also, the public methods class called PublicMethods is now found at:


This was added in version 1.5.1 and it adds many new methods that are there for developers to take advantage of. One such example now opens all internal functions to Java developers, no longer limiting them in to using ZenLang to access these (prior to this the plan was to use the public Execute function to get a result). 

BalfBlog is making a big change today that will change a lot of installations. Luckily there is a new plugin included by default with all installations that fixes this.

The fix I speak of is moving from using MD5 in any hashing algorithms at all. I was interested in finding out whether or not MD5 was a preferred choice to SHA1 for a short URL and came across a page in which the write manages to produce two images which are distinctly different yet the manage to produce the same MD5 value causing a collision. Not good. 

As a result I have decided to change from MD5 being used to generate hashed URLs to SHA which has a much lower chance of a collision than MD5 does. For more information on creating collisions (and it's a very interesting article) look to here:


Posted by jamiebalfour04 in BalfBlog

After hours of work and countless cans of juice, I have finished my website update for early 2017. Nothing has changed on the front-end except for my menu, which now implements BalfBar 1.2 and also now has padding on the dropdowns as well as new uppercase text.

This update did focus primarily on updating the back-end, primarily introducing DragonScript 2, the replacement for my January 2015 DragonScript package. This new version is much faster and works on the idea of hashing data rather than storing it in an array. It's a huge performance improvement that makes this website speedier than ever. On top of that I have been stripping parts of my website that are no longer needed with a focus on not only making the website faster but streamlining it so that it is easier for me to update and add to.

Disruptions have been minimal as I continued to support DragonScript version 1 on my website simultaneously with DragonScript 2, but as of five minutes ago, the two year old version has been retired. 

Will DragonScript 2 get a release? I doubt it. I don't plan to make it available now because it would be too much work since it is now intertwined heavily with my website. It is possible I will develop a more open, WN Project based on DragonScript, but not yet.

Finally, on top of the menu getting a little update. I decided to push my dark theme further on my website, and for the first time have built dark code samples. The choice to do this was inspired by the fact I now use Adobe Dreamweaver again, and I really like it's dark theme. This now makes them easier to see on top of looking much nicer.

var x = "Test"

This update removes even more skeumorphic designs and focuses even further on the flat design. It does however retract a bit on the statement I made about getting rid of curves, with more and more objects across the site being curved. Alas, I could not resist a couple of circular objects and feel they fit better than the square ones did.

Yesterday I tried out ZPE Remote with a friend across the Internet. It works well and he was able to execute commands on my MacBook Pro over the Internet. 

Most crucially, ZPE Remote also restricted access to certain built in methods using permission levels that would not be possible to bypass in the interpreter. I will continue to test this with people, allowing them try out certain features of ZPE Remote and let me know where it could be improved. 

The Nintendo Switch, the console Nintendo could not afford to go wrong with, especially after learning that the hard way with the Wii U's failure. 

However, I believe Nintendo has gone wrong again, and I'm disappointed to see my childhood gaming company make the error again.

If you haven't already heard about the Switch, head on across to Trusted Reviews to see all the information about it.

A lot was good:

  • The portability is awesome. I love the fact that I take home my games console and plug it into my TV then take it with me for the bus. 
  • It's Nintendo, which means some of the most awesome games will come to it
  • It's going to support Unreal Engine 4 - that's pretty demanding.
  • It's so flexible! I also love the fact that you can disconnect controllers and change things around so much.
  • Nintendo will final comply with standards and I will be able to use the USB Type C connector for my laptop to charge it

I will summarise what's wrong with it, and this is my opinion:

  • Underpowered. We have seen devices like the new Razer Blade Stealth (amongst many others) adding PCI-Express graphics cards to laptops when they are docked via Thunderbolt. Nintendo could surely have looked into this and made the Switch a 4K gaming experience when it's in the dock and then used a smaller less capable and yet more power efficient graphics chip when it's out and about, couldn't they?
  • Overpowered. Seems like a contradiction but I wanted to put that there because the Switch seems to suffer from the same problem that the Wii U Gamepad did. Battery life. How on earth can the Wii U Gamepad only last on battery for three hours when an iPad or even an iPhone can last for up to ten?! The thing only receives a wireless signal with a picture to display and the audio to play with it (as well as act as a controller). And what's worse is the low resolution (especially compared to tablets of today) of the Gamepad. Well the same is said about the Switch which can last 6 and 1/2 hours playing games, except that it ranges from just two hours with games like Zelda only achieving about that. THAT'S IT?!
  • Storage, or the lack of. 32GB of storage is still the best option for 2017?! And knowing Nintendo, it will use eMMC memory which will make it a slow 32GB of storage.  
  • The price, at £300 I would expect a bit more, especially saying as you can get something like an iPad or Xbox One for just a little more, even if they haven't got Mario and Zelda on them.

Feel free to criticise my opinion and write your thoughts below.

Site accessibility

A lot of the original functionalities that once existed here have been removed.

This page was generated in 0.39 seconds using 6291456 bytes. Slow? Let me know.

To use project mode, the window must be greater than 920 pixels in width.
Click here to disable Project Mode.
This site uses cookies to deliver its services, to personalise ads, to store preferences and to analyse traffic. Information about your use of this site is shared with other companies. By using this site, you agree to its use of cookies.
Contact me
Contact Jamie Balfour

Get in touch with me via this form.