Escape Room Tour!

If you couldn’t make it to our escape room, we put together a walkthrough:

We’re still working on cleaning up - it’s taking a little longer than initially expected because we’re doing it right - cleaning up the garage so we can fit the furniture into a more compact space1 as well as trying to clear some of our cardboard mountain that has built up during the past two years.

I guess the other big thing of the week was finally getting to see a new dermatologist after about a year’s wait (yes, even with insurance, you still get queues here in the US unless you’re obscenely rich). It was a very short visit, but the upshot is that he is going to try and get me on skyrizi, which, aside from the litany of side-effects, might be able to clear some of my psoriasis. If the insurance covers it. I’m trying not to get my hopes up too much, given that my previous dermatologist told me that most plans won’t even look at skyrizi until you’ve tried (and failed) with the older treatments. We shall see.


  1. I still dream of fitting an EV in some of that space. Especially since my current car seems to be returning to nature with the things growing on it… ↩︎

The Drop

Well, it’s not COVID, at least not by the many tests I’ve taken this week, but I’ve come down with something that has cast something of a shadow over the past seven days. I even took Friday off after realizing that I had no real idea what the code I wrote Thursday morning did by the afternoon. I am, at least, finally on the mend, but I am resentful of losing the weekend to it as well as the weeknights.

Which means the week has been a little uneventful, as I’ve been mainly blowing my nose for most of it. I did start planning for August, as Los Campesinos! are touring the US for the first time in three years. Naturally, I bought tickets within seconds of when they went on sale. We’ll be travelling to Cleveland, which will be something of a little adventure (and a four hour drive, because America is stupidly big at times). And I’ve started planning out some sweets to make once the Chocolate Room is back up and running. But otherwise, it’s been mostly in bed.

Next week, then: might actually do something! See you then!

Boop Cards & Blackjack

