<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.ronanlaker.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.ronanlaker.com/" rel="alternate" type="text/html" /><updated>2026-01-15T17:28:40+00:00</updated><id>https://www.ronanlaker.com/feed.xml</id><title type="html">Ronan Laker</title><subtitle>Data scientist with a space physics PhD</subtitle><author><name>Ronan Laker</name></author><entry><title type="html">A year of eating like the French</title><link href="https://www.ronanlaker.com/year-of-french-food/" rel="alternate" type="text/html" title="A year of eating like the French" /><published>2026-01-15T00:00:00+00:00</published><updated>2026-01-15T00:00:00+00:00</updated><id>https://www.ronanlaker.com/year-of-french-food</id><content type="html" xml:base="https://www.ronanlaker.com/year-of-french-food/"><![CDATA[<p>I made French food my culinary focus of last year. Each time I wanted a “project” to cook at the weekend, I made it my mission to recreate French classics I saw on YouTube. While I didn’t quite make it to recreating Pierre Koffman’s pig trotters, which two of my favourite cooking channels did within a week of each other (<a href="https://youtu.be/f9kJNrOqYQE?si=IQygS8W_PQzRfgOH">Fallow</a> and <a href="https://youtu.be/ipqFwCtPOgA?si=CuAdyZ2BdfFmFjpz">Adam Byatt</a>), I am pretty proud of the things I managed to make.</p>

<p>An essential quote for exploring French food</p>

<p><img src="/images/photos/french_food/Between Meals(1).png" alt="" /></p>

<h2 id="mains">Mains</h2>

<h3 id="sautéed-chicken-with-tarragon">Sautéed chicken with Tarragon</h3>

<p>This was the first dish that showed me the power of classical technique and I just love how a whole chicken can be transformed into this elegant final product. After scoring Larousse Gastronomique for £4 in a car boot sale, I followed its terse instructions to sauté chicken “à brun” then add shallots and deglaze with white wine. In the meantime, create a browned chicken stock from the leftover carcass and use this thickened sauce to finish off the sauce and get that shine. It’s such a good dish I created it four times within the year.</p>

<p><img src="/images/photos/french_food/IMG_2987.jpeg" alt="" /></p>

<h3 id="coq-au-vin">Coq au vin</h3>

<p>This <a href="https://youtu.be/3c6b18C5TpY?si=nJNNK31RRDb4B5zV">coq au vin</a> was what finally convinced me there was no such thing as cooking wine. I sacrificed two glasses of a nice Bordeaux as an experiment to marinate some old tough chicken legs. The result had that same zing I tasted in Paris and was much thinner than a classic British/Irish stew I was used to.</p>

<p>While I managed to make an excellent coq au vin, I was not so lucky with its cousin the beef Bourguignon. I was plagued by poor choice of beef cut, a reduced-price rib of beef disintegrated into flakes and another cheap cut from the local butchers was so chalky Dom Pérignon asked for their soil back.</p>

<h3 id="pommes-sardalaise">Pommes Sardalaise</h3>

<p>Being half Irish, I already had a pretty decent grasp on potatoes with mashed potato genuinely being my favourite food. So I was on the look out for other potato dishes to satiate my starchy appetite, and what’s the only way to beat butter? Duck fat.</p>

<p>Fair warning, this is an insane amount of duck fat so be prepared for the consequences the next day 💨.</p>

<h3 id="pan-bagnat">Pan Bagnat</h3>

<p>It’s all been a bit high brow up till now, so I’ll bring it down a level. One of my favourite guilty pleasure lunches is the Gregg’s tuna baguette. I can only assume they were inspired by this French picnic classic. This <a href="https://youtu.be/8GxzGND1NnA?si=YtAN6wOcOTWAZsM9">video</a> is the over-the-top version of this dish but has a really infectious energy.</p>

<p><img src="/images/photos/french_food/French_food - 1 (1).jpeg" alt="" /></p>

<h3 id="blanquette-de-poulet-couldnt-find-veau">Blanquette de poulet (couldn’t find veau)</h3>

<p>Another dish that we tried in Paris and reminded me of one of my favourite dishes growing up, Mum’s creamy chicken with rice. Instead of cream, this <a href="https://youtu.be/xn1BTnRmEb8?si=P9PFqdlqYY40iqy1">recipe</a> is thickened with a roux to make a velouté. Using the stock from poaching the chicken and vegetables is such a genius technique and gives the sauce an amazing flavour. Its also mind blowing how much each element retains its own flavour, making every mouthful different.</p>

<p><img src="/images/photos/french_food/French_food - 2.jpeg" alt="" /></p>

<h3 id="french-onion-soup">French Onion soup</h3>

<p>More of a recipe to prove I’ve done it than something I would make regularly. Needs even more cheese than you think. Slices worked much better than grating it on.</p>

<p><img src="/images/photos/french_food/French_food - 42.jpeg" alt="" /></p>

<h3 id="consommé">Consommé</h3>

<p>The <a href="https://youtu.be/YBZXdQwQEfA?si=Pt-mRnxXquFD3NfH">technique</a> was like magic. I think I got the ratios of vegetables slightly off so the taste was a bit too carroty but it was still a cool thing to create.</p>

<p><img src="/images/photos/french_food/French_food - 32.jpeg" alt="" /></p>

<h3 id="onion-tart-tatin">Onion tart tatin</h3>

<p>We definitely managed to capture the taste but our onions fell apart a bit compared to immaculate YouTube videos, but I am not willing to spend over £10 on Roscoff onions.</p>

<p><img src="/images/photos/french_food/Onion_tarte_tatin - 1.jpeg" alt="" /></p>

<p><img src="/images/photos/french_food/Onion_tarte_tatin - 2.jpeg" alt="" /></p>

<p><img src="/images/photos/french_food/Onion_tarte_tatin - 3.jpeg" alt="" /></p>

<h3 id="ratatouille">Ratatouille</h3>

<p>I tried the fancy movie version of this dish a few years ago and it all just turned into mush… So I was happier with this fine dining <a href="https://youtube.com/shorts/ctL5ZZN1KYA?si=mrx-RhqXuVjdCZ2O">version</a>, but I still think the dicing is slightly overkill.</p>

<p><img src="/images/photos/french_food/image 6.jpg" alt="" /></p>

<h2 id="dessert">Dessert</h2>

<p>I never thought I would be that guy, but a stand mixer purchase really improved my pâtisserie game towards the end of the year. Yes it did cost several hundreds of pounds, but I can now spend all day creating Lemon meringue tarts instead of spending £5.50 per tart at <a href="https://www.lechoux.com/products/copy-of-lemon-meringue-tart">Choux</a> so who’s laughing now… In my defense, it is the most fun I’ve ever had making a dessert.</p>

<h3 id="lemon-meringue-tart">Lemon meringue tart</h3>

<p><img src="/images/photos/french_food/French_food - 64.jpeg" alt="" /></p>

<p><img src="/images/photos/french_food/French_food - 66.jpeg" alt="" /></p>

<p>Just look how cute these are! This dessert also unlocks lemon curd, sweet pastry and Italian meringue from the bucket list.</p>

<h3 id="madeleines">Madeleines</h3>

<p>I bought the madeleine tray in Paris so I kind of had to learn how to make these. My humps can’t rival <a href="https://youtu.be/GIwkqVp54Nk?si=oKDXUDYpWasapuce">Aya’s</a>, but at least I could tut at The Great British Bake Off for giving the contestants silicon madeleine moulds in the final. Don’t they know its the contrast of hot oven and cold tray that creates the bump?!</p>

<p><img src="/images/photos/french_food/French_food - 36.jpeg" alt="" /></p>

<p><img src="/images/photos/french_food/French_food - 35.jpeg" alt="" /></p>

<h3 id="profiteroles">Profiteroles</h3>

