Félix Saparelli a.k.a. passcod urn:uuid:10201008-0000-4281-a1d5-128649600000 2010-10-08T00:00:00+00:00 Monthly Update urn:uuid:02201710-0000-4041-a1d5-148668480000 2017-02-10T00:00:00+00:00


I’ve spent a lot of my weekends writing a Star Wars fanfic. I’m going to finish it before I publish, to avoid publishing and then abandoning it when I eventually realise I’ve written myself into a corner. It’s completely outlined, and I’ve got some willing and eager proofreaders waiting for it, so I have hope.

I’ve already got ideas for a sequel; if there’s interest I might be working on that for a while, too. The sequel will contain a certain ship.

No title as of yet, working title of my file was SW:E:SI at the beginning of the month, but what it stood for was already outdated by the time I got to the middle of the outlining, so I changed it to the non-commital “Master Kylo”. Maybe it will stay that.

300 Shorts

I’ve moved my “300 Shorts” collection entirely to this blog, instead of its previous home on Medium. I’ve also added an introductory post, which additionally serves as a common ‘parent post’ for all the shorts, taking advantage of my blog engine’s capabilities: it will add a link from each entry to the main post, and add a list (with links) of all the entries onto that main post.

I’ve also published two so-far-unpublished pieces from 2016 into this collection. The first is a short poem written last year: Unlit. The second is a sci-fi story originally written for a contest: Regulus. It is accompanied by a few pages of notes and commentary.


Chapter Seven made me really happy and I felt more bubbly than usual writing its comment. Perhaps it was the ice-cream.

Backup and Sync

Discovered a very interesting paper, algorithm, and software: MetaSync. It provides a sync utility that can store data across several services and even replicate this data for maximum reliability and synchronisation speed. I have yet to evaluate the solution in-depth for my needs, but it certainly sounds promising.

Ultimately, though, the software is not quite as maintained nor modern as I would wish it. For this reason, my next large Rust project will be to implement the pPaxos algorithm, the core metasync library, a CLI frontend and a sync Daemon, as well as some remote storage adapters (probably starting with Dropbox, Google Drive, MEGASync), and some local storage middleware (selective encryption, compression).

I’ll probably choose a different name, though, not only to avoid stepping on toes, but also because I don’t quite believe “meta sync” to be a good descriptor for what this does.


After several years (at least four, but it gets fuzzy before then) of quiet research and occasional thought, I finally got the last insight into my very own algorithm for hypergraphs (and their somewhat-optimised subset hypermaps).

My hypergraphs are optimised for a specific query: “give me all the vertices of all the edges that contain the given vertex.” Hyperion executes that for any arbitrary vertex with the same time complexity as the underlying substrate. For a HashMap, that’s O(1).

Hyperion is also fairly good at memory space: it incurs only a small fixed overhead per-vertex and per-edge. Other implementations of bimaps, hypermaps, or hypergraphs use about twice the amount of memory as is input into them.

Using Hyperion is mostly about thinking differently about some data. Once you understand that you essentially have a structure which can store associations of objects and then retrieve the entire association given any value within, in constant time… once you really understand the idea and start being able to apply it to problems, that’s when it becomes interesting.

Hyperion is not quite ready for publication, but the concept is finished and a full description of its algorithms — for insert, for query, for modification — is done in pseudocode. An initial implementation in Rust, some analysis, a few measurements, and better documentation remain to be completed.


All in reading order within their sections. Word counts are rounded to nearest 1 or 5k. I explored the Harry Potter fanficdom, fics rated at least T, often M. Contains occasional lemons. Fairly large proportion of Haphne.

  • {HP/SW Legends} The Katarn Side.

    A very nice tale. While I enjoyed the story, I spent a lot of it using the material as both inspiration and warning, given I was writing my very own Star Wars fanfic at the same time. It convinced me not to write a Star Wars × Harry Potter crossover, as I do not have nearly enough knowledge about the Star Wars universe to pull it off. But it also gave me pointers at how to interpret Jedi lore and dogma, a style guide when writing droid speech, and a remedial course in basic Galactic tenets. I particularly liked the tonne of potential the crossover’s universe has… many stories could have been written within, but this one was finished and done, and the rest is up to us readers' imagination. Rated T. {135k words}

  • {SW Legends} The Last Jedi.

    Rated T but should have been M. Probably. This is Dune, but in the Star Wars universe, with more sex and less Bene Gesserit. It does a good job of showing the horror of the amount of lives lost during space conflict, when billions of lives cry out in the Force, and it has an actual effect on those sensitive. In the original six, there is a whole three minutes spent on the destruction of a planet and millions of souls; two Jedi briefly look up and say, almost deadpan, that they felt two billion souls die… and then they go back to what they were doing, barely affected. In TFA, Starkiller Base destroys five planets — there are no estimates I could find on the population of the system, but let’s put it in the high dozen billions, maybe even half a trillion — and there is even less effect on the Force-sensitive. Like, come on! Billions have just died. At least show the Force-touched having a little emotion here, maybe. So, in The Last Jedi, our protagonist Tobin, as a youngling, witnesses the killing of “merely” thousands and feels it in the Force, and it disturbs him so greatly that he has to isolate himself and cry for hours at a time. A trained Jedi Knight is shown as losing control of her emotions in violent manner. Even a less-monstrously-sensitive Mirakula is strained and isolates herself, even while she has lived through dozens or hundreds of such events already and could be thought to be inured against the horror. Anyway, as you may see, I liked this fic a lot. {185k words}

  • {HP} Innocent, Initiate, Identity, Impose.

    Good story. The plots are thought-out and I really appreciate the insight into other characters. The entire Chamber of Secrets episode, in particular, is as much about Ginny and her struggle against Tom, than it is about Harry and Sirius and friends… and then after that, the experience didn’t just completely not matter, there are credible post-trauma effects, and the people around don’t just forget what they’ve been through either. Last volume is unfinished at time of writing, but updated recently. I’m hoping for a Harry/Ginny ship but not holding my breath: there’s a lot of potential still. {495k + 175k + 145k + 72k words}

  • {HP} Contractual Invalidation.

    Oh, that was beautifully done. It is really a work you have to read to experience. A summary would not do it justice. A description could not hope to cover its walks and turns. This is what people mean when they say you have edit down such that only what is needed remains. It all comes together in its final chapter, triggering understanding over all the previous ones, but still leaving us with that uncertainty Hermione hinted to at the Grimmauld party: that you cannot really be sure it was all his work, or not. {90k words}

  • {HP} Stepping Back.

    Ongoing. By the same author as Honour Thy Blood, and reusing the original personalities and names of its supporting cast, which is an amazing idea as I get to rediscover and appreciate them anew, in a much better environment and not just in flashbacks, as paintings, or in history scenes. Yes, this is a time travel fic. I like the way it’s written, and although it’s not perfectly beta’d (there’s homophones and awkward phrasings) it’s much better than HTB at that. Followed and looking forward to new chapters. {100k words at time of writing}

  • {HP} Days to Come.

    It’s adult, it’s sweet, it’s funny, it’s lively. Not lively as in it’s joyful and bounding and jumping around happily, but lively as in it’s about life. You know that quote about how grown-up fiction is about english professors wondering about who to fuck, and YA fiction is about overthrowing the government and picking up the pieces? This is grown-up YA fiction. The government has been overthrown, the villains have been defeated, and there’s still the shit attitudes in society that caused it all in the first place — but we’re working on that. There’s peace. But it’s the picking up of pieces that remains to be done. Recovering from all you’ve lived, and figuring out where you’re going. Treating all the fucked up stuff you’ve done and that’s still in your head. Talking to people. Getting angry and pissed off and breaking up and making up and it all not being the literal end of the world. Living life. And slowly getting there. {137k words}

Also enjoyed, but no lengthy comment:

I read a lot of Bobmin’s stories around the middle of January, to honour his rich contribution to the fandoms. These are all excellent:

passcod ask@passcod.name
Some Predictions urn:uuid:02201705-0000-4036-a1d5-148625280000 2017-02-05T00:00:00+00:00

These are some predictions I wish to record without publishing. Each has a date after which I expect it to have passed (or not). I’ll be able to reveal each of these at my discretion if they happen or not. Each prediction is encrypted with AES 128 with a unique key, and also hashed with SHA1. This post is recorded in a git repository, so you can also check the timestamps and hashes there. The headers for each predictions are reminders for me about their passphrases, and may not always hint at the content or subject of the predictions.

(I am hoping to be wrong about most of these.)


Date: 2020 SHA1: b56066f57a5fd56613cbacd7d034cfc4868ef0fa



Date: 2020 SHA1: 42851cbd2d75867d4eb1af7830e94b0865be7fbd



Date: Late 2017 SHA1: 5a67d2bf605f1fff1c9ce98f931503cd5cb5294d



Date: 2018 SHA1: 0e19b0789425204a90706df0ed5bc9c3e93c959d



Date: 2019 SHA1: 6ab8eefaad454a71ec3f3c35aef5bf9ac7c5f9eb

passcod ask@passcod.name
Finally, I knew urn:uuid:01201724-3305-4024-a1d5-148523598000 2017-01-24T05:33:00+00:00

I hope, for your sake, that he forgives me.

It was many moons before I understood this seeming contradiction. But it was too late; he was gone, and I was alas forever forsaken.

passcod ask@passcod.name
Monthly Update urn:uuid:01201710-0000-4010-a1d5-148400640000 2017-01-10T00:00:00+00:00


There’s been two chapters of Tourist this period, so naturally I’ve commented with my impressions on both: [1], [2]. Tourist is Saf’s current serial novel about AI and asexuality and depression and it’s great! Not only do I love her writing, I love the themes and the way she explores them. There’s a few scenes which evoke a very particular feeling I’ve experienced, and it’s fascinating that Saf is able to make me remember how that feeling is like just through her words. The writing was perhaps a little hesitant at first, but it’s been getting better and better every chapter. The latest chapter is excellent.

New Keyboard

I finally caved and pre-ordered a Keyboard.io Model 01. This is an incredible-looking keyboard, carved out of solid wood, with an ergonomic split configuration, individually-sculpted keycaps, and all the trimmings. It’s a treat. I’ve been lusting over it for over a year, following their production newsletter. I’ve finally decided just before the new year (the “deadline” in the tweet refers to them giving away an extra keycap set if pre-ordered before the end of 2016) that I deserve to spend a bit of money on myself, so let’s go.

They’re hoping for a delivery around Q1 2017, I’m hoping to have it before May.

New laptop?

Not for me, yet. But my brother is looking into an upgrade before starting his second year at Uni (he got into med!) and was especially interested in the Surface Pro. One hitch: they’re very expensive.

We may have just found out a trick, though: by getting it through Amazon US and shipping it here, we save about $600 NZD off the in-NZ price, even if we get it at the cheapest source here. We’re looking hard to see if there’s a catch, but so far everything looks a-ok.

So if you’re looking for a Surface Pro…

Backup & Sync

I’ve been outlining and tentatively speccing out my “perfect” backup and sync solution. I briefly toyed with making it closed-source (to start with) but no, if anything comes out of it, it will be open-source just like everything else.

The ideas mostly come from missing a decent and modern syncing and backup daemon for Linux and other platforms. Something fire-and-forget, quietly working to provide the best it can without disrupting you. Something that can efficiently protect against ransom/encryption worms. Something that can be paused to save bandwidth yet still sync the most important things right now so you can work collaboratively on mobile connections and not have last night’s photos clog your upwards link. Or, even better, something that figures out that you’re on a slow connection and automatically prioritises syncs and backups without intervention at all.

Behind it, a library and utility that efficiently and correctly syncs a local and a remote, as a daemon and not just a single invocation (because Rsync already exists), that works on all major platforms, and completely handles that state may change on either side during its run. More than that, a library that does not mandate the actual transport or endpoints, so it can be used to power sync engines for not only my “something” above, but also Google Drive, Dropbox, etc third-party clients.


I’ve released Cargo Watch 3.1.1, a minor update to upgrade dependencies, notably the Notify library to version 3. That brought event debouncing, which should solve a few of the most common issues encountered.

Nonetheless, Cargo Watch has been more or less supplanted by watchexec, which I have to admit is a superior albeit more generic alternative. I’m debating retiring Cargo Watch, and focusing instead wholly on Notify. That, or making Cargo Watch into more of a development tool than it was, and integrating features such as port and socket management as first-class features, perhaps combining the essential functionality of Node’s nodemon and Ruby’s foreman into a single tool for the Cargo/Rust ecosystem.


(This isn’t new this month, but I got a question about it the other day.)

Not sure where I encountered this, but it’s a Jack of Hearts. (In case you can’t see, the title of this section is the Unicode symbol for that playing card.) Think “Jack of all trades”. It means (apparently, and that’s how I use it for me) “pan/bi-amorous and poly-amorous”.


I didn’t listen to anything new until the New Year, as is my habit. During the year, all the music I like goes into a big playlist called “Sort”. Then at the end of the year I pick a name for my yearly playlist based on stars (first one was “Level Orion”, then came “Rain Stars”, “Llama Shepherd”, and this year’s “Carrier of the Dawn”), and go through the Sort playlist sequentially, either discarding or sorting into the yearly playlist and/or any of the few thematic playlists I maintain (“Music for Making” for writing/coding music, “Sing”, “Music Box” for songs I’d like to cover, etc).

This year the “Sort” playlist counted over 450 songs, and took me about two weeks to go through. The “Carrier of the Dawn” playlist now numbers 224 tracks.

While last year my listening was dominated by Blue Man Group, Eiffel, and Woodkid, this year I’ve enjoyed a lot of Jin Oki, Thomas Bergensen, Zero 7, Ásgeir, Hiromi, and some 19th century compositors like Chopin and Beethoven. Of course, the full list is much more varied than just these seven.

In the past 10 days I’ve started listening to new music again.


All in reading order within their sections. Word counts are rounded to nearest 1 or 5k. I explored the Harry Potter fanficdom, all nearly exclusively rated M. Contains lemons. Content warning for sexual assault in at least half the fics.

  • {HP} Prodigy.

    Pretty good. I liked the modern take. A bit too prodigious perhaps, but that’s what the title announced so who’s complaining? Waaay crazy story. Do not read in more than one sitting, because there is SO MUCH SHIT HAPPENING and you’d end up horribly confused. Great stuff. {135k words}

  • {HP} 893.

    Great story, good writing. Unsure how accurate the Japanese/Yakuza details are (but it’s gotta be better than Rowling’s own attempts at representing asian stereotypes characters), and the large amount of Japanese words and phrases embedded in the text make it somewhat tougher to read than usual. {360k words}

  • {HP} Harry Potter and The Acts of Betrayal.

    Short and sweet. Graphic at times. Cathartic ending and skillful munchkin lawyering. The last author note illustrates well the utter ridiculousness and sheer contrarian nature of some of the cretinous parts of fandom. {78k words}

  • {HP/Dresden} The Denarian Trilogy: Renegade, Knight, and Lord.

    Good writing, great humour, manageable gore and satisfying battle scenes. Oh, and let’s not forget the lore and world-building of epic proportions. The finale in Lord was exactly what was needed. There are supposedly continuations, but do yourself a favour and ignore both Variation and Apocalypse. They’re unfinished, apparently abandoned, and reek of Bad Sequel Syndrome. The only worthwhile point of note is that indeed (rot13) Nznaqn Pnecragre unq n puvyq sebz ure rapbhagre jvgu Uneel. Fur'f anzrq Yvyl Pnecragre naq vf nccneragyl cerggl phgr. And with that, the last plot point of the series is concluded. {235k + 190k + 245k words}

  • {HP} The Firebird Trilogy: Son, Song, and Fury.

    Despite claiming, as is usual, that all belongs to Rowling, this fic really only uses the characters and some general elements of plot. The universe is one of the most original I have ever read. It is an utterly different world, and extremely well built and detailed. Not content to be defined over a few departure points, it is rich of several dozen centuries of history with a particular focus, due to the story, around Europe, the British Isles, and the Americas. But this world is dark and cruel and bleak, and that itself is a terrible understatement. Content warnings for sexual and otherwise abuse, exploitation, horror… and yet that feels like too little said. It is a very good work. It surpasses many original, published, novels I have read in the genre. But while it hooked me and wouldn’t let me go as I devoured it, each further installment shook me deeper. Even with an active imagination and few of the ‘moral’ blockers on thought most my peers have, this world and its inhabitants shocked me in their depravity and casual evil, but most importantly, in the way it showed every single cause and character as believing they were in the right, even while performing and perpetuating wickedness, resulting in institutionalised malevolence in every situation and at every level of society. Even the heroes, the protagonists, the good ones, those trying to quite literally save the world from itself, are merely questionably good most of the time. It is a dark, dark work, but it is very, very good. It’ll haunt me for a while. If you at all can, read it. {170k + 150k + 170k words}

  • {Naruto} Life in Konoha’s ANBU.

    Interesting format, with distinct arcs corresponding to Naruto’s missions instead of a single continuity of plot. It makes the whole thing more approachable, and sets clear expectations around the progression of a particular writing stint. Unfinished, but not abandoned; there are long-term plot lines still in suspens (and I’m not talking about the canon plot lurking in the background, rather about the original plot lines that make it all interesting). {370k words at time of writing}

  • {HP} To Be Loved.

    Interesting prompt, and although the latter plots were a bit simplistic, I liked the politics, as well as the occasional insight into Dumbledore’s thinking. {95k words}

  • {HP} The Bonds of Blood.

    I really like Darth Marrs' writing. The emotions and complexity of every character are well-rendered, the plots are well-rounded, and the suspens is heart-wrenching. Yes, I have shed some tears and my heart has hurt. It’s not the best fic on this list, and it was a short fun read, despite all the feels, but it was pretty good. {190k words}

  • {HP} The Forgotten Contract.

    Yeah, yeah, yet another marriage contract story. What can I say? I like romance, and this is one of the most popular and least sappy romance genre in this fandom. I found the basis for the story interesting, and the resolution swift if perhaps a bit anti-climatic. But then again, the defeat of Voldemort was never the focus of the plot. The fic brushed on some thoughts I had while reading, namely on the influence Harry’s near worship for a decade, without having a real person to mellow it, would have had on society, particularly regarding standards of appearance and, to a lesser extent, behaviour. There was a strange consistent corruption to the spelling of some words, almost as if the text had been OCR’d: notably, various ‘I’ or ‘i’ letters had been replaced with ‘1’, but not all of them. {165k words}

  • {HP} To Fight The Coming Darkness.

    Jbern rarely disappoints. This was a fun story, but not a Humour story. Typical plot of Individual!Harry going against Dumbledore, but various atypical plot elements, mostly around making typically-always-good characters have questionable morals and make less-than-Light decisions, and making typically-always-evil characters be borderline good but forced in a bad situation. It adds an interesting realism. Few bad points, but one in particular (rot13): va gung lrf, gurer vf n cybg-rkphfr sbe ebznapr gb tb snfgre bapr Uneel naq Fhfna ner vaibyirq, ohg orsber gurer'f abg. Fb gung cneg bs gur fgbel srryf n ovg gbb snfg sbe gung ernfba. Good discussions and reasoning in dialogue, it changes from both naïve or overcomplex-in-hopes-of-sounding-smart plans and narration simply omitting planning and showing only the results. Including planning that actually feels intelligent is a great addition to any story. {340k words}

  • {HP} Pride of Time.

    This was really really good. I love Hermione time travel stories. I love when all the characters have their own flame, their own passions and thoughts and reasons and defects. I also really love stories that were planned out before they were written, and written before they were published, as they are invariably of better quality, simply due to having been revised and cross-written. Contains graphic sex, but gentle and hot and furious and real. Some scenes reminded me of sex I’ve had, see, that’s how good and real it was. Also contains instances of graphic violence, but not gore, and not deeply disturbing. It covers war (both of them) and terror and torture, but it’s not meant to shock and disgust. If you read nothing else on this list, I do recommend this one. {555k words}

  • {HP} Harry Potter and the Rune Stone Path.

    This list is getting way too long, but fortunately we’re two days before this update goes out and the next few fics I have queued are crackfics or small-length fics, so they should all make it into the short format list below. Well-written, and with a delightful amount of lesbian, gay, and bi characters, all presented positively, little prejudice in this regard all around. Also remarkably good with letting everyone be happy with their various religions, while calling out cultural misappropriation. No trans or enbies that I could find, but we’re getting there. I’ve noticed several possible references to HPMoR; generally I chalk those up to coincidence because the fics are HPMoR-antecedent, but this one is mid-to-late 2016, so it fits, and the references are multiple and fairly clear. Happy-ending fic, even more so than the other happy-ending fics I’ve read recently; this is positively Disney-esque in its epilogue. Although it’s certainly not Disney-esque in its contents, with sex à gogo, lots of innuendo, etc. There’s also violence and abuse present, this isn’t an all-rainbows fest. One persistent bad point: the cavalier way horrific fates are dished onto some antagonists. Sure, it might seem like karmic retribution, but cheerfully finishing off Malfoy by having him be taken by human traffickers intent on forcing him into prostitution still leaves a bad taste in. {520k words}

