No green and only two black wine gums in this bag? Feeling robbed.
Category: Personal
BeepAlive – keeping my soundbar from going to sleep
My living room TV is attached to an ageing Windows box that we use as a media centre and middleweight gaming1 PC. To better fill the room with sound (I hate those tinny flat speakers they like to put into TVs these days!), the TV is also attached to a soundbar.
The problem is that the soundbar keeps shutting itself down. If it doesn’t receive any signals for ~20 minutes, it enters sleep mode2. It automatically turns itself on when the TV turns on, but it turns itself off all by itself.
This is annoying, because if we pause what we’re watching for a conversation or something, the soundbar switches itself off, even though the computer and television are still switched-on. It’s doubly-annoying because we then have to get up and walk over to it to switch it back on again, because the dog ate the remote3.
But what if I could solve this… with software?4
My solution is BeepAlive, a little Go program that runs in a Windows system tray and makes a very quiet noise once every 9 minutes. I’ve tuned the noise so that it’s quiet enough that I can’t hear it unless I’m specifically listening for it… but loud enough that it the soundbar sees that there are still audio signals coming in, so it doesn’t go to sleep.
Now, so long as the media centre computer and TV remain powered-on, the soundbar stays awake. And that’s how a hacky engineer like me can solve a hardware problem with a software tool.
Footnotes
1 Mostly the gaming’s done by the kids, and they’re likely-as-not to use the Switch or Steam Deck instead… or, when we’re not at the Chicory House, Bee, the Bazzite-powered gaming rig I set up in the playroom… but in principle it’s equipped for gaming. I guess we sometimes fire a Jackbox Party Pack on it when we have guests?
2 It doesn’t even seem to save any power to be in sleep mode: my power checker tool says it draws basically the same amount whichever mode it’s in!
3 It’s triply-annoying because our soundbar is the only infrared-controlled device in our house that doesn’t follow the IrDA standard, which makes it incredibly difficult for me to automate switching it on from the TV remote, our Flic hub, any “universal remote” etc. I managed to pull off a replay using my Flipper Zero, but that’s not a solution I want to put into the hands of the kids (or anywhere that the dog might eat it). I suppose I could buy a replacement remote, but I don’t feel like giving any more money to a company that turned their nose up at IrDA.
4 Okay, so technically I solved this with software a few years ago, but I misplaced the software and it, frankly, wasn’t very good. My thinking is that by doing it better, and open-sourcing it, I’ll be able to find it when I need it next. And as a bonus, it might just maybe help somebody else, someday.
5 At our regular house, rather than the Chicory House, the soundbar lives above the TV, close to the ceiling, and it’s hard to even see the annoying LED. So I mounted a tiny mirror, about a quarter of the size of a fingernail, to the ceiling above it to improve its visibility from the sofa. Now that’s a hardware solution!
Sainsburys Grapes
Sainsburys grapes confuse me.
500g of white grapes are £2. 500g or red grapes are £2.20. So you’d expect 500g of half-red, half-white grapes to be… £2.10, right? But no, that’s £2 too.
So buying 500g of white grapes and 500g of red grapes is cheaper if you buy the mixed packs and then separate them. Why!?
(Feeling Fucking) Fabulous in Blackpool
Like many others1, MEEK’s Fabulous has been stuck on-loop in my head for most of this year. What a fucking banger of a track, amirite?
And yet… somehow, today was the first time I figured I’d watch the music video. If you’ve not seen it (or perhaps not even heard the song), go do that now; I’ll wait.
The outdoor shots start about 20 seconds in, and… they’re instantly-recognisable by what they aren’t.
They aren’t London, where singer-songwriter Georgia Meek hails from, that’s for sure.
You probably know from the title of this blog post, but the filming location MEEK and her team chose is… Blackpool!
That first outdoor shot is opposite Pier Street Car Park.2
The music video goes indoors, continuing – nay, increasing – how fabulously queer-and-glam it is, through a theatre and arcade/bingo hall3. Eventually, it hits and a series of fast food establishments cumulating in Feast About.
Then there’s some faster and blurrier videography, but it’s clearly the Golden Mile, where she’s heading South and… hey, wait… is this music video actually shot in a geographically-sound order? So far, she seems to have moderately-consistently been moving South through the roads about one or two streets back from the Promenade, from a little North of the North Pier down towards the Central Pier…
Anyway; after her party night out, she finds her way to a late-night chippy, as you do.
She’s still heading South… which makes me think that the ruined steps she’s seen sitting on for literally three seconds might be somewhere between Coral Island and the Crispy Cod. Anybody know?
Anyway, the bottom line is that this music video was – surprisingly but delightfully – set in the area of… what might be the gayest pub crawl in the UK. Which, on top of this already awesome song, leaves me… feeling fucking fabulous.
Footnotes
1 Especially those in queer or adjacent spaces, obvs.
2 Pier Street and York Street Car Park’s are a comfortable walk from Ma Kelly’s Cabaret Bar, which – and I’m less-certain about this one – might be the host of some of the interior shots from the music video. Anyway, if you go around the corner in Google Street View you’ll find Higgitts Arcade and Burger Bar, which – just trust me and go look at it – is the most-Blackpool thing imaginable.
3 I’m almost-certain the arcade is the Higgitts, which I mentioned previously because of its proximity to an earlier shot!
Shipslasher
I want to write a successful YA fiction where all the characters are boats. Just ‘cos I want to see people ‘shipping ships.
Also, one of my characters will be called Slash.
Chuck Wagon
Contactless Transport in London vs Paris
Paris’s public transport tickets suck… for now!
In his blog post yesterday, Terence Eden observed that of all the cities he’s travelled to over the last year, Paris had the most-ridiculously-unhelpful public transport ticketing system:
Fuck Paris. The only way to buy a metro ticket is to download an app. Fair enough. But, after downloading the app it tells you to install another app!
![]()
What the actual fuck? A convoluted, messy, and frustrating situation which has resulted in awful reviews for them.
Trains and metro travel require separate tickets at different prices. You can’t easily hop from one to another. You need to think carefully about the route you’re taking. A more convoluted route may be significantly cheaper because it doesn’t involve swapping between services.
This absolutely parallels my experience of hopping around the Paris’s metro area, last time I was there.
I was interested to hear, though, that by 2030 virtually all of Paris’s public transport will accept contactless payment, bringing its convenience level to a similar level to that of London. Cool.1
From the sounds of things, this is clearly designed as a convenience for visitors to the city, not regulars and locals:
Dès le 30 juin 2026, les touristes et les voyageurs hyperoccasionnels pourront opter pour valider leur titre en sortie de l’aéroport d’Orly sur la ligne 14 avec la carte bancaire.2
Paris’s relationship with tourists is different from London’s
But the bit that surprised me is Paris’s pricing for the parts they’ve deployed so far:
Les prix des titres de transport via les bornes d’achat sont les suivants :
- Bus/tram/funiculaire : 2,55 € (soit + 0,50 € sur le prix classique) ;
- Métro/train/RER : 3,35 € (soit + 0,80 € sur le prix classique) ;
- Aéroports : 14,80 € (soit + 0,80 € sur le prix classique).
Buying transport tickets in Paris using a contactless card… costs 0.50 € to 0.80 € more. Paris will charge you for the convenience of tapping in and out with your carte bancaire.
Contactless is clearly more-convenient for city visitors, but I think the difference between London and Paris’s attitude to it says something about the relationship both cities have with their tourists. In London, most travellers can use whatever bank card and mobile wallet they’ve already got… and they’ll get as good a deal as possible. But in Paris, doing the same will invariably cost more than a conventional ticket would. You pay a convenience-tax.
Both cities get tens of millions of annual visitors and extract billions of euros worth of financial benefit from their tourist economies. Paris doing slightly better overall, but they’re closely-comparable enough that differences like this probably mean something.
I’m not saying that London loves tourists and Paris hates them! It’s not so simple as that. But I think perhaps the cites try to present themselves in a different way.
London’s public transport says: we’ll work around you. You can learn the rules as you go; you don’t have to “learn London” to get around. Just use your usual contactless card wherever you go; we’ll work out the details, and your daily cost will get capped just the same as if you chose to pick up an Oyster card. Visiting the city as a tourist is an ordinary use-case for the transport network.
Paris’s public transport says: you should learn the rules. You’re welcome to visit, but you either need to do the work to be a “temporary Parisian”… or you can just use your usual contactless card but we’ll charge you a premium for the convenience. Visiting the city as a tourist is a special case that the transport network sees differently from being a local.
Neither approach is “wrong”… but I think it’s interesting. And now I’m wondering what the approach is like across other European cities.
Footnotes
1 I’ll almost-certainly have to tackle the current-generation of Paris’s public transport at some point before then, but I’ll look forward to the improved version once it rolls-out.
2 “From 30 June 2026, tourists and hyper-ocassional travellers will be able to pay by bank card on Line 14 out of Orly Airport.” Emphasis mine.
Reply to: This blog is written in en-GB
This is a reply to a post published elsewhere. Its content might be duplicated as a traditional comment at the original source.
I feel like this is an even-more specific dialect than en-GB. What is this, en-GB-1980s? 🤣
“You saved my life!” (or: how my kids briefly thought I was a superhero)
This weekend, my friend Liz arranged for some other Abnibbers and I to gather, with our families, for a camping/glamping weekend East of Oxford.
Here’s a story of something that transpired there, presented in three parts:
The entire weekend would have surely been a memorable experience already, but one particular event will probably stick in the minds of everybody in attendance: the fire.
The fire
The UK’s in its unprecedented third heatwave of the year: the grass is all dying and everything is tinder dry. And so it was that, on Friday night as the kids and I slept in our glamping “dome”, I was woken by the distant beep-beep-beep of a domestic smoke alarm. A few seconds later, I heard a second such alarm with a different tone, and it became clear that this wasn’t just somebody’s toast on fire.
I went back into the dome to check on the children, which is when Penny knocked on my door to ensure I was aware of what was going on. The kids were sound asleep, so I ran out to the car park to move the car (which was parked in such a position that embers were raining down on it!) and to check on the situation.
I returned to the dome and got the children dressed. We evacuated to a safer distance and watched as the firefighters arrived and began to tackle the blaze. Short of water, they had one pump dousing the flaming building while two others relayed water from the nearest fire hydrant, way down the hill.
Eventually the situation came under control and we were all able to return to bed.
The battery pack
I spoke to Mike, whose holiday home was the building that was destroyed. He’d managed to escape with some shorts and his mobile phone, but little else: in particular, his car keys remained inside and were probably destroyed, which rendered him unable to drive back to his regular home.
Mike had been turning his phone on only in bursts in order to conserve battery for all of the essential calls he’d have to make (e.g. his bank, to extract some money without his cards, and a locksmith, to get him back into his car). His phone charger – an awkward USB-B-Micro one – hadn’t survived the fire.
But conveniently… I happened to have such a cable in my bag. Plus a fully-charged battery pack. So I lent both to Mike, in the hope that it’d make it easier for him to do all of the necessary administration1.
“You saved my life!”
Anyway: on Saturday night, shortly after the kids and I had turned-in, there was a knock on the door. It was Mike, come to return the battery pack I’d lent him.
The kids didn’t know who he was, so I explained: “This is Mike; he’s the fella who lived in the home that burned down last night.”
Mike handed over the battery pack and charging cable and, grateful for them, used a metaphor that. “Thanks,” he said, passing the hardware to me, “You saved my life!”
He turned and left, and both kids sprung out of bed and exclaimed “You saved the life of the guy whose house burned down‽”
I’m sure they had in their minds the idea that, during the period between the fire starting and me waking and evacuating them, I’d singlehandedly dragged this dude out of a burning building. Y’know, instead of just lending him a phone charger after-the-fact.
I only let them hold the misapprehension for a few minutes, but for a moment it lightened the mood.
Footnotes
1 I was already using my phone to call our insurance company before our flood, earlier this year, had finished. I can only imagine how inconvenient it is to suffer a disaster and lose your communications lifeline at the same time!
Can’t sleep, too much fire
Hashcard #2
Six years and four months ago to the day, I received my first hashcard – an achievement-earning postcard sent while out on a geohashing expedition, to another geohasher. This experience went some way to my acquisition last year of a PO Box through which anybody on the Internet is invited to send me a postcard! (I’ve collected a few!)
Well: today I received my second hashcard (and tenth “postcard from the Internet”)! This one came from GeorgDerReisende, whose 800+ expeditions are more than a little intimidating! He’d spent his 13th hashiversary on an expedition to a location outside Frankfurt earlier this month, where he narrowly failed to reach the hashpoint because it was just slightly too far into somebody’s private property.
But at least he was able to claim the hashcard achievement (although not for the first time)! Well done, GeorgDerReisende!
Reply to: Deleting Systems You Don’t Understand
This is a reply to a post published elsewhere. Its content might be duplicated as a traditional comment at the original source.
…
Those
.inifiles seemed unimportant to a child, but they are configuration files used by several applications, including the operating system. While the Windows Registry did exist in Windows 95,.inifiles were still commonly used. When I deleted them, any application or process that relied on them failed to load and simply crashed.Anyone who had anything of importance on that computer lost it. Everyone except my father, who carefully kept copies of his documents on floppy disks. He knew I was up to no good.
Throughout my career, I’ve seen many people make this same mistake. When something doesn’t look important to them, they delete it. Whether it’s a programmer deleting a function that “looks stupid,” or a DBA dropping a table or a single field they assume no one will miss. It’s all the result of the same mindset: “I don’t think this is important.”
…
Not the same thing at all, but once, early in my career, I needed to use a colleague’s computer because mine was tied-up doing something-or-other. He was off for his lunch, so I asked if I could borrow his and carry on testing the system I’d been developing from there.
My tests involved making a ton of CSV files, uploading them into a tool, getting the mutated results back, and comparing them. Dull stuff, and it made a load of temporary files. So I dutifully dumped all the mess I made into the Recycle Bin and, when I was finished and returned to my own desk, I emptied the Recycle Bin.
My colleague returned and he was furious. “Did you empty my Recycle Bin?” he fumed.
“Yes,” I said, “Sorry; was that a problem?”
“I was keeping all kinds of important documents in there!” he replied.
Turns out that the software he was using to measure how much disk space he had left didn’t include the Recycle Bin in its count; after all, that could be freed-up in a moment! And so, to “save space”, he’d taken to storing large (but important) files… in the Recycle Bin so that they didn’t take up space (at least, according to the tool he was using: obviously they were taking up space in reality).
This guy wasn’t 10 years old. He was over twice that, a recent university graduate with a software engineering degree.
Everybody can make these mistakes!
The secret API I used to tell LeShuttle about different outbound and return passengers
I’ve got an upcoming trip to France: I’ll be driving there through the Channel Tunnel, via LeShuttle. But owing to a quirk in our family travel arrangements, we’ve have a slightly different set of passengers in the car for the outbound leg than for the return journey.
LeShuttle’s broken website
This is something that LeShuttle’s Advance Passenger Information registration form ought to be able to handle… but it very-much can’t.
I was able to provide all of the personal and passport details of everybody on the outbound leg, but un-checking the “Return passenger information is the same” checkbox did… nothing. In fact, when saving the form and logging in again, the checkbox would be automatically re-checked.1
This is the point at which a normal person would either:
- Add the details of all passengers, both outbound and returning, to the form, and just hope they can sort out the confusion at the terminal, or,
- Try to get hold of a human Help Centre/Contact Us system (good luck!) who can sort it out.
Fortunately, I am not a normal person. I… am a software security engineer.
API reverse-engineering
My browser debug tools quickly indicated how this entire process works, and gave a clue as to what was broken in LeShuttle’s systems.
- When you log in, it makes a
POSTrequest tohttps://nextus-api-prod.leshuttle.com/b2c-api/GuestApi/Read?bookRef=...&surname=..., including your booking reference and surname (which acts as your password) in the relevant parameters. - This returns all of your details in a JSON document. Prettified, and with all of the actual data replaced with explanatory comments, it looks something like this:
{
"loginDetails": {
/* credentials you used and other metadata */
},
"bookingDetails": {
"outboundTravelDetails": {
/* details about your outbound train and vehicle */
},
"returnTravelDetails": {
/* details about your return train and vehicle */
},
"leadName": {
/* details of the person who booked the trip */
},
"outboundPaxDetails": {
/* For the outbound journey: */
"paxLine": [
/* First passenger: */
{
"paxDets": {
/* - name, nationality, gender, DOB */
},
"docDets": {
/* - passort number, expiry, issuing country */
}
},
/* Second passenger: */
{
/* ... and so on .... */
},
],
/* Total number of passengers: */
"noOfPax": "4"
},
"returnPaxDetails": {
/* For the return journey: */
"paxLine": [
/* ... each passenger: same format as outbound... */
],
/* Total number of passengers: */
"noOfPax": "5"
},
"storedPaxDetails": {
/* Pre-saved details? All blank for me */
},
/* More metadata */
},
"status": {
/* Yet more metadata */
},
/* Even more metadata */
}
- Once you’ve made some changes, you press “Save”. This triggers a
POSTrequest tohttps://nextus-api-prod.leshuttle.com/b2c-api/GuestApi/SavewithContent-Type: application/jsonand the entire JSON document from before, with your modifications, passed back.2
If you’re a programmer, you’re probably already making a guess as to what the underlying problem is. And you’re probably right:
- The “Return passenger information is the same” checkbox value is not stored in the data that gets passed back and forth.
- Instead, it’s derived by looking at the outbound and return passenger information. If it matches, it gets checked.
- If it’s initially checked… the form doesn’t bother loading the UI that allows return passenger details to be modified.
- But… this means that it never loads that UI:
- the first time you visit the page the passenger list is empty both ways, which matches: anything you enter will necessarily be recorded into both the outbound and return fields, so
- the next time you visit, it also matches… so it still doesn’t load the fields,
- and so on.3
“Fixing” the problem
Knowing how the API worked, I was able to simply take the JSON document from the /Read endpoint, modify it so that the outboundPaxDetails and
returnPaxDetails each contained the correct details for that leg of the journey (being sure also to update the total number of passengers noOfPax, which is for
some reason a stored value rather than a derived one), and then submit it back via the /Save endpoint.
Having done this, I hit the /Read endpoint again to confirm that the data had, indeed, retained the data I submitted. When logging in again to the Web interface, I noticed
that the checkbox now doesn’t automatically check itself. The correct data gets passed back and forth4.
Obviously LeShuttle need to fix their damn site. But at least – thanks to a little API reverse-engineering – I was able to submit the details they wanted from us.
Footnotes
1 Before anybody asks: yes, I tried all of the obvious things like using different browsers, clearing caches, disabling plugins, etc. I even had another passenger, using a different computer and operating system, give it a go. This one’s definitely a bug in LeShuttle’s systems.
2 I choose to assume that they’re doing some kind of server-side validation to ensure that a customer can’t, for example, modify details they’re not permitted to without a charge, such as which train they’re booked onto or the registration plate of the vehicle they’re bringing. But obviously I haven’t tested this, because it’s not among the information that I’m authorised to modify. Ethical hackers get permission before they poke at things they’re not sure whether they’re supposed to… especially if it’s a travel-related system and they’re somebody who has an unusual name that routinely gets them stopped and questioned at the UK border in general. 🤭
3 It occurs to me that possibly LeShuttle provide access to the relevant form only after the outbound journey has been made? Which would be a terrible design for the system and would represent terrible UI (why provide the checkbox if it doesn’t do anything?). I decided not to chance that this could be the expected approach, though, and just “fixed” the data up-front.
4 I haven’t tried modifying any of the outbound details to see if this re-breaks the return details. I suspect it would be fine, based on my analysis that the bug exists only in the front-end. But I can’t be sure without testing, and proper testing is something that LeShuttle’s own techies are getting paid to do. I don’t care enough about their website to do it for free!
How I (Don’t) Collect Blog Statistics
Inspired by Becky‘s post How I Collect Blog Statistics, Respectfully,1 I thought I’d share what I do.2
tl;dr: I collect virtually nothing and I use even less.
Let me take you on a journey through the different kinds of analytics tools I’ve used:
1996 —1999: Hit counters!
My original websites used a hit counter that I wrote in Perl based on a sample from Matt’s Script Archive. Because I was edgy and dark, I made it look like this:
Hit counters are pretty dumb for a variety of reasons. Counting “hits” was never a terribly-representative reflection of the popularity of your pages. But also: because they’re a public representation of your popularity, there was every incentive to “game” them… even just by hitting refresh a couple of times. Making them untrustworthy and pointless.
1998 — 2006: Webalizer
Back in the day, “proper” web stats was something you did on your log files. Take log files, pump them through a program, get amalgamated output. And the king of these tools was The Webalizer.3
On a few of my websites – and some that I helped host for my friends – I’d have The Webalizer run daily, collating an archive of monthly stats plus “month-so-far” for the current month.
The Webalizer attempted to differentiate “hits” from “visitors”. And it tried to distinguish between browsers, and isolated bots, and tracked pulled referrer-data, and could even try to geolocate IP addresses. It was pretty magical for its time.
2006 — 2016 Google Analytics
I was an early adopter of Google Analytics: my site ID (“UA code”) was only five digits long!
Google Analytics works via a JavaScript snippet which collects a variety of information about the visitor and sends it to Google’s mothership.
A third-party cookie that connected all Google Analytics-powered sites, plus everybody’s activity on other Google products, provided a wealth of data that you couldn’t get any other way. Want a gender breakdown of your visitors or their interests? Google can “help” you with that… and all the while, “helping” themselves to copies of all the data too.
If your website runs Google Analytics, it’s part of Google’s massive data-harvesting machine, monitoring people as they move around the Web. Webmasters trading away their visitors’ identities for some pretty charts seems pretty disgusting to me; it saddens me that I was ever “part of the problem”.
2015 — 2023 Piwik
Since around 2010, I’d been actively blocking Google Analytics, which made me feel a bit like a hypocrite to be inflicting it upon others. I looked for an alternative and found it in Piwik (now Matomo), an open-source and self-hosted analytics tool.
I ran Google Analytics and Piwik side-by-side to validate the latter, and found it to be excellent. Not only was it collecting data in a much more-ethical and respectful way, but it was also producing more-accurate results for my readership who, leaning somewhat “techie”, would sometimes block Google Analytics outright for all of the same reasons I did.
It was pretty good, but…
2023 — … (Almost) nothing?
…I don’t like the kind of blogger I am when I’m collecting stats!
It’s like… being a teenager again and having that hit counter, and getting excited when it goes up. So what if a number went up? What does “popularity” mean? Isn’t the impact more important than the number of eyeballs?4
So in 2023, after winding my analytics down by instalments for many years, I just… stopped.5 I realised that so long as I was able to easily “watch the stats”, I’d be temped to write for the stats. To treat it as a score. To make the hit counter go up.6
That, in essence, is why I don’t really “do” any webstats any more. Analytics don’t serve me and the blogger I want to be, and they didn’t represent anything that I would consider a useful metric of success.
If somebody’s moved by what I do, that’s great: but a hit counter going up by one doesn’t tell me that; and it never did. Now if they leave a comment or drop me an email or even send me a postcard, that’s how I know that I made a difference!
Exception to the rule: GoAccess!
While I don’t actively watch the stats any more, I suppose I can still generate them, from my webserver logs, Webalizer-style. Except nowadays I’d probably use GoAccess:
There’s a script that I’m able to run, if I feel like it, to parse the most-recent of my Caddy logfiles. It takes about one minute to run per day of logs to process, and outputs a perfectly attractive self-contained HTML file.
Here’s that script:
#!/bin/bash readonly LOG_DIR="/var/log/www/danq.me/" readonly DAYS=7 readonly OUTPUT_HTML="/var/log/goaccess/danq.me.html" sudo bash -c "{ find '$LOG_DIR' -maxdepth 1 -name 'access*.gz' -mtime -$DAYS -print0 | sort -z | xargs -0 zcat; cat '$LOG_DIR/access.log'; } | goaccess --log-format CADDY --output '$OUTPUT_HTML' -"
It’s not clever. It’s not sophisticated. It doesn’t use cookies or JavaScript or, indeed, anything other than what my webserver gives me for free.
I barely use it: maybe once every 18 months or so (today was the first time in well over a year). It’s there if I need it. And it’s inconvenient-enough to use that I’m not tempted to.
Footnotes
1 And perhaps also inspired to a lesser extent by Terence Eden‘s Reasonably accurate, privacy conscious, cookieless, visitor tracking for WordPress, which I’ve been thinking about on-and-off ever since I read it last year.
2 By “blog stats”, here, I mean statistics about visitors to my blog, not stats about my blogging (which I track and share in excruciating detail).
3 Did you know that the last point release of The Webalizer was in 2013 and the last feature release was in 2010: much later than I thought was the case!
4 Also, how do we even count “eyeballs”. Right now, about a fifth to a quarter of my
visitors are bots. Amazonbot alone accounts for over 2% of my traffic. (I should probably tighten my
robots.txt.)
5 Nowadays, there’s no tracking scripts whatsoever on my site. I don’t set a cookie unless you ask me to (and then it’s “transparent”: you can see exactly what it contains and what it’s for), I don’t try to fingerprint you in any way, I don’t even keep server logs longer than 60 days! Back when I used Jetpack I actively nerfed its stats-collection “features”. I don’t want your personal data!
6 Last week, I wrote a blog post about breaking into somebody’s “app” to make a web page that does the same things, but better. It attracted lots of comments, emails, and other feedback, so I can see it had impact. I have no idea how many eyeballs (or bots) saw it. That’s not the important bit.
F-Day plus 151
A hundred and fifty one days since we were flooded out of our house, and I needed to visit to meet a contractor. The garden’s starting to get a little wild, this summer: we’ve been periodically visiting to mow the lawn, but our hedge seems to have decided that this could be the year that it will consume the gate once and for all…