<p>Éclairs are another one of my favourite desserts that costs £5.50 a pop at <a href="https://www.lechoux.com/products/chocolate-cream-eclairs">Le Choux</a>, which obviously justifies making too many to eat myself. I went for profiteroles instead after trying them at Paulette (<a href="#paulette">below</a>). Much like doing a physics degree is now only useful for answering University Challenge questions, I probably won’t make these more than once a year but at least I know what crème diplomat is.</p>

<p>Start with making the pastry cream, used this <a href="https://youtu.be/Ud_VZOHv6mY?si=zD7eUsWZinc3mqqW">video</a> for the choux pastry and crème diplomat but swapped to this <a href="https://youtu.be/659K-yU9B9M?si=dmuVnpfBEHx4zbhX">video</a> for the chocolate topping.</p>

<p>Somehow I forgot to take a picture!</p>

<h3 id="crème-brûlée">Crème Brûlée</h3>

<p>Actually much easier than it seems, I already had a blow torch in my endless quest to perfect egg fried rice. Be careful not to burn the sugar as it gets very bitter.</p>

<p><img src="/images/photos/french_food/French_food - 13.jpeg" alt="" /></p>

<h3 id="chocolate-mousse">Chocolate Mousse</h3>

<p>We tried so many recipes but we couldn’t get it quite right before the sight of mousse became sickening. I think the “French classics” (<a href="#sources">below</a>) version is probably the best, but I just hate the idea of using an uneven number of egg whites and yolks.</p>

<p><img src="/images/photos/french_food/French_food - 1.jpeg" alt="" /></p>

<p><img src="/images/photos/french_food/French_food - 31.jpeg" alt="" /></p>

<h2 id="restaurants">Restaurants</h2>

<h3 id="bouillon-chartier">Bouillon Chartier</h3>

<p>Bouillon Chartier was just so perfectly French. A terse conversation with the waiter yielded all the classics we could fit into one sitting. I’m sure you can tell from the scribbles on our table, but we ordered 1/2 a Bordeaux, 12 escargot, pork terrine, leeks vinaigrette, beef Bourguignon, boudin noir and even tête de veau. Judging from their wandering eyes and tutting heads, this was far too much food according to the elderly French couple sharing our table. Thankfully the quality of the food meant I didn’t need any more encouragment from our geriatric neighbours to clean the plates.</p>

<p><img src="/images/photos/french_food/Chartier%20-%205.jpeg" alt="" /></p>

<p>The Bourguignon had huge chunks of tender beef and serving it with Macaroni rather than mashed potato was something new to me.</p>

<p><img src="/images/photos/french_food/Chartier%20-%203.jpeg" alt="" /></p>

<p>Thankfully, I still got my mash fix with the boudin noir, essentially a black pudding sausage. The taste was excellent, but the lack of oats in the sausage meant its texture was too similar to the mash.</p>

<p><img src="/images/photos/french_food/Chartier%20-%201.jpeg" alt="" /></p>

<p>While the picture doesn’t make the tête de veau look particularly appetising, the meat was exceptionally tender and the fat/gelatin had an amazingly chewy texture reminiscent of a beef tendon we had in another fancier restaurant.</p>

<p><img src="/images/photos/french_food/Chartier%20-%202.jpeg" alt="" /></p>

<p>We absolutely loved this place, it was just so grand yet down to earth at the same time. Like the horrible tourists we were, we ended up buying 4 wine glasses and two side plates with the Bouillon Chartier logo on (I’m sure you’ve noticed from some of the other pictures in this page).</p>

<h3 id="brasserie-zédel">Brasserie Zédel</h3>

<p>Still can’t believe this place exists in London. The online menu makes it look like any other French bistro with inexplicably higher prices, but once you step into the dining room it all makes sense. The food was so good I didn’t even mind the live Jazz.</p>

<p>This special of Asparagus with Bearnaise and a poached duck egg was just perfectly creamy and fresh. It was gone before we knew it.</p>

<p><img src="/images/photos/french_food/French_food - 18.jpeg" alt="" /></p>

<p>I had the Choucroute Zédel, the biggest of three choucroute options, as I wanted to try as many assorted meats as possible. It turns out to be a mountain of food which would normally be impossible to get through without the choucroute (sauerkraut) providing a fresh, tangy offset to the meat. My favourite was the smoked ham hock, which was reminiscent of those thick cut BBQ ribs. My only criticism is that the potatoes were surplus to requirement and were just a bit bland.</p>

<p><img src="/images/photos/french_food/French_food - 19.jpeg" alt="" /></p>

<p>We also had the dressed crab, which was easily the best I’ve ever had.</p>

<p><img src="/images/photos/french_food/French_food - 20.jpeg" alt="" /></p>

<h3 id="paulette">Paulette</h3>

<p>We went to this small French bistro for our 1st wedding anniversary after hearing about through work colleagues. If it wasn’t such a special event I would have paid more attention to the prices, but leaving that aside the food was really very good indeed.</p>

<p>For starters we tried three classics.</p>

<p>We wanted to see a real onion tarte tatin in the wild after trying our own version (<a href="#onion-tart-tatin">above</a>). This had a great taste but was served cold and therefore became a bit soggy. Obviously, we ordered Escargot Bourgogne but these were very different to normal garlic-y ones. Much more herby taste which wasn’t as good as normal in my opinion. The real star was the moules à la crème au piment d’Espelette - the best mussel sauce I’ve ever had. It tasted great, the little hint of heat in the background and strong mussel flavour. The thickness, as well as taste, of the sauce practically forced you to order another round of bread in spite of the £6 fee.</p>

<p><img src="/images/photos/french_food/French_food - 44.jpeg" alt="" /></p>

<p>Confit duck leg with tarbais beans (the ones used in Cassoulet) was also very good. Simple but perfectly balanced, again a background spice to keep it lingering between mouthfuls and herby punch on top. Went really well with the garlic creamy spinach.</p>

<p>Just look at it. Beautiful.</p>

<p><img src="/images/photos/french_food/French_food - 48.jpeg" alt="" /></p>

<p>I’ve tried making beurre blanc at home but I keep thinking “it can’t possibly be that much butter”. I think I was proved wrong with this Cod in buerre blanc sauce. The sauce was really mild and smooth, mainly tasted the chives with just a subtle butter in the background. Again, a beautiful presentation that’s not out of reach at home.</p>

<p><img src="/images/photos/french_food/French_food - 47.jpeg" alt="" /></p>

<p>The Tart Bordaloue was a pleasant surprise, the chocolate layer must have used the exact same chocolate as a Pain au Chocolat.</p>

<p><img src="/images/photos/french_food/French_food - 50 1.jpeg" alt="" /></p>

<p>The finale was profiteroles. The chocolate sauce was so fun, but the ice cream was actually a bit too cold. I would have preferred whipped cream or crème diplomat (<a href="#profiteroles">above</a>).</p>

<p><img src="/images/photos/french_food/French_food - 51.jpeg" alt="" /></p>

<h2 id="summary">Summary</h2>

<p>So what have I gained from eating like a Frenchman for a year? Well, from a technique perspective I think I’ve come a long way. The other day I made the <a href="#blanquette-de-poulet-couldnt-find-veau">blanquette the poulet</a> almost a year after the first attempt. It tasted so much fuller than the first try, probably because of little things like salting in each step and not letting it boil too ferociously. Another example of the learning the “little things” is with the <a href="#sautéed-chicken-with-tarragon">sautéed chicken and tarragon</a>. Having made it so many times I can now instinctively judge when the shallots have been sweated down enough, and I know how to evaporate the wine until the reduction looks a bit jammy. These skills are applicable in so much other cooking, like a risotto or gravy, which is why I chose French as the cuisine to focus on first. The downside is that I do now use double the amount of pans for the same recipe, which is a real killer when we don’t have a dishwasher.</p>

