Reverse engineering Fox’s Butter Crinkle Crunch biscuits

Update 24th Jan 2024: I wrote a follow-up post to this.

Fox’s Butter Crinkle Crunch biscuits have always been a favourite of mine. I had a little rummage, but completely failed to find a recipe for them, so I though I’d try making one up.

Home made butter crinkle crunch biscuits
Home made butter crinkle crunch biscuits

Fox’s page on the biscuits is oddly free of marketing, but includes both the the ingredients list and the nutrition label, from which we can deduce something of the recipe. The ingredients list noted 8% oats and 5% butter, no eggs, and a critical ingredient I’d not thought of – partially inverted refiners syrup. That’s golden syrup to you. Taking those with some of the nutrition label led to make some guesses about the proportion of ingredients. I did a little searching about ginger snaps, a very similar biscuit texture-wise, which gave me an important tip – “go heavy on the raising agent”. This is what makes the biscuits over-rise and form the distinctive “crinkly” cracks. I then compared my recipe with Rachel Allen’s recipe for ginger honey biscuits (from her “Bake” book, ISBN 978-0007259700), which I’ve made before, and made a few adjustments to quantities, before settling on a recipe.

Ingredients

  • 175g white flour
  • 75g white sugar
  • 25g dark muscovado sugar (adds a slightly caramel-y taste)
  • 50g oats (porridge, not jumbo)
  • 125g butter
  • 50g golden syrup
  • 2tsp baking powder
  • Pinch of salt
  • 1/4tsp vanilla powder
  • A small bowl of Demerara sugar (cassonade in France) for rolling

This is about 500g of ingredients providing eleventy bazillion calories, and made 24 large-ish biscuits.

Steps

I used a Kenwood Chef to make this, but it’s easy to do by hand too. I baked them on a large double-layer tray with a silicone baking sheet.

  • Preheat oven (traditional mode, not fan) to 180°C.
  • Put all the dry ingredients except the sugar in a bowl and mix.
  • Put butter, sugar (not the Demerara!) and golden syrup in the mixer bowl and whiz until it’s creamy.
  • Add the dry ingredients and whiz until it forms a thick, slightly crumbly dough with no small crumbs. It should be fairly dry, not sticky. If it’s sticky, add a little more flour.
  • Grab small 2-3cm blobs of dough and roll them between your palms to make them into smooth spheres, then roll them in the Demerara sugar before putting them on the baking tray. Leave quite a lot of space around them as they will spread a lot when baking.
  • Bake for about 16 minutes on a middle shelf. They will initially rise to look like little cakes (which had me worried!), but after about 10 mins the tops will crack and they will flatten a bit. I wanted to make sure they were nice and crunchy; if you prefer them softer, take them out a little sooner.

I made a time lapse video of them cooking, but the camera focused on the little dots on the oven door rather than what’s inside, so the biscuits are a little blurry:

Biscuits cooking

They looked pretty good in the end and taste pretty much as I expected, though lacking that blatant butteriness that the originals have, possibly due to my lack of a listed ingredient: “Flavouring”! Still yummy though.

I think if I made them again I’d cut down on the sugar a bit, perhaps increase the oats, though I don’t want to stray into Hob-Nob territory! I could make them look more like bought ones if I squashed them a bit before baking so that they come out flatter.

My modelling career

No, not that kind of modelling! For a very long time I’ve enjoyed making model kits. The first time I ever encountered them was when I was about 6 when we visited a family and their son (about 9) told me all about this thing called “Airfix”. To start with I thought this was some kind of weird glue, but then he showed me some he had built (the staple WWII fighters – Spitfires, Hurricanes, and ME-109s) and I was quite envious.

I don’t remember building many plastic kits to start with, but I did make rubber-band powered flying models from balsa. These require a lot more care and work than plastic kits, but they are very analogue, and you get more of a feel for the materials. I think the smell of cellulose dope helped too. The problem with real flying models is of course crashing them. Balsa and tissue paper are not very robust, and seeing hours of work smashed in seconds is no fun. Modern equivalents tend to use moulded expanded polystyrene, which is both lighter and more crash-resistant, but rather less romantic, and doesn’t smell as good.

Model makers accumulate a certain amount of junk. I still have plenty in my box of goodies:

This box reveals a certain history of its own. Beatties was a British chain of model shops that closed in 2001 – yet their glue and paintbrushes still work just fine 19 years later! Tamiya’s acrylic paints were so much better than Humbrol’s gloopy enamels, and they have lasted too – some of these are probably 25 years old! Of course, everybody needs a few plastic dinosaurs, starfish, and a Paua shell.

I’ve always been more interested in the process of making models than playing with them afterwards, and to some extent I’ve found much the same about writing software – writing it tends to be much more interesting than using it. Last year I had a great time building a retro arcade game cabinet – I spent far more time building it than I have playing games on it!

