+++*

Symbolic Forest

A homage to loading screens.

Blog : Page 23

We can rebuild it! We have the technology! (part one)

Or, how many different ways can you host a website?

I said the other day I’d write something about how I rebuilt the site, what choices I made and what coding was involved. I’ve a feeling this might end up stretched into a couple of posts or so, concentrating on different areas. We’ll start, though, by talking about the tech I used to redevelop the site with, and, indeed, how websites tend to be structured in general.

Back in the early days of the web, 25 or 30 years ago now, to create a website you wrote all your code into files and pushed it up to a web server. When a user went to the site, the server would send them exactly the files you’d written, and their browser would display them. The server didn’t do very much at all, and nor did the browser, but sites like this were a pain to maintain. If you look at this website, aside from the text in the middle you’re actually reading, there’s an awful lot of stuff which is the same on every page. We’ve got the header at the top and the sidebar down below (or over on the right, if you’re reading this on a desktop PC). Moreover, look at how we show the number of posts I’ve written each month, or the number in each category. One new post means every single page has to be updated with the new count. Websites from the early days of the web didn’t have that sort of feature, because they would have been ridiculous to maintain.

The previous version of this site used Wordpress, technology from the next generation onward. With Wordpress, the site’s files contain a whole load of code that’s actually run by the web server itself: most of it written by the Wordpress developers, some of it written by the site developer. The code contains templates that control how each kind of page on the site should look; the content itself sits in a database. Whenever someone loads a page from the website, the web server runs the code for that template; the code finds the right content in the database, merges the content into the template, and sends it back to the user. This is the way that most Content Management Systems (CMSes) work, and is really good if you want your site to include features that are dynamically-generated and potentially different on every request, like a “search this site” function. However, it means your webserver is doing much more work than if it’s just serving up static and unchanging files. Your database is doing a lot of work, too, potentially. Databases are seen as a bit of an arcane art by a lot of software developers; they tend to be a bit of a specialism in their own right, because they can be quite unintuitive to get the best performance from. The more sophisticated your database server is, the harder it is to tune it to get the best performance from it, because how the database is searching for your data tends to be unintuitive and opaque. This is a topic that deserves an essay in its own right; all you really need to know right now is that database code can have very different performance characteristics when run against different sizes of dataset, not just because the data is bigger, but because the database itself will decide to crack the problem in an entirely different way. Real-world corporate database tuning is a full-time job; at the other end of the scale, you are liable to find that as your Wordpress blog gets bigger as you add more posts to it, you suddenly pass a point where pages from your website become horribly slow to load, and unless you know how to tune the database manually yourself you’re not going to be able to do much about it.

I said that’s how most CMSes work, but it doesn’t have to be that way. If you’ve tried blogging yourself you might have heard of the Movable Type blogging platform. This can generate each page on request like Wordpress does, but in its original incarnation it didn’t support that. The software ran on the webserver like Wordpress does, but it wasn’t needed when a user viewed the website. Instead, whenever the blogger added a new post to the site, or edited an existing post, the Movable Type software would run and generate all of the possible pages that were available so they could be served as static pages. This takes a few minutes to do each time, but that’s a one-off cost that isn’t particularly important, whereas serving pages to users becomes very fast. Where this architecture falls down is if that costly regeneration process can be triggered by some sort of end-user action. If your site allows comments, and you put something comment-dependent into the on-every-page parts of your template - the number of comments received next to links to recent posts, for example - then only small changes in the behaviour of your end-users hugely increase the load on your site. I understand Movable Type does now support dynamically-generated pages as well, but I haven’t played with it for many years so can’t tell you how the two different architectures are integrated together.

Nowadays most heavily-used sites, including blogs, have moved towards what I supposed you could call a third generation of architectural style, which offloads the majority of the computing and rendering work onto the user’s browser. The code is largely written using JavaScript frameworks such as Facebook’s React, and on the server side you have a number of simple “microservices” each carefully tuned to do a specific task, often a particular database query. Your web browser will effectively download the template and run the template on your computer (or phone), calling back to the microservices to load each chunk of information. If I wrote this site using that sort of architecture, for example, you’d probably have separate microservice calls to load the list of posts to show, the post content (maybe one call, maybe one per post), the list of category links, the list of month links, the list of popular tags and the list of links to other sites. The template files themselves have gone full-circle: they’re statically-hosted files and the webserver sends them back just as they are. This is a really good system for busy, high-traffic sites. It will be how your bank’s website works, for example, or Facebook, Twitter and so on, because it’s much more straightforward to efficiently scale a site designed this way to process high levels of traffic. Industrial-strength hosting systems, like Amazon Web Services or Microsoft Azure, have moved in ways to make this architecture very efficiently hostable, too. On the downside, your device has to download a relatively large framework library, and run its code itself. It also then has to make a number of round-trips to the back-end microservices, which can take some time on a high-latency connection. This is why sometimes a website will start loading, but then you’ll just have the website’s own spinning wait icon in the middle of the screen.

