Chris Worfolk's Blog


EpicMan Windermere Triathlon

September 23rd, 2020 | Sport

It’s been a challenging year for all of us. Thanks to a receding coronavirus, there has been a triathlon season, however. Albeit a short one. I signed up; for five races: Evolve quarter, sprint, Derby, Windermere and Goole. Goole was cancelled and I picked up a cold just before Evolve sprint so I wasn’t allowed to race. It lastest past Derby triathlon, meaning I only got to race two of the five races.

Still, two is better than none, and at least Windermere is one of the pretty ones. We made a long weekend of it, renting a converted barn in Crosthwaite and used the time to take in some of the lakes, including Venla beating us all up Gummer’s How.

The swim

I had a pretty terrible swim: it took nearly 50 minutes. I am a slow swimmer anyway, but I am usually under 40 minutes for 1,500 metres. I think a couple of factors contributed. I took it easy and decided to treat myself to breaststroke. That way I could look around at the beautiful scenary, especially looking up at the north end of the lake. It was also a slow start as you cross the timing mat, then run down into the water. But it’s pretty stoney and shallow, so it doesn’t lend itself to running and diving.

The course was also a little confusing. There were supposed to be eight buoys on the water, and the standard distance went around six of them. But, on the day, there were actually ten of them, of which we had to go around eight. This led to some confusion in the swim pack ahead of me on the way out, and me getting confused on the way back as extra buoys kept appearing.

I was second to last out of the water, although this isn’t really an accurate measure because it was a staggered start due to COVID and I was in the second-to-last wave, 25 minutes after the race started.

The bike

The bike course was a story of two halves. One of the issues with the Lake District is that there is a lot of cars and the first half of the bike course meant we were travelling down main roads with cars whizzing by, or on smaller roads, cars would get stuck behind slower cyclists (especially on hills) and I would get stuck behind the car.

The second half was on smaller roads and this was much nicer. It was reasonably flat for the Lake District: 450 metres of climbing over 37.5 km and only one steep climb that topped out at 13%.

The run

The run took place in the grounds of YMCA Lakeside. It was all trail, and some bits involved scrabbling down a few rocks. As I climbed down one of the little walls, the rock beneith my foot gave way and started rolling down the hill. I had to jump off it Super Mario style.

Given the sun was up and beating away by this point, I was pleased to be running through the trees most of the time, though. I had a small issue 2 kilometres from the finish when my running shoes ripped but luckily they stayed on for the remainder of the run!

I am very glad it was dry as it would be a challenging run course in the wet. Some parts were muddy and I slipped a couple of times. But I was wearing my road shoes.

The result

My official time was:

3:20:32

But the splits were initially bit of a mystery. Officially, my swim time was 12:30:45, my bike was 1:26:50, my run was 1:01:08 and my transition times were instant. On my watch, I clocked 49:20, 3:15, 1:26:52, 3:59 and 57:07.

But they later updated the results to be 49:19, 3:15, 1:26:50, 4:03, 57:05, which matches up with my watch.

The pictures are available for free, although heavily watermarked and to find them you have to manually search through the nearly 12,000 photos they have uploaded. As there were three distances going on at the same time, there was no indication where I might be in the pictures. I found my bike and run ones, and I don’t think there is a finish line one. Still, free, so no complaints.

Conclusion

Organising a COVID-secure event is a huge challenge and it’s not like triathlon events are a profitable industry in normal times (unless you’re Ironman, and even they are in financial trouble). So, a big thank you to Epic Events for getting it organised.

Some triathlons are fast, flat and great for PBs. Others are more about having a great experience in a beautiful location. This race is the latter.

Upgrading from Slim 3 to Slim 4

September 18th, 2020 | Programming

Slim is one of my favourite PHP microframeworks and many websites are built on Slim 3. I have recently moved to Slim 4 and thought I would document the upgrade process for anyone else looking to make the leap.

Dependencies

Slim 3 came with its own dependency injection container. This is no longer the case. Therefore, we need to bring one in, such as php-di that Slim supports out-of-the-box. We will also need a PSR-7 library and the Slim HTTP helpers.

