I don’t work here!

I guess it’s the laptop and the pile of towels that cause the confusion, but people keep asking me questions (usually in Spanish) about where to get towels from and whether they can use the pool at this hotel.

Dan, a white man with a goatee beard and a blue ponytail, sits at a poolside table in a hotel roof terrace, using his laptop alongside a pile of towels.

And I have to keep explaining that nope, I don’t work here, I’m just watching my kids play while I catch up on my RSS reader!

×

Dan Q found GC9Q6G6 PORTA DE BARCELONA

This checkin to GC9Q6G6 PORTA DE BARCELONA reflects a geocaching.com log entry. See more of Dan's cache logs.

A quick find exactly where it should be while driving from Tarragona to Barcelona. My family and I were in the area for the eclipse and then for a trip to PortAventura and are heading to Barcelona for a few days before flying home.

My partner and our kids went to the bathroom and snack bar while I jogged up to the bridge. The coordinates put my close but the hint moved me exactly where I needed to be. Strangely, I suddenly needed to tie my laces, and then just as suddenly the cache was in my hand!


On a semi-closed bridge over a six-lane highway, Dan, wearing a purple 'woo' t-shirt, throws a selfie camera a thumbs-up.

Thanks for breaking up this long journey (full of bad traffic!) for us. TFTC, and greetings from Oxfordshire, UK!

Casa Ventola

This week, I’m living in a villa on a vineyard about 9km North of Tarragona, on the East coast of Spain.

Under nearly-cloudless skies and surrounded by trees and olive and grape-laden slopes, a stone villa and its outbuildings sit prominently under the bright sun.
Gotta say, it’s a pretty place to walk the grounds of.

A large part of our choice of location for this trip was, of course, the total solar eclipse that’s expected this evening, whose path of totality just barely passes over this spot before disappearing somewhere over the Mediterranean.

A red and orange sunset with beams reaching up over the hilly horizon of climatically- Mediterranean farmlands.
We tested by watching a couple of sunsets that, at the time of day the eclipse will occur, the sun will still be visible over the horizon.1

26 years ago, almost to the day, I blogged about witnessing the 1999 solar eclipse from Paris, where we were fortunate enough that Europe’s cloudy conditions on that day broke just in time for a midday totality and a proper “diamond ring” occlusion. I’m not confident I’ll ever see an eclipse quite so spectacular again in my lifetime, but I’m hopeful!

Obviously the eclipse is a primary deciding factor in our location this summer, but this family holiday’s about more than just seeing the sun vanish and hoping that it comes back out again.

A freshwater turtle swims close to the rocky shore of a blue-green lake, peeping its head above the water.
For example, we’ve also braved the August heat for a variety of outings around the area, such as to the beautiful botanic gardens of Parc Samà where we met this curious little turtle.

I’ve been out geocaching a lot on the mornings, for example, as is my way when visiting any foreign country! I’ve enjoyed taking advantage of being a naturally earlier-riser than most of my family, coupled with the cooler morning temperatures, to explore the hills and forests of this region. And look: I found my thousandth ever geocache!2

The one downside3 of our accommodation is the lack of connectivity. There’s no wired Internet here, and the hilly location and stone walls make acquiring a reasonable cellular signal… challenging.

Dan, a white man with a short 'goatee' beard and a blue ponytail, sits in the drivers' seat of a left-hand drive car with a laptop perched between his belly and the steering wheel, giving a sarcastic grin to the camera.
To look into a Three Rings issue this morning, I first needed to drive down the hill and around the valley a short way to get line-of-sight to a cellular tower, in order to get more than one bar of 5G signal and tether myself a reasonable Internet connection!

Anyway: it’s beautiful and bright (and scorchingly hot!) out here, and I’ve got my fingers crossed for clear skies in eight hours’ time. Here’s hoping!

Footnotes

1 Without clouds in the way, the prettiest pictures of sunsets occurs just after this point, of course. I’ve spared you seeing a photo of an unoccluded sun, which – depending on the brightness fidelity of your screen – you’d possibly need to wear special shades to look at anyway?

2 I know, I know: I’ve been geocaching for sixteen years – I “should” have found more than that by now. Well, I’m pretty laid-back about the sport, and often only target caches with a reasonable number of positive reviews or that are otherwise interesting to me. I’m not so-interested in making the “number go up” as I am in exploring interesting places and seeing cool things.