Do I need something quite so heavily-engineered for this site? Probably not. It’s not as if this site is intended to be some kind of engineering portfolio; it’s also unlikely ever to get a huge amount of traffic. With any software project, one of the most important things to do to ensure success is to make sure you don’t get distracted from what your requirements actually are. The requirements for this site are, in no real order, to be cheap to run, easy to update, and fun for me to work on; which also implies I need to be able to just sit back and write, rather than spend long periods of time working on site administration or fighting with the sort of in-browser editor used by most CMS systems. Additionally, because this site does occasionally still get traffic to some of the posts I wrote years ago, if possible I want to make sure posts retain the same URLs as they did with Wordpress.

With all that in mind, I’ve gone for a “static site generator”. This architecture works in pretty much the same way as the older versions of Movable Type I described earlier, except that none of the code runs on the server. Instead, all the code is stored on my computer (well, I store it in source control, which is maybe a topic we’ll come back to at another time) and I run it on my computer, whenever I want to make a change to the site. That generates a folder full of files, and those files then all get uploaded to the server, just as if it was still 1995, except nowadays I can write myself a tool to automate it. This gives me a site that is hopefully blink-and-you’ll-miss-it fast for you to load (partly because I didn’t incorporate much code that runs on your machine), that I have full control over, and that can be hosted very cheaply.

There are a few static site generators you can choose from if you decide to go down this architectural path, assuming you don’t want to completely roll your own. The market leader is probably Gatsby, although it has recently had some well-publicised problems in its attempt to repeat Wordpress’s success in pivoting from being a code firm to a hosting firm. Other popular examples are Jekyll and Eleventy. I decided to go with a slightly less-fashionable but very flexible option, Wintersmith. It’s not as widely-used as the others, but it is very small and slim and easily extensible, which for me means that it’s more fun to play with and adapt, to tweak to get exactly the results I want rather than being forced into a path by what the software can do. As I said above, if you want your project to be successful, don’t be distracted away from what your requirements originally were.

The downside to Wintersmith, for me, is that it’s written in CoffeeScript, a language I don’t know particularly well. However, CoffeeScript code is arguably just a different syntax for writing JavaScript,* which I do know, so I realised at the start that if I did want to write new code, I could just do it in JavaScript anyway. If I familiarised myself with CoffeeScript along the way, so much the better. We’ll get into how I did that; how I built this site and wrote my own plugins for Wintersmith to do it, in the next part of this post.

*The next part of this post, in which we discuss how to get Wintersmith to reproduce some of the features of Wordpress, is here*

* This sort of distinction—is this a different language or is this just a dialect—is the sort of thing which causes controversies in software development almost as much as it does in the natural languages. However, CoffeeScript’s official website tries to avoid controversy by taking a clear line on this: “The golden rule of CoffeeScript is: ‘it’s just JavaScript’”.

Relaunch!

It's a new day, and so on

Well, hello there! Time to start all this up again.

This blog has been dormant, for, what, the best part of a decade I think. I started a second blog all about gardening in the hope it would get me to write more in general, but this site stayed quiet. I started a Tumblr, and even managed to post things semi-occasionally, but that faded away much as the whole Tumblr community has faded too. I thought, though, midway through a rather unusual year, that it might be time to get this site going again.

My biggest motive this time, really, is that I don’t like the way the internet has been going over the past ten years ago. The old, open Web has been closing down, drifting instead toward megacorporation-owned walled gardens where you are trapped inside a corporate app that discourages you from leaving. When those walled gardens start to shrivel up and wither, what happens? Look at Facebook; look at Twitter; look at Tumblr and its steady decline. The days of the independent blogger are gone; most people now who do want to do some form of blogging will go to Wordpress.com, or Medium, or to a site like Dev.to if they’re technically minded. So me, being contrarian, decided to become an independent blogger once again.