"slim/slim": "4.*",
"slim/psr7": "1.*",
"slim/http": "1.*",
"php-di/php-di": "^6.1",

Creating the app

In Slim 3, we created the app and then accessed the container.

$app = new \Slim\App([
    'settings' => []
]);

$container = $app->getContainer();

In Slim 4, we create the container then attached it to the app.

$container = new \DI\Container();
\Slim\Factory\AppFactory::setContainer($container);
$app = \Slim\Factory\AppFactory::create();

You can still access the container in the old way and inject dependencies into it, but you need to manually pass it into the app as above.

Accessing dependencies

Now we are using our PSR-11 DI of choice, we need to change how we access our dependencies. Previously, wee could use the Slim shorthand.

$db = $this->ci->db;

Now we need to use the PSR-11 standard.

$db = $this->ci->get('db');

Exception handling

Previously, we could set error handling using the dependency injection container.

$container['notFoundHandler'] = function ($container) {
    return function ($request, $response) use ($container) {
        $controller = new \App\Controller\ExceptionController($container);
        return $controller->notFound($request, $response);
    };
};

In Slim 4, we need to use the bundled middleware.

$errorMiddleware = $app->addErrorMiddleware(true, true, true);

$errorMiddleware->setErrorHandler(
    Slim\Exception\HttpNotFoundException::class,
    function (Psr\Http\Message\ServerRequestInterface $request) use ($container) {
        $controller = new App\Controller\ExceptionController($container);
        return $controller->notFound($request);
    });

This also means changing the exception controller, too, if you use one. In Slim 3, we would still get a response object passed in.

    public function notFound(Request $request, Response $response)
    {
        return $this->render($response, 'not-found.html');
    }

With Slim 4, we need to create our own.

    public function notFound(Request $request)
    {
        $response = new \Slim\Psr7\Response;
        return $this->render($response, 'not-found.html');
    }

That should take care of most of the changes. If you run into anything else, let me know, and I’ll update this article.

Can you train for an Ironman in 6 weeks?

September 3rd, 2020 | Sport, Video

Many athletes spend years preparing for a full distance (Ironman) triathlon. But what if you only have 6 weeks? In this video, I’ll give it a go. To be fair, I wasn’t going from a standing start. I spent the first three months of 2020 on my training plan. Then COVID-19 happened, all the races got cancelled, and I spent the next few months running the Great Virtual Race Across Tennessee.

Then, six weeks before the race, Dalesman announced they were going ahead with their full distance race. So, I thought I would give it a go. Is it enough time to get ready? Let’s find out!

Skip to 8:15 for the sexy training montage and 15:57 for some race day footage.

Symfony PHP Framework course

August 30th, 2020 | News

Learn Symfony PHP Framework with my new course. It will take you all the way from installing Symfony to building a complete eCommerce store. We will explore routing, databases, static assets (Encore, SASS), forms and validation, email delivery and more.

Introductory Human Physiology

August 29th, 2020 | Life

I recently completed Introductory Human Physiology. It is the second physiology course I have taken and it was pretty difficult. There is so much to human physiology that the courses do not have much overlap.

For example, I have also done a bunch of courses in diet and nutrition. But we did very little on metabolism in this course. Instead, we were treated to a deep dive on how the kidneys make urine. I did nail one module, the nervous system, thanks to my biopsychology background, which I think is the only exam I achieved 100% on the first attempt. But I got through them all in the end.

Anyway, now that I have studied physiology, I guess this makes me a physician?

Woolenman Triathlon

August 26th, 2020 | Sport

Back in March, when all the races started getting cancelled, I decided that if all else failed, I would do a self-supported race which eventually became known as Woolenman. Last weekend, I

The plan

With Outlaw and Ironman Copenhagen cancelled, I wanted to go full distance. But with some changes.

Several races, including Dalesman, changed their swim course to a 1,000-metre loop and allowing athletes to choose how many loops they did before getting on the bike. I adopted a similar plan. My swimming pool is still closed so it had to be open water, and the lake I use is only open for an hour so my swim would be capped at that.

Next problem: the lake does not open until 9 am and that is way too late to start a full distance triathlon so I would have to start the bike before that: making it bike-swim-bike-run.