Because I am too lazy to tie things into a coherent narrative, I present: a list of thoughts about our recent trip to Las Vegas!

  • The room at The Cosmopolitan was good…but still ended up being a generic hotel room with a few extra additions. Honestly, I’m not even sure why I’m fixated on how hotel rooms and corridors all look so similar. The balcony was…well, I’m told it was a nice balcony. I simply could not go out there; I managed to put a foot outside on the final morning, but that was enough for me.
  • Having said that, when you are paying a premium for such a room, you do start to be a little more critical of things that you’d normally just let slide. Light switches that are coming off the plate, and a curtain rail just entirely missing. Nothing worth actually complaining about, but considering how the hotel markets itself as a haven of luxury, it did feel a little off.
  • I also fretted that I’d booked the wrong hotel entirely; I’m not exactly the type of person that goes to nightclubs, and I had to google to find out exactly what a dayclub even is (I mean, it’s not exactly rocket science, but there are differences! There’s pools involved!). But we did end up eating at a large selection of the restaurants in the hotel, it was relatively well-placed for everything we needed to get to, and it wasn’t actively horrible1…so even though I coveted the Aria’s patisserie, The Cosmopolitan worked out well.
  • There is no way the eggs at Eggslut are worth the queue.
  • Being my first real trip since the pandemic, I hadn’t realised just how self-conscious I’ve become with my psoriasis over the past couple of years. Long sleeve shirts for the entire trip, and despite having an outfit more akin to Victorian standards of swimming costumes, I couldn’t face showing off my legs at the hotel pool. So that’s something I need to deal with at some point…
  • There should be more soup dumplings available.
  • You might think that due to its proximity to Fremont Street and its subject matter, that the Mob Museum is just going to be an expensive bit of fluff. But actually it turns out to be a fairly large, comprehensive history of the building of Las Vegas as well as the Mob’s involvement in the city, and is definitely worth a visit!
  • The Neon Museum is a lot smaller — you’ll probably be done within thirty minutes, but looking at the bits of Vegas that have been tossed aside is interesting, and it is nice that the city is starting to looking after some of its heritage instead of just dynamiting everything in sight.
  • Who knew that a visit to a strip mall in the north of the city could trigger separate existential crises in both of us? Trader Joe’s had mini stroopwafels, though!
  • Also, don’t trust Total Wine’s online stock count.
  • The Wicked Spoon upcharging for a holiday that doesn’t really exist in the US (Easter Monday) was a little breathtaking.
  • Remember to check all the possible side effects of medication you’re taking! On a related note, the people at Number One Escape Room are lovely and handled our abrupt exit very well, giving us a voucher to come back another time (which we did on our last full day). The Pandora’s Box room at Trapped was rather good too, feeling more like an extended game in The Crystal Maze rather than a traditional escape room.
  • I think I wore real trousers consistently for the longest time since January 2020.
  • It was also my first time really using public transport in Las Vegas…and it was pretty decent? There’s a route that goes back and forth between the Strip and Fremont Strip which runs double-decker buses that are very similar to the ones that traverse the S5 route from Bicester to Oxford, so they felt quite familiar. The other routes use the oft-maligned-but-really-not-bad bendy buses. The city’s transit network is currently running a Saturday service during the weekday due to ‘labour shortages’, but honestly we had no trouble getting around using the system (except for one long trip on Wednesday, but that was a bus malfunction and could happen any time, really), and as the stops were so close to our hotel it was easy to hop on and off even on short trips to avoid the heat. It’d be nice to see a few more routes, e.g. to Area15, but I imagine that’s not really possible right now with their staffing issues.
  • The terrifying realization that my basement has a better bourbon selection than pretty much every bar on the Strip.
  • A word of warning: the french toast you see on this page for The Henry really undersells just how big the slices are. Each one is larger than a person’s head.
  • Having the mask mandate struck down while we were on holiday was a little stressful, although obviously nowhere near as much as the poor people who had everybody unmask on the planes in the air. Masking was pretty spotty in Vegas before the end of the mandate; probably around 10%, which fell to 5% or so towards the end of the week.
  • Be prepared for a lot of “Let’s Go, Brandon” if you venture to Fremont Street at night. But it was nice to see some of the old-style slot machines instead of the massive LCD panels you’ll find on the Strip these days.
  • I think the pandemic (and probably the last five/six years in politics) has made people forget how to behave in public. Our trip started with somebody cutting in front behind us, a time advantage of likely thirty seconds in the queue, and got incredibly hostile when people called him on it. Then there were the golfers drinking beer right on the access ramp in the hotel hurling abuse at people trying to get by, and people getting angry at being told to follow the rules. If I was going to make a generalization, they were all white men of a certain persuasion…
  • Finally, Omega Mart. This was amazing. We went twice, spending over six hours in total at the installation. You can just wander around the area, taking in the absurdity of things like “Doomed Expedition” chewing gum, ‘tattooed chicken, and infinity melons. And then discovering the other part of Omega Mart behind the counters, a multi-level setup taking in offices, a village, and a factory. Oh, and wormholes to an alternate dimension. No big deal. Everything is trippy, glitchy, and with a staggering amount of attention to detail. AND THEN! There’s an ARG layered on top that you can chose to take part in which sees you trying to unravel various mysteries and fighting the system from the inside. And there’s even more secrets - telephone networks and connections to other Meow Wolf installations in Sante Fe and Denver. The only downside to Omega Mart is that we left brimming with ideas for our second Escape Room. There’s a reason why I have one of these staring at me as I type.

Anyway, that was most of the Vegas trip, which was a great way to spend a birthday. Back home now - Helvetica has almost forgiven me for abandoning her for an entire week. Almost.


  1. I am available for any and all PR duties. “It’s not the worst experience you could have had!” “Nobody died this week!", “This time without bees!” ↩︎

We Bought It To Help With Your Homework

Escape Room Wrap-Up!

View this post on Instagram

A post shared by Ian Pointer (@carsondial)

