Ian Renton » Ian's Blog

Adventures in Emoji

Yesterday, a friend of mine started me on a quest that was to be filled with despair. It started innocently enough.

I gleefully replied with my 140 character attempt at making that come to life (each Emoji counting, as I would later discover, as two normal characters).

Well, that didn’t look like a bad start. There were some alignment issues there, probably because Twitter uses a proportional font. Nothing that a couple of <pre> tags couldn’t solve!

Oh, how wrong I was.

Twenty-four hours later, this is what I have to show for my efforts:

Well, it’s a whole screen of Rogue-like, which is not bad. But despite wrapping the whole thing up in <pre> tags, there are still alignment issues.

Lesson 1. Not all Emoji are a fixed width.

Lesson 2. No Emoji are the same width as a half-width or full-width Unicode space.

This will become important.

You may also notice that the picture above isn’t a nice <pre> block full of text that you can copy and paste. That’s because, after hours of tweaking to get something looking vaguely presentable, I decided to see what it looked like in a different browser.

And even in the same browser, with a different monospace font:

Lesson 3. The width of an Emoji — and even one of the Unicode spaces — varies from font to font.

Before I even got to that point, though, I was nearly thwarted by an even more frustrating issue — actually laying out the Emoji in a text editor.

I assumed that in the world of monospace text that editors inhabit, these problems of layout would be avoidable. Any modern text editor should allow me to edit a bunch of Unicode characters in a regular grid, right?

Of course not.

My first attempt was using gedit, my GUI editor of choice. It happily allowed me to mix standard ASCII and Unicode characters. When I inserted a space between ASCII characters, it was about 20px wide — so far, so good. But when I inserted a space, even a Unicode full-width space, between two Emoji, the result was only 10px wide. The browser renders the spaces correctly, so to look right in the browser, all spaces had to be half as wide in gedit — useless for drawing a dungeon layout.

I resorted to vi, my console editor of choice. My console font happily supports Unicode, so this should be no problem!

Of course not. For a start, keypresses in vi insert one byte at a time, meaning that every other keypress misaligns every subsequent two-byte Unicode character on that line. And then there’s the quite bizarre way in which it decides to write characters on top of each other.

My third and almost bearable choice was an odd one. I figured that if I wanted the same look in my editor as in the browser, I should use an editor that runs in the browser. I chose the Chrome extension Caret.

At last I had something almost usable, although the misalignment of characters rears its ugly head here too. There’s the infuriating bug that this only applies to characters on the screen, not the cursor position. 70 characters into a line of Emoji, the cursor position can show up almost two characters away from the text it actually sits at.

Lesson 4. There’s not a single program in the world that renders Emoji the same as any other.

Last but not least, there’s the matter of Emoji fonts.

On my Linux machine, my browser and my text editor at least use the same set of monochrome Emoji symbols. But view the same page on an iOS, Android or Windows Phone device, and you’ll discover they have their own platform-specific Emoji fonts which are specifically designed to look great while ruining your attempt at cross-platform compatability. Here’s what our Rogue-like looks like on Android, showing off the inevitable inconsistent widths:

If you’d like to post your hard work to social media sites, you may also discover that Twitter has its own set of unpredictably-sized Emoji. Facebook will at least use your system font when you post Emoji, although trying to edit a post with Emoji quickly results in a field of “your encoding is broken” rectangles.

Lesson 5. Despite Emoji having existed for over a decade, and having been incorporated into Unicode for half that time, Unicode fonts and particularly Emoji in them are a complete mess of incompatible typesetting and platform-specific weirdness. They are not yet suitable for use in layouts — and thus, sadly, for making Roguelike games.