<p>I have also learnt that you can find much better recipes when you search in the native language, something I plan on continuing when I take on Italian cuisine in the coming year. I already have a much better foundation in Italian than I did in French, but I am determined to learn how to make good fresh pasta. Although, the only Italian dessert I really enjoy is Tiramisu, so I think I will continue with French patisserie and even take on the dreaded Macaron.</p>

<p>So I’ll bid French cuisine <em>adieu</em> for now and start practicing my 🤌.</p>

<h2 id="sources">Sources</h2>

<h3 id="youtube">Youtube</h3>

<ul>
  <li><a href="https://www.youtube.com/@PastryLivingwithAya">Pastry living with Aya</a> for all things baking.</li>
  <li><a href="https://www.youtube.com/@ChefAdamByatt">Adam Byatt</a> makes things look effortless</li>
  <li><a href="https://www.youtube.com/@MatthewJRyle/shorts">Matthew Ryle</a> is great for inspiration but only does shorts. See his book “French Classics” below</li>
  <li><a href="https://www.youtube.com/@FallowChefs">Fallow</a> are great when they cover French food</li>
</ul>

<h3 id="books">Books</h3>

<ul>
  <li><a href="https://www.matthewryle.com/book-french-classics-matthew-ryle">French Classics</a> looks great and tastes great</li>
  <li><a href="https://en.wikipedia.org/wiki/Mastering_the_Art_of_French_Cooking">Mastering the Art of French Cooking</a> is fun to look through but not massively useful to cook from</li>
  <li><a href="https://en.wikipedia.org/wiki/Larousse_Gastronomique">Larouse Gastronomique</a> is really fun to look through for inspiration but very few instructions. I managed to find my copy for £4 in a car boot sale when its worth £60 new</li>
  <li><a href="https://www.penguin.co.uk/books/456094/between-meals-by-liebling-a-j/9780241637975">Between Meals</a> and <a href="https://www.penguinrandomhouse.com/books/157092/the-food-of-france-by-waverley-root/">The Food of France</a> are both guides to French food written in the early 20th century and still make for fascinating reading</li>
</ul>]]></content><author><name>Ronan Laker</name></author><category term="food" /></entry><entry><title type="html">Logs to the rescue</title><link href="https://www.ronanlaker.com/logging/" rel="alternate" type="text/html" title="Logs to the rescue" /><published>2025-11-17T00:00:00+00:00</published><updated>2025-11-17T00:00:00+00:00</updated><id>https://www.ronanlaker.com/logging</id><content type="html" xml:base="https://www.ronanlaker.com/logging/"><![CDATA[<p>I’ve always been partial to a few print statements when debugging my personal coding projects. Now, having worked on code behind an API, I have come to appreciate the benefit of switching <code class="language-plaintext highlighter-rouge">print()</code> for <code class="language-plaintext highlighter-rouge">logger.info</code>. It only takes a few lines to set the root logger configuration, which adds useful metadata to every debugging message:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import logging
import jsonlogger

logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)

# StreamHandler to stdout
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)

# Define a simple message format
log_format = "%(asctime)s [%(module)s &gt; %(funcName)] : %(message)s"
formatter = jsonlogger.JsonFormatter(log_format)
handler.setFormatter(formatter)

logger.addHandler(handler)
</code></pre></div></div>

<blockquote>
  <p>Of course, there is an excellent tutorial at <a href="https://calmcode.io/course/logging/introduction">calmcode.io</a></p>
</blockquote>

<p>This has become very handy when I recently took over a machine learning pipeline that was churning out thousands of logs, with Pytorch printing every update in a progress bar and cmdstanpy insisting on telling me about its chains.</p>

<p>In this same logging configuration file, we can turn these annoying logs off. There could be a more consistent way to do this, but this is what worked for me.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import cmdstanpy
cmdstanpy.disable_logging()

noisy_libs = ["neuralforecast", "pandas", "snowflake.connector"]
for lib in noise_libs:
    logging.getLogger(lib).setLevel(logging.WARNING)
</code></pre></div></div>

<p>Finally, when looking at the logs in DataDog I could see that any logs not generated by me, but by other packages like pandas, were mising the lovely context data (i.e. environment, market, model). We can fix this by adding a filter to the base logger, which then adds our context to all logs in the stdout output.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>class ContextFilter(logging.Filter):
    def __init__(self, context):
        super().__init__()
        self.context = context
    
    def filter(self, record):
        for key, value in self.context.items():
            setattr(record, key, value)
        return True

root_logger = logging.getLogger()
logHandler = logging.StreamHandler(stream = sys.stdout)

logHandler.addFilter(ContextFilter(context))
</code></pre></div></div>]]></content><author><name>Ronan Laker</name></author><category term="code" /></entry><entry><title type="html">What the hell is happening on the internet?</title><link href="https://www.ronanlaker.com/critical-thinking-for-social-media/" rel="alternate" type="text/html" title="What the hell is happening on the internet?" /><published>2025-09-02T00:00:00+00:00</published><updated>2025-09-02T00:00:00+00:00</updated><id>https://www.ronanlaker.com/critical-thinking-for-social-media</id><content type="html" xml:base="https://www.ronanlaker.com/critical-thinking-for-social-media/"><![CDATA[<p>As this viral <a href="https://x.com/molochofficial/status/1858940244567146823?s=12&amp;t=GArJOEJ41SKT7sLfzFsugQ&amp;utm_source=www.garbageday.email&amp;utm_medium=referral&amp;utm_campaign=the-internet-s-most-vocal-freaks">tweet</a> posits, without an apex media predator in Ellen DeGeneres, internet characters are sticking around long enough to become media figures in their own right. Being on the cusp of Milliennials and Gen Z, I have stubbonly refused to install TikTok which means I have no idea who the hell characters like “Beavo” or the “Schooner scorer” are.</p>

<p>Luckily, like anything on the internet, <strong>there is a podcast for that</strong>.</p>

<p><a href="https://youtube.com/@thescreenrotpodcast?si=EMNs-g2NxWkEmy4F">The screen rot podcast</a> is a sort of media literacy for the social media age. While anyone could poke fun at some internet figure for an hour, these guys are amazing at finding that one that killer insight. When analysing the enigma of Beavo, they presented a clip of Beavo saying “I will do anything” for views. In the process of throwing “trends” on the wall and seeing what sticks, we see how Beavo started eating food on camera and accidently became famous because it turns out he doesn’t chew food before swallowing it…</p>

<p>My favourite “internet” newsletter, <a href="https://www.garbageday.email/c/about">Garbage Day</a>, had a similar take on Mr Beast:</p>

<blockquote>
  <p>“His success is less of a reflection of his own entertainment knowhow and more a reflection of what YouTube’s algorithm looks like when stripped raw.”</p>
</blockquote>

<p>I love this newsletter because it traces how memes and stories make it into the mainstream, which is increasingly important since memes can now directly influence White House policies. As Garbage day <a href="https://www.garbageday.email/p/the-uncanny-valley-between-meme-and-law-9650f12b480c7005">explains</a>, “DOGE was cutting federal funding in <a href="https://www.chalkbeat.org/2025/02/20/chris-rufo-social-media-posts-driving-education-department-cuts/">direct response</a> to posts from right-wing activist Chris Rufo […] Even the name, ‘Department of Government Efficiency,’ <a href="https://x.com/elonmusk/status/1825713824785379477">came from</a> an Elon Musk reply guy going by ‘Sir Doge Of The Coin.’”</p>

<p>With this kind of stuff happening in the world, it’s probably better off reading this newsletter than paying for the Economist.</p>

<p>A more traditionally “serious” source of analysis is the excellent <a href="https://www.youtube.com/playlist?list=PLDTPrMoGHssAfgMMS3L5LpLNFMNp1U_Nq">If you’re listening</a> show on YouTube. This handles larger geopolitical issues, and does a really good job of painting the overall picture in an entertaining format. They also also picked up on the idea that politics is now being influence by memes and tweets. They traced how an AI video of a resort in Gaza was designed specifically to <a href="https://youtu.be/DdUGdSEXkQU?si=rEedSkyZ-5aDeLKP">influence Trump’s policy</a> in the Middle East.</p>