As promised, some notes on an escape room, in no particular order:

  • Although we went with six people per run of the room, it felt like the optimal count was probably five.
  • Every team escaped, though a couple only managed it by the skin of their teeth. And I think that’s good! I’m a big fan of making a room in a way that experts may solve in 30 minutes flat, but gives enough breathing room that everybody gets to feel a sense of accomplishment at the end.
  • Polystyrene is your friend if you ever need to put up fake walls in a hurry.
  • (you will need a good hoover to pick up all the polystyrene bits)
  • Having a visual map of the path through the room, with lock details on it, will save you many many times over.
  • I think I’d like to see a tiny bit more non-linearity in our next room design 1. Not a huge amount, but maybe at least one extra parallel pathway.
  • Having the clues for the murder mystery double up as the ‘tokens’ that the players had to find made things confusing. I did have the idea of printing out tokens to supplement the clues, but it was too cold to print on the resin printer out in the garage.
  • Having a bunch of extra puzzles available allowed us to adjust the room a touch after the first two run-throughs — over-preparation was helpful!
  • The speakeasy reveal through the fake fireplace was great. For people that didn’t know the bar existed, it was a magical moment (and in fact, one person even forgot the bar even existed until they got through the fireplace!). Even for those that knew there was a room concealed behind the fireplace, the secondary part of me being behind the bar (having been locked away for over an hour!) still took them by surprise a little. Hurrah!
  • It went against all that we believe to be proper and true, but keeping the dinner menu down to something straight-forward, relatively easy to put together, and taking advantage of jarred sauces and the like…really made things less stressful - and the food was still really good!
  • Cooking the chicken cuts via sous-vide was a little fancier, I guess, but it also helped us because we could just dunk them in the water bath and know they’d be ready whenever we needed them.
  • I felt bad about not doing the special chocolates I had planned…but it would have been a bit of a nightmare to do them every weekend and there was a big couch in front of the chocolate work surfaces.
  • The clues suffered a little from being written in one frantic afternoon session, and some tinkering took place as the weeks went on to make things a little easier.
  • Role-playing varies amongst the teams, but people did seem to enjoy throwing accusations around, and the fake cigarettes were a rather worrying hit with many.
  • One player even went as far to invent a traitor mechanic in order to throw people off the scent that their character was the murderer. We deliberately didn’t do this because we wanted people to complete the room, instead attaching ending conditions to clues and whatnot, but it was interesting to see it emerge organically as one team was playing.

All credit to Tammy for coming up with this outlandish idea and making it an amazing reality.

The blog is going to go on a little hiatus for the next week or so — I’m only taking my iPad with me to Las Vegas, and I still haven’t migrated my Hugo-based workflow for this blog off my laptop. But hopefully back the weekend of the 22nd.


  1. Yes, we’re planning another. Because we’re crazy. ↩︎

The Week That Was

To sum up my week, I give to you an abridged exchange of a conversation with a Duke Energy helpline after a rather massive branch has fallen onto my roof and the power cables that run from the pole to my house:

DUKE: So what you just need to do is pull the branch off the powerlines. It should be very easy, and safe. IAN (in terror): You are asking me to pull the branch off the line? Isn’t that your job? DUKE: If you don’t feel comfortable doing that, then you can hire somebody, but it isn’t a service we generally provide—

Obviously, nobody in America grew up watching this:

(my non-British work colleagues were in awe of how hardcore the PIF is. I didn’t have the heart to tell them about Apaches or The Finishing Line1. They just aren’t ready for that just yet)

Anyway, apparently the magic words you have to tell the electrical company are not “why on earth have you not built an power grid infrastructure where electricity cables are buried underground, you absolute idiots,” and instead “oh, my lights are flickering.” If you say that, then they come around and take the branch down for fear of damaging their precious useless cables.

Other things that happened this week:

  • Having to take a plunger to the bathroom sink, resulting in all sorts of horrific black gunk going everywhere
  • Finding out that a missplaced - was the reason why my model autoscaling wasn’t working correctly for the past couple of months. Didn’t have any production impact, but my goodness YAML makes you feel stupid sometimes (the error messages were so completely obtuse that they failed to help either).
  • The amount of paperwork I have to find in my files just to renew my driving license in the next couple of weeks.
  • The cars I was interested in buying don’t have a rear windscreen wiper, making them pretty useless in the US. I wanted to drive around in this chunky pixelated boi! But no.
  • Waking up at 3:30am with my skin on fire and then, as I’m trying to go back to sleep, hearing Helvetica pawing on the carpet…which is not a good sign during the day, but especially not at night.

I know I said last week I’d talk more about the escape room, but I think I’m going to leave it until next week - we’re going to be doing a final video walkthrough of the room before we tear things down, so makes sense to go through things with a visual aid!

Oh, and expect another silly AI-related post shortly, as soon as I sort out the remaining publishing details…


  1. Obviously Apaches is the one everybody remembers, but the banality of the Sports Day setting in The Finishing Line coupled with the carnage makes it really harrowing to watch ↩︎

Escape Room Weekend 2

Second week of the Escape Room is over. One more week! I still can’t told about it much because spoilers, but hopefully a bit more of a discussion of it next weekend.

Some reshuffling of projects underway — Camouflage is being vastly scaled back as I’m not going to be able to meet the end-of-April deadline to get it started, and I don’t think I am able to really offer the support for running a year-long competition. Instead, it’ll just be a very silly paper that comes out at the end of the year. My comic anthology project is about to run into the brick wall of ‘Nicolás runs out of story to draw’, which is obviously nobody’s fault but my own…I have two more stories for the project, but have I written anything this month? Of course not.

