home / notes / 2021 / 2020 / 2019 / 2018


Booked my slots Tuesday after the letter arrived in the morning post. I was one of 224,996 people to receive their first dose of the COVID vaccine yesterday, a fact that I find strangely democratic.

Arrived at Millennium Point at 25 past (appointment for half past). Presented letter, gave date of birth, sat within a grid of chairs for 10 to 20 minutes or so. Invited to trundle off to the next grid of chairs. The queue manager was impressively working from spatial memory, no raffle tickets. Presented the same information, plus postcode and next of kin. Sat for another 10 to 20 min or so. Called to a third stage, the lanes, where the actual injections took place. Asked for the same information, plus confirming my GP name and location and providing a contact number and choosing an ethnic self-description. Appraised of possible side effects, got injected (painless, much thinner needle than the 'flu jab chisel a month ago). Presented with my card, sticker and side effects leaflet. Then out (via loo).

Was in there for 1h 15 min. Well organised. 60 or so people at each stage, refreshing every 10 mins. Pretty large scale and slick. Nice feeling, even though this was the largest number of people that I have been in an enclosed space with for just under a year. The atrium is a three story high space the size of a football pitch with some to spare.

Booking Web site was reassuringly minimal, no fancy responsive design, should work on any device, which I think is a very good idea. A series of steps with one question each step. When offered a list of time slots, choose a middle slot not the first. Otherwise you reach the end to be told that there is a problem with one of the appointments because someone else got that first slot before you did. Again, a strangely democratic feeling: thousands of people out there booking.

Some numbers: 225000/32 slots = about 7000 people per 15 min slot nationally, which is about 450 per minute on average. That's the way to do it.

No side effects at all, not even a sore arm. Same with the 'flu vaccination in January (my first, motivated by request by letter).

I have many questions about how a rich and powerful country with universal health care clocked up such a huge death toll, 30+% of that as late as January. But the vaccination process was deeply reassuring, public sector mass provision at its best.

Wallpaper: spray can test

Colour test with spray paint

The walls of the subway underneath gravelly hill interchange where taggers have been testing out their spray paints. A bit of sun makes such a difference! I used the Transform | Rotate tool in GIMP 2.8 to rotate the image (before cropping and scaling down) to correct a slant in the tiles.

Generate secure passwords: multiline alias in bashrc

You do not want to be that intern. Avoid this ignominious fate by using a handy bash pipeline...

alias genpass="head -c 2000 /dev/urandom | \
tr -dc 'a-zA-Z£\@\$' | \
fold -w 12 | head -n 20"

Adding the above multiline alias to your .bashrc will, when sourced, result in the following typical output...

bash-4.3$ genpass

A choice of 20 passwords each of 12 characters. The character set can include upper and lower case letters, numbers, and the special characters @, £ and $. That is 65 possibilities for each character.

The chances are that at least one of the 20 passwords will comply with your corporate password policy. In which case you write it down in your little black password book and use it for the three weeks that passwords last before the (brain dead) System makes you pick a new one.

The /dev/urandom command returns 2000 (reasonably - see man urandom) random bytes, however these bytes may include all values and so we need to filter them so as to produce things you can actually type on your keyboard. To do this, we pipe the output into the tr command which translates the bytes into lower case, uppercase and numeric characters, plus the three 'special' characters @, £ and $. Because the @ and $ characters have a meaning when applied to regular expressions, and thus alter the way that tr works, you have to escape them by using the \ character. That same \ character can be used between commands to break the line into smaller sections. Note that the \ characters have to be within a command and so just after the pipe (|) characters.

Then we pipe the filtered characters into the fold command that chops them up into sets of 12 characters per line. You can (of course) alter the number of characters per line by changing the argument. Finally, the lines are piped into head to select just the first 20 lines. Again, you can have more or less lines by changing the value of the argument. I wanted to make sure that I would end up with at least one password that would satisfy the complexity requirements.

So how secure is a password derived from 12 'random' picks from 65 characters? Well my1login thinks that these are pretty secure. 'Time to crack your password: 26 billion years' for tTsrztN3O$Ck, but then the time to crack is only 23 thousand years for RgaivLBRM34M. Pretty logarithmic variation (which is to be expected as it is information content or entropy that we are talking about).

The Kaspersky password checker estimates that a home computer would take 4 centuries to crack tTsrztN3O$Ck but also for RgaivLBRM34M (so much for special characters!).

The Rumkin password checker gives me an estimate of the entropy for each password. Good old tTsrztN3O$Ck yields 61.6 bits of entropy but thinks that it is chosen from a 72 character set. RgaivLBRM34M yields 57.5 bits of entropy from an estimated 62 character set. Special characters are good here!

Mr Pleacher provides the formula for calculating the entropy of a password as E = log2(RL) (same as E = ln(RL) / ln(2)) where E is the entropy in bits, R is the number of unique characters in the password (65 here) and L is the number of characters in the password (12 here). Cranking the handle on that lot gives around 72 bits of entropy (try the calculation in WolframAlpha).

head -c 20000 /dev/urandom | \
tr -dc 'a-zA-Z£\@\$' | \
fold -w 12 | \
head -n 300 | \
fmt > pin-this-up-on-your-noticeboard.txt

The command above will generate 300 passwords each of 12 characters so you can print them out and hide them under the keyboard. Seriously, you need to generate many more bytes from urandom than you want printed as the tr filter will reject bytes that don't match the reg exp.

Wallpaper: scarborough

Scarborough sky

October 2019 looking out to sea.

'Roman' flatbread

Flatbread: in the pan Flatbread: what it looks like when cooked

Soft and chewey, these flatbreads are easy to make and mop up sauces nicely. The ones shown here used a yeast based sponge, and about 20% wholemeal bread flour and 80% white bread flour. I'm planning to use a sourdough for the sponge and 50% wholemeal spelt flour for a more authentic flavour next time.

This recipe is adapted from an Atlas Obscura page that reconstructs a pub meal in Pompeii, complete with duck boiled in broth and a 'portable' brazier. I use less yeast and a longer rise time (I'm always worried about making sure the yeast is killed in the cooking process, which is very short for pan bread) and less salt than the original recipe.

The modified recipe makes two flatbreads each about 6 inches across and an inch thick. I didn't think to weigh them!


Add yeast to the water and rest for 5 minutes to start bubbling. Add yeast/water to flour in a small bowl and mix to smooth batter. Cover and leave to stand for a couple of hours. Should have risen a bit and be bubbly.

You can use 60g of an active sourdough starter instead of this sponge.


Shaping and cooking

I'm thinking about seeds and nuts added to the dough and about cooking on a stone in the oven with a few toppings. Romans sometimes made cheese and herb dips for their bread. The bread was not always leavened, and not always wheat flour.

On the stone

Flatbread: what it looks like when cooked on a stone, fold side up (twilight)

Re-visited this recipe today, complete with yeast based sponge, and with 125g of wholemeal spelt and 125g of bog-standard white bread flour (plus the 30g from the sponge). Cooked on a pizza stone at the top of the oven for roughly 12 to 14 min. Above photo taken in twilight so a bit of a blue tinge. Better rise, and slightly more crisp on the outside. Still chewey and reasonably moist.

Next time, I'm just going to have to do one on the stone and the other in a pan to compare. I have a suspicion that I am rediscovering foccacia step by step...


Add the line below in the head of a simple html based Web page...

<meta name="viewport" 

...and your work is readable on mobile devices with basic Web browsers and small screens. The viewport tag is the key.

Unknown unknowns...

...are the ones that get you.

"Reports that say that something hasn't happened are always interesting to me, because as we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we do not know. But there are also unknown unknowns - the ones we don't know we don't know".

Donald Rumsfeld's famous paragraph of spoken prose attracted mirth and hilarity when it was first heard. It has stood the test of time has it not, as long as we add the unknown knowns (or the knowns we cannot see because of our assumptions)?

Wallpaper: winter trees

Bright cloudy sky and crisp

Quotes for the day

The founders had thought about this one, in the context of the risk of a president trying to become a king. Below from an article in The Dispatch, a right wing American publication. Via the often hilarious and occasionally informative Political Betting.

"The truth unquestionably is, that the only path to a subversion of the republican system of the Country is, by flattering the prejudices of the people, and exciting their jealousies and apprehensions, to throw affairs into confusion, and bring on civil commotion. Tired at length of anarchy, or want of government, they may take shelter in the arms of monarchy for repose and security."

"When a man unprincipled in private life desperate in his fortune, bold in his temper, possessed of considerable talents, having the advantage of military habits - despotic in his ordinary demeanour - known to have scoffed in private at the principles of liberty - when such a man is seen to mount the hobby horse of popularity - to join in the cry of danger to liberty - to take every opportunity of embarrassing the General Government & bringing it under suspicion - to flatter and fall in with all the non sense of the zealots of the day - It may justly be suspected that his object is to throw things into confusion that he may 'ride the storm and direct the whirlwind'."
Letter to George Washington, 18th August 1872, Alexander Hamilton, founder.

In other words, people like simple ideas and strong leaders - or so they think until the penny drops.

"Democracy is a system in which parties lose elections"
Democracy and the market: Political and economic reforms in Eastern Europe and Latin America by Adam Przeworski

I like this definition. Nice and short. Brings in the idea of continuity and a container for the political process which as an older chap I approve of. Links to politics as an example of an infinite game.

Cheap premises and studios needed

Whites Ironmongery shop door shutter

The shutter belongs to a fairly substantial building with a ground floor showroom and upstairs offices on a corner site just over the main road from the Jewellery Quarter. The windows used to display a variety of ironmongery and industrial parts - I noticed the display changed quite often. Now appears to be empty. Pre-COVID the word in my local barbers was that the building changed hands for a significant sum. The (alleged) new owner does not appear to have cleared the space and has not made the future use of the building apparent in any way. The business continues operating from an industrial unit further out of the city centre in an industrial estate with good access for white van drivers.

As I trundle around the Inner Ring for my daily exercise walk, I'm seeing lot of disused small low rise buildings from the immediate post war rebuilding. Many of these buildings are empty and look to have been empty for some time. They do not aspire to any great architectural merit. I'm hoping that they don't all get cleared for mega 'luxury flat' developments (casting their huge shadows over the streets that remain), and that rents can reflect supply and demand instead of booked asset valuations.

It seems that artists and marginal innovators operating outside of the usual academic or business institutions need cheap space relatively near services. The resulting mix is better for density and employment. This is going to be important when we climb out of the COVID deep freeze, there must be little friction for small new businesses to open.

Octave: end user programming for industrial types

subplots from octave 4.4 gui for a damped spring ode

Octave 4.4.1 dating from 2018 is the version in Debian Buster, 6.1 has just been released. I'm working with 4.4.1 for now. Found a useful page with short form code and plots for a range of differential equation based models.

The image above shows the time evolution and phase space for an undriven damped mass on a spring - the 'hello world' of computational physics. The octave code to produce the plots is...

%Save the following contents in a .m file and run the .m file
m = 1;
k = 1;
c = 0.3;
dy_dt = @(t,y) [y(2);...
       -(c/m) * y(2) - (k/m) * y(1) ];
odeopt = odeset ('RelTol', 0.00001, 'AbsTol', 0.00001,'InitialStep',0.5,'MaxStep',0.5);
[t,y] = ode45(dy_dt,[0 25], [0.0 1.0],odeopt);
subplot(1,2,1);plot(t,y(:,1),'r-',t,y(:,2),'b-'); xlabel('time'); ylim([-1.2 1.2]); legend('y1(t)','y2(t)');
subplot(1,2,2);plot(y(:,1),y(:,2),'b-'); xlabel('y(2)');ylabel('y(1)'); xlim([-1.2 1.2]); ylim([-1.2 1.2]);

My next move is to work through these various code listings line by line and refer back to the octave manual for the syntax. In particular, the construct that defines the second order differential equation...

dy_dt = @(t,y) [y(2);...
       -(c/m) * y(2) - (k/m) * y(1) ];

...appears to be using the semi-colon, ellipsis and line break in a specific way.

New year's resolution: stick to octave and R and produce some stuff.

New Year sourdough

sourdough boule sitting in basket for final proof

Gilchester's Organics half and half wholemeal/white flour, 70% hydration and about 8% starter (40g on 500g of flour). Mixed on New Year's Eve and left overnight to rise. Proof around 1pm New Year's Day. Baked around 3pm. Tasty and dark colour, not a huge rise but some good chewey bread.

Taking advantage of the circumstances

Moss growing on a brick walled warehouse near broken gutter

An old warehouse wall is about 100 feet long and most of it is dry and moss free. A broken piece of gutter where it joins the down pipe is providing a source of water for a vertical moss plantation and a few hardy small plants (recent arrivals). Once the water is flowing the seeds/spores can anchor and start growing. The seeds/spores are widely distributed everywhere but most presumably can't get enough water or light to start growing.

The warehouse has been empty or not much used since the Millennium. One day, a new tennant could come along and have the gutter repaired - a minor job involving a scaffold and perhaps a days work. The mosses would dry out and remain viable as spores for some time. The little plants would die off as a result of their environment changing.

New year...

Bunch of daffs showing blooms this morning

...and I hope new blooms.

Keith Burnett, 2021