Walter Higgins

Tinkering with Software & the Web

Title goes here

2019/04/19 14:10

A test link


Dostoevsky's Favorite Game

2019/02/22 18:04

Dishonored texture Image Credit:

Why am I going there now? Am I capable of that? Is that serious? It is not serious at all. It's simply a fantasy to amuse myself; a plaything! Yes, maybe it is a plaything.

Fyodor Dostoevsky, Crime and Punishment,Part 1, Ch. 2

It feels like the 2012 video game 'Dishonored' and Dostoesvky's 19th century novel 'Crime and Punishment' belong to the same universe. That universe is a moral one.

In Crime and Punishment the young protagonist (Raskolnikov) plans to rob an elderly Pawn-Broker but in a panic murders the old lady and - when discovered - murders her younger sister too. Fleeing the scene he hides in the shadows to evade two painters working nearby before stealthily making his way back on to the streets of St. Petersburg and back to his grimy student flat. He spends much of the rest of the novel walking the streets of the city wracked by an inner conflict that can't be summed up in a word as simple as guilt. The streets of St. Petersburg form the backdrop to this inner conflict. The novel's protagonist walks miles along its cobbled streets, rat-infested alleyways and horse-dung strewn avenues, all the while mulling over what he's done and the consequences if he's found out.

Compare this to Dishonored, a game where you are an assassin (Corvo) tasked with eliminating (by lethal or non-lethal means) a series of villains. Each villain can be eliminated by murdering them outright, by character assassination or by having them banished and living out the rest of their days in obscurity.

The game does not overtly recommend lethal or non-lethal approaches to eliminating targets but there are consequences to taking the lethal approach - the game has its own moral barometer called 'Chaos' and the world in which the game takes place (Dunwall; a retro-futuristic 19th century industrial city - think Edinburgh, Dublin or London) becomes grimier and more rat-infested the darker the deeds of the player.

Just like the city of St. Petersburg is a central character in Crime and Punishment, Dunwall is central to Dishonored. The city is a dream - a molten effigy of every northern european 19th century industrial city. It's populated by hard chaws, their faces hewn from rock - malcontents ready to stab or shoot you if you look the wrong way. This is probably one of the best imagined locations I've ever played in. I'm on my 2nd play through of Dishonored - the city oozes character (among other things).

Like Crime and Punishment's Raskolnikov, when playing Dishonored you will often find yourself in situations where you're trying to do the least-wrong thing but are discovered and before you know it you're embroiled in a fight to the death with city guards. A minor misdemeanour (a trespass, a safe-cracking) quickly escalates into bloody carnage and the bodies pile up. In Dishonored there is even a half-senile elderly lady (Granny Rags) who could double as Crime and Punishment's PawnBroker.

He suddenly heard steps in the room where the old woman lay. He stopped short and was still as death. But all was quiet, so it must have been his fancy. All at once he heard distinctly a faint cry, as though some one had uttered a low broken moan. Then again dead silence for a minute or two. He sat squatting on his heels by the box and waited, holding his breath. Suddenly he jumped up, seized the axe and ran out of the bedroom.

Fyodor Dostoevsky, Crime and Punishment, Part 1, Ch. 7

Stealth - a constant fear of being detected, morality, and the city itself are intertwined in the video game 'Dishonored' to such a degree, Dostoevsky himself would surely approve.

Read: Fyodor Dostoyevsky 'Crime and Punishment'
Play: Dishonored




2018/10/12 12:37

icky.js is a small side-project that evolved from a feeling I've been harbouring about front-end programming for some time now:

You don't need a framework.

The problem with harbouring such a thought is that it's heretical. No one takes such an opinion seriously these days. Large-scale webapps built by teams of developers need a framework or they become unmaintainable messes. So says popular wisdom.

Front-end frameworks make web-programming easier they say. Front-end frameworks make developers more productive. Front-end frameworks provide useful abstractions so developers don't need to get bogged down in the low-level details.

And yet, such frameworks - rather than getting out of the way so you can focus on your Application code - tend to stay front-and-center so you always have to think about your application in a framework-centric way. Consider Angular and its Directives, Controllers, Services and myriad other "abstractions" that force you to write your code in an Angular-centric way. This wouldn't be so bad if Angular's internals didn't disgorge themselves on a regular basis. Try working through an Angular stack trace or debugging Angular's digest cycle and then tell me again how "awesome" Angular is.

React "is just javascript" but has spawned endless discussions about state management libraries and React's component lifecycle hooks.

Chances are, if you're using a modern Javascript framework "You're doing it wrong ™" and should rewrite your code to use whatever is this week's flavor of best practice. This is part-and-parcel of Javascript frontend programming today - the constant anxiety of knowing that your code is bad and you should feel bad.

Lost in all of this is the simple truth that Application code should look like Application code. Your application code should be easy to reason about. It should be easy to understand and change if needed. A Framework should work in the service of your Application but if you look at a typical Framework-based Application's code-base you'll see that the opposite is often true. A single Application feature is typically scattered across multiple framework artifacts. During my time using Angular (2013 - 2017) I had the constant nagging feeling I was writing "Angular" code, not Application code. This is a far cry from frameworks in the 90s (MFC, JFC, Delphi) which for the most part stayed out of the way and just helped you do your job.

icky.js is a reaction to the constant belittlement of any way of frontend coding which doesn't employ best-of-breed enterprise-class scalable front-end methodologies. It's a library. It doesn't require a build system. It's just one (rather tiny) file. You don't even have to host it yourself.

It embraces the use of ES6 Template literals ( overlooked largely because of the success of JSX ¯_(ツ)_/¯ ). It's remarkable that an ES6 feature long absent from Javascript ( Template Literals. AKA clean multi-line strings ) has not been hyped more. Constructing snippets of HTML markup is now 1,000% less painful thanks to ES6 but all the cool kids think JSX is great.

icky.js harks back to the idea that Application code should look like Application code. It gets out of the way and lets you use clean ES6 code. It's not a MVC framework. It's not even the V in MVC. It's just 3 functions which you might find useful when writing a webapp.

Take the following snippet of code which is taken from the To-Do sample application:

const onClickClearCompleted = gnf(() => {
const tClearCompleted = () => `
<button class="clear-completed ${model.completed().length ? "" : "hidden"}" 
  Clear completed

  () => update("#clearCompleted", tClearCompleted)

It describes a component (a Button which appears when there are 1 or more completed to-do items) which can clear (remove) completed items. There are many possible actions a user can perform which decide whether or not the component should appear. The Component's appearance (View) is specified:

const tClearCompleted = () => `
<button class="clear-completed ${model.completed().length ? "" : "hidden"}" 
  Clear completed

Its controller logic (how it updates the model) is specified:

const onClickClearCompleted = gnf(() => {

And the rules governing when the component's view should be updated are specified:

  () => update("#clearCompleted", tClearCompleted)

All of this is done in just a few lines of code. Importantly - the View, Controller and logic governing when the view should be updated are co-located in the same block in the same file meaning it's easy to understand the component. This - in my humble opinion - is how all Application code should be constructed. There is no Framework code here. The entire app is in a single file.

Its size (a puny <100 loc) means icky.js will never be a serious contender in the world of Javascript front-end programming but writing it and using it has been cathartic and has helped me rediscover the joy of front-end programming.


javascript, programming, web, es6


2018/05/21 11:29

Some recent reading...

There is perhaps one good argument for using Docker. It is hidden by the many bad arguments for using Docker. I’m going to try to explain why so much Docker rhetoric is stupid, and then look at what reason might be good.

Docker is the dangerous gamble which we will regret

Sometimes boring is better...

What do Docker, CoreOS, and ECS have in common? All three are relatively new technologies. Some might even call them “bleeding edge” (I won’t). In any case, all three are the opposite of boring — they’re rather hip and shiny. The point of this article is that, when it comes to technology, sometimes boring is actually better.

Sometimes Boring is Better

... and choose boring technology

If you choose to write your website in NodeJS, you just spent one of your innovation tokens. If you choose to use MongoDB, you just spent one of your innovation tokens. If you choose to use service discovery tech that's existed for a year or less, you just spent one of your innovation tokens. If you choose to write your own database, oh god, you're in trouble.

Choose Boring Technology

Ship Small Diffs

I’ll make the case for one practice that works very well operationally: deploying small units of code to production on a regular basis. I think that your deploys should be measured in dozens of lines of code rather than hundreds.

Ship Small Diffs

Docker in Production: A history of failure

The docker adoption started with minor new services. At first, everything worked fine in dev, in testing and in production. The kernel panics slowly began to happen as more web services and web applications were dockerized. The stability issues became more prominent and impactful as we grew.

Docker in Production: A history of failure

Is Kubernetes too complicated?

Like a lot of other tech that has ostensibly come out of google, it will likely have at least one major source of complexity that 95% of people do not need and will not want. I've not gone looking for a custom implementation of http/2 with a broken congestion window, but maybe one will turn up.

Many of the problems that Kubernetes provides abstractions for, as opposed to solutions for, will age gracelessly as consensus grows on how to approach them. The balkanization of cluster management systems will fade as consensus solves by convention what is currently open to experimentation.

Is Kubernetes too complicated?


Technology, Docker


2018/05/21 07:56

Kids learn everything quickly compared to adults, and are almost always willing to make mistakes at a much higher rate than adults are. Language starts with "babbling" — I think it's just as important to "babble" in anything you're trying to learn.

So true. Tinkering, Babbling, call it what you like, the path to mastery begins with play.

Side Note: This is why programming languages which have a REPL (Read, Eval, Print Loop) win.


Programming, Learning

Quitting Twitter

2018/02/02 16:05

No, I'm not quitting twitter but this piece from The Awl made me smile.

I want to pass along the valuable knowledge I’ve gained from avoiding it: 1) There is nothing important that happens on Twitter that you will not learn about eventually. 2) There is nothing you will eventually hear about from Twitter that will make you think, “Gosh, I wish I knew that earlier.” You are not missing anything. You do not need to march in the mediocrity parade of frustrated comedians trying to make the same stupid joke a fraction of a second before anyone else. Your image does not need curation, because all you are doing is broadcasting your desperation. No one is cool on Twitter. It is a giant assemblage of sad people trying too hard in real time.

As social-media-exile pieces go, this is short, sweet, and suitably stinging. Please read the whole piece.


twitter, social-media-exile-essay

Quick Links

2018/01/16 14:07

Agile: The Elevator Pitch is a good collection of short concise summaries of what "Agile" is. This is my favorite...

Make progress with imperfect information and adjust as new information arrives.

One Day Sprints John Cutler has lots of interesting things to say about Agile Software development. He's worth following.

No standup
Have conversation
Agree on something small
Go home

Postel's Law Also known as the TCP Robustness Principle:

Be conservative in what you do, be liberal in what you accept from others.

Not just applicable to low-level data transmission, this is a rule to live by.



Writing Minecraft Mods in ES6

2017/10/28 21:15

Howling Wolf

ES6 (the latest and greatest incarnation of the Javascript Language) has been kicking around for a while but I have only recently reluctantly succumbed to its charms. I'm finally - after years of dubious sidelong glances - warming to to ES6's fat arrow functions.

I like ES6 fat arrows for one simple reason - they result in less code, which usually results in more expressive, easier-to-understand code. Let me demonstrate with a before and after comparison.

The following code is a simple ScriptCraft plugin which will cause a wolf howl to be emitted every time a player breaks a block:

// howling-blocks.js
var sounds = require('sounds');
events.blockBreak( function( evt ) {
  sounds.entityWolfHowl( evt.block );              
} );

Every event in the Minecraft API is a method of the events object so you can attach custom event-handling functions to any event. In the above code, every time someone breaks a block in the Minecraft game, the sound of a wolf howl will be emitted at the location where the block was broken.

Now let's take a look at the ES6 Fat arrow version:

var sounds = require('sounds');
events.blockBreak( ( evt ) => {
  sounds.entityWolfHowl( evt.block )
} );

It's a couple of characters shorter - there's no need to use the function keyword. function(evt) is replaced with (evt) =>.

We can take things further. In ES6 fat arrow functions, if the function takes just one parameter then you can omit the surrounding () around the parameter name, and if the function is just a one-liner (one statement) then you can also omit the surrounding {} curly brackets, leaving us with just this:

var sounds = require('sounds');
events.blockBreak( evt => sounds.entityWolfHowl( evt.block ) );

I like this. The intent of the code is made clearer with less syntax in the way. We can take things further again using ES6's import statement so the final code looks like this:

import { entityWolfHowl as howl } from 'sounds';
events.blockBreak( evt => howl( evt.block ) );

It's not quite as simple as the english-like when a block breaks, howl like a wolf but it's beginning to look like a DSL (Domain-Specific Language). I'm still not entirely convinced that ES6 is a better language for beginners than Javascript (aka ES5). Most beginners learn by example and will usually get by copy-pasting, then tweaking example code to suit their own needs (Beginners in this case being kids who play Minecraft and are curious about modding/programming). The ES6 example above is definitely shorter (88 characters vs 105 characters) and on the surface it seems like there's less syntax - to a beginner at least.

Anyway, It didn't take as much pain as I thought it would to get Babel and Nashorn to play nicely together (I used babel-standalone) and if you're feeling adventurous you can grab the latest code from ScriptCraft's github and try writing Minecraft Plugins in ES6 now. The in-game and server console even support ES6 syntax now (though it's somewhat limited). This will work for example: /js setTimeout( () => echo('Hello'), 1000)

...but this won't because of how Babel transforms the import statement

/js import { entityWolfHowl as howl } from 'sounds'
/js events.blockBreak( evt => howl( evt.block ) )

If you want to do something like the above then you'll need to have it all on the one /js command like this:

/js import {entityWolfHowl as howl} from 'sounds'; events.blockBreak(evt => howl(evt.block) )

...or just put it in a module.

A Caveat: ES6 support is not enabled by default. You'll need to run the following command at the server or in-game prompt first to enable ES6 modules and commands:

/js require('babel-register')

The reason it's not enabled by default is because Babel is quite a large libary (1.8 Mb of JS) and loading and evaluating it takes a fair bit of processing. You will notice your server slows down while it's loading Babel the first time. Fortunately, babel seems to be pretty quick at parsing and transforming javascript.

It was fun adding Babel/ES6 support to ScriptCraft but I'm still on the fence regarding how much I'll use ES6 in ScriptCraft going forward.


ScriptCraft, Minecraft, Javascript, ES6

On Blade Runner 2049

2017/10/07 11:11

I watched it last night with my wife in a MAXX screening. I recommend watching it on as big a screen as you can. I watched the original just a few nights ago to refresh my memory - I'd last watched Blade Runner when the Director's cut was released in the early 90s. I was living in Spain at the time and a couple of us went to see it one of the few art-house cinemas in San Sebastian.

Re-watching the original only confirmed what I'd long felt about Blade Runner. It's not a film I've ever warmed to. It's always left me cold. I guess I must be missing the point though - I don't imagine it was a film meant to be warmed to.

Blade Runner 2049 is like its predecessor in this respect - which is disappointing because I loved Villeneuve's Sicario and - especially - Arrival. Arrival had a properly overwhelming ending - an emotional sucker punch that capped a beautiful, intelligent and engaging film. I loved everything about Arrival - the story, the visuals, music and cast, so I had high hopes for Blade Runner 2049 (and still do for Dune).

First off, the one-word blurbs for Blade Runner 2049 "Mesmerizing", "A Masterpiece", "Spectacular" are all pretty much spot-on. It looks gorgeous - every frame could be a poster. It matches and surpasses the spectacle of the original.

Secondly - it is thought-provoking. I saw it late last night and I'm still digesting it 12 hours later. I haven't spoken with anyone but my wife about it and I haven't read much about it so I'm still trying to figure it out on my own (remember when that was a thing?).

The music and soundtrack is where things are just a little bit off. The score is by Hans Zimmer so the ubiquitous (and at this stage hackneyed and tiresome) Inception Bwong is all over this film. The Inception Bwong is the audio equivalent of Lens Flare - it has become an over-used trope in recent films and it's going to date this film terribly.

I would have loved to know what Daft Punk might have done for Blade Runner 2049 - their Tron Legacy soundtrack is very good. M83 (who also worked with Joe Trapanese on Oblivion's Soundtrack) might also have been a great choice.

Now on to some thoughts about the film. WARNING: Spoilers ahead.

There's some interesting ideas in Blade Runner 2049 and at almost 3 hours, they're given some room to breathe. Some people have complained the film is too long but I didn't think so.

One of the film's more interesting characters is Joy - a holographic AI companion (sold by the Wallace corporation) whose sole purpose is to make you feel good about yourself. Joy is a mass-market product sold to lonely men. The 'Joy' character attached to Ryan Gosling's 'K' is convincingly selfless and adoring - a softer, sexier Stepford. When K begins to suspect he might be the 'child' - the chosen one, Joy coquettishly intones "Didn't I always say you were special?". On learning of his elevated place in the scheme of things, it's Joy who suggested 'K' should be given a proper name like 'real' people. "How about 'Joe'? I've always like 'Joe'" she says. I have to admit I was duped too. Joy's dying declaration of love to Joe is so convincing - it's only in later scenes when K/Joe is pitched by a skyscraper-sized holographic billboard of a new 'Joy' model (you have to see it) with a casual "Hey there Joe" (as in the generic 'regular joe') that I realized even this dying 'I love you' was probably pre-programmed. The question at this stage is - does knowing that matter? To be clear, K/Joe has a pretty good idea of the bargain he's bought. Earlier in the film when Joy says "I love being with you", K/Joe says "You don't have to say that" with a look that hints at the complex dynamic between a real mind and a simulacrum.

K/Joe's boss played by Robin Wright is also pretty interesting with one of the best lines of the film "We're all just looking for something real".

There is what seems to me a gaping hole in the plot. How does Wallace's team led by 'Love' find K/Joe and Deckard in Las Vegas? Maybe I wasn't paying attention but this pivotal plot point is never explained. They just magically find them. At first it seems like they were tracked using the tracking device planted in K/Joe's coat by the prostitute but it later turns out she wasn't working for Wallace but someone else. Could Joy have led them there? Joy's "antenna" is removed (which sets off alarm bells back at Wallace HQ) but could she have been transmitting (knowlingly or otherwise) regardless? Could Joy have been an agent of Wallace (she is owned by them after all) fostering K/Joe's delusions about his own origins?

Wallace (the evil corporate villain of the piece) seems to have little regard for his own product - he summarily executes replicants for no apparent reason. He monologues. A lot.

Another thing I haven't figured out is the boy + girl DNA thing. K/Joe learns from the archives that there was a boy and a girl with matching DNA born in 2021 and that the girl died leading him to suspect he is the boy. We later learn there was no boy - only a girl. I don't think this is ever explained.

Also - and this is my last nit-pick - the link between Deckard's daughter (the dreamweaver) and K/Joe - how did K/Joe end up with her memories? Was it just random luck that they met?

All in all, Blade Runner 2049 is spectacular and engaging while you're watching it, but I don't think I'll warm to it.


movies, sf

Summer Reading 2017

2017/07/28 15:38

The Books

I love the feel and look of books after they've been read. Just look at the creased spines in the above photo. I love how the spine of a book creases and slants after it's been read on a beach or by a pool - the patina of a quickly-read book that's weathered sun and the odd splash of water and sun-cream. All of the above books were recently purchased new and after just 2 weeks they look aged - I like that.

Aldous Huxley: The Doors of Perception / Heaven and Hell

This was one of those books I read in my teens. I thought I'd give it give it another spin. This is a first-hand account of Huxley's first experience with Mescalin and what would come to be known as the Psychedelic experience. It's a short read - just 120 pages or so. I started reading it in Cork Airport on Saturday morning and finished it on the coach from Verona to Lake Garda that afternoon.

Arthur C. Clarke: Rendezvous with Rama

I love reading science fiction on holidays. If you're looking for a book to read while soaking up the sun and recharging the batteries, this is the perfect book. Clarke is a master of this genre - he can walk you through the impossible like it's the everyday. He's concise too - Rendezvous is a short book. Clarke can say in 250 pages what lesser writers might need 800 pages to say.

Mark Rowlands: Running with the Pack

Rowlands is a philosopher who adopted first a Wolf then a small pack of dogs with whom he runs. If running and the reasons why people run is your thing, you'll enjoy this.

George R. R. Martin: Dying of the Light

This was Martin's first (and only?) science fiction novel. It's set on a dying world where Winter is most definitely coming and features a race not unlike GoT's dothraki. There's a brutal hunt involved too. It's not as enjoyable (or readable) as his GoT books but it passes the time.

Rebecca Skloot: The Immortal Life of Henrietta Lacks

This is a non-fiction account of the life of Henrietta Lacks and her family. She was a black woman who died in 1951 and whose cancer cells (taken without her informed consent) have become a multi-billion dollar industry. She and her children have lived in poverty and haven't seen any material benefit. This is a tough read - I mean it's readable, but it's grim reading. It will make you angry.

Christopher Priest: Inverted World

More science fiction. This is quite good - it builds an improbable microcosmic world and has a twist ending. It's well written too so I'll probably seek out more of Christopher Priest's work (along with Arthur C. Clarke's).



Marathon Report

2017/06/05 11:25

So I ran my 2nd Marathon yesterday in Cork City. It was a 9am start, beautiful weather, clear blue skies and not as hot (early in the race) as it was last year. In the week leading up to it I had the usual pre-marathon niggles - a calf injury inflicted during last Tuesday's run and a groin strain during a kickabout with Sean on Saturday (you can hear Alan Partridge's sports commentary in your head right now). I woke up Sunday morning wondering if I'd make it through 1 mile never mind 26.