Also enjoyed, but no lengthy comment:

passcod ask@passcod.name
There Is No Such Thing As Writing For Adults urn:uuid:01201704-0000-4004-a1d5-148348800000 2017-01-04T00:00:00+00:00

I’ve read this article recently that quotes and contextualises an essay by Tolkien on how “there is no such thing as writing for children.” It reminded me of an affair in France about primary schools teaching texts deemed too mature for children that age.

A few years ago, there was a controversy in the french education system, and I speak from what I remember hearing from afar, so there might be someone better informed. For background, in french schools, in primary, you often learn fables (stories in the form of poems, mostly) from La Fontaine, which have the story and it illustrates a morale, a lesson, that is enunciated at the end. Or sometimes at the start. So, the controversy was that people said that the lessons in La Fontaine’s fables are too serious for primary-school-age children, and wanted to remove the fables from the curriculum.

Now, that is fundamentally the same thing as the “children’s books” sentiment: adults deciding that children aren’t mature enough to read and think about and understand a certain category of art, and inversely that adults (or YA, or teens, or…) are too mature to read and enjoy and identify with and benefit from another certain category of art.

And there are certainly children who will be completely uninterested by some art, and teens who will lose enjoyment in art they were very happy about in earlier years, and YA who will discover an intense appreciation of art they were in disdain of, or will be in disdain of in a decade.

But these are deeply personal tastes. Children and young people and adults of all ages vary in maturity, regardless of age. Indeed, puberty brings about, sometimes, a decrease in maturity, and it might not recover. Which could be perfectly fine! Some people stay children in some ways their entire lives. Some teens have more maturity than adults five times their age. Disability and mental health also plays a role, and render the age distinction even more meaningless.

As a heavy reader, and I have talked about this very thing with many others, I remember things I have read over almost two decades. Not the very words, but the contexts and situations and scenes. Over the last fifteen years, I have often gone “aha! that’s what that scene was talking about” or “oooh, this passage actually referred, very subtly, to open relationships” or, listening to a discussion with someone who lived during some event too far before my birth and is reminiscing or relating that to current events, “oh wow, turns out that book contained an acerbic commentary on the social condition around its publication date”.

It matters not if I am not able to grasp all the significance of a text or work of art at the time I read it, because of whatever reason, be it age or culture or ethnicity or translation or maturity or keeping up with current events or education… chances are, sometime in the future, I will figure it out.

In the meantime, I’ll have enjoyed whatever I could.

passcod ask@passcod.name
Mountain urn:uuid:01201703-0000-4003-a1d5-148340160000 2017-01-03T00:00:00+00:00

My mountain is Knowledge.

When the ship of my early childhood approached the land of life, knowledge is what I saw and what I started seeking. My journey began on the coast, where I learned to walk, and then I looked up, and saw all that I could climb. The slope was steep, the rock slippery, the path barely walked. And when I reached up to the summit I had glimpsed as a child, I found that it had merely been the place where earth meets the bottom of the clouds, and that my mountain continued upwards, and that its true summit I could never see at all.

But this did not discourage me.

And as I turned around and gazed over all I could see from here, and all that I had achieved in this climb, I knew that I would continue, forever if need be, in my quest upon the mountain of Knowledge.

passcod ask@passcod.name
Blogging More And Starting On New Year Resolutions Early urn:uuid:12201610-0000-4345-a1d5-148132800000 2016-12-10T00:00:00+00:00

Partly inspired by txanatan’s weekly roundup that just came out right now, I’ve decided to start blogging a little bit more! The first thing I noticed while opening my blog folder is how little I’ve done so in the past two years:


That’s it! Exactly 10 posts, counting this one, for the entire 2015–2016 period… awful. So, a New Year’s resolution is to try to write more. But, you see, I don’t believe in having New Year’s resolutions take effect in the new year. That’s just asking for trouble. Instead, I spend the last month or so of a year reflecting and figuring out what to do better, then start implementing the changes right then. That way, all I have to do the next year is keep on doing them, i.e. the hard part.

Last year, I took the decision to have my eyes fixed permanently around this time, and then the big day happened early this year. Guess what: it’s been great. (Okay, this time last year was also when I broke up with my then-SO, so it wasn’t all happy times, but lemons, lemonade, etc.)

So, end-of-year resolutions, then:

  • I want to improve my accent/speech. I’ve identified that not being confident with my English pronounciation is actually a fairly big source of anxiety in accomplishing some tasks. I’m considered fluent, but I do have an accent and sometimes that makes it hard for people to understand me, especially if they’re not used to it or distracted or, and this is the critical bit, when there’s no body language or lip reading to help me. That is, I’m much better at speaking with people face to face than on the phone or even over VoIP. So I’ve contacted a speech therapist. I don’t know yet whether this is something that will actually happen, because it’s quite dependent on the right specialist being here in Whangarei and having time in their schedule, but I’m hoping something will be going on sometime next year.

  • I want to lose some weight and be more fit. I’m not, by any stretch of the imagination, in very good physical shape. I’m not a total wreck; I can do an hour of moderately strenuous activity and be fine about it. I do walk five or ten kms every so often. In mostly flat country. With no weight on my shoulders. Yeah, so not great. Recently I did about 3–4 hours of kayaking down an estuary and back up, and it killed me. I did it, but for two days afterwards I hurt so bad all over that it was keeping me awake. So I’ve started hiking up the forest behind home. Twice a week, probably will be increasing that as I go. It’s a 30-minute hike there and back with about 50m altitude difference. It’s a start. My goal is to do the Tongariro Crossing once again — I did it last in 2011, and it erupted since, so I’d like to see how it changed.

  • I want to write more. Not only in this blog, but also fiction. I give a fair push every year during the NaNoWriMo, but it’s not really my mode of writing. I like to take my time, outline things, work out the direction and the details and all the little back references into the story. I’ve got a few outlines and a bunch of story starts. And I want to write monthly updates of what I’ve been doing. Weekly is a bit short, given I do most of my other-than-work stuff on weekends, but monthly could work. So I’ve started this blog post. And I have that one story I think I really like on a front burner. We’ll see how it goes.

Now, as to what I’ve been doing in the past month or so:


I’ve released version 3 of my Notify library, and started planning for a next big refactor. There’s a few features I’d really like to get in that require a completely different architecture than is there right now, and I’d also like to improve the testability of the entire thing. Notably, I’d like to be able to use several backend APIs simultaneously, something that I believe would be fairly unique among other notify libraries and tools. I’m also inspired by the (general) way nftables is done: instead of providing interfaces that provide what I think people want, allow them to write filters that are run in the engine and allow them to get exactly what they mean without me having too large an API surface.

But really, while I have interesting plans, I don’t have enough time to work on it. It took me a full week to release 3.0.1 with some needed fixes. I’m terribly grateful to the other contributors who’ve made this library much stronger than it was originally. I had no idea, when I started, that this would become my most starred project to date, by far. It’s been pretty cool.


I’ve created a script that I now call “Legola”. It’s the latest iteration in my efforts to create a script that can be read the same way no matter the orientation or direction of the page. Consider latin script (the one you use reading these words): put it upside down, right to left, or even mirror it and it becomes much harder to read. Sure, you can train yourself to read in all directions nonetheless, but still.

This time, I went for something extremely compact: a single glyph is an entire word. It’s based on a line: it starts somewhere (this is clearly marked) and then as you follow it it turns this way or that way, or encounters some obstacles. A counter-clockwise turn is the sound ‘ey’. A clockwise turn is the sound ‘oh’. Two turns one after the other is ‘ah’. A bar crossing the line is the consonant ‘L’. Two small parallel strokes on either side of the line mark the consonant ‘F’. And it goes on.

It’s inspired not just by my own previous efforts, but also by two other constructed languages: the Kelen Ceremonial Interlace Alphabet, and Hangul (better known as South Korean). Kelen’s provided the “line” concept, and Hangul is I believe one of the only scripts that combine several subglyphs to form larger glyphs in 2D space. I’ll do a longer blog post on it when I’m done hammering it all out.


I’m still on a Harry Potter fanfiction bend. Just in the last month, I enjoyed:

  • Presque Toujours Pur
  • Wand, Knife, and Silence
  • Petrification Proliferation
  • Harry Potter and the Champion’s Champion
  • A Second Chance at Life
  • Do Not Meddle in the Affairs of Wizards
  • Harry Potter and the Gift of Memories
  • Harry Potter and the Summer of Change
  • Angry Harry and the Seven
  • Harry Potter and the Four Heirs
  • Harry Potter: Three to Backstep
  • Harry Potter and the Sun Source
  • Harry Potter and the Invicible Technomage
  • In the Mind of a Scientist
  • Harry Potter and the Four Founders
  • Magicks of the Arcane
  • What We’re Fighting For
  • Partners (by muggledad)
  • The Power (by DarthBill)
  • Bungle in the Jungle: A Harry Potter Adventure

and I’m currently enjoying the sequel of that last one. It’s not looking like I’ll slow down much, either!


I’ve acquired a HC-SR04 ultrasonic sensor, took out the Tessel 2 I’d ordered and finally gotten a few months back, and have started on wiring them up together with the intention of creating a gauge for our water tank, so we can accurately and easily track our water levels. So far I’m stuck in the actual detecting-the-signal phase, or is it the is-this-wiring-diagram-right phase? I can’t recall.


I’ve done other things but I think that’s the big stuff; the rest is mostly work-related so does not really belong here. Not a bad month!

passcod ask@passcod.name
Tree urn:uuid:11201613-0000-4318-a1d5-147899520000 2016-11-13T00:00:00+00:00

Are you, are you
Coming up with me
They say they will be
They say up, will we be
Brave enough, brave to follow
To leave, to flee, to go
If we split, to leave me
To mine and only

When the proponents of tyranny
come to us and ask forgiveness:
“I’m sorry.”
“I didn’t know it would get so bad.”
We will tell them: “Too late.
Too little. The toll has already rung.”

We will not forgive.
We will not forget.
We will weep for the fallen.
We will endure.

What am I supposed to say
to young people coming to me
wanting to leave this sad world
because at least now
it would be on their terms?

They are at our doors.
They are our neighbours.
They are our family.
They are taking us.
They are not returning us.
They are denying us.
They are ignoring us.

I don’t know which hurts more:
their blows, their betrayal,
their torture, their murder,

or their indifference.

Are we out of sight?
Are we out of night?

Our world has already tumbled
Our life, for years now, has bled

Burn our secrets
Burn our hearts
Burn our love

Seal your lips forever, little one
Or forget you ever were different.
Rejoin your friends, embrace their joy,
bury your truth deep inside yourself.
Learn to smile again,
learn to smile the scars away,
forget yourself little one,
at least you’ll live another day.

It’s the end of the line
It’s the end of our time
It’s the very last step.

Too tired, too broken
we have stopped running.

Our final wish:
to go soaring into the skies
to fade away into the night

Our blood running free
A red sunset
A tide coming out
My soul drying out.


You told us to run
You told us to be free
You kept our secrets
You were broken for us
Still you did not speak

We thank you
We thank you
We thank you all

We will remember you
We’ve built monuments
We’re telling stories

At long last, with tyranny defeated
We stand here honouring you
Who made it all possible
But didn’t get to see the end

We weep for the fallen
We run into the sky
We smile true to our soul
We remember who we are
We restore our hearts
We return to ourselves
We heal the scars
We dream at night
We weep for the fallen

The toll has rung one final time.

passcod ask@passcod.name
Unlit urn:uuid:10201614-0000-4288-a1d5-147640320000 2016-10-14T00:00:00+00:00

“You shouldn’t be driving.”
“I haven’t had a drink.”
“You know what I mean.”

I drove on, Sani besides me.
Stopped at the lights, fumbled with my phone, trying to put music on.
Light turns green.
Grip the wheel with one hand, shut the phone with the other, make an awkward run into the avenue.
No cars around still, but more homes and driveways.

I turn into my lane, streetlight shining down

on me
and the empty
passenger seat.

passcod ask@passcod.name
Gaston Lagaffe urn:uuid:09201623-0000-4267-a1d5-147458880000 2016-09-23T00:00:00+00:00

This week I discovered that one of my all-time favourite comics, Gaston Lagaffe, was never translated into English. Ever.

I find that really sad because Gaston was, and still is, a comic I read when I was growing up, and I wish more people I live with (in a global sense, as in my local community) and work with and laugh with… also had read it.

But more than that, it’s because Gaston is a nerd. No, ever better, he’s the evolution of the high school nerd into adulthood. And, to me, he’s the answer to the cry for help and representation of nerds in high school.

You see, I can’t help but compare with American comics, especially American comics that are (stereotypically, perhaps) read and adored by American/English-speaking nerds while growing up. I don’t think they do a very good job of creating a positive nerd attitude to life. Maybe that’s just my flawed perspective as someone who didn’t grow up with them though.

Spiderman leads a double life: he’s a despised science nerd and a revered superhero. The tensions between those two identities are already well-addressed, but I think they’re tensions because Peter Parker doesn’t want to be a despised nerd. This is critical. He might grow beyond it later, but from the very introduction of the character, we have a nerd who hates that he’s a nerd, and craves to be “normal” and have the attention of, at a pick, love interests and the general public.

Superman is also an irrelevant and socially awkward Clark Kent, who (surprise) has trouble getting the attention of his love interest. Both as the superhero and as the non-super he has this notion of “fighting for the little guy.” Where Spiderman is a direct incarnation of nerds and their dreams, Superman is more of a defender of the weak.

Jack Kirby on the X-Men, emphasis mine:

What would you do with mutants who were just plain boys and girls and certainly not dangerous? You school them. You develop their skills. So I gave them a teacher, Professor X. Of course, it was the natural thing to do, instead of disorienting or alienating people who were different from us, I made the X-Men part of the human race, which they were.

With few exceptions, the narrative as it applies to nerds here is largely negative. Sure, it represents nerds and allows a veneer of legitimacy, but the only way to be acknowledged by whomever one wants (girls, boys, authority, the public at large…) is to become someone else.

Yet we nerds of the real world can’t do that. We don’t have superpowers, alien origins, or life-enhancing serums. And try as we might, actually getting to be acknowledged and accepted in society requires a lot of work and time and practice and experience. And it requires failure.

This is what Gaston represents, to me. Let me introduce you. This is Gaston:

Gaston tripping on a can

He’s an office junior in a busy publication house. He’s clumsy, lazy, easy-going, socially-awkward, and an unrecognised genius. This is one of his minor inventions, a radio-controlled lawn mower:

Gaston falls asleep mowing the lawn

He also probably has some ADHD symptoms, or at least that thing where you have a million ideas and can’t focus on what you’re supposed to be doing. So he has a radical solution: he goes and creates those ideas. He follows the threads and does stuff.

A few of Gaston's ideas

And yet, Gaston is hopelessly out of society’s proper functioning. He isn’t a role model: this isn’t someone you want to emulate in every way. He’s not successful, he doesn’t have the recognition of his peers, and he’s still despised by “normals”. But this is also precisely why I think he is a better representation for nerds.

You see, he doesn’t want these things. He’s not successful by society’s standards, but he has fun and creates a bunch of things and clearly believes he’s doing pretty well, by his standards. He doesn’t have the recognition of his peers, but he has good friends who are more or less as quirky as he is, and accept him for who he his. Even those who initially despise him come to a grudging respect and even occasional admiration.

Gaston's library labyrinth

For most of the series, he has a romantic aspiration with another character, but, until the very end, it’s an asexual relationship. And it’s not just that our antihero is too socially awkward to initiate sex: no, both of them are happy in the relationship they share.

But most importantly, Gaston fails. A lot.

Gaston and chemicals make very good friends

This is a funny comic strip, and many of the gags feature Gaston’s inventions, ideas, setups, and other creations going wrong, either at his or others' expense. He fails and fails and yet never fails to get back up and go on. In fact, we never see him getting back up, it happens in between the strips.

Gaston is never angsty nor brooding; he might not be a regular member of society but doesn’t yearn for it either. Gaston is happy in life, without denying who he is, without aspiring to be someone else, without needing extraordinary powers to accomplish any of this. He’s just himself, and he’s just fine.

And, really, that’s all I’ve ever wanted.

Gaston hard at work

passcod ask@passcod.name
The Box urn:uuid:08201628-0000-4241-a1d5-147234240000 2016-08-28T00:00:00+00:00
  • Original written 2008-10-28
  • Descriptive Writing Assignment, English class
  • Transcribed 2016-08-28, with minor amendments for style

The box was simple. It was hand-crafted, seemingly by inexperienced hands. The lid was not attached to it, except for two mould-eaten strings, passed through rough holes in the wood. There were carvings on its top: words now unredable, names, a heart, crossed out by later cuts. Several layers of time were printed there; past drawings, gone relationships, ancient memories.

When I opened the box, it was as if I’d opened an old book. The same odour, the mark of time. The same resistance, this reticence of giving up secrets.