A few things have changed. I’ve redone the design to hopefully look reasonable on a phone, because that’s what most people use for their casual reading nowadays. I’ve taken away comments, for a few reasons: it saves me the effort of worrying when people leave controversial ones, and it saves me the sadness when they inevitably don’t leave any at all. On the technical side, I’ve ported everything over to a static site generator, so everything loads in a flash. At some point I’ll write…

The Plain People Of The Internet: My lords! Will they eversomuch be bothered about all that technical gubbins? Or is it all so much tumty-tumty verbiage, like?

Me: I wondered if you lads were still around, you know. I’m sure some people might be interested.

The Plain People Of The Internet: Lads? Lads? Now there’s not very inclusive of you, is it.

Me: Fair point, Plain People.

As I was saying, I’m sure some people out there will be interested in long technical posts about how the site is now built and structured, and although most of my technically-minded blog posts end up on my employer’s website nowadays, it may well be that some technical topics are more suited to this place. In general I suspect there will end up being more of the longer, more considered essay-type posts on here, and fewer of the one-liner posts about how I don’t have anything to say. And, as you’ve already seen, I’m sure that if my meanderings start to become too diffuse and unfocused, they will be interrupted by the Plain People Of The Internet, who at some point in the distant past escaped from a Flann O’Brien newspaper column and now seem to live somewhere in the collective hive-mind of the global internetwork.

The Plain People Of The Internet: Now there’s a word you don’t hear very often. Fair rolls off the tongue.

A whole load of the aforementioned one-liner posts have already been culled from the archives. This isn’t exactly the British Library or some great tome of record, so I’ve removed things from back in the mists of time where I was only posting to meet some arbitrary and self-imposed target of posting on a certain schedule. I’ve also gone through and cleared out a whole heap of dead links, and spotted a host of spelling mistakes that have been sitting there out in the open for everyone to see for years. There are probably many more dead links I missed checking, and many more spelling mistakes I’m still to notice, but I’m reasonably happy with the state of things as they stand. As well as deleting a pile of stuff that was here previously, I’ve also added stuff that I’d previously posted to Tumblr, such as my thoughts on what Amsterdam is like, or the experience of watching my father die. Hopefully, some people other than me will think these things were worth saving.

I’m aware that previously I’ve posted things that say: “Well, hello there! Time to start all this up again,” and then have stuttered slowly to a stop within a few days or weeks. Let’s see how it goes this time.

The Plain People Of The Internet: By sure, we will.

Photo post of the (insert arbitrary time period here)

Or, back to the railway

Back to the railway and the quiet post-viral timetable it is running at the moment. One nice thing about this timetable is that it gives me the opportunity to take my camera along and photograph the trains when they’re stood still, and the station when there’s no trains about. Normally you’re too busy to have chance for that sort of thing.

Bewdley station

Pannier tank

Bewdley North signalbox

2857 at Bewdley

Photo post of the week

Dw i wedi mynd i weld Sion Corn

Up to North Wales for the weekend, to help out with the trenau Sion Corn. My Welsh isn’t good enough yet to actually speak it, but good enough to understand when I hear one of the drivers trying to persuade a small boy that the loco is actually powered by a dragon inside the firebox, a la Ivor The Engine. The boy wasn’t having any of it.

The weather was grey, steely and windy. At times you could see across the Traeth; at times visibility was down to a hundred yards or so. Naturally, the time it decided to rain sideways was about five minutes after we’d decided we’d have time to walk over to Harbour Station before the rain started.

Cleaning out the ashpit

In the middle of The Cob

Overnight the storm grew worse, and in my bunk I could hear the wind outside and the rain hammering on the window. The next morning I was up early, so we could do a short-notice early-morning shunt to get a loco out of the Old Shed; as we shunted, it was pitch-black and cold but at least the wind had died down a little. As the locos started to warm up and come to life the dawn broke to show that there seemed to be just as much water, or more, on the landward side of the embankment as on the open-sea side. The salt marshes between the Cob and the Cambrian line’s embankment were a choppy, whitecapped sea, and inland the flooding went up the Traeth almost as far as if the Cob had never been built.

Flooded fields at Pont Croesor

Entrousered

In which I visit my tailor

Today was: funeral outfit shopping day. I don’t have anything suitable for funeral-wearing at all in the wardrobe; the only time I ever wear something really formal is for job interviews, and my job interview suit isn’t exactly funereal enough for the occasion. So, down to Debenhams on my lunchbreak to find something that vaguely fits me.