I woke at 5:45 am and did my usual pre-marathon prep. An early breakfast at 6:00am, some stretching and last minute packing. I put band-aids on my nipples to avoid the dreaded nipple-chafing but forgot about the other parts (more on that later - if you can stomach it). After last year's blistering heat I opted for a single instead of my usual short-sleeve running top. I didn't bother with music this time round. I've stopped listening to music while training the last couple of weeks and haven't missed it as much as I thought I would. Besides, for a Marathon where there's great support from the crowd, running with earphones in your ear means you miss out on all that buzz.

I drove to the Black Ash park-and-ride and arrived in time for the 1st bus at 7:30 am. I was in City Hall before 8am with plenty of time to kill. I hung around for a bit before heading to the start point on Patrick Street where I sound found Conor and Catherine. We took some pictures and chatted for a while before taking our positions in the huddle. I stood a few yards back from the 4:00 pacers. My plan was to keep them in my sights for as long as possible and aim for a sub-4:00 time. That was the plan at least.

Top athletes before the carnage of @TheCorkMarathon /cc @walter

— Conor O'Neill (@conoro) June 4, 2017

In a city Marathon with more than a 1000 runners, the first mile will inevitably be slow, I'd planned for that. My first mile was 9:53 minutes but I wasn't too bothered, there was plenty of time and distance to catch up with the 4:00 hour pacers. It was a beautiful clear-skied morning and I was soaking up the atmosphere more so than I had last year. The first few miles flew by (the first in particular - my watch beeped as I passed the first mile and I couldn't believe it) - so much so I was running faster than I'd planned - just under 9:00 minutes per mile. I didn't fret too much about the pace - I was having such a good time. Along the quays by the train station I was admiring the view of the wide river lee and thinking 'This is Glorious'. For the first 8 miles I was on a runner's high. Just completely enjoying the experience of running in a pack on a beautiful morning. The running was easy and a little faster than planned - my fastest mile was mile 6 which I ran at 8:30 pace. Running through the Jack Lynch tunnel is always an experience. The stretch from the tunnel to the Mahon Point off-ramp seemed longer than I remembered but I was still comfortable and on pace. I got running in lock-step with and talking to another runner who was also aiming for sub 4:00 and it was also his second marathon. We chatted for a while and actually stayed pretty much in lock-step from mile 8 through mile 14.

The first minor glitch happened as I was nearing the 13 mile mark. There's a short ramp leading up to a pedestrian overpass on the M8. I grabbed a slice of orange and sucked on it as I started up the ramp. By the time I'd reached the top of the ramp and discarded the orange skin, I was short of breath and my legs hurt. It only lasted a couple of seconds but it was the first discomfort I felt on the run. I was still on target and even caught up with one of the 4:00 pacers. Along the old railway stretch of the route I began to lag behind the pacers. I was still running and chatting with my fellow 2nd-timer but decided I needed to push on a bit faster to catch up. This is when slowly but surely my hopes of a sub-4 marathon began to dissipate. By the time I got back on to the Marina the 4:00 pacers were nowhere to be seen. I forged on ahead. I was still doing 9:15 and 9:30 miles now so hope wasn't entirely lost.

In the fortnight leading up to the race I'd planned some landmarks and times I needed to do a sub-4:00 marathon. The 10 mile mark was along the blackrock road and I'd need do it in 1 hour 31 minutes and 30 seconds. The next landmark was 16 miles at Lapp's Quay. I'd need to be there by 2:26:24 to stay on target, after that 20 miles just beyond the Lough at 3:03:00 then 23 miles on the Curraheend road and home. Breaking up the Marathon into 10, 16, 20 and 23 sections made it more manageable in my head. I knew I could race 16 miles because I'd done 2 point-to-point races of similar distance in the last couple of months. I didn't tick off the miles because there were too many and if I thought about it too much it would be overwhelming.

At the 16 mile mark I looked at my watch. 2:29 - I was just 3 minutes off of my sub 4:00 target at that stage. As I ran up the south link road, I knew what lay ahead - a viciously steep corkscrew on-ramp on to Turner's Cross. On the approach I was repeating aloud a mantra I'd promised myself "Do not walk. Do not walk.". A runner alongside me said "If it's all the same to you, I think I'll walk this part". I can't say I blamed him - the onramp is steep. I ran it and was out-of-breath as I turned on to Turner's cross. By now I was running with effort. The support from the crowd through Turner's Cross and Togher was great but the hills - my god the hills. The route this year changed to avoid churches and sunday mass so much of this stretch was unfamiliar. I just remember having to repeat my "Do not walk" mantra many times through Togher.

At mile 19 disaster struck and I had a pretty severe stitch in my right leg (the same leg I'd injured twice in the days leading up to the Marathon). It was so severe I had to stop and stretch for a minute before gingerly taking off again. At the Lough there was great support from the crowd. A water station, sponges, and a friendly local with a garden hose set to 'mist' was just what I needed. Another boost was catching co-worker and fellow runner Irene in the crowd (she'd planned to run the relay race but had to cancel). I'd seen Irene and her family near the 10 mile mark earlier. I'm pretty sure my form wasn't as good at the 19 mile mark. I was dimly aware of some chafing on my right big toe and on my arms but it barely registered as a background niggle.

At the 20 mile mark spectators were chanting bib numbers to egg us on - our bibs didn't include names this year (something I think needs to be fixed next year). "318! 318!" they chanted as I approached. I have to say the support from spectators MAKES ALL THE DIFFERENCE when you're running a Marathon. I feed off of it as I'm sure other runners do. Kids holding out their hands to be slapped by passing runners, spectators with jelly babies, sliced oranges and sweets. The cheers. IT ALL HELPS. It's something I enjoyed and needed much more this year than last year. Last year I ran with Music and earphones and missed out on this important aspect.

It was downhill towards Farmer's cross but I knew I'd be paying for this easy downhill section shortly. We were heading towards another rerouted section - a long uphill stretch at Faranlea Road, Faranlea Park and on to Model Farm road. As I headed up Faranlea Park I heard a friendly "Hello" from Brendan, a former colleague. Brendan is a fast runner and was doing 2 sections of the relay race. "How's it going?" he asked. I can't even remember what I replied. "Come on! This is the last hill." he said. "I probably shouldn't be trying to keep up with you - I've seen your strava runs" I replied. "Stay with me til the top of the hill then, and I'll push on". So I did. Brendan was a life-saver at that point. You need all the support you can get.

The downhill stretch of the Model Farm Road was the only thing keeping me running. The promise I made to myself to not walk now had a sub-clause "do not walk except at water stations". It was past noon now, the day was heating up and my legs were exhausted. As I turned on to the Curraheen road I tried to pick up speed - this is a road I often run along in training so I knew there were just 3.2 miles left. Pretty soon I was walking again, right up to the point where the 4:15 pacers passed me out along the Lee Fields. "Uh oh" I thought - "Can't let that happen". I started running again and stuck with the 4:15 pacers right up until the Kingsley Hotel where my legs failed me again and I just had to walk. I must have walked the whole stretch from the Kingsley up to the Mardyke Arena before taking off again. By now the 4:15 pacers were out of sight. I was surrounded by people walking and shuffling their way along, just like me. It's super easy to stop running and just walk when your legs are tired and you're surrounded by walkers. It takes real force of will to keep running - will which I just didn't have on the day. Things weren't as bad as last year but still, I had promised myself I wouldn't walk no matter what and I'd broken that promise.

They say the last 6.2 miles is equal in effort to the first 20 miles and that felt true. In truth though, yesterday's Marathon also felt easier than last year's. In many ways this feels like my first - not second - Marathon. It's the first Marathon I truly raced. The first where I just wanted to finish the damn thing as quickly as possible. The 15 mile and 25k point-to-point races I've done since my first Marathon have given me a sharper more competitive edge. Last year's Marathon training didn't go to plan - I ramped up too quickly and too early and got injured, so I was holding back on the day just hoping to complete it without further injury. This year the training went better - I didn't hold back - I was racing not just participating.

Mile 26 began with a walk but shortly after crossing the Mardyke Bridge I began running (well - jogging) again and continued to do so for the rest of the race. This was it - the final stretch. "You can do this" I repeated to myself "Do not walk!" I said to myself as I ran along Wise's Quay and crossed the bridge on to North Main street. This was another stretch which was part of a reroute. North main street normally isn't the most picturesque of Cork city streets but I was glad to see it: the final stretch - nearly home. The street has cobbled speed ramps which didn't cause too much of a problem (for me at least). I looked at my watch about halfway up North Main street - it read 4:15:00. My head was foggy but I was pretty sure I could finish in under 4:20 barring any catastrophes and this gave me a bit of a boost. North Main street was lined with spectators cheering and the noise of the crowd became progressively louder as we turned on to Washington street, the Grand Parade and then Patrick Street. Patrick Street is Cork's main street. In previous years the finish line was about half way up the street and you'd arrive there from the opposite end of the street (turning Right on to it from Lavitt's Quay). I got it into my head that the finish line was nearer the west end of the street (near Carey's Lane) and so started my final kick as I turned on to Grand Parade. As it turned out the finish line was much further east (east of Opera Lane) - still I kept going. Soon I could see the finish line and the clock read 4:18:49. I sprinted to the finish to get in just under the 4:19:00 mark (even though I knew the clock time was meaningless - I had a chip and a GPS watch). That last mad dash for the finish took more out of me than I imagined.

I crossed the finish line and as soon as I did I felt a strange pain across my shoulders and upper arms. I stopped my watch at 4:17:42. I shook my arms and stretched them above my head. I'd really given it my all for that last stretch and final dash and as soon as I stopped the overriding pains in my legs were replaced by other pains I had barely noticed. My arms were badly chafed and the blister I'd felt forming around the 20 mile mark was now screaming for attention. Alongside all of this was the most incredible feeling - a feeling of accomplishment and euphoria. The whole experience while it lasted was properly overwhelming. I began looking for Ursula and the kids in the crowd but couldn't see them. Within yards of the finish line I stopped to lean against a table and just gasped for breath. Two women either side of me were catching their breath too. The finishing area was a good 100 yards or so and I knew I had to get water and something to eat. There were tables covered in Chocolate bars and Water bottles. I grabbed a water bottle and saw the Banana table just a few yards ahead. I grabbed one, clumsily skinned it and wolfed it down with some water. I was starting to feel better already. 4:17:42 That's a time I could live with. I was happy. I rang Ursula to see where she was - they'd gotten caught up in Marathon traffic reroutes and were on North Main street but would be on Patrick Street in 5 minutes. I'd suggested they be there for 1:15pm (assuming a 4:15 time - I'd had 3 times in mind 4:30 , 4:15 and 4:00 and figured it was best to tell them the median time - I didn't want them waiting too long if I didn't make the 4:00 pace).

While I was waiting for Ursula I saw Kelson - another work colleague - finish. We'd passed each other once or twice around the 8 mile mark. "How did you do?" I asked. "Happy enough - under 4:30". I was pleased for him - pleased for everybody actually. My first Marathon had felt much more like a solo affair - maybe it was the earphones but I didn't relish and savor the experience as much as I should have. This time was different - it felt much more like a communal experience. I was genuinely happy to see even passingly familiar faces. Ursula and the kids showed up just as I wished Kelson farewell. We took a picture of me and the kids.

Cork 2017 Marathon

Now came the post-race logistics. Where to grab lunch with Ursula and the kids. But first I had to shower and change clothes. Joe - another colleague - had tipped me off about post-marathon showers in the Clayton hotel - it was just across the river from the baggage drop in city hall and for 5 euro you could avail of their changing rooms and showers. I said I'd meet Ursula and the kids again in a few minutes after I'd showered and changed and then we could figure out where to eat. I picked up my bag from City Hall and headed over to the Clayton. There were plenty other Marathon runners there. The Mens changing room was busy. I hopped into a shower and began washing. That's when I realised just how bad my chafing was. I stupidly hadn't put body-glide or anti-chafing cream on before the race and as I started cleaning my - let's say - sensitive bits I realised just how bad the chafing was. Let's just say I emitted a short high-pitched involuntary squeal - one that must have had the all-male attendees wondering if a girl was in the men's showers. I finished up and - very tenderly - dried myself off, got changed and swore to stock up on body-glide next year.

I headed out back towards Patrick street and by now the knees were starting to feel like jelly already. I was feeling that exquisite long-run pain in my ankles and knees and was already walking like John Wayne - as were many others. The city center was buzzing with post-marathon activity - many of the runners now cooling off outside bars with pints of beer. I caught up with Ursula and the kids and we decided to go for Chinese in Yuan Ming Yuan - a favorite of ours - they do great dumplings. As I turned off Patrick street I spotted Conor approaching the finish line - he was running strong. I ran over to the barrier to cheer him on but I'm not sure he heard me. We headed on up towards Princes Street and opted for seafood in Quinlans instead. It was good to finally sit down and rest. My legs were aching but I was still basking in the feeling of accomplishment. Lunch with the family was the perfect end to a good Marathon - another difference from last year when I could only spend a little time with the family because our eldest was heading to Waterford for a 3 week stay in the Gaeltacht.

This felt more like a Marathon - everything went better, the training, the weather on the day, the race, support from the crowds and little moments along the way. And of the course the Finish which felt incredible compared to last year's damp squib. It was properly overwhelming. I'm already considering when my next one will be.



Cork City Marathon 2017

2017/05/07 17:03

Four weeks from today I'll be running the Cork City Marathon. It will be only my 2nd Marathon. This one is a grudge match. I ran the same race last year and finished in 4 hours 52 minutes. Not a great finish time. I've been training for this upcoming one since late February and (knock on wood) the training has been going exactly to plan so far.

This morning I finished my 2nd long run (17.4 miles) from home in Ballincollig west of Cork City to BlackRock Village east of Cork city and back. I had a great race two weeks ago - the Great Railway run from Cork to Carrigaline - a 25 Kilometer distance. I averaged 8:46 per mile in that race - almost fast enough to revive hopes of a sub-4 hour marathon. I'd need to average 9:09 per mile to do a sub-4 marathon. I don't know if the legs, lungs, heart and training are up to that just yet.

I have just one more long run - 20 miles next Sunday, then the Taper begins. In the lead up to a Marathon it becomes all-consuming. I fluctuate between thinking I can realistically do a sub-4. At the very least I hope to do a sub 4:30 . If I take longer than that I'll be disappointed. There's a lot that can go wrong in a Marathon. Last year I injured myself in Training - I ramped up the miles too quickly and too early. This year I've been sticking to a more conservative plan which only increases mileage at a rate of < 10% per week. Last year, the day of the Marathon was quite warm. I held back for the first 5 miles sticking to a 11 min pace. To be honest I was so nervous about the injury and making it worse that I was just happy to get around the full 26.2 miles. This year I have 3 time bands in mind.

If I complete it in under 4 hours 30 minutes I'll be happy.
If I do it in under 4 hours 15 minutes I'll be happier.
If I do a sub 4 I'll be over the moon.

Just four weeks to go so we'll see. If you're on strava you can see my training log.


Running, Marathon

The Witcher Books

2017/04/17 15:15

The Witcher videogame for PS4 was on sale recently for €17.99 on Playstation Network. It's been widely revered as one of the best videogames of all time so I went ahead and purchased. That was more than a month ago and I still haven't actually played it yet. That's because I can only afford to have one videogame addiction at a time and my current addiction is still Metal Gear Solid V: The Phantom Pain.

Almost as interesting as The Witcher game is the story of how it was made. It was developed by a relatively small Polish Game Development Studio who by all accounts have been punching well above their weight. The games are based on a series of books by Polish writer Andrzej Sapkowski. I was frankly afraid to start playing this game based on what I'd heard about it. Given how much time I've ploughed into Metal Gear Solid, I could well see myself getting completely lost in The Witcher. Rather than actually play the game, I watched a couple of videos about it.

This led me to reading the books. They're good. They're very very good. If you like Game of Thrones, you'll love Sapkowski's salty fantasy world of The Witcher. The first book I read was 'The Last Wish' - this is the first book in which Yennifer (A sorceress who features in the videogame) makes an appearance. Also recommended is follow-up book 'Sword of Destiny' which features Ciri (also a character in the Videogame). Both books are collections of short stories which were written in the early 90s. The author seems to be ambivalent about the success of the videogame but its success has surely brought him more readers. Were it not for the videogame (which I still haven't played), I would never have heard of these books. Sapkowski's books deserve a wider audience. He's a good writer and the books are fun and entertaining. Highly recommended. I may even some day play the video game of the books.


fantasy, books

Metal Gear Solid

2017/04/17 14:54

We got a PlayStation 4 for Christmas this year. It was 9 years since we last bought a Gaming Console so it was time. I picked up Metal Gear Solid V : The Definitive Edition for €27.99 - a steal.

I'm a fan of Stealth games - I loved GoldenEye for the Wii. I'd never played any of the Metal Gear Solid series, despite having a PlayStation one many years ago. MGS V had been getting great reviews so I gave it a shot. So far I've put about 100 hours into the game. Yes. I like this game a lot. It is surprisingly deep - a game that for the most part rewards slow thoughtful play rather than rushing in all guns blazing. Much of the fun of MGS V is to be had simply sneaking up on sites and surveying the lay of the land from a safe distance, then picking off targets one by one.

It's been almost 4 months now since I started playing and I still haven't become bored with the game. There is a lot to love about this game but it's not without glaring faults. The story is complete nonsense and the overtly sexualized female companion 'Quiet' is a little troubling. The start of the game consists of - for the most part - an extended cut-scene which involves very little actual game-play. The opening cut-scene is about 45 minutes long and is painful. Thankfully, once the game begins proper it's a ton of fun. Each mission has opening and closing credits which remind you that this game was CREATED AND DIRECTED BY HIDEO KOJIMA . This gets a little annoying after you've seen it the umpteenth time.

If you liked GoldenEye for the Wii, you'll love Metal Gear Solid V. Do yourself a favor - if you've got the Definitive Edition skip the pointless 'Ground Zeroes' and jump straight into 'The Phantom Pain' - it's a completely different feeling game. I feel like there's a lot more I could probably say about MGS V but this will have to do for now.



Justice - Woman

2017/04/17 14:47

I've been a fan of French electronica duo Justice since 2008. I've loved both of their previous albums and just got their latest (Woman) on a couple of days ago.

It's an album almost designed for previewing. It's full of sumptuous disco-tinged tracks which sound great for about 20 seconds and when previewed on sites like 7digital and iTunes, hint at great things which never actually transpire. The problem with Woman is that many of the tracks sound pleasant enough, but are lacking something vital - a chorus. It's all verse and bridge but lacks a killer chorus that would truly make it memorable.

It's a pity because Justice have done some great things in the past. This album feels like they're coasting. It's good but not great.




2017/04/04 07:01

On a rainy cold Saturday morning in March 2017, thousands of people queued for hours in the cold to gain entrance to a Gaming Convention. They'd paid a lot of money to attend and many of them didn't get in. The venue could only accommodate 9,700, the conference organiser sold 25,000 tickets. That's Dublin and Irish ah-sure-it'll-be-grand Entreprenurialism for ya.

Inevitably there was a Social Media Backlash™. I wasn't one of those attending but a friend had asked would I be interested in going. It was a Video Gaming Convention and although I play video games, the thought of attending a conference devoted to video gaming does not appeal.

The sight of 1,000s of parents and kids queueing in the cold and the rain that Saturday morning brought me back to Saturday mornings more than 30 years ago. Dublin was very different then (we didn't have a Convention Center affectionately known as 'The Tube in the Cube', and we didn't have commercialy-run Video Gaming Conferences that scalped paying customers). I think 30 years is a suitable time for reminiscing. The 80s is now a long time ago. To my kids it seems prehistoric.

Temple Bar in 1985 wasn't too different to now. It wasn't yet the stag-night goto it became in the mid to late 90s. Some of its landmarks have been there since before I can remember. The Bad Ass Cafe, the record and camera shops, the older pubs, the Project Theatre. There were also a lot more comic shops back then, and of course there was The Alchemist Head - a mecca for anyone who read science-fiction. The Alchemist Head was a small single-story bookshop on Essex street just across the street from the Project Theatre. It kept odd opening hours if I recall correctly - it sometimes didn't open until after 10:30 am. I remember waiting outside and peering through the shop window where the latest books by Douglas Adams and Brian Aldiss were on display. There were also posters on the walls - the iconic image of Harrison Ford clinging on for dear life from a metal beam in Blade Runner.

Blade Runner

What brought me to The Alchemist Head wasn't books but a selection of new and second-hand comics they sold. I'd often go rifling through the 2nd-hand section looking for old issues of 2000AD. I'd occasionally pick up an issue of 'Epic Illustrated' - Marvel's "adult" imprint, which featured stories by Alan Moore and others. As far as I know, The Alchemist Head was the only place in Dublin that sold 'Epic Illustrated'.

A visit to The Alchemist Head became a regular Saturday pilgrimage throughout 1985 and 1986. I think it closed down sometime late in 1986 and reopened a couple of years later on Dame Street but it was a different type of bookshop selling mostly self-help, occult and other speciality books. There were other shops scattered around Temple Bar which sold Comics - there was a shop just alongside the Central Bank with a great selection of new and second-hand comics. I can't for the life of me remember its name but it was also a regular haunt.


Away from Temple Bar on Anne street just off Grafton Street there was of course The Diceman - a game store which specialised in Role-Playing Games. It was - as far as I know - the only dedicated RPG store in Dublin. The Diceman store is less famous than its Mascot - The Diceman. The Diceman was a mime artist on Grafton street throughout the 80s whose job was to advertise the store. He was so entertaining that he kind of became famous in his own right. Unfortunately I think he succumbed to AIDS some time ago.

The Diceman store occupied an old georgian-style building on Anne street. It had a selection of Board Games and wooden toys on its ground floor but downstairs in the basement was where all the good stuff was. The basement was poorly lit and smelled of Incense (I think) but it had everything a 14 year old RPG fan could ever want. Metal Figurines, every RPG you could think of - Dungeons & Dragons, Advanced Dungeons & Dragons, Traveller and many more. There were metal figurines and paints too. All of the RPG supplements and magazines (White Dwarf etc). The same music seemed to always be playing - I vividly remember hearing Billy Idol's "Dancing with Myself" more than once during the same visit.

Epic Illustrated

The Diceman too was not long for this world and closed down not long afterwards. I remember missing those stores - I still do.

Just a few doors up from the Diceman was another 2nd-hand book shop - god there used to be so many of them in Dublin. That's where I chanced upon a horde of 'Warrior' magazines. I was big into 2000AD at the time and 'Warrior' was - like 'Epic Illustrated' - aimed at the more mature reader. It shared many of the same writers and artists as 2000AD. 'Warrior' was where Alan Moore's "MiracleMan" and "V for Vendetta" were first published. By the time I discovered 'Warrior' it had already ceased publication. It ran from around 1982 to 1984/5. Unlike 'Epic Illustrated' , 'Warrior' was not full-color but the writing was great - even better than its American counterpart.


Shortly after my daughter was born, in a fit of nostalgia I bought full sets of both 'Epic Illustrated' and 'Warrior' on eBay. This would have been around 2002 - FIFTEEN years ago now! I still have those sets - each issue in a plastic cover - though to be fair I didn't buy them in Mint Condition (I'm not made of money) and only bought them to re-read and satisfy my nostalgia.

What's prompted all this reminiscing? I sometimes fervently wish I could go back to that time. The book, comic and game shops of my youth are gone for good. On a recent trip to Dublin I drove down Cork street and the Coombe where there was once a shop that sold 2nd-hand comics - you could get real bargains there. Even though the Coombe has changed a lot the store's building was still there but boarded up. Walking down Grafton street I peered along Anne Street but the Diceman sign was not there. I didn't bother to go see what was in its place.

I don't miss Dublin or the 80s per se, just that nebulous time and place when there were things to do and places to go that were just a little off the beaten path.


Gaming, Nostalgia, Dublin, 80s

Serializing Asynchronous Tasks in Javascript

2017/03/29 08:43

You have an Array and an asynchronous task which must be performed on each element in the array. You want the array to process in series. That is - each item in the array is only processed after the previous item has been processed.
You're using Node.js or a system with the same callback conventions/signature.

function series( array, asyncOp, done){
  var len = array.length,
      results = [];
  if (len == 0){
    if (done) {
      done(null, []);

  function each(n){
    asyncOp(array[n], function(err, result){
      if (err){
      if (n < len -1 ) {
      if (done) {
        done(null, results);

Let's create a silly asynchronous function to demonstrate:

function lazyOp( item, next ){
    if (typeof next == 'function'){
      next(null, item);
  }, Math.random() * 2000);

This function will print the item after a random period of time (somewhere between 0 and 2 seconds). If we were to run this lazyOp over an array using forEach() the items would be processed out of order:

[ 1, 2, 3, 4, 5].forEach(lazyOp);

The results might look like this:


Whereas if we run them using the series() function above:

series([ 1, 2, 3, 4, 5], lazyOp);

Each item in the array is guaranteed to be processed in order.


In NodeLand, most operations are asynchronous. That is, they do something and tell you when it's done via a callback function you provide - these operations are usually subject to the vagaries of network or other latencies. Sometimes you want things done in a certain order so being able to guarantee the order in which operations is important.

Isn't there already a NPM package that will do this? Why of course but it was interesting to work out in code how to go about implementing such a function from scratch. It scratched an itch. Sometimes it's fun to just take a problem and start coding - taking a rough, hazy line of thinking, and distilling and crystalizing it in to working code.

Update: Using async.series

As mentioned earlier, there is an open-source module which lets you do this. The async.series() function takes a list of tasks (functions) and performs each in series. If we were to use this to perform the same operation over an array in series, it would look something like this:

var series = require('async').series;
var tasks = [1, 2, 3, 4, 5].map(function(item){
  return function(callback){ 
    lazyOp(item, callback);
series( tasks );

Can this code be improved and/or made succinct? It's javascript - of course it can.


Javascript, Programming


2016/12/31 11:09

So ... 2016. I haven't posted on the blog for a couple of reasons - Kids, Family, Work, much-needed time away from screens - the usual.

Lake Garda Sunset

In Books

A last minute holiday in Lake Garda in the middle of summer gave me some time to read. I remain skeptical of eBooks so brought some paperbacks in my luggage.

Flowers For Algernon - Daniel Keyes

This was really good. As with 'Dune' and other Science Fiction classics, it's been on my radar forever (since I was 10 years old at least) but I only got around to reading it this year. Given it was written in the 60s (like Dune) it has aged really well. It's very moving.

Fairy Tales - Hermann Hesse

I read a lot of Hesse in my teens/early 20s and 'Fairy Tales' has been sitting on my shelf for a couple of years. Maybe I've outgrown Hesse but this collection of short stories was not as good as I hoped. Siddharta, Steppenwolf, and Demian remain three of my favorite books.

Brave New World - Aldous Huxley

This was a re-read. I first read this in 1989 - I was 18 years old at the time and the world was very different then - it blew my mind. It hasn't aged well over the intervening 27 years. There's still some interesting ideas but it feels a little 'Jules Verne' now.

Seveneves - Neal Stephenson

This was a long read. It's contemporary science-fiction set in a not-too-distant future where the moon shatters, prompting a race against time to create an off-world survival ark. The first 2 thirds of the book are riveting, the last 3rd not so much.

Helliconia Trilogy - Brian Aldiss

I began reading this on and off a couple of months ago but haven't yet finished it. It's good but I just don't seem to get the time to read as much as I'd like.

My own book Writing Minecraft Plugins in Javascript hasn't exactly been flying off the shelves. Computer books of a technical nature tend to have a short shelf-life and become obsolete, that's why - for much of my book - I focus on teaching Javascript (which isn't going away anytime soon). The latter 3rd of the book introduces Java and the CanaryMod API which sadly is no longer being actively developed. Nonetheless, ScriptCraft works just fine with SpigotMC which is being actively developed.

In Running

I finally bit the bullet and signed up for a Marathon in 2016. I did it mostly because it was getting weird having to explain to friends and colleagues (who know I run) why I hadn't yet run a Marathon. I did the local Marathon (Cork City) in June. It was hot and hilly, I wasn't as prepared as I could have been so the arse fell out of it around mile 10. I finished in 4 hours 52 minutes. Definitely room for improvement.

I ran just over 1,000 miles this year.

In Work

This was my 6th year at IBM. The work continues to be interesting and the people are great. In an industry that has its fair share of sociopaths, I've never encountered any at IBM. Maybe I've just been lucky but the people I've worked with at IBM have been an all round decent bunch. This year I ran a couple of NodeJS workshops in Cork and Galway. Hopefully in 2017 I'll devise and run an AngularJS workshop, among other things. Our project migrated to using Git for revision control recently. It's been an interesting move. Git is a revision control system that exposes a lot of its internals - so much so it can be thought of more as a revision control construction set. If revision control systems are your thing, you'll love git. I've been making a concerted effort to master git over the past few weeks. Despite having a github account for a couple of years, and maintaining a repository (ScriptCraft) with 100s of forks and 1000s of stars, I never really understood git until very recently.

In Miscellaneous

I finally got around (just this morning actually) to updating all of my domains to use HTTPS. It was much easier than I expected thanks to LetsEncrypt.

This Christmas I haven't spent as much time working on ScriptCraft as I'd hoped. I do feel a little guilty about not coding in my spare time - but not that guilty.

The best software developers I know are always hacking over the holidays.

True story.
-- Joe McCann on Twitter

Instead I've been playing video games - the latest generation. There was a family surprise underneath the Christmas tree this year - a Playstation 4. It's been 9 years since we last got a console (Nintendo's Wii), and 18 years since I got a 1st generation Playstation - so yeah - it was time.

I've been playing Star Wars Battlefront (in split-screen mode with my son Sean) and TitanFall 2 which is every bit as good as I'd hoped. I got Metal Gear Solid V but haven't yet played it very much. Rocket League is also good chaotic fun.

Hope you all have a great 2017.



Paul Higgins 1939 - 2015

2015/08/06 19:56

I was 20 minutes into the 3 hour drive to Dublin, just outside Watergrasshill on the M8 when I got the call from the nursing home. It was Janet, the head nurse:

Hi Walter, are you driving right now?
Can you pull over?

I pulled in to the hard shoulder and braced for the news. I knew his health was failing, I'd been up to see him with my kids just days previously. He had seemed in better health than I expected, he asked the kids about school.

It's bad news I'm afraid. He's just passed away.

I noted the time, it was 11:10 am on an overcast sunday morning. The motorway sign said I was 1 KM from Watergrasshill. He passed away peacefully in his sleep. The nursing home nurses were present by his bed.

I was 1 kilometer from watergrasshill, 2 hours and 40 minutes away when it happened.

He was born on September 1st 1939 in Dublin. He grew up in Crumlin, the youngest of 8 - "the nipper". This is a picture of him on a motorbike taken on Saul Road. He was 12 years old. He and my son Sean look uncannily alike.

Dad on Bike, Saul Road, 1951

I had never seen that picture before until yesterday, the day I buried Dad. I love that picture because it surprised me and in doing so reminded me of what I'll miss most about him - he was full of surprises.

The day after a funeral is probably the roughest. I woke up this morning with the distinct feeling that something of me had been buried too. I feel lessened.

One good thing that comes of funerals is the meeting of the wider family. It was great. They are the best. We should meet more often.

This is a picture of my Dad taken at our wedding 15 years ago. He was 60 years old and still in rude health and full of mischief.

Dad aged 60

He doted on his grandkids Kate and Sean - Always sent them cards and gifts on their birthdays and at Christmas. They took the news hard.

He was a dad, a brother, a husband and a doting grandfather. He'll be missed by us all.



Writing Minecraft Plugins - The Book in Print.

2015/04/18 07:47

Yesterday, author copies of A Beginner's Guide to Writing Minecraft Plugins in Javascript arrived in the post. A courier dropped by with a cardboard box of 24 copies, and an additional copy in a Jiffy envelope. My youngest had some friends over for his 9th birthday and couldn't wait for me to get home, so Ursula took out the first copy from the Jiffy. To be fair I would have asked her to do this anyway when she called me on the phone. I was like a kid at Christmas when I got the call.

first copy with box

What follows are some photos and short notes on the book. As you'll probably guess, I'm a bit of a bibliophile. I love books - not just technical books. Having my very own technical book with my name on the cover is, well ... something.


One of the things I explain early in the book is Modules. The commonjs module system (used by Node.js and ScriptCraft) is the most concise and elegant module system I've ever used. Teaching modules and modularization is usually an afterthought when teaching programming to beginners but it's such an important part of programming and it's done so well in CommonJS that I wanted to cover it in the first half of the book.


The book is in full color throughout its 310 pages and is printed on high quality paper.

full color

Source code listings are - for the most part - short. This screenshot shows one of the medium size code listings - an example use of Javascript's switch statement:

code listing

The book has many different types of content, source code listings, tables, diagrams, screenshots, side-notes and so on.


This is a full page table and source-code listing on opposite pages.


Peachpit have done a wonderful job on the production of this book. The cover, spine, paper quality and layout are what you'd expect from a publisher that specializes in Photography and Education. This book looks and feels better than I dared imagine.


I'm a big believer in books - actual physical books - as a way to learn and be inspired. I tried to write the kind of book I would have wanted to read when I was 12 years old and just starting out programming. I can only hope now that this book ignites the programming spark in readers and maybe - just maybe - inspires some of the next generation of programmers.


ScriptCraft, Writing, Minecraft, Javascript