Back in the dot-com boom I landed a very lucrative CD-ROM production contract (you know, where all the web technologies started before they worked on the web!) for the Open University, allowing me to buy a very nice car after a mere 7 weeks on the job – a silver 1991 Porsche 944S2:

This was a fun, fast, but expensive car to own. It was surprisingly practical: On one occasion my wife and I drove from London to darkest Wales with our luggage and three mountain bikes inside the car. On another trip the clutch was on its last legs and I managed to drive from Newport in south Wales to Sidcup in Kent (190 miles) without changing gear once. I kept the car for 4 years, until we lived in Paris. I can say quite definitively that you do not want to own a nice car if you live in Paris. After I sold it I built a model of it as a memento.

Some friends (hi S&P!) bought a 944 at around the same time as me, but a cabrio, in “Champagne gold”! To complete the set, I bought a kit of the cabrio, but never got around to building it; This box sat on shelves and moved house 3 times over about 15 years:

When it comes to kits, quality varies a lot – part detail & design, moulding quality & accuracy, materials, clear instructions all go towards making the build a good experience. Tamiya make some of the best models (and I always loved their catalogues), with great detail and excellent quality, but sadly they don’t seem to have made 944 models. I built lots of Tamiya kits – aircraft, hovercraft, motorised tanks, dune buggies, battleships. The best of all was a fantastic Vosper Perkasa MTB (motor torpedo boat), which after weeks of work, I was heartbroken to sink and lose in the Thames in Oxford on its maiden voyage.

These two 944 models are from Italian Italeri (the cabrio), and Japanese Hasegawa. The Hasegawa kit is slightly more complex, with an opening bonnet, pop-up headlights, and working steering linkage. My French back then was very bad (it should be better now, having lived in France for 11 years!) and I liked thinking of Modéle Réduit as meaning “model re-do-it”, even though I knew that wasn’t right. While they were the best known, I didn’t really like Airfix kits; designs tended to be a bit simpler and not as detailed. Much the same goes for Revell. I’ve no doubt some model purists will tell me I’m wrong.

In Christmas 2020, amongst all the COVID-19 lockdowns, I finally set about building the cabrio. I was pretty pleased with the results:

The gold is quite a lot more bling than the real thing was, but I like it. The decals were yellowed with age, very fragile, and disintegrated a bit. I’m particularly pleased with the painting of the rear light clusters, slightly annoyed that I didn’t clean and degrease the body well enough before spraying it, resulting in a slightly uneven finish.

I’ve enjoyed making models for decades now, and it’s been really nice to associate them with good memories too. I’m now tempted to round out the collection with my Dad’s red 944S, my uncle’s succession of purple 968 Sport, 911 993 Carrera 4S, and Cayman R. So much for saving shelf space!

How to use HELO with PHP’s mail() function

I originally wrote this for the HELO-community tracker, and it was subsequently published on BeyondCode’s blog, but I wanted to publish it here as well.


HELO works very nicely if you’re sending via SMTP using PHPMailer, SwiftMailer, etc. – but lots of apps and scripts rely on PHP’s clunky old mail() function, which isn’t nearly as easy to deal with, and harder to point at HELO.

You can configure “proper” mail servers like postfix to work as a local relay, but it’s horribly complicated and confusing to set up. Fortunately there are simpler alternatives that are much easier. Searching for local relay tools (what this is) will usually point you at ssmtp, however, that doesn’t work on macOS. A better option for macOS is msmtp which is present in homebrew and works perfectly. I usually run HELO on localhost port 2500, and I configure msmtp with a config file (stored in ~/.msmtprc; you should also chmod 600 this file as it may contain secrets) like this, which enables the authentication that HELO requires, and I’ve also enabled logging so you can see what it’s up to:

defaults
host localhost
port 2500
tls off
undisclosed_recipients off
account default
auth plain
user test
password password
logfile ~/logs/msmtp.log
syslog offCode language: Bash (bash)

To make the PHP mail function use msmtp, you need to configure the sendmail_path setting in your php.ini file to point at it:

sendmail_path = /usr/local/bin/msmtp -t -iCode language: Bash (bash)

If you’re using homebrew’s PHP package on macOS, I recommend putting config changes like this in a separate .ini file so that it remains update-safe; I put mine in /usr/local/etc/php/8.0/conf.d/marcus.ini.

With those two things in place, PHP’s mail function will submit to the local msmtp binary, which will then relay the message to HELO over SMTP.


Sending via this this route using PHPMailer is very simple because mail() is the default mailer, so you don’t need to configure anything:

<?php

use PHPMailer\PHPMailer\PHPMailer;
require 'vendor/autoload.php';

$mail = new PHPMailer();
$mail->setFrom('from@example.com', 'First Last');
$mail->addAddress('whoto@example.com', 'John Doe');
$mail->Subject = 'Say Hello to HELO';
$mail->Body = '<h1>Hi!</h1><p>This is my HTML body</p>'
$mail->AltBody = 'This is a plain-text message body';