For the curious, here’s how my Emoji Rogue-like would render in your browser. If you use the Cousine font in Chrome on Linux, this might look alright! If you’re using anything else, this is probably a horrible mess.

    🔳🐍             🔳                        🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳      
    🔳      🐂       🔳                        🔳        🍖                  🔳      
    🔳               🔳                        🔳          🍖                🔳      
    🔳🔳🔳🔳🔳🔳🔳🚪🔳                        🔳                            🔳      
                 🔳  🔳                        🔳🔳🔳🔳🔳🔳🔳🔳🚪🔳🔳🔳🔳🚪🔳     
                 🔳  🔳                                       🔳  🔳    🔳  🔳      
  🔳🔳🔳🔳🔳🔳🔳🔳🚪🔳🔳🔳                                  🔳  🔳     🔳  🔳     
  🔳        🐀           🔳                                  🔳  🔳   🔳🔳🚪🔳🔳🔳  
  🔳  🔳                 🔳                   🔳🔳🔳🔳🔳🔳🔳🔳  🔳   🔳     🐉  🔳  
  🔳  🔳          🐀     🔳🔳🔳🔳🔳           🔳                 🔳  🔳  💍     🔳  
  🔳  🔳                 🚪      🔳           🔳  🔳🔳🔳🔳🔳🔳   🔳  🔳🔳🔳🔳🔳🔳    
  🔳  🔳  🎫             🔳🔳🔳  🔳           🔳  🔳         🔳  🔳                  
  🔳🔪🔳                 🔳  🔳  🔳           🔳  🔳         🔳  🔳                  
  🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳  🔳  🔳           🔳  🔳         🔳  🔳                  
          🔳         🔳      🔳  🔳       🔳🔳🔳🚪🔳🔳🔳🔳🔳🔳🚪🔳🔳🔳              
          🔳  🐍     🔳🔳🔳🔳🔳  🔳🔳🔳🔳🔳          🐍              🔳              
          🔳    🐍   🚪                   🚪      🐍  🐍🐍💥🚹        🔳              
          🔳         🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳        🐍        🍖      🔳              
          🔳🍗       🔳                   🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳              
Level:1     Hits:14(14)   Str:15(15)   Gold:34    Armor:1   Exp:20/23

The limited set of Emoji currently available also causes a number of other issues with creating a Rogue-like using the characters. For example, the character set currently does not contain glyphs for:

  • Stairs
  • Treasure chests
  • Corridors
  • Kobolds
  • The Amulet of Yendor

I’m sure the Unicode committee will be working on these soon.

SuccessWhale 3.0 Released

It turns out that my previous post about SuccessWhale, bemoaning how it had stagnated and become more trouble than it was worth, was just enough venting to kick me up the arse and get me going again. And so, not long later, I am proud to announce the release of SuccessWhale version 3.

As promised, it is a complete rewrite from the ground up, transforming a ugly mash of PHP, HTML and JavaScript into a neatly separated JavaScript client and Ruby API. In terms of the user experience, not a lot has changed — a lot of work has been done just to keep things the way they are. But the best bits about SuccessWhale v3 are where it goes from here.

The API now builds on modern tools and libraries, meaning that Twitter and Facebook’s “breaking changes” will result in fewer problems and quicker fixes for SuccessWhale. The separation between GUI and API also means that bugs can be found and fixed more easily, without the risk of GUI tweaks breaking the back-end or vice versa.

Plus, it means that SuccessWhale’s abilities are open to other clients. Our API is freely usable by anyone, meaning that you can create your own desktop, mobile or web app using SuccessWhale without having to delve into and run your own back-end code. Already we have a native Android app supporting SuccessWhale — OnoSendai.