<p>Maybe all this analysis is futile, but at least it’s entertaining.</p>]]></content><author><name>Ronan Laker</name></author></entry><entry><title type="html">Learning languages in 2025</title><link href="https://www.ronanlaker.com/learning-languages/" rel="alternate" type="text/html" title="Learning languages in 2025" /><published>2025-07-14T00:00:00+00:00</published><updated>2025-07-14T00:00:00+00:00</updated><id>https://www.ronanlaker.com/learning-languages</id><content type="html" xml:base="https://www.ronanlaker.com/learning-languages/"><![CDATA[<p>Despite being the proud owner of an A* in GCSE French, <em>je parle pas un mot</em>. Since I have joined a predominately French company I’ve decided to try learning it again, even if I just to understand the back of a wine bottle.</p>

<p>This aim has coincided with a requirement at work to 10x the speed of our Python API, which will probably require rewriting parts in another programming language.</p>

<p>Given its been &gt;10 years since I attempted to learn any language, programming or natural, are there better ways to teach myself in 2025?</p>

<h1 id="french">French</h1>

<h2 id="duolingo">Duolingo</h2>

<p>Duolingo isn’t the greatest app in the world, but my god is it good at peer pressure. Having to do at least <em>some</em> French every day is a good way to keep up my motivation and build vocabulary.</p>

<p>Luckily for me, <a href="https://youtube.com/watch?v=TUL29y0vJ8Q&amp;si=EXkpFPl6jOWpNNbz">30% of English vocabulary is based on French</a> so I can bluff my way past the easy levels. However, this app isn’t very helpful for learning about grammar rules or how French people actually speak.</p>

<h2 id="youtube">Youtube</h2>

<p>For that, Youtube is an absolute gold mine. I can watch:</p>
<ul>
  <li><a href="https://youtu.be/SApp5pEtCB4?si=OPeOpvtQjZT2-SZF">grammar explanations</a></li>
  <li><a href="https://youtu.be/YCuU4SjcS2A?si=QDmyp-w6hplCKcmI">people being interviewed in the street</a></li>
  <li><a href="https://youtu.be/q3gxfqXTj_E?si=eha6TPlH925axXpX">Jokes about the language</a></li>
</ul>

<p>Youtube’s auto-translation is so good that it opens up the chance to watch <em>unbelievably</em> French videos like:</p>
<ul>
  <li><a href="https://youtu.be/DW5DXfCF3hE?si=w4mHtGtyOMzoiuGE">A man in a beret who kills his rooster to make coq au vin</a></li>
  <li><a href="https://youtu.be/hnlijylU8Q4?si=8N-qzYtVEHK0pDx-">A different man in a beret showing me how Mont D’or is made</a></li>
  <li><a href="https://www.youtube.com/watch?v=urIwhx3uHug">a dude wearing a questionable number of knives</a></li>
</ul>

<h1 id="rust">Rust</h1>

<p>I’ve been using Python for 10+ years and have learnt a lot of general programming concepts through it, e.g. Object oriented, iterators, threading. However, I think I need to learn a low-level language that I can turn to when I need performance.</p>

<p>For example, I was working on some code that merged two dataframes and then exploded the columns to something like 5 millions rows. When written in pure Python it would take 4.4 seconds compared to a ridiculous 0.15s in <a href="https://www.rust-lang.org/">Rust</a>. It has become a bit of a meme to “re-write this in Rust”, so it was definitely on my radar but I couldn’t tell why it was so different.</p>

<h2 id="the-rust-book">The Rust Book</h2>

<p><a href="https://rust-book.cs.brown.edu/ch00-00-introduction.html">The rust book</a> is an incredible resource. Not only does it show you the syntax, but it has diagrams like this to explain concepts like <a href="https://rust-book.cs.brown.edu/ch04-02-references-and-borrowing.html">ownership and borrowing</a></p>

<p><img src="/images/the_rust_book.png" alt="" /></p>

<p>So, I’m not only learning about one new language but I’m being guided through concepts like heap and stack memory, pointers and everything else Python abstracts away.</p>

<p>I will probably still use Python for 90% of what I do, but its nice to be able to see how another language handles common pain points in Python like error messages and packaging.</p>

<h2 id="rustlings">Rustlings</h2>

<p><a href="https://rustlings.rust-lang.org/">Rustlings</a> is the perfect partner to the Rust book, as it gives you 94 example scripts with compiler errors that you need to fix. This also demonstrates just how incredible the compiler is at helping you fix mistakes.</p>

<h2 id="youtube-1">Youtube</h2>

<p>There is a lot of nonsense about “which programming language is the best”, but I found this gem of a channel that explains why Rust is great</p>

<p><img src="https://youtu.be/2hXNd6x9sZs?si=qhvfe5Pw_0HSSNkN" alt="" /></p>]]></content><author><name>Ronan Laker</name></author><category term="code" /></entry><entry><title type="html">Spatial Data Science Conference 2025</title><link href="https://www.ronanlaker.com/spatial-data-science-conference/" rel="alternate" type="text/html" title="Spatial Data Science Conference 2025" /><published>2025-06-13T00:00:00+00:00</published><updated>2025-06-13T00:00:00+00:00</updated><id>https://www.ronanlaker.com/spatial-data-science-conference</id><content type="html" xml:base="https://www.ronanlaker.com/spatial-data-science-conference/"><![CDATA[<p>I haven’t been to a conference since I left academia, so I was interested to see how a corporate sponsored conference would compare. I, along with a few colleagues, attended the <a href="https://spatial-data-science-conference.com/2025/london">Spatial Data Science Conference</a> (SDSC). The whole shindig was sponsored by <a href="https://carto.com/">Carto</a>, a SaaS company specialising in no-code mapping applications. I’m not entirely sure what they do, but it seems to be a platform for plotting spatial data aimed at companies that may not have experience themselves (<a href="https://carto.com/blog/space-time-anomaly-detection-smarter-property-risk-assessment">example 1</a>, <a href="https://carto.com/blog/space-time-analysis-the-paris-olympics">example 2</a>).</p>

<p>There were three stand out talks for me:</p>
<ol>
  <li><strong>“The Emotions of Building Geospatial AI to Save the Earth”</strong> by <a href="https://www.wri.org/profile/craig-mills"><strong>Craig Mills</strong></a>. On the surface, this seemed like a wishy-washy “save the planet” kind of talk but the speaker really grabbed the audiences’ attention. The main result was a model that could track the height of trees from satellite images. Although he didn’t really explain how this worked (I’m guessing shadow lengths + local drone mappings?), he wove the results into a larger narrative about how we talk about the climate. It was a good mixture of serious discussion and impressive data science.</li>
  <li><strong>“Mobility Data Analytics for the Cloud: Introducing Trajectory Analysis Extension”</strong> by <a href="https://anitagraser.com/">Anita Graser</a>. This was by far and away the most technical talk of the day and I loved it. The speaker is the developer behind a successful open-source project, <a href="https://movingpandas.org/">Moving Pandas</a>, and she spoke about integrating another one of her Python packages into Carto. I wonder if they pay her…</li>
  <li><strong>“Transforming Out-of-home advertising: VIOOH’s Geospatial Innovation”</strong> by <a href="https://theorg.com/org/viooh/org-chart/remy-prom">Rémy Prom</a>. Obviously I am biased because Remy is my colleague, but this was a great talk about using new technology to wrench the commercial team away from Excel.</li>
</ol>

<p>Being a spatial data conference, the talks had some of the most beautiful slides I’ve ever seen at a conference. Even as I approached a comatose state after hearing AI for the 37th time, it was nice to have a pretty map to soothe me.</p>

<p>Towards the end of the conference, they revealed that an artist (<a href="https://scribeyak.com/">ScribeYak</a>) had been doodling a representation of the whole thing. What an amazing idea!</p>