if (!$mail->send()) {
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message sent!';
}Code language: PHP (php)

The Stack Overflow Antipattern, part 2

I enjoyed Riggraz’s observation of “The Stack Overflow Antipattern”, and it made me think of another very similar pattern that I see a lot on Stack Overflow, but it occurs after the pattern that Riccardo describes, and I thought I’d outline that here.

Image by wal_172619 from Pixabay

I answer a lot of questions on Stack Overflow. I ask very few, but I’ve still fallen into this trap myself.

Once you’ve been through Riccardo’s antipattern (ignoring the other antipattern of those that don’t even make it to step 1), you are here:

  1. You’ve searched and found some random results
  2. You’ve read some SO questions that were in those results
  3. You’ve still not found a solution

If you’ve got this far, the breadth of the question you want answering has probably been narrowed a little (which helps in its own right: searching is a mild form of rubber ducking), and probably contains the basis of a worthwhile Stack Overflow question.

So you focus on the problem, write it up, and (assuming this rubber-duck exercise didn’t lead you to a solution) post the question, and answers and comments appear reasonably quickly (hey, Stack Overflow rocks!). But often these responses are bogus, half-answers, or raise further questions. It’s at this point that we see the same “not taking the time to think” that Riccardo observed. You are so focused on the original question, you become incapable of solving a far simpler follow-on question.

Here’s a small example I often see:

“I’ve seen docs and code referring to autoload.php, but I can’t find that file”

Searching for autoload.php will find a zillion irrelevant results, because pretty much every PHP project in existence has one. So the question is posted on SO. There is a simple answer to this question, which is

“install composer, run `composer install`, and it will create the autoload.php file for you”

This inevitably leads to the follow-on question:

how do I install composer?”.

This is a new sub-problem, but one that is instantly solvable by searching because it’s far less ambiguous. However, this is where the abdication of thinking kicks in, and rather than actually doing that search, you ask in the SO question comments, and sit around waiting for an answer from Someone Who Knows™ that posted an answer to the original question. This is frustrating for the answerer, who knows that the asker could find the answer to this question far faster by searching for themselves, but they choose not to because their thinking is turned off. There’s also an element of panic – the asker has obtained the attention of someone capable of understanding their problem, and doesn’t want them to escape before they have addressed the full recursive stack of sub-problems. This has led to the existence of passive-aggressive responses like LMGTFY, which are demeaning and condescending, but reflect the frustrations of those who answer questions.

What’s weirder is that I have observed myself doing this very thing, and I’ve sometimes had to stop myself posting trivial follow-up questions without thinking. Avoiding having to think is evidently a compelling driver.

I emailed Riccardo about his article with some of the thoughts that led me to write this, and he came back with another interesting observation: This loss of confidence that leads one to post trivial follow-up questions is very much like imposter syndrome. Having had to ask a question in the first place can provoke feelings of embarrassment or inadequacy, and anyone that responds in a positive way will appear to be in some way superior, which is fully expected, but at the same time provokes feelings of “we’re not worthy”, further reducing one’s confidence to be able to deal with even simple problems.

We’re not worthy

I know that Stack Overflow (and GitHub issues) can sometimes be harsh on new users, and old hands (like me) can forget what it’s like to be a beginner. It can be very frustrating to answer questions that have been answered many times before (“my PHP script just gives a white screen”), and I’ve occasionally found myself editing my initial reaction to avoid unkindness. In those situations I usually try to overcompensate by offering more general advice about how to avoid getting stuck in dead-end situations like that, rather than just answering the precise question asked.

In PHPMailer I have tried to head off support questions before they arise by adding links to documentation in error messages, but it doesn’t stop people posting questions like this:

I have this error:
> 2020-05-16 07:28:11 SMTP connect() failed.
> https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

I have been stuck on this for 2 weeks, and I searched the entire internet three times
Where can I find out how to fix it? You must help me urgently!

I don’t really know what to do when faced with this. Posting a substantive answer is probably pointless – if they have not read what’s right in front of them despite their evident frustration, chances are they will not read any answer you post either, especially since it will only contain exactly what’s in the link provided anyway. Sometimes the best thing to do is vote to close the question, usually as an inevitable duplicate. I see very similar things happening in GitHub issue templates – askers delete the boilerplate text, removing something which would usually help them solve their exact problem in a few seconds, but they go out of their way to make the process take longer and involve others unnecessarily, because apparently not having to think is a more attractive proposition.

I’ve also considered pushing in the other direction, such as by adding “delete this line from the debug output before posting questions about it, or your question will be ignored” as a way of enforcing reading the error messages, but that’s unkind.

I’m not sure how to address the abdication of thinking issue though. Perhaps offer up search results derived from comments or answers, much in the same way that Stack Overflow does when you first post a question? There are probably extensive psychological studies on this pattern of behaviour, and it may well have a name, but that’s a question for another Stack Exchange site.