3 Or is it an upside? It’s certainly keeping my focus on the world around me and away from screens!

× × × ×

Chuck Wagon

Apparently, zero of the imagineers building this Disneyland Paris cafe conceived that “Chuck Wagon” sounds like what a cowboy would call a wheeled vomit trough. 😂

Faux Old-West building painted with lettering identifying it as the Chuck Wagon Cafe.

×

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!

Navigo app saying I have 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.

Dan, a white man with a ponytail and a goatee, site in a Parisian cafe sipping a glass of white wine.
If I’ve got to navigate my way through Paris’s public transport network… I’m going to need a drink first.

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.

A row of ticket gates in a London Underground station.
Tap in, tap out. Unless you’re eligible for discounted travel, you probably might as well use your debit card to get around London. Photo by Luca Sammarco.

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.

Crowds file down the escalator into Charles de Gaulle-Étoile station.
Tap in, pay a premium for the privilege. Thanks, Paris! Photo by Candelario Benítez.

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.

× × ×

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.

Screenshot showing a web form with Dan Q and three other passengers on the outbound leg of a journey. Personal details appear to be blurred, but are actually spoofed AND blurred, per Dan's tradition. A 'Return passenger information is the same' checkbox is checked.
You’d think that to specify different passengers for the return leg, all I’d have to do is uncheck that checkbox, right? Wrong!

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:

  1. 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,
  2. 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.

  1. When you log in, it makes a POST request to https://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.
  2. 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 */
}
  1. Once you’ve made some changes, you press “Save”. This triggers a POST request to https://nextus-api-prod.leshuttle.com/b2c-api/GuestApi/Save with Content-Type: application/json and 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!

×

Food divided by Distance

I was pretty ill yesterday. It’s probably a combination of post-flood stress and my shitty lungs’ ability to take a sore throat and turn it into something that leaves me lying in bed and groaning.

I spent most of the morning in and out of a fitful sleep, during which I dreamed up the most-bizarre application: a GPS tracker app that, after being told your destination and what you were eating, reported your journey progress to social media by describing where you were going and how much of your food was left1.

Mastodon status 'Walking to class, eating a cheese sandwich' with a map showing a route to a University campus with a walking route indicated, and a flag about three quarters of the way along labelled 'Eating a quarter of a cheese sandwich'.
The “eating progress” could either be updated to the status itself or overlaid onto a map of the route.

I should be clear that in the dream, I wasn’t the one that invented this concept; in fact, I didn’t even understand it at first (maybe I still don’t!). In the dream I was at some kind of unconference event with a variety of “make art with the Web” types, and I missed a session by falling asleep2. I woke (within the dream) right before the session ended and rushed in to see what was being presented, and only got the tail-end of the explanation of how a project – this project – worked, after which I felt rushed to try to understand it before somebody inevitably tried to talk to me about it.

But it could work, couldn’t it? If you’re one of those people who routinely tracks and shares their location (like Aaron Parecki, whose heatmapping inspired my own) or journeys (like Jeremy Keith does), it’s a way to add a bit of silliness to that sharing.

Bluesky status saying 'Flying to Manchester, eating half a bag of salted peanuts', with a FlightRadar24-style illustration of a plane half-way across its journey over the Irish Sea.
For times you’re disconnected or otherwise unable to self-track, tools like FlightRadar could step in.

I’m probably not going to implement this. It is, in the end, the kind of stupidity that could (should?) only appear in the dreams of somebody who’s got a bad head cold.

But if you manage to take this idea and turn it into something… actually good?… let me know!

Or if you’ve just got a cool, “Web 2.0-ey” idea for the name of an app that tracks both your journey progress and your meal consumption, I’d love to hear that too.

Footnotes

1 Under the assumption that its consumption would be evenly distributed throughout the journey. Because everybody does that, right? Counting the number of steps they make before taking another equal-sized bite. Right?

2 Even in my dreams, I can dream of falling asleep. And, sometimes, of dreaming. A fever probably helps.

× ×

F-Day plus 12

It’s now twelve days since a flood struck my house, causing the ground floor to be submerged under a couple of feet of water and ultimately leading us to kick off an insurance claim process.

A home office with its floor stripped down to poured concrete and an industrial dehumidifier running.
My regular home office of the last six years sits stripped-down, with no flooring, skirting boards, or power (with the exception of the specialised circuit powering an industrial dehumidifier).