<p><img src="/images/SDSC%20-%201.jpeg" alt="" /></p>

<p>As a fortunate coincidence, the conference was held at the Royal Geographical Society, which happens to be a stones throw away from the Blackett building (where I got my Master’s and PhD). After the talks, we went to the Union bar for some drinks. I couldn’t resist getting out my old captain’s tankard from my football days…</p>

<p><img src="/images/tankard%20-%201.jpeg" alt="" /></p>]]></content><author><name>Ronan Laker</name></author><category term="data" /></entry><entry><title type="html">Attempting to write formatter for GAMS</title><link href="https://www.ronanlaker.com/gams-formatter/" rel="alternate" type="text/html" title="Attempting to write formatter for GAMS" /><published>2025-05-09T00:00:00+00:00</published><updated>2025-05-09T00:00:00+00:00</updated><id>https://www.ronanlaker.com/gams-formatter</id><content type="html" xml:base="https://www.ronanlaker.com/gams-formatter/"><![CDATA[<p>My current focus at work is developing the in house linear programming solver, mostly written in <a href="https://www.gams.com/products/gams/gams-language/">GAMS</a>. This “Generic Algebraic Modelling System” is a high level language for describing linear optimisation problems, that it can then compile into any low level solver, such as <a href="https://www.ibm.com/products/ilog-cplex-optimization-studio/cplex-optimizer">CPLEX</a>.</p>

<p>As an example, say we have 5 items, $i$, and a rucksack with capacity <code class="language-plaintext highlighter-rouge">100</code>, how do we decide which items to put into the bag? Each one has a different weight, $w_{i}$ and value, $v_{i}$ and we can set up the problem by introducing a new binary variable $x_i$ to represent if we pick that item or not.</p>

<p>We can then write the objective function to maximise as: 
\(Z = x_1*v_{1} + x_2*v_{2} + x_3*v_{3} + x_4*v_{4} + x_5*v_{5}\)</p>

<p>subject to the constraint: 
\(x_1*w_{1} + x_2*w_{2} + x_3*w_{3} + x_4*w_{4} + x_5*w_{5} \le 100\)</p>

<p>This representation obviously does not scale well with 1000s of items, so we can refactor it in GAMS like so:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Z =e= sum(i, x(i) * v(i) )
</code></pre></div></div>

<p>and</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sum(i, x(i) * w(i) ) =l= 100
</code></pre></div></div>

<p>That all seems fairly innocuous, but when you write an application to handle complex business logic it can turn into a sea of parentheses…</p>

<p>This issue gets worse when you discover that there are no formatting rules in GAMS! Imagine my horror when trying to understand what a thousand lines like this could be doing</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>equation_1(a)$(condition_1(i,j,t) and value_1(x) &lt; value_2(x)).. sum((ab(a,b),bc(b,c),cd(c,d)), value(a,b,c,d)$(condition_2(a,b,c,d))) =l= 100
</code></pre></div></div>

<h1 id="topiary">Topiary</h1>

<p>I couldn’t find a formatter, like <a href="https://docs.astral.sh/ruff/formatter/">ruff</a>, that could understand this GAMS code, so I made the terrible decision of trying to write my own…</p>

<p>Things started off well after finding this very recent (Jan 2025) blog <a href="https://www.tweag.io/blog/2025-01-30-topiary-tutorial-part-1">post</a> about a new “universal formatting engine” called <a href="https://topiary.tweag.io/">Topiary</a>. Apparently, all I needed to do was use the tree-sitter package to generate a grammar.js file and I would be off and away.</p>

<p>This great <a href="https://derek.stride.host/posts/comprehensive-introduction-to-tree-sitter">intro</a> to syntax trees shows how we can define rules to turn expressions like $x*y+z$ into the syntax tree below</p>

<p><img src="https://derek.stride.host/assets/images/graphs/tree-sitter-parsing-part-6.svg" /></p>

<p>Because we could parse this tree as <code class="language-plaintext highlighter-rouge">(x + y) + z</code> or <code class="language-plaintext highlighter-rouge">x + ( y + z)</code> we need to explicitly tell the parser that we prefer the left option (in the <code class="language-plaintext highlighter-rouge">grammar.js</code> this is done with <code class="language-plaintext highlighter-rouge">prec.left()</code> wrapped around the rule)</p>

<p>In GAMS you can assign a set like <code class="language-plaintext highlighter-rouge">x = 1</code>, a subset of the set <code class="language-plaintext highlighter-rouge">x(i) = 1</code> or an attribute <code class="language-plaintext highlighter-rouge">x.lo(i) = 1</code>. We can set up these rules like so:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">parameter_reference</span><span class="p">:</span> <span class="nx">$</span> <span class="o">=&gt;</span> <span class="nx">seq</span><span class="p">(</span>
	<span class="nx">$</span><span class="p">.</span><span class="nx">identifer</span><span class="p">,</span>
	<span class="nx">optional</span><span class="p">(</span><span class="nx">seq</span><span class="p">(</span><span class="nx">token</span><span class="p">(</span><span class="dl">"</span><span class="s2">.</span><span class="dl">"</span><span class="p">),</span> <span class="nx">$</span><span class="p">.</span><span class="nx">attribute</span><span class="p">)),</span>
	<span class="nx">optional</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">indexing</span><span class="p">)</span>
<span class="p">)</span>

<span class="nx">$</span><span class="p">.</span><span class="nx">identifer</span><span class="p">:</span> <span class="nx">$</span> <span class="o">=&gt;</span> <span class="sr">/</span><span class="se">[</span><span class="sr">a-zA-Z_</span><span class="se">][</span><span class="sr">a-zA-Z0-9_</span><span class="se">]</span><span class="sr">*/</span><span class="p">,</span> <span class="c1">//matches letters</span>

<span class="nx">$</span><span class="p">.</span><span class="nx">attribute</span><span class="p">:</span> <span class="nx">$</span> <span class="o">=&gt;</span> <span class="nx">choice</span><span class="p">(</span>
	<span class="dl">"</span><span class="s2">l</span><span class="dl">"</span><span class="p">,</span>
	<span class="dl">"</span><span class="s2">lo</span><span class="dl">"</span><span class="p">,</span>
	<span class="dl">"</span><span class="s2">up</span><span class="dl">"</span><span class="p">,</span>
	<span class="dl">"</span><span class="s2">scale</span><span class="dl">"</span><span class="p">,</span>
	<span class="dl">"</span><span class="s2">fx</span><span class="dl">"</span>
<span class="p">),</span>

<span class="nx">$</span><span class="p">.</span><span class="nx">indexing</span><span class="p">:</span> <span class="nx">$</span> <span class="o">=&gt;</span> <span class="nx">seq</span><span class="p">(</span>
	<span class="dl">"</span><span class="s2">(</span><span class="dl">"</span><span class="p">,</span>
	<span class="nx">$</span><span class="p">.</span><span class="nx">identifier</span><span class="p">,</span>
	<span class="nx">optional</span><span class="p">(</span><span class="nx">seq</span><span class="p">(</span><span class="dl">"</span><span class="s2">,</span><span class="dl">"</span><span class="p">,</span> <span class="nx">$</span><span class="p">.</span><span class="nx">identifier</span><span class="p">)),</span>
	<span class="dl">"</span><span class="s2">)</span><span class="dl">"</span>
<span class="p">)</span>
</code></pre></div></div>

<p>which should be able to handle:</p>
<ul>
  <li><code class="language-plaintext highlighter-rouge">x</code> as <code class="language-plaintext highlighter-rouge">identifer</code></li>
  <li><code class="language-plaintext highlighter-rouge">x(i)</code> as <code class="language-plaintext highlighter-rouge">identifier(index)</code></li>
  <li><code class="language-plaintext highlighter-rouge">x.lo(i)</code>  as <code class="language-plaintext highlighter-rouge">identifier.attribute(index)</code></li>