I found a pair of trousers of the right length, after trying what seemed like an excessive number of pairs. I found a few pairs of trousers of the right waist. Of course, the ones that were the right length weren’t among them: the ones that fitted my waist were either just that bit too long or just that bit too short to really work. “Don’t bother ordering the right ones,” said the shop assistant, “they won’t get here in time if you need them for next week. Buy the long ones with the right waist and go to the tailor’s round the corner.” So I bought the trousers, and headed round a corner and down an alleyway to find that squeezed between a decent unisex hairdresser and a sex shop is: a tailor’s shop. Either I’ve never noticed it before, or it’s one of those shops that just appears by magic at just the right time to aid the protagonist in their quest. It’s a traditional sort of place, with no concessions to show, to ornament, to tidyness, just a big workbench, a cash register, and racks and racks of clothes being worked on. I go in, put the trousers on, the tailor pins them to the right length and says “when are you coming in to collect them?” He didn’t take my name, my number, my email address, just gave me a card with a number on it and a promise they would be done in plenty of time.

A death

So, it’s never a good sign when a hospital phones you at 2am, is it.

My dad was diagnosed with cancer a little bit over three years ago. No doubt it was growing inside him for a year or two before that, but three years ago was when it suddenly became symptomatic, when he woke up one morning to discover he was randomly bleeding from his nose and his mouth, because his blood had given up on the concept of clotting. Prostate cancer had already spread from his prostate through most of his skeleton, to the point that it was Definitely Not Curable. Manageable, though, so much so that he may well, they said, die of something else first.

At first when the phone rang, I thought it was my alarm. Then realised it was a landline number, from my old home town, some sort of switchboard number. I didn’t catch it before the phone stopped. Then, whoever it was immediately rang back a second time.

I’d last spoken to him a couple of weeks earlier, after he phoned to tell me that he’d been to his consultant again. That was that. Not worth taking any more chemotherapy. He was going to be keeping him on one of his current treatments: it might, if he was lucky, keep him alive until the end of the year. If it didn’t work, he probably had a few weeks left.

I answered the phone rather blearily, to a random woman with my old home town’s accent asking if it was me. I found I couldn’t really speak, because I had already guessed where she was calling from and why she was calling. “He’s very confused and very tachycardic. We think you should come to the hospital.”

My mum had phoned a few days earlier to tell me he’d been admitted. He was having trouble breathing, so they had rushed him in in an ambulance, on oxygen. His spleen was failing. “They said his spleen is dead,” in my mother’s words. Now, I know you can happily live without any spleen at all, if you have to have it pulled out for some reason, but when a cancer patient suddenly starts to have unconnected organs turn into big and entirely non-functional lumps of meat, you know it’s not going to be long before phrases like “multiple organ failure” make the rounds.

The hospital was four hours’ drive away. I sat down and had a cup of tea.

Driving through the night, I wondered quite how I was going to react. I don’t think I’ve ever seen my dad show any sort of emotion of any sort. The day of his mother’s funeral, or any of the days leading up to it that I was home for, he didn’t cry a single tear. After the funeral we went home for lunch, then went out to buy a new camera. I tell a lie: he could get angry, he could shout, he could withdraw into a fuming silent rage. I’ve never seen him be sad, though, or show any kind of tender emotion. The roads were quiet, at first, and I had plenty of time to think about it. By 6am I was overtaking long lines of trucks heading to the North Sea ports, all of us still over half an hour away from our destinations, and I was driving towards a faint smear of dirty orange dawn light. By the time I reached the hospital, worked out where to park, it was just about dawn.

Of course, being half asleep when I’d answered the phone, I hadn’t actually thought to ask where in the hospital he was. It’s a big place, although strangely smaller than it felt when I had to go there to have my teeth sorted as a child, but the oncology ward was a very, very long walk from the entrance. When I reached the doors I had to ring a few times before a nurse came to the door to let me in; and then they hadn’t heard of him.

“Is he in A&E?”

“No, he’s an Oncology patient, and he was admitted on Sunday.”

She kindly led me to the nurses’ station and sat down at the computer, working down the list of wards until I spotted his name. And then another long walk, almost all the way back to the entrance and round another long set of stairs and corridors. I glided through the ward doors behind a nurse coming onto shift (hospitals are generally terrible at security) and found the nurses’ station. “Someone phoned about my father; he’s dangerously ill,” I said; they didn’t really need to ask who I was. “Oh!” they said instead, “you drove all that way straight here!”

