While I wait for GitHub to get their act together on my Dependabot Wishlist I’ve created a little script for my first frustration – rollups.

Another morning, another patch release of Dart, another 4 Dependabot PRs in my inbox:

Only this time I was able to simply run:

rollup.sh 1247 1250

and the subsequent 3 PRs were rolled into the first, which I could then approve, and merge once CI had passed :)

Here’s the script (also on Gist), which depends on having the gh command line tool installed, and that’s run from the root of a clone of the repo concerned (I keep the script itself in ~/.local/bin/, but obviously anywhere on the PATH will be fine):

#!/bin/bash
if [ $# -ne 2 ] ; then
    echo "Usage rollup.sh <BASE_PR> <LAST_PR>"
    exit 1
fi
BASE_PR=$1
LAST_PR=$2
git pull
gh pr checkout "$BASE_PR"
for (( i=(($BASE_PR + 1)); i<=$LAST_PR; i++ ))
do
   PR_BRANCH=$(gh pr view "$i" --json headRefName -q .headRefName)
   git merge origin/"$PR_BRANCH" -m "build(deps): Rollup merge branch for #${i} ${PR_BRANCH}"
done
git push

It would still be nicer to say ‘@dependabot rollup #1247-1250‘ but for now that little script achieves the same outcome. 


February 2023

28Feb23

Pupdate

Milo’s chemotherapy has been a bit of a rollercoaster ride, with a setback along the way; but he’s back on track and has now completed the first round. He’s back to looking and behaving like the pup he was before any of this started, and Max seems happy to have his brother back on form.

Milo sporting the compression bandage from his final dose of chemo for round one

15 years of this blog

I missed this last month, but it’s now been over 15y since I said Hello World here. Tim Bray is 5y ahead of me, and I share many of his sentiments from Two Ongoing Decades.

USB-C charger report

At the start of the year I wrote some reviews of USB-C power banks and wall chargers. I’ve now had the chance to try some on travel.

The Anker 737 power bank has been excellent, and is certainly worth the travel weight. At MWC it’s been able to keep a Pi4 and a travel router going for a full day on the stand,

The Anker 543 charger has mostly lived up to expectations. It can be a little slow charging the 737 if there’s other stuff plugged in, but never problematically. I did however realise that I needed another USB A output for my travel router, so a multi adaptor has been returned to the EU travel pack.

Trigger’s AirPods Pro

My AirPods Pro have become like Trigger’s broom (or the Ship of Theseus) as there’s no original part left now that both earpieces have been replaced (twice in some cases) along with the charger/holder.

There’s a part of me wishing I’d just bought some AirPods Pro 2 before Christmas when the charger failed :/

Solar Diary

The main news for the past month is that I’ve seen the iBoost working properly after replacing the thermostat on the water tank.

At this stage I’m going to assume that EDF have silently cancelled my application for smart export guarantee (SEG) and reapply :(

Beating Beat Saber

Some more full combos on tracks in the Lady Gaga pack, but not much play this month as the weather has been better for longer dog walks (and Milo’s in better shape to go on them).


After last week’s setback everything went well for Milo’s third dose of chemo. His white cell count was right back up to normal levels, and the injection seemed to have no impact on him.

As we approach the final dose for this round of chemo it seems that the best case picture painted by the specialist has come true. Apart from a few shaved bits of fur there’s no sign that there was ever anything wrong with him. He’s back to full energy and enthusiasm for everything, and putting weight back on that’s bringing back his original physique.

Milo Destroyer of Toys back in action

While it’s great to see him back in form, it comes tainted with some sadness. We know where this rollercoaster ride will end, with a young dog acting like an old dog; so we do our best to enjoy the extra months (hopefully years) of health and happiness that the treatment buys us together.

Past parts:

1. diagnosis and initial treatment

2. first setback


Milo was supposed to have his third dose of chemo today, an injection of Vincristine, but that didn’t happen, as his white cell count was too low.

It was a bit low when he went for his Cyclophosphamide tablets last week, but the specialist gave the green light to proceed. This time around it was far too low; so we’ve been asked to go back in five days, and he’s on a course of antibiotics in the interim. The only thing that’s continuing per the original plan is the steroids, and we’ve now hit the stage where he’s down to half a tablet per day rather than a whole one. It will be interesting to see if his energy levels stay up.

One of the drawbacks of chemo drugs is that they can supress the immune system, which is why an essential part of the protocol is testing the white cell count before giving any drugs.

Past parts:

1 – diagnosis and initial treatment


After a few years away from the slopes due to COVID it was time to get our skis on again.

My daughter was going to join a University trip to Tignes, leaving me to figure something out for myself. But at the last minute she decided she’d rather do another trip together. I asked if she’d like to go back to a previous place or try somewhere new, and novelty won out. I then asked my sister (who’s done a few seasons over the years) for a recommendation, and the Three Valleys came out on top, with a leaning towards Courchevel.

The view from our hotel window

Package

I’ve not done a package holiday since the 90s, but when I started looking for accommodation everything seemed to be crazy expensive, or badly out of the way. So eventually I found myself on the Inghams site booking everything together.

The bundle of accommodation, flights, transfers, lift passes and kit hire came to maybe 50% more than I’d paid for previous trips. But that included half board, and we were going to a top notch resort – Courchevel 1650 (aka Morinod).

I thought my sister would laugh at me when I confessed that I’d bought a package, but she said that she quite often did the same, and thought that the costs could even out.

Chambery – best avoided

The package included charter flights to and from Chambery, a small regional airport up in the Alps that’s closer to the resorts. When booking I vaguely recall an option to pay extra for further away airports like Geneva, and thinking ‘why would I pay more for a longer transfer?’.

Now I know: Chambery is a total disaster area on ski season Saturdays, when hordes of charter flights descend on an airport that’s just not set up for the volume of passengers.

Our flight in hit a double whammy. Firstly we left Gatwick 2h late due to equipment problems[1]. Then we sat on the tarmac for 1.5h due to backlogs in baggage handling and passport control caused by any earlier ‘security incident'[2]. There had also been a serious accident on one of the access roads that messed up transfers, so we waited another hour for a taxi.

Instead of getting to Courchevel in time for dinner we got there just before midnight. Props to the reps though; at the airport they’d handed out snacks[3], and at the resort they’d taken care of hotel check-in.

Location, Location, Location

Hotel Cascades could not be better situated. The ski hire place was on the other side of the bar, in the same building.

Left: Hotel Cascades (entrance under the Terresens sign)
Centre: Le Schuss bar
Right: Intersport ski rental

And across the road, the escalator up to the Ariondaz lift.

The escalator up to the Ariondaz lift (view from Hotel Cascades lounge).

From that lift it was a run down to Aiguille Du Fruit, and then Marmottes or Suisses to the Saulire pass providing access to Courchevel or Meribel.

Food

A few weeks before departure Inghams sent a note saying that the hotel couldn’t provide dinner due to staff shortages so we’d be served in local restaurants instead. This turned out to be a major win, as Bistro C put on a very fancy (and typically French) three course set menu each night.

Fillet mignon with darphin potatoes, mushrooms and mushroom mouse

Apart from Monday, when we went to Bistrot Manali, where they served fondue (saving me from contemplating breaking away for fondue on another evening).

💩🤮

Unfortunately there was a winter vomiting bug going around the resort. We first heard of it over breakfast on Tuesday morning, and my daughter ended up missing skiing and dinner on Wednesday. She also opted for pizza for dinner on Thursday, as she wasn’t ready to face a 3 course set menu of rich fancy food.

Some folk were blaming the restaurant(s), others the cleaners at the hotel. I took the view that these things are impossible to contain in environments where there are a bunch of people together; just look at what happens on cruise ships.

The friends we make along the way

The taxi from Chambery was shared with John and Sue, and we kept on bumping into them at dinner etc. Near the end of the week we joined John for a trip over to Val Thorens and Orelle, as he’d spent much more time in the resort over many previous trips. I hope I’m still skiing that well at 84.

While my daughter was unwell I headed for Mont Vallon to try the runs on either side, on one of the lifts up I heard a very not French ‘excuse moi’, from somebody joining me in the lift, and Sean ended up joining me for a few runs and a bit of a chat on the lifts.

Equipment

Inghams offered some discounts on ski rental as I’d got lift passes from them, and as usual I opted for the top package on offer, in this case labelled ‘Black’ in the hope of getting good quality, recent gear.

Helmets weren’t mentioned, and it wasn’t even clear if they were available as an extra, so I got some Kuyou helmets (affiliate link) from Amazon. They turned out to be comfortable, and seemed to do the job on the one time I did something silly that resulted in my head hitting the piste. We both liked the flip down visor as an alternative to goggles, though I seemed to make a habit of losing my right hand contact lens on the last run of the day from too much wind past my eye.

After quizzing me about my skiing preferences the shop produced a pair of 2016 Atomic Redster XTs. The tops showed they’d had plenty of prior use, but the bases were in great condition, and they glided well on piste. After a couple of days though I felt that they were good, but not great. I liked them, but didn’t love them. Returning to the shop they swapped me over to some 2016 Kastle MX78s, which turned out to be great skis, and definitely in the same league as the Lecroix Mach Carbons that have become my benchmark for goodness.

Ski Tracks

I did a mini review of Ski Tracks last time around, but this was my first trip using it throughout.

At first I was using my watch to record individual runs:

But that was a bit tedious, and also fraught with the risk of dropping my glove from the lift, so I switched over to just recording whole days:

I can see that I’m generally holding back to ~35mph, except on the runs where I can safely go faster (due to low traffic and clear sight lines):

The skiing

The Three Valleys is the largest connected ski area in the world, so there was no way we were going to ski it out in a week. But I feel like we certainly got to try the best bits, so I didn’t leave hankering for legendary runs we’d not had the chance to take on… With one exception. L’Eclipse was created a few years back for the 2023 World Championships, and seems like an absolutely epic run. But the it was closed whilst we were there, as those Championships started days after we left, and they wanted the course in tip top condition.

I contemplated having a crack at The 3 Valleys Escapade, but we’re not usually up for the first lift :/

Best of the Blacks

Jean-Blanc runs from a similar starting point to L’Eclipse, down to the same destination, Le Praz, cutting through woods to either side. It’s beautiful, and there were times we ran it without seeing another soul.

Dou Des Lanches was probably my favourite, a nice quick and clean run with great visibility where you can just throw yourself down the fall line.

M gets a worthy mention as one of those runs that keeps unfolding fresh challenges as you progress through it.

Pick of the Reds

The back half of Rochers was often the speedy bit of the last run for the day, though sometimes we’d loop back up on Chapelets to take it from the top.

Campagnol was worth the side trip to Mont Vallon, But sadly Combe du vallon was too cut up to be fun, and the connecting run along Ours was slow and boring.

Bouchet was the highlight of our trip to Orelle (and it’s a shame the zip line at Col de Thorens was closed).

Beautiful Blues

Folyeres was recommended for a scenic run down to La Tania, and didn’t disappoint.

Pic bleu also delivered a high smiles/miles ratio :)

Sunset from our hotel window

Getting home

After a bit of hanging around in the (very comfortable) hotel lounge the bus trip back to Chambery was uneventful.

Chambery itself was just as bad as expected. There were tons of people milling around outside, as there simply wasn’t space inside. We were lucky to check in without a queue and get some seats to wait on. It wasn’t long until check in was a zoo, and there was hardly space to move.

The best thing about security theatre is that every performance is an audience participation event

Me, every time I’m going through an airport or bag check line

I don’t think I’ve seen a more shambolic performance of security theatre since the early days in JFK post 9/11 when they still had National Guards adding to the chaos quotient. So far as I could tell nobody got through the metal detectors without needing to take their shoes off and be subjected to a pat down. There just wasn’t any flow.

At least once we got through that there wasn’t much hanging around involved in boarding.

But once on the plane there was a bunch of hanging around for bags to be loaded, and then more time waiting for inbound flights to land, as they only allow one aircraft at a time in the very tight valley. We landed at Gatwick only 30m late, having caught up a little on the way, so not too bad in the end.

Conclusion

It was a brilliant week, apart from the flights, and I’d certainly consider using Inghams again; I’ll just try to avoid Chambery.

The Three Valleys area was great, and I’m sure I’d enjoy skiing there again (and having a crack at L’Eclipse). But there are plenty of resorts I’ve not been to yet. So maybe somewhere else next time…

Notes

[1] A replacement aircraft needed to be flown in from Stansted, and then a bunch of seat allocations had to be redone due to a different layout.
[2] The entire terminal had been evacuated (over a left behind laptop?) so those who’d gone through security had to do the whole rigmarole again.
[3] The crisps and Curly Wurly were nice, but the offer of a sandwich came too late as I’d already grabbed one from the kiosk outside.


January 2023

31Jan23

Pupdate

I shied away from mentioning that Milo was ill last month. I guess I was hoping that he’d bounce back soon, and I didn’t want to worry anybody. But January brought terrible news, as it seems he has lymphoma. He’s started chemotherapy, and I hope I get to mention what he’s been up to on plenty more pupdates.

Good Apple

I previously mentioned that Apple had been great in sorting out a replacement iPhone, when my daughter’s SE2020 failed. Well… she broke the screen on that one, and once again Apple came through with a repair that got it working again. Nothing for free this time, but the £159 to get the screen repaired was a lot less than buying a replacement handset.

Bad MBNA

Back when I was in the Navy I applied for a credit card that was issued by MBNA. They were arsey about my address (a Naval base) and wanted my service number, which seemed like something they’d never inflict on a civilian. So I decided to take my business elsewhere.

Many years later MBNA took over a loyalty card I’d got, and then the loyalty card was withdrawn, and MBNA gave me a cashback card offering 0.5% cashback, and market rate FX. It was a sweet deal, and I used it as my main card for many years (despite the FAR too frequent declines on Apple Pay).

It seems sadly they decided to get rid of me as a customer, and started pulling out the reversion marketing tricks.

It started with my trying to pay for my daughter’s university accommodation. A chunky online transaction, but one I’ve done before with that card. First attempt, declined – maybe I got the SMS code wrong? Second attempt, declined – I definitely got the SMS code right that time; MBNA lose the business, and I use another card.

The following day I tried to buy some clothes online. Declined. Then my wife calls to say her companion card has been declined in a cafe. I call customer services, they say call the fraud team. I called the fraud team, who (eventually) tell me that both cards will be good to go again in 10m.

An hour or so later I buy something on Amazon; and a bit after that there’s an email to say that the payment’s been declined.

I call the fraud team again. This time they tell me that Visa has put the card on ‘3 day hold’. After a bit and back and forth I’m told I can make a complaint, and we start that process. They hang up on me before the complaint is registered.

So now I have a new Amex Platinum Cashback card, and a John Lewis Partnership Mastercard.

The miserable thing is that those cards come out top in customer satisfaction, at less than 75% :0

It seems there’s no longer such a thing as a GOOD credit card, just (sometimes) less bad ones; but if anything goes wrong the experience will be awful. All the online reviews are a sea of 1*s recounting awful experiences (though no mention elsewhere of ‘3 day hold’). My read is that fraud has become so endemic that all customers are treated as psuedo-fraudsters, and it doesn’t matter how much business you bring in.

Skiing again

After almost 4 years I’m back on the slopes. This time in Courchevel (after my sister recommended The 3 Valleys). I’ll follow up with a full report, but so far the skiing has more than made up for a less than ideal journey to the resort.

Contact lenses again

I wore contact lenses all day every day for most of my adult life. Then middle age long sightedness teamed up with the short sightedness I’d had since my teens, and contacts became less practical. I still wore them for things like skiing though. But I haven’t been skiing for four years, so it’s kind of weird to be using lenses again. Extra weird is I’ve managed to lose my right lens on the final run down for the past two days. Maybe the visor on my new helmet doesn’t keep the wind out as well as my old goggles?

Solar Diary

January brought a cold snap, but that meant quite a few sunnier days, so generation was almost back to November levels with 110kWh.

Still no word from EDF on Smart Export Guarantee.

Beating Beat Saber

More lousy weather, and a sick dog, has meant less walking, so (particularly at weekends) I’ve been topping up my exercise once more with a bit of ‘swords’. I got the Lady Gaga pack, which is 100% bangers. There are a couple of harder ones in there, but I managed Full Combo first try on one song, and most of the others feel easily in reach.


TL;DR

Milo was only 18 months old when we noticed the lump on his neck, and it took some weeks to reach a diagnosis, but it seems that he has cancer (bad), specifically lymphoma (very bad), more specifically lymphoma with Mott cell differentiation (aka Mott cell lymphoma [MCL], which is maybe less awful than other types of lymphoma). He’s started on chemotherapy, and early signs are promising.

Milo sporting the compression bandage he got at the injection site for his first round of chemotherapy

Hi

I expect there will be two types of people reading this post:

  1. People who know me, and perhaps know Milo from my daily #pupdate posts on Twitter.
  2. People who’ve got a sick dog who are looking for more information. I hope this helps, but I caution that this is the story of one little dog, with his own specific set of circumstances; so please talk to your vet about your own dog’s symptoms and treatment.

Diagnosis

From first noticing that something was wrong (a lump on his neck) to a lymphoma diagnosis from a scan took 7.5 weeks. This was pretty scary when reading online that the average survival for a dog with lymphoma is 4-8 weeks. We lost a lot of sleep in the first days after the scan.

As I write this were still not 100% sure that it is lymphoma, but sure enough that we’ve started treatment, because there’s an obvious risk in waiting.

Sickness and lump

On the final Sunday of November 2022 Milo was sick late in the afternoon. By bedtime he’d been sick some more, and was looking VERY sorry for himself. He seemed better in the morning, and ate his usual breakfast kibble, so if it wasn’t for the lump that my wife found on his neck we might not have even taken him to the vet.

The vet thought it was gastroenteritis brought on by something he ate (he and his brother are prone to scavenging things when out on walks). His temperature was normal, but she suggested a bland diet (chicken and rice) for a few days. He weighed in at his normal 5.5kg.

It wasn’t clear if the lump was connected to the sickness, or something else. The vet suggested bringing him back if it wasn’t gone in a week or so. She also took time to outline all of the possibilities, including that it might be a swollen lymph node caused by lymphoma; and the diagnostics that would be associated with that – everything that followed over the next weeks. We could have gone all in right then, and done all the tests (and a specialist referral). But that would have been a lot of bother for Milo, and a lot of cost. Given his age and general wellbeing the odds of the worst case seemed very remote.

Milo came home, enjoyed his chicken and rice, and seemed to bounce back to normal. But the lump remained.

Needle biopsy

We took Milo back to the vet, and he re-examined him, culminating in taking some samples from the lump. A few days later we got the results, which confirmed that it was a lymph node, but were otherwise ‘non diagnostic’ – there was no indication of a problem.

An unwelcome Christmas present

As I was finishing up Christmas dinner I saw Milo repeatedly sitting at the garden door to go outside. He’d then go out, come back in, and then minutes later be back at the door. When he pooped on the floor I was a little cross with the rest of the family for not letting him out. But we got things cleaned up, and a day later returned to the chicken and rice diet as he seemed to have an upset tummy again, and the vets was closed for the Christmas break. He was still eating enthusiastically, and enjoying walks, so not a case for the emergency vet. But an ’emergency’ appointment for first day back to work.

The vet gave him some antibiotics, which seemed to make him bounce back. She also asked us to continue with the chicken and rice, and to collect faecal samples as she’d noticed ‘some firmness’ in his bowel. He was booked in for a blood test the following day.

Blood test

The blood tests came back pretty much clear. Everything was normal apart from excess reticulocytes (immature red blood cells), and that was explainable by the fact that there had been some blood in his poop, so of course he’d be making fresh blood cells.

Faecal test

The vet wanted 3 samples from consecutive days, but we didn’t have 3 samples as the New Year weekend approached; so it was after the long weekend before the samples went for analysis.

Giardia

The faecal tests picked up antigens for Giardia, a parasite that can cause gastroenteritis, and Milo was prescribed a course of Panacur to treat it. We also started feeding him Royal Canin gastrointestinal (GI) loaf, as he’d been eating a LOT of chicken and rice. As we were getting towards the end of the course of Panacur he was sick again, so the vet prescribed a few more days of treatment.

Scan

It was time to get a scan, of the lump, and his tummy. I called up the vets to make an appointment, and their scanner was away for servicing – for up to two weeks.

Over the weekend Milo was visibly lacking energy and losing weight, so back into the vets for an appointment on Monday morning. He’d dropped to 5.2kg, and the vet was concerned about what he was feeling. Luckily the scanning specialist was due the next day, and had time to see Milo too.

The interpretation of the scan was the worst news – signs of lymphoma. Samples had been taken for cytology. An appointment with a specialist oncologist at North Downs Specialist Referals (NDSR) was recommended.

We started reading:

This all seemed like bad news. It had taken 7.5 weeks to get to a diagnosis, and we were reading that dogs with lymphoma usually last 4-8 weeks. It felt like we were running out of time.

NDSR called the following morning, their next available appointment was almost a week away. Milo seemed to be going downhill fast (maybe in retrospect the result of being sedated and poked around), and it felt like he might not make it that far.

Cytology

Meanwhile the report came back with an interpretation of ‘Consistent with lymphoma’ – not a definite diagnosis, but a fairly strong leaning. There was also a comment:

The two sets of slides contain similar predominant populations of intermediate round cells displaying features most consistent with lymphoid origin and lymphoma as you suspected. However, interestingly there are areas in which Mott cells appear over-represented and given the young age of this patient and breed, lymphoma with Mott cell differentiation is a possibility. To further the diagnosis and confirm the exact type of lymphoma will require histopathology and likely immunohistochemistry.

Veterinary Clinical Pathologist

This lead us to Clinical characteristics and outcomes of Mott cell lymphoma in nine miniature dachshunds, which was cause for some hope – MCL is less bad than other varieties, and one of the dogs in the study was still alive after over 1500 days.

Specialist

Milo had picked up a little in the days before we visited the specialist, so as he was taken in to the consulting room he didn’t appear too bad. A little thin, but otherwise OK.

Although there were strong indications of lymphoma, the specialist still wasn’t sure. He offered three possible course of action:

  1. Treat the symptoms, using steroids. But don’t start cancer treatment.
  2. Further tests to confirm cancer (and what type), but wait for confirmation before starting treatment. The range of possible tests included:
    • A PCR for Antigen Receptor Rearrangements (PARR) test on the samples taken during his scan.
    • Flow cytometry, which would require another scan and associated sedation.
    • A surgical biopsy, which would require general anesthetic.
  3. Start chemotherapy, and run a PARR test in parallel (and perhaps further tests if the PARR wasn’t definitive).

I picked option 3. NDSR could start the chemotherapy straight away, and then my local vet could pick things up. Or we could do it all with our local vet. In the end our vet wasn’t able to start right away, and also wasn’t able to get some of the drugs. So we were back at NDSR the next day to start there.

It was also good that we’d got the scan done by a specialist, as those results were trusted, meaning that there wasn’t any push to redo tests that had already been done.

Chemotherapy

Doggy chemo isn’t the same as with humans. Firstly only certain breeds suffer from hair loss, but also the severity of treatment is much less. The aim is to get an extended quality of life rather than to ‘cure’ the cancer. A good friend who’d lost a dog to lymphoma put it something like this:

With people you can hit them so hard with chemo that they might feels like they want to die, but ultimately they get better. If you do that to a dog they lose the will to live and they do die.

Milo is on a CHOP protocol, which consists of giving him a doses of three different drugs in a rotation:

  • Vincristine (injection)
  • Cyclophosphamide (tablets)
  • Vincristine again
  • Doxorubicin (intravenous infusion)

For the first month he gets one of those weekly, along with daily steroids. For the second month the weekly doses continue, but without the steroids. After that the pace eases a little, with treatments every 2 weeks for another 4 months. All being well, he’ll be done in time for our summer holiday in the Lake District.

Each time he goes for a treatment he needs a blood test, to confirm that his white blood cell count is normal; and along the way other tests (and scans) might be needed.

It could just be the steroids, but Milo has bounced back pretty quickly. Within a couple of days his poop was back to normal, and a day later he was back to play fighting with Max. He still needs to put some weight back on, but the early signs are promising.


GitHub is at the heart of how I do work, and Dependabot is one of the core tools. Even before we started using OpenSSF Scorecards, which pushed us to pin dependencies, Dependabot was something we used a lot to ensure that things were up to date.

But, Dependabot isn’t perfect, and looking at the discussion threads involving those who support it, there might be some underlying problems that are stopping things from being improved. That of course leaves the door open to new tools, which can hopefully do what Dependabot does and more (or perhaps augment Dependabot functionality – maybe I just need a bot for my bot).

Rollups

For many package managers I need to configure Dependabot for each location that it will find files defining dependencies. If I have Dockerfiles in four places then I’ll get four pull requests (PRs), even if the FROM line is the same across them. Merging those PRs separately gets time consuming, as each merge to trunk turns into a rebase for the next PR, and each rebase means another run through continuous integration (CI) tests.

Nobody wants to sit and wait for tests to run.

The workaround for this is to rollup the PRs. I can git checkout the first PR’s branch, and then git merge each of the subsequent PR branches. One approval, one run through CI, one merge that closes all the PRs at once.

But that’s a manual process. I’d much rather say (in PR #1234): @dependabot rollup #1235 #1236 #1237 and it can take care of the merges for me.

Of course all of the above would be less of an issue if we could configure Dependabot with lists of locations rather than have to repeat configs around single locations…

Class approval

We have the OpenSSF Scorecards action deployed to 13 repos, which means every time ossf/scorecard-action gets bumped that’s 13 PRs, and every time github/codeql-action/upload-sarif gets bumped that’s another 13 PRs. This quickly gets tedious.

What I’d like to do instead is one review (an instance of the class), which then automatically approves (and merges) all the others.

Dealing with Dependency Cascades

There are places in the Atsign code base where I’ve consciously decided not to pin dependencies, because every release results in a new Docker image, and every new Docker image would yield in a new SHA that has to be pinned against – a dependency cascade, which potentially becomes a dependency cyclone, only moderated by the Dependabot (typically daily) schedule.

Of course circular dependencies are a problem almost as old as using dependencies, and there’s no easy answer here; but I’d like to be able to define some behaviours e.g. these hashes come from the last release, don’t create another release when they’re merged to trunk, or we’ll be at this forever.


Queueing theory is the mathematical study of waiting lines, or queues.

Wikipedia – Queueing theory

This is timely, as the big news of the day is that our Prime Minister, Rishi Sunak, wants all pupils to study maths to age 18. So maybe this is one of the things people should be learning about (in addition to bank balances, household budgets, taxes, interest rates etc.).

An example

Imagine a busy Accident & Emergency department that only has one bay free. Patients take an average of just 10 minutes to triage and treat, and they arrive at the rate of 5.8 per hour.

What will the expected waiting time be?

With only one bay open, patients will have to wait nearly five hours on average before they are seen.

What happens if you’re able to free up another bay?

If you open a second bay, the average waiting time is not just cut in half; it goes down to about 3 minutes. The waiting time is reduced by a factor of 93x.

Why was the wait so long with one bay?

There’s not enough slack in the system.

Patients are arriving every 10.3 minutes on average and are taking 10 minutes to see on average. If patient arrivals were exactly evenly spaced and each took exactly 10 minutes to treat, there would be no problem. Each patient would be seen before the next arrived. No waiting.

BUT… the service and arrival times have to be very close to their average values to avoid a line, and in reality that’s not how things happen. On average there will be a long line, 28 people. But with a second bay, it’s not likely that even two people will arrive before one of the bays is free.

Adapted from What happens when you add a new teller? by John D. Cook

Why does A&E only have one bay free?

Back pressure.

There’s a queue of ambulances outside of A&E because at any given moment all the bays are busy (and the corridors are already full of trolleys).

A&E can’t move patients onto wards because their beds are full.

Wards can’t discharge patients who are fit to leave because there’s no social care available (whether they should go to a care home, or get a care package in their own home).

Nobody is accountable end to end

If the scope of these problems was (say) a factory, then we could pull out Theory of constraints and go looking for bottlenecks and resolving them. But that sort of approach assumes that there’s somebody who can look at then fix the end to end flow.

But as we look at the back pressure, it builds up across the dividing lines between organisations, with nobody empowered or accountable to free up capacity for the stage before them.

This isn’t just about hospitals

Across the public sector and private sector the relentless pursuit of efficiency has resulted in services that might be approaching 100% efficient, but are also approaching 0% effective. Everybody is waiting, nobody is getting served.

We need more slack.

You’re efficient when you do something with minimum waste. And you’re effective when you’re doing the right something.

The Knowledge Project blog – Efficiency is the Enemy

It might seem good for profits (or spending of precious taxpayer money) to be sweating every last asset, but what about the effect on the overall economy? If everybody’s busy doing nothing, because they’re waiting on hold or whatever, then overall productivity has taken a nosedive.


I’ve had a few things that charge from USB-C for a while: my Planet Gemini, Nintendo Switch, Oculus Quest, SteamDeck, GL-MT1300 travel router, and a bunch of Raspberry Pi 4s; but the arrival of my Lenovo X13 has had me kitting myself out with a bunch of new chargers. So here follows some reviews (with affiliate links if you also want to buy the same)…

Power banks

Anker 737

I’ll start with the Anker 737, as I’ve been using its metering and OLED display to measure the output of the other chargers.

It’s a BIG beast of a thing, properly deserving to be called a ‘power brick’, weighing in at 2/3kg, but that gets a LOT of battery with 24000mAh (pretty near the limit for many airlines), and it can output 100W to a single port and 140W across its three ports (2 x USB C PD, 1 x USB A IQ), making it quite capable of charging two laptops and a phone or tablet all at once.

Pros:

  • Huge capacity
  • Can push out a lot of power (which might avoid having to carry multiple power banks)
  • OLED display is great to show what’s going on
  • Comes with a nice little carry bag that has room for a wall charger and a bunch of cables

Cons:

  • Heavy
  • Expensive (I paid £99.99, though the RRP is £40 more)
  • Only comes with one cable, though that is a 100W USB C-C

Anker 525

Also known as the PowerCore Essential 20K PD this is a 20000mAh brick with a single USB C PD input/output and a USB A IQ output.

I bought this for a work demo I was doing at Mobile World Congress (MWC) to power a Raspberry Pi 4, which it does perfectly; but when I tried to power my GL-MT1300 travel router at the same time, it turns out that it doesn’t have sufficient oomf, which is why I now have two of these.

Pros:

  • Relatively inexpensive (RRP is £69.99, but I’ve generally paid £40-45)
  • Comes with carry bag and a pair of cables

Cons:

  • Only 20W output, so it’s only suitable for phones and tablets

Wall Chargers

All of these use Galium Nitride (GaN) power components for reduced size and weight compared to traditional silicon based switched mode power supplies. To verify their output I measured their charging watts into the 737 power bank, and in pretty much every case they showed around 5W down on the advertised output, though it was a similar story with the traditional 65W Lenovo power brick that came with my X13.

Ziwodiv 65W

I’ll start with the charger that’s impressed me most. The Ziwodiv 65W is tiny, cheap, and yet kicks out (close to) the advertised power (I measured 60W when charging the 737).

The only thing I don’t like about it is the captive UK plug, with no options for easy travel (which it would otherwise be great for given the diminutive size and weight).

Pros:

  • Inexpensive (RRP for the charger is £22.99, but using a voucher I got the charger and a 2m USB C-C cable for £21.99)
  • Tiny

Cons:

  • Fixed UK plug

Mu Folding Type-C 20W

Even tinier, but not quite so powerful, is the Mu Folding Type-C 20W PD Fast Charger. With it’s innovative folding UK plug it’s small enough to be pocketable.

It’s just a shame that they don’t do a multi plug version of this for travel (like they did with earlier versions).

Pros:

  • Impossibly small for a charger with UK plug when folded
  • Reasonably priced at £29 given the quality and design

Cons:

  • Only 20W, so only suitable for phones/tablets (or in a pinch charging up a power bank overnight)
  • UK plug only

Syncwire PD 67W

I thought this was wonderfully small (until I got the Ziwodiv), and it’s multi country slide on plugs are really neat. It has a US style two blade fold out plug built in, and when folded up those blades can be used to attach UK and EU plugs. That’s won it a place in my US travel bag.

With nothing else connected the C1 output pushed 62W into the 737. It’s presently priced at £42.99, which is a bit steep compared to the £32.29 I paid for mine. It’s probably worth keeping an eye on with a price tracker such as CamelCamelCamel.

Pros:

  • Small
  • Flip out US plug, and comes with slide on adaptors for UK and EU sockets
  • Comes with a solid and long USB C-C cable rated at 100W

Cons:

  • Flip out plug arrangement might not work with tight sockets (or might foul adjacent sockets)
  • Only 2 USB C outputs, so won’t cover a full range of travel devices.

Anker 543

The Anker 543 is a 65W charger with two USB C PD outputs (one rated at 45W and the other at 20W) and two USB A IQ outputs. That’s enough for everything I usually have with me when travelling (laptop, iPad, iPhone and Apple Watch), which has earned it a place in my UK/EU travel bag.

Although intended to be a desktop charger it’s small and light, making it also good for travel. I also like that it’s got a figure of 8 (aka C8) socket, which means I can use it with a EU plug C7 cable that has a UK adaptor. The 45W USB C output put 41W into the 737. RRP is £44.99, and Amazon presently have then at £32.99.

Pros:

  • 2 x USB C and 2 x USB A means not needing to carry other chargers
  • C8 input allows for a small and flexible power cable, which is generally better than a ‘wall wart’ design
  • Supplied with an adhesive strip for desk mounting

Cons:

  • Doesn’t come with any cables or carry pouch

Mackertop USB Type C 65W GaN Laptop Charger

The Mackertop has the form factor of a traditional laptop power brick, with a captive braided USB C cable, and a ‘Mickey Mouse’ C6 socket for its mains cable.

I’d have preferred a C8 socket, as the cables don’t carry the extra size and weight of an (unnecessary) earth cable. As part of my US travel kit it’s now paired up with a C7-C6 adaptor. It supplied 61W when charging the 737. These are presently £29.97 on Amazon (though if I recall correctly they were cheaper before the run up to Christmas).

Pros:

  • Captive cable can’t be misplaced
  • Smaller and lighter than a traditional laptop power brick
  • USB A output

Cons:

  • A C8 socket would be better than the C6 ‘Mickey Mouse’ socket, allowing for smaller/lighter mains cable

Samsung 45W UK Travel Adaptor

The Samsung Travel Adaptor is the same form factor as the charger supplied with the Oculus Quest, keeping travel size down by having a slide out earth pin. Mine presently sits in the bag with the 737 so I know I have something to charge it with.

‘Travel’ here would seem to refer to its small size and weight rather than any plug flexibility. These are presently priced at £39.99, but watch out for sales etc. as I bought mine for a much more reasonable £18.63.

Pros:

  • Small and light

Cons:

  • Pricy at RRP
  • UK only plug
  • Single USB C output

Conclusion

There’s no perfect adaptor, which is why I’ve ended up with a bunch of different ones, in different bags for different scenarios. That said, I’d be buying a bunch of Ziwodiv adaptors if they had the same flip out plug arrangement as the Syncwire.