</ul>

<p>However, I couldn’t vibe code my way past the issue that tree-sitter reads from left to right, meaning it reads the <code class="language-plaintext highlighter-rouge">x</code> in <code class="language-plaintext highlighter-rouge">x.lo(i)</code> and instantly assigns it as its own parameter_reference before waiting to read the whole <code class="language-plaintext highlighter-rouge">x.lo(i)</code>!!!</p>

<p>I tried changing the precedence of rules (as explained above) but nothing worked. Weirdly if I have something like <code class="language-plaintext highlighter-rouge">x.lo(i) = y.lo(i)</code> it parses properly on the RHS but not the LHS!!</p>

<p>At this point I gave up, because GAMS has a lot of syntax rules and I couldn’t even get past <code class="language-plaintext highlighter-rouge">x.lo(i)</code>…</p>

<p>…and then we got access to GitHub copilot at work. I asked copilot to format my files for me and hey presto, I got something like this</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>equation_1(a)$(
	condition_1(i,j,t) 
	and value_1(x) &lt; value_2(x)
	)
	.. 
	sum(
		(
			ab(a,b),
			bc(b,c),
			cd(c,d)
		),
		value(a,b,c,d)$(condition_2(a,b,c,d))
	) =l= 100
</code></pre></div></div>

<p>So, who needs to meticulously build a parser these days when all the languages on the internet have been modelled in an LLM?</p>

<p>At least I now have more respect whenever I see syntax highlighting.</p>

<blockquote>
  <p>As an aside, these types of syntax trees are useful for understanding grammar in natural languages (as I read in <a href="https://en.wikipedia.org/wiki/The_Sense_of_Style">The Sense of Style</a>)</p>

  <p><img src="https://external-content.duckduckgo.com/iu/?u=http%3A%2F%2Fellinfobcps.weebly.com%2Fuploads%2F4%2F8%2F6%2F7%2F48674241%2F650692067.png&amp;f=1&amp;nofb=1&amp;ipt=8bcc605927ef165c999ea0fd776183bde15d174b32214f0a5340ababa29c3fb5" /></p>

</blockquote>]]></content><author><name>Ronan Laker</name></author><category term="til" /><summary type="html"><![CDATA[and having more respect for syntax highlighting]]></summary></entry><entry><title type="html">The internet infrastructure meme happened to me!</title><link href="https://www.ronanlaker.com/ssl-certificate-bug/" rel="alternate" type="text/html" title="The internet infrastructure meme happened to me!" /><published>2025-05-01T00:00:00+00:00</published><updated>2025-05-01T00:00:00+00:00</updated><id>https://www.ronanlaker.com/ssl-certificate-bug</id><content type="html" xml:base="https://www.ronanlaker.com/ssl-certificate-bug/"><![CDATA[<p>Today I experienced this famous xkcd <a href="https://xkcd.com/2347/">meme</a> for the first time in production</p>

<p><img src="https://imgs.xkcd.com/comics/dependency_2x.png" alt="" /></p>

<p>We noticed our data wasn’t being transferred from s3 to snowflake, with the error saying</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The certificate is revoked or could not be validated: hostname=sfc-eu-ds1-customer-stage.s3.amazonaws.com
</code></pre></div></div>

<p>After quickly asking ChatGPT how SSL certificates work, I found this GitHub issue with the <a href="https://github.com/certifi/python-certifi">certifi</a> package. They had pushed new SSL certificates which exposed a bug in how snowflake authenticated such certificates.</p>

<blockquote>
  <p>Hey all, Snowflake Engineering team here. We acknowledge that the impact to Snowflake-to-S3 use cases here stems from a bug in our implementation of chain validation in the Snowflake Python connector. The code ought to validate against the Amazon Root CA trust anchor instead of checking for the validity of all the certificates in the certificate chain. We are <a href="https://github.com/snowflakedb/snowflake-connector-python/commit/243133602626bd38985b6ff44f4e6a8f5fa4bca3">fixing</a> this in the Python Connector and are on track to release a patch by Apr 30.</p>
</blockquote>

<p>As they explained, snowflake is checking the validity of all certificates in the chain, rather than just the root.</p>

<p>To be fair, they fixed the issue in less than 3 days but I now appreciate internet infrastructure better!</p>]]></content><author><name>Ronan Laker</name></author><category term="til" /><category term="data" /><summary type="html"><![CDATA[although it was snowflake and not some guy in Nebraska]]></summary></entry><entry><title type="html">Liveness probe hack for Shiny apps</title><link href="https://www.ronanlaker.com/liveness-probe/" rel="alternate" type="text/html" title="Liveness probe hack for Shiny apps" /><published>2025-04-18T00:00:00+00:00</published><updated>2025-04-18T00:00:00+00:00</updated><id>https://www.ronanlaker.com/liveness-probe</id><content type="html" xml:base="https://www.ronanlaker.com/liveness-probe/"><![CDATA[<p>Having spent all week creating a <a href="https://shiny.posit.co/">shiny</a> new UI, I was very excited to deploy it to my company’s <a href="https://kubernetes.io/docs/concepts/overview/">Kubernetes</a> cluster. I was about to congratulate myself on a job well done, when my baby app was killed before my eyes.</p>

<p>What happened? The app worked all week when I ran my docker container locally.</p>

<p>I checked the logs and saw several IP addresses trying to access the <code class="language-plaintext highlighter-rouge">/health</code> address on my app… and that is how I learnt about the <a href="https://kubernetes.io/docs/concepts/configuration/liveness-readiness-startup-probes/">liveness probe</a>.</p>

<p>In order to keep services running, Kubernetes will ping the <code class="language-plaintext highlighter-rouge">/health</code> endpoint of an app to check that it is still functioning. If there is no response, as in my case, then Kubernetes will kill the cluster and restart the app elsewhere.</p>

<p>The only problem is that the Shiny documentation doesn’t describe an easy way to implement such an endpoint. In the end, I found that Shiny runs on top of the <a href="https://www.starlette.io/">starlette</a> package for async web servers. This little hack was all it took to save my app</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">shiny</span> <span class="kn">import</span> <span class="n">App</span>
<span class="kn">from</span> <span class="nn">starlette.responses</span> <span class="kn">import</span> <span class="n">Response</span>
<span class="kn">from</span> <span class="nn">starlette.routing</span> <span class="kn">import</span> <span class="n">Route</span>

<span class="c1"># code for the app_ui and server
</span>
<span class="c1">#create the shiny app
</span><span class="n">app</span> <span class="o">=</span> <span class="n">App</span><span class="p">(</span><span class="n">app_ui</span><span class="p">,</span> <span class="n">server</span><span class="p">)</span>

<span class="c1">#Define a health endpoint
</span><span class="k">async</span> <span class="k">def</span> <span class="nf">health_check</span><span class="p">(</span><span class="n">request</span><span class="p">):</span>
	<span class="k">return</span> <span class="n">Response</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">200</span><span class="p">)</span>

<span class="c1"># need to insert as first element
</span><span class="n">app</span><span class="p">.</span><span class="n">starlette_app</span><span class="p">.</span><span class="n">router</span><span class="p">.</span><span class="n">routes</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">Route</span><span class="p">(</span><span class="s">"/health"</span><span class="p">,</span> <span class="n">health_check</span><span class="p">))</span>
</code></pre></div></div>]]></content><author><name>Ronan Laker</name></author><category term="til" /><category term="python" /></entry><entry><title type="html">Reviewing OMA</title><link href="https://www.ronanlaker.com/oma-review/" rel="alternate" type="text/html" title="Reviewing OMA" /><published>2025-04-01T00:00:00+00:00</published><updated>2025-04-01T00:00:00+00:00</updated><id>https://www.ronanlaker.com/oma-review</id><content type="html" xml:base="https://www.ronanlaker.com/oma-review/"><![CDATA[<p>I went to the Michelin starred OMA this week, a greek restaurant touted as the “best restaurant opening this year in London” by food critic <a href="https://youtube.com/shorts/SGwLAgAAVg8?si=BjZrl48JL3rSraZh">Grace Dent</a>. To say I was disappointed would be an understatement. It was a classic example of marketing your way to a Michelin star, where aesthetics are valued above anything else. Don’t ask why the Giouvetsi stew has a beef bone with braised oxtail stuffed inside, just take a picture and share it. Unfortunately, having spent their time making food for Instagram, they forgot to actually make it taste of anything. Where did all that lovely bone marrow go? Because it certainly wasn’t in the stodgy mass below.</p>