He was in an isolation room at the far end of the ward. Not covered in tubes and probes as you might expect, other than an oxygen tube to his nose. He was almost naked, seemed to have thrown all the covers off the bed. Pale, almost hairless save a whiskery patch on each side of his chin, as if hairs had poured down from the corners of his mouth. He laid awkwardly, but he was awake, mumbling. My mother was there, and one of my uncles. I have a pair of uncles who are identical twins, and now I only see them occasionally every few years, it can be hard to work out which is which. I mentally started thinking to myself to avoid saying anything which might imply I thought I knew which uncle it was.

Dad’s eyes were dull, but he looked at me, and said something to me. “See, I said they’d come to see you,” said my mother. He mumbled. Even unintelligible, he still had the same patterns of speech. He fumbled, moving his legs, trying to slip one out of the bed.

“Lie down and rest,” I said, like dealing with a sick child.

Mumbling: something about getting up. His breathing was forced, gasping, but strong and regular.

“No, you need to rest. You’re better here.” His skin was speckled with strange, fresh moles, some of them gory red lumps, like overactive birthmarks, standing proud from the skin by a quarter-inch or so. He was covered in bruises, including a large one roughly where, I suspected, the “dead” spleen would be, although I found out later that was just where all his medication had been injected. He started to pull at a sticky pad on his leg: it wasn’t actually being used, but looked as if it might have been for fastening a catheter tube down. “You can’t pull that off,” I said, “it says the glue is too strong. You need a special solvent.” It did indeed say “only remove with alcohol,” and I don’t think it meant “take shots so you don’t feel it.”

Mumbling: thirsty, maybe?

“Here’s your tea,” said my mother, passing him some very milky tea in a lidded plastic beaker. I knew when he had been admitted he had been nil-by-mouth; had that passed because it wasn’t necessary, or had that passed because he was on the way out anyway?

It felt like a long time, at the time, but writing this a few days later, my memory has compressed hours into a few flashes. My mother phoned the friend who gives her a lift to church every Thursday. “I’m in hospital,” she said, as if there wasn’t anyone else in the room. “They called me at 1am.” I wondered to what degree I was the second resort - how long had they waited between phoning each of us? I don’t trust my mother’s memory for facts.

He drifted away to sleep a little, but the nurses came to wash him and change his sheets, as they did at that time every morning. They asked us to leave the room, so we headed down to the deserted hospital restaurant, another very long walk away, down the same corridor that led towards the mortuary. I didn’t really want to eat, even though I had been starving whilst driving, so from the breakfast selection I asked for just a coffee, a sausage and a slice of black pudding. “Just that?” said the server, with a very puzzled look.

We sat by the window looking at the morning sky, and having relatively normal conversation. I tried not to wonder whether he would die whilst we were having breakfast, and instead wondered as to whether he would actually die today at all. This might be a false alarm; just a turn he had in the night.

He was still alive when we came up to the ward, in clean sheets, covered up now, still slumped sideways and vaguely half-awake. The nurses tried to rearrange his pillows, sit him upright, and he slowly drifted off to sleep. His breathing still the same: harsh, gasping, mouth open despite the oxygen tube by his nose. He slumped sideways again, and the nurses decided to leave him be. In his sleep, he dozily tried to pull the oxygen tube from his shoulder, but didn’t have the energy or the coordination.

The consultant and the doctors arrived on their morning round: a garrulous Scottish chap in a red shirt, Mr McAdam. “I’m sorry we have to meet like this,” he said, and complimented me on my appearance. “We had a very lucid conversation the other day,” he said, “and we agreed it would be wrong to take any further serious interventions. Just too much suffering. He was happy with that decision.” And he ran through the list of problems my dad was facing. A burst stomach, leading to a thrombus. An infarcted spleen. Liver failure due to an additional liver disease. He didn’t actually say “multiple organ failure,” but he didn’t need to.

I realised, which I don’t think the doctors did, that Dad’s breathing was getting noticeably weaker as the doctors were stood around him. He was still breathing, though, even though it was definitely more shallow, definitely longer between breaths. The doctors filed out, trying to strike a balance between the bustle of rounds and the sombre tone needed around the families of the dying.

We watched him breathing, slower, slower and weaker, because there was not much else to do or think about. “I thought he’d gone there,” said my mum, “but then he started again.” She leaned in to see more closely, and held his hand.