But I have taken on another project, which we’ll call Cat Stevens for now. It’s an AI collaboration project! And should hopefully be wrapped up (mostly) by next weekend, provided I get HTML columns working and some little details ironed out. More on that soon!

I think April might be a month of cleaning up and rearranging things! I’m hoping to sort out a few things in the bar (more shelves, setting up the MiSTer station, etc.), and I do need to clear at least one wall for hanging up a poster. And maybe we can make the main bedroom look like somebody lives there by putting things on the walls. It’s only been four years, after all…

Escape Room Weekend 1

View this post on Instagram

A post shared by Ian Pointer (@carsondial)

(more next week)

CLIPPed Faces

When I was building the Adam Curtis search engine, I noticed that the combination of CLIP and FAISS was pretty good at coming up with good suggestions for “Tony Blair” and any other figure that you care to name that pops up throughout the documentaries. And I wondered - I’m sure most of these people turn up in the CLIP training set, being historical figures, but how well would it do on somebody that almost certainly wasn’t (e.g. me)?

import torch
import faiss
import clip
import numpy as np
import faiss.contrib.torch_utils
import glob
from PIL import Image

model, preprocess = clip.load("ViT-B/32", device='cpu', jit=False)
def encode_image(filename, id):
    image_tensor =  model.encode_image(preprocess(Image.open(filename)).unsqueeze(dim=0))
    image_tensor /= image_tensor.norm(dim=-1, keepdim=True)
    return image_tensor, torch.tensor([id],  device="cpu", dtype=torch.long)

Photos of me!

Recognition

Okay, so we’ll grab two images of me, encode them into vectors with CLIP, but obviously if those are the only two vectors I have to choose from, it’s not much of a test. But! I have the Adam Curtis FAISS index just lying around, and it has a great selection of talking heads and other things that makes for a relatively decent test (as Peter Snow would say, this is “just a bit of fun”). I know that the IDs in the Curtis dataset are 64-bit ids, so I’m going to fudge it with the new entries by using low-digit IDs that are not going to collide (and I checked beforehand just to make sure that I wasn’t getting collisions to be on the safe side).

faiss_index = faiss.read_index("curtis.idx")
ref_tensor, ids = encode_image("IMG_0331.jpg", 111)
faiss_index.add_with_ids(ref_tensor, ids)
check_tensor, _ = encode_image("IMG_4069.JPG", 0) 
distances, indices = faiss_index.search(check_tensor, 5)
indices
tensor([[                111, 1914273147895908598, 1911355963158792438,
         1914859604205340918, 1910780652289493238]])

The big surprise is that it does seem to work with no additional training being necessary! With just one photo added, it is already matching me amongst a 150k set of different images. Not too bad! Let’s just make sure that it’s working okay by doing a test against a picture of Mr. Tony Blair.

blair_tensor, _ = encode_image("blair.jpg", 0)

distances, indices = faiss_index.search(blair_tensor, 5)
indices
tensor([[7189953302034286838, 6916916776419100918, 7336140665801869558,
         7180745063950354678, 8920012398545733878]])

And here’s the first result, which is definitely Blair.

Image.open("/home/ian/notebooks/curtis/web/app/static/images/the_trap03_10415556398636929516_003333_7189953302034286838.jpg")

png

Anchoring With Text

The other thing I noticed when working on the search engine is that CLIP is pretty good at reading text. So another approach we could try is adding my name to one of my photos, encoding that and a bunch of other photos of me, then doing a search for “Ian Pointer” and seeing what comes back - whether it can anchor on the text on that image and whether the vector representation of that image is close enough to pull in the other versions of me in the index.

faiss_index = faiss.read_index("curtis.idx")

ref_tensor, ref_ids = encode_image("ian_text.jpg", 111)
check_tensor, check_ids = encode_image("IMG_4069.JPG", 222)

faiss_index.add_with_ids(ref_tensor, ref_ids)
faiss_index.add_with_ids(check_tensor, check_ids)
text_features = model.encode_text(clip.tokenize("Ian Pointer").to("cpu"))

text_features /= text_features.norm(dim=-1, keepdim=True).float()
r = text_features.to('cpu').float()
    
distances, indices = faiss_index.search(r, 5)

indices

tensor([[ 368881852814592245, 2327282344735017205, 9001564851015125238,
         6284035229181315318, 6287482820904650998]])

Okay, that didn’t work so well. But! What if we do something really stupid and just add more instances of my name on the photo so CLIP takes the hint?