The start

I got up at 4:15 am to have breakfast. The choice of champions, of course: toast, an apple, juice and plenty of Imodium. I set off just before 5:15 am. This meant I was setting off in the dark and was able to watch the sunrise as I headed towards Methley.

I completed the first 75 km without too many problems. There was some headwind coming back towards Ledsham but it certainly did not feel like the 60 kmph gusts that were promised.

The swim

After racking my bike, I headed down to the lake and set off on the swim. I decided to do 3 big loops and 1 little loop, which should have been 1,750 metres, plus getting to and from shore, should have been just under 1,900 metres (half distance). My watch only registered 1,690 metres but it’s often not accurate when swimming.

I did think about getting out early, especially as I typically have stomach issues after swimming in open water, but I decided it might feel like cheating if I only did 1,000 metres and still called it a full-distance race.

The bike

After the swim, I headed home. I was cold by this point, probably because I went home in my wet tri shorts, so I tried to warm up and eat something before jumping on the bike.

The second half of the bike was a longer segment. The weather was mixed: the rain started and stopped and sometimes it was light enough to stay in my jersey and other times it was heavy. I stopped to put on and take off my rain cape multiple times.

My lower back tends to suffer on the bike but I held up reasonably well until towards the end, maybe Otley, when it really started aching. I was pushing to make sure I was well within the cut-off and hoping to start the round by around 4 pm and caught between wanting to keep up the pace and mounting fatigue.

Gels were not sitting well with me so I hate a lot of Haribo, flapjack and jellies. Once I reached Bramhope I knew I was on the home stretch and headed down the hill, via Burley Road and Kirkstall Road back into T2.

The run

Only a marathon to go. I laced up my shoes and put crates of nutrition in my car that I was using as an aid station. The run course was a 5km loop that I used for Endure24. On the second loop, I encountered some stomach issues and had to return home for a break.

Things didn’t get much better after that. I walked most of the third loop and felt exhausted, so I decided to break out the Red Bull a loop early than planned. The fourth loop was tough, too, but after this, the caffeine and extra food I was eating kicked in and I picked up the pace. The next 15 km went well, and I put in some 5:30-6:00 kilometres.

As I reached the last 7 km, the sun had gone down and the rain started. I put on my rain jacket and switched to my B loop: around Leeds Dock and back through town where there is street lighting. Even the food and caffeine could not save me by this point and I walked the first 6 km with a bottle of coke in my hand.

Eventually, the coke drunk and realising I was a final kilometre from home, I managed a gentle run for the final 6-7 minutes to arrive back at home.

The finish

You might think it feels amazing to finish a full-distance race. But honestly, it usually doesn’t. Anything long-distance: marathon, ultra, middle distance, full distance: you’ve just given everything and are totally drained. This one was a weird one. I think if the run had been 32-37 km, I would have felt great as I rode my caffeine high. But, by the end, I was back to feeling like death.

Still, it felt good to cross the makeshift finish line and put on my medal.

I managed to each some sausage butties after the race and in what turned out to be an excellent move, I used this special triathlete muscle recovery gel that you mix with hot water in a large tub.

The timings

Working out timing is difficult. My bike computer says I started at 05:11. My watch says I stopped running at 21:29, so the total elapsed time was 16:18, a good 42 minutes ahead of the traditional 17-hour cut-off for a full-distance race.

My swim was 52:15, which is pretty slow although a good 4-5 minutes of that was getting in and out of the lake. And marginally faster than the 3:08 I swam at Yorkshireman last year.

My bike time is anyone’s guess. My computer said it was 7:39:64 but that was with auto-pause on. So, we could look at the elapsed time, but that was 10:24:39 because it had a swim in the middle. Also, Garmin added over 45 minutes and a phantom 6 km while I was swimming, so my moving time was sub-7 hours. Average moving speed was 25.9 kph. This is slightly better than the 25.3 kph average moving speed I did at Yorkshireman over the same elevation (roughly 1,200 metres).