Dust spiraled under my breath. When it fell back, the content of the box, those pieces of childhood, were finally exposed to my sight. They seemed still defiant, as if daring me to uncover their stories.

A pair of little scissors and cotton string were the first things. The seemed to have been placed there in a rush, just before moving out of home. Pence coins, saved and never used. Several badges from the scouts. Love letters, with Xs in faded ink. Had they been received and kept? Or were they still waiting to be posted?

Further in the shade were deeper souvenirs. Diving into the swirls of dust, my eye caught on toys and objects only precious here. Glass marbles, scratched and marked, reflecting older games. Short pencils, used by force of fingers, sharpened with quick strokes of a knife. The knife itself, its steel blade half-open, shining still, having won its fight against time and rust. A little vial, empty now. Two little stones, black jewels in the dark.

Going back to the source, the beginning: the last objects, first put, unveiled from time. A sepia photograph of a baby. A name engraved in a bracelet. A petite cloth doll, of a rabbit. First fallen tooth, neatly labeled. Finally, a little card with a name and these words: “If by any luck you found this box, could you please return it to me.”

I looked up the name. Ten minutes later, when a heavy door opened and a grandmother looked at me, somewhat intrigued, I asked: “Is this yours?”

passcod ask@passcod.name
Regulus (writing notes and author commentary) urn:uuid:08201616-0000-4229-a1d5-147130560000 2016-08-16T00:00:00+00:00

The story of the narrator starts one or two centuries beyond our present time. It is in accordance of my own beliefs that this kind of technology (to be able to live a long time, if not forever, and to have decent space travel methods, to start with) will be available and ready in our world, in reality, at most around this kind of timeframe. From there, the narrator says they wasted a century before getting to work, and that this note was written after “three score centuries” or 6000 years, have passed. So the story begins at least after 8316 CE. The last note puts it at 8570 CE, but durations are purposefully left fuzzy to allow for wording and the difficulty to measure time accurately over space travel, FTL, and times beyond anything we, humans of the 21st century, can reasonably imagine.

The story for the “reader,” who is not the reader of this short, but a character named Otto who finds this note and then begins a search for the narrator (presumably to tell them how Earth is?), begins in 9387 CE. The search lasts 200 years, during which the narrator leads Otto on a merry chase of stashes of research and notes across the Universe. We, the reader of the short, only get to read a few of the notes, as hinted in the Nyctimene entry; furthermore, there are also the stacks of research results and notes provided along each entry; it would not be realistic for just those few clues contained in the entries to be sufficient to find the next one. But those ones put together have an interesting thread.

The Sechura desert is better known as the place where the Nazca lines are. The Owlman is a Nazca figure representing a person with an owl’s face, arm raised up.

ATHENA is an actual X-Ray space telescope that is being built and will be launched in a few years. ATHENA ΑΘΕ is probably one of its far, far successor. This is happening 62–72 centuries in the future, after all. The ATHENA telescope, ours, is going to be in L2 orbit; obviously this latter one, version ΑΘΕ, stayed there, too. “ΑΘΕ” was an inscription on Athenian drachmas in Ancient Greece, accompanied by a depiction of an owl.

The Phæthontis quadrangle is an area of Mars. Phaeton was a demigod who, one day, drove the Sun’s carriage across the skies. “as dusk falls” is a reference to the philosopher Hegel, who noted that “the owl of Minerva spreads its wings only with the falling of the dusk.” Jiang Maze’s name does not mean anything and is not particularly significant; I pulled it from a box of tea and a poster in my brother’s room. Jiang is the family name. They use the pronoun “they” as written in the text. Speaking of pronouns, notice how none of the characters have a defined gender? The two names, Jiang and Otto, are neutral in this regard. What gender did you give the characters, in your mind, while reading?

2150 Nyctimene is an asteroid (or minor planet, to be precise) in our solar system, which I have dubbed Sol system in this short, discovered in 1977 bla bla bla, none of that is relevant.

It’s located quite a ways from Earth, on an orbit inclined from the elliptic; in my story, that provides a place that is accessible from other planets by conventional propulsion, and then brings your vessel away from the influence and business of the main plane of our system, so that you may engage your FTL without causing nor getting undue interference.

To get back to the reference thread, Nyctimene was the daughter of Epopeus, King of Lespos. Pursued by her father, she was rescued by Athena who turned her into an owl, the very owl depicted on the drachmas.

The Owl of Athena, or the Owl of Minerva, as called by the Romans, was, by the way, a symbol of knowledge and study.

Dagon is the name of an exoplanet orbiting the star Fomalhaut. It is situated within an immense disc of debris floating around the star. Photos of that disc of debris and the star show a distinctly fuzzier band: a dust ring. A view from the side of that disc makes it look elliptical. All in all, from here, it kinda looks like an eye, with a massive ball of fire in the middle of it. Fomalhaut is about twice as large as the sun.

For the imagery, we have to go back to Epopeus: his name came from ἔποψ, better known as the hoopoe, also nicknamed “the watcher.” Then we abandon Greek mythology and go to the Persians, to whom the star was one of the four “Royal stars,” and more precisely, was named Hastorang, of the winter solstice, “the Watcher of the North.” (That’s not meant as a reference to a very popular TV series of the moment, it’s entirely coincidence. I needed a star with a planet that referred to the Nyctimene somehow, and I’d already made plans for two other Royal stars.)

The planet is located near that dust ring mentioned before, which completes the explanation for the Eye of Sauron mention. The shielded structure is because the planet is moving through the disc of debris, impacts are frequent, so a shield is necessary; and in turn, the shield would generate a sky of continuous showers of burning meteor remains (the shield would destroy said meteors instead of bouncing them or repelling them; I felt that was more realistic compared to the fairly fantastic shields present in some other space-bound sci-fi.) Finally, the planet has a very long orbit, spanning 2000 years.

Aldebaran is another of the Royal stars. Its current name means “The Follower,” in Arabic. In Hindu, it is called “the mansion Rohini.” For the location in this story, I went with a reference to the excellent BD “Les Mondes d'Aldébaran,” which inspired me during my teenage years. One of the first scenes in that story depicts a very long and beautiful beach, on the planet Aldébaran-4, fourth and only livable planet in the Aldebaran system.

Antares is also a Royal star. It’s a red supergiant nearly 900 times the size of the sun. In Ancient Greece, the citadel or acropolis of a city-state contained its royal palace. Antares has had various names in history, like: “the Lord of the Seed,” “The King,” “Jyeshthā” (“the Eldest”). In Māori, it is called “Rehua” and regarded as the chief of all the stars.

The title, Regulus, refers to the fourth and last Royal star, and perhaps the next destination of the narrator, who knows.

passcod ask@passcod.name
Regulus urn:uuid:08201616-0000-4229-a1d5-147130560000 2016-08-16T00:00:00+00:00

We lived forever, and would live forever.
So we had concluded.

We didn’t know, of course, because none can predict the future. But we had attempted everything, and still, we lived. We had watched, in the meantime, people come and go, countries come and go, peoples come and go. Some of us helped, to make them come, or to make them go. We clashed, albeit rarely one against another; such conflicts rarely went how we wished. It would not be accurate to say we warred: we made war, but we didn’t hurt ourselves. Rather, those we lead and guided were hurt, and made hurt, and did hurt.

It took us a century to meet again, all together. And we stayed together for almost a decade, casting off from the world, metaphorically. We made peace.

The world outside raged on.

In all reunions going forward, we regretted, all of us, for that first moment of selfishness. It had taken us a century to make peace among ourselves, at little cost to us, given we would live forever, and at excruciating cost to everyone else, given that they didn’t. It took us, to our eternal shame, one other century to not only repair the damage we had sown, but to help all of them, all mortal people, to make peace. Now, they lived longer.

We split in four: some worked on prosperity, to make the world the best we could, not for us, but for them; some worked on space, to explore and move there, to make inhabitable, to help prosperity; some worked on knowledge, and foremost, on understanding why we lived, to perhaps reverse it, or to perhaps share it; some worked on the past, to find why and whom made us live forever, to study their history, to help them remember it, such that both us and them would endeavour not to repeat it, or at least not the bad parts.

As of this day, three score centuries on, before I leave for the stars, uncertain to come back, we have not finished our work. Humanity has almost forgotten us, all according to plan. They live, they think, forever — we know otherwise, but still, we hope. Soon I embark. You who reads this, tell me:

how is Earth?

— Found in the Sechura Desert, Earth, in the hand of The Owlman, 9387 CE.

P.S. Shortly after leaving, I made a discovery that let me finish my part of our research: The Understanding. I came back here to leave you copies of my notes and conclusions. Go find Jiang Maze, last I heard they were living in the Phæthontis quadrangle on Mars. They are in charge of the relevant part of The Past, and will find these notes interesting, as well as provide you, most probably, with a cup of the finest tea in the Sol system, as dusk falls.

— Found in a decaying ATHENA ΑΘΕ telescope, in L2 orbit, Earth, 9411 CE.

I hope you’ve found the previous stashes useful, although there was something missing, an unexplored thread in my research that will prove critical both in the understanding and application of, at least, the last five stashes, and, perhaps, a few more. While waiting on this rock, I have also branched off into improvements which affect me directly, and will field test them soon. If you’re interested in a potential 3% efficiency increase in FTL Type C drives — and let’s be honest, who isn’t? — come find my next stop. If you can.

Nyctimene is bringing me away from the hubbub of the main elliptic plane of the Sol system, perfect for a quiet and discreet jump. How was Maze’s tea?

— Found on 2150 Nyctimene, Sol system, 9436 CE.

I thought I would spend an entire orbit here, on Dagon. I only lasted 400 years before fancy made me take flight again. I have to say, as impressive as it was to approach the Eye of Sauron, only to settle within its edge, it was nothing compared to centuries of perpetual meteor showers. As usual, you’ll find my notes and research here. There’s a lot; take your time. I endeavoured to keep linguistic drift low, but I cannot control for how the common tongue will have evolved while I was alone here, so I wish you luck, dear reader.

I have left a clock zeroed at my time of departure, for your information. It should be precise for two millennia, beyond that, well. You’d be lagging anyway.

— Found in a shielded structure on Dagon, Fomalhaut system, 9520 CE.

As mentioned in my last few notes, being around people once again has quite well increased research avenues. Not only that, but I went and got up to date with the current state of everything, and I even sent a few messages to my colleagues of old, which prompted an impromptu reunion with those that happened to be nearby. As a result, this stash is special! Sure, you’ll find the usual, but there’s also a record of said reunion, and notes on those I met, along with historical observations, recollections, and even archives dating back all the way to my first millennium. I do not have the hubris to write conclusions and analyses of that data, that and my colleagues might just take offence, but perhaps you or yours will want a stab at the matter.

At my great surprise, although in hindsight it was inevitable, I found I liked interacting with people, especially those younger than me (there’s a lot more, and they’re not all people who have tried to kill me at some point; it was a long time ago, and we’ve all moved past it — so we say). A bright new world this is, after being alone so long. So, at my great surprise I started getting attached to a few. As I write this, I know I’m leaving; they know I’m leaving. And yet I also know I might come back, as my missing them will gnaw at me.

My destination is Antares, perhaps detouring via Betelgeuse, there’s a very interesting research group drawing parallels between native species of the two systems, hinting at another species being capable of space travel — now that would be the greatest discovery, the crowning of a career, wouldn’t it?

When you stop by, do make contact with my local fellow ancients, they’re intrigued; and your news from Maze are the freshest they’ll get. Bring them some tea, too, you know the one. Does it still have the scent of the moon?

— Found in a beach mansion on Aldébaran-4, Aldebaran system, 9566 CE.

This is the last note there is. As of writing this, I have finished my era of research and study and travels. Well, maybe not travels. I have made friends here, and on Aldébaran-4, and around Betelgeuse, and elsewhere. I’ll have to keep traveling, if only to visit them all. But my pursuit of knowledge and understanding is well and truly over. I have, long ago, finished my portion of the work assigned to me, and more. You’ll find next to this the last details and conclusions regarding that and all other threads I was exploring.

I find myself wondering if I’ll go back to Sol; probably not soon, but it’s a possibility. One I would have never imagined when I started on this trip, this exile, if you would. I have lived a very long while, and I have regretted a great many events; it is only recently that I have been able to finally face them, to forgive myself in a way; it is only recently that I have opened up about them to another.

Perhaps, had I continued on my lonesome, you would eventually have heard these grievances against myself… but these notes feel much too impersonal now. I cannot help but feel incoming loss at stopping there, yet it is smaller than the relief, and smaller still than the joy at being able to dedicate more of my life to my friends, my precious people.

You should know what I look like, nowadays. I’ve included a picture, probably not the first you’ve seen, though, as I’m sure you’ll have talked with my fellows on previous stops. But if you see smaller versions of me around, don’t blink — say hi. I’ve at last managed to acquire some decent tea.

You will not find any further note. Don’t try. Leave this to be my final one. I have been following your progress, lately, as your search coincided with my travels. This last stash should satisfy you for a little while, Otto, and then it’s your turn. A millennium of research and travel, two centuries of chase. Go forth and make it all your own, from now on. And thank you.

— Found in the Rehua, a citadel-station orbiting Antares, 9570 CE.

passcod ask@passcod.name
Fanfic Lists urn:uuid:07201610-0000-4192-a1d5-146810880000 2016-07-10T00:00:00+00:00

For the past two months and a few weeks, I had given myself the challenge to read all fics on this list of Harry Potter fanfics, provided they met my criteria and I hadn’t already read them, of course. My criteria went thus:

  1. The fic has to be complete, unless it was updated recently. That was to avoid abandoned fics. I was in this for many reasons, one of which was the pleasure I get from reading good fics, and after the first few abandoned fics I decided I couldn’t bear the disappointment anymore. If I had been reading just a few of them, maybe I would have; but this was a hundred fairly long fanfics — I couldn’t cope with potentially dozens of unfinished plots, of having to leave characters I had gotten attached to without ever a chance of seeing the conclusion of their story.

  2. The fic has to be good, fast. I set a hard limit at five chapters before I would give up. I don’t think I ever hit it. This was a list of the top 100 fanfics, so not many were truly bad, but those that were clearly announced themselves.

  3. The fic has to be in English. Obviously, if I can’t read it… Nevermind that I can read French fluently, I don’t particularly like reading fanfics in French. I also don’t like reading programming documentation in French, and when I communicate with French developers, it is most often in English. This is a personal thing. Only one fic hit that rule, but I had made it in advance as I knew it was a possibility.

  4. No Dramione. As in, the Draco/Hermione romantic relationship pairing. This was more subtle than that: with very few exceptions, I outright ignored all fanfics that kept pretty much everything the same, but then forced the characters into the ship. I don’t mind when Dramione, or something near it, actually happens organically, as a true part of the fic. For example, HPMoR, which I do regard as pretty much the Harry Potter fanfic, has a tentative romance and definite, if at first grudging, friendship between Draco and Hermione. But we get there through circumstance that makes sense, and is not forced just to get the ship there, or worse, the characters are put together in an abusive or highly disfunctional relationship that’s glamoured up by the author. Ugh. Ew. Urgh. Special mention, though, for The Nietzsche Classes, though, which is a great perversion of the genre, given the reader has the right (twisted) mind.

  5. No sanctimonious religious bullshit. If you think atheists don’t actually have morals because morals are exclusive to people who believe in a giant cuddly Zeus lookalike who loves everyone so much he has them kill each other for no fucking reason floating in the sky… yeah, not a fan. Or, actually, as long as you keep that shit to yourself, all good. But don’t put it in your fanfic like you’re a preacher yelling at the gay kids that they’re all going to hell because, y'know, only straight love is allowed past the gates of Paradise. There are fics like that in the list. Fuck ‘em.

  6. In fact, no bigotry. That’s an interestion criterion in a verse that has a lot of the plot and underlying tensions about blood bigotry. But there is a vast difference between bigotry, of any kind, being explored in the text and the author trying to push their own bigotry through fanfic. There are two very blatant opposites in this regard in the list: one had a protagonist and winning side and even the losing side, in parts, be very much convinced and fervent and true in their belief that Muggles were vermin… but the author wasn’t a bigot. Or if they were, by some turn of luck, their fic at least didn’t read like that. It read like a well-crafted exploration of a concept, with realistic characters who were strong in their beliefs, even though these were objectionable and horrible and wrong, and similarly for the other side. The other fic… was very much racist. The characters on the “wrong” side of the issue (according to the author) were weak and their personalities were systematically twisted to fit the narrative; while the bigoted rhetoric was dripping from even the narrator’s parts, not just the characters’ thoughts. There was, totally unsurprisingly, also classic skin and ethnic racism, and homo/trans-phobias. A smorgasbord of barely-subtle hate delivered in the wrappings and trappings of a universe I love. It’s a bitter experience.

Entries I found deserving were listed publicly on my Pinboard, along with quick commentary. I tried to keep the comments spoiler-free in general, but of course that’s difficult to do in this context.

I estimated the total amount of prose I’d read, just counting those HP fanfics, at 15-20 million words. But who’s counting?

Now, after a suitably long (ha ha, who am I kidding, I like fanfic too much to leave it for long) break, I am starting the very same thing with the Naruto list, from the same source. Same criteria, except of course the Dramione clause — I think the Naruto verse doesn’t really have such a contentious pairing. Naruto/Orochimaru comes to mind, but is not really any different from Harry/Voldemort, and there are good fanfics with that. I think perhaps a Mizuki/Naruto ship would qualify. One difference between the two verses is that shinobi have little compunction against killing their foe, or dying trying, which means that if two people who hate each other meet, it often ends up bloody rather than them not being able to do much other than shouting at each other or bullying them, and potentially-fatal encounters are not very conducive to romance, of any kind. This isn’t Hollywood, kids, you’re not going to have people who say they hate each other fuck each other silly after five minutes on screen because of *hand waving* pent-up feelings and borderline porn.

We’ll see what comes of it.

passcod ask@passcod.name
Self urn:uuid:06201606-0000-4158-a1d5-146517120000 2016-06-06T00:00:00+00:00

Selflove, selfhate, selfwhatever
I am a professional selfhater
I do, every day, my regulation 24 hours
And some more, for my own pleasures
Every day, a little more, without fail.

Selflove, selfhate, what does it fucking matter
I am a professional selfhater
Every morning, every evening
Every afternoon, and from nine to noon
It’s my life, my death perhaps, it’s my very own tale.

In the association of professional selfhaters
Selflove, selfhate, all together, all betters
All infinite shades of black and white
Shining down; a rainbow of moonlight
Every day, every night, every one, every all.

Until one day perhaps — it’s the dream — none at all.

passcod ask@passcod.name
Blanket License Revocation urn:uuid:02201613-0000-4044-a1d5-145532160000 2016-02-13T00:00:00+00:00

Prior to today, Saturday 13th February 2016, all my works were, by default, released in the Public Domain under the Creative Commons CC0 1.0.

This is no longer the case.

While many of my works still remain in the public domain, and a large amount are under permissive licenses, new works are not automatically released.

All versions of the Blanket License, are cancelled, nulled, voided, revoked.