<p>It was a similar story with lamb belly, whose taste did at least remind me of the animal, but was dry enough that the chef tried to hide their creation under a shroud of parsley.</p>

<p>The poor baker was unfortunately holding the entire restaurant on their back. The laffa were fluffy when ripped, satisfyingly chewy to eat and paired well with the mezze; the deconstructed spanakopita tasted good and the combination of vanilla ice cream on flatbread was the best thing we ate.</p>

<p>But the disconnect between my experience and glowing <a href="https://www.ft.com/content/a3ff091b-7694-4dae-ab4f-211c1f219dfc">reviews</a> has made me sad that my two favourite food writers, A.A. Gill and Anthony Bourdain, are no longer here to eviscerate places like this. The closest thing I have is A.A. Gill’s review of Greek cuisine where he suggested “if you must really eat Greek food, go to a Lebanese restaurant”.</p>

<p>So, to remind myself about food critique before the world of online hype, I wanted to list my favourite books, essays and videos from my favourite old-school influencers.</p>

<p>Table talk - A collection of food essays from A.A. Gill</p>
<ul>
  <li>Concert</li>
  <li>Politics</li>
  <li>Vegetarians</li>
  <li>Army</li>
  <li>Picnics</li>
  <li>Nouvelle cuisine</li>
  <li><strong>Cabbage</strong></li>
  <li>Fish and chips</li>
  <li>Countryside</li>
  <li>Leeds</li>
  <li>Isle of Man</li>
  <li>Scotland</li>
  <li>Elizabeth David</li>
  <li>Fat</li>
  <li>Corn</li>
  <li>Chinese restaurant</li>
  <li>Greece</li>
</ul>

<p>The best of A.A. Gill:</p>
<ul>
  <li>Dinner parties</li>
  <li>Vegetarians</li>
  <li>Stow-on-the-Wold</li>
  <li>Concert</li>
  <li>Markets</li>
  <li>Last suppers</li>
  <li>Noma</li>
  <li>Steak</li>
  <li>Burger Pizza</li>
  <li>Scotland</li>
</ul>

<p>The Nasty Bits - Anthony Bourdain:</p>
<ul>
  <li>A commencement address no one asked for</li>
  <li>Are you a crip or a blood?</li>
  <li>Counter culture</li>
  <li>Name dropping down under</li>
  <li>My Manhattan</li>
  <li>China syndrome</li>
  <li>A drinking problem</li>
  <li>Food terrorists</li>
  <li>Pure and uncut luxury</li>
  <li>Decoding Ferran Adria</li>
  <li>The old, good stuff</li>
</ul>

<p>Medium Raw - Anthony Bourdain:</p>
<ul>
  <li>The sit down</li>
  <li>Heroes and Villians</li>
  <li>It’s not you its me</li>
  <li>My aim is true</li>
</ul>

<p>As well as writing, Bourdain also created timeless food shows. My favourite episode covers the history of classical French cooking with Paul Bocuse, Maison Troigros and an eating society. Its just so French and I love it.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/TPicFnp0Wt8?si=X4OBVBXH2mkjQer6" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>and here’s the two of them together:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/hJjDOL5C3qA?si=XjKPx9_peL2Cm02X&amp;start=1500" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/F2tjvTmbEVw?si=Q5uDY-gmb_rBQN1N" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>]]></content><author><name>Ronan Laker</name></author><category term="food" /><category term="essay" /><summary type="html"><![CDATA[and remembering my favourite old-school food influencers]]></summary></entry><entry><title type="html">The history of money</title><link href="https://www.ronanlaker.com/history-of-money/" rel="alternate" type="text/html" title="The history of money" /><published>2025-03-15T00:00:00+00:00</published><updated>2025-03-15T00:00:00+00:00</updated><id>https://www.ronanlaker.com/history-of-money</id><content type="html" xml:base="https://www.ronanlaker.com/history-of-money/"><![CDATA[<p>As I’ve left the academic ivory tower I’ve had to ask myself why the CEO is constantly pushing us towards higher targets in the next year? Why can’t we just create something useful for the user, get paid and call it a day?</p>

<p>This need for constant growth extends to all aspects of our lives. The news is constantly updating us on our GDP and productivity targets, podcasters are pushing for self-improvement and for some reason every product needs a new AI feature.</p>

<p>What is going on? Why are we all so obsessed with the future and the concept of progress?</p>

<p>Well, <a href="https://en.wikipedia.org/wiki/The_Time_Traveller%27s_Guide_to_Medieval_England">“to understand our century we need to comes to terms with at least two others”</a>. Thankfully, many authors agree with this sentiment and have created an entire genre dedicated to this topic. Broadly pitched as a kind of “history of money”, these books take a quick canter through humanity’s past, cherry-picking stories to explain how we got to whatever it is we are doing in this decade.</p>

<p><img src="/images/come_to_terms_with_centuries.png" width="600" height="340" /></p>

<p>Although each book touches upon several of the same points in history, e.g. the invention of coins, banking, credit, Globalisation, they each weave together the threads in pleasing different ways. Contrary to what you might think, hearing the same stories over and over is actually quite refreshing. Your confidence grows with each read, allowing more pleasure to be found in the individual stories.</p>

<p>Over the past few years I have explored this genre. In this essay I hope to give you a sense of each book, and how they contributed to my own personal understanding, but please, whatever you do, don’t mistake the number books I have read with any expertise.</p>

<h1 id="sapiens">Sapiens</h1>

<p>I happened to start on the book with the most ambitious scope. <a href="https://en.wikipedia.org/wiki/Sapiens:_A_Brief_History_of_Humankind">Sapiens</a>, by Yuval Noah Harari, aims to tell the entire story of humanity in “pop-“ history, economics and anthropology book all rolled into one. For me, this book was able to explain and connect many “-isms” that I had of course heard of, but not truly appreciated. For example, here are two quotes explaining the difference in attitude between the middle ages:</p>

<p><img src="/images/sapiens_mercantalism.png" width="600" height="340" /></p>

<p>and the imperial age:</p>

<p><img src="/images/sapiens_imperialism.png" width="600" height="340" /></p>

<p>These stories have essentially introduced us to the difference between <a href="https://en.wikipedia.org/wiki/Mercantilism">Mercantilism</a> and <a href="https://en.wikipedia.org/wiki/Capitalism">Capitalism</a> without having to wade through a sea of jargon. As with any popular non-fiction, this book glosses over a lot of nuance in favour of the overall narrative. This is perfect for new readers to this subject and I can give it no higher compliment than having created over 300 highlights on my Kindle.</p>

<h2 id="talking-to-my-daughter">Talking to My Daughter</h2>

<p>Although Sapiens gave me a leg up to understanding the history of money, it is a hefty tome that would be hard to revisit every year. That is why “<a href="https://www.penguin.co.uk/books/439012/talking-to-my-daughter-by-varoufakis-yanis/9781784705756">Talking to My Daughter</a>” by Yanis Varoufakis, weighing in at just over 200 pages, has become a favourite of this genre. This condensed economic take on history has the literary device of a father, who happens to be a former professor in economics, attempting to explain capitalism to his daughter. The subject is sufficiently approachable, with references to cultural touch-points like Frankenstein and The Matrix. Yet the tone remains serious, reflecting the authors own battle with economics following the 2008 financial crisis.</p>