faiss_index = faiss.read_index("curtis.idx")

ref_tensor, ref_ids = encode_image("ian_text_lots.jpg", 111)
check_tensor, check_ids = encode_image("IMG_4069.JPG", 222)

faiss_index.add_with_ids(ref_tensor, ref_ids)
faiss_index.add_with_ids(check_tensor, check_ids)


text_features = model.encode_text(clip.tokenize("Ian Pointer").to("cpu"))
text_features /= text_features.norm(dim=-1, keepdim=True).float()
r = text_features.to('cpu').float()
    
distances, indices = faiss_index.search(r, 5)

indices
tensor([[                111,  368881852814592245, 2327282344735017205,
         9001564851015125238, 6284035229181315318]])

So if you add a bunch of text to the image, CLIP will “read” the text, but it feels like the information encoded in the vector space is in a separate cluster to the rest of the image details, as we’re not seeing the other picture of me coming back on following searches. This surprises me a little, as I was seeing the opposite in test queries in the Curtis database, but it’s likely they were matching a lot more in the image clusters of the vector space regardless of the text it was finding.

Hiding

But what if I want to fool the system? Here, I’m taking the picture of Tony Blair, adding my name over the top (which makes me feel a little dirty, but whatever), and then searching for “Ian Pointer” again. Will CLIP be confused?

faiss_index = faiss.read_index("curtis.idx")

ref_tensor, ref_ids = encode_image("blair_text.jpg", 111)
check_tensor, check_ids = encode_image("IMG_4069.JPG", 222)

faiss_index.add_with_ids(ref_tensor, ref_ids)
faiss_index.add_with_ids(check_tensor, check_ids)


text_features = model.encode_text(clip.tokenize("Ian Pointer").to("cpu"))
text_features /= text_features.norm(dim=-1, keepdim=True).float()
r = text_features.to('cpu').float()
    
distances, indices = faiss_index.search(r, 5)

indices
tensor([[                111,  368881852814592245, 2327282344735017205,
         9001564851015125238, 6284035229181315318]])
Image.open("/home/ian/notebooks/curtis/web/app/static/images/cant4_15115732058354422251_003609_368881852814592245.jpg")

png

Again, CLIP zeroes in on the text, but the rest of the returned search items are exactly the same as before, so I don’t think it has been fooled all that much.

Wrapping Up

In this strenuous and stringent bit of testing, it seems like CLIP actually does have some value as a zero-shot facial identification system. Which is vaguely terrifying. It might be interesting to expand this idea out further, maybe with larger and more appropriate datasets like Celeb.A, or if you just happen to have a few million photos hanging around.

And remember, don’t have nightmares.

Bryan Adams Just Won't Leave

It’s been a while, but The Story of… is finally back as an accompaniment to the Friday night repeats of Top of The Pops. And isn’t it just a fun experience when they get to an act that currently looks like you’d bump into them on the high street as they were coming out of New Look, and they’re just full of joy about their time in the chart and their appearances on the show. Something I’ve missed since it seemed to be put on hiatus due to the pandemic and the semi-closedown of BBC4.

Also, watching it with an American is recommended. It’s more fun when you have to pause to explain Betty Boo, Chesney Hawkes, and The Wonder Stuff are, or expound on your declaration of “of course Bob is there! It’s Vic and Bob!", when they mainly know Bob Mortimer from Would I Lie To You?. And “yes, the ice creams are playing guitar. It’s the KLF, you just have to go with the flow”.

Next week? PEAK MR. C!

Actually, it’s been a banner week for iPlayer, as somebody deep in the bowels of the BBC has decided to put up The Young Ones and all of 2point4children. Sadly, the former are the cut versions, but I have the DVDs for them. 2point4children, though, is completely uncut, including those pesky music cues, and it’s probably the great lost big BBC sitcom of the 90s…ånd now, thanks to get_iplayer, I have all of it.

In local news, our escape room is really about to happen! We’re going to be putting the finishing touches on it this week, and our first run-throughs take place next weekend! For those of you reading that are in the area and would like to take part, why not head over to the website and see what dates are still available? Come see what we’ve done to the basement!!

Finally, keep your eyes peeled for, yes, some technical content this week! I know all of you reading this blog have been itching for some more neural network action, so that’s what you’re going to get. I remain somewhat obsessed with CLIP (though, in fairness, this upcoming entry is an idea I had about a year ago and just never actually sat down for a couple of hours to try it out until this week).