My mind on licensing has changed since that day years ago when I created my blanket license. As such, this.

passcod ask@passcod.name
Advent Of Code urn:uuid:12201501-0000-4335-a1d5-144892800000 2015-12-01T00:00:00+00:00

Advent of Code is a series of small programming puzzles for a variety of skill levels. They are self-contained and are just as appropriate for an expert who wants to stay sharp as they are for a beginner who is just learning to code. Each puzzle calls upon different skills and has two parts that build on a theme.

My solutions are usually in JavaScript or Ruby. For each problem, I also try to create an “evil solution” which uses eval(). This page will update along whenever I finish a problem.


First, eliminate as many pairs of () or )( as possible, leaving you with a string of either all ( or all ). Then use the length of the string and which symbol it is to figure out the answer.

const regex = /(\(\)|\)\()/
while (null !== input.match(regex)) {
  input = input.replace(regex, '')

if (input === '') { return 0 }
return input.length * (input[0] === '(' ? 1 : -1)

Evil solution:

return eval(
  .replace(/\(/g, '+1')
  .replace(/\)/g, '-1')


This is actually easier. In part one, I wanted to be clever, so I didn’t do the naive thing and iterate through the string keeping a counter. Let’s do that now:

let floor = 0
let position = 0
while (floor !== -1) {
  floor += input[position] === '(' ? 1 : -1
  position += 1
return position

Evil solution:

return eval(`c=0;i=0;r=-1;${input.
  replace(/\(/g, 'i+=1;c+=1;').
  replace(/\)/g, 'i-=1;c+=1;if(r<0&&i===-1){r=c+0}')


First, let’s figure out a little math. We’re going to get a lot of package definitions, so optimise the whole thing a bit:

2*l*w + 2*w*h + 2*h*l   // Original formula (6 mulitiplications)
2*(l*w + w*h + h*l)     // Factorise, now we only have 4 multiplications

2*... + 2*... + 2*...   // Each individual result is multiplied by two
2*(... + ... + ...)     // So we can sum all results then double it once

l*w + w*h + h*l         // The simplified inner formula (3 multiplications)
w*(h + l) + h*l         // Factorised, only 2 multiplications

Onto the code!

let slack = 0
return input.split("\n").reduce((memo, line) => {
  if (line === '') { return memo }
  let d = line.split('x').map(n => +n).sort((a, b) => a - b)
  slack += d[0] * d[1]
  return memo += d[0] * (d[1] + d[2]) + d[1] * d[2]
}, 0) * 2 + slack

Evil, but boring (it’s just an inlining of the above), solution:

return eval(`t=0;s=0;${input.
  replace(/(\d+)x(\d+)x(\d+)\s*/g, 't+=($1*($2+$3)+$2*$3);s+=[$1,$2,$3].sort((a,b) => a-b).slice(0,2).reduce((m,d) => m*d, 1);')

In case you’re confused (mwahaha):

  • .slice(0, N) takes the first N items
  • .map(n => +n) casts all items to numbers
  • .sort((a, b) => a - b) sorts numerically
  • .reduce((m, d) => m * d, 1) product of all items
  • .reduce((m, d) => m + d, 0) sum of all items (used below)


No preliminary math, this time.

return input.split("\n").reduce((memo, line) => {
  if (line === '') { return memo }
  let d = line.split('x').map(n => +n).sort((a, b) => a - b)
  return memo + d.slice(0, 2).reduce((m, d) => m + d, 0) * 2 +
    d.reduce((m, d) => m * d, 1)
}, 0)

Ugh. So boring.

Evil solution, which assumes that the input has a trailing newline:

const bows = eval(input.replace(/x/g, '*').replace(/\s+/g, '+') + '.0')
const wrap = eval(`"${input.replace(/\s+/g, '\".split(/x/g).map(n => +n).sort((a, b) => a - b).slice(0, 2).reduce((m, d) => m + d, 0)+"')}".length`)
return bows + wrap * 2


I only implemented the evil version of this, because I found it easier. Each axis (north-south, east-west) is represented as a number, together they form coordinates. The insight was that a pair of coordinates identified uniquely a particular house, so we translate each instruction to either adding or removing 1 from the correct variable (starting position is 0, 0) then after each instruction we write the coordinates to a Set. The solution is then simply the .size of the Set. (Sets only store unique values.)

let moves = input
  .replace(/</g, 'x-=1;')
  .replace(/>/g, 'x+=1;')
  .replace(/v/g, 'y+=1;')
  .replace(/\^/g, 'y-=1;')
  .replace(/;/g, ';save(x,y);')

// Construct and run the program:
return eval(`x=0;y=0;s=new Set();


Same idea, nearly the same program, except now we need to keep track of who’s who. We do this by using a tuple, and using either the first or the second value, switching after every instructions.

let moves = input
  .replace(/</g, 'x[who]-=1;')
  .replace(/>/g, 'x[who]+=1;')
  .replace(/v/g, 'y[who]+=1;')
  .replace(/\^/g, 'y[who]-=1;')
  .replace(/;/g, ';save(x[who],y[who]);who=+!who;')

// Construct and run the program:
return eval(`x=[0,0];y=[0,0];s=new Set();who=0;


Let’s bruteforce some MD5s:

const crypto = require('crypto')
hash = n => crypto.createHash('md5').update(`${input}${n}`)
let n = 1
while (!hash(n).digest('hex').startsWith('00000')) { n += 1 }
return n


Just modify the .startsWith() part.


  • str.replace(/[^aeiou]/g, '').length > 2 contains at least 3 vowels
  • null !== str.match(/(.)\1/) contains a repeating letter
  • null === str.match(/(ab|cd|pq|xy)/) does not have the forbidden chars
  .filter(str =>
    (str.replace(/[^aeiou]/g, '').length > 2) &&
    (null !== str.match(/(.)\1/)) &&
    (null === str.match(/(ab|cd|pq|xy)/))


  • null !== str.match(/(..).*\1/) non-overlapping pairs
  • null !== str.match(/(.).\1/) repeat with a letter in between
  .filter(str =>
    (null !== str.match(/(..).*\1/)) &&
    (null !== str.match(/(.).\1/))


I don’t particularly want to implement a million-entry state box. So let’s figure out a few things about the input. First, are the coordinates always from the top-left corner to the bottom-right, or are they sometimes of the other corners?

Wait wait, actually first, let’s parse the input into a more machine friendly data structure:

let stack = input
  .filter(l => l !== '')
  .map(l => {
    let p = l.match(/(turn (on|off)|(toggle)) (\d+),(\d+) through (\d+),(\d+)/)
    return {
      action: p[3] || p[2],
      from: p.slice(4,6),
      to: p.slice(6,8)

Now onto analysis:

let sizes = stack.map(l => [l.to[0] - l.from[0], l.to[1] - l.from[1]])
sizes.map(s => s.map(d => d >= 0)) // If all are true, corners are all TL->BR.

They are. OK. To make further processing easier, let’s remove all stack “frames” that are zero pixels wide or high:

stack = stack.filter(frame => frame.from[0] !== frame.to[0] &&
  frame.from[1] !== frame.to[1])

At this point I was going to look at some logic properties to try and compress the stack of definitions down to a manageable level, but then I thought: wouldn’t it be fun to see the pattern that results from the instructions? So I went and JSON.stringify(stack), carried it across to a browser’s console, and opened up a 1000x1000 canvas.

$c = $('#lightsout') // In consoles, without jQuery, `$` is an alias for
                     // `querySelector`, and `$$` for `querySelectorAll`.
ctx = $c.getContext('2d')

Now then. Turn on is easy. Turn off is easy. Toggle is… slightly harder:

function cornersToDims(from, to) {
  return [from[0], from[1], to[0] - from[0] + 1, to[1] - from[1] + 1]

function turnOn(from, to) {
  ctx.fillStyle = 'white'
  ctx.fillRect.apply(ctx, cornersToDims(from, to))

function turnOff(from, to) {
  ctx.fillStyle = 'black'
  ctx.fillRect.apply(ctx, cornersToDims(from, to))

function toggle(from, to) {
  let image = ctx.getImageData.apply(ctx, cornersToDims(from, to))
  let data = image.data
  for (let i = 0; i < data.length; i += 4) {
    data[i] = 255 - data[i]; // red
    data[i + 1] = 255 - data[i + 1]; // green
    data[i + 2] = 255 - data[i + 2]; // blue
    // and skip the 4th value as we don't want to touch the alpha channel
  ctx.putImageData(image, from[0], from[1])

Okay, let’s do this:

turnOff([0, 0], [1000, 1000]) // Everything starts off
stack.forEach(frame => {
  switch (frame.action) {
  case 'on':
    turnOn(frame.from, frame.to)
  case 'off':
    turnOff(frame.from, frame.to)
  case 'toggle':
    toggle(frame.from, frame.to)

Render of the light array

Uhm. Santa is into modern art, I guess?

Now onto actually retrieving the number of lights that are on:

let image = ctx.getImageData(0, 0, 1000, 1000)
let data = image.data
let counter = 0
for (let i = 0; i < data.length; i += 4) {
  if (data[i] === 255) { counter += 1 }


Oh, fuck off. Well, let’s go, rewriting these functions. I’ll use transparency to indicate brightness, which gives me a visible result while only having a single value to modify and query.

function bright(from, to, amount) {
  let image = ctx.getImageData.apply(ctx, cornersToDims(from, to))
  let data = image.data
  for (let i = 0; i < data.length; i += 4) {
    let value = data[i + 3] + amount
    data[i + 3] = value < 0 ? 0 : value
  ctx.putImageData(image, from[0], from[1])

// Reset to yellow, zero opacity/brightness
ctx.clearRect(0, 0, 1001, 1001)
ctx.fillStyle = 'rgba(255,255,0,0)'
ctx.fillRect(0, 0, 1001, 1001)

stack.forEach(frame => {
  switch (frame.action) {
  case 'on':
    bright(frame.from, frame.to, 1/500)
  case 'off':
    bright(frame.from, frame.to, -1/500)
  case 'toggle':
    bright(frame.from, frame.to, 2/500)

Annnnd it didn’t work, at which point I got interested by the next shiny thing, and gave up.

passcod ask@passcod.name
The Road to Hell urn:uuid:10201512-0000-4285-a1d5-144460800000 2015-10-12T00:00:00+00:00

We are walking on the road to hell
we are walking on the road to hell.

We come from the worlds behind us,
we come from the worlds of people,
we come from a thousand paradises.

We are walking on the road to hell
fleeing from your tyranny, your hate,
your words, your guns, your utopia.

We are fleeing proudly, finally tired
of living with you, near you, for you.

Enjoy your paradise, for we will not
be coming back, not return, not ever.

We were your dark suns, your bright suns,
your voices of happiness, your shining
lights dancing to the sound of a hundred
drums, your castles in your minds, your
every thought and dream, your precious
precious colour in your black and white

We were the black and the white and the
everything in between, and the every tint.

You built your worlds for us, for you,
bastions of freedom, fortresses of beauty.

You closed the roads, collapsed the gates,
showed us the door yet kept us behind bars.

You said you loved us while beating on our
homes with your rams of steel, you said you
would help us while screaming you abhored us.

You built palaces of fear, you built theme
parks dedicated to making you feel justfied.

We were like the wind, breathing life through
windmills, and you were a giant Don Quixote,
raving madly about the threat we posed you.

We are walking on the road to hell
You can stop us no longer
We are walking away
Away from you
Away forever

passcod ask@passcod.name
Air New Zealand Happy Rant urn:uuid:09201503-0000-4246-a1d5-144123840000 2015-09-03T00:00:00+00:00

If you’ve never flown in an Air New Zealand flight, it’s worth a go. They’re different.

Having gone through four other air companies in the last month, all so-called “good”, I feel like I have had an appreciation of their respective qualities. In short: they all suck.

Air NZ is known worldwide for its innovative flight security videos. What is not shown, though, is that you watch that video on a screen that rivals your tablet’s, with an interface on par with Android’s. It’s got smoother scrolling than the iPhone, and it can charge it in-flight, too.

Oh, and there’s a straight 3.5mm jack in the screen so you can use your own headphones if you wish, even if you forgot that tiny 2-mono-to-1-stereo converter that goes for 500¥ in airport shops.

Even nicer touch: both the jack and the USB plug light up when you approach your fingers to let you see exactly where they are.

Every seat has a 230V power socket you can plug anything into, no adapter needed (unlike various airports, most recently for me Tokyo-Narita, where they apparently failed to employ even a single UX specialist or simply consider that an international airport might get, guess what, inter-bloody-national people — and their devices).

The seats themselves are spacious, or feel that way anyway. The backrest has that nifty feature where if you recline it, the actual part you put your buttocks on slides just so in the opposite direction so it still is as comfortable to sit on as your living room’s couch.

Did I mention the mood lighting? There’s a strip of coloured light running all the length of the aircraft, just above the luggage bins. It provides not only a discreet but effective way to see where handles are and highlight headspace, but it also tints up the atmosphere of the entire cabin. At night, it’s a constant cross of blue and violet, but at day it can happen to change… according to whom’s logic? who knows; perhaps it is the very ship’s mood.

Speaking of nights, some of the fleet’s planes are equipped with “Sky Couches”, which is where three seats next to the others have a little extra that folds up to make a single (or double, according to the brochure) bed to sleep or lounge on.

Each cabin (Economy, First, Business) has a “Chief of Cabin Experience” (title might have been altered by my flaky memory) who is the face of all flight attendants serving that cabin and will make sure everything goes well for everyone. Every staff is stylish and impeccably dressed, conduct is extremely professional, and compared to every⋅ single⋅ other⋅ air service I’ve been on, I feel valued even as an Economy customer.

Nobody even blinked when I asked for sparkling wine to go with my actually good-tasting beef, veggies, and cheesecake dinner. In fact, I had to choose further: they had two.

Most annoying thing I noticed? The “flight information” show is a bit dated. Static maps, none of the fine-grained control and zoom we’ve come to expect from touch screens around us.

Single thing I muttered swears at? The block-everything-on-screen announcements. Some are necessary and valuable, of course, but it would be great to e.g. select your prefered language and only have those blocking your screen. Waiting an extra 5 minutes for the Japanese or Chinese (or…) translation to finish is frustrating at best.

For less important announces, a dismissable bubble appears in front of whatever you’re doing at the time: that’s pretty awesome! I’m going to appreciate much more that snacks can now be ordered (and even maybe be tempted) if it doesn’t interrupt my film for fifteen seconds.

Best thing I didn’t use? The “see whatever people around you are watching”. As in movies, music, TV. It’s quite frequent that I look over at people’s screens because the action looks interesting. With this I can easily see what they are looking at without interrupting them. For families, couples, etc, a feature on top of that is the ability to sync your viewing to the others', eliminating the fiddling around to start within a second of each other that’s so common in situations like this. Its range could be improved, though. I often cast a look across the aisle and beyond the immediate new row, which this doesn’t helf for.

+100, will fly with again.

passcod ask@passcod.name
Hold urn:uuid:04201529-0000-4119-a1d5-143026560000 2015-04-29T00:00:00+00:00

(Originally written thinking of, and dedicated to, my friend Alice.)

Hold steadfast, friend


against hordes
against the very wind
    rolling off mountain peaks
against the rain
    the storm
against me and you
against the world
against all

Hold, friend, hold

onto the sunshine
    bright in the valley
onto the morning after
    the evening before
    the night during
onto me and you
onto your wits
onto your life

Hold, friend, hold

me right here
you right there
they over there
and all further away

Hold, friend, hold

your breath
your words
your sleepless nights
your presence
your being
your self

Hold, friend, hold

don’t forget
    the things you find important
    the people
to smile
to cry
to live

Hold steadfast
    in this world

passcod ask@passcod.name
Sorry urn:uuid:02201524-0000-4055-a1d5-142473600000 2015-02-24T00:00:00+00:00

I just

It seems hopeless. It seems like the world’s an ugly place. Ever since you told me, ever since I knew, ever since we lived.

wanted to
make you

Do you remember the beach? The sand, the trees, the water, salty in our wounds. It stung, but it cleansed. Do you remember the night? The moon, the stars, the glow, faces smiling through it all. We were never tired, getting to sleep thinking we’d wake early and continue, instead missing breakfast by hours. It didn’t bother us.

smile over
pieces of
my soul

I want to go to the moon and back. Visit all the moons in this system; go beyond; go far. Pick and place a single pinch of moon-dust from each in little glass boxes, meet up anew one day, you’ll barely grasp a faded memory of me, and gift you the whole set just so that, maybe, with a bit of luck, you’ll remember this from

my soul
that I

a long time ago.

passcod ask@passcod.name
Right over there urn:uuid:01201526-0000-4026-a1d5-142223040000 2015-01-26T00:00:00+00:00

I am in the great unknown.

Slowly flying away
from nowhere to be seen
to where the wind will carry me.

I think.

There is a bird beside me. It
sings softly, as softly as a bird
can, a melody I’ll forget soon.

I am in the great unknown.

You’ll get there too,
one day,
whoever you are.

passcod ask@passcod.name
300 Shorts urn:uuid:01201525-0000-4025-a1d5-142214400000 2015-01-25T00:00:00+00:00

I aim to write 300 shorts.

I am not setting myself a timeline nor a deadline. It could take years, and most probably will take more than one. I simply wish to write 300 shorts, not to write 300 shorts in a set time.

The definition of a short for this excercise is pretty loose. I’ll include poems, prose, fiction, non-fiction. No multi-part pieces, although breaks between sections are allowed. I’m going to set a soft upper limit at 2500 words, although I’m pretty sure I’ll never actually reach that high in this collection.

Each short will be set with this preface as a ‘parent post’, so you should find a list in the footer, down below, just after the line asking for “Praise, thoughts, criticism?”.

Wish me luck~

passcod ask@passcod.name
Enby Stats urn:uuid:12201423-0000-4357-a1d5-141929280000 2014-12-23T00:00:00+00:00

So the other day after tweeting a few #NBRightsNow words mostly because Alice started retweeting good ones, I went ahead and researched statistics regarding non-binary people. Unsurprisingly, the information is pretty scarce. I searched far and wide and found only two sources that had actual numbers and analysis instead of hand-waving:

UK Census 2011

Don’t get your hopes up. This census didn’t include a “non-binary” gender box. In fact, the UK census office has been pretty clear in that they will not make that a reality any time soon. Fuckers. (However, that census might get scraped altogether, so it may be that there will never ever be a NB-friendly census in the UK.)

However, they did record how many people either filled in both F and M boxes, or filled none, or wrote something else in the space instead. While I find that quite flimsy as a measure of non-binarism, it’s better than nothing.

Practical Androgyny makes an in-depth analysis of the question, and finds a 0.5% figure of non-binaries. That figure is, of course, to take as highly under-reported.

New Zealand

A more reliable statistic comes from a study by the University of Auckland. It shows a much higher figure: 2.5% of “not sure” and 1% of “transgender” in a representative sample.

Identification is tricky. Will a trans identify as NB? Are all NB trans? Does trans mean “not cis” or does it mean “someone previously identified as one gender and who now identifies as another”? Are those two different? How many of those who are “not sure” are actually cis, how many are NB? How many respondents answered incorrectly for a laugh?

(Actually, ignore that last one as a good study usually has checks in place to prevent these things from skewing the results.)


So let’s say that the proportion of non-binaries is between 0.5% and 3.5%. Say 2%. I then searched for some statistic that would give it more punch. Raw numbers aren’t very useful. Humans have difficulty visualising very small or large numbers. Comparisons are better understood on a fundamental level, and may pack more emotional power, if chosen carefully.

I had some trouble with that. You see, I kept trying to go for the mundane (you are, of course, more likely to by an enby than to win the lottery, but also more likely than to die in a car accident), or for the bizarre (you’re less likely than to not be anyone’s best friend, but more likely than to be a twin, triplet, or quadruplet).

A better comparison is that being NB is as or more likely than to be gay.

Now tell me again how non-binary people are statistical errors.

passcod ask@passcod.name
Upside Down Text urn:uuid:11201419-0000-4323-a1d5-141635520000 2014-11-19T00:00:00+00:00

This is going to seem awfully rambly, I’ll try to keep it short.

I have identified that reading text upside down is more difficult. The scale goes like this: baseline is reading normally, then there’s reading letters and words that are upside down, then letters and words that are mirrored, and finally, although I haven’t tested it recently, letters and words that are both mirrored and upside down. This is obviously a scale that goes from easiest to harder. Not hardest, as I’m sure there’s more complex variants (applying a random tranformation out of those four to every single letter and then again to every single word comes to mind as a simple but really-hard-to-read variant).

Say you are wearing a t-shirt with some text on it. To an outside observer, the text is upright, difficulty level 0. Now look down at your own t-shirt: is the text upright or upside down? I.e. is reading it level 0 or 1? Now take the bottom hem of your t-shirt and raise it, up towards your face, so that the fabric is now roughly at the same level as your face, and try again. Note the results.

For me, in the first instance, the text looked upright, level 0; in the second instance, the text looked upside down, level 1.

However, if I look at this from outside my own experience, and think of my eyes as cameras, the text was upside down all the time. NEVERMIND I FIGURED IT OUT I AM STUPID.

passcod ask@passcod.name
Sidebar urn:uuid:11201418-0000-4322-a1d5-141626880000 2014-11-18T00:00:00+00:00

(The title is from the trucker radio in City of Angles. SIDEB for sidebar, where you can have semi-private or off-topic conversations.)

Two days ago today, I had a dream.

It was mundane, simple, just a casual dream except for this one quality. I was driving along, going just a bit above the tolerance. Reckless, I know. I remember thinking that in the dream. I remember seeing a cop car in the back mirror, feeling scared. I remember seeing red in my forward vision while still watching the cop car in the mirror, switching focus, it’s a red light, slowing down, left lane, cop car in the right lane, next to me, not even done slowing done when it turns back to green and we go our separate ways. Cops turn right, I move on straight ahead. I remember feeling relief.

I don’t remember where I was going, what the road was, where I had come from, what time it was. It was day, sure, and there were probably clouds in the sky, because I don’t remember any shadows, either. Also, at the next intersection, I looked out the window, saw a blur, and woke up. It was a dream. It was a vivid dream.

Today as I was thinking of this prose I was driving. I was coming up to an intersection, going right, and there was a cop car in front of me, going left. And I remembered that scene, and I remembered being a bit scared, and I thought it was funny that everything was reversed. And I didn’t realise it had been a dream, that that scene I’d remembered, those feelings that had been conjured… they were from a dream. It didn’t happen. This realisation was what made me think of and write this.

It’s not the first time this has happened. In fact, it’s a pretty frequent occurrence in my life. See, I’ve always dreamed differently. Up until a few years ago, in 2009 to be precise, I didn’t know it. I thought everyone had dreams like I had. Lucid dreams where I knew I was dreaming. Controllable dreams where I could control any or even all aspect of the dream. Vivid dreams which could be so realist as to be indistinguishable from reality. Or any combination of the above.

That dream I told, above, is pretty innocuous. It’s a common scene. Nothing wrong with remembering it, even if I don’t realise immediately, or at all, that it didn’t happen. That I caught it at all is pretty rare, actually. Dreamed memories that banal usually just come and go undetected, until I remember having remembered them sometime later when I’m feeling introspective and realise then.

But there’s more scary. More bothersome.

Before 2009, I didn’t know about the term ‘lucid dream’. I didn’t know only a small percentage of the population had them, and an even smaller portion had them regularly or often enough that they could play with them. To me, it was normal. I’ve been dreaming ‘normally’, or lucid, or vivid, or in control, or any two, or all three, I’ve been dreaming like that since forever. My earliest memory of a dream was at the age of four, and I estimate it to have scored about 4 on the lucid scale, and 8 on the vivid one. No idea about the control.

Since 2009, I have experimented with my dreaming, and introspected about its influence on my life. I didn’t immediately realise the problem with my vivid dreams. In 2011, first year of university, one of the reasons I failed it, a reason I never voiced before, is that I spent the entire year dreaming. I was away from home, away from obligations, and classes seemed easy enough at the start, so I started sleeping in. I fucked my sleep cycle so bad during that year that it never recovered. I stayed awake for huge lengths of time, trying to find out the limits. There’s a saying that you die if you stay awake for more than 100 hours. On at least two occasions, I stayed awake for between 120 and 170 hours, I kinda lost track at those points. I’m still alive.

About every four weeks, I had lucid dreams. Sometimes just one, but often every night for a week. And then I dreamed non-lucid for three, or stayed awake, or something. I had really weird abstract dreams, I had dreams that spanned minutes, hours, days, weeks, years, decades. The longest in-dream time I ever experienced, without it being just a time-skip, was four hundred years. The shortest time was five seconds, going in slow-mo towards a car crash, but also really fast, and dreaming the perception of everybody on and around the scene. It’s one of the things my brain does sometimes: on good days, when I’m really tired, just before going to sleep, I can occasionally play every single instrument in a symphonic orchestra at the same time. It’s beautiful, and I control it, or at least I have that illusion of control, I’ve never been able to determine which was which.

When I was, I think, from what I pieced together from memories and discussions and fragments, about 7, in the summer holidays, probably july or august, I had a particular experience. I was on holiday on an island, nothing fancy, just a small island in the south or west from france, with a few apartment rises and a quay with those big metal things boats put their ropes on. I befriended a girl and we’d run around on the quays and at one point we fished from the quay, without a rod or anything, just a fishing line and some bait. Worms. I remember looking at the girl putting a worm on a hook and throwing it in, feeling a bit disgusted and fascinated at the same time. I remember having dinner with the girl and her parents. I remember trivial things like the storey of their apartment and washing my hands before eating. I don’t remember the girl’s name. Something starting with an M, and an A, and an O, maybe Margo but that’s just a name from my brain right now, it’s not from the memory of that experience. I remember staying on the island and playing with that girl for a week or so.

When I was 7, I was quite shy and my head was often in the clouds. To those who knew me then, that is probably a significant understatement. I thought my parents knew I’d gone on holiday, I mean, it was logical, I was 7, they had to have been there with me or sent me there with someone or something. Maybe we’d sailed there? Maybe the girl’s parents were friends with my parents? But it didn’t matter to my 7 year old mind. I just assumed they knew, and because I assumed they’d been there, or that we’d at least driven back home together, I didn’t even think of asking or saying anything about it. The next week I was probably back to going at a friend’s house for a sleepover and playing and spouting enough obviously-straight-out-of-my-imagination babble that anything about fishing with a girl on an island was lost in the mingle.

I asked several years later. Almost a decade. It was one of these, “Do you remember…” but mom didn’t remember. I gave more and more details but no. Mom didn’t remember anything like that happening. She told me of places I did go, when I was 6 or 7 or 8, places I went to, places we went to, people they were friends with that had children I met… none of it matched. So I was very confused, but I chalked it up to random weirdness and didn’t think more of it for another few years. It was before 2009, before I learned about the term ‘lucid dream’.

In 2012 that memory of those holidays, and the confused exchange later on, resurfaced and I understood. I understood that I sometimes had vivid dreams that were so vivid they were, to my brain, real. When I remembered them later on, if I didn’t also remember the memories came from a dream, I would assume they were real. In the fourteen years since I had that experience, I had remembered it countless times, without realising it was a dream. That the girl, the holiday, the place, the quay, the fishing, the emotions I felt, all of these things affected me… they had an impact on part of my life… and they never existed.

Ever since that first realisation, I have been on alert, looking hard at memories that pop up and trying to make sure that I know where they come from. Dream or reality. Real or not. Happened or didn’t. I have also been looking through my pre-2012 memories and doing the same thing. I catch a few. Whenever I know for sure that one memory is from a dream, I tag it so. I bring up the memory and make sure the world FAKE is watermarked everywhere on it. Because then when it pops up in my consciousness stream, so does the tag, and I know not to trust it.

It doesn’t mean I disown memories, try to forget them. Dreams are nice. But the damage of thinking that something happened when it didn’t, ever, is too potentially great. I’ve been lucky so far, and I’m on the lookout now, but countless fake memories slip through the cracks. One last vivid dream for this prose: I once dreamed of doing various everyday things, including reading a series of tweets by saf. And because I didn’t catch that, because it was such a small part in the whole, I didn’t remark anything unusual going on when I remembered them later on and integrated the information they provided to my model, my profile, my persona of saf. Several months later, she said something that contradicted that piece of information in a fundamental way. And I was shocked, and I introspected, and I found that dream and realised what happened. But imagine if it wasn’t reading tweets.

Imagine dreaming that you got some clue that indicated your significant other was cheating on you. And you went ahead and didn’t realise it and integrated it and one day you’re snappish and irritated at something or other and you feel vindictive and you say things you can’t take back and you accuse and your love life comes apart in five minutes because of something that never actually happened. Imagine finding out afterwards. (That scenario can’t actually happen to me because of other reasons I’m not going to explain right now, but that was just a simple-to-understand example of the magnitude of how things can go wrong because of this.)

So I try to be careful. And most of the time it seems to be fine. Some things go through the cracks, I’ve never and probably will never be able to find out just what, just how much, but I live on.

My name is Félix Saparelli, and I’m a vivid dreamer.

passcod ask@passcod.name
A Modern Retelling Of A Tale About A Great Painter urn:uuid:10201420-0000-4293-a1d5-141376320000 2014-10-20T00:00:00+00:00 passcod ask@passcod.name Coming Out urn:uuid:10201411-0000-4284-a1d5-141298560000 2014-10-11T00:00:00+00:00

This is not a coming out.

When I try to determine how I feel about my gender in words, I go to the Genderqueer wikipedia page. The article itself has a list of five ways someone who is genderqueer may identify; it also has a nice aside listing every genderkind known to wikipedia, and it references this list of Facebook genders. Generally speaking, I do not identify with any of these, including the genderqueer, genderfluid, nonconforming, questioning, variant, neither, male, female, or pangender kinds. The only label that possibly applies is “other” but that’s not helpful at all.

I have no gender-related dysphoria. I am physically male and totally comfortable that way. Mostly, I do not care about gender. My gender, I mean. When I prod the ‘gender’ field in my brain’s information table, I get a E_NULL_POINTER error. If you want to use gendered or non-gendered pronouns of any kind or shape to refer to me, please go right ahead. Similarly with gendered grammars. The only pronoun I may take offense at, in English (and other languages if equivalent but I don’t know them) is “it”, unless it’s part of a metaphor or something. There’s just one rule, and it’s not even gender-related: make it consistent.

Otherwise it may be confusing.

Now stop reading my silly blog and go support people who actually need it!

passcod ask@passcod.name
How to avoid ISO 2022 locking escape drudgery urn:uuid:09201421-0000-4264-a1d5-141125760000 2014-09-21T00:00:00+00:00

Ever encountered this?


  1. Install mosh
  2. Run $ ssh-copy-id localhost
  3. Prepend your terminal’s starting command with mosh localhost
  4. Profit!


If running tmux, you’re out of luck, though. You can modify the inner tmux starting command, but I’m not quite sure how mosh handles multiple connections. Also, if you prefer Tmux<1.8 behaviour when creating new panes/windows (keep the same current directory) like I do, that will kill it.

passcod ask@passcod.name
How does the Internet work? urn:uuid:09201412-0000-4255-a1d5-141048000000 2014-09-12T00:00:00+00:00

This question is really hard to answer. The hardest thing about it is that it’s really hard to see where to begin. Should I go from the bottom or from the top? How deep should I go? As deep as the TCP/IP protocol? As deep as Ethernet and ATM and other “wire” protocol? Deeper than that into the actual voltages and light signals and electrons and photons and whatnot? Should I explain how JavaScript works? How about Canvas? WebGL? How GPUs work, or, for this matter, how CPUs work? Where do I draw the line between “How the Internet works” and “How computers work” and “How the Universe works”? Where do I start?!

I’ve asked myself this question too many times. Today, let’s just pick one place, one time, one situation, and start there. Let’s pick a situation that everybody does every day, and go from there. What follows is a dialogue and a monologue. Things in “quotes” are things I imagine you say. Everything else is me answering. Note that I don’t know a lot of how the Internet works. And sometimes I’ll say so, in the text. So if you’re an Internet Expert™, grep for these ‘I don’t know’ phrases and help me out!

“Okay, so, I have this website from my voting papers and I’m putting it in my browser and pressing enter, and pretty soon I’ve got that page. What just happened? How does this work?”

In order, roughly, what happened is this:

  1. You entered this address, http://www.elections.govt.nz, into your browser.
  2. Your browser parsed this address, and figured out you were asking for the website at the server www.elections.govt.nz over the http protocol.
  3. Your browser went and used the http protocol to ask the www.elections.govt.nz server about that page you wanted.
  4. The server replied with the information you wanted.
  5. The browser displayed that information.

“Wait wait waaait. What does ‘parsed’ mean?”

Well, it means… you know what, let’s just google it:

Parsing or syntactic analysis is the process of analysing a string of symbols, either in natural language or in computer languages, according to the rules of a formal grammar. The term parsing comes from Latin pars, meaning part. (Wikipedia)

Well, that was helpful. Before you ask me what a ‘string’ or a ‘formal grammar’ are, let’s just say that ‘parsing’ is about taking a piece of data, a piece of text, figuring out if it fits a certain pattern, and if it does, cutting it up in its components. So in english, for example, the sentence ‘How are you?’ fits the pattern of, well, an english sentence, while ‘Bruf aouf whsbt.!..42’ doesn’t. What’s more, ‘How are you?’ can be cut up into the words ‘How’, ‘are’, ‘you’, and the punctuation ‘?’. Further, ‘are’ is the verb ‘to be’ at the second person singular or plural, and so on, so it can be seen that the sentence further fits the pattern of a simple question of the form ‘adverb verb subject?’.

The browser does the same thing. From the text http://www.elections.govt.nz, it wants a pattern known as a URL. So it checks it out, figures that yes, this piece of text is indeed a URL, and cuts it up in its components: http is the protocol, www.elections.govt.nz is the address of the server.

“Right. What’s a protocol?”

A protocol is… let’s ask google again:

In telecommunications, a communications protocol is a system of digital rules for data exchange within or between computers. Communicating systems use well-defined formats for exchanging messages. (Wikipedia)

Much better than the previous one! In somewhat plainer english, a protocol is a set of rules that computer programs use to speak to each other. Much like someone from New Zealand and someone from, say, Brasil will not speak the same language, if two programs don’t understand the same protocols, they won’t be able to understand each other. Unlike most spoken languages, though, protocols are very rigidly defined. Someone from England may have some difficulties understanding someone from Australia, but they’ll manage. But a program that understands protocol A will absolutely not understand a program that speaks protocol B, no matter if the only thing that changes between the two is a single word. Computers are fussy like that.

In this case, the protocol that browser is going to use is called ‘HTTP’. That stands for ‘HyperText Transfer Protocol’. ‘Hypertext’ is a fancy word to refer to webpages, and the rest is self-explanatory. ‘HTTP’ is a set of rules that computer programs use to transfer webpages between themselves.

“What are those rules?”

HTTP is actually quite simple. When your browser wants a page, it requests it from the server, which responds to that request with, well, a response. Both the request and response are composed of three parts: the first line has basic information about what you want or what the server is saying, the lines below that contain metadata about the request or response, and then, separated from the metadata by a blank line, is the actual content.

When your browser asks www.elections.govt.nz for a page, here’s what it sends to the server:

GET / HTTP/1.1
Host: www.elections.org.nz
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

The first line, GET / HTTP/1.1, is the ‘basic information’ line. It says ‘GET me the page /’ (/ is the default page), and it says ‘oh by the way I’m going to speak to you in the version 1.1 of the HTTP protocol’. There’s several versions, the ones most important right now are 1.1, which is the current, most common one, and version 2.0, which is the next generation one. I don’t know much about HTTP/2, so we’ll just ignore that for now.

Then comes the headers, the metadata of the request, in Name: value pairs. The Host header says ‘I’m requesting this using the www.elections.org.nz address’; this is important because the server might not know about that, but we’ll see more details later. The User-Agent says ‘The browser speaking to you is Firefox, version 35.0, using the Gecko engine, made by Mozilla, running on Linux, on a 64-bit computer.’ although most servers don’t really care about all that. The Accept says ‘here are the list of formats I understand’, which the server can use to make sure it responds with the proper thing. The Accept-Language says ‘My human has indicated peh would prefer things written in English’. The Accept-Encoding says ‘If you want, you can compress the response so it goes faster over the wire, and I’ll understand it just fine as long as you use either the gzip or deflate programs to do the compressing’. The Connection specifies that the server should keep the line open so the browser doesn’t have to go through all the trouble it did the first time around if it wants something else from the server. The Pragma and Cache-Control pairs are about caching, which I’ll tell you about later if you ask nicely.

As you can see, there’s a whole lot of information being expressed there. There is no ‘body’, no contents below that, but that’s okay, because with all this information, the server can surely comply and give us an answer.

And it does:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 12 Sep 2014 10:35:16 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=10
Vary: Accept-Encoding
Etag: "1410517815-1"
Content-Language: en
X-UA-Compatible: IE=edge,chrome=1
Link: <http://www.elections.org.nz/>; rel="canonical",<http://www.elections.org.nz/>; rel="shortlink"
Last-Modified: Fri, 12 Sep 2014 10:30:15 +0000
Vary: Accept-Encoding
X-Frame-Options: sameorigin
X-Varnish: 1757163577 1757156649
Age: 299
Via: 1.1 varnish
X-Hits: 33
Cache-Control: no-cache, must-revalidate, max-age=3600
X-Frame-Options: sameorigin

< !DOCTYPE html>

Again, the first line is ‘basic information’. The server is telling us ‘HTTP version 1.1 is fine’ and ‘Your request was OK, so here’s the response’. The 200 here is because instead of saying OK, the server really says 200. That’s what it understands. But it’s also being nice to humans who might read this, and it includes the meaning of that 200 next to it: OK.

Then the metadata. Server says ‘The name of the program I use to talk to you is nginx.’ Date is just that, the current date. Content-Type is what the format of the contents is; if you look back to the request, you’ll notice it was in the Accept list we gave the server, so all is well. Transfer-Encoding says ‘I’m going to give this to you in small bits.’ Connection is an acknowledgement of what we asked, and a confirmation that it’s going to hold the line. Keep-Alive is related to that: if we don’t say anything for 10 seconds, the server will hang up. Vary is for proxies, which I’ll explain later if you ask. Etag is a small piece of text which identifies the version of the content; if your browser asks if the page has changed, it sends that Etag along, and the server can know precisely which version your browser has, and if it has, indeed, changed (if it hasn’t, it just says so instead of sending a copy of the content, which is much faster). Content-Language says ‘this content is written in English’. Anything that starts with X- is a special header, and might not mean the same thing to everybody, or might just be for extra information that only some browsers or people use. X-UA-Compatible is used only by the Internet Explorer browser. Link says ‘This link, http://www.elections.org.nz, is both the canonical link (the one that points to the source of the content) and the short link (the one that should be used if you want to save space).’ Last-Modified is like ETag, but using a date. The server repeats the Vary header, which is probably a bug. X-Frame-Options says ‘This page can only be put in a frame if the parent page is on the same address as I am.’ X-Varnish is related in some way to the program Varnish. Age is the age of the contents in seconds, in this case the content is just under 5 minutes old. Via says ‘This response came to you via Varnish’; Varnish is a special program that big websites use to be faster. X-Hits… I’m not sure; it could be that this is the number of times your browser has asked that server for something today, or something else… I don’t know. Cache-Control is related to caching, see above. And they’ve repeated the X-Frame-Options header, too; must really be a bug.

And then below that there’s a blank line, and below that blank line is the contents of the response, which start with !DOCTYPE html and <html> and I’ve omitted the rest because there’s, like, ten pages of the stuff.

So that’s how HTTP works. You ask the server a question, and give it plenty of information, some of it it won’t need, and it replies with plenty of information, some of it you won’t need, plus the actual contents of what you asked for. So far so good.

“So, that explains a lot, but now I have something like fifty questions.”

Ooh boy. Okay, to make things simpler, could you just tell me which questions you have and I’ll see what I have to answer?

“Yeah, sure. So…

  • Why might the server not know about the address we’ve used to ask it a question, i.e. why is that Host header there?
  • What’s the Gecko engine? What’s an engine? How is it different from a browser?
  • What’s the format of the Accept header? What are those q=0.something things? What’s the difference between text/html and, say application/xml?
  • What’s the format of the Accept-Language header? Why is it both en-US and en? Where do I change that?
  • What are gzip and deflate and why were those two picked instead of, say, WinRAR? WinRAR does compression, too, doesn’t it? My friend said it was better than Zip.
  • Can you tell me more about the caching business? Pretty please?
  • Why is the response giving us the current date? We’ve got a computer, we know what today is…
  • What if Content-Type isn’t in the Accept list we sent through?
  • That Tranfer-Encoding: chunked thing is weird. Why would the server give us the response in small bits? Can’t it just give it whole?
  • The Internet doesn’t run on phones anymore, there’s nothing to ‘hang up’ and ‘holding the line’ isn’t literal anymore, so what are you actually talking about there?
  • So can you explain that Vary business and proxies?
  • X-UA-Compatible might only be for Internet Explorer, but what does it mean?
  • What’s a frame?
  • How does Varnish make big website faster?
  • Earlier you said that when the browser got the response back, it displayed it to me. All that I see in the response is text, and not even all of it, as you have omitted a bunch of it. Where does the browser get the nice layout and pretty pictures from just a lot of text?
  • In the Content-Type of the response, there’s something that says charset=utf-8. UTF-8… I feel like I’ve heard that before? What is it?”

Firstly, that’s not even fifty questions. More like half that.

“You’re a pedant.”

Sometimes. As for answers…

passcod ask@passcod.name
Passbot: A Gitter Logging Bot urn:uuid:08201429-0000-4241-a1d5-140927040000 2014-08-29T00:00:00+00:00

Disappointed by Gitter’s lack of downloadable, deep-searchable, archive of logs, I put my trusty ZNC bouncer up to the task of maintaining a permanent connection to Gitter’s IRC bridge. The bouncer can then be told to join any public channel, and will log everything to disk. Further (and shared) archival can easily be set up that would store any chat’s logs in S3 buckets, Dropbox accounts, Google Drive, remote FTP or SSH hosts, etc.

If you want your public Gitter chatroom to be logged using this “bot”, send me an email at passbot@passcod.name.

passcod ask@passcod.name
Alya urn:uuid:08201407-0000-4219-a1d5-140736960000 2014-08-07T00:00:00+00:00

Over and over

Forever and once

Void and nothingness


Alya told me to repeat this every time I was scared. Before I went to sleep. Before I started my day. Before I fell away into the night. The words don’t mean much, and it’s not the order or the rhythm that’s soothing. The mantra is just something to concentrate on, to repeat, into nothingness and void, once and forever, over and over, until all that remains in the world is me and you. That’s the first part, the first line of the mantra that Alya taught me: “You and me”. But I removed it when she went. It’s too hard getting my heart broken twice, when she went and when I didn’t, so getting my heart broken every time I get scared is impossible. Zero one two three.

passcod ask@passcod.name
Bruteforcing the Devil urn:uuid:06201405-0000-4156-a1d5-140192640000 2014-06-05T00:00:00+00:00

Preface, of a sort, by mako himself:

Once, there was a circle of artists and wizards. The convocation called itself #Merveilles.

For a long time, most of the members of the cadre could be distinguished only by their names. The most connected among them took on varied faces of animals, but they were only a few.

One day, a faun arrived at the convocation. Lamenting that so many of its members looked exactly the same, it decided to use its wild generative majykks to weave a spell that would illuminate all members of the circle equally.

By the name of the subject, the majic would produce a number.

By that number, it would resolve a face.

And so it did.

The faun’s enchantment brought joy to the circle, and for a time, it was good.

Many moons later, the faun, reviewing its work, realized that the m4g1kz it had cast had an imperfection. It was struck with a vision of the eventual coming of a strange being.

By the name of that devil, the mædʒIkz would produce 6 6 6

From 666, it would resolve no face at all

Hearing the prognostication, a few set out in search of the name of the devil who hath no face, so that they may take it for their own. This is where our story begins…

On the 3rd of June — it was Tuesday — mako gave me an interesting challenge. He’d been trying for a while now to get me into a particular community, but this is what actually brought me over:

[ mako ]: If you ever decide to introduce yourself to #merveilles, find a name that hashes to 666 according to the following

String.prototype.hashCode = function(){
        var hash = 0, i, char;
        if (this.length == 0) return hash;
        for (var i = 0, l = this.length; i < l; i++) {
                char  = this.charCodeAt(i);
                hash  = ((hash<<5)-hash)+char;
                hash |= 0; // Convert to 32bit integer
        return hash;

[ mako ]: It’ll resolve to a BLANK ICON. Nobody else will have one. It will be eerie and awesome.

Huh. Well, okay.

I queried for the exact parameters:

  • It has to be between 1 and 30 characters.
  • It has to be ascii. Actually, the exact alphabet is qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-\[]{}\|`.
  • It has to hash down to exactly 666.

After briefly considering a reverse-engineering approach, I created a quick prototype in NodeJS to bruteforce the hash using sequential strings. I set it to run, but noticed pretty quickly (i.e. my desktop environment crashed) that it was using too much memory:

[ passcod ]: I’ve brute-forced the hash up to 4chars and ~50% of 5chars, and node ate up nearly 2Gb of swap in under a minute. Now I’m considering rewording it in rust to have memory guarantees ;)

After looking around the web (turns out that googling “NodeJS uses too much memory” returns a lot of garbage), I found a partial solution:

[ passcod ]: I’m forcing gc in node every 1000 tries, and it’s slowed down the memory uptake, but it’s still rising and about 1% (of 4G) every 20s :(

Clearly that wasn’t the right way. Still, I persevered, switching my method to use “the bogo approach”: generating random strings of random length. The memory usage was still insane, but I hoped to have enough data in a short while to do some analysing:

[ passcod ]: Right, after 2 million hashes taken from random strings of random(1..20) length, the only ones that have three characters [sic, I meant digits] are single chars. These obviously don’t go as high as 666.
[ passcod ]: I conclude it’s either rare or impossible
[ mako ]: I wont feel comfortable until we can conclude it’s impossible. As far as we know, the devil is still out there, hiding.

At this point, mako decided to write one in C++. Meanwhile, I wondered about outside-the-square solutions: maybe this supported UTF-8! Nope:

[ mako ]: No unicode allowed.

Oh well. Dinner awaited.

That evening, I got back to mako finding C++ less than unyielding:

[ mako ]: I almost just caused an access violation.
[ mako ]: Already blowing my fingers off.
[ mako ]: Arg, exposing raw pointers. I’m so out of practice.

Out of curiosity and a stray “There must be a better way” thought, I started implementing it in Rust. Ninety minutes later, I had this:

mod random {
  use std::string::String;
  use std::rand;
  use std::rand::Rng;

  fn chr() -> Option<&u8> {
    let alphabet = bytes!("qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_-[]{}^|\\`");

  pub fn string(len: uint) -> String {
    let mut result = String::with_capacity(len);
    for _ in range(0, len) {
      result.push_char(match chr() {
        Some(c) => *c,
        None => 48 as u8
      } as char);

fn hash_code(input: &String) -> i32 {
  let mut hash: i32 = 0;
  if input.len() == 0 {
  } else {
    for c in input.as_slice().chars() {
      hash = ((hash << 5) - hash) + (c as i32);
      hash |= 0;

fn main() {
  let strg = random::string(4);
  let hash = hash_code(&strg);
  println!("{}: {}", strg, hash)

[ passcod ]: Mostly written because when you gave your C++, I realised I couldn’t read C++

I started by benchmarking it against the Node version, and found that it was 3x faster unoptimised, ~10x optimised, and had constant memory usage. A definite improvement!

[ passcod ]: 200,000 iter/s

I attempted to make it multi-threaded, but benched it to be 2-3x slower (probably my fault, not Rust’s). It didn’t matter, though, as the bogo approach meant I could run two instances of the program with no semantic difference than doing it with threads.

It was getting late, so I used a combination of t and bash scripting to let it run on my Linode VPS during the night and have it tweet me if it found anything.

And then it was sleep tiem.

In the morning, I woke up to two things.

  1. First, I got onto Hangouts and found via mako that “Wally”, a #merveilles member (I think?), had jumped on board and was using a multi-threaded approach on peh’s 8-core machine. Things were getting serious. I enquired about his hashing speed (I admit I was starting to be quite proud of myself at this moment), and mentioned that at the rate I was going, I would have computed about 4 billion hashes up ‘til then.
  2. I checked Twitter about 15 minutes later, and discovered that my agitation was, really, unwarranted:

[ passcod ]: I’ve got it
[ passcod ]: I’ve got TWO
[ mako ]: Dear god.

They didn’t look good, though, ascii barf more than anything: 8XKf2WAkny|CFAZi_vQn and LcBqgVVPOSEkdIB7BZlVO.

[ mako ]: OH. We could even use my godname generator.

Mako’s current occupation is developing a “platform for encouraging writers to explore a new format for fiction and collaborative world-building.” The mentioned godname generator creates a random, pronounceable name with a music that is quite particular, like “sonoellus” or “tsaleusos” or “thoruh” or “seposh”.

It uses weightings for each letter, which is fine for one-off name creation, but too time-consuming for my brute-forcing purposes, so I discarded that part. I measured my implementation to be generating 64k names per second on my machine, which wasn’t too bad. Slower than pure random, but that was expected.

Meanwhile, I decided to go have a look on #merveilles, and used the second name I got as a nick. I got mistaken as a bot! and just as I was about to give some pointers as to why my name was so weird, the connection dropped:

  • LcBqgVVPOSEkdIB7BZlVO has quit (Client Quit)
    < Preston > NOOO the mystery

Wednesday afternoon, “Wally” gave up. That was a bit relaxing, although the competition was interesting.

A sheet of the icons that hash is used to produce

Each one of these icons was produced using an int32 seed. The 666 seed produces a blank icon.

Wednesday evening, I had a good implementation but previous results told me to only expect an answer after five days of computation. I wondered about alternatives:

[ passcod ]: I’m half tempted to buy a few hours of highcpu AWS compute power and get it done nowish instead

After a bit of research, I decided to just go for it. I set myself a $50 spending limit, which gave me about 24 hours of compute on an instance with 32 virtual cores, each about as powerful as one of my Linode’s cores.

I set it to run with 31 merhash programs running in parallel:

31 cores being used fully

And went comatose again.

[ mako ]: That was the best sleep I’ve had in a while.
[ passcod ]: Well, godname 666 is not looking good.
[ mako ]: Nothing ?
[ passcod ]: I got a cumulative 16 billion godnames generated and hashed, and nothing.

Uh oh.

Investigating further, I realised I had made a few mistakes:

  • I had set the random length generator wrong, and generated only 30-char-long godnames.
  • There was a bug in my implementation where the godname algorithm would get stuck in an infinite loop producing nothing.
  • My result collecting technique was sub-par.

After getting back from class, I set upon fixing those, which took about an hour, and I now had about 10 remaining hours of compute time. I also made an improvement to improve the yield:

[ passcod ]: Also I’ve modified it so each instance appends any result it finds to a file and continues running.

I also created two versions of the program: one with godnames, the other with a reduced-alphabet random string generator, in the hopes of still getting readable names. I set both to run on 15 cores each.

And I waited.

After just above 4 billion hashes, I got my first devil name: shoruzorhorheugogeuzudeazaeon. Go on, try to pronounce it. Isn’t it absolutely hilarious?


Even better: another, shorter, sweeter name appeared just six minutes later; heapaepaemnunea.


After this, I got two more: somureamorumnaemeurheuzeuon and vqsjsawoqgygbrziydpkyyinfmfvw.


As I speak, I have computed another 12 billion hashes, or a grand total of about 35 billion, and no more names have appeared. I’m now going to shut it down, close my wallet, and use heapaepaemnunea as my #merveilles nom de plume.

16 billion hashes and just four devil names

It’s been fun! …and I can now assume the face of the Devil.

passcod ask@passcod.name
Notes On Chess urn:uuid:06201402-0000-4153-a1d5-140166720000 2014-06-02T00:00:00+00:00

As I’m participating in two tournaments at this moment, I have various tidbits going through my head.

I have decided to play three different styles: - In Wallyjack’s games, I will play my usual style - In 27th games, playing as black, I will play fast - In 27th games, playing as white, I will play slow

There seems to be a tendency for players to attack the king’s weak side as an early game technique. It’s frustrating (as it’s painfully obvious), but it should be defended against nonetheless.

Ooo, this one’s a strange one: all our pawns intact, rooks and kings mirrored, and nothing else on the board. Play becomes tricky.

r3k1r1/1pp4p/p3p3/2PpP3/3p1PpP/P2P2P1/2P5/R3K1R1 b Qq - 1 15

Something quite annoying in tournaments is when players abandon all their games after having lost just one. It does give some easy victories, but it does so uniformly, which is quite frustrating because one wants the other players to be as swamped by the games as one is, and one hopes that some of these games might actually turn in the ‘losing’ player’s favour. Then the balance of points may tilt, which is always good.

passcod ask@passcod.name
Today urn:uuid:05201404-0000-4124-a1d5-139916160000 2014-05-04T00:00:00+00:00

It’s my birthday today.

Also #StarWarsDay.

And the last day of break.

passcod ask@passcod.name
Contribution Style Guide urn:uuid:03201428-0000-4087-a1d5-139596480000 2014-03-28T00:00:00+00:00

Yes, yes I am.

Adapted from the mtwitter contributing guidelines, here are rules I expect people to adhere to when contributing to (my) projects. Those parens are there because a lot of this is good practice in general. Do note, however, that these are quite opiniated and, well, strict. Some will disagree. People do things differently. Even I have been known to be lax in applying these guidelines.

There’s a lot of material, so I have both a non-informative tl;dr, and a much better quick summary below.

tl;dr: be nice, be patient, learn, and have fun!

Quick summary:

Standard Etiquette


Most git projects nowadays use a variation on the same branching and workflow model. Here’s a great writeup of quite a rigid implementation of the model. Simpler projects often do away with the fluff and focus on the essential.

Main branch

There’s often few (one) main branch: master. The rest are features and fixes. The gh-pages branch is generally separate, and might not be a manual-editing branch (i.e. it could be automatically generated), take care of fixing the real source, not its results.

Topical branches

The rest of the branches are for features and fixes. They should have descriptive names. This is no only to be pretty, but also so a maintainer can pull a contributor’s branch and test it locally without clobbering any work.

Use the present tense and try to keep it short. Some projects use prefixes to differentiate features, fixes, etc. Have a look at existing branches and pull requests to get an idea of what is done. Branch names should be [a-z0-9\-]: lowercase alphanumeric ascii with hyphens.

For example, a feature branch to implement stream pooling could be named implement-stream-pooling or stream-pooling or stream-pools or feature-stream-pooling. A bugfix branch to repair tests failing due to timeouts being too low could be named fix-tests-timeouts or longer-tests-timeouts.

Version tags

Tags are used for versions, and follow the vN.N.N model. Tags should correspond with the code (package.json, .gemspec, manifests, etc) and the published package (npm, rubygems, app stores, etc) for that release. They are often set by maintainers only. They follow semver.


Always rebase your commit history to present a clean face. When asked to fix typos or do small modifications, fold them in by amending the previous commit and forcing a push (this is a reason why you use branches!). Don’t mention the file you have edited in the commit message if it’s only a single file: it’s redundant information. For example, don’t use Update README.md but rather Fix typo in code sample.

Commit messages should be well formed (if you’re reading that blog post, ignore the double spaces after periods; the current consensus on this is to use single spaces). If you have used code from somebody else, or inspired by somebody else, mention them in the commit. Include links if necessary.

Optional: The last paragraph should be a newline-delimited list of pertinent issues, if applicable.

For example:

Capitalized, short (50 chars or less) summary

More detailed explanatory text, if necessary. Wrap it to about 72-80
characters or so. In some contexts, the first line is treated as the
subject of an email and the rest of the text as the body. The blank
line separating the summary from the body is critical (unless you omit
the body entirely); tools like rebase can get confused if you run the
two together.

Write your commit message in the present tense: "Fix bug" and not "Fixed
bug." This convention matches up with commit messages generated by
commands like git merge and git revert.

Further paragraphs come after blank lines.

 - Bullet points are okay, too

 - Typically a hyphen or asterisk is used for the bullet, preceded by a
   single space, with blank lines in between, but conventions vary here

 - Use a hanging indent

Array folding snippet in examplefile.js inspired by foobar's solution
to http://stackoverflow.com/q/123456789/array-folding-in-javascript

Fixes #123
See #45 and #67 for details
Opens the door to work on #89

Pull requests

Standard internet etiquette (spelling, grammar, be courteous). Also:

  • Include a good description of the changes, except if the title is self-evident.

  • If you’re touching on things discussed in other issues, mention them. If you’re committing code that’s not yours, mention that. If there’s any other resources you think are relevant, include them (using a link).

  • If there’s things remaining to be done, like tests or documentation, or even details to discuss, include a checklist. Tick it off as stuff is done. In non-github settings, you may also mention these, but obviously you’ll have to “tick them off” by replying to the list.

Copyright & Release

LICENSE and contributor agreements

Take care of reading the LICENSE file as well as any contributor agreements that may be required. These are legal documents and you will be bound by them!

You should at least recognise a few of the most common ones and read them once or twice fully with a calm head to understand what they are and how they bind you and others. That will make it easier in the future and save time.

Public Domain release

Update 13 Feb 2016: This is not applicable anymore.

Most of my projects are released in the Public Domain (or licensed under CC0 if applicable). To keep the projects free of legal trouble, you should include this statement (inspired by the CC0 waiver) in your first pull request (I do not actually enforce this all the time):


You should respect the style of both code and comments. You’ll have looked at the code, you’ll be able to notice how things are done. Do not try to put your own style over the code, and especially do not “re-style” the existing code, even if you think it’s bad. There might be a reasoning behind things being done this way or that, there might not.

If you have an issue with the style, open an issue or have a talk (over e.g. IRC, email, chat, in person…) with the maintainers and be explicit about what you’re not happy with, or what you think could be improved. Mention that you would be willing to do the fix-up work. That gives them an opportunity to think about it, even maybe submit it for discussion with the community, and that gives you the opportunity to chat and make yourself known as a willing and opiniated (it’s not a bad thing, if held in moderation) contributor.


There might be a linting tool and configuration with the project. Run it. Fix everything before submitting anything. If you can’t fix something because it would break the code or make it overly ugly, leave it as-is and mention it in the pull request. Go further and make sure (if the maintainers forget about it) it is fixed either in your code or in the linting configuration before your commits get merged. Some projects include linting as part of their CI strategy. If that’s the case, your commits could break the CI for what could be a simple silly stylistic mistake.

Style guide

If the project has a style guide, respect it. It might go further than just linting. Maintainers may not always look out for style mistakes, but that doesn’t mean you shouldn’t. It will not only make your code look better and in harmony with the rest of the project, it will also make you known for respecting the guidelines, which avoids making the maintainers work overtime fixing style points.


You should write tests if you can. If you can’t, or aren’t sure, or want immediate feedback, submit the pull request mention that you didn’t write them. If you want assistance, say so. If you don’t have time, say so. If you think you’ll have time in a day or a week, say so.

In other words, if you haven’t written tests, explain why and mention when you’ll add them in, if you’re planning to. In any case, run the existing test suite before submitting anything. This is similar to the style thing: if there’s problems, fix them. If you can’t, say so.

If the project has no tests, do not add some in without asking. As with style, there might be a reason. If the project is using exclusively behaviour tests, don’t add unit tests, and vice versa. If you think there would be a benefit to using a different kind of tests, again, as always, say so. As architects say:

“If in doubt, ask.”


Projects have different ways of communicating. Usually the README will have them listed. If it’s a Github project, open an issue. If it’s a Bitbucket, Sourceforge, Google Code, etc. project, open an issue. If there is any obvious way to open an issue, well, you know what to do. If there’s a mailing list / newsgroup for the project, send a mail. If there’s an email for the maintainers, send a mail. If you’re really desperate about finding an email address, look in the commit metadata (git log): the authors' email should be there.

Look on various networks. There might be a Facebook page for the project. There might be a Twitter account. There might be a channel on Freenode.

Support etiquette

Open source projects are mostly run by volunteers and people giving their free time. Be clear and concise, and be patient. If you’re asking on IRC, stick around, maybe even come back later. Never assume anyone is going to be around at the same time you are. There’s a lot of timezones in the world, and even if you know the maintainer lives in, say, Austria, they might not have a typical daily schedule, or they might be traveling to, say, Canada. Wait at least 48h.

Be courteous.

If someone cannot understand you, they’re likely to pay less attention.

This does not apply if you’re not proficient in the language and trying to be understood. If you don’t think you can get express yourself correctly, e.g. because you don’t know what the technical terms translate to, say so, and include an explanation in your native language — if the maintainer has time and goodwill, she might seek out a translation.

On the other hand, if you’re not being courteous (that’s not synonymous to respect; you can despise someone and still be courteous if you wish), or if you are unwilling to express yourself in a clear manner, your time might be wasted as one may just ignore you completely, or even file you under junkmail.

Similarly, don’t be dismissive of comments, especially if they ask for you to fix things. Your work is not the Holy Graal, it may need refining and modifying, getting angry because a maintainer does not see your work as an untouchable masterpiece is more likely to see your PR closed and your time wasted than it is to make things better.

Codes of Conduct

Many projects, venues, and other places, physical, virtual, or otherwise, are adopting or have adopted Codes of Conduct. Respecting them is an integral part of interacting with the communities they apply to. A lot of what is in such Codes may seem fairly obvious, but do understand they exist for a reason. Besides codifying what kind of interactions is deemed unacceptable by the community, they define processes to allow people a clear way to report problems and request review, attention, and moderation.

passcod ask@passcod.name
The Brewy Trinity urn:uuid:03201427-0000-4086-a1d5-139587840000 2014-03-27T00:00:00+00:00

Prayer of the Lager, as imagined by GGaR fans:

Bar-father, whose pints are heavenly
Jo be Thy name
Thy fiefdom come
Thy beer be drunk
On Earth, as it is in Valhalla
Give us this day our liquid bread
And forgive our tabs
As we forgive those who have
Never bought the house a round
But never forgive he who orders a bud light

passcod ask@passcod.name
Car tracts EULA urn:uuid:03201426-0000-4085-a1d5-139579200000 2014-03-26T00:00:00+00:00 passcod ask@passcod.name Sleep urn:uuid:03201419-0000-4078-a1d5-139518720000 2014-03-19T00:00:00+00:00


Darkness all around and
light but not light; red
orange dark but less dark
than darkness.

Lines of darkness dancing
across. Deformed shapes of
fire running in circles.

Black dark black light all
around; red orange brights.

Everything fades.

Feeling eternally sleepy yet
curious at the lack of heat I
open my eyes to see a cloud
has obscured the sun’s rays
through leaves and branches.

Summer breeze, lack of sun…
I get up.

passcod ask@passcod.name
LZ4 compression for ramdisk urn:uuid:03201415-0000-4074-a1d5-139484160000 2014-03-15T00:00:00+00:00

A little while ago I saw that lz4 became a new optional dependency to mkinitcpio. Today I decided to see why.

My mkinitcpio setup is a bit more complex than the Arch default. Instead of a single /etc/mkinitcpio.conf, I have the following structure:

├── all.conf
├── default.conf
├── fallback.conf
└── nozip.conf
└── linux.preset

I have three ramdisks: default, which is the smallest I can get it, nozip, which is default but with cat (no) compression, and fallback, which contains rescue and backup hooks. Notably, default uses the systemd hook to do away with base, udev, etc.

My configs are hierarchical. I realised that the config files are actually bash, so one can use source /etc/mkinitcpio/<file> to source “parent” entries. This means that all.conf contains everything that’s not variable between configs: core $HOOKS, filesystems loaded explicitely in $MODULES, empty definitions for everything else. Then the rest builds up onto that. It’s pretty neat.

Anyway, enough exposition. Originally I used cat for both default and fallback, but then I realised a compressed image actually booted faster. So after quick informal testing, I went with gzip. I left the fallback image uncompressed because a) I don’t care about speed when booting in fallback mode, and b) it’s easier to open up and stitch back if I need to modify something manually. b) also led me to create a nozip image for default, just in case.

My /boot/ looked like this:

49M  initramfs-linux-fallback.img
13M  initramfs-linux-nozip.img
4.9M initramfs-linux.img

When I initially tried lz4, the size jumped up to 7.0M. No great. I adjusted the options to get maximum compression, believing that would take too much CPU, and so I would have to compromised.

To my surprise, lz4 -9 didn’t compress as well as gzip:

49M  initramfs-linux-fallback.img
13M  initramfs-linux-nozip.img
5.7M initramfs-linux.img

But it seemed faster. And that would be a big win: 800K vs. faster (de)compression? No contest. Instead of testing the total mkinitcpio time for each, I went with directly testing compression and decompression on the nozip image.


$ time gzip initramfs-linux-nozip.img
gzip initramfs-linux-nozip.img  0.78s user 0.01s system 99% cpu 0.793 total

$ time gunzip initramfs-linux-nozip.img.gz
gunzip initramfs-linux-nozip.img.gz  0.12s user 0.01s system 71% cpu 0.182 total


$ time lz4 -9 initramfs-linux-nozip.img
Compressed filename will be : initramfs-linux-nozip.img.lz4
Compressed 13149696 bytes into 5941253 bytes ==> 45.18%
lz4 -9 initramfs-linux-nozip.img  0.53s user 0.01s system 99% cpu 0.541 total

$ time lz4 initramfs-linux-nozip.img.lz4
Decoding file initramfs-linux-nozip.img
Successfully decoded 13149696 bytes
lz4 initramfs-linux-nozip.img.lz4  0.02s user 0.01s system 88% cpu 0.026 total

Ladies, gentlemen, and otherwise-gendered, I present thee lz4. At full compression, slightly faster. And for decompression, an order of magnitude faster. This is impressive.

Hear hear!

Update: Yann Collet has kindly informed me of a «"hidden" option -A, which compresses a tiny bit more than -9… for “compress once, decompress plenty” scenarios», which fits the bill perfectly. Thanks Yann! I’ll definitely use this.

passcod ask@passcod.name
Adapting GNOME Classic urn:uuid:03201409-0000-4068-a1d5-139432320000 2014-03-09T00:00:00+00:00

The Gnome Shell has a nice little extension called “Classic Mode”, available on Arch in the gnome-shell-extensions package in [extra]. It should be installed already. It’s easily accessible by changing the session in GDM.

I like how it’s basically the same as the normal Shell, but with a Mint-like Applications menu and a Places menu, as well as the grey popups instead of the normal black ones. What I don’t like is the ugly bottom panel and the grey of both panels. Fortunately, this is easy to change.

First, let’s have a look at what’s under the hood:

$ pacman -Ql gnome-shell-extensions | ag classic

gnome-shell-extensions /usr/share/applications/gnome-shell-classic.desktop
gnome-shell-extensions /usr/share/glib-2.0/schemas/org.gnome.shell.extensions.classic-overrides.gschema.xml
gnome-shell-extensions /usr/share/gnome-session/sessions/gnome-classic.session
gnome-shell-extensions /usr/share/gnome-shell/extensions/window-list@gnome-shell-extensions.gcampax.github.com/classic.css
gnome-shell-extensions /usr/share/gnome-shell/modes/classic.json
gnome-shell-extensions /usr/share/gnome-shell/theme/classic-process-working.svg
gnome-shell-extensions /usr/share/gnome-shell/theme/classic-toggle-off-intl.svg
gnome-shell-extensions /usr/share/gnome-shell/theme/classic-toggle-off-us.svg
gnome-shell-extensions /usr/share/gnome-shell/theme/classic-toggle-on-intl.svg
gnome-shell-extensions /usr/share/gnome-shell/theme/classic-toggle-on-us.svg
gnome-shell-extensions /usr/share/gnome-shell/theme/gnome-classic.css
gnome-shell-extensions /usr/share/xsessions/gnome-classic.desktop

After a quick inspection, the ones we’re interested in are gnome-classic.css and .../modes/classic.json. The former defines the style changes, some of which I want to change or revert, and the latter defines some layout changes, like the date moving to the right instead of the center, and the bottom bar showing up.

Let’s do the bulk of the work first, in classic.json:

diff --git a/original/classic.json b/usr/share/gnome-shell/modes/classic.json
index 031d42f..5df9a51 100644
--- a/original/classic.json
+++ b/usr/share/gnome-shell/modes/classic.json
@@ -2,9 +2,9 @@
     "parentMode": "user",
     "stylesheetName": "gnome-classic.css",
     "overridesSchema": "org.gnome.shell.extensions.classic-overrides",
     "enabledExtensions": [ "apps-menu@gnome-shell-extensions.gcampax.github.com",
-                           "window-list@gnome-shell-extensions.gcampax.github.com"
     "panel": { "left": ["activities", "appMenu"],
+               "center": ["dateMenu"],
+               "right": ["a11y", "keyboard", "aggregateMenu"]
-               "center": [],
-               "right": ["a11y", "keyboard", "dateMenu", "aggregateMenu"]

The panel object only concerns the top panel. The bottom panel is trickier: it’s actually defined by the window-list extension, which is enabled here but does not appear as such in the Tweak Tool. Quite confusing.

Then, the styles in gnome-classic.css:

diff --git a/original/gnome-classic.css b/usr/share/gnome-shell/theme/gnome-classic.css
index a6f2cd2..601dc5f 100644
--- a/original/gnome-classic.css
+++ b/usr/share/gnome-shell/theme/gnome-classic.css
@@ -6,16 +6,15 @@

 #panel {
-    background-color: #e9e9e9 !important;
+    background-color: #000 !important;
     background-gradient-direction: vertical;
-    background-gradient-end: #d0d0d0;
-    border-top-color: #666; /* we don't support non-uniform border-colors and
+    background-gradient-end: #2d2d2d;
+    border-top-color: #2d2d2d; /* we don't support non-uniform border-colors and
                                use the top border color for any border, so we
                                need to set it even if all we want is a bottom
                                border */
-    border-bottom: 1px solid #666;
+    border-bottom: 1px solid #2d2d2d;
     app-icon-bottom-clip: 0px;
+    color: white !important;

 /* hrm, still no multipoint gradients
     background-image: linear-gradient(left, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0)) !important;*/
@@ -51,7 +50,7 @@

 .panel-button {
-    color: #555 !important;
+    color: #ccc !important;
     -natural-hpadding: 6px !important;
     -minimum-hpadding: 3px !important;
@@ -63,7 +62,7 @@
   .panel-button:hover {
-    color: #000 !important;
+/*    color: #000 !important; */

   #panel:overview .panel-button:hover,
@@ -85,7 +84,7 @@
   .panel-button:focus {
-     background-color: #4a90d9 !important; /* FIXME */
+     background-color: #333 !important; /* FIXME */
      color: #fff !important;
      border: none !important;
      border-image: none !important;
@@ -107,7 +106,7 @@

 .label-shadow {
-    color: rgba(255,255,255,.5) !important;
+    color: rgba(255,255,255,0) !important;
   .panel-button:active .label-shadow,
   .panel-button:focus .label-shadow {
@@ -227,7 +226,7 @@

 .system-menu-action {
     color: #e6e6e6;
-    border: 1px solid #ddd; /* using rgba() is flaky unfortunately */
+    border: 1px solid #666; /* using rgba() is flaky unfortunately */


There’s a bunch of changes there. The #panel ones define the background of the panel. I have it set in a gradient that matches (in reverse) exactly the Numix window theme, to create a seamless look on maximised windows (I use the terminal and firefox each maximised in their own workspace), while not looking too shaby on its own.

Then there’s the .panel-button changes. This is about the actual buttons on the top panel. Make the text lighter to be readable, change the hover styles, easy-peasy. The .label-shadow one is because the shadow below the app name was making it unreadable. The .system-menu-action… I have no idea what this does actually. I might just revert that.

Finally, I had to open up the Tweak Tool to change the Workspace back to Dynamic. Done!

A preview of my current desktop

passcod ask@passcod.name
Github Cleanup urn:uuid:02201419-0000-4050-a1d5-139276800000 2014-02-19T00:00:00+00:00

Today I cleaned up my Github repositories. That means I looked through all the repos I own, updated some of them, and deleted a whole lot. Over forty in fact! Here’s a quick summary:

Names: source, empty, fork. Descriptions: what it was, reason for deletion, legacy.

  • xbotppcontrib: fork of `aki–aki/xbotppcontrib`; source is gone.
  • sharedstateinheritance: barebones example of a bug in a library; invalid.
  • soul: mockup for sagaofsoul.com; end of purpose.
  • Armstrong: js framework; never completed.
  • zenpen: fork of tholman/zenpen; unused.
  • homebrew-cask: fork of phinze/homebrew-cask; left project.
  • lolcommits: fork of mroth/lolcommits; unused.
  • tumblr: fork of mwunsch/tumblr; old fork.
  • jeb: glorified reading list, web version; abandoned; replaced by a rss reader.
  • jeb-firefox: firefox addon for the above; abandoned.
  • khee: generic emotion engine; idea evolved; irmo (memory store), borgy (gAI).
  • hoiho: better irc client; abandoned.
  • effing-placeholder.js: just me showing off; useless.
  • serveropt-webrtc: fork of cjb/serverless-webrtc; unused.
  • gh-life: experiment to turn the github contribution matrix graph into a game of life; failed.
  • fount-definitions: nextgen webfont service; abandoned.
  • fount-central: file repo for the above; abandoned.
  • xbot: irc bot; fork abandoned; azbot, aki–aki’s xbotpp, master5o1’s jsBot.
  • yavanna: Alternate ui for firefox-os; never started; started trend of using Ainur’s names for projects.
  • variance: irc to redis-pubsub library; unused.
  • brackets: fork of adobe/brackets; unused.
  • b2g-manifest: unused fork.
  • cdnjs: past PR.
  • libbrew: something to do with homebrew; forgotten.
  • imaku-latte: experimental desktop environment; abandoned.
  • licentious: past PR.
  • azbot: irc bot; unused.
  • plong.me: p2p file exchange service; never completed.
  • go-irc: fork of a go irc library; unused.
  • js-beautify-python: dependency for xbot; obsolete.
  • Roccoliphic: rocco documentation service; long since offline.
  • xkcd1110: scripts to display the full world of XKCD#1110; old, done better by others.
  • unblogs: experiment in multi-facet blogging; failed; blograph.
  • jruby-sandbox: dependency for long-gone project; unused.
  • pippo: 3rd or 4th (I lose track) attempt at generic dbms; failed; pippo (try again?).
  • homebrew: past PR.
  • javascript-for-cats: unused fork.
  • witness: automated witness for contributor agreement signings and other documents; never started; .
  • rocco: modified dependency for Roccoliphic; unused.
  • sinatra-browserid: modified dependency for some forgotten project; obsolete.
  • wrangler: resource for a MOOC; unused fork.
  • gravatar-zoom: userscript adapted to my remoded platform; old.
  • mit-license: past PR.

About time, I reckon :D

passcod ask@passcod.name
Starting On Pippo urn:uuid:12201308-0000-4342-a1d5-138646080000 2013-12-08T00:00:00+00:00

Today I’m starting on Pippo, a DBMS I’ve spent the past 18 months thinking about. It started as a experimental thought on a NoSQL document store based on git, and has evolved to be both complex and beautifully simple at the same time.

I’m going to start by implementing the two lower level components: the block store and the object layer. The block store contains content-addressed, 16MiB (configurable) maximum, blocks of data. It uses xxHash by default, with a strategy to fall back to other hashes if collisions occur. The object layer contains documents (“objects”) that have unique IDs (not content-addressed), and point to blocks that contain the actual data. Both the metadata (structure) and the data is in the block layer, resulting in very small sizes for the objects themselves.

The object layer is what users and other layers will access most often. The object layer is capable of handling incoming and outgoing streams, allowing one to write to an object without first knowing its length, without needing to cache it all beforehand. The object layer can only access and modify objects if you know its ID, listing all objects is used for debug only.

passcod ask@passcod.name
Kili Pidof urn:uuid:12201308-0000-4342-a1d5-138646080000 2013-12-08T00:00:00+00:00

This character started only as “Professor Pidof”. pidof is a *nix utility I’ve never used, because pgrep does the work better. Nevertheless, I had started with “Pido”, then realised it might be taken as a reference or derivative of “Pedo” which wasn’t my intention (and if it ever is, I’ll be more subtle about it, that one’s not very clever). “Pidof” was a joke, initially, then I forgot it on my whiteboard and it stuck.

“Kili” came later, as a variation on “Kieru” (消), “Kira”, “Kill”, which is a much-used related utility. It helps that this is the name of a man who could kill -9 you and evade all the ALRMs, leaving nothing but his signature magic sigill.

passcod ask@passcod.name
Modern Systems Languages urn:uuid:12201306-0000-4340-a1d5-138628800000 2013-12-06T00:00:00+00:00

A year or so ago, I started getting interested in two new, modern systems programming languages: Rust and Go. After playing around a bit with both, I chose Go to program a few things I had floating around at the time: plong, a pseudo-p2p server which is essentially a WebSocket relay and signaling server; poële, a very simple queue / task processor using Redis; and double-map, a new kind of data-structure which solves the problem of slow hashmap search for specific scenarios.

Enthused by my success with a fast, modern, typed, compiled, systems language, I started having ideas of more ambitious things: imaku-latte was about a novel DE/WM for X11, thesides was about an EC2-like service for micro tasks and scripts.

More recently, aldaron is a tree editor, and pippo is my long-standing attempt at designing an ever-better DBMS.

thesides died for various reasons. The others didn’t, really, they were aborted and/or infinitely delayed because Go is too high level. It doesn’t allow easy low-level memory manipulation, the C interface is annoying both ways, and other nitpicks.

I still like Go, but I think I’m going to try out Rust for these projects where low-level access, where a real C replacement, is needed. We’ll see how that goes.

passcod ask@passcod.name
Maria Bobi Tabula urn:uuid:12201303-0000-4337-a1d5-138602880000 2013-12-03T00:00:00+00:00

I decided on the name a long time before I had even started planning the story. At first it was just “Bobbie Tables”, but I decided that was too obvious a reference. Also, it was a bit too English-sounding for fantasy, so I transformed it into “Bobi Tabula”. Ah, but now that could be masculine, and anyway I don’t really like “Bobi” as a first name. “Bobbie” is fine, “Bob” is way generic, “Bobi” is… a bit weird.

So I picked another name, which is still in keeping with the reference: “Maria”, for MariaDB, the MySQL successor. And there we have it: “Maria Bobi Tabula”, who doesn’t mind her middle name and even uses it sometimes because my own dislike shouldn’t affect the character too much.

passcod ask@passcod.name
People urn:uuid:11201308-3023-4312-a1d5-138395340000 2013-11-08T23:30:00+00:00

This text was originally written in 2011, revised, and published here and on Fictionaut.

Trigger Warnings: references to rape, trafficking, animal and human cruelty, abuse, drugs.

There’s really only two kinds of people in the world: bad people and assholes. It’s not static, either. It can change. You can change. And it’s not all black and white — although with that kind of a world, white is pretty rare, I tell ya — there’s plenty of grey around; shades and shades of the stuff.

Bad people aren’t all the same, mind you: just look around. Bad people bad people bad people. Bad chick, bad guy, bad mum, bad dad, bad boy, bad girl. Bad soldier, bad courier, bad owner, bad buyer. All of ‘em: bad bad bad. There’s different classes of bad, just like there’s classes of fish. Or was that schools of fish? Can’t remember.

Here, for example, see that woman in the corner? The one with the yellow-tee brat grabbing her legs. Yeah, that one. Well, she’d be a real angel, up there in paradise — were you to believe in such things — if it wasn’t for her husband. What? She cheats? Yeah, I know she cheats. That’s not so bad. No, you see, in her past time she watches a puppy suffer. She attaches it to the wall and places its food just out of reach. Makes her feel good. There’s a past behind it all, mind you, it’s not out of pure cruelty. She’s not an asshole. The dog’s her husband’s.

The young man chatting up the receptionist? He’s got cancer. He’s gonna croak in 4 months and he knows it. Twelve year old daughter. Dead wife: car accident in 2004. No, it wasn’t his fault. The guy loves his daughter. — What? Yes, really. No, you sick fuck, not like that. Now shut up. — So, he loves his daughter. Loves her so much he’s spending the rest of his short short life to put enough money in a trust fund for her to go to college. He works so hard at his job you can almost see the life seeping out of him. So, you ask, what’s bad about him? Nothing. He’s just an honest man. Enjoys life. Chatting up receptionists. When he was a teenager a stole a large bowl of chocolate mousse and used it to redecorate the village’s catholic church. Good bit o’ fun, that.

And the twins playing together outside? Boy and girl. Adorable little things. They’re borderline assholes. So young. They’re their own gang: he loves fire, she loves knifes. Sounds like a bad ‘80s BDSM flick, or smut. They go around, destroying Playmobiles and melting Legos, sneaking in their neighbours’ houses and setting up mousetraps out the grown ups' rooms. They play hide and seek with the city kid and let him stay hidden for hours on end, not searching, just waiting for him to run out to go relieve himself; then they shout “Gotcha!” and have him count out to 100 — slowly. Yea, they’re bad; not yet devils, but bad indeed.

There’s all kinds and shapes of assholes, too. There’s temporary assholes and permanent assholes. There’s near-retirement assholes, assholes-in-training, and assholes with a PhD. There’s young assholes, old assholes, middle-aged assholes; bright assholes, dim assholes, darkish assholes. There’s all kinds and shapes of assholes.

The geek “of colour”: comes over to see her mum every fortnight. Good kid. Awesome job in big cities. Travels a lot. Enjoys Martinis and G&T. She’s a romantic. Spends her time online trolling people into submission. Likes softcore porn. Sets cats on fire. Collects stamps.

The fat guy in a suit: typical biz-y asshole. Cheats people out of their money, goes to church on Sunday, and prays to his God for more dumb people to give him green paper. He’s divorced three times, no kids — ‘cept if you count the illegitimate ones. He cut everyone out of his will, and wants to be cremated with his dough.

The wiry metis kid: everyone knows him as the school’s dealer. But he’s got a little sideline selling his services to the stupid: he spent enough time in the principal’s that he knows her password to the school’s system — good marks for the rich fools. He uses that same password to repeatedly set bad grades on the report of girls who’re beat up for it because he gets hard spotting the bruises.

The old madam reading the Chinese horoscope: runs a multi-billion euro trafficking empire specialising in inter-continental transport. Furs; trade secrets; endangered species; firearms; sex; drugs; people; cold weapons… She spoils her grand-kids with candy and lollipops.

People come in two kinds: bad people and assholes.

Which are you?

passcod ask@passcod.name
Soft limits and meaningful content cuts urn:uuid:11201308-0000-4312-a1d5-138386880000 2013-11-08T00:00:00+00:00

On Quora, and many other websites, long answers are cut off with a “(more)” button/link which immediately displays the rest of the answer in-place. The cut-off threshold seems to be a hard limit on words or characters. Sometimes it works:

Answer #1 cut off

Answer #1 expanded, at least another page of content

Sometimes it seems a bit silly to just hide this little content:

Answer #2 cut off

Answer #2 expanded, only ~100px have been added

I think there is a way to make this better:

  • Use height, not length. Especially in this context! Length only has meaning if it is directly correlated to height, as is the case with block of text without breaks. Images make the height grow by a huge factor, as a link only a few dozen characters long can add hundreds of pixels.

  • Use a soft limit. Instead of cutting at a hard, say, 800px, put an error margin on there, say ±100px. Thus, if the content is 850px high, don’t cut it off, but if it is 1000px high, do.

  • Make cuts more meaningful. Given the above rule, consider this: the cut-off is at 800±100px, and the content height is 905px. In this case, the cut-off would be at 800px, leaving a measly 105px below the fold. Avoid situations like this by moving the cut-off to make below-the-fold content more meaningful, e.g. at least 250px. Here, we would have a final cut-off at 655px.

  • “But computing height is difficult server-side, and we don’t want to do it client-side!” No it’s not. You don’t need to render the page to calculate height. Yes, it’s more precise, but you can estimate it fairly easily, especially if you have good control over your styles.

    For text: you know what your font-size is. You have a good amount of content so you can easily compute (once!) the average number of words per line. You can easily count the number of line breaks and line rules. Thus you can quickly estimate the total text height.

    For images: either take the same route and compute (once) the average height of images, or compute it per-image (maybe you host images, and create thumbs + metadata to be able to optimise loading times; in that case you could put the image height straight from your own service).

    Combining both, you can obtain an estimate of the content height of any given article or text, and apply cut-offs then. And of course, the results can be cached!

(Screenshots are from this Quora article, which you should really have a look at, at least just for the beautiful images of the world.)

passcod ask@passcod.name
Whitealdus urn:uuid:10201315-0000-4288-a1d5-138179520000 2013-10-15T00:00:00+00:00

I’ve decided to start a web serial. It’ll probably have to wait until after NaNoWriMo, though. One of the ideas I have for the nano is to write a prequel or intro, we’ll see how that turns out.

passcod ask@passcod.name
Grow urn:uuid:08201311-5415-4223-a1d5-137623644000 2013-08-11T15:54:00+00:00

(to be read with a calligraphy pen or nib in your hand)

A word.
A verb.

Feel it.

Now I’ll tell you how put it on a page:
we’ll start with the o.

Take your pen just so,
thin first,
from the center
and thick on the up, thin at the top
and thick on the down, thin at the low,
finish sharply.

The r is a small-cap,
nothing special,
you’ve done these before.

Same with the w,
but lowercase.

Now the G.
The G is special.
You have to put yourself into it.

Stare at the space
before the letters,
draw it in your mind—
no, not like that,
more majestic—
give it respect;
that G has held you all your life,
even before you were made,
it will hold you and your children,
respect it, make it king,
but not arrogant, as it’s old—
older than the oldest tree,
older than the eldest rock—
and it’s wise,
so wise…

Now you feel it.
Take your pen.
Close your eyes.
Follow my hand.
There you are.
At the start.
Keep ‘em closed.
Breath in.
Breath out.
Breath a half.

And throw forth your arm.

passcod ask@passcod.name
one and two urn:uuid:08201308-5018-4220-a1d5-137598780000 2013-08-08T18:50:00+00:00

once upon a time
two people
far away

one is missed
two is missed

hidden away
in the dark

two sets of
three small words
over and over
to oneself

thinking of
the other
thinking of
the one
thinking of

the heart
the skin
the eyes
the face
the hands
the pain

of one
and two
not being together


in the dark
“I miss you”
“I love you”


one and two
are together again.

passcod ask@passcod.name
The Girl Laughing in the Dictionary urn:uuid:12201231-0000-4366-a1d5-135691200000 2012-12-31T00:00:00+00:00

Trigger Warnings: blood, death, shooting.

Leaves falling. Hitting the ground softly. Steps in the snow. The shallow chaotic prints of the children and the deep purposeful ones of the adults. The grey winter sky with numerous snow flakes gliding down. The blue and red and white flashes of the police cars' lights. The white and yellow of St John’s. The unbearable stillness of my brother’s mitten in my hand. The silence. Silence. The moving white cloudy breaths of the officers talking. The faces of people watching: pale drawn sad tearful tense pitied fearful. The unbearable stillness of my brother’s mitten in my hand. The leaves falling and hitting the ground softly. The steps in the snow. The shallow chaotic prints of the children and the deep purposeful ones of the adults. The deeper straight-in-a-line terrible terrible footprints of the coat. The blood staining the snow all around me. The memories of the shots. The memories of the fear. The memories of my brother’s mitten spasming in my hand. The memories of the silence. The memories of the noise. The memories of the coat turning and leaving and leaving me alive alone among the bodies bleeding torn holed cut pierced shot bleeding of the children on the snow.

An officer in blue and white taking my hand and pushing my fingers open and pulling me softly to my feet and walking me to the ambulance and sitting me up at the back legs dangling for a second and slowing stopping still my entire body still until someone in white covers me and rubs me to make me warm or make me alive and telling me it’s alright but it’s not it’s not it’s not alright because I am alive. …and memories of the blood and of my brother’s mitten in my hand and… ‘Hey, hey! Hey, are you alright?‘

The coat turning.

White grainy squares straight ahead no above me. One two three four five six seven eight nine ten eleven and a round white smooth light on the twelfth. Voices near my feet. ‘…passed out… …shock… …hypothermia… …snow…’ ‘…when?… …come home?…' ‘…wakes up… …observation… …few days… …psychologist…' Hy·po·ther·mi·a: The condition of having an abnormally low body temperature, typically one that is dangerously low. And shock. And trauma. From my brother’s — mitten in my hand — death; he was shot — memories of the noise memories of the cries — next to me — and the coat turning leaving leaving leaving me alive alone alive — and his mitten spasming in my hand — in my hand — spasming in my hand — still so so still — unbearably still in my hand. Hy·po·ther·mi·a. The bright blue dictionary at the top of the shelf and the same at home on the tall desk and me standing up whenever idle and walking to the dictionary bright blue heavy on the shelf on the tall desk and in my hands and my feet carrying us back to my chair my chair that creaks under our weight and the joyful thump of the tome on the desk and turning the pages and reading and nodding giggling smirking crying humming as the words on the left and the words on the right are complex funny lewd sad and are always taking me to new worlds and places in my head far far far away from the stares of the others staring watching looking at the girl laughing in the dictionary.

passcod ask@passcod.name
Aftermath urn:uuid:12201207-0000-4342-a1d5-135483840000 2012-12-07T00:00:00+00:00

Oh sweet, sweet morning light
you remind me I have to sleep sometime.
I have to sleep.
But not at night.
Night reminds me of her
hair brushing my face at night.

It’s been five months and even my friends have given up on me; I am high all day from the coffee I take to keep awake and down all night from the memories I recall to keep her alive in here in my head in my mind; to keep her features from fading, her voice from quieting, her scent from flying away, the feeling of her fingers on my skin, her grumpiness in the morning, her smile turning up my day.

Oh sweet, sweet morning light
you remind me of that dawn again.
When she stopped living.
Just as the sun came up.
Next to me smiling
as she lost
her last battle.

passcod ask@passcod.name
K2 urn:uuid:12201204-0000-4339-a1d5-135457920000 2012-12-04T00:00:00+00:00

Trigger Warnings: rape, suicide, abuse, death.

Now it’s late. I am hanging upside down from a rope coiled around my crushed left ankle, the pain too sharp to be really felt, as the excess blood to my head makes my thoughts fuzzy. I am almost two meters from the rock face, thirty-five hundred meters above sea-level, the titanium piton holding me solidly anchored in the ice about 40 meters higher.

I had been climbing down from my successful ascension of K2. Alpinists die every year, yet we always try to assume it was because of mistakes, or faulty equipment, or sickness. But luck, karma, chance… these aren’t in our thoughts. Or rather, we banish these away. Because we want to be in control, of our fates, of our lives, of the mountain.

But we’re not. Luck is always there. Luck makes us pick a route which nobody has attempted before, and skill makes us go through it easily. Luck makes us find the perfect place to bivouac when retracing our steps because the radio warned of possible avalanches. Luck makes us get to the top just as the weather clears and lets us enjoy the sight of an incredibly clear sky. Luck makes us step on a slippery patch just as a burst of wind gets hold of us. Luck makes the worst thing happen at the worst possible time.

Luck makes us walk to the dairy and be grabbed by a man and be raped in his car and kill him afterwards and be charged with murder by corrupt justice and go to juvee and get beaten by foster parents and get taught to climb by a pretty boy in senior year who couldn’t care less about what was in the yearbook because he loves the mountain and he loved me until he hung himself on the second monday of our fourth year together because he couldn’t live with having killed a little girl in a car accident and I promised his dead body I would complete his dream and climb through a route none has gone before and come back down through a different one and brave the cold and the snow and the ice and the risk and the fear and the euphoria that feels so good but is so dangerous up on the mountain.

I did it Arthur.
I did it.


passcod ask@passcod.name
A Man urn:uuid:02201113-0000-4044-a1d5-129755520000 2011-02-13T00:00:00+00:00

He was lit up faintly.

Standing in a room of golden proportions (which is not saying a lot), he was one stood man (which is). The only lamp, a seemingly old neon, hanging short from its chains, shone darkly above none. None but a five-feeted glass plane, upon which glossy pages were desperately eager to tan; but alas! not one ever did lift their covers.

The man had been looked upon countless times, even through his short while standing. Always from the top, which might be explained by his stature, or might not. His hair, though, was all but feature-less. A few curls only stood out from otherwise straight, short mop. His visage was no different: sharp edges and soft skin were its only characteristics. Immaculate white collar. Iridescent black blazer. No tie. Dark pants, which pockets concealed fine hands (five of them, two of flesh). Polished shoes. Neat.

Above his socks, through the shadow, a lighter strip revealed — no, confirmed — what one could have mistaken for tan earlier. Yes indeed; the man was a lone, black white cream, wolf.

Behind blue eyes, the man was impatient. His feet were hurting. Had someone spoke to him at that very instant (as the next it was gone), he would have answered softly, non-committally; in his mind, however, his voice clear and his tone dry, he would have snapped, glaring. But etiquette ruled over him. Earlier, he had risen for that same reason from his seat and let another take it, damning both the old dear for entering, and the owner for the number of chairs. Her feeble thanks had irritated him, and he had not replied. He now damned both himself for this lack of respect, and his long gone ancestors (only from his mother’s side) for having instated and enforced this ridicule heap of codes and laws.

A sparrow, love, and a brightness in his mind entered through the far door and kissed him quickly and sweetly.

Arm in arm, they left.

passcod ask@passcod.name
Mid-loss urn:uuid:10201008-0000-4281-a1d5-128649600000 2010-10-08T00:00:00+00:00



Softly I walk
forward. In the
first light of the
waking sun. My mind
still and clear and
white and black. Yet I
step up down and go
to the usual things of
the day. All that time
is what I think about.
is what I ache about.
is what my heart is.
is where my heart goes.

The sun is falling

Wait for me –


– Emily

passcod ask@passcod.name