There were a few seconds between breaths. The breaths themselves were shallow, hard to hear, very different from the gasping of a few hours earlier. And then: I didn’t think I could hear or see any movement any more. Nothing, and more nothing. I slipped my phone out of my pocket, and took a photo of him: the phone made his skintone much healthier than reality did. “I think he’s gone,” I said. It was five to eleven in the morning.

A nurse passed the door, so I waved and beckoned her in. “We think he’s gone.”

She looked down at him, carefully. “I’ll call the doctors,” she said, “so they can pronounce. Do you want a cup of tea?” She went out, closing the door this time, and came back with tea, in the big mugs of the nurses, not the small mugs that visitors get; and some biscuits. We sat, dipping ginger nuts, the almost-certainly-dead corpse of my father in front of us. “I keep expecting him to jump up and say it’s all a joke,” said my mother.

It took over half an hour for the doctors to arrive; their job is to care for the living, after all. We stood outside the closed door of the room whilst they ran through whatever it is they do, working in a pair, I assume in case a lone doctor might be tempted to Shipmanise a still-living patient. “Do you want to go back and see him after they have done?” said a nurse. We went back inside the room; they didn’t appear to have moved him at all. Still slumped against the siderails of the bed, mouth still open, eyes still shut. His skin, getting on for an hour now after death, was white-pale and waxy-looking. I took another photo; the camera still tried to give him a normal human skintone.

“I don’t want to say goodbye,” said my mother, but we walked out of the room and closed the door behind us.

“The doctors will write up their notes,” said a nurse, “and you have to go to…ooh, I don’t know!” She shouted to another nurse: “Where do they get the certificate? Is it the cashier?”

“It used to be the cashier,” said the other nurse, “now it’s the bereavement office.” Well that should be obvious, I thought. “I’d go in the morning, it probably won’t be ready today. Give us a call first to check. I’ll give you a booklet.”

We walked back down the long, long corridor, holding our fresh copy of “Help for the bereaved: a practical guide for family and friends” Where the corridor joined the next, we had to squeeze past a folding screen which hadn’t been in our way before, and a sign that said “For Ward 3 Enquiries, ask at Ward 4″; and I realised, it was a death screen, to make sure that no random strangers saw my father being wheeled in his bed, slumped against the siderails, over to the lifts and down the long corridor down towards the restaurant and the mortuary. We walked out down the corridor, and I wondered what would happen next.

Late arrival

Or, missing the train

I keep meaning to tell the tale of one of the most optimistic heritage railway passengers I’ve ever seen.

I took the kids to Totnes Rare Breeds Farm last week. If you don’t know Totnes: the town is on the west bank of the River Dart. The railway running past the town, coming from Plymouth, crosses the river, and on the east bank of the river forks in two. The right-hand fork is the main line, running eastwards to the head of the Teign estuary and thence along the coast to Exeter. The left-hand fork is a steam railway which runs up the valley of the Dart as far as Buckfastleigh, famous for its abbey and its tonic wine very popular in Scotland. Just to confuse you, both railway lines were originally built by the South Devon Railway, but nowadays the steam railway is reusing that name and the main line is just, well, the main line into Cornwall. Anyway, in the V where the railway forks, just on the east bank of the river, is Totnes Rare Breeds Farm, and it has no road access, indeed, no public access at all other than via the railway. If you want to arrive on foot, you must walk to the steam railway station (they have a footbridge over the river), through the station, across a little level crossing and into the farm. The level crossing has gates, just like a full-sized one, which the railway’s signalling staff lock shut when trains are arriving and departing.

We were sat feeding boiled eggs to a 93-year-old tortoise,* even older than The Mother Grandma, with another family, when I heard a sound from the station: the sound of the vacuum ejector on the train waiting to depart. In other words, the driver had just started to release the brakes ready to go. I checked the time: just coming up to Right Time for the next train. Looks like it will be a perfect-time departure.

“We’d better get going,” said the dad of the other family, “we need to catch that train.” And they got up and left. I thought it might be a bit cruel to tell them they’d almost certainly already missed it. The gates would already be locked, and even by the time they reached them, the train would probably be moving.

* one volunteer told us it was 94 and another 92 so I’m splitting the difference

End of the year

Or, another year starts

The last blue skies of 2017 are outside my window; dusk will come shortly.

In line with the idea of starting 2018 off right, I’m volunteering on the railway tomorrow. Hurrah!

Fun

Well that can't be good news

I don’t know on what basis Google Ads is categorising me, but it’s started showing me frequent ads for funeral directors.