Just wanted to share with you something I found ages ago but only just got around to mentioning – Julia Evans‘ (of Wizard Zines fame) Debugging Mysteries:
Each mystery is a Twine-powered “choose your own adventure” game in which you must diagnose the kind of issue that a software developer might, for
real. I think these are potentially excellent tools for beginner programmers, not just because they provide some information about the topic of each, but because they encourage
cultivating a mindset of the kind of thinking that’s required to get to the bottom of gnarly problems.
Unable to sleep, I found myself wondering whether anybody with a retro-hipster vibe had built a smart pocketwatch. All your smartwatch features, but in pocketwatch format.
Then I realised I was describing a mobile phone on a keychain.
We’re going to use ENF matching to answer the question “here’s a recording, when was it was (probably) taken?” I say “probably” because all that ENF matching can give us is a
statistical best guess, not a guarantee. Mains hum isn’t always present on recordings, and even when it is, our target recording’s ENF can still match with the wrong section of the
reference database by statistical misfortune.
Still, even though all ENF matching gives us is a guess, it’s usually a good one. The longer the recording, the more reliable the estimate; in the academic papers that I’ve read 10
minutes is typically given as a lower bound for getting a decent match.
To make our guess, we’ll need to:
Extract the target recording’s ENF values over time
Find a database of reference ENF values, taken directly from the electrical grid serving the area where the recording was made
Find the section of the reference ENF series that best matches the target. This section is our best guess for when the target recording was taken
We’ll start at the top.
…
About a year after Tom Scott did a video summarising how deviation over time (and location!) of the background electrical “hum”
produced by AC power can act as a forensic marker on audio recordings, Robert Heaton’s produced an excellent deep-dive into how you
can play with it for yourself, including some pretty neat code.
I remember first learning about this technique a few years ago during my masters in digital forensics, and my first thought was about
how it might be effectively faked. Faking the time of recording of some audio after the fact (as well as removing the markers) is challenging, mostly because you’ve got to ensure you
pick up on the harmonics of the frequencies, but it seems to me that faking it at time-of-recording ought to be reasonably easy: at least, so long as you’re already equipped with a
mechanism to protect against recording legitimate electrical hum (isolated quiet-room, etc.):
Taking a known historical hum-pattern, it ought to be reasonably easy to produce a DC-to-AC converter (obviously you want to be running off a DC circuit to begin with, e.g. from batteries, so you
don’t pick up legitimate hum) that regulates the hum frequency in a way that matches the historical pattern. Sure, you could simply produce the correct “noise”, but doing it this way
helps ensure that the noise behaves appropriately under the widest range of conditions. I almost want to build such a device, perhaps out of an existing portable transformer (they come
in big battery packs nowadays, providing a two-for-one!) but of course: who has the time? Plus, if you’d ever seen my soldering skills you’d know why I shouldn’t be allowed to work on
anything like this.
Just when I thought I’d seen every conceivable XML data format with an approved MIME type
(!) I discover @mamund‘s Maze+XML, a format for describing orthoganally-connected squares of
a maze.
This weekend I was experimentally reimplenting how my blog displays comments. For testing I needed to find an old post with both trackbacks and pingbacks on it. I found my post that you linked, here, and was delighted to be reminded that despite both of our blogs changing domain name (from photomatt.net to ma.tt
and from blog.scatmania.org to danq.me, respectively), all the links back and forth still work perfectly because clearly we share an apporopriate dedication to the principle that
Cool URIs Don’t Change, and set up our redirects accordingly. 🙌
Incidentally, this was about the point in time at which I first thought to myself “hey, I like what Matt’s doing with this Automattic thing; I should work there someday”. It took me
like a decade to a decade-and-a-half to get around to applying, though… 😅
Anyway: thanks for keeping your URIs cool so I could enjoy this trip down memory lane (and debug an experimental wp_list_comments callback!).
Super quick find on lunch break during a day coworking in Cheltenham. Love the hiding spot which seems pretty much made for a cache of this shape and size! TFTC!
I hope to cycle/walk to the GZ about lunchtime? I’ve an opportunity to pass nearby the GZ between other errands this morning!
Expedition
I was excited to see this spot pop up on my radar, because it’s a lovely meadow that I’ve ocassionally walked my dog in, within comfortable cycling distance of my house. As it happened,
I had an even easier route here because a drive this morning to drop the kids off at a half-term activity took me “close enough” to be worth stopping and walking from there.
I parked at The Talbot Inn, just West of the Swinford Toll Bridge (a bizzare old bridge that, for weird historical reasons, continues to use human operators
to charge 5 pence per car to cross, which surely cannot be cost-effective!). From here, there’s a footpath along the back of the Seimens buildings in the nearby light industrial estate
which eventually comes out into the Wharf Stream Way circular walk. It was pretty damp out here today and I quickly regretted my choice of light trousers which would have been fine to
drive the kids to their camp and back but wasn’t really a good choice for stomping across the long grass of a damp meadow. Some way across I disturbed some grazing deer, but ultimatey
it was following a deer-trodden trail that eventually provided the best route to the GZ.
I reached the GZ at 09:19, took a selfie, and then turned around to go and get to work. I also shot a video covering the whole expedition which is presented, unedited, below.
Tracklog
My GPSr kept a tracklog; note that this was an “on the way” stopoff so the start and end point isn’t the same!
Found with fleeblewidget during a meander around the city. She saw it ahead and remarked on the beautiful building before I’d even told her
that was where we were heading. Greetings from Oxford, UK. Gracias por el caché.
A few months ago, people were posting a lot about the Netherlands on Chinese social media platform Weibo. “Wake up, sleeping people of the Netherlands!” said one post. Others lamented
that the people of Amsterdam wanted their tulips back.
These Chinese social media users aren’t expressing a nascent interest in all things Dutch. They’re talking about recent protests over frozen bank deposits in the province of Henan. Ordinarily, discussions about a
controversial topic like this would be censored on Chinese social media, and posts containing the word “Henan” could be blocked or deleted. But “Henan” (河南) sounds a lot like “Helan”
(荷兰), the Mandarin word for the Netherlands. By swapping the names around, people were able to get past the censors and keep the conversation going.
…
I love this article. The use of homonyms and puns to work around online censorship by Chinese citizens is as innovative and heartwarming as its necessity is horrifying and tragic. If
you’re wondering exactly how similar 河南 (“Henan”, the name of the Chinese province in which authorities
abused social distancing laws and used violence to prevent rural bank customers from withdrawing their own money) and 荷兰 (“Helan”, The Netherlands) sound, have a listen for
yourself:
Unless you speak Mandarin already, you’ll might struggle to even pinpoint which is which in that recording.
This clever and imaginative use of language to try to sidestep surviellance feels like a modern adaptation of cryptolects like Polari or rhyming slang as used in the UK for the same
purpose. But writing in Han characters online seems to provide an amazingly diverse way to encode meaning that an in-the-know human can parse, but an automated machine or an uninformed
human censor can not. The story about the use of the word for “paratrooper” on Chinese social media, touched upon in the article linked above and expanded elsewhere, is particularly enjoyable.
Anyway, after you’ve read the article and you’re ready for a whole new rabbit whole to explore, I’d like to kickstart you by introducing you to Totoiana, a Pig Latin-like (second-syllable onwards, then first syllable) dialect
spoken with fluency exclusively in a single Romanian village, and nobody knows why.
Your product, service, or organisation almost certainly has a priority of constituencies, even if it’s not written down or otherwise formally-encoded. A famous example would be that expressed in the Web Platform Design Principles. It dictates how you decide between two competing
needs, all other things being equal.
At Three Rings, for example, our priority of constituencies might1 look
like this:
The needs of volunteers are more important than
The needs of voluntary organisations, which are more important than
Continuation of the Three Rings service, which is more important than
Adherance to technical standards and best practice, which is more important than
Development of new features
These are all things we care about, but we’re talking about where we might choose to rank them, relative to one another.
The priorities of an organisation you’re involved with won’t be the same: perhaps it includes shareholders, regulatory compliance, different kinds of end-users, employees, profits,
different measures of social good, or various measurable outputs. That’s fine: every system is different.
But what I’d challenge you to do is find ways to bisect your priorities. Invent scenarios that pit each constituency against itself another and discuss how they should
be prioritised, all other things being equal.
Using the example above, I might ask “which is more important?” in each category:
The needs of the volunteers developing Three Rings, or the needs of the volunteers who use it?
The needs of organisations that currently use the system, or the needs of organisations that are considering using it?
Achieving a high level of uptime, or promptly installing system updates?
Compliance with standards as-written, or maximum compatibility with devices as-used?
Implementation of new features that are the most popular user requests, or those which provide the biggest impact-to-effort payoff?
The aim of the exercise isn’t to come up with a set of commandments for your company. If you come up with something you can codify, that’s great, but if you and your stakeholders just
use it as an exercise in understanding the relative importance of different goals, that’s great too. Finding where people disagree is more-important than having a unifying
creed2.
And of course this exercise applicable to more than just organisational priorities. Use it for projects or standards. Use it for systems where you’re the only participant, as a thought
exercise. A priority of constituencies can be a beautiful thing, but you can understand it better if you’re willing to take it apart once in a while. Bisect your priorities, and see
what you find.
Footnotes
1 Three Rings doesn’t have an explicit priority of constituencies: the example I give is
based on my own interpretation, but I’m only a small part of the organisation.
A fringe benefit to being CO to a virtual is that it doesn’t require much maintenance, save for ensuring that all logs are accompanied by a
valid solution message and no spoilers are posted. But it’s still worth visiting them from time to time to ensure they’re still accessible and solvable! These stones have been here for
thousands of years – minus a relatively short period from around the 15th to the 20th centuries! – so I couldn’t imagine they’d gone anywhere, and indeed they haven’t. Counted them to
make sure, and the geopup checked that the outlier stone was in its proper place. Maintenance performed!