And man, a home insurance claim seems to be… slow. For instance, we originally couldn’t even get anybody out to visit us until F-day plus 10 (later improved to F-day plus 7). The insurance company can’t promise that they’ll confirm that they’ll “accept liability” (agree to start paying for anything) until possibly as late as F-day plus 17. Nobody will check for structural damage until F-day plus 191.

Oh, and the insurance company have advised us to look for something like a “12 month let with a 6 month break clause”, which is horrifying. We could be out of our home for up to a year.

Dan, a white man, stands with his arms raised outside a nicely-decorated converted barn.
Right now, though, we’re spending two weeks in this holiday let about half an hour’s drive from our house. It’s pretty nice, except that we have to commute over the ever-congested single-lane Burford Bridge to get the kids to and from school every day2.

Some days it feels like being stuck in a nowhere-place… but simultaneously still having to make the regular everyday stuff keep ticking over. Visiting the house- currently stripped of anything damp and full of drying equipment – feels like stepping onto another planet… or like one of those dreams where you’re somewhere familiar except it’s wrong somehow.

But spending time away from it, “as if” on holiday except-not, is weird too: like we’re accepting the ambiguity; leaning-in to limbo. Especially while we’re waiting for the insurance company to do their initial things, it feels like life is both on hold, and not-allowed to be on hold.

A nervous-looking French Bulldog in a teal jumper looks up from under a desk.
The dog gets it. I had to take her to the house for a while on Monday3 and she spent the whole time leaning against my feet for reassurance.

And I worry that by the time they’re committed to paying for us to stay somewhere else for at least half a year, they lose any incentive they might have to contract for speed. There’s no hurry any more. We’re expected to just press pause on our home, but carry on with our lives regardless, pretending that everything’s normal.

So yeah, it’s a weird time.

Footnotes

1 I’m totally committed to this way of counting the progress, which I started on F-day plus 3. I get the feeling like it might be a worthwhile way of keeping track of how long all of this takes.

2 Normally, the younger and older child are able to get to school on foot or via a bus that stops virtually outside our house, each day, so an hour-plus round-trip to their schools and back up to twice a day is a bit of a drag! We’re managing to make it work with a little creativity, but I wouldn’t want to make it a long-term plan!

3 And do some work from there, amidst the jet engine-like noise of the dehumidifiers!

× × ×

Sky potholes

Amusing announcement from the captain of my plane out of Tenerife South this afternoon. In place of the usual recommendation to keep your seatbelt fastened while seated in case of turbulence, he advised that there was a “risk of potholes”.

I’m sure the analogy makes sense to the Brits aboard, but I hope it translated well for the Spanish speakers on this plane!

Dan Q found GC45BDD Mirador La Paz

This checkin to GC45BDD Mirador La Paz reflects a geocaching.com log entry. See more of Dan's cache logs.

My partner Ruth and I are staying at the Meliá hotel down in the city, from which amazingly I was able to get a WiFi connection despite the considerable distance!

Dan and Ruth stand on an overlook, pointing at a seaside Meliá hotel in the distant city below.

As others have observed, the hint is misleading for this cache. Substitute the word “right” in place of the word “left” and the hint makes more sense!

SL, TFTC! And thanks for the great view!

×

Dan Q did not find GC1PYFN Parque Taoro

This checkin to GC1PYFN Parque Taoro reflects a geocaching.com log entry. See more of Dan's cache logs.

Ruth and I made several attempts today without success: a muggle was sat nearby in such a way that access to the GZ was obstructed. We took a walk to the nearby Anglican church – whose architecture, if you ignore the volcanic rock, is uncannily like that of Anglican churches in the UK – but then we returned the muggle had very much set up camp and was going nowhere. We attempted to find a way to the cache from the opposite side without luck, and eventually had to give up. 😔

Dan Q found GC9MCDM The Queen Of Mystery

This checkin to GC9MCDM The Queen Of Mystery reflects a geocaching.com log entry. See more of Dan's cache logs.

After solving the riddle yesterday, my partner Ruth and I came up from the seafront to find this cache today. What a delightful spot to hide the cache, and what a wonderful puzzle (and spot of local literary history) with which to bring us here.

Dan leans against a wall in a tropical park, writing on a log sheet.

SL, FP awarded. Greetings from Oxfordshire, UK. TFTC!

×