My best guess for actual time on the bike was 2:51:46 in bike 1, and then roughly 11:15 to 15:35 in bike 2. That makes a total elapsed time of roughly 7:12:00, which is exactly 25 kph. Who knows if that is accurate, though, because I have no real way of telling if 11:15 was an accurate time for when I got back on the bike. My average speed over elapsed time at Yorkshireman was 23.6 kph accounting for stops to stretch my back and trying to help another athlete unjam their chain.

My run time was 4:56:30, but that is with some pauses to account for getting to the aid stations that would usually be on-course. Elapsed time was 5:14:04. Either of these values is notably slowe than the 4:40:35 I ran at Yorkshireman.

So, what do those numbers mean?

Well, if we move this data to Outlaw, I would have hit the cut-offs. I was on for a sub-two-hour swim, 7:12:00 bike split and 5:14:00 marathon. At Copenhagen, it would have been close: the cut-off to start the run is 9:30:00, so I would have had to go through transition in under 20 minutes. That sounds stupidly easy, but I was 15 minutes each at Yorkshireman! I could easily reduce that by moving my bathroom breaks onto the bike and run course, and by just getting a move on.

Areas for improvement

My swim was no faster than last year, but it was front crawl rather than breaststroke, so I feel like that is a much better base for getting faster moving forward. Assuming I don’t get ill with the amount of water I swallow, which has been a real problem with open water swimming for me.

I didn’t use the aero bars at all on the bike. I tried using them at the Evolve triathlon last week and I almost immediately started to get a lot of lower back pain. I got plenty of this last year too, but not this bad, so I decided to play it safe and not use them.

I have been stretching for 20 minutes every day since lockdown in an attempt to free up my hamstrings in the hope that would solve it. No luck so far (my hamstrings have relaxed a little but no change in pain), but if I can crack that, I can get far more aero and take a lot more time off the bike. Maybe I just need to buy a tri bike and get the better geometry, you say?

Conclusion

I’m now a two-time full distance finisher. I’ve officially proved it was no a fluke. Now I can chill out for the rest of the year and hopefully get some more races in now the season is starting to open up.

Evolve Quarter Triathlon 2020

August 25th, 2020 | Sport

Last week, I finally did a triathlon in 2020. With British Triathlon’s new social distance guidelines in place, Evolve became one of the first event organisers to stage an event in 2020 (maybe even the first) with their standard and middle distance event.

Organisation was good. There was quite a queue to get in using the drive-through registration, but that is understandable given the COVID-19 requirements. Other than this causing a slight delay to the start, everything went very smoothly for us as athletes.

As it was a quarter, rather than a standard distance, the distances were 1,000-metre swim, 47 km bike and 10 km run.

My splits were:

Section Time
Swim 26:28
T1 2:26
Bike 1:37:48
T2 3:38
Run 50:50

With a total time of:

3:01:09

I made a conscious decision at the start of the run that I wanted to enjoy it rather than try to push for sub-three-hours. I did the same race in 2018 and finished in 2:57:40, but I think the swim and bike course were slightly longer this time.

The Murder at the Vicarage

August 24th, 2020 | Books

The Murder at the Vicarage is a mystery novel by Agatha Christie. It is the first one I have read to feature Miss Marple.

I have heard plenty of jokes about the death rate in St Mary Mead and I do wonder how exactly so many novels will be spun out on the topic. Maybe she travels? Anyway, I enjoyed the book.

Murder on the Orient Express

August 23rd, 2020 | Books

Murder on the Orient Express is a mystery novel by Agatha Christie. It features Hercule Poirot and revolves around a passenger being murdered on the famous train that Poirot happens to be travelling on.

It has a nice twist (spoilers: there’s a twist!) although not quite as intriguing as And Then There Were None. I was not in love with Poirot as a character initially but I have since warmed to him. Overall, an enjoyable read.

And Then There Were None

August 22nd, 2020 | Books

And Then There Were None is a mystery novel by Agatha Christie. It was another punt on my unused Audible credits as recommended by Elina. It was the first Christie novel I have read and does without her two famous characters, Miss Marple and Hercule Poirot.

I really enjoyed it. In many ways, maybe I should not have started with such a good Christie novel as it has massively set my expectations for the other books I am reading.