SuccessWhale remains free and open source (Web app source API source and BSD-licenced, so you can take it, modify it, use it in your own projects, and generally do whatever you like with it. If you do write another SuccessWhale API client or remix it for your own needs, please let me know — I’d love to see!

As always, SuccessWhale is available for free on the web at www.successwhale.com.

If you’re new to SuccessWhale, you can find out more about it on the About page, and experienced users should check out the What’s New page.

I’d like to take this opportunity to thank my wife for putting up with many long nights in front of my laptop, and my good friend, alpha tester and OnoSendai author haku for filing more bugs than I could possibly imagine.

I hope you all enjoy using SuccessWhale as much as I enjoyed writing it!

To Those Who Fear Immigration

Last week’s European parliament elections saw big gains for right-wing parties across the continent, many trading on policies opposing immigration and the European Union itself.

I worry for those of you that cast your vote against immigration regardless of the other policies of the party you voted for. I worry that fear is used to sway your vote, that media sensationalism destroys proper discourse, that the truth is the first casualty of an election campaign, and that our country is steered by narrow-mindedness.

And because I worry, I wrote you a letter.

To all those who vote out of fear of immigration,

You vote for a system that is outdated and artificial.

Ten thousand years ago, humanity lived in tribes, extended family groups perhaps a hundred strong. They were the ideal size for hunter-gatherer groups, because that was the means by which we survived. Those groups had limited understanding of others, and fought often.

Somewhere around then, we discovered how to grow and harvest crops. It changed our species forever. Farms meant we could stop wandering; we could settle down in larger and larger groups. We built towns, cities, empires. These days we call them countries, and if you’re reading this, chances are you live in a pretty good one.

But just like in our tribal days, we squabble and fight with neighbours we don’t understand. We don’t want people from the tribe next door coming and stealing our berries. We go to war with other tribes to claim the best watering holes.

This is what you vote for. Humanity’s past. The artifical constructs we built ourselves under the pretence that our tribe was more important than the others.

But that will end soon.

Maybe not tomorrow. Maybe not in our lifetime. But on the timescale of civilisations, it will be soon.

Just as the technological advancements of farming and construction united tribes into countries, transportation and communication will unite countries.

Advances in farming will allow us to feed the world, and global economics will give us the reason to do so.

Technology will allow us to understand every language; empathy will allow us to understand every culture.

A hundred or a thousand years from now we will not fear immigration, because fear comes from misunderstanding. And we will understand it completely.

We can solve poverty and famine, because we will care for our species on a global scale. We can solve war, because countries will be a relic of our past just as tribes are today.

We can leave our tribal days behind for good, unite our species and reach for the stars as one.

Doesn’t that sound like a pretty good idea?

Don’t vote for the past. Vote for the future.

Like Father, Like Son

I knew the day was coming soon, when my son would decide that he wanted to make his computer do something new, something a computer had never done before. I thought that like me when I was a little more than his age, he’d sit down in front of his computer and type his first “hello world” in some child-friendly language.

Unfortunately for that plan, Joseph seems interested in very little besides writing his own Civilization clone from scratch.

Faced with this daunting prospect, and knowing that it would be me writing most of this, I abandoned the idea of teaching him, line by line in something like Python or even Scratch. I had to default to the path of least resistance, which for me is Java and Swing. With all its verbosity and hassle, it’s not an ideal first programming language for kids, but it’s what we’ve ended up with for this project.

So far, after an hour or so of work — me in NetBeans and him in MS Paint — we have this. It’s not so much a game as a psychedelic grid, but it’s something that can be flashed up on the screen to demonstrate that we are making progress.

It’s called “Sudden Death Supervisors”, because apparently all six-year-old boys attend the “Axe Cop” school of naming things, and you can follow our progress here on Github.

State of the Whale Address

It’s no secret that the current state of my SuccessWhale social network client is not a good one. It currently exists in three forms:

  • The main server runs SuccessWhale version 2.0.3. It’s not been updated in nearly a year, and the only changes within the last three years have been playing catch-up with the changing Twitter and Facebook APIs. It probably has some broken features by now, because I don’t regularly test it out.
  • The test server runs SuccessWhale version 2.1.2 with debug flags enabled. The 2.1 branch includes things like mixed feeds and LinkedIn support, and is “beta-ish”. Some people use it anyway. LinkedIn support is broken and will never be fixed.
  • The dev server runs SuccessWhale version 3.0.0-dev, a complete rewrite of the whole thing that has stalled in a half-finished state. It’s just about usable provided you’re willing to drop back to the test server to fiddle with any settings (they use the same database). It’s buggy, and as far as I know used only by me.

SuccessWhale v3.0 web interface

Very occasionally, I get the motivation to do something about SuccessWhale. It feels bad to leave it in its current “limbo” state where there isn’t really a version that works and is properly maintained. I use SuccessWhale every day, so at least there’s the dogfooding aspect, but “it works well enough for me” is far from “it’s something other people would want to use”. And my friend Alex produces the excellent OnoSendai Android client that uses SuccessWhale, so I have some sort of responsibility to him to keep SuccessWhale going.

But there’s a hell of a lot of reasons why I would rather not.

  • Free time is nice. I started SuccessWhale five years ago, when I still had the energy to keep big projects going. Now, with less free time in the evenings and more responsibilities in my day job, I’m much more keen on grabbing a few minutes of that blissful feeling that comes from having nothing to do.
  • We created a monster. SuccessWhale (or FailWhale as it was then called) was first and foremost a simple Twitter client. I explicitly declared that it would never be a client for other social networks such as Facebook. Nowadays, SuccessWhale has its own API that wraps both Twitter and Facebook, along with several front-ends.
  • Rewrites are no fun. Version 2.0 was badly coded and had to go. Version 3 is nice and designed properly from the start! But it requires hundreds of hours of work just to let it do all the things that version 2 could already do.
  • The APIs are crap. In fairness to Twitter, its API is well-documented and makes a lot of sense. But, like all APIs it is regularly updated, meaning that all application developers need to work just to keep up — we put hours in not to add new features, but just to make sure the existing stuff doesn’t break.
    Facebook’s API is much the same, except that it makes much less sense and the documentation is largely non-existent. It’s quite telling that I asked a simple question on StackOverflow, and a Facebook dev replied with “here’s how to do it. I guess I’d better add that to the docs, huh?”
  • The services are hostile. Twitter, once the darling of those that believed in a strong 3rd-party client ecosystem, are now actively hostile to developers that create clients like mine that “replicate the core Twitter experience”. It’s not nice to develop with a hard 10,000-user limit hanging over your head because you’re making a client for a service that would rather your software didn’t exist.
    Facebook isn’t so hostile, but its privacy settings mean that SuccessWhale is only useful to a user if their friends have configured their privacy settings badly.
  • The services are crap. Twitter is the playground of celebrities, companies seeking “engagement” and people who want to have a “personal brand”. Its artificial 140-character limits and endless retweets are not a good medium for talking to friends, which is all I want to do. Facebook is a privacy-violating monster on course to balkanise the web with its all-consuming reach. These services are the internet now, and my pleas to return to more honest times fall on deaf ears. But I don’t want to use them, and that makes developing a client for them a distinctly unfulfilling experience.

For now, SuccessWhale stays alive. Twitter and Facebook are what I’m stuck with as the only sensible way of communicating with many of my friends and family, and SuccessWhale helps me avoid the worst features of their interfaces — their cryptically-curated feeds, in-line adverts and one-feed-at-a-time pages. That, plus a vague sense of responsibility to my users, are what keeps it around.

When the day comes that I can jetission Twitter and Facebook from my life without missing them, it will be SuccessWhale whose loss I mourn. Like many projects before it, its user count will fall to zero and it will slowly start to fade from the internet.

One day, I’ll be sad that I made a thing that is no more. But right now, all I feel for the thing is the frustration that developing it is fighting a losing battle that has no end in sight.

Raspberry Jammin’

Last Saturday was the Linux User & Developer Raspberry Jam event at Poole RNLI college. I took the tank, of course, and Joseph too — worrying all the while that he’d be the youngest kid there by about ten years, and he’d get bored within half an hour.

How wrong I was.

We eventually escaped almost an hour after the scheduled end of the event, once Joseph and the other kids — many his age — had had their fill of Minecraft and the Raspberry Tank.

Along the way we’d met the awesome people from PiBorg with their much more impressive RPi tank, along with robot arm-wielding BigTraks and 3D LED matrices. We’d done a show-and-tell session, drunk a lot of coffee, and most importantly been part of a room of 20+ kids all learning to code for the first time using Python and Minecraft.

It was really an amazing thing to see and be part of, and my heartfelt thanks go out to the organisers from Linux User for hosting a fantastic day!

Here’s the kids playing with our tank:


The early years of the twenty-first century.

The boundaries between the real world and the cyber world grow thinner with each passing day. Megacorporations vie for our attention, our clicks, our hearts and minds; their walled gardens are their own private networks in which they suck up our data and sell it to the highest bidder.

In every citizen’s pocket is a communicator, a flat black slab of plastic with immense computational power, which ties them into the ebb and flow of cyberspace around them. Their lives are managed from afar by artificial intelligences living in the vast basements of the Megacorps. “Siri, when is my next appointment?” they ask, and far away, photons flicker in the heart of the vast machinery that will decide how their day will play out.

Some rebel against their devices’ secret corporate agendas, exploiting flaws to rip out their Megacorp guts and replacing them with something knocked up in a tech wizard’s basement — quirky, error-prone, but free.

Cyberspace leaks into the world in other ways too, with the rise of VR for socialising and escapism; with augmented reality overlays built into stratospherically expensive glasses; with always-on Orwellian cameras and microphones in our living rooms, lying dormant until they pick up on trigger phrases like “Xbox, on” or “kill the president”.

The high-tech terminals of the rich are assembled in Asian sweatshops for pennies, and two years later they are out of fashion, shipped back to Asia to be disassembled and stripped for Rare Earth elements in towns thick with carcinogenic smog.

Behind it all, larger battles are fought across the terrain of cyberspace. Shadowy government agencies hack companies and citizens wholesale, tapping into fibre-optic cables and stealing the privacy of nations on their futile quest to defeat a nebulous threat. Other hackers strike back under the pretense of defending the public interest, operating beyond the law and hiding beind digital masks.

Above and beyond them, the world’s militaries fight a shadowy online war of infiltration and sabotage; creating weaponised malware that lies dormant until its time to lay waste to a factory and a nation’s nuclear ambitions.

The year is 2014, and somehow, without realising it, we got exactly the future we were promised.

The Lego of Tomorrow

“All I’m doing is building stuff,” Joseph says.
“That’s what Minecraft is good for, isn’t it?” I reply. “It’s like Lego with infinite pieces.”
“Yeah,” he says, and turns back to his computer screen; back to the childhood task of creating the new.
I turn back to the washing up that I was in the middle of, back to my adult role of cleaning and tidying and preserving that which already exists.

It feels odd to be writing about Minecraft in 2014. Following its 2009 “alpha” release, it quickly became the darling of the indie gaming world. There’s not a lot to say about it that hasn’t been said by countless reviewers and bloggers over the intervening years. I’d played it myself a few times—I made my character wander around, mine some rocks, fight some monsters, craft a few things. But I never “caught the bug”. That’s the all-too-adult brain at work again—I looked at the landscape and appreciated it for what it was, not what it could become.

Today though, for the first time, I saw Minecraft through the eyes of a child.

Raised on a self-imposed diet of videogames since he was old enough to shake a Wiimote, our son has never had the enthusiasm for Lego that I did at his age. While I would disappear to my room for an afternoon to build, he always wanted to spend it with gamepad in hand. On occasion I despaired for him and his generation. I worried that their entertainment had become so pre-packaged and targeted that they wouldn’t want to create their own games. How could silent, limited, awkward Lego sets compare against a million man-hours of Nintendo’s finest creators delivering pure entertainment?

But now I sit and watch Joseph at work, and I know how wrong I was.

As night falls, his character flies up over the landscape and looks down to behold all that he has created. Torches spread out across the world like the fires of a nascent civilisation, casting light upon those things that human hands have built.

There are houses, now, where once there was only grass. Some of the roofs are made of coal and supported only by bookshelves and hay bales, but they are houses nonetheless. They are dry when the rain pours outside. There was a bed for his character to rest in, but now there are more than a dozen—for his character’s parents, siblings and cousins, Joseph explains.

There are railways that connect them over fragile bridges far from ground. There is a torchlit tunnel beneath the surface, joining the houses of the tiny village to the woods where sheep and cows roam. There was a spider that “freaked him out”, so Joseph’s character started to carry a sword with him at all times.

The environment, once wild and random, was being tamed.

Then Joseph noticed that water would flow if the ground around it was removed. The great lakes of his world could be channeled. The tunnel became a great underground river, bringing water near to the houses of his people.

He built a black-lined room carved out of a hill, and decorated each block with a torch.
“It’s a Christian place,” he explains. “My character is a Christian.”
I had just watched that nascent civilisation invent religion.

Dawn breaks. Among the high forest canopies there now stands something else—a tower, built on lowlands but rising taller than the hills. It is a vast structure of stone and glass and, for some reason, pumpkins. It is not built the way an architect would build, but nor does it look like a work of nature. It is the work of an almighty creator not restricted by principles of gravity or shearing moments. It is not utilitarian; not a house or a bridge or a water channel. It is something that was built just because it could be built.

The land was tamed, now; the world mastered. And so his one-man civilisation had reached for the stars.

I am no longer under the illusion that neat, rail-roaded videogame adventures will leave us a generation lacking the desire to create for themselves.

He may not spend his afternoons building Lego cars, but that’s okay. Within the last four hours I’ve watched him take a world of random-seeded entropy and transform it into a place where bridges of stained glass tower over the skies.

I think our children’s generation will be just fine.

By Distant Shores

We sit and eat lunch by the sea, our cars parked up on the sand, engines running, air-con on. In front of us, waves roll into the shore bearing an ocean’s worth of hydrocarbon flotsam. A nylon rope from a Malaysian yacht, perhaps; a Madagascan trawler’s fishing floats, or a sandwich carton blown into the sea from a cruise ship—it all washes up here, where the wide Indian ocean begins to narrow.

Further out, a tug boat steams slowly down the coast, pulling behind it a crane barge off to some new construction or oil project. Behind them, almost lost to the haze, a horde of tankers and vast cargo ships wait patiently for their turn to refuel from the vast offshore buoys that tower like houses over smaller vessels.

At night, their lights look like a mirror image of the city; a mirage of some other town on some other shore only a few miles away.

Behind us, a gale brings a country’s worth of sand through the mountains and down to the sea. We face towards the sea not just because it’s a good view—coming from a place without them, I would much rather see the mountains—but because we have more shelter than the sand that way. It stings the eyes, chafes the throat and sticks in patches on sweaty skin.

No wonder the locals think of the beach as a place to park their cars.

I am from Britain, a country which by global standards has a very odd relationship with its beaches. For many countries—the hot ones especially—the beach is where a desert or a salt flat unceremoniously meets the sea. Even in other countries with a coastal tourist industry, where the beaches are cleaner and cared for, they are at least a contemporary place where people come to have fun. But in Britain, we go full-on quaint.

In the British consciousness, beaches are intertwined with the idea of times past—perhaps a national reminiscence about seaside holidays. Our hotels are set back from the beach to make way for beach huts, places for the Victorians and those with their sense of modesty to change into their swimming costumes. Nowadays they cost as much as houses. There are beach-front bingo halls and arcades, concert halls on piers and helter-skelters and Punch-and-Judy shows. The beaches are policed by council litter-pickers; the town desperate to keep the “Blue Flag” status that could—in the councillors’ minds—make or break a seaside town.

The sheer suggestion of driving a car on that is enough to make a Brit squirm uncomfortably.

Our lunch finished, we drive the fifty metres or so to the industrial-size rubbish bin in the middle of the beach. As I throw in a stack of polystyrene cups, one of them slips from my grasp and tumbles away towards the sea. I chase it half-heartedly for a few seconds, but the wind carries it faster than I can run. It skitters off into the breaking waves, gone to join its plastic cousins that will still be washing against these shores a hundred years from now.

I have, unwillingly, become part of the problem.

But to my left stands a forest of oil tanks, millions of cubic metres in all, and a few miles offshore in front of me sail ships with millions more. Behind me four-by-fours screech along the sandy highway, burning petrol like it was as cheap as water—because in this part of the world, it is.

I am a very small part of a very big problem; a problem that easily escapes your mind when your beach is neat and tidy and every second lamp-post bears a recycling bin.

And So Into 2014

I could tell, as we headed back to our old haunts in our university town and the car stereo decided to play VNV Nation’s “Beloved”, that it was going to be a reminiscent sort of New Year. For the first time in many years, I spent at least part of the day with friends in Southampton—friends we have now known for 10 years, and who defined the time in which I came of age. And although we spent only a few hours—in some cases barely a few minutes—in their company, it was worth a lifetime.

2013 has been a good year.

It was a year that started in snow, triumphed in a summer just long enough and hot enough to be remembered, and finished with storms battering against the tightly-shut windows.

It was the year Eric and I finally had our honeymoon, only two years after marrying. It may have only been two days, but we filled them with joy and love and books and for some reason also geese. More than anything we felt young again, a rare experience among parents.

It was the year that I spent my summer by the sea playing with boats and getting paid for it, a year I was given so many opportunities to shine and took every last one of them I could.

It was the year we gained a neice, and Joseph a cousin, and my wife’s family were all together about a table set for ten with food for twenty.

It was the year that I missed RABIES, a party still going after nine years. No longer will there be some old git who has been to every one of them. But although there are some friends from whom I have drifted this year, there are others to whom I have drawn closer. When my regular roleplaying game came to an end in April, I discovered it had left me with a group of wonderful friends that even without the game have been at our flat every Saturday night since.

I have cooked more roast dinners and baked more cakes than in any year I remember, and in doing so brought friends and families closer.

And now I sit awake in a sleeping house, a glass of our own sloe gin in one hand and one of our own gingerbread biscuits in the other. In London, fireworks blaze and music blares across the city. Here by the sea, thunder rumbles and rain pours in chorus outside. But I have my friends and my family, my kith and kin, and that’s all I have ever needed.

I raise my glass, to family and friends near and far; to all away and at home; to the little gods of sloes and fireworks and cold January mornings; to all that changes and all that stays the same; to the spirit of the year departed and that of the one that begins tonight.

Happy new year.