<p>The most illuminating example looks at how attitudes towards debt had shifted through the lens of the <em>Doctor Faustus</em> story. Literally making a deal with the devil, Faustus signs a contract to give up his soul in return for 24 years of power and bliss.</p>

<p><img src="/images/faustus_marlow.png" width="600" height="340" /></p>

<p>In the original 16th century telling, when Marlow penned the play, christianity viewed usury (paying interest on debt) as a sin. When it comes time for the devil to call in his loan, there is no happy ending, the audience expect the debt to be paid and for Faustus to be dragged to hell.</p>

<p>In contrast, by the time Goethe wrote his 19th century version, the audience had come to accept debt, and the interest paid on it, as part of “modern” life in the industrial revolution. Therefore, as the 24 years come to an end, Faustus attempts to pay back his debt through public acts of good that please God enough to send his angels to intervene and bring him to heaven singing “He who strives on and lives to strive can earn redemption still”.</p>

<p><img src="/images/faustus_goethe.png" width="600" height="340" /></p>

<p>Varoufakis skillfully weaves this analysis into larger explanation of how humans shifted from “a society with markets, to a market society”. As with all good teachers, the author makes you feel like you could have figured this out by yourself, thereby inspiring you to critically examine our current world.</p>

<p>Well, much like Dr. Faustus, Homer Simpson also promises his soul to the devil in the <a href="https://simpsons.fandom.com/wiki/Treehouse_of_Horror_IV#The_Devil_and_Homer_Simpson">Treehouse of Horrors IV</a>, in exchange for the thing he desires most - a donut. We, the modern audience, share Gothe’s view that Homer should be spared from eternal damnation, but rather being saved by God, Homer has the legal system to thank. So, in just ten minutes of cartoon we have reflected our willingness to take on debt, but also reveals who we turn to when we cannot pay it back.</p>

<p>As a final endorsement, I enjoyed this book so much that I bought the Kindle as well just so I could highlight it properly.</p>

<h2 id="money">Money</h2>

<p>If “Talking to my daughter” is about big ideas and how culture reflects them, then “<a href="https://www.amazon.co.uk/Money-Fifth-Element-David-McWilliams-ebook/dp/B09NP6DBHH">Money</a>” by David McWilliams is the story of the individuals within each historical shift, and who they might represent today.</p>

<p>To you and me, the name Fibonacci evokes pure mathematics and Romanesco cauliflowers. In the 13th century, he began as more of a business influencer than a mathematical scholar. In his book “Liber Abaci”, Fibonacci pitched the idea of Arabic numerals and advised merchants on how to keep books, convert weights and measures and calculate interest without the aid of an abacus. This new technology became the biggest business trend of its day, with the city of Florence setting up special “reckoning” schools, or as McWilliams puts it, “the Harvard MBAs of the fourteenth century”. In our modern podcasting culture, I can’t imagine it would have been long for Fibonacci sat down with Steven Bartlett in an episode titled:</p>

<blockquote>
  <p><strong>Why the Wrong Numbers Could Be Holding You Back – Fibonacci Explains</strong>
Fibonacci shares how his time in North Africa exposed him to a superior way of handling numbers — one that would empower merchants, traders, and bankers to scale their businesses like never before.</p>
</blockquote>

<p>While Fibonacci might make a perfect podcast guest, the same cannot be said for most of the financial innovators we are introduced to. By focussing on unsavoury characters like John Law and Gutenburg, the author reminds us that most financial progress is not achieved out of the goodness in people’s hearts. These historical swindlers weren’t motivated by advancing human knowledge, they just wanted to get rich. This humbling reminder, and witty prose, make a great complement to the grander “humanity is on a noble journey” message depicted in Sapiens. Being published much more recently, an added bonus of this book is an excellent chapter on crypto-currencies and the future of money.</p>

<hr />

<h2 id="the-psychology-of-money">The Psychology of Money</h2>

<p>While not strictly from the same genre, “<a href="https://archive.org/details/the-psycology-of-money">The Psychology of Money</a>” by Morgan Housel provides the most practical and empathetic guide to money and investment. Having gone to Imperial College, I know a lot of people who devote their mathematical knowledge to making the absolute optimal investments. I feel the same urge. Surely I can come up with a little model to tell me how to invest for maximum gains?</p>

<p>But wait, is that really what I should optimise for?</p>

<p>This is the first book I’ve read that really examines this philosophical question. According to Housel, we would be much happier if we instead optimised for “sleeping well at night”, or for “financial freedom”. The author pairs this type of critical analysis with an array of anecdotes from recent history (20th century onwards). So, even though this book only covers living memory, it still has the same effect as the more historical books referenced above. We are reminded that a generation is an extremely long time in monetary terms. Grandparents will tell you to invest in premium bonds, because that’s what worked in their decade. Baby boomers will tell you to invest in the stock market, because they lived through the greatest period of economic expansion ever. To me, this book helps convert historical knowledge into practical advice and represents the final piece of the money story.</p>

<p><img src="/images/highest_form_of_wealth.png" width="600" height="340" /></p>

<h1 id="conclusion">Conclusion</h1>

<p>So has all this information actually sunk in? Well, I do feel I can give a tentative answer to the question posed at the start of this essay: “why do we care about the future?”.</p>

<p>The answer is… because we have to. Our whole society is bet on things improving in the future: productivity will increase, those debts will be paid and the investment cycle will continue. This has bled through into our attitude to life, social stigmas will relax, we will solve this next crisis. Maybe the cracks are starting to show with movements like Brexit and Trump, but I will leave that for a future history book.</p>

<h1 id="honourable-mentions">Honourable Mentions</h1>

<ul>
  <li>“<a href="https://www.amazon.co.uk/Unruly-Bestseller-Horrible-Histories-grownups/dp/1405953179">Unruly</a>” by David Mitchell, helps understand the mindset of medieval Kings and denizens. For hundreds of years, people of the past would harken back to some “golden age” when everything was better, rather than looking forward.</li>
  <li>“<a href="https://www.amazon.co.uk/Trading-Game-Confession-Gary-Stevenson-ebook/dp/B0CDKJ4NTB/ref=sr_1_1?crid=1ZLRRI387Z9DT&amp;dib=eyJ2IjoiMSJ9.qxCC2go-4Rc0vb94aeGcmeHBY8-qNVvnOZsgfuM_sa3akrgVMKMnHxtUB5JO0izincFvq3UnXlktqQosyiIHY-eCH3-dFdNWDfEalWL_5SpTJayYtWHkytMLBCepzQw4FD5jCBqITZdBFGWupQYPZrY1AVToJCMoKahzGlDjRalibMdZ1-g96F-Win7HEk8IrQcVMAbg_pxeWKBKIAVi6Ws-whznAFOr2g3POLu9K5k.ZOBdHqYzMTe0FhTle7z3iPwHfR5WrdOfGcgL0mNTIZQ&amp;dib_tag=se&amp;keywords=the+trading+game+gary+stevenson&amp;qid=1742035483&amp;s=books&amp;sprefix=the+tradin%2Cstripbooks%2C124&amp;sr=1-1">The Trading Game</a>” by Gary Stevenson is an excellent financial thriller, showing you the inside workings of an FX trader at Citibank following the financial crisis</li>
  <li><a href="https://youtu.be/vLpSeMlfZ60?si=heo5e4BGY0QU5Wt6">Johnny Harris</a> is a great visual story teller, but the comment section gets a bit angry with his creative license.</li>
  <li>CGP Grey explaining how Europeans conquered the New world and why there was no <a href="https://youtu.be/JEYh5WACqEk?si=JXR2Dj1LWWgt90Nv">Americapox</a></li>
</ul>]]></content><author><name>Ronan Laker</name></author><category term="essay" /><summary type="html"><![CDATA[a review of my favourite books in the genre]]></summary></entry></feed>