<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>James Jarvis</title><link>https://jamesjarvis.io/posts/</link><description>Recent content on James Jarvis</description><generator>Hugo</generator><language>en</language><managingEditor>hello@jamesjarvis.io (James Jarvis)</managingEditor><webMaster>hello@jamesjarvis.io (James Jarvis)</webMaster><lastBuildDate>Sat, 27 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jamesjarvis.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>27 Years Old</title><link>https://jamesjarvis.io/posts/2026/06/27-years-old/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2026/06/27-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From the 23rd June 2025 to 23rd June 2026.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been spending less time in England during the summers as of late, so I went back to my roots and spent more time in and around London, with the occasional camping trip.
I love England in the summer and would rather spend time escaping it during the winters!&lt;/p&gt;</description><content:encoded>&lt;p&gt;From the 23rd June 2025 to 23rd June 2026.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been spending less time in England during the summers as of late, so I went back to my roots and spent more time in and around London, with the occasional camping trip.
I love England in the summer and would rather spend time escaping it during the winters!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been upping the distance I cycle, with the occasional commute to and from London in nice weather, which I&amp;rsquo;ve absolutely loved getting back to.
Some time exploring Poland with Filip (who had left the UK) was a highlight of the late summer.
On the topic of friends leaving, Majuran, Caitlin and Raph later followed suit - seeking new experiences or their own brexit!&lt;/p&gt;
&lt;p&gt;Housework continued, with some rip outs from the garden, a new bathroom/carpet and using up some excess flooring at the parent&amp;rsquo;s house!&lt;/p&gt;
&lt;p&gt;AI has been a big influence this year - it&amp;rsquo;s been a love-fear relationship but I&amp;rsquo;m back into my high learning curve era, which I&amp;rsquo;ve been thoroughly enjoying!
Not all things were hunky dory with the day-job and from November I had been looking to move on/receiving compelling offers elsewhere - should have done this sooner but I had been in a lower-risk mindset - something to leave behind for the future!
I&amp;rsquo;m diving into this new year with some new faces, and a proper, exciting challenge ahead!&lt;/p&gt;
&lt;p&gt;Trips round central Europe with Raphael, Istanbul, Beijing, Chengdu, Chongqing and Wuhan with Feiyang, California with Konrad and Elisabeth and my first time Skiing!
Happy I was attacking red routes by the end of it, but not everyone on our trip was so lucky 😬.&lt;/p&gt;
&lt;p&gt;As I enter into my proper late-20s era I&amp;rsquo;m looking forward to focusing on maximising risk and seeking exciting adventures again.
It&amp;rsquo;s been fun renovating the house but that project is nearly over (garden permitting), so my focus is turning back to a larger &amp;ldquo;misogi&amp;rdquo; for this year.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/RvwSCmyFxB4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>📚 Year of books 2025</title><link>https://jamesjarvis.io/posts/2026/04/year-of-books-2025/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2026/04/year-of-books-2025/</guid><category>Reading</category><category>Thoughts</category><description>2025 book reviews</description><content:encoded>&lt;p&gt;Bit late this year as I&amp;rsquo;m only posting this in April, but here are the reviews I wrote for the (12) books I read in 2025.
For each book I read, I try and write a short (often scrappy) review as a way of remembering what I learnt from each book.
I&amp;rsquo;ve also started writing more notes on books while I&amp;rsquo;m reading them, but those are more private.&lt;/p&gt;
&lt;p&gt;The following has been extracted from a short script I reused from last years post, to export all of my reviews made in 2025.&lt;/p&gt;
&lt;h3 id="the-lean-startup" class="relative group"&gt;The Lean Startup &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;I “read” this book as an audiobook, but I feel this does not do it justice, and I would have benefit more with a physical copy for later reference. The book repeats itself a bit, but has some valid case studies of companies who have benefitted from some of the “lean startup” approaches. Principally, the methods of “innovation accounting” seem to be key for ensuring a project is actually capturing a market fit, without wasting too much effort on untested hypotheses.&lt;/p&gt;
&lt;p&gt;Eric mentions some other concepts that interest me, namely the concept of keeping known “innovators” on innovative work, with the assumption that some are better suited for the implementation, scale up, or maintenance types of work/management.
This could perhaps explain the rarity of founder/ceos lasting much beyond the initial starting phase.&lt;/p&gt;
&lt;p&gt;Interestingly, in the epilogue Eric notes on the general unproductive nature of modern business enterprises. Focusing on the wrong metrics, spreading themselves too thin taking too long on too many projects that are ultimately doomed for failure lead to higher than required rates of failure.&lt;/p&gt;
&lt;h3 id="invisible-women-data-bias-in-a-world-designed-for-men" class="relative group"&gt;Invisible Women: Data Bias in a World Designed for Men &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Fundamentally a brilliant book to reshape your perspective on gender issues, from a bottom up approach.
I&amp;rsquo;m not convinced all case studies mentioned are as simple as stated, but the root problem is indeed a lack of gender disaggregated data.&lt;/p&gt;
&lt;h3 id="supercommunicators-how-to-unlock-the-secret-language-of-connection" class="relative group"&gt;Supercommunicators: How to Unlock the Secret Language of Connection &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h3 id="the-climate-book-the-facts-and-the-solutions" class="relative group"&gt;The Climate Book: The Facts and the Solutions &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;It took me 9 months to finish this book. Why?
On one hand, almost every page is covered in a stream of factoids, which I&amp;rsquo;ve either read before elsewhere, or seen elsewhere in this book!
On the other hand, this book is effectively a collation of small articles + accounts from climate activists from around the globe, with a connecting piece written by Greta in-between sections of the book.
This format was interesting for about the first hundred pages, but after a while became a bit of a slog to read through, with the last 40 feeling like repeats of the first.&lt;/p&gt;
&lt;p&gt;Whilst this isn&amp;rsquo;t the most flattering review, I want to make it clear that I agree with the majority of the book. Some suggestions are a bit delusional (yes, the richest nations must spearhead fossil fuel replacements through technological improvements, but pay reparations? That&amp;rsquo;s just not practical), but the overwhelming majority of the book is quite reasonable, if a little alarmist.&lt;/p&gt;
&lt;h3 id="a-philosophy-of-software-design" class="relative group"&gt;A Philosophy of Software Design &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Overall a brilliant collection of strong opinions that I generally think are good to follow, or to at least consider and oppose meaningfully.
A similar resource for this is grugbrain.dev, a personal bible for me.&lt;/p&gt;
&lt;p&gt;It’s very much a theoretical book for those with the luxury of time though, as allocating time for a good design is inherently expensive, something that unfortunately must be traded off with implementation work.
John coins a term “tactical tornadoes” for those who go around improving systems quickly, rather than holistically. I believe this is somewhat childish, as anyone can and must become this persona in times of need.&lt;/p&gt;
&lt;p&gt;Overall I would recommend the talk John gives at Google instead of this book (find it on YouTube), as it provides much of the same core principles (deep interfaces, etc) in a more engaging and concise format.&lt;/p&gt;
&lt;h3 id="designing-data-intensive-applications" class="relative group"&gt;Designing Data-Intensive Applications &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h3 id="taxtopia-how-i-discovered-the-injustices-scams-and-guilty-secrets-of-the-tax-evasion-game" class="relative group"&gt;Taxtopia: How I Discovered the Injustices, Scams and Guilty Secrets of the Tax Evasion Game &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h3 id="the-big-con-how-the-consulting-industry-weakens-our-businesses-infantilizes-our-governments-and-warps-our-economies" class="relative group"&gt;The Big Con: How the Consulting Industry Weakens our Businesses, Infantilizes our Governments and Warps our Economies &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h3 id="breakneck-chinas-quest-to-engineer-the-future" class="relative group"&gt;Breakneck: China&amp;rsquo;s Quest to Engineer the Future &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;The “engineering state” vs the “lawyerly society”, an accurate portrayal of china and the US. Dan Wang’s analysis of these two superpowers cuts pretty deep, and isn’t very forgiving for either one.
I agree in general with the principle diagnosis, but there isn’t a whole lot more detail other than that.
I’m also not entirely sure I agree with the final remarks that china is unable to compete technologically with the USA, I fear that lead is being eroded quickly.&lt;/p&gt;
&lt;h3 id="mr-wilmans-motoring-adventure-top-gear-grand-tour-and-twenty-years-of-magic-and-mayhem" class="relative group"&gt;Mr Wilman’s Motoring Adventure: Top Gear, Grand Tour and Twenty Years of Magic and Mayhem &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;Obviously impossible to fault a deliberate nostalgia trip.&lt;/p&gt;
&lt;h3 id="appendix" class="relative group"&gt;Appendix &lt;/h3&gt;&lt;p&gt;I just reused and slightly modified the script from last year&amp;rsquo;s post - no point wasting good LLM tokens on something already done!&lt;/p&gt;</content:encoded></item><item><title>Buckle Up: My Economic Outlook for 2026+</title><link>https://jamesjarvis.io/posts/2026/03/buckle-up/</link><pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2026/03/buckle-up/</guid><category>Thoughts</category><description>Strap in and buckle up, it&amp;rsquo;s (maybe) about to get dicey in the economy&amp;hellip;</description><content:encoded>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Strap in and buckle up, it&amp;rsquo;s (maybe) about to get dicey in the economy&amp;hellip;&lt;/p&gt;
&lt;p&gt;With hindsight, you can see ups and downs in the markets, in the present you can &lt;em&gt;feel&lt;/em&gt; stresses in your life, or periods of time when you are flying high.
But every so often you can just &lt;em&gt;tell&lt;/em&gt; when you are about to fly into a particularly turbulent patch of air.
Right now I think we have just started a new patch of uncertainty, outlined by 3 key forces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inflation&lt;/li&gt;
&lt;li&gt;Global Liquidity&lt;/li&gt;
&lt;li&gt;AI&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="inflation" class="relative group"&gt;Inflation &lt;/h4&gt;&lt;p&gt;Up until around about the beginning of March 2026, core inflation across most western economies had been higher than targets (specifically since 2022 after the fossil fuel crisis triggered by the Russian invasion of Ukraine), but generally trending downwards, and was assumed to reach the target level either the end of this year, or mid-2027.&lt;/p&gt;
&lt;p&gt;Markets had generally priced this return to normality in - as had central banks - who were beginning to lower rates, and were assumed to approach approximately 3% by the end of 2026.
Indeed, that is what I had also assumed, surely the majority of people can&amp;rsquo;t be wrong about something as important as this?&lt;/p&gt;
&lt;p&gt;That was, until the USA received a booty call on February 28th from their good friends in Israel, telling them that Iran was days away from enriching weapons grade uranium, and conveniently all gathered in an accessible location.
The USA subsequently launched &amp;ldquo;Operation Epic Fury&amp;rdquo; (funnier if you read it in Trump&amp;rsquo;s voice), blowing up Iran&amp;rsquo;s leaders and several military bases - including the nuclear enrichment plant.
The original intention was that this would last maybe a week or two before Iran&amp;rsquo;s government fell and a new regime took over - but we&amp;rsquo;ve heard this story before, right?
Naturally, Iran is not happy about this, and has been flinging bombs left right and centre towards it&amp;rsquo;s neighbours, and shutting down the Straight of Hormuz (a shipping lane where 20% of the worlds oil flows). Predictably, restricting global supplies of oil by ~20% is a guaranteed method of increasing oil prices.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s interesting is that since markets generally run on the &amp;ldquo;TACO trade&amp;rdquo; principle (Trump Always Chickens Out), Oil futures hadn&amp;rsquo;t moved by much, as people generally assumed the war would be over within a few weeks with minimal lasting damage to oil infrastructure
Well, the 3rd week has just come and gone, and as of this morning (19th March), Iran has managed to damage the Ras Lafan oil refinery quite substantially.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll leave it there, as it&amp;rsquo;s not particular fun to imagine the continuation of global conflicts, but I think it&amp;rsquo;s fair to say that this isn&amp;rsquo;t going to go away quickly or cleanly. At least Trump won&amp;rsquo;t be invading Cuba for the next few months - though if China manages to finally finish purging it&amp;rsquo;s military generals, Taiwan (and the semiconductor industry) could be in for a nasty surprise.&lt;/p&gt;
&lt;p&gt;What does this mean?&lt;/p&gt;
&lt;p&gt;Inflation was assumed to fall back to 2-3% by end of year, and is looking more and more like we are in for a longer lasting period of 4-6% inflation for the foreseeable future. The markets unwinding their hopes and dreams, along with the friction of lower borrowing will have tangible consequences to investment.&lt;/p&gt;
&lt;p&gt;This might not sound like much, until you realise that from 2021 -2027, cumulative persistent inflation (from ONS RPI figures) is looking like it will be around &lt;strong&gt;46%&lt;/strong&gt;. For reference, 2011-2017 was &lt;strong&gt;16%&lt;/strong&gt;, all whilst base rates were at a record low of 0.5%, as opposed to the 2020&amp;rsquo;s expected average of 4.5%.&lt;/p&gt;
&lt;h4 id="global-liquidity" class="relative group"&gt;Global Liquidity &lt;/h4&gt;&lt;p&gt;By this, I mean the accessibility of capital being invested around the world.
We&amp;rsquo;ve pretty much covered it above already: higher interest rates will reduce borrowing.&lt;/p&gt;
&lt;p&gt;But to labour the point, I want to briefly touch on the &lt;strong&gt;yen carry trade&lt;/strong&gt; and &lt;strong&gt;private credit&lt;/strong&gt;.
Since the birth of Abenomics, the Japanese central bank has held rock bottom interest rates (at around -0.1%). Recently though it looks like Japan is going to start playing in the same ballpark as it&amp;rsquo;s &lt;em&gt;mikata&lt;/em&gt; countries, and has already hiked it&amp;rsquo;s interest rates to 0.75%.
So who cares? Well, Japan has for a long time been a great place to borrow money from, and invest the money elsewhere. Surprisingly, the currency was relatively stable throughout this process.&lt;/p&gt;
&lt;p&gt;This form of infinite money glitch led to a lot of capital being available cheaply to purchase other assets, such as government bonds. As long as the asset being purchased yielded a bit above the ~0.5% it would have cost to borrow the underlying yen, along with some buffer for currency fluctuations, then there was a willing buyer for it. This kept up demand for relatively lower yield socks and bonds elsewhere, like the USA or UK.
As this reverses, we are likely to see a reduction in demand for stocks and bonds, requiring higher yields and lower P/E multiples to make it make sense again for investors. Think: lower stock market valuations, higher interest rates.
A quick aside from this - every time you hear &amp;ldquo;fiscal sustainability&amp;rdquo; being uttered from a government, remember that they also sell bonds. If your government&amp;rsquo;s borrowing gets more risky, it will annoyingly start to bring up your own borrowing costs. Them&amp;rsquo;s the rules.&lt;/p&gt;
&lt;p&gt;Our only hope for this is that the Swiss Franc remains cheap to borrow and relatively stable, to try and step in where the Yen has run away.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d also like to touch briefly upon Private Credit. There have been a bunch of murmurings around default rates increasing as general interest rates have crept up, and economic growth has stalled. If we expect the minimal/no growth to be prolonged due to higher inflation as outllined above, then we would expect to see further defaults in this opaque slice of the financial sector.&lt;/p&gt;
&lt;p&gt;Why does this matter? If you find out your favourite companies are leveraged on uneasy foundations, then we may start seeing some unwinding here. I&amp;rsquo;m not too concerned about defaults here, as these markets are so locked up and regulation is generally better that any fluctuations will be slow enough as to not cause too much damage. The general point I&amp;rsquo;m trying to make is that &lt;em&gt;if&lt;/em&gt; this does wobble, then we will get a reduction in liquidity, and less grease in the economy is always less fun.&lt;/p&gt;
&lt;h4 id="ai" class="relative group"&gt;AI &lt;/h4&gt;&lt;p&gt;A fun collection of recent, lighthearted and totally-not-depressing quotes from our current overlords:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;By the end of 2028, more of the world’s intellectual capacity could reside inside of data centers than outside of them.&amp;rdquo; - Sam Altman, CEO OpenAI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Half of all entry-level white-collar jobs could be eliminated within the next one-to-five years&amp;rdquo; - Dario Amodei, CEO Anthropic&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;10 times bigger than the Industrial Revolution – and maybe 10 times faster.&amp;rdquo; - Demis Hassabis, CEO Deepmind&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Every job will be affected, and immediately. It is unquestionable… You’re not going to lose your job to an AI, but you’re going to lose your job to someone who uses AI.&amp;rdquo; - Jensen Huang, CEO Nvidia&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you glance past the obvious fact that these 4 are incentivised to say scary shit like this to pump their meme-valuations, then you realise, they are &lt;em&gt;kinda&lt;/em&gt; right.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a growing theory on the &amp;ldquo;K-shaped economy&amp;rdquo;, where the rich get richer, and the poor get poorer. This has broadly been happening in the western economies now ever since they started outsourcing labour abroad and debased their currencies from scarce metals, incentivising the speculation on essential commodities like housing.
So what&amp;rsquo;s the difference?&lt;/p&gt;
&lt;p&gt;The difference is a more recent phenomenon called &amp;ldquo;the permanent underclass&amp;rdquo;.
If we hold these assumptions to be true&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI will reduce the barrier to entry for &amp;ldquo;information economy&amp;rdquo; jobs, increasing supply and thereby reducing average wages for previously scarce jobs if employees can leverage AI to get a leg up.&lt;/li&gt;
&lt;li&gt;The best employees will be &lt;em&gt;even better&lt;/em&gt; with AI, and thus able to command a higher salary and break out of the now-larger pool of employees in their sector to rise to the top.&lt;/li&gt;
&lt;li&gt;The lowest performing employees - if unable to keep up with the new influx of entrants into their sector, may end up being crowded out or stuck on salaries below their expectation.
&amp;hellip;then we can expect &lt;em&gt;either&lt;/em&gt; companies will indeed reduce headcount once they are happy with their newly more productive workforce, or they will just continue with the same structures as they currently have, but reduce wages in real terms to account for the additional cost of each employee once AI tokens are taken into account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Either way, this sure sounds like not fantastic news for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;House prices (if average wages decrease or unemployment increases in economies heavily reliant on services)&lt;/li&gt;
&lt;li&gt;Wealth inequality (if the spoils increasingly get concentrated into fewer hands)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another way of thinking of this is that the risk-adjusted salaries for knowledge workers may be about to take a nosedive.&lt;/p&gt;
&lt;p&gt;Personally, I&amp;rsquo;m of the latter opinion, and think broadly that AI will be &lt;em&gt;good&lt;/em&gt; overall in terms of economic progress + increasing competition in the markets due to lower barriers to entry for new companies, but that in the medium term this will probably lead to a lot of instability across the incumbent knowledge economy companies, all while shovelling money into foundation model companies, once they remove their subsidies as soon as it becomes critical to productivity.
But who knows? The productivity boosting effects may be overstated, as after all a machine cannot be held accountable for the decisions it derives, providing a natural cap on the takeover potential in employment.&lt;/p&gt;
&lt;h4 id="summary" class="relative group"&gt;Summary &lt;/h4&gt;&lt;p&gt;Phew, that was a bit bleak wasn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;This is not financial advice, and I am not mystic meg, this is just the ramblings of an ambient observer who works in AI, travels to Asia a lot, and occasionally gambles his money in the stock markets.
I barely know what&amp;rsquo;s happening tomorrow, but I wrote this to try and comprehend &lt;em&gt;why&lt;/em&gt; it feels like the next 6 months are less certain than the last 6.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s still a potential universe that I&amp;rsquo;m rooting on where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The doomer effect of AI is deemed to be overhyped, and either the majority of jobs remain unaffected but appreciative of the increase in productivity, or everyone is happy becoming plumbers and pothole fillers.&lt;/li&gt;
&lt;li&gt;Trump chickens out of the Middle East, China doesn&amp;rsquo;t actually want to take over Taiwan, and our silicon wafer/oil prices stay nice and steady&lt;/li&gt;
&lt;li&gt;Companies don&amp;rsquo;t default on their debt despite increased competition, or do but to a manageable amount that keeps money lubricating the economy&lt;/li&gt;
&lt;li&gt;Our governments stop running budget deficits, and borrow less, or at least become less risky borrowers&lt;/li&gt;
&lt;li&gt;Inflation comes back down to that nice magical 2% target, and we ease back into normality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;History doesn&amp;rsquo;t repeat, but it does rhyme, the problem is I can&amp;rsquo;t tell where I heard this song from?&lt;/p&gt;</content:encoded></item><item><title>🏚️-&gt;🏠 A year of house renovations</title><link>https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/</guid><category>Thoughts</category><category>Projects</category><description>Lessons learnt from a whole year of house renovations</description><content:encoded>&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/kitchen-before-and-after_hu_60ddf8efc8930e94.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="8000"
 height="3000"
 class="mx-auto my-0 rounded-md"
 alt="Kitchen before and after"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/kitchen-before-and-after_hu_c366c7fc05eea316.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/office-before-and-after_hu_64a49780573e03dd.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="8506"
 height="3000"
 class="mx-auto my-0 rounded-md"
 alt="Office before and after"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/office-before-and-after_hu_201c0a9419fdc3aa.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/bathroom-before-and-after_hu_561ad5155c9bc4cb.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="8489"
 height="3000"
 class="mx-auto my-0 rounded-md"
 alt="Bathroom before and after"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/bathroom-before-and-after_hu_b6c4cbdbc40174f1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I bought my first house at the age of 26 in late October 2024, almost exactly 1 year ago.&lt;/p&gt;
&lt;p&gt;I was up for a challenge, so even though I didn&amp;rsquo;t start looking out for a complete fixer-upper, I slowly convinced myself (and my girlfriend) to take a chance on a project house.
I wrote a bit previously about how we went about searching for the right house 
 
 &lt;a href="https://jamesjarvis.io/posts/2024/10/on-buying-a-house/"&gt;here&lt;/a&gt;, but TL;DR is that we could have probably lost less money by renting 😂.&lt;/p&gt;
&lt;p&gt;So, a year &lt;del&gt;wiser&lt;/del&gt; older, after hundreds of hours of work demolishing, planning, painting, plumbing, laying floors, building a kitchen, bathroom and generally fixing-up, this is my advice&amp;hellip;&lt;/p&gt;
&lt;h2 id="planning-is-everything" class="relative group"&gt;Planning is everything &lt;/h2&gt;&lt;p&gt;When selecting flooring, I ordered 12 samples from 4 suppliers, I spent hours planning the herringbone sequence to make sure we didn&amp;rsquo;t get stuck.
The kitchen went through 5 different designs, the bathroom went through 6 different designs, and the front fireplace took hours to just measure out.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a bit annoying but once you&amp;rsquo;ve got experience with it, it&amp;rsquo;s fairly painless and well worth the investment.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Outside -&amp;gt; in.
Top -&amp;gt; bottom.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sage advice when working on buildings is that you should always sequence your work outside -&amp;gt; in, and top -&amp;gt; bottom.&lt;/p&gt;
&lt;p&gt;Roof need fixing? Any leaky windows? Do those first before decorating the inside.&lt;/p&gt;
&lt;p&gt;Want to plaster the ceiling? Better do that before you paint the walls, and definitely do that before you lay a new floor.&lt;/p&gt;
&lt;p&gt;And any significant plumbing work should sequence neatly between outside work and any inner work, as you are definitely going to be ripping stuff apart in the process.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/planning-drawings_hu_a7ea874c4c470767.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 &lt;img
 width="1206"
 height="1606"
 class="mx-auto my-0 rounded-md"
 alt="Planning Drawings"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/planning-drawings_hu_269ac3e2436c0bd3.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/flooring-plan-of-attack_hu_bdc09e52be882479.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2048"
 height="1536"
 class="mx-auto my-0 rounded-md"
 alt="Flooring plan of attack"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/flooring-plan-of-attack_hu_18f2e71faf733207.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="you-cant-do-it-alone" class="relative group"&gt;You can&amp;rsquo;t do it alone &lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ve been incredibly lucky to have taken advantage of a wonderful bunch of wilful workers from my family and friends.
None of knew what we were doing, but they&amp;rsquo;ve all gotten stuck in and helped out massively.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to thank Feiyang, Jason, Celia, Penny, Owen, Jon, Matthew, Brandon, Raphael, Filip and Sam for all of their help.&lt;/p&gt;
&lt;h2 id="invest-in-tools" class="relative group"&gt;Invest in tools &lt;/h2&gt;&lt;p&gt;The first things I bought were a mitre saw and handheld combi drill. Alongside a stanley knife, some paint brushes/rollers and a borrowed handheld jigsaw I can&amp;rsquo;t imagine getting this far without them. I had to do almost a thousand cuts with that saw when laying the downstairs floor, and I&amp;rsquo;ve been through several thousand screws with the drill.&lt;/p&gt;
&lt;p&gt;A borrowed chainsaw was way better than the 50 year old wood saw I had for removing some trees, and the laser marker or dedicated scribing tools were far better than me eyeballing a cut.&lt;/p&gt;
&lt;h2 id="doubletriple-the-budget" class="relative group"&gt;Double/Triple the budget &lt;/h2&gt;&lt;p&gt;I think the last year&amp;rsquo;s work (~100sqm of wood flooring, every room redecorated/furnished, all radiators replaced and a new kitchen / bathroom) cost me approximately ~£45k.
I had originally thought ~£35k would cover everything comfortably including the gardens and some more furniture - turns out I was off by about double!&lt;/p&gt;
&lt;p&gt;Timing is also something not to be underestimated.&lt;/p&gt;
&lt;h2 id="how-hard-can-it-be" class="relative group"&gt;How hard can it be? &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/how-hard-can-it-be_hu_8b5933bce48d679f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1536"
 height="2048"
 class="mx-auto my-0 rounded-md"
 alt="How hard can it be?"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/how-hard-can-it-be_hu_d92c25359c4ed7f8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;How hard can it be?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Fuck it, let&amp;rsquo;s give it a go&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This kind of attitude is the most important thing required (possibly more so than capital imho) when taking on a big project.&lt;/p&gt;
&lt;p&gt;You have to be willing to jump into a domain you know absolutely nothing about, mess stuff up, and figure it.&lt;/p&gt;
&lt;h2 id="understand-what-you-are-signing-up-for" class="relative group"&gt;Understand what you are signing up for &lt;/h2&gt;&lt;p&gt;This isn&amp;rsquo;t for the faint-hearted, it&amp;rsquo;s deliberately a massive pain in the arse and can be extremely stressful, not to mention economically exhausting.&lt;/p&gt;
&lt;p&gt;Getting 
 
 &lt;a href="https://jamesjarvis.io/posts/2025/08/uk-tax-burden-2025/"&gt;taxed 43%&lt;/a&gt;, handing over stamp duty (worse tax ever), only to remember that 20% of your new kitchen&amp;rsquo;s cost is also going to HMRC is a bit of a kick in the teeth.&lt;/p&gt;
&lt;p&gt;Working a full time job, then spending evenings and weekends on DIY whilst living without heating or running water in a dusty house, eating only microwaveable food gets old real quick - you do need to be slightly stupid to do this.&lt;/p&gt;
&lt;h2 id="now-the-itch-is-scratched-im-itching-to-do-it-again" class="relative group"&gt;Now the itch is scratched, I&amp;rsquo;m itching to do it again &lt;/h2&gt;&lt;p&gt;&amp;hellip;and I&amp;rsquo;m not talking about loft insulation!&lt;/p&gt;
&lt;p&gt;It has been a genuine pain in the ass sometimes, but I can&amp;rsquo;t help but have a huge sense of accomplishment sitting in my home built home office.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not looking to repeat some of the stress of the last year (I almost lost my eyesight twice due to stress!) but I am looking forward to taking on more big projects like this in the future.&lt;/p&gt;
&lt;p&gt;Hopefully now, with a little more experience behind me!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/me-pirate_hu_675726a8801a7cd8.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2316"
 height="3088"
 class="mx-auto my-0 rounded-md"
 alt="No pirate builders here!"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/11/a-year-of-house-renovations/me-pirate_hu_2fe28af408f23363.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;No pirate builders here&amp;hellip;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>💰 My UK Tax Burden in 2025: A Personal Finance Reality Check</title><link>https://jamesjarvis.io/posts/2025/08/uk-tax-burden-2025/</link><pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/08/uk-tax-burden-2025/</guid><category>Thoughts</category><category>Personal Finance</category><description>A deep dive into my personal tax burden in the UK for 2025, and concerns about the future of taxation for average UK taxpayers.</description><content:encoded>&lt;h2 id="the-reality-of-uk-taxation-in-2025-" class="relative group"&gt;The Reality of UK Taxation in 2025 💰 &lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s a strange hobby to have - budgeting - but it&amp;rsquo;s something I quite enjoy framing as an optimisation problem.&lt;/p&gt;
&lt;p&gt;Recently there&amp;rsquo;s been quite a bit of chat about the burden of taxation in the UK, with several fiscal &amp;ldquo;black holes&amp;rdquo; being discovered by the government, attempting to be closed via higher taxation, and then somehow doubling in size the next year.&lt;/p&gt;
&lt;p&gt;This is not going to be a specific opinion piece on taxation, but I wanted to provide some insight into what a typical PAYE employee as a Software Engineer in London may expect to pay in taxes in the UK.&lt;/p&gt;
&lt;h2 id="my-personal-tax-breakdown" class="relative group"&gt;My Personal Tax Breakdown &lt;/h2&gt;&lt;p&gt;Let me start by being completely transparent about my tax situation in 2025.
I&amp;rsquo;m not going to share exact figures, but I will share the percentages and structure that make up my total tax burden.&lt;/p&gt;
&lt;p&gt;For the purposes of this breakdown, I am sampling an average month of the year, and counting &amp;ldquo;income&amp;rdquo; as any money that I am given by my employer in exchange for my labour.
I&amp;rsquo;m not including an outlier month (like paying Stamp Duty or a Capital Gains tax )&lt;/p&gt;
&lt;p&gt;This particular month is representative of the last year I&amp;rsquo;ve been living in my house, where I&amp;rsquo;ve reduced my &amp;ldquo;lifestyle&amp;rdquo; spend quite a lot, and have been dumping money into my recent house purchase.
You&amp;rsquo;ll recognise there&amp;rsquo;s no &amp;ldquo;buffer/savings&amp;rdquo; section at the moment, 🤞 in a couple months I can swap the &amp;ldquo;renovation&amp;rdquo; section with &amp;ldquo;savings&amp;rdquo;, and I&amp;rsquo;ll probably post an update in a couple years, but the taxation breakdown will likely remain the same.&lt;/p&gt;
&lt;h3 id="income" class="relative group"&gt;Income &lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Full time Employment, fairly standard
&lt;ul&gt;
&lt;li&gt;Including employer&amp;rsquo;s pension contributions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="expenses" class="relative group"&gt;Expenses &lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Tax &lt;strong&gt;(43%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;National Insurance (12%)
&lt;ul&gt;
&lt;li&gt;Note: This includes Employers National Insurance, because ultimately I pay for this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Income (25%)&lt;/li&gt;
&lt;li&gt;Consumption/VAT (4%)&lt;/li&gt;
&lt;li&gt;Council (2%)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Savings/Investments &lt;strong&gt;(21%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Pension&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Housing &lt;strong&gt;(20%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Mortgage Interest (15%)&lt;/li&gt;
&lt;li&gt;Mortgage Capital Repayments (5%)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Lifestyle &lt;strong&gt;(13%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Eating Out/Groceries&lt;/li&gt;
&lt;li&gt;House Renovation&lt;/li&gt;
&lt;li&gt;This section has been &lt;em&gt;tight&lt;/em&gt; for a while now, and will increase after House Renovation (~10%) has finished.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bills &lt;strong&gt;(2%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Gas/Electricity/Phone/Wifi&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transport &lt;strong&gt;(1%)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;TfL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-tax-reality" class="relative group"&gt;The Tax Reality &lt;/h3&gt;&lt;p&gt;The taxes I&amp;rsquo;ve included in this are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;National Insurance Contributions&lt;/li&gt;
&lt;li&gt;Employers National Insurance Contribution&lt;/li&gt;
&lt;li&gt;Income Tax&lt;/li&gt;
&lt;li&gt;Council Tax&lt;/li&gt;
&lt;li&gt;VAT&lt;/li&gt;
&lt;li&gt;Insurance Premium Tax&lt;/li&gt;
&lt;li&gt;Capital Gains Tax (currently negligible from my amounts)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I haven&amp;rsquo;t included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Import tariffs&lt;/li&gt;
&lt;li&gt;Road Tax&lt;/li&gt;
&lt;li&gt;Any other erroneous tax on specific items that I didn&amp;rsquo;t want to calculate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Total Tax Burden as an individual: &lt;strong&gt;~43%&lt;/strong&gt;
Total Cost of Living: &lt;strong&gt;~67%&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not going to get too political, but if you assume my situation is fairly standard, and you assume that an economy is just the sum of its population, then it looks an awful lot like the UK economy is 43% government, about 30% housing, and around 3% &lt;em&gt;the stuff you actually see and do&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="what-if-i-were-a-business" class="relative group"&gt;What if I were a business? &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/08/uk-tax-burden-2025/if-i-were-a-corporation_hu_db7ff4bf398ac032.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1762"
 height="1030"
 class="mx-auto my-0 rounded-md"
 alt="Tax rates viewing my income and expenses as a corporation"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/08/uk-tax-burden-2025/if-i-were-a-corporation_hu_1d86044ef7408b16.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;There are some tax benefits that for &lt;em&gt;some reason&lt;/em&gt; are only available to corporations, so I thought - what if I was a corporation?&lt;/p&gt;
&lt;p&gt;Disclaimer: I&amp;rsquo;m not an accountant, and this is a bit of a stretched example relying mainly on the fact that expenses can be tax deductible, and completely ignoring the impact of import taxes, sales taxes, employment taxes, private health insurance etc that would be incurred.&lt;/p&gt;
&lt;p&gt;But the general idea of it is, if an expense is vital for a company, it should be deducted from the tax liability of that company.
Whereas if an expense is vital for a person, it cannot be tax deductible.&lt;/p&gt;
&lt;p&gt;Interestingly, you could arguably question whether an employee&amp;rsquo;s income tax should ultimately just fall as a consumption tax on human capital for a corporation (i.e. Employers NI), but as the incentive should be to have companies employing people, I think this is hard to justify.&lt;/p&gt;
&lt;p&gt;Tax burdens as a corporation: &lt;strong&gt;~13%&lt;/strong&gt;
Total Cost of Existence: &lt;strong&gt;~36%&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="looking-forward" class="relative group"&gt;Looking Forward &lt;/h2&gt;&lt;p&gt;At the time of writing, the UK is preparing itself for a further round of tax increases in the UK (as opposed to cutting spending, reforming blockers to economic growth, or accruing further debt).&lt;/p&gt;
&lt;p&gt;Nobody knows quite what the expected tax increases will be, but they are generally expected to tip into the &amp;ldquo;too much&amp;rdquo; category, risking some civil unrest.&lt;/p&gt;
&lt;p&gt;Most people in the UK have absolutely no idea how much tax they are spending, or the inequality of taxation for an individual compared to a corporation - especially not to the extend that an individual with a certain level of wealth can engineers themselves into being taxed as a corporation, hence avoiding a 43% tax burden and decreasing their proportional cost of existence.&lt;/p&gt;
&lt;p&gt;I am personally hoping for (though not expecting):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplification of the tax system + reducing regulatory barriers to growth
&lt;ul&gt;
&lt;li&gt;See: &lt;a href="https://ukfoundations.co/" target="_blank" rel="noreferrer"&gt;UK Foundations Whitepaper&lt;/a&gt; outlines several blockers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Better public understanding of the true cost of government
&lt;ul&gt;
&lt;li&gt;Even better, a reduction in wasteful or too-generous public spending&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Policies that address wealth inequality and social mobility
&lt;ul&gt;
&lt;li&gt;See: &lt;a href="https://fairershare.org.uk/" target="_blank" rel="noreferrer"&gt;Fairer Share&lt;/a&gt; as one potential tax change targeting &amp;ldquo;council tax&amp;rdquo; reform.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But my concern is that we&amp;rsquo;ll see more of the same: hidden tax increases, blissful ignorance of state inefficiencies, corporate tax cuts, and a growing burden on the average worker.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;What&amp;rsquo;s your experience with taxation? Is it fairer/worse in your country? I&amp;rsquo;d love to hear your thoughts on the current system and what changes you&amp;rsquo;d like to see. Better yet, message your representative politicians.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title>🔥 Why I decided to join incident.io and my impressions so far</title><link>https://jamesjarvis.io/posts/2025/07/why-i-decided-to-join-incident.io-and-my-impressions-so-far/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/07/why-i-decided-to-join-incident.io-and-my-impressions-so-far/</guid><category>Thoughts</category><description>In May 2025 I joined the AI team here at &lt;a href="http://incident.io" target="_blank" rel="noreferrer"&gt;incident.io&lt;/a&gt;, in search of new and exciting engineering challenges.</description><content:encoded>&lt;h2 id="why-i-wanted-to-join-incidentio-" class="relative group"&gt;Why I wanted to join incident.io 🔥 &lt;/h2&gt;&lt;p&gt;In May 2025 I joined the AI team here at &lt;a href="http://incident.io" target="_blank" rel="noreferrer"&gt;incident.io&lt;/a&gt;, in search of new and exciting engineering challenges.&lt;/p&gt;
&lt;p&gt;It’s now been just over 2 months, so I thought I’d share some of my thoughts on why I decided to join incident.io out of all options available, and how reality has compared to my expectations.&lt;/p&gt;
&lt;h3 id="i-want-to-be-a-part-of-the-ai-revolution" class="relative group"&gt;I want to be a part of the AI revolution &lt;/h3&gt;&lt;p&gt;Fun fact: I&amp;rsquo;ve been interested in AI since I watched Iron Man 2 as a wee lad and saw the &amp;ldquo;Jarvis&amp;rdquo; personal assistant, and I&amp;rsquo;ve wanted to be a part of building that ever since.&lt;/p&gt;
&lt;p&gt;I went on to university to take a bachelors in CS with an Artificial Intelligence specialism, though the dream plateaued there - owing to the heavily fintech oriented job market in London.&lt;/p&gt;
&lt;p&gt;Since GPT-3 dropped in late 2020, it&amp;rsquo;s been increasingly obvious that generative AI is sooner or later going to be generating more &lt;em&gt;stuff&lt;/em&gt; than humans ever could.&lt;/p&gt;
&lt;p&gt;I believe the outcome of this is not that Software Engineers are &lt;em&gt;going away&lt;/em&gt;, but that they will be shipping exponentially more code.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every engineer knows &lt;strong&gt;more code == more bugs&lt;/strong&gt;, and &lt;strong&gt;more bugs == more incidents&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This frankly necessitates incident management to get proportionally more productive as coding output does. Enter incident.io.&lt;/p&gt;
&lt;h3 id="the-team-has-aura" class="relative group"&gt;The team has aura &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/07/why-i-decided-to-join-incident.io-and-my-impressions-so-far/aura-farmer_hu_b0322d8b8fae4dfc.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1920"
 height="1080"
 class="mx-auto my-0 rounded-md"
 alt="Aura Farmer"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/07/why-i-decided-to-join-incident.io-and-my-impressions-so-far/aura-farmer_hu_edda77f5eed3aa06.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been wowed by the output and engineering presence of the incident.io team for a couple of years now, most recently the series on &lt;a href="https://incident.io/building-with-ai/tricks-to-fix-stubborn-prompts" target="_blank" rel="noreferrer"&gt;prompt engineering&lt;/a&gt; and &lt;a href="https://incident.io/building-with-ai/speculative-tool-calling" target="_blank" rel="noreferrer"&gt;latency reduction&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A personal goal of mine has been to write more, speak more, and ultimately just become a better builder - outside of just programming.&lt;/p&gt;
&lt;p&gt;Seeing how almost engineer has the experience, autonomy and support to not only build amazing things, but also share their experience online or at conferences, I was hooked - I want to learn as much as possible from these lot.&lt;/p&gt;
&lt;p&gt;Most of all, I want to &lt;em&gt;be&lt;/em&gt; one of them.&lt;/p&gt;
&lt;p&gt;From how people in the London tech scene spoke of incident.io, it was also clear that the engineering team radiates Aura 🧑‍🌾, people spoke very highly of their achievements.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s always a good sign.&lt;/p&gt;
&lt;h2 id="how-have-i-found-it-so-far" class="relative group"&gt;How have I found it so far? &lt;/h2&gt;&lt;h3 id="rewarding" class="relative group"&gt;Rewarding &lt;/h3&gt;&lt;p&gt;I &lt;em&gt;love&lt;/em&gt; working on a tangible project.&lt;/p&gt;
&lt;p&gt;What that means, is I like to see the direct impact my input will have on something.&lt;/p&gt;
&lt;p&gt;It may sound like a small thing, but at some companies, it could take weeks or months before you start to receive feedback on a shipped product.&lt;/p&gt;
&lt;p&gt;On my third day, I was chatting with an engineer from one of our largest clients about an (albeit small) feature I had shipped to them.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t get that kind of feedback loop in most places.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve joined into the AI team here at incident.io, where we are working on building an &lt;a href="https://incident.io/blog/introducing-ai-sre" target="_blank" rel="noreferrer"&gt;AI SRE&lt;/a&gt;, a feature that feels absolutely magical to see in action.&lt;/p&gt;
&lt;p&gt;We are planning ambitiously, changing priorities ruthlessly, and shipping ultra-fast.&lt;/p&gt;
&lt;p&gt;On my 60th day, I presented at all-hands the results of the Alpha-release of one of our upcoming AI SRE features that will help manage communications to incident stakeholders on your behalf.&lt;/p&gt;
&lt;p&gt;The early feedback we have had from our &lt;a href="https://incident.io/changelog/incident" target="_blank" rel="noreferrer"&gt;recent release of @incident chat&lt;/a&gt; has been extremely positive, and the feedback from our alpha customers on in progress features is extremely promising!&lt;/p&gt;
&lt;p&gt;The hype is absolutely real.&lt;/p&gt;
&lt;h3 id="competition-is-fierce" class="relative group"&gt;Competition is fierce &lt;/h3&gt;&lt;p&gt;The vision from above is crystal clear to others at the forefront of AI adoption, that as the rest of software development gets a massive boost in productivity, incident response needs an equivalent amount of love.&lt;/p&gt;
&lt;p&gt;Whilst growth at incident.io is &lt;em&gt;very&lt;/em&gt; good, the prospect of an AI SRE it too tempting for our competitors to just ignore - everyone is going after this goal at a breakneck pace.&lt;/p&gt;
&lt;p&gt;The competition are well staffed, well funded, and have a similar focus.&lt;/p&gt;
&lt;p&gt;So we are going to work our socks off to outcompete, out of raw talent and (imho) a better vision of what a complete incident resolution product should be.&lt;/p&gt;
&lt;h3 id="strong-values-crazy-productivity" class="relative group"&gt;Strong values; crazy productivity &lt;/h3&gt;&lt;p&gt;At incident.io, (especially in the AI team) we have an unlimited budget to spend on AI tools that can improve productivity, with the only requirement that you share your findings in our #ai-chat channel.&lt;/p&gt;
&lt;p&gt;To prepare for this blog post, I asked my current favourite AI tool &lt;a href="https://www.anthropic.com/claude-code" target="_blank" rel="noreferrer"&gt;Claude Code&lt;/a&gt; to research current blog posts and mention any current themes, so how did I do?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;⏺ Based on my research of incident.io&amp;#39;s blog, I found several posts from new employees sharing their experiences. Here&amp;#39;s what I discovered:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Key Blog Posts About New Employee Experiences:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1. &amp;#34;Why I joined incident.io as VP of Engineering&amp;#34; - Norberto Lopes reflects on his decision after two weeks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2. &amp;#34;Why I joined an engineering team of 6&amp;#34; - Martha&amp;#39;s 6-month reflection on joining the small team
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3. &amp;#34;My first week at incident.io&amp;#34; - Megan Batterbury&amp;#39;s week-by-week breakdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4. &amp;#34;How I started talking to customers in my first week&amp;#34; - Gabriel&amp;#39;s intern experience
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5. &amp;#34;They&amp;#39;re not kidding about the pace...&amp;#34; - Macey Baker on shipping 2 features in her first week
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 6. &amp;#34;Five unexpected lessons from my first two months as an intern&amp;#34; - Lucas&amp;#39;s reflection after 2 months
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Common Themes Across Posts:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Pace &amp;amp; Impact: Everyone mentions the incredible speed - shipping features within days/weeks, not months
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Trust by Default: New employees get meaningful responsibilities immediately, even interns
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Customer Focus: Direct customer interaction from day one, including interns
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Team Culture: Emphasis on collaboration, learning, and supportive environment
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Technical Philosophy: Simple, intuitive architecture that enables quick onboarding
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Learning Opportunities: 1:1s, documentation, and systematic support for growth
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funnily enough, this maps quite well with our company values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚡ Raise the pace&lt;/li&gt;
&lt;li&gt;☀️ Trust by default&lt;/li&gt;
&lt;li&gt;✨ Make it magic&lt;/li&gt;
&lt;li&gt;🤝 Find a way&lt;/li&gt;
&lt;li&gt;🏆 Win together&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the second week of my time here, we all jetted off to Greece for the annual offsite (I know, brilliant timing on my part!).&lt;/p&gt;
&lt;p&gt;With absolute certainty, I can tell you that everyone at this company demonstrates these 5 (quite un-corporate tbh) qualities in abundance.&lt;/p&gt;
&lt;p&gt;I can only apologise as I repeat this in my own post&amp;hellip;&lt;/p&gt;
&lt;h3 id="everyone-pulls-weight" class="relative group"&gt;Everyone pulls weight &lt;/h3&gt;&lt;p&gt;The team here is dense with talent, and everyone is marching in the same direction.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been fortunate enough to have worked in 2 teams already at incident.io, and everyone I have worked with has been extremely helpful, willing to repeat things until they get through my thick skull, and capable of contributing to pretty much any part of the codebase at a moments notice to ship improvements to the product.&lt;/p&gt;
&lt;p&gt;This does induce a healthy amount of imposters syndrome - nobody is entirely immune from this, and its healthy to admit. Though over the last couple of months of onboarding I’ve been ramping up on larger and larger projects, building back the confidence that drives my passion for engineering.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m with some of the best engineers in my career, all heads down focusing on how we can build an industry leading product that can intercept and resolve production incidents as they come up, &lt;em&gt;before you wake up&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you also want to be a part of the future of incident response at incident.io, we are hiring!&lt;/p&gt;</content:encoded></item><item><title>26 Years Old</title><link>https://jamesjarvis.io/posts/2025/06/26-years-old/</link><pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/06/26-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From the 23rd June 2024 to 23rd June 2025.&lt;/p&gt;
&lt;p&gt;I’m already in China when I kick this year off, finishing off another grand tour of new cities with Feiyang and her parents.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From the 23rd June 2024 to 23rd June 2025.&lt;/p&gt;
&lt;p&gt;I’m already in China when I kick this year off, finishing off another grand tour of new cities with Feiyang and her parents.&lt;/p&gt;
&lt;p&gt;Heading back into another brilliant British summer I have a few small holidays and then it’s time for Penny and Owen’s wedding!
A beautiful day and I have never been happier for my little sis.&lt;/p&gt;
&lt;p&gt;This year I decided my goal would be to buy a property, as I was tired of not getting value for money from London landlords.
I viewed dozens of places as I pondered between a central flat or suburby house, doer upper or turn key.&lt;/p&gt;
&lt;p&gt;In August my grandads health took a severe turn for the worse, and he unfortunately passed away, surrounded by his loved ones.
With all my grandparents now gone I’m saddened to lose another cockney voice from the streets.&lt;/p&gt;
&lt;p&gt;The first of my school friends got married!
I travelled up with the same lads I did DofE with almost a decade ago, but budgets and time keep us apart now.
Weeks later one of my best mates moves to Australia in search of a better life.&lt;/p&gt;
&lt;p&gt;I finally move in to my first house! Kicking off months of constant daily improvements, as my wonderful family and friends all chip in to help the DIY renovation efforts.
Over the Christmas break Feiyang heads back to China while I replace all the radiators and floors in the house, closely followed by a whole kitchen.&lt;/p&gt;
&lt;p&gt;My hardworking aunty finally retires, whilst I have a little think and decide its time for me to change jobs.
Feiyang and I take a few weeks out to travel South Korea and a bit more of China. I&amp;rsquo;ve joined the local tennis club, but you wouldn&amp;rsquo;t have known if you saw me play!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/HoqyTi2Siew?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>Secret Santa: A Quote-a-day E-Ink display</title><link>https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/</link><pubDate>Fri, 07 Feb 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/</guid><category>Projects</category><description>&lt;p&gt;This is the story of how I built (and how you can build) a cute little display that shows you a new famous quote every day.&lt;/p&gt;</description><content:encoded>&lt;p&gt;This is the story of how I built (and how you can build) a cute little display that shows you a new famous quote every day.&lt;/p&gt;
&lt;h2 id="the-idea" class="relative group"&gt;The idea &lt;/h2&gt;&lt;p&gt;Way back in December 2022, my family decided that this christmas we would DIY each other some presents.&lt;/p&gt;
&lt;p&gt;For a few years prior we had been experimenting with a secret santa to alleviate some of the pains of having everyone each buy 10 gifts to give to each person, but when we realised most people&amp;rsquo;s &amp;ldquo;wants&amp;rdquo; aren&amp;rsquo;t within a £50 budget, we gave the &amp;ldquo;make something and give that&amp;rdquo; idea a go.&lt;/p&gt;
&lt;p&gt;My &lt;del&gt;unlucky victim&lt;/del&gt; adoring cousin was to be the recipient of whatever thing I could make, and since she was at the time completing her doctorate, enjoyed reading, and had recently started programming, I thought I would try and make something that combined all of those ridiculously nerdy attributes into one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thou shalt build a display to show a new quote every day&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m sure the baby Jesus would&amp;rsquo;ve preferred one of these over some frankincense and myrrh any day.&lt;/p&gt;
&lt;p&gt;I had come back home for christmas and thought I could start work on making a V2 of my original e-ink display (&lt;a href="https://jamesjarvis.io/posts/2020/06/eink-dashboard/"&gt;read more about that one here&lt;/a&gt;), so this particular type of display was on my mind, and it fit perfectly with the goal of having a dumb little trinket sitting on a desk for months at a time without having to charge the battery.&lt;/p&gt;
&lt;h2 id="the-parts-list" class="relative group"&gt;The parts list &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/parts-list_hu_c2de971aefe5708b.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1774"
 height="1458"
 class="mx-auto my-0 rounded-md"
 alt="Parts List"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/parts-list_hu_6f409ba76ebcd44f.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Screenshot of the parts list on pimoroni.com&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You could 100% do this project for about half the price if you source components on AliExpress / some other site.&lt;/p&gt;
&lt;p&gt;However, I only had 1 week left to finish this project by the time I finally stopped procrastinating, I have always had a positive experience with Pimoroni and their shipping is normally only a couple days.&lt;/p&gt;
&lt;p&gt;Besides, I wouldn&amp;rsquo;t have to pull my hair out working out how to build a driver for this display, since the Badger2040 project is pretty well documented, and has a lot of support on &lt;a href="https://github.com/pimoroni/badger2040" target="_blank" rel="noreferrer"&gt;their GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The full parts list is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1x Pimoroni Badger 2040 (&lt;a href="https://shop.pimoroni.com/products/badger-2040?variant=39752959852627" target="_blank" rel="noreferrer"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;1x LiPo battery pack 1200mAh (&lt;a href="https://shop.pimoroni.com/products/lipo-battery-pack?variant=20429082183" target="_blank" rel="noreferrer"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;1x LiPo Amigo (&lt;a href="https://shop.pimoroni.com/products/lipo-amigo?variant=39779302506579" target="_blank" rel="noreferrer"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/back_hu_366811899c63fb5e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="All plugged together"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/back_hu_bbed0819e1f2db5f.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Back of the Badger2040 with battery attached&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/charging_hu_b7f0e671fddd4d05.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="LiPo battery charging with Amigo"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/charging_hu_af6a5ccd6f4e3929.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Charging the battery pack with LiPo Amigo&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You can choose to instead power the badger via a AAA battery pack, but I&amp;rsquo;m not a fan of disposable batteries.&lt;/p&gt;
&lt;p&gt;P.S. Pimoroni if you want to sponsor me I have my eyes on a few other things from your site! 😉&lt;/p&gt;
&lt;h2 id="the-quotes-list" class="relative group"&gt;The quotes list &lt;/h2&gt;&lt;p&gt;For this project I had about ~1.5MB of memory to play with on the Badger2040, so I couldn&amp;rsquo;t have too much data sitting around.
Though I did want enough to cover the goal of 1 quote a day, for as long as it takes to forget the other quotes, so around 2,040 quotes should do, assuming 200 characters per quote this&amp;rsquo;ll fit in under 0.5MB.&lt;/p&gt;
&lt;p&gt;Finding the quotes was quite hard, as most sites only host useless stuff like &amp;ldquo;Top 50 inspirational quotes&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Goodreads had probably the best corpus of material over on &lt;a href="https://www.goodreads.com/quotes" target="_blank" rel="noreferrer"&gt;https://www.goodreads.com/quotes&lt;/a&gt;, and if I were doing this again I would just write a quick script that scraped that page and trim by length of quote so it still fit on the small display.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s even a whole GitHub project for this: &lt;a href="https://github.com/maxhumber/quote" target="_blank" rel="noreferrer"&gt;github.com/maxhumber/quote&lt;/a&gt;, and nowadays a quick bit of ChatGPT / using your brain &lt;em&gt;audible groan&lt;/em&gt; could get you this data within a few moments.&lt;/p&gt;
&lt;p&gt;However, back in my last minute frantic I used a now-defunct API to scrape this data quickly. You can see my efforts at &lt;a href="https://github.com/jamesjarvis/secret-santa/blob/master/scraper/scraper.py" target="_blank" rel="noreferrer"&gt;github.com/jamesjarvis/secret-santa&lt;/a&gt; but don&amp;rsquo;t bother running it as the API seemed to have gone offline sometime in the last few years.&lt;/p&gt;
&lt;h2 id="displaying-quotes-on-the-badger2040" class="relative group"&gt;Displaying quotes on the Badger2040 &lt;/h2&gt;&lt;p&gt;Pimoroni offer a really good repository for writing software for the Badger2040.&lt;/p&gt;
&lt;p&gt;They have an embedded-systems subset of Python with very low resource consumption called &amp;ldquo;micropython&amp;rdquo;, that allows you to run pretty reasonable scripts on the RP2040 chip.&lt;/p&gt;
&lt;p&gt;Combining that with an alright badger2040 library to interact with the buttons and display, and it&amp;rsquo;s a good solid base point to write simple apps for the Badger2040 product.&lt;/p&gt;
&lt;p&gt;You can view the full source at &lt;a href="https://github.com/jamesjarvis/badger2040/blob/main/badger_os/examples/quotes.py" target="_blank" rel="noreferrer"&gt;github.com/jamesjarvis/badger2040&lt;/a&gt; but the gist of it is the &lt;code&gt;display_random_quote&lt;/code&gt; function, where we seek to a random line in a &amp;ldquo;quotes&amp;rdquo; file, and write it to the display, wrapping around the screen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;display_random_quote&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_pen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_thickness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FONT_THICKNESS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Open the quotes file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TOTAL_QUOTES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;current_quote_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Read a full line and split it into words.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_quote_json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latest_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latest_line_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;measure_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest_line&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TEXT_SIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;latest_line_length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;TEXT_WIDTH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latest_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latest_line&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latest_line&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latest_line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;- &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;current_quote_json&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;text_spacing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text_spacing&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TEXT_PADDING&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_pen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# last line is the author, make a bit bolder.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_thickness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FONT_THICKNESS&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TEXT_PADDING&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TEXT_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TEXT_SIZE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If I were to ever productionise this, I would look to find a more efficient way to scan through the file to a random line, as that&amp;rsquo;ll probably save a bit of energy.&lt;/p&gt;
&lt;h3 id="uploading-code-to-the-badger2040" class="relative group"&gt;Uploading code to the Badger2040 &lt;/h3&gt;&lt;p&gt;Normally when you get this kind of project it&amp;rsquo;s all dependent on some random toolchain you haven&amp;rsquo;t installed on your machine, and it&amp;rsquo;s so out of date that you&amp;rsquo;ll spend your first day just debugging how to program the damn thing.&lt;/p&gt;
&lt;p&gt;With Pimoroni&amp;rsquo;s Badger2040 repo (forked to &lt;a href="https://github.com/jamesjarvis/badger2040" target="_blank" rel="noreferrer"&gt;github.com/jamesjarvis/badger2040&lt;/a&gt;) you can exploit the repo&amp;rsquo;s Github actions to build the necessary compiled target for you!&lt;/p&gt;
&lt;p&gt;The development flow was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Clone badger2040 repo&lt;/li&gt;
&lt;li&gt;Make small changes (adding a &lt;a href="https://github.com/jamesjarvis/badger2040/blob/main/badger_os/examples/quotes.py" target="_blank" rel="noreferrer"&gt;quotes.py&lt;/a&gt; example App)&lt;/li&gt;
&lt;li&gt;Push commit to github and wait for the Action to build&lt;/li&gt;
&lt;li&gt;Download the &lt;code&gt;badger2040-micropython-with-badger-os.uf2&lt;/code&gt; file from the Action artifact list&lt;/li&gt;
&lt;li&gt;Connect badger2040 to computer in boot mode (hold down &lt;code&gt;boot/usr&lt;/code&gt; and press &lt;code&gt;rst&lt;/code&gt; button as it is plugged in)&lt;/li&gt;
&lt;li&gt;Copy over the downloaded &lt;code&gt;.uf2&lt;/code&gt; file from step 4 to the badger&lt;/li&gt;
&lt;li&gt;Bobs your Uncle&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-outcome" class="relative group"&gt;The outcome &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/secret-santa_hu_209973017f11c6b.gif"
 
 &gt;
 








 
 
 
 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 &lt;img
 width="640"
 height="480"
 class="mx-auto my-0 rounded-md"
 alt="Working Quotes Display"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2025/02/secret-santa-a-quote-a-day-e-ink-display/secret-santa_hu_f991e0e900fdb1c4.gif"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Quotes Display refreshing to new quote&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The outcome is quite nice if I say so myself.&lt;/p&gt;
&lt;p&gt;It lasts a few weeks on a single charge, and when you press an up or down button it&amp;rsquo;ll display a new random quote.
A simple but effective desk ornament.&lt;/p&gt;
&lt;p&gt;I never took a photo of the original I gave to my cousin, and I&amp;rsquo;m fairly sure it was &amp;ldquo;lost&amp;rdquo; quickly after christmas, so I made myself another one :smile:&lt;/p&gt;</content:encoded></item><item><title>📚 Year of books 2024</title><link>https://jamesjarvis.io/posts/2025/01/year-of-books-2024/</link><pubDate>Thu, 16 Jan 2025 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2025/01/year-of-books-2024/</guid><category>Reading</category><category>Thoughts</category><description>2024 I read a bit less</description><content:encoded>&lt;p&gt;Building on my last year getting properly back into reading, this is a continuation of my reflections.
For each book I read, I try and write a short (often poorly worded) review as a way of remembering what I learnt from each book.&lt;/p&gt;
&lt;p&gt;In my last post on this topic &lt;a href="https://jamesjarvis.io/posts/2024/01/year-of-books/"&gt;here&lt;/a&gt;, I reflected on my 2024 New Years resolution:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For 2024, one of my primary goals is to write more, and to write more publicly (fail fast, thanks &lt;a href="https://x.com/levelsio" target="_blank" rel="noreferrer"&gt;Levels&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now I didn&amp;rsquo;t do &lt;em&gt;too badly&lt;/em&gt;, writing 12 posts to this blog, but I&amp;rsquo;d like to see that go up in the next year, so consider this the continuation of that goal.&lt;/p&gt;
&lt;p&gt;The following has been extracted from a &lt;a href="#appendix"&gt;short script&lt;/a&gt; I co-authored with the help of ChatGPT, to export all of my reviews made in 2024.&lt;/p&gt;
&lt;p&gt;This year, I read and reviewed 20 books, a little down on last years 30, but I feel happy with it.&lt;/p&gt;
&lt;h3 id="the-lean-startup" class="relative group"&gt;The Lean Startup &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;I “read” this book as an audiobook, but I feel this does not do it justice, and I would have benefit more with a physical copy for later reference. The book repeats itself a bit, but has some valid case studies of companies who have benefitted from some of the “lean startup” approaches. Principally, the methods of “innovation accounting” seem to be key for ensuring a project is actually capturing a market fit, without wasting too much effort on untested hypotheses.&lt;/p&gt;
&lt;p&gt;Eric mentions some other concepts that interest me, namely the concept of keeping known “innovators” on innovative work, with the assumption that some are better suited for the implementation, scale up, or maintenance types of work/management.
This could perhaps explain the rarity of founder/ceos lasting much beyond the initial starting phase.&lt;/p&gt;
&lt;p&gt;Interestingly, in the epilogue Eric notes on the general unproductive nature of modern business enterprises. Focusing on the wrong metrics, spreading themselves too thin taking too long on too many projects that are ultimately doomed for failure lead to higher than required rates of failure.&lt;/p&gt;
&lt;h3 id="bullshit-jobs-a-theory" class="relative group"&gt;Bullshit Jobs: A Theory &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Don’t let the intriguing title fool you, this is a genuinely well researched and collated series of thoughts. Caveat here that I have not read deeply into this subject so this book is my first experience with reading on the economics of undervalued human labour.&lt;/p&gt;
&lt;p&gt;The good:
This is a subject that, from what I can tell, does not get the attention it deserves in popular economics.
Graeber is clearly one of the most active thinker on this subject, and is able to highlight almost all questions regarding the phenomena at least that I could think of.
Lots of interesting/humorous anecdotal case studies throughout the book, from people who have written to the author expressing their opinions of the social value of their own jobs.
His theory on the inverse correlation between social value and monetary compensation for a job is a shared belief, but the reasoning appears to favour a belief that the subject is being rewarded by the virtue of producing social value in the job itself, rather than purely monetary value from the salary.
It is full of classic case studies of middle-management and bureaucracy bloat, which if not particularly helpful, is somewhat cathartic to read.&lt;/p&gt;
&lt;p&gt;The bad:
Early on, the author makes a point regarding the rise of “services” jobs in both the UK and India. In the UK graph he notes on the increasing proportion of labour working in the service sector, whereas in the India graph he draws comparison on the increasing proportion of the services sector as part of India’s GDP. Whilst I don’t think the point is entirely lost here, the clearly handpicked statistics, each focused on different metrics of an economy, hurt his image as an unbiased commentator somewhat.
As the author does foreshadow, the last chapter on Universal Basic Income and his opinions as an anarchist do also devalue the book somewhat. I need more information on UBI to consider whether any of the expressed opinions are valid or not.&lt;/p&gt;
&lt;h3 id="the-god-delusion" class="relative group"&gt;The God Delusion &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;It’s hard to review this book as I’m just not the target audience for it.
I’m already an atheist, so what were presumably controversial topics for religious folk, sailed right past me without much meaning.
Thats not to say it hasn’t got merit, some chapters had interesting perspectives on various aspects of life.
The ones I remember most being:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The analogy of “binker”
&lt;ul&gt;
&lt;li&gt;And the suggestion that religion is a natural continuation of infantile support mechanisms (imaginary friends)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The perspective of death
&lt;ul&gt;
&lt;li&gt;Mark Twain “I do not fear death. I had been dead for billions and billions of years.”&lt;/li&gt;
&lt;li&gt;William Shakespeare’s seven stages of man, suggesting a character dies multiple times throughout their life.&lt;/li&gt;
&lt;li&gt;The Theseus Paradox, at the atomic level.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The thin slice of the universe we are capable of perceiving
&lt;ul&gt;
&lt;li&gt;With the imagery of a burkha, the notion that humans are only capable of experiencing and understanding a subset of all distances, colours, forces.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Although I did find that reading as an audiobook, the narrators had a “smarter than thou” tone, intentionally divisive for what purpose I can only assume, to anger some, and deepen a connection with others. I don’t think this is particularly constructive considering the objective nature of the book, so it could have done with a different style of writing/narrating.&lt;/p&gt;
&lt;h3 id="what-if-serious-scientific-answers-to-absurd-hypothetical-questions" class="relative group"&gt;What If?: Serious Scientific Answers to Absurd Hypothetical Questions &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;Learnt absolutely nothing and loved every page of it.&lt;/p&gt;
&lt;h3 id="nomad-century-how-to-survive-the-climate-upheaval" class="relative group"&gt;Nomad Century: How to Survive the Climate Upheaval &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;Pessimistic, alarmist, but most likely true.
Vince argues that humanity is not on track to achieve our climate goals, and will end up with 4-5 degrees of global warming by the end of the century. The implication of this, is that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all low lying areas will flood, including the likes of Bangladesh, Netherlands, London, New York and more.&lt;/li&gt;
&lt;li&gt;forest fires will threaten drier locations with lots of vegetation&lt;/li&gt;
&lt;li&gt;huge parts of the global south will become uninhabitable due to heat waves&lt;/li&gt;
&lt;li&gt;all farmland will either become unviable, or will be forced to change their crops&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Given this set of events, Vince warns us of an incoming mass migration event, from south to north. Large chunks of the book are dedicated to reminding us of the short lifespans of borders, and what is a nation anyway?&lt;/p&gt;
&lt;p&gt;But I wonder if this is even realistic?
Assuming continued population growth, and the loss of both farmland, and existing cities, can we even practically migrate almost 4 billion people into Siberia?&lt;/p&gt;
&lt;p&gt;Not to mention the clear devastation this will bring to whatever remaining wildlife or wilderness in this new frontier, I fear we will only ever be delaying the inevitable. A side chapter on forcing meat free diets, cramming people into high rise buildings and seeding the atmosphere with sulphates appear to reveal the truly dystopian vision the author is subconsciously trending towards.&lt;/p&gt;
&lt;p&gt;I think this is a good explanation of the problem we are likely to face, but draws the wrong conclusion about what a solution might be. A better solution for humanity as a whole, is to shift to sustainable living practises, and increase the efficiency of its use of resources, not to increase the population by any means necessary.
For an explanation of some of these ideas, I would recommend the book “degrowth”&lt;/p&gt;
&lt;h3 id="unnatural-causes-the-life-and-many-deaths-of-britains-top-forensic-pathologist" class="relative group"&gt;Unnatural Causes: The Life and Many Deaths of Britain&amp;rsquo;s Top Forensic Pathologist &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;Imagine finding a dead body. Imagine cutting said body up, folding back its tissues, pulling apart organs, re-assembling some part from bags, and imagining all possible ways this person could have died.
Pretty horrific, right?
Well, it would be for me, and as it turns out, roughly 23,000 postmortems later, it has turned out to be a bit traumatic for Dr Richard Shepherd as well.&lt;/p&gt;
&lt;p&gt;A lifetime in public service, doing the necessary, difficult work most cannot imagine themselves attempting leaves us with this fascinating, very well written memoir.&lt;/p&gt;
&lt;p&gt;Not for the squeamish, but a great read nonetheless as an exploration into one of those topics you’d never think about reading otherwise.&lt;/p&gt;
&lt;p&gt;Personally my favourite tales are of the doctor’s passion for flying over Kent, something I can fail to accurately reflect the emotion of. In addition, his overall passion for humanity, be it a lonely elderly woman, or a boat full of party-goers. He seems to have truly cared about uncovering the truth for each one, but you can hear the weight of these experiences cumulating on his mind.&lt;/p&gt;
&lt;h3 id="surrounded-by-idiots" class="relative group"&gt;Surrounded by Idiots &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;One of those books that you naturally doubt, and requires a bit more practise to grasp the value of classifying people into one of four colours.
The colours are certainly easy to remember, and have a hilarious, “inside-out”-esque character assigned to each one, but this only further accentuates how doubtable it is.
If you are willing to take this information at face value, and be a bit crude in your own application of these classifications onto your fellow person, then I could see this being useful as a quick behavioural filter. However I wouldn&amp;rsquo;t consider this an idiot-proof guide and your mileage may vary vastly.&lt;/p&gt;
&lt;h3 id="red-memory-the-afterlives-of-chinas-cultural-revolution" class="relative group"&gt;Red Memory: The Afterlives of China&amp;rsquo;s Cultural Revolution &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Not quite a historical account, not quite a modern day opinion piece, this book leaves the reader wanting to learn more about &lt;em&gt;why&lt;/em&gt; such a country could do such things.
Some scenes feel lifted straight from 1984, and the author does a good job with helping you to connect to each of the subjects, whose stories she portrays.
If this were fiction, it would be interesting at best and yes, Orwellian.
Given this is not fiction however, it fills you with sadness and a just a hint of fear for the future.
As history is slowly erased during the course of the book, it ends noting that the Party and it&amp;rsquo;s leaders are going nowhere.&lt;/p&gt;
&lt;h3 id="brave-new-world" class="relative group"&gt;Brave New World &lt;/h3&gt;&lt;p&gt;2/5 :star:&lt;/p&gt;
&lt;p&gt;In my opinion, this book is not a must read science fiction novel.
It has its merits, and the key themes of the book are laid out in plain terms roughly 3/4 of the way through the book in a narrative style, much like some other sci fi novels.
However, the reason for the low review is that these themes are neither particularly challenging, nor investigated in an insightful manner.&lt;/p&gt;
&lt;p&gt;You’ll find the first quarter, and subsequent snapshots of the book to revolve around the somewhat cheap and perverse obsession of communal sexual acts, chiefly amongst children.
It serves well as a shock factor, but goes so far as to kind of bore you of the books main plot.
The themes of automated and replicated human reproduction are interesting, but really don’t explain the necessity of “orgy porgy” to the plot.
Similarly, the manufactured genetic class system, and free distribution of psychedelics are a great concept to explore, but explain nothing about how the “savages” are really so different, given their reliance on religion.&lt;/p&gt;
&lt;p&gt;Overall whilst I’m sure this was groundbreaking for its time, it is one of those books that I might recommend once you have more or less exhausted the science fiction genre.&lt;/p&gt;
&lt;h3 id="speed--scale-a-global-action-plan-for-solving-our-climate-crisis-now" class="relative group"&gt;Speed &amp;amp; Scale: A Global Action Plan for Solving Our Climate Crisis Now &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;John Doerr puts forth the most digestible, compelling plan for combatting climate change in his book/call to arms: Speed and Scale.&lt;/p&gt;
&lt;p&gt;Well structured and pragmatic, the first half of the book covers the “what” needs to be done to reduce CO2e emissions, partitioned by sector. The remainder of the book has a deep dive into the “how” we may hope to achieve this.&lt;/p&gt;
&lt;p&gt;Well referenced with Objectives and Key Results acting as anchors to serve a trackable plan, the only concerning part is that since this book was published, the world is already falling behind on a number of these OKRs.&lt;/p&gt;
&lt;p&gt;I greatly admire Doerr for his determination to have some form of impact against the threat of climate change. Whilst some of his investments (QuantumScape, Beyond Meat) are more of a joke than serious companies, the idea holds true. We must invest more and move quicker.&lt;/p&gt;
&lt;h3 id="the-managers-path-a-guide-for-tech-leaders-navigating-growth-and-change" class="relative group"&gt;The Manager&amp;rsquo;s Path: A Guide for Tech Leaders Navigating Growth and Change &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;I recommend this book to anyone even vaguely interested in managing and growing any organisation, though this may particularly apply to technical ones.&lt;/p&gt;
&lt;p&gt;Fournier presents a well thought out breakdown of the challenges, her experience as well as snippets of wisdom from other leaders for various levels of management (mentorship, middle, senior leadership).&lt;/p&gt;
&lt;p&gt;My key takeaway would be to focus on defining and following the values of your particular chunk of an organisation. I have been fortunate enough to see many of these recommendations play out to varying effects at the companies I have worked for, so I will consider this another slither of knowledge to compare my experience against.&lt;/p&gt;
&lt;p&gt;That being said, I myself have not yet had the chance to truly live most of these experiences, so I would imagine your mileage may vary.&lt;/p&gt;
&lt;h3 id="rework" class="relative group"&gt;Rework &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;The introduction starts out by saying “a lot of people…call us a fluke” and then goes on to abashedly gloat about their apparently flukey success.
The book is written in this quite abrasive style, but does make a lot of sense, particularly for smaller organisations optimising for low effort, high value output.&lt;/p&gt;
&lt;p&gt;Some things stand out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make small, frequent decisions&lt;/li&gt;
&lt;li&gt;Half of a product is better than a half arsed product&lt;/li&gt;
&lt;li&gt;Avoid long todo lists&lt;/li&gt;
&lt;li&gt;Avoid absolute terms where unnecessary (can’t, must, everyone, no one)&lt;/li&gt;
&lt;li&gt;ASAP is inflationary&lt;/li&gt;
&lt;li&gt;Focus on customer service&lt;/li&gt;
&lt;li&gt;Don’t hire too fast&lt;/li&gt;
&lt;li&gt;Teaching is the best method of marketing&lt;/li&gt;
&lt;li&gt;Motivation has a short shelf life&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I think it’s worth a read, and I’m appreciative that they kept the book so short (supposedly halving the length between first and last draft). However take it with a pinch of salt, I doubt this will work for all industries/sizes of companies.&lt;/p&gt;
&lt;h3 id="the-power-of-geography-ten-maps-that-reveal-the-future-of-our-world" class="relative group"&gt;The Power of Geography: Ten Maps That Reveal the Future of Our World &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Some books you pick up, and wonder why you bother. The first paragraph passes you by without a second thought, and no value is apparent to you.
This was not one of those books.
I’m not completely blind to geopolitics, but this book presents a great way to reframe how you view a country. Its assets, liabilities and risks are made up of the natural landscape, resources and neighbouring interests.&lt;/p&gt;
&lt;p&gt;Tim himself sounds like an interesting character, and I’m left hungry for more of his world takes!&lt;/p&gt;
&lt;h3 id="the-price-of-money-how-to-prosper-in-a-financial-world-thats-rigged-against-you" class="relative group"&gt;The Price Of Money: How to prosper in a financial world that’s rigged against you &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Great to read, but I forgot to take notes so now I&amp;rsquo;ll need to read again!
I&amp;rsquo;m glad the book was kept short, as the value of this book is really just to reset your views on money, investments and the mentality of governments/central banks. It doesn&amp;rsquo;t need to be long to achieve that.&lt;/p&gt;
&lt;p&gt;I miss studying Economics!&lt;/p&gt;
&lt;p&gt;TL;DR: Money does not have any intrinsic value, it is simply a form of value exchange. Money&amp;rsquo;s value used to be tied to it&amp;rsquo;s scarcity, but since the 1970&amp;rsquo;s has been allowed to increase it&amp;rsquo;s own supply. QE and monetary policy are generally levers accessible to governments but have debatable impact. Limited monetary policy and inflation via QE are the likely strategy for the next 20 years, so the classic wisdom of owning assets still generally applies.&lt;/p&gt;
&lt;p&gt;One of the best things from this book comes down to the fact that most people in charge of central banks simply don&amp;rsquo;t know for sure what effect anything they do will have. Economics only makes sense in hindsight, and normalcy bias will generally mean you do not take action on any signs you may think you see.&lt;/p&gt;
&lt;h3 id="outlive-the-science--art-of-longevity" class="relative group"&gt;Outlive: The Science &amp;amp; Art of Longevity &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;I started reading this based on the recommendation of one of my good friends whilst on a road trip around Washington State.
I won&amp;rsquo;t say this has changed my life, but as we drove around partaking in the Standard American Diet, we couldn&amp;rsquo;t help but enjoy learning more about this subject.
With my cynical hat on, I can tell that the author is probably just on the wrong side of obsessive over their health, but their final chapter around mental health proves they are at least aware of their condition.&lt;/p&gt;
&lt;p&gt;If there is anything to take away from the book, it would have to be the general idea of &amp;ldquo;Training for the Centenarian Decathlon&amp;rdquo;.
Pick 10 activities you would like to keep doing once you are 100 years old (carrying groceries a few streets, walking around a park, picking up a child etc), then multiply the efforts a few times and train at this level consistently.
Sleep more, exercise more, avoid sugar, eat more protein, avoid alcohol.
Lifespan != healthspan, and there is no point on living too 100 if you have no reasonable social activities to share your life with, so take all things in moderation, and live a little!&lt;/p&gt;
&lt;h3 id="the-world-for-sale-money-power-and-the-traders-who-barter-the-earths-resources" class="relative group"&gt;The World for Sale: Money, Power and the Traders Who Barter the Earth’s Resources &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;A genuinely gripping read for one not previously aware of this shadowy, essential, industry.
The high level narrative is that these swashbuckling charismatic corporate figures have managed to corner effectively the entire worlds natural resources through sheer force of will.
The detailed accounts of who and how are what keep you turning pages, whether it be tales of foreign policy individuals smoking cigars with Fidel Castro early in to the morning, or a savvy trader propping up entire failed states (or the rebellions overthrowing them).&lt;/p&gt;
&lt;p&gt;This whole industry is a fascinating eye opener into how the world works, and the unimaginable riches that can be grabbed if the right information is known to the right people. The last chapter begins to map out the demise of the traditional giants as fiddly things like “ethics” start to get in the way (leaving space for some less regulated alternative traders from China to take the mantle).&lt;/p&gt;
&lt;p&gt;Overall, a great read, and some intriguing insight on how traditional finance, plus speculative financial instruments can provide massive accelerants to what I assumed would have been fairly boring, perfectly competitive markets.
Highly recommend for anyone interested in macroeconomics!&lt;/p&gt;
&lt;h3 id="conversations-on-love" class="relative group"&gt;Conversations on Love &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;I doubt anyone who has spent time thinking about love will learn anything new, or discover anything about themselves.&lt;/p&gt;
&lt;p&gt;The value of this book is in understanding that others have experienced the same situations, with some wonderfully personal stories.
For that purpose, it offers a great casual read exploring the experiences of others, but I wouldn’t recommend if you are expecting insight. This isn’t one of those topics where you are likely to learn anything new.&lt;/p&gt;
&lt;h3 id="radical-candor-be-a-kickass-boss-without-losing-your-humanity" class="relative group"&gt;Radical Candor: Be a Kickass Boss Without Losing Your Humanity &lt;/h3&gt;&lt;p&gt;3/5 :star:&lt;/p&gt;
&lt;p&gt;“Radical Candor” is a phrase I have heard several times over the course of my current career, by some of the most well respected engineers and managers I have yet encountered. So, I thought this would be worth a read.&lt;/p&gt;
&lt;p&gt;Though this is not the first management / organisational book I have read, it deserves a space on the bookshelf.
Scott recites her experiences from a whirlwind career starting on the streets of Moscow recruiting diamond cutters, to a pivotal time in the wholly radical early days of google, and scaling a sales team for Adsense, one of the most profitable products of the 21st century.&lt;/p&gt;
&lt;p&gt;From these experiences, Scott believes she has found some key characteristics of business leadership that function particularly well. Note that this is less of a groundbreaking new theory, and more of a reminder of good practices that have worked well in the low context, collaborative and progressive western companies, such as google.&lt;/p&gt;
&lt;p&gt;Some key points that can be translated elsewhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most employees are either “rockstars” (steady performers) or “superstars” (high growth). It is important to have a mix of both, and to reward equally.&lt;/li&gt;
&lt;li&gt;Nuances between “Radical Candor”, “ruinous empathy”, “obnoxious aggression” and “manipulative insincerity”, primarily with mistaking radical Candor for obnoxious aggression.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest, such as the need for immediate, direct feedback, and continually seeking constructive criticism, is echoed in many other books of this genre.&lt;/p&gt;
&lt;h3 id="the-trading-game" class="relative group"&gt;The Trading Game &lt;/h3&gt;&lt;p&gt;5/5 :star:&lt;/p&gt;
&lt;p&gt;What would you do, if you had one shot, one opportunity?
The first half of this book reminds you of Eminem, a scrawny white kid attempting to rise against adversity in an industry he adored, whilst battling with the grips of poverty.
Gary Stephenson is a unique economist and financial trader, with a compelling series of videos and articles outside of this book to his name, detailing his famous bets against economic recovery and the root cause: wealth inequality.&lt;/p&gt;
&lt;p&gt;If you are interested in this side of the story, then the first 2/3rds of the book are for you.
Having grown up also in east London, admiring the bankers herding their way through the city, I connected with this side of Gary’s story. The economic theory woven through this book is apparent, as he imperfectly competes over each rung in the ladder, towards achieving his first trading job.&lt;/p&gt;
&lt;p&gt;Though his career was short, it was agonisingly intense. The equal but opposite side of his bell curve career at Citi offered a peek into the mind of a man descending into burnout induced insanity.&lt;/p&gt;
&lt;p&gt;What would you do, for 4 million pounds?&lt;/p&gt;
&lt;p&gt;For Gary, this appeared to mean a loss of all human connection, all humanity even.&lt;/p&gt;
&lt;p&gt;Just ask yourself, what would you do? When would you escape?&lt;/p&gt;
&lt;p&gt;Thoroughly recommend if you are interested in viewing a slightly different take on a career in trading in the financial markets.&lt;/p&gt;
&lt;h3 id="never-split-the-difference-negotiating-as-if-your-life-depended-on-it" class="relative group"&gt;Never Split the Difference: Negotiating As If Your Life Depended On It &lt;/h3&gt;&lt;p&gt;4/5 :star:&lt;/p&gt;
&lt;p&gt;Typically when picking up these kinds of books, the reader has a particular motivation in mind. Negotiating a salary or a deal at work, practising their haggling at the local boot fair, or attempting to get the best price during a house purchase.&lt;/p&gt;
&lt;p&gt;This book as far as I can tell, gives some fantastic tips for negotiation, as long as the following constraints apply:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The negotiation must be between 1:1 parties. These tactics rely on approaching a deadline, deliberately drawing out the negotiation, and engaging in conversation first to best know your adversary.&lt;/li&gt;
&lt;li&gt;The negotiator must become comfortable with emotionally manipulating their adversary. These tactics again rely upon an ability to emotionally connect with your adversary, and then convince them they are sucking you dry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depending on the reader’s disposition, they may either extract some extremely valuable advice from this book, that they can immediately start to practice with. Or, they will likely feel incapable of applying some of these techniques in their own life.&lt;/p&gt;
&lt;p&gt;Either way, this book does have some interesting perspectives on negotiation, with a few case studies from the author’s own career, that make for excellent filler material all can appreciate.&lt;/p&gt;
&lt;h3 id="appendix" class="relative group"&gt;Appendix &lt;/h3&gt;&lt;h4 id="code-for-parsing-goodreads-data-export" class="relative group"&gt;Code for parsing Goodreads data export &lt;/h4&gt;&lt;script src="https://gist.github.com/jamesjarvis/09313d221587ac37c84704b3a5f69a18.js"&gt;&lt;/script&gt;</content:encoded></item><item><title>Role Based Access Control (RBAC) Authorisation in Golang with Permit.io</title><link>https://jamesjarvis.io/posts/2024/11/role-based-access-control-rbac-authorisation-in-golang-with-permit.io/</link><pubDate>Mon, 04 Nov 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/11/role-based-access-control-rbac-authorisation-in-golang-with-permit.io/</guid><category>Projects</category><description>What is &amp;lsquo;Authorisation&amp;rsquo;, and how to implement a working solution with Permit.io</description><content:encoded>&lt;p&gt;When building an application, you need to know who your users are, and what they should have access to.&lt;/p&gt;
&lt;p&gt;That’s when “Authentication” (are you who you say you are?) and “Authorisation” (are you allowed to do this thing?) come in to play.&lt;/p&gt;
&lt;p&gt;These are two similar but separate problems, each with their own challenges.&lt;/p&gt;
&lt;p&gt;Most developers don’t build their own authentication systems. It&amp;rsquo;s not-secure, and more importantly - not part of your products&amp;rsquo; core offering. Thus, it&amp;rsquo;s just not worth the effort / time you&amp;rsquo;ll spend building it.&lt;/p&gt;
&lt;p&gt;Authorisation is something traditionally built by developers in-house (Just like authentication was a few years ago), but in recent years, there are emerging options in the market that allow you to implement it without building it yourself.&lt;/p&gt;
&lt;p&gt;In this article we are going to focus on authorisation (authorization for my U.S. friends), covering a step by step integration and implementation with an example Key-Value service, written in the Go programming language.&lt;/p&gt;
&lt;p&gt;We are going to build our own naive authorisation system to get a feel for how it all works, and compare this with a production-ready implementation from &lt;a href="http://permit.io" target="_blank" rel="noreferrer"&gt;Permit.io&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-is-authorisation" class="relative group"&gt;What is &amp;ldquo;Authorisation&amp;rdquo;? &lt;/h2&gt;&lt;p&gt;At some point in the development of any &amp;ldquo;System&amp;rdquo; with &amp;ldquo;Users&amp;rdquo;, you will need some method of determining:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Is this &amp;ldquo;User&amp;rdquo; &lt;em&gt;actually&lt;/em&gt; &lt;em&gt;allowed&lt;/em&gt; to do the &lt;em&gt;thing&lt;/em&gt; they are trying to do?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is inevitable, whether the &amp;ldquo;system&amp;rdquo; you are building is physical (i.e. a Hotel), or virtual (i.e. a Social Network website).&lt;/p&gt;
&lt;p&gt;For any sensitive action, we need to make sure that the person performing that action is &lt;em&gt;allowed&lt;/em&gt; to do the action.
If the scenario is as simple as &lt;code&gt;if request.IsAuthenticated()&lt;/code&gt;, then congrats, you can end here, you have &amp;ldquo;authorisation through authentication&amp;rdquo;. &lt;strong&gt;But&lt;/strong&gt;, this means that &lt;strong&gt;any user who can authenticate into your system, is also authorised do to anything in your system&lt;/strong&gt;. For everything but a simple POC, this won&amp;rsquo;t fly.&lt;/p&gt;
&lt;p&gt;If the scenario is more complex, i.e. &lt;code&gt;if request.GetUser() not in authorisedUsers&lt;/code&gt;, then you are now able to &lt;strong&gt;restrict access to parts of your system&lt;/strong&gt;, but you have now inherited a complexity: you need to &lt;strong&gt;store and maintain a list of every single user allowed to perform every action in your system&lt;/strong&gt;.
If you have 100 users, and 5 actions in your system (a very small example), this can become a headache to manage very quickly, let alone if you have &amp;gt;1000 users, or more actions to perform.&lt;/p&gt;
&lt;p&gt;To simplify this, we can instead assign abilities to an abstract concept (Roles), this is where RBAC comes in.&lt;/p&gt;
&lt;h2 id="what-is-role-based-access-control-rbac" class="relative group"&gt;What is &amp;ldquo;Role Based Access Control&amp;rdquo; (RBAC) &lt;/h2&gt;&lt;p&gt;Rather than storing a map of user -&amp;gt; allowed actions, or actions -&amp;gt; allowed user, let&amp;rsquo;s abstract this a little.
Introducing the concept of &amp;ldquo;Roles&amp;rdquo;: A label you can pin to a whole bunch of users, and check against that.&lt;/p&gt;
&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Low cardinality
&lt;ul&gt;
&lt;li&gt;You may have millions of users, but you&amp;rsquo;ll rarely need more than a few dozen &amp;ldquo;roles&amp;rdquo;&lt;/li&gt;
&lt;li&gt;This is why the CIA has &amp;ldquo;security clearance levels&amp;rdquo;, rather than granting access to information individually&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Easier to manage
&lt;ul&gt;
&lt;li&gt;Easier to remove 1 &amp;ldquo;role&amp;rdquo; from 1 &amp;ldquo;user&amp;rdquo;, than updating the 1000s of actions a &amp;ldquo;user&amp;rdquo; may have access to&lt;/li&gt;
&lt;li&gt;This is why the CIA has &amp;ldquo;security clearance levels&amp;rdquo;, rather than granting access to information individually&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Semantically&lt;/em&gt; relevant
&lt;ul&gt;
&lt;li&gt;Wherever possible, as a developer your goal is to simplify the system&lt;/li&gt;
&lt;li&gt;Example: Seeing that a user has the roles of &lt;code&gt;[&amp;quot;intern&amp;quot;, &amp;quot;employee&amp;quot;, &amp;quot;admin&amp;quot;]&lt;/code&gt;, it is clearer to spot the problem than seeing a user with access to &lt;code&gt;[&amp;quot;receptionDoor1&amp;quot;, &amp;quot;receptionDoor2&amp;quot;, &amp;quot;cafeDoor3&amp;quot;, &amp;quot;floor4Door4&amp;quot;, &amp;quot;floor2Door3&amp;quot;]&lt;/code&gt;, if &lt;code&gt;&amp;quot;floor4Door4&amp;quot;&lt;/code&gt; is your server room&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now that we understand the benefits of simplifying access control through the use of “Roles” users can be assigned to, let’s look at a demo application in Golang.&lt;/p&gt;
&lt;h2 id="example-application" class="relative group"&gt;Example Application &lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s keep this super simple, and say that you have 2 endpoints to an application that allows users to save and retrieve key-value pairs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /v1/map/{key}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /v1/map/{key}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each &amp;ldquo;user&amp;rdquo;, once authenticated, can be in one of two groups (&amp;ldquo;roles&amp;rdquo;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;reader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;writer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;ldquo;Readers&amp;rdquo; can &lt;strong&gt;GET&lt;/strong&gt;, &amp;ldquo;Writers&amp;rdquo; can &lt;strong&gt;POST&lt;/strong&gt;, a user can have either or both of these roles.&lt;/p&gt;
&lt;p&gt;i.e. If I am a user (”Alice”), and I have the ability to &lt;strong&gt;write&lt;/strong&gt;, I should be able to write a value of “world” to a key of “hello”.&lt;/p&gt;
&lt;p&gt;If I am a user (”Bob”), and I have the ability to &lt;strong&gt;read&lt;/strong&gt;, I should be able to see the value “world” under key “hello” that alice has just written for me.&lt;/p&gt;
&lt;p&gt;However, since Bob cannot write, he should not be able to override the value of “world”, nor should he be able to add any new values to our system.&lt;/p&gt;
&lt;p&gt;To show how to implement this sort of authorisation control to a system, we are going to start off with a working key-value service for the above, without any access controls in place.&lt;/p&gt;
&lt;p&gt;We will then build our own RBAC system given the users and roles we know about and integrate it with our system.&lt;/p&gt;
&lt;p&gt;To top it all off, we are then we are going to showcase a scalable, production ready setup built using the &lt;a href="http://Permit.io" target="_blank" rel="noreferrer"&gt;Permit.io&lt;/a&gt; Golang SDK for RBAC.&lt;/p&gt;
&lt;p&gt;First, our Service setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// StorageClient provides access to a key-value map.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StorageClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Service is an implementation of the key-value service&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;StorageClient&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Get accepts a user and a key, and returns either the value associated with that key,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or an error if encountered.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;error getting value for key:%q error:%w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;error getting value for key:%q error:%w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Error_NOTFOUND&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Set accepts a user, key and value, and will attempt to set the value with that key,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// or return an error if encountered.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;error setting value for key:%q error:%w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using our &lt;code&gt;StorageClient&lt;/code&gt; interface, and the &lt;code&gt;Get&lt;/code&gt; and &lt;code&gt;Set&lt;/code&gt; application APIs, we have the ability to read and write any key-value pair we desire, without any authorisation logic to safeguard access.
Get allows any user to extract the value for a given key, and Set allows any user to write the value at a given key.&lt;/p&gt;
&lt;p&gt;Simple, right? Now let’s try and implement our own RBAC!&lt;/p&gt;
&lt;h3 id="restricting-access-to-our-api" class="relative group"&gt;Restricting Access to our API &lt;/h3&gt;&lt;p&gt;Remember, we now want to restrict access to &lt;code&gt;Get&lt;/code&gt; and &lt;code&gt;Set&lt;/code&gt; based on whether the given user is a &amp;ldquo;reader&amp;rdquo; or a &amp;ldquo;writer&amp;rdquo;.
To build an API for checking the authorisation level of the user, we really only care about whether they are or aren&amp;rsquo;t authorised to access the resource.
A good API for this, therefore, would enable us to supply our &lt;code&gt;userID&lt;/code&gt;, and their intended &lt;code&gt;action&lt;/code&gt;, and allow the API to resolve the user&amp;rsquo;s &lt;code&gt;roles&lt;/code&gt;, and the &lt;code&gt;permitted roles&lt;/code&gt; for each action, and return us &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;, depending on whether the user can or cannot perform the intended action.&lt;/p&gt;
&lt;p&gt;A good interface for this then, would follow:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// AccessClient enables the ability to check authorisation for a given user.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AccessClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Popping this into our implementation is quite simple, as an initial validation step for our API:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;get&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Error_UNAUTHORISED&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;set&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Error_UNAUTHORISED&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this &lt;code&gt;AccessClient&lt;/code&gt;to work however, we need an implementation&amp;hellip;&lt;/p&gt;
&lt;h3 id="diy-in-memory-rbac" class="relative group"&gt;DIY: In-memory RBAC &lt;/h3&gt;&lt;p&gt;Those with a keen eye for Go would notice we have defined our authorisation API first, ignoring any eventual implementation.
This is a good way to focus on your API first, without getting too bogged down with how your API implementation should actually work.&lt;/p&gt;
&lt;p&gt;To get our heads around the problem, we can look into a simple implementation of this API, using an in-memory map to keep track of our users, the actions that may be performed, and the roles permitted to complete those actions.&lt;/p&gt;
&lt;p&gt;Our objects &lt;code&gt;User&lt;/code&gt; and &lt;code&gt;Action&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// User is a user object, containing the roles this user is a member of.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Action is an action that can be performed, along with the roles allowed to perform this action.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PermittedRoles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our &lt;code&gt;Check&lt;/code&gt; function, needs to answer the question of &lt;code&gt;Does the given user have a role, that is permitted to complete the given action?&lt;/code&gt;
In reality, this manifests quite easily as a reverse lookup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Check returns true if the user is allowed to perform the action, false otherwise.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Access&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;actionID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;actionID&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;slices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PermittedRoles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the above, if the user exists, the action exists, and at least one of the user&amp;rsquo;s roles match with at least one of the action&amp;rsquo;s permitted roles, then we &lt;code&gt;return true&lt;/code&gt;, and the action is permitted!&lt;/p&gt;
&lt;p&gt;Conversely, if the user is unknown, or the action is unknown or none of the user&amp;rsquo;s roles match with any of the action&amp;rsquo;s permitted roles, then we &lt;code&gt;return false&lt;/code&gt;, and the action is denied, at which point an UNAUTHORISED error is returned to the the caller.&lt;/p&gt;
&lt;h3 id="flaws-with-diy" class="relative group"&gt;Flaws with DIY &lt;/h3&gt;&lt;p&gt;In practise however, I don’t recommend you to actually use the above DIY approach.
DIY-ing your own authorisation implementation is something that should really only be attempted by the Googles of this world, as there is a good chance you simply will &lt;strong&gt;not have the resources&lt;/strong&gt; to do it &lt;strong&gt;correctly&lt;/strong&gt;, let alone &lt;strong&gt;quickly&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Focus on outsourcing the implementation of all elements of your system that are not specifically critical to the value you intend to provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t build your own database&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t build your own container orchestrator&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t build your own authorisation system&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t do anything that you don&amp;rsquo;t have to&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="alternative-rbac-with-permitio" class="relative group"&gt;Alternative: RBAC with &lt;a href="http://permit.io/" target="_blank" rel="noreferrer"&gt;permit.io&lt;/a&gt; &lt;/h3&gt;&lt;p&gt;&lt;a href="https://permit.io/" target="_blank" rel="noreferrer"&gt;Permit.io&lt;/a&gt; is an authorisation as a service provider, with a whole suite of features that cover use cases from this simple example, all the way to the largest enterprise applications with millions of users and umpteen levels of complexity.&lt;/p&gt;
&lt;p&gt;This solution was easy enough to work with that I could build this example implementation in &amp;lt;30 mins from reading through their docs (ChatGPT could probably do it faster though!)&lt;/p&gt;
&lt;p&gt;Conveniently, the Permit Golang SDK also has it&amp;rsquo;s own &lt;code&gt;Check&lt;/code&gt; function, that is similar to ours:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// PermitClient is the permit.io client interface.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PermitClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For our case, to provide a drop in replacement to our DIY solution, we are going to wrap this function.
The models in this API are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;User&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;Identifiers for a given user to the system&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Action&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;The intent for a given call to &amp;ldquo;Check&amp;rdquo;, in our case this will be &amp;ldquo;get&amp;rdquo; or &amp;ldquo;set&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Resource&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;The domain for which this action is being performed against&lt;/li&gt;
&lt;li&gt;In our simple example, we do not have a need for this &amp;ldquo;resource&amp;rdquo;, as we only have a single map domain, but this allows for other rich customisations later on, such as namespaced maps with alternative access controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our wrapper:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Check returns true if the user is allowed to perform the action, false otherwise.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Permit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;actionID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UserBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userID&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actionID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;enforcement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ResourceBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;map&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;permitClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;permit error: %s\\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;allowed&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="our-final-application" class="relative group"&gt;Our final application &lt;/h3&gt;&lt;p&gt;If you want to dive deeper into the code, and run the application yourself (with both DIY and Permit based authorisation), you can follow the steps on &lt;a href="https://github.com/jamesjarvis/rbac-example" target="_blank" rel="noreferrer"&gt;github.com/jamesjarvis/rbac-example&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our test data includes the following users, and their roles:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;UserID&lt;/th&gt;
					&lt;th&gt;Role: reader&lt;/th&gt;
					&lt;th&gt;Role: writer&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;alice&lt;/td&gt;
					&lt;td&gt;Y&lt;/td&gt;
					&lt;td&gt;Y&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;bob&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;Y&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;charli&lt;/td&gt;
					&lt;td&gt;Y&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Our server is a HTTP server running on port &lt;code&gt;:8080&lt;/code&gt;, so we can perform a simple test by setting a value &amp;ldquo;world&amp;rdquo; for key &amp;ldquo;hello&amp;rdquo; as user &amp;ldquo;alice&amp;rdquo;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -H &lt;span class="s2"&gt;&amp;#34;User: alice&amp;#34;&lt;/span&gt; -X POST &amp;lt;http://localhost:8080/v1/map/hello&amp;gt; -d &lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Fantastic, this works! Alice is indeed able to write to the &lt;code&gt;POST&lt;/code&gt; endpoint, as they have the role of &amp;ldquo;writer&amp;rdquo;. We can see since they also have the role of &amp;ldquo;reader&amp;rdquo;, they should also be able to &lt;code&gt;GET&lt;/code&gt; this value again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -H &lt;span class="s2"&gt;&amp;#34;User: alice&amp;#34;&lt;/span&gt; -X GET &amp;lt;http://localhost:8080/v1/map/hello&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But what if Bob tries to read this value?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -H &lt;span class="s2"&gt;&amp;#34;User: bob&amp;#34;&lt;/span&gt; -X GET &amp;lt;http://localhost:8080/v1/map/hello&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; UNAUTHORISED
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bob cannot perform any GET calls, because Bob does not have the &amp;ldquo;reader&amp;rdquo; role, which is required to perform the &amp;ldquo;get&amp;rdquo; action. Bob can, however, perform POST requests.&lt;/p&gt;
&lt;p&gt;Similarly, our final user Charli does not have the &amp;ldquo;writer&amp;rdquo; role, preventing them from accessing the POST endpoint, but since they are a &amp;ldquo;reader&amp;rdquo;, they can still perform &lt;code&gt;GET&lt;/code&gt; requests:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -H &lt;span class="s2"&gt;&amp;#34;User: charli&amp;#34;&lt;/span&gt; -X GET &amp;lt;http://localhost:8080/v1/map/hello&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="summary" class="relative group"&gt;Summary &lt;/h2&gt;&lt;p&gt;Authorisation is the challenge of answering “Is this User &lt;em&gt;actually&lt;/em&gt; &lt;em&gt;allowed&lt;/em&gt; to do the &lt;em&gt;thing&lt;/em&gt; they are trying to do?”&lt;/p&gt;
&lt;p&gt;By focusing on Roles, rather than Users (RBAC), application writers can greatly simplify both their application logic, and the operation of their application.&lt;/p&gt;
&lt;p&gt;We have built a working HTTP Key-Value service in Golang, that allows a user to &lt;code&gt;GET&lt;/code&gt; (read) and &lt;code&gt;POST&lt;/code&gt; (write) values at a given key.&lt;/p&gt;
&lt;p&gt;We have then extended this application to restrict access to these endpoints based on whether the user has the associated role of “reader” or “writer”.&lt;/p&gt;
&lt;p&gt;We have explored the pros and cons of two different implementation to this RBAC solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIY using just the Golang standard library&lt;/li&gt;
&lt;li&gt;Using &lt;a href="http://Permit.io" target="_blank" rel="noreferrer"&gt;Permit.io&lt;/a&gt; as our Authentication as a service provider&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Phew!&lt;/p&gt;
&lt;p&gt;By this point, you should have a decent understanding of how a simple Role Based Access Control (RBAC) implementation can be integrated into your application.&lt;/p&gt;
&lt;p&gt;Focusing on &amp;ldquo;roles&amp;rdquo; rather than &amp;ldquo;users&amp;rdquo;, provides an easier abstraction for both yourself as a developer, but also your system administrators, and ultimately, your users themselves.&lt;/p&gt;
&lt;p&gt;Finally, another word of caution.&lt;/p&gt;
&lt;p&gt;Focus on outsourcing the implementation of all elements of your system that are &lt;strong&gt;not specifically critical to the value you intend to provide&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&amp;rsquo;t build your own databases&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t build your own container orchestrators&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t build your own authorisation systems&lt;/li&gt;
&lt;li&gt;Do focus on the core offering of your product&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;</content:encoded></item><item><title>🏡 On Buying a House</title><link>https://jamesjarvis.io/posts/2024/10/on-buying-a-house/</link><pubDate>Wed, 02 Oct 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/10/on-buying-a-house/</guid><category>Thoughts</category><category>Personal Finance</category><description>&lt;p&gt;I have a bit of a confession to make.&lt;/p&gt;
&lt;p&gt;I am horribly, frustratingly, embarrassingly&amp;hellip; &lt;em&gt;indecisive&lt;/em&gt;.&lt;/p&gt;</description><content:encoded>&lt;p&gt;I have a bit of a confession to make.&lt;/p&gt;
&lt;p&gt;I am horribly, frustratingly, embarrassingly&amp;hellip; &lt;em&gt;indecisive&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It took me 4 months to decide on a new bike earlier this year, when I desperately needed one to commute.&lt;/li&gt;
&lt;li&gt;It took me 3 months the year before that to decide on a new coat for the winter, when I had no waterproofs at all.&lt;/li&gt;
&lt;li&gt;It took me over a month to decide on a replacement car when mine was crashed in to, and I was out of my most useful mode of transport.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But these were comparatively &lt;em&gt;small&lt;/em&gt; purchases.
What if I were to continue acting the same, but apply this to the &lt;strong&gt;largest financial decision of my entire life&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;So, we arrive at March 2024.
The beginning of my search.&lt;/p&gt;
&lt;h2 id="why-buy" class="relative group"&gt;Why buy? &lt;/h2&gt;&lt;p&gt;For context, I have been living primarily in East London (Wapping/Limehouse) for the last 4 years, in flats of varying quality.&lt;/p&gt;
&lt;p&gt;The rent was roughly ~2kGBP/month, split between myself and my housemates - not all too bad considering I could cycle into work/around London, and that is something I thoroughly enjoyed doing.&lt;/p&gt;
&lt;p&gt;But there was always the sense of impermanence to the rental situation.
Like my housemates, I had never decorated my room, too afraid to knock anything into the walls, or risk losing our deposit.
I &amp;ldquo;made do&amp;rdquo; with furniture/appliances/colours/bathrooms I didn&amp;rsquo;t like, because I couldn&amp;rsquo;t get rid of the existing stuff, and I wasn&amp;rsquo;t allowed to change something that wasn&amp;rsquo;t mine.&lt;/p&gt;
&lt;p&gt;Cynically, I was starting to assume that landlords fill flats with the cheapest ikea furniture, not because it was cheap for them, but because it would eventually break, and clawing back deposits was another stream of income for them.&lt;/p&gt;
&lt;p&gt;Honestly, I was exhausted of not feeling safe enough to make my place of residence, my home.&lt;/p&gt;
&lt;p&gt;Settled: I&amp;rsquo;ll buy my own place! (After years of aggressively saving for a deposit).&lt;/p&gt;
&lt;h2 id="what-buy" class="relative group"&gt;What buy? &lt;/h2&gt;&lt;p&gt;It all depends on your lifestyle and your budget really, and there is no good guide for this.
But I would recommend you take stock of what you do / what you plan to do during a normal week now and in 5 years, and optimise for that.&lt;/p&gt;
&lt;p&gt;You basically have a choice of:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;/th&gt;
					&lt;th&gt;High Budget&lt;/th&gt;
					&lt;th&gt;Low Budget&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Very sociable&lt;/td&gt;
					&lt;td&gt;House/Flat inside city&lt;/td&gt;
					&lt;td&gt;Flat inside city&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Less sociable&lt;/td&gt;
					&lt;td&gt;House outside city&lt;/td&gt;
					&lt;td&gt;House/Flat outside city&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Whatever you buy though, watch out for the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transportation links&lt;/li&gt;
&lt;li&gt;Floor plan (in flats this is pretty much fixed forever)&lt;/li&gt;
&lt;li&gt;Service charge and ground rent charges, also check for a sinking fund&lt;/li&gt;
&lt;li&gt;If it&amp;rsquo;s a flat, does it have an EWS1 certificate?&lt;/li&gt;
&lt;li&gt;Avoid leasehold as much as possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My personal preferences leant me towards having full ownership of control over wherever I was am living, so flats were out of the question.
Terraced, semi, or detached are where I&amp;rsquo;m looking for, I want some physical ground I can build a shed on, or park a car.&lt;/p&gt;
&lt;h2 id="where-buy" class="relative group"&gt;Where buy? &lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ll preface this by saying: I &lt;em&gt;love&lt;/em&gt; London.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m also &lt;em&gt;from&lt;/em&gt; London, the South East.&lt;/p&gt;
&lt;p&gt;Now, the South East of London has without a doubt got the &lt;strong&gt;worst transport options&lt;/strong&gt; out of all of London.&lt;/p&gt;
&lt;p&gt;The city planners somehow forgot about the South when building out the underground network, and the government was quite happy with selling the national rail network to private companies, with no incentive for improvement.&lt;/p&gt;
&lt;p&gt;However, my family all live in South East London, and it&amp;rsquo;s &lt;em&gt;almost&lt;/em&gt; affordable, so that&amp;rsquo;s that.&lt;/p&gt;
&lt;p&gt;One day, I&amp;rsquo;ll move to some nice leafy suburb in the North West, but that goal is not achievable just yet&amp;hellip;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/10/on-buying-a-house/crystalroof-screenshot_hu_dc42e8865ca8be74.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2486"
 height="1614"
 class="mx-auto my-0 rounded-md"
 alt="Bexley Area Overview"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/10/on-buying-a-house/crystalroof-screenshot_hu_28861f28ef92f2b7.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Overview of Bexley, by CrystalRoof. Sounds about right&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="useful-resources-for-finding-a-property" class="relative group"&gt;Useful Resources for Finding a Property &lt;/h2&gt;&lt;p&gt;These are some fantastic resources I used to determine my ideal area, and to track down a house on the market:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://crystalroof.co.uk/report/postcode/DA51AA/overview" target="_blank" rel="noreferrer"&gt;CrystalRoof&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Offers insight into local crime reports, demographics, transport links, and amenities. Really helpful if you aren&amp;rsquo;t sure about an area!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hoodmaps.com/london-neighborhood-map" target="_blank" rel="noreferrer"&gt;HoodMaps&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Hilarious and vaguely useful community map for rating a location.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoopla.co.uk/travel-time/" target="_blank" rel="noreferrer"&gt;Zoopla Travel Time&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;If you don&amp;rsquo;t know where to start, but know you want to be able to commute to work by bike in less than 30 mins, this is a great tool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.zoopla.co.uk/for-sale/map/property/kent/bexley/bexley-high-street/da5-1aa/?q=DA51AA&amp;amp;search_source=home" target="_blank" rel="noreferrer"&gt;Zoopla&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Probably the best home finding app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rightmove.co.uk/property-for-sale/map.html?includeSSTC=false&amp;amp;keywords=&amp;amp;sortType=2&amp;amp;viewType=MAP&amp;amp;channel=BUY&amp;amp;index=0&amp;amp;radius=0.25&amp;amp;locationIdentifier=POSTCODE%5E215471" target="_blank" rel="noreferrer"&gt;RightMove&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;The most popular home finding app.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.onthemarket.com/for-sale/property/da5-1aa/?view=map-list" target="_blank" rel="noreferrer"&gt;OnTheMarket&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Also useful home finding app, covers some extra estate agents.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jitty.com" target="_blank" rel="noreferrer"&gt;Jitty&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Honourable mention, has some interesting AI search features, like &amp;ldquo;period property with tall ceilings and a driveway&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-buy" class="relative group"&gt;How buy? &lt;/h2&gt;&lt;p&gt;I had been living in rental accommodation for the last few years, with some &amp;ldquo;free&amp;rdquo; months &lt;a href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/"&gt;in Singapore&lt;/a&gt;, or staying with my parents.
I&amp;rsquo;m quite frugal in general, aside from the odd splurge on &lt;a href="https://jamesjarvis.io/tags/travel/"&gt;flight tickets&lt;/a&gt;, so as a result I have managed to save approximately 30% of my income (around the same that goes to the taxman, grrr) over my first 6 years of work.&lt;/p&gt;
&lt;p&gt;By around March 2024, this looked like a good enough amount for a bank to take me seriously as I requested a mortgage offer, and so I started to look for places.&lt;/p&gt;
&lt;p&gt;If you have followed the writings of &lt;a href="https://www.wealtheconomics.org" target="_blank" rel="noreferrer"&gt;Gary Stevenson&lt;/a&gt;, the evidence of rising inequality can provide an explanation of why housing is becoming more unaffordable, but since I&amp;rsquo;m in no position to change this, it&amp;rsquo;s worth jumping in to the housing market as soon as you can.&lt;/p&gt;
&lt;p&gt;The process is fairly simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get a Mortgage in Principle (MIP).&lt;/strong&gt;
This is generally a crude affordability check for how much you can theoretically borrow from a mortgage lender.
This is a maximum value, do not take it as a goal.
Remember, you want to own a house, not to be owned by a bank.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go for some viewings.&lt;/strong&gt;
Different areas, different styles, different sizes.
This will take a long while (4+ months) but that&amp;rsquo;s ok.
You probably won&amp;rsquo;t know what to look for but the most common, most valuable questions are:
&lt;ul&gt;
&lt;li&gt;How old is the boiler?&lt;/li&gt;
&lt;li&gt;How old is the kitchen?&lt;/li&gt;
&lt;li&gt;How many plug sockets does the property have?&lt;/li&gt;
&lt;li&gt;Does the property have good insulation?&lt;/li&gt;
&lt;li&gt;Does the property have damp? Or any leaks?&lt;/li&gt;
&lt;li&gt;In what condition is the bathroom?&lt;/li&gt;
&lt;li&gt;Are there any signs of Asbestos?&lt;/li&gt;
&lt;li&gt;How are the neighbours?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put in an offer.&lt;/strong&gt;
I would even recommend being a bit cheeky, and putting in an offer ~10% below market value for a property you won&amp;rsquo;t mind losing.
You&amp;rsquo;ll get more of an idea of how the process works, and it won&amp;rsquo;t feel so daunting after the first time.
Remember, you aren&amp;rsquo;t just buying a property, you are selling yourself as a &lt;em&gt;good buyer&lt;/em&gt;, that can be extremely valuable to some people.
If you are a first time buyer, you are worth &lt;em&gt;at least&lt;/em&gt; 1% of the property value more when compared to another buyer in a long chain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get a good solicitor&lt;/strong&gt;
It&amp;rsquo;s not worth being cheap here.
These guys are expensive, but the difference can be night and day.
Go for one with good recommendations, though probably not one from the estate agents, as they normally get a kickback.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get a mortgage&lt;/strong&gt;
Talk to mortgage brokers and go hunting online.
Neither one covers the whole market, so try both for the best deal.
I used these resources that I would highly recommend:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mortgageadvicehub.com" target="_blank" rel="noreferrer"&gt;www.mortgageadvicehub.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.moneysavingexpert.com/mortgages/best-buys/" target="_blank" rel="noreferrer"&gt;www.moneysavingexpert.com&lt;/a&gt;
I would recommend getting a mortgage on the longest term possible (~40 years), as you will always have the ability to overpay and pay it off early, without being forced into it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Get your surveys done&lt;/strong&gt;
You&amp;rsquo;ve got the offer accepted, a solicitor, and a mortgage offer in place.
You now need have a professional come round to inspect the property and make sure everything is up to scratch.
Your lender may offer a discount here if you use one of their partners, I recommend you take it, as surveys without a discount can be &amp;gt;£500.
Your solicitor will also request environmental surveys (the surrounding area), to make sure you aren&amp;rsquo;t about to buy a future swamp.
Technically your solicitor is acting on both your behalf, and on the behalf of the mortgage lender, it is in both of your interests that the house does not fall apart or get swallowed up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Negotiate with the sellers&lt;/strong&gt;
Right before completion, you will want to negotiate with the sellers for any furniture or fittings left behind, as well as try to claw back some money for any surprises the survey may have picked up.
If the house has a really cool but cumbersome cooker/pizza oven, or turns out you found the roof needs repairing, this is the point at which you want to perform a second round of negotiations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wait&amp;hellip;&lt;/strong&gt;
This step is frustratingly inevitable. Any time you need to communicate with lawyers, or the Council, you lose both the will to live and a good chunk of your time.
Expect the total purchase process to take ~2-6 months.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complete!&lt;/strong&gt;
Completion day is one of those strange days in your life you&amp;rsquo;ll remember for just being a bit odd.
It is the day when your solicitor gets given £100k&amp;rsquo;s from the bank, basically all of your savings, and you get the keys to your new place, all at once.
If you are in a chain, this day gets even more complicated, but let&amp;rsquo;s pretend life is easy for a second and ignore that.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="what-next" class="relative group"&gt;What next? &lt;/h2&gt;&lt;p&gt;Grab a paintbrush, a tapemeasure, and your worst clothes.
Chances are that if you found a place within your budget, as I did, you have a lot of refurbishment / renovation to do.&lt;/p&gt;
&lt;p&gt;Even if it doesn&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; renovation, I&amp;rsquo;d recommend leaving your mark at least.&lt;/p&gt;
&lt;p&gt;As of writing this post, I&amp;rsquo;m in this stage.
All I can say for now is, make sure you budget for it!&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;</content:encoded></item><item><title>25 Years Old</title><link>https://jamesjarvis.io/posts/2024/06/25-years-old/</link><pubDate>Sun, 23 Jun 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/06/25-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2023 to 23rd June 2024.&lt;/p&gt;
&lt;p&gt;The year I went to Asia.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2023 to 23rd June 2024.&lt;/p&gt;
&lt;p&gt;The year I went to Asia.&lt;/p&gt;
&lt;p&gt;I start off the year in “summer” mode, relaxed at work and enjoying time with my (now retired) parents, family and friends, I’m on back to back holidays for almost a month!&lt;/p&gt;
&lt;p&gt;I then set off on one of my most fun challenges to date: the “mini sabbatical”, I spend almost a third of the year living in Singapore where I am visited by Zak, Konrad and my parents (on their own cruise trip), meet some wonderful colleagues, catch back up with Tim, and watch formula one for the first time!
I also get to meet Feiyang’s family on a month long tour of China, then embark on a 3 week solo trip around south east Asia as I race to catch my flight back to London from Singapore.&lt;/p&gt;
&lt;p&gt;I come back to London for winter, and I seemingly forget how to socialise, I construe “drink less alcohol” with “hang out less”, I hope to change this. On the other hand, I’ve picked up running, reading and now writing as a hobby, all of which I’ve thoroughly enjoyed and made good progress with.&lt;/p&gt;
&lt;p&gt;I planned to make 2024 the year I bought my first property, but 4 months into the search and I have struggled. I believe the market is overvalued by about 30% but the market ignores my mumbles of frustration and continues to climb further out of reach.&lt;/p&gt;
&lt;p&gt;I became a “senior” software engineer at the company I continue to learn something new from every day. I recall the confusion I had when people told me to go out and celebrate this milestone, 20% of the way through my career. I rename this “senior slave”, as I have not yet figured out a way to diversify my income.&lt;/p&gt;
&lt;p&gt;I go to Ireland to dabble with saunas+sea swimming, I go to Seattle to “hike”, and before you know it I’m back in China enjoying hot pot with Feiyang’s parents.&lt;/p&gt;
&lt;p&gt;As I enter this next quarter of a century, I’m finding my own priorities, but leaving room for the occasional bit of adventure. I hope more fun challenges await!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/3zdOEcY4C6I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>🇰🇭/🇹🇭/🇸🇬 Mini-Sabbatical Part 5: Final Stretch from Cambodia to Singapore</title><link>https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/</link><pubDate>Mon, 10 Jun 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/</guid><category>Travel</category><category>The 'Mini Sabbatical'</category><description>My last 12 days in Asia</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="bus-across-the-cambodian-border" class="relative group"&gt;Bus across the Cambodian border &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/saigon_to_phnom_penh_coach_cambodia_border_hu_ce0253fa07763e00.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2251"
 height="2838"
 class="mx-auto my-0 rounded-md"
 alt="Cambodia Border Guards"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/saigon_to_phnom_penh_coach_cambodia_border_hu_c86a1d2f1bfc5bf2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The border of Vietnam and Cambodia is remarkably deserted&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Picking up &lt;a href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/"&gt;where we left off in Saigon&lt;/a&gt;, are you still with me?
I&amp;rsquo;m on a Giant Ibis bus bound for Phnom Penh in Cambodia, a gentle ~7 hour trip across the border and through basically nothing else of note.&lt;/p&gt;
&lt;p&gt;My seat-neighbour for this trip is a nice lady from Scotland who has chosen to structure her life around travel.
Gardening in the UK summer months and exploring for the rest of the year, she&amp;rsquo;s in her mid fifties and sounds like she has no intention of slowing down!&lt;/p&gt;
&lt;p&gt;What surprised me is just how much less developed Cambodia felt than Vietnam, with dirt roads being the norm, and the border itself being a strange mix of undeveloped wasteland, and golden casinos.
Once you start to near the capital, Phnom Penh, you can see where the money has gone.&lt;/p&gt;
&lt;p&gt;Out of absolutely nowhere springs palatial buildings, and seemingly unnecessary skyscrapers.&lt;/p&gt;
&lt;h2 id="phnom-penh" class="relative group"&gt;Phnom Penh &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/saigon_to_phnom_penh_coach_phnom_penh_outskirts_hu_6de7bbc52386b55c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Phnom Penh rising from the dirt"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/saigon_to_phnom_penh_coach_phnom_penh_outskirts_hu_25769836af62401a.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Phnom Penh rises out of the dirt almost instantly&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The city has an inauthentic feel to it, it really doesn&amp;rsquo;t fit in with the rest of the country.
The wealth divide is crystal clear as Rolls Royces mix in the traffic with Tuk Tuks.
The currency is apparently a locals joke, as I attempt to pay for my dinner with my hard found Riels, and the cashier sighs, pulls out a calculator and types &lt;code&gt;8 * 4015&lt;/code&gt; to give me a rough amount for Cambodian Riels.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_food_receipt_hu_8ede9061d24c2745.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Food Receipt"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_food_receipt_hu_23319a2bbfd27905.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Japanese food, in Cambodia, priced in Dollars&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Apparently Dollars are the &lt;a href="https://movetocambodia.com/about-cambodia/currency/" target="_blank" rel="noreferrer"&gt;currency of choice&lt;/a&gt; for many here.&lt;/p&gt;
&lt;p&gt;To get around, you&amp;rsquo;ll be using Grab again, but Grab Bikes are out, with Grab Tuk Tuks taking their place.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_rickshaw_hu_45818fbbf89147ac.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="View from a Tuk Tuk"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_rickshaw_hu_dc46193d6cc7da7d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;You&amp;rsquo;ll miss tuk tuks once you leave&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The night market looked like the place to be, but I was staying a bit further out in the &amp;ldquo;westerners section&amp;rdquo; and just wanted to relax at the hostel for a bit.&lt;/p&gt;
&lt;p&gt;On a walk around town in the evening, I overheard some American ex-pats catching up and talking about an impending stock market crash.
Hilariously, a few weeks prior while I was in China my coworkers texted me to say my company had just announced a large round of layoffs.
I texted back with &amp;ldquo;cant be bothered to check my email, can someone just text me if I’ve been fired k thx x&amp;rdquo;, no economic shocks are going to ruin these vibes.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_rolls_royce_hu_9a89c99d4f9b6243.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Rolls Royce in Phnom Penh"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_rolls_royce_hu_5940b9c781965703.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Wealth Gap is real in Cambodia&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The town is surrounded by armed guards and has a chronic lack of pedestrian walking signals.
Not knowing the jaywalking rules in this country, it takes me forever to get back to the hostel.&lt;/p&gt;
&lt;h3 id="tuol-sleng--s-21" class="relative group"&gt;Tuol Sleng / S-21 &lt;/h3&gt;&lt;p&gt;I&amp;rsquo;m only in Phnom Penh for 24 hours, so before my next bus at midday, I&amp;rsquo;m in a Tuk Tuk to visit &lt;a href="https://en.wikipedia.org/wiki/Tuol_Sleng_Genocide_Museum" target="_blank" rel="noreferrer"&gt;Security Prison 21&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This place is a solid contender for Most Shocking Museum I&amp;rsquo;ve Visited, right alongside the Vietnam War Remnants Museum.&lt;/p&gt;
&lt;p&gt;I had just about had time to research about the Khmer Rouge on the bus through Cambodia, and it shocked me.
If you don&amp;rsquo;t know, the Khmer Rouge (Communist Party of Kampuchea) came to power in the late 1970&amp;rsquo;s at the same time that communism was making it&amp;rsquo;s way through South East Asia.&lt;/p&gt;
&lt;p&gt;I still know little about this period of history, but aside from America&amp;rsquo;s intervention in Vietnam, communism made huge waves throughout Asia, with the only notable survivor from this being the &amp;ldquo;communist&amp;rdquo; PRC, who had a similarly devastating cultural revolution before deciding that a good old fashioned capitalist dictatorship works best for them.&lt;/p&gt;
&lt;p&gt;The Khmer Rouge however defied all logic and entered into a campaign of totalitarian repression, and ultimately, genocide.
To put it simply, the Khmer Rouge destroyed almost all of the country&amp;rsquo;s infrastructure (schools, roads, railways), and killed roughly &lt;em&gt;25% of the total Cambodian population&lt;/em&gt;, specifically minority groups and those with enough intelligence to pose a threat to politicians.&lt;/p&gt;
&lt;p&gt;All told, this set the country back from its peers by decades, with the country still struggling to rebuild to this day.&lt;/p&gt;
&lt;p&gt;Focusing on Tuol Sleng, the former school became a prison/centre for torture, from which only 0.03% of prisoners ever left alive.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_s21_bed_hu_4110a85cbfb6ac64.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="A bed from S-21"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_s21_bed_hu_7bd2b27a39e74659.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Humans can be pretty nasty sometimes&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Much of it has been left untouched, with beds placed in the same position as they were found, minus any human remains.&lt;/p&gt;
&lt;p&gt;Photos of inmates, stories of couples who had been split up and separately executed for no reason, this would shock anyone to the core.&lt;/p&gt;
&lt;p&gt;On the way out, there were some elderly people sitting behind a booth.
The signs said they had been former prisoners (or guards, I can&amp;rsquo;t recall), and that they were there to spread the story of their survival to future generations.
They may even be &lt;a href="https://www.bbc.co.uk/news/magazine-33096971" target="_blank" rel="noreferrer"&gt;Chum Mey or Bou Meng from this BBC article&lt;/a&gt;, but I couldn&amp;rsquo;t talk to them, I didn&amp;rsquo;t know what to say.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_s21_block_b_hu_3684a7be889b344f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Block B of S-21"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/phnom_penh_s21_block_b_hu_5c6bf486695c2283.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;To think this place of torture was once a school, is sad enough, but to think the barbed wire was there to prolong suffering&amp;hellip;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I left, slightly disturbed, but peaceful in the knowledge that at least information about this horrific regime is being spread.
History is most likely to repeat itself, when people do not know it happened before.&lt;/p&gt;
&lt;h2 id="siem-reap" class="relative group"&gt;Siem Reap &lt;/h2&gt;&lt;p&gt;Another bus, another city, I&amp;rsquo;m getting the hang of this.&lt;/p&gt;
&lt;p&gt;I arrive in Siem Reap, dump my bags at the hostel, book a couple activities for the next few days and go for a walk around town to understand what this place has to offer.&lt;/p&gt;
&lt;p&gt;Thanks to the lack of good transport in Cambodia, your only real option is to get Buses around, with the downside that by the time you reach anywhere, the chances are that it is now too dark to enjoy.&lt;/p&gt;
&lt;p&gt;But Siem Reap, a town where over 50% of the locals are employed in the tourism industry, has enough to offer the weary traveller.
Each South East Asian tourist town has the same staples: Markets, Pubs, Restaurants, with typically the same stuff.
However they also each reserve a slight speciality.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_pub_street_hu_a1b33923b1726ce9.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Siem Reap Pub Street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_pub_street_hu_dfcac1c287a65779.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Pub Street&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;For Siem Reap this appeared to be Fish Tanks to eat the dead skin off of your feet.
I did not partake.&lt;/p&gt;
&lt;h3 id="temples" class="relative group"&gt;Temples &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_gate_far_hu_cdf65b9495ebe59d.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Gate to Angkor"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_gate_far_hu_4a57286b95be9e30.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Southern gate to Angkor&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The next day, I had hired a &lt;a href="https://www.strava.com/activities/10221681167" target="_blank" rel="noreferrer"&gt;bike to explore&lt;/a&gt; the nearby remnants of Angkor, littered with temples and indications of a long extinct civilisation.&lt;/p&gt;
&lt;p&gt;Since by now you will be used to the prices of everything in Cambodia being &lt;em&gt;fairly cheap&lt;/em&gt; (I think a day&amp;rsquo;s bike rental was $10, and that was on the expensive side), you might get a shock to discover a 3 day pass just to enter the old city of Angkor is $62.
Still, it is easily one of the best things to visit in Cambodia, so suck it up and pay.&lt;/p&gt;
&lt;p&gt;Angkor is fantastically impressive, with the grand structures and reservoirs even visible from space (not that I could test it, but the map seemed to confirm).&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_temple_ruins_hu_2a84074e20ee8cff.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Temple Ruins"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_temple_ruins_hu_89ecc2c0f06ee7fc.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Feel like your inner Indiana Jones&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Once upon a time this place had been one of the largest cities in the world, with a population of up to a million people back when London was still a small town.&lt;/p&gt;
&lt;p&gt;Cycling through the complex, you could hardly tell.
Not only are the distances between each temple vast (the total journey was almost 40km), between them you would have no idea you are in such a prestigious location.&lt;/p&gt;
&lt;p&gt;Out of seemingly nowhere however, will rise up a series of awe inspiring stone facades.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_temple_tree_2_hu_c19d73cc18de2d9f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Tree growing out of Ta Phrom"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_temple_tree_2_hu_d7a3eed68ee1c097.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The famous &amp;lsquo;Tomb Raider&amp;rsquo; temple Ta Phrom&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The face towers of the Bayon, the serenity of Angkor Wat, and -of course- the &amp;ldquo;tomb raider&amp;rdquo; temple of Ta Phrom are all sights to behold.&lt;/p&gt;
&lt;p&gt;Or at least it was until the rain started, and continue to soak me and all of my belongings for the rest of the day.
My notebook never truly recovered, so that put an end to a bit of my journalling!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_monsoon_2_hu_f477533b15026df0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Caught in a monsoon"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_monsoon_2_hu_65c9eb297cb4c9f.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Got a bit damp, and some funny looks&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The next day I took part in a &lt;em&gt;very touristic&lt;/em&gt; sunrise tour of Angkor Wat.
I had avoided the majority of this particular temple the day before as I knew I would be visiting again, but in hindsight I didn&amp;rsquo;t miss much, with most of the tour being spent waiting for the sun to raise behind the temple.
It was very pretty, and I was particularly interested in the temple&amp;rsquo;s wall carvings, but for such a peaceful location, the number of tourists did start to detract from the experience.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_angkor_wat_tourists_hu_3f0a3d624baa7dfb.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Angkor Wat Tourists at sunrise"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_angkor_wat_tourists_hu_803c96eba3ec0b7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The tourists flock to see the sun rise above a pretty building&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;If you are going yourself, I would recommend going at midday or early afternoon to avoid this tourist trap.&lt;/p&gt;
&lt;h3 id="markets" class="relative group"&gt;Markets &lt;/h3&gt;&lt;p&gt;Making it back to the hostel, I realised I had not bought any gifts yet from my travels for the family.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_market_hu_f812464a923b319e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Siem Reap Markets"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/siem_reap_market_hu_460425b0dc440cc2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Each shop will have at least 2-3 copies, apparently nobody understood the concept of &amp;lsquo;perfect competition&amp;rsquo;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Luckily Siem Reap has a perfectly suitable &amp;ldquo;old market&amp;rdquo; in the middle of town, which is fairly average as far as south east asian markets go, but has everything you could expect.
A couple &amp;ldquo;hippie trousers&amp;rdquo;, lip balms and trinkets later, I decide that&amp;rsquo;s enough haggling for today so settle down.&lt;/p&gt;
&lt;h2 id="bangkok" class="relative group"&gt;Bangkok &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_tuk_tuk_hu_792db4aa92a2c910.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Bangkok Tuk Tuk"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_tuk_tuk_hu_dfd2d412e97a0900.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Local Tuk Tuks of Bangkok&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I cheated a bit here, and got my first flight of the trip since Hong Kong.
It just didn&amp;rsquo;t make much sense to spend so much time on another bus, when the flight was a fraction of the time, and only a little bit more expensive.
I also got to see one of Cambodia&amp;rsquo;s newest airports!
A vast terminal that had only opened a few weeks prior, I was almost alone in the place, with barely one or two corner shops to keep me busy while I sat around for my departure.&lt;/p&gt;
&lt;p&gt;Anyway, I made it to Bangkok and to the Jam Hostel (next to infamous &amp;ldquo;Mad Monkey&amp;rdquo;), and to be honest, I wasn&amp;rsquo;t looking forward to it.&lt;/p&gt;
&lt;p&gt;Unlike the rest of the trip, I had poor expectations of Bangkok, as being effectively just a Red Light district for 18 year olds on their first trip outside of the western world, where beer and drugs could be found, cheaply.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_khao_san_hu_1a303787f9f2591.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Khao San Street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_khao_san_hu_5ef65f1c8a26f06f.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The parallel Thanon Ram Buttri street is much nicer than Khao San (pictured)&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;To a certain extent, Khao San Road was &lt;em&gt;a bit&lt;/em&gt; like that, but I think the last few months being in Asia had reset my expectations a bit, to the point where I really wasn&amp;rsquo;t that shocked by anything.&lt;/p&gt;
&lt;p&gt;On the plus side, staying in one of the more popular hostels did mean that I got to tag along for some great day tours, and meet some fun people for a few days.&lt;/p&gt;
&lt;h3 id="floating-markets" class="relative group"&gt;Floating Markets &lt;/h3&gt;&lt;p&gt;The next morning, I gathered in the common area to a group of backpackers sitting around making smalltalk.
Joining in, I discover everyone is heading to a nearby &amp;ldquo;floating market&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Not having had enough of markets just yet (and not knowing that this was a thing to see in Bangkok, I sign myself up).&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_boats_hu_dc8cead73c667063.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Bangkok Boats"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_boats_hu_d46f1d5aa8d52233.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The boats of the floating markets&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The markets themselves are much the same as everywhere else (that is, great for food and small trinkets), but with the key distinction of river boats travelling around and through the maze of canals that make up urban Bangkok.&lt;/p&gt;
&lt;p&gt;The small cafes and roasted insects were fun to see and taste, but I was primarily focused on these boats.
They all consisted of roughly the same wooden hull, but whilst half were paddle powered, the other half were petrol powered.
It seemed as though the locals had ripped the engine out of an old toyota truck, cleaned it up a bit (they were spotless), and strapped it to the back.&lt;/p&gt;
&lt;p&gt;Some of them had bright purple air intakes and polished chrome exhaust manifolds, and wouldn&amp;rsquo;t have looked too far out of place from a Fast and Furious floating spinoff.&lt;/p&gt;
&lt;h3 id="muay-thai" class="relative group"&gt;Muay Thai &lt;/h3&gt;&lt;p&gt;&amp;ldquo;You see Muay Thai, you see Thailand&amp;rdquo; I remember a tannoy speaker blaring out while I sat on a beach in Phuket with my friend a few months ago.
My friend was a huge fan of martial arts, whereas I had more or less lost interest after giving up on karate lessons after my 12th birthday.&lt;/p&gt;
&lt;p&gt;This night in Bangkok promised another adventure, as the entire hostel was invited to a &lt;em&gt;free&lt;/em&gt; Muay Thai event.
I had assumed we would be going to the &amp;ldquo;Muay Thai Street&amp;rdquo; signposted a few hundred metres from the hostel, but after an hour on a bus it seemed this wouldn&amp;rsquo;t be the case.&lt;/p&gt;
&lt;p&gt;Still, on arrival we found this to be a bit more than a barn yard brawl as some had expected.
We were in a fully fledged arena, complete with presenters and live TV streaming!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_muay_thai_hu_8d649ec065ace2da.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Muay Thai"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_muay_thai_hu_9e69e31fb4098abc.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;You see Muay Thai, you see Thailand!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The fights were fairly tame most of the night, with the odd &amp;ldquo;oohhh shiii&amp;rdquo; thrown in as one of the opponents roundhouse kicks the other&amp;rsquo;s jaw.
Still not quite to my liking, and I fear for the participants long term health, but it was a hell of a better adrenaline rush than any tennis match!&lt;/p&gt;
&lt;h3 id="more-temples" class="relative group"&gt;More temples &lt;/h3&gt;&lt;p&gt;The next day, I broke away from the pack of backpackers to &lt;del&gt;see how far I could walk in a single day&lt;/del&gt; explore the rest of Bangkok.&lt;/p&gt;
&lt;p&gt;Of course, it had to be The Grand Palace and The Golden Mount.&lt;/p&gt;
&lt;p&gt;The Grand Palace was quite interesting.
Coming from my own monarchist country, I was surprised to see that the royal family of Thailand seems to actually have a presence.
You&amp;rsquo;ll see large photos of the king of Thailand on public roads and buildings, but no clear sign of what he contributes to the country.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_king_hu_6934a2015b845767.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="King of Thailand"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_king_hu_c29d6e5f49cf170e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The King of Thailand sure likes to make himself known&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Whilst it was a nice place to visit, unfortunately if the Grand Palace is all the Thai Monarchy has to show for itself, I&amp;rsquo;d probably vote them out.
Oh, wait&amp;hellip;&lt;/p&gt;
&lt;p&gt;Anyway, cris-crossing my way over to the Golden Mount I pass by another monument: The Reclining Buddha.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_reclining_buddha_hu_c5bc0ac1606d1af5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="The Reclining Buddha"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_reclining_buddha_hu_f62f3bdc11a424d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;sup? nm, you?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;If I&amp;rsquo;m being honest, this one was a bit of a mistake - I had meant to go see the &amp;ldquo;Golden Buddha&amp;rdquo;, a $370 million solid 18k gold statue of the famous figure.
I ended up seeing a very large &amp;ldquo;golden&amp;rdquo; buddha, but this one was about the size of a building and laying down on his side.
Still, it was fun to see!&lt;/p&gt;
&lt;p&gt;I had timed my visit to the Golden Mount with the sunset.
A great idea, I had thought, if only everyone else hadn&amp;rsquo;t had the same idea.
A queue to the top awaited me, but the wait was worth it, with a particularly golden mount thanks to the dusk.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_golden_mount_hu_3559e38ae378cbf6.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Golden Mount"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_golden_mount_hu_386173204a7dd7eb.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Golden Mount&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;On your way up and down are a series of bells to ring, I&amp;rsquo;m still not sure what they are for, but I assume a healthy blend of religious practice and tourist entertainment, and I&amp;rsquo;m all for it.&lt;/p&gt;
&lt;h3 id="paying-it-forward" class="relative group"&gt;Paying it Forward &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_night_hu_f6d17c46d2bf063b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Bangkok Traffice"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/bangkok_night_hu_3d959e7fef80b2bb.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;This is the view I remember most from my walks&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;At the base of the Golden Mount, I was looking for somewhere to eat for my last night in Bangkok.
&amp;ldquo;Thipsamai&amp;rdquo; had been recommended to me as &amp;ldquo;the best Thai food I have ever had&amp;rdquo; from another backpacker.
Alas, the queue stretched around the block, so I quickly gave up and shuffled into a quieter restaurant down a side alley.&lt;/p&gt;
&lt;p&gt;Luckily this place had a great balcony with views of the golden mount, and I was alone!
After a bit of time journalling, a British couple turned up to also admire the view, I ordered a beer and a Pad Kra Pao.&lt;/p&gt;
&lt;p&gt;They ordered a couple of glasses of wine, and said they had followed me in to this deserted restaurant and upstairs because I looked like I &amp;ldquo;knew what I was doing&amp;rdquo;, I wish!&lt;/p&gt;
&lt;p&gt;Turns out they were out on their first long trip together after semi-retiring that year.
They had each independently travelled to Thailand backpacking 30 years prior, and wanted the rush of an adventure again, we &amp;ldquo;cheers&amp;rdquo;&amp;rsquo;d to that.&lt;/p&gt;
&lt;p&gt;I shared some stories from my past few months of travels, some of which I recorded in this blog.
I just remember thinking how nice it is to connect to quickly with strangers, feeling so similar, despite our differences.
You just don&amp;rsquo;t get that kind of interaction back home!&lt;/p&gt;
&lt;p&gt;They left a bit before me as I had food to finish, when I went to pay the server said I owed nothing.
&amp;ldquo;The couple paid for you&amp;rdquo;.
I never got a chance to say thanks, so consider this my pledge to pay it forward!&lt;/p&gt;
&lt;h2 id="koh-samui" class="relative group"&gt;Koh Samui &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/koh_samui_kayak_hu_85145c36b80c4b7f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Kayaking"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/koh_samui_kayak_hu_d9a67ce0c740cdeb.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I got one good day of weather, and made the most of it!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;My final stopover before heading back home, is a 5 day stint on the island of Koh Samui, where I had hoped to relax, get sunburnt and maybe try out some scuba diving.&lt;/p&gt;
&lt;p&gt;Well, maybe not!
I forgot to check the weather beforehand, but suffice to say that November is &lt;em&gt;peak&lt;/em&gt; monsoon season in Koh Samui, and no ferries were operating for scuba diving trips.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/koh_samui_sunset_hu_fea35a70a0dee81.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Sunset"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/koh_samui_sunset_hu_6996d17cb498a98c.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I spent a lot of time in a local restaurant 200m from the hostel&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Still, I took the time to decompress, go for some short hikes, read my books and be a bit of a hermit for the last few days of my trip.
I even managed to get a little bit of sunburn!&lt;/p&gt;
&lt;h2 id="singapore-farewell" class="relative group"&gt;Singapore; Farewell &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/singapore_arab_street_hu_1995ca8c56434aee.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Arab Street Singapore"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/singapore_arab_street_hu_7e2d242646c85ba8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Arab Street is a great location to stay in Singapore&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;My last 24 hours in Singapore.
I couldn&amp;rsquo;t believe how time had flown!
If you have been reading these blogs, I&amp;rsquo;m sure you could! (I could have made these shorter, I&amp;rsquo;m sorry).&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t think there is any one thing in particular that I have learnt from this, but I&amp;rsquo;m grateful for having had these experiences.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m grateful that I got to meet my girlfriend&amp;rsquo;s family, that I got to meet some amazing people backpacking, and that I got to relive an experience from my favourite TV show.
I&amp;rsquo;m grateful that I continue to get to experience a more vivid life than I could previously afford, and that it feels like an option that remains open to me in the future, should I want it.&lt;/p&gt;
&lt;p&gt;For now though, I must head back to London.
I met up with some coworkers, including ones who acted as my replacement in the company&amp;rsquo;s rotation scheme (they say they have had a predictably chaotic time).
For a moment I forgot that I am still employed, and have to go back to work in only 2 days time.
The thought unnerves me slightly, but I&amp;rsquo;m happy to return with a renewed clarity.&lt;/p&gt;
&lt;p&gt;For my last 5 hours, I visited 5 different Muji shops chasing a particular shirt to buy my Dad (and a final Acai bowl for me!), then I head for Changi International Airport.&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ll be back; there is more to see!&lt;/p&gt;
&lt;p&gt;As I publish this, I&amp;rsquo;m washing my clothes in preparation for another flight to China in a few days time.
So, Asia hasn&amp;rsquo;t seen the last of me yet!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/singapore_last_selfie_before_englang_hu_96345fdf0a3fdd08.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Peace Out"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-5-cambodia-to-singapore/singapore_last_selfie_before_englang_hu_a8ce3411adb9a120.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;See you again soon&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>🇻🇳 Mini-Sabbatical Part 4: Vietnam, from the North to the South</title><link>https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/</link><pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/</guid><category>Travel</category><category>The 'Mini Sabbatical'</category><description>Vietnam by Train</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;!-- SCRATCH PAD
Audience: Travel blog with personal details? Or just a factual trip?
I think travel blog with personal takes, but with factual information. Cut out irrelevant information.

- In the morning, day trip around ha long bay, back to hanoi old quarter arriving at midnight again
- Hostelworld app great way to find out what to do, booked onto walking tour in the morning where I met some cool travellers. Explored the city, something else? Then off to pub street in the evening. Banh Mi 47?
- Day after checking out something else(?) then relax around the lake with aunties dancing, got on bike taxi where I got scammed by the Mafia. Met Harry
- Overnight train to Da Nang, had a monk in my carriage, spent almost all of the time reading and journalling.
- Arrived in Da Nang, strangely empty place so got in a Grab taxi to Hoi An, met the wonderful hostel host (who was angry at me for not telling her I wanted to join the food tour with a friend in Tow) Harry wondered why every time he saw me someone was shouting at me. Had some food at the food tour then went to tailors to get a suit fitted!
- Day in Hoi An, hopping around on our bikes to Cafe, Tailor, Shop, Tailor, Bar, Tailor. Great time. In the evening we went out with the other people we had met from the hostel. Harry regretted booking his hotel in the morning.
- Leaving Hoi An, sent my suit off for shipping back to london. We had a 2pm train to catch from Da Nang so we went straight there I think?
- Another overnight train to Saigon/Ho Chi Minh, where I met a nice Scottish couple enjoying their retirement together. I want to be these people when I'm older (reminded me of Tony and Elain from Race Across the World)
- Day in Saigon, we explored the Cu Chi Tunnels (with a guy that would not stop singing) and War Museum (made me cry).
- Day after, I had a morning bus to take, so said fairwell to Harry. My bus took me to Phnom Penh. I was sat next to a nice lady from Scotland who has chosen to structure her life around travel. Gardening in the UK Summer months, and exploring the rest of the year. She was in her 50s. Arriving in Phnom Penh I took a tuk tuk around town, checking into my hotel, then getting some Udon nearby. Currency is officially cambodian, but prices of everything are in dollars and the owners get out an old calculator to convert. I overhear some westerners talking about an impeding stock market crash?

--&gt;
&lt;h2 id="precursor-top-gear" class="relative group"&gt;Precursor: Top Gear &lt;/h2&gt;&lt;p&gt;When I was a wee kid in 2009, the UK series of Top Gear aired an episode that would come to sear itself into my memory.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;The Vietnam Special&amp;rdquo; followed the famous three motoring journalist as they travelled from Saigon to Ha Long Bay on 3 motorbikes over the course of 8 eventful days.
If you haven&amp;rsquo;t watched it, I can&amp;rsquo;t recommend it enough.
Unfortunately, I can&amp;rsquo;t ride a motorbike, but since Top Gear cheated a bit and took the night train, I thought I would follow in their footsteps on my own interpretation of this challenge.&lt;/p&gt;
&lt;p&gt;From Ha Long Bay to Saigon in 8 days, skirting the coastline of Vietnam as I make my way down.&lt;/p&gt;
&lt;h2 id="ha-long-bay" class="relative group"&gt;Ha Long Bay &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/notebook_hu_bca6c855e8bc9869.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Notebook"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/notebook_hu_c36807aec211143c.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;My journal got ruined by a monsoon in Cambodia, more on that later&amp;hellip;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m on flight number VN-593 from &lt;a href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/"&gt;Hong Kong&lt;/a&gt; to Hanoi, arriving at ~4pm.&lt;/p&gt;
&lt;p&gt;These kinds of travel days are generally fairly mundane: Train, Plane, Taxi, Hotel, Sleep.
On the face of it I&amp;rsquo;m in store for much the same routine, except my final destination for the night is over 150km from the hostel.&lt;/p&gt;
&lt;p&gt;Luckily I booked this hostel a couple weeks back on &lt;a href="https://www.hostelworld.com" target="_blank" rel="noreferrer"&gt;Hostelworld&lt;/a&gt;, and had arranged with the hostel owner to take a &amp;ldquo;limousine&amp;rdquo; they recommended that was both way cheaper than a taxi, and faster than a bus/train combo.&lt;/p&gt;
&lt;p&gt;Well, this &amp;ldquo;limousine&amp;rdquo; turns out to be just some dude in an old toyota - can&amp;rsquo;t complain!
The driver can&amp;rsquo;t speak any English, so we communicate via some screen-sharing and laughing, but he isn&amp;rsquo;t following the route on my phone and I&amp;rsquo;m getting a bit confused&amp;hellip;
We stop off and pick up some boxes.
Then stop off again and pick up another box.
Another stop off, we pick up a dog(?)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m getting a bit confused here - am I just cargo?
One more stop later and I get my answer, as the man picks up his own daughter and she explains the whole situation to me in good English - a common method of transport in Vietnam are these online groups where you can barter for moving goods or people around.
Their family lives in Ha Long but works in Hanoi so this is quite a frequent trip for them, picking up a dog or confused tourist along the way just helps pay for their trip!&lt;/p&gt;
&lt;p&gt;A meandering 4 hour trip later (with dinner break), I arrive at the &lt;a href="https://alex.halonghotels.net/en/" target="_blank" rel="noreferrer"&gt;Alex Hostel&lt;/a&gt;, grab a Banh Mi from a nearby stall, and conk out on the bed.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m only in Ha Long for a day so I thought it would be good to explore the area in the morning.
Not quite sure what I was expecting, but it was clear that a lot of investment had been put into the city, with little to no return.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_random_french_quarter_hu_45b8ac9e1f4c78fd.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="European streets in Ha Long"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_random_french_quarter_hu_30012d08d8d1edfe.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;An apocalyptic Austria, or Vietnam?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I was staying in the Bai Chay region of Ha Long, which is the more modern, touristic section of the city cleaved in two by the Bai Chay bridge.
Much of the area in Bai Chay is reclaimed land, upon which has been built a &lt;a href="https://www.nomadicnotes.com/notes-on-ha-long/" target="_blank" rel="noreferrer"&gt;whole section of European-esque buildings&lt;/a&gt;, complete with statues of prominent European figures.&lt;/p&gt;
&lt;p&gt;&amp;hellip;That are almost entirely empty&amp;hellip;&lt;/p&gt;
&lt;p&gt;I sat in a cafe with an iced egg coffee (amazing btw), alone aside from a security guard who was there to protect&amp;hellip; nothing.&lt;/p&gt;
&lt;p&gt;Strange place, but I can only imagine that the combination of coronavirus and my arrival during the off season were to blame.&lt;/p&gt;
&lt;p&gt;Still, I&amp;rsquo;m here for one reason: To see Ha Long Bay by boat.
At the ferry terminal I&amp;rsquo;m sat next to a group of uncles who tell me they are on holiday from China, I share some stories via google translate from my recent travels, we grab a selfie and then share an even more awkward seat together on the ferry around the islands.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_chinese_uncle_hu_a7a4957f9f33a288.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Chinese Uncle"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_chinese_uncle_hu_469712642435dff8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;He wanted a photo, so I got one too&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This tour around Ha Long Bay is much the same as one you can take around the Krabi islands of Thailand, with similar Flora, Fauna, caves and beaches.
The only difference is that Ha Long Bay is much larger, covering over a thousand islets.&lt;/p&gt;
&lt;p&gt;In Top Gear, the trio ended their race at a floating fishing village.&lt;/p&gt;
&lt;p&gt;15 years later, I came to the realisation that a tourist&amp;rsquo;s day tour of the bay would not be enough time to reach deep enough into the islands to see floating villages.
I&amp;rsquo;ve been told that &lt;em&gt;the thing to do&lt;/em&gt; in Ha Long Bay is to go on a multi-day cruise around the islets, but I&amp;rsquo;ve been warned that these types of cruises are almost exclusively old couples, and I didn&amp;rsquo;t fancy spending 1/3rd of my time in Vietnam feeling oppressively single.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_boat_hu_d236d5b1a51a8595.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Tour boat, Ha Long Bay"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/ha_long_boat_hu_6ef0be7b340eeac2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Your typical tour boat&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Still, I did have enough time on the boat to see some amazing sights, walk around a cave, climb to the top of an island, kayak around a lagoon and relax for a bit on the beach.&lt;/p&gt;
&lt;p&gt;No time to relax too much though, as I&amp;rsquo;m back in a &amp;ldquo;limo&amp;rdquo; bound for Hanoi as the sun dips below the horizon.&lt;/p&gt;
&lt;h2 id="hanoi" class="relative group"&gt;Hanoi &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_bridge_bikes_2_hu_aea36e6294f0ddf3.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Hanoi Bridge"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_bridge_bikes_2_hu_41b002c398660511.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m staying in the Old Quarter, the cultural heart of Hanoi, also where you will find a hefty number of me-clones.
From this point onwards I feel on a well trodden path of 20-somethings finding themselves through a few weeks holiday through South East Asia.&lt;/p&gt;
&lt;p&gt;In the morning my hostel arranged a walking tour of Hanoi and I get to know a bunch of my fellow hostellers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A married couple from England who sold everything to travel non-stop for the last year (one trained to be a travel agent to take advantage of the internal discounts, smart)&lt;/li&gt;
&lt;li&gt;A New Zealander travelling after her last breakup&lt;/li&gt;
&lt;li&gt;A Japanese guy on his first trip alone&lt;/li&gt;
&lt;li&gt;A Californian girl wearing a concerning amount of Patagonia/Arcteryx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had a great time sharing stories with them as we wandered across train tracks and through the bustling Dong Xuan market, sharing tips of where the best fake North Face stall might be.&lt;/p&gt;
&lt;p&gt;Most of the travellers were in Vietnam for longer, and had just come down from the mountains after completing the Ha Giang Loop - a ~4 day motorbike trip in the breathtaking Vietnamese mountains bordering southern China.
After hearing their stories I wished I had performed a bit more research other than watching a single 15 year old episode of british tv, but I&amp;rsquo;ll save Ha Giang for next time I visit!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_banhmi25_hu_4248f6e84b086813.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Banh Mi 25"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_banhmi25_hu_7f31785d2df20bea.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The most popular Banh Mi shop in Hanoi, Banh Mi 25&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Walking away from the market empty handed, we all bonded over our extra touristic &lt;a href="https://banhmi25.net" target="_blank" rel="noreferrer"&gt;Banh Mi 25&lt;/a&gt; sandwich.
Whilst I can&amp;rsquo;t say for sure that it&amp;rsquo;s the &lt;em&gt;best&lt;/em&gt; Banh Mi in Hanoi, it&amp;rsquo;s above the bar for me.
I&amp;rsquo;m just grateful to finally be back in a country that has good bread!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/H%e1%bb%8fa_L%c3%b2_Prison" target="_blank" rel="noreferrer"&gt;Hoa Lo/Hanoi Hilton&lt;/a&gt; offered a strangely depressing interlude to our day.
I hadn&amp;rsquo;t learnt about the Vietnamese war before this trip, so I frantically googled for information to counter the details presented in this museum (some museums can be &lt;a href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/#museums"&gt;very one-sided&lt;/a&gt;, but I still don&amp;rsquo;t know about this one. For more sad museums skip to &amp;ldquo;Ho Chi Minh&amp;rdquo;).
The guillotine and cramped cells were mostly in reference to conditions during the first Indochina war, with the American-Vietnam war mostly being consigned to a section berating the Americans (quite rightly) and detailing how much fun the American prisoners had during their stay at the Hilton (suspicious).&lt;/p&gt;
&lt;h3 id="train-street" class="relative group"&gt;Train Street &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_beer_hu_7d87655f75dac4c4.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Hanoi beer in Train Street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_beer_hu_e3ff64684215eeb9.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;It doesn&amp;rsquo;t &lt;em&gt;taste&lt;/em&gt; better, but it&amp;rsquo;s cheaper, so it&amp;rsquo;s better&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Despite warnings from our morning tour guide saying that &lt;strong&gt;&amp;ldquo;Train Street is closed to the public&amp;rdquo;&lt;/strong&gt;, we later learned that this was a bit of an untruth.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Train Street&amp;rdquo; has become synonymous with Vietnam in general, and therefore attracts a ridiculous number of tourists, all hoping to grab their shot of a train passing by.
Clearly it would be both dangerous and a downright nuisance to the already struggling vietnamese rail system if the train had to plow through white people every few hours.&lt;/p&gt;
&lt;p&gt;So, the officials have &amp;ldquo;closed&amp;rdquo; the street.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Officially&lt;/em&gt;, this means that tour guides and public notices spread the word that the street is closed, the entrance is blocked with gates and &amp;ldquo;nothing for you mr tourist&amp;rdquo; signs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Unofficially&lt;/em&gt;, you just need a whatsapp contact, or to wait outside these gates like a vampire until someone invites you in.
Inside, you&amp;rsquo;ll find that train street is well and truly open for business, though I believe each of the bars are part of a &lt;strong&gt;train street cartel&lt;/strong&gt;.
As we sat there with our noodles and beer, a lady wearing purple came over to take payment.
She carried a wad of cash and didn&amp;rsquo;t take no for an answer, routing from tourist to tourist like a mosquito in a hostel.
Not just the bar we sat at, but every bar in the street, she was the cashier and the boss.&lt;/p&gt;
&lt;p&gt;The officials will come over and check that the street is &amp;ldquo;closed&amp;rdquo; every couple of hours.
You&amp;rsquo;ll know when they come because a whistle will blow, and you have 5 minutes to pick up your beer and head inside as the staff close up shop behind you, turn off the lights, and pay the policeman while he takes a photo of the now dark, empty street.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t worry, give it another 5 minutes and the next whistle blow will turn the lights back on, open the shutters and bring the tourists back out in a stampede.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_officer_hu_25ea76cd8afaae37.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Officer of Train Street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_officer_hu_efeb8654d72ec55b.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;You can see the officer, just before he took some photos&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_train_approaching_blurry_hu_f76481ed6f59b3c9.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="As the train passes"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_train_street_train_approaching_blurry_hu_72573437f59e8daf.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Not a phone in sight, just living in the moment&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I have to say, &amp;ldquo;Train Street&amp;rdquo; is a place you simply can&amp;rsquo;t miss on your trip to Hanoi.&lt;/p&gt;
&lt;p&gt;Pub street however, is absolutely just a street with a bunch of pubs, so unless you are there just for the cheap beer and dodgy clubs I&amp;rsquo;d give that a miss.&lt;/p&gt;
&lt;h3 id="communist-architecture" class="relative group"&gt;Communist Architecture &lt;/h3&gt;&lt;p&gt;My last day in Hanoi I took it a bit slower, grabbing a &amp;ldquo;Grab&amp;rdquo; to the other side of town, where I hoped to walk back from.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_grab_bike_driver_hu_c478f6982c608b2f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Grab Bike"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_grab_bike_driver_hu_ed3fc7e38d0356f9.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Grab Bikes are the unsung heroes of south east asia&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As an aside, &lt;a href="https://www.grab.com/sg/" target="_blank" rel="noreferrer"&gt;Grab&lt;/a&gt; is another &amp;ldquo;must-have&amp;rdquo; app for south east asia.
Highly recommend setting it up before you head off.&lt;/p&gt;
&lt;p&gt;My destination from the Grab was B-52 lake, so named after the American B52 bomber that fell into the lake during the American-Vietnamese war, where it stayed as neither side could be bothered to move it.
It serves as one of the last untouched reminders of the war, but as it abstracts any of the actual atrocities, you can find a few very quiet cafes overlooking the lake.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_b52_lake_hu_f3449eec4ecc548f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="B52 Lake"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_b52_lake_hu_539843da02082cbd.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The B52 bomber that was never removed&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;From there I strolled through the botanical gardens and on to the Ho Chi Minh palace and mausoleum.
This section of Hanoi has the most &amp;ldquo;communist&amp;rdquo; feel to it, with a large central square flanked by palaces, museums and even a garden where Ho Chi Minhs original &lt;a href="https://vinpearl.com/en/ho-chi-minhs-stilt-house-hanoi-a-unique-simple-house-with-great-values" target="_blank" rel="noreferrer"&gt;stilt house&lt;/a&gt; stands, defiant from time.
I took a route back to the old quarter along leafy streets flanked by large diplomatic residences in differing styles, and a lot of security guards.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_hochiminh_mausoleum_2_hu_5448ac1bf7f4cf05.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Ho Chi Minh Mausoleum"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_hochiminh_mausoleum_2_hu_2cbdbc2063576d0.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Supposedly, Ho Chi Minh is still inside&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="cycling-mafia" class="relative group"&gt;Cycling Mafia &lt;/h3&gt;&lt;p&gt;I had a train to catch at 7 from Ga Hanoi, but had already been walking all day so looked at getting a grab for the ~2km journey.
It was ~30k dong for a car, but the traffic meant the car wouldn&amp;rsquo;t arrive for another few minutes, so I flagged down a cycle rickshaw.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_cycling_mafia_2_hu_6cc42ddb0aeb1697.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Cycling Mafia"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hanoi_cycling_mafia_2_hu_55829a2d4008d7a6.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Top tip: agree on a price before you get on one of these&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I had taken one of these in India a few years back and know they would cost less than a car, but I also assumed there would be some kind of tourist rate.
The guy seemed nice enough however, and we had a pleasant chat for the ~15 minute cycle to the station.
Since he was nice, I thought I&amp;rsquo;d be nice and give him a tip, so I gave him 50k dong, more than hiring an &lt;em&gt;entire car&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Bad move, he &lt;strong&gt;demanded&lt;/strong&gt; 400k&amp;hellip;
Obviously I wasn&amp;rsquo;t going to pay that, and just regretted not agreeing on the price beforehand.
This guy then immediately started recruiting a local taxi driver and some other locals, clearly lying to them saying he had cycled me all day long.
They seemed to not care too much, so I asked a lady at the train station how much she would pay for a 15 minute cycle taxi.
Her reply? 1.5k dong&amp;hellip;&lt;/p&gt;
&lt;p&gt;This guy kept yelling at me for a good 15 minutes more, yelling &amp;ldquo;mafia, mafia&amp;rdquo;.
I shouted back &amp;ldquo;I&amp;rsquo;m not a mafia!&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Eventually the angry little man settled on 100k, and I went back to sitting outside the station.
A couple minutes after he left, a local shop owner came up to me.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I&amp;rsquo;m sorry for that, &lt;em&gt;they are a mafia&lt;/em&gt; around here&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Ah, that explains it&amp;hellip;&lt;/p&gt;
&lt;p&gt;Still, I wasn&amp;rsquo;t alone.
Also waiting at the station for a train to Da Nang was another Software Engineer from the UK, Harry.&lt;/p&gt;
&lt;p&gt;Bit of a strange way to meet, but it gave us a good conversation starter and we got along pretty well thanks to basically being the same person.
He was on a train to Da Nang an hour before mine (I accidentally arrived early, should&amp;rsquo;ve walked!), but we promised to meet up in Hoi An the next day.&lt;/p&gt;
&lt;h2 id="train-from-hanoi-to-hoi-an" class="relative group"&gt;Train from Hanoi to Hoi An &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/vietnam_train_hanoi_to_hoian_bike_hu_e78eb6fd54a87c4f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Train through Hanoi"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/vietnam_train_hanoi_to_hoian_bike_hu_ae59481ec3aa6c6e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Waving at the locals as we leave Hanoi&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;If you are going to book a train around Vietnam, and you don&amp;rsquo;t already speak the language, you really only have 1 option: &lt;a href="https://www.baolau.com/en/" target="_blank" rel="noreferrer"&gt;baolau.com&lt;/a&gt;.
However, you do have a few options to choose from whilst on the train itself: sitting upright, sleeping in a 6 berth and sleeping in a 4 berth.
I&amp;rsquo;m happy to travel on a budget, but given the 17 hour travel time, I protected my sanity and dropped a cool 735k dong on a 4 berth bed.&lt;/p&gt;
&lt;p&gt;The train I was on had been refurbished a few years prior, so was really nice, and came with clean sheets due to Hanoi being the first stop (if you are joining in Da Nang it will already have been slept in, as I found out later).
The main telltale sign that the rail network has seen better days was when travelling through the city, I could not believe a train was able to rock so much without coming off the tracks!&lt;/p&gt;
&lt;p&gt;I was hoping it would stop, or at least rock me back to sleep, but banging my head made sure to stop that, at least until we left the city.&lt;/p&gt;
&lt;p&gt;I did eventually fall asleep however, and woke up for the nicest bit of the journey: The Hai Van Pass.
I wasn&amp;rsquo;t aware at the time, but this stretch of the journey is classed as one of the prettiest train journeys of all time, and I could see why!&lt;/p&gt;
&lt;p&gt;You dangle over the cliff, along the hills, and around the beaches, you even pass by the same viewpoint as seen in Top Gear, which caused me to squint in disbelief.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/O1zfuBgCUqY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;You get plenty of time to admire it, as this section of the journey is painfully slow, averaging jogging pace around the hills as the train rocks back and forth, threatening to send you and it down the cliffs.&lt;/p&gt;
&lt;p&gt;Some people stay in Da Nang attempting to catch some waves surfing (as Harry was hoping to), but I had my eyes set on one thing, so jumped in another grab for the short journey to Hoi An.&lt;/p&gt;
&lt;h2 id="hoi-an" class="relative group"&gt;Hoi An &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_lanterns_2_hu_87a47e2516f23dea.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Hoi An"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_lanterns_2_hu_4ce8cb892160b845.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The trademark lanterns of Hoi An, as seen from a rooftop cafe&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I had chatted with the hostel host beforehand to sign myself up for a food tour shortly after arrival, but I had forgotten to mention that my friend (Harry) from outside the hostel also wanted to come.
She was joking admonishing me as she was afraid there wouldn&amp;rsquo;t be enough push bikes for everyone.&lt;/p&gt;
&lt;p&gt;Everything was fine in the end, but Harry was wondering why every time he saw me, someone was shouting at me!&lt;/p&gt;
&lt;p&gt;The food tour consisted of a series of pit stops at road side stalls, where we would balance on tiny plastic chairs.
I can&amp;rsquo;t recall the names of the food, but we had plenty of noodles, skewers and a bready snack filled with chocolate, all were quite nice!&lt;/p&gt;
&lt;h3 id="suit-up" class="relative group"&gt;Suit Up &lt;/h3&gt;&lt;p&gt;I said I had my eyes set on one thing, and that thing was a suit.
Specifically, I wanted a &lt;strong&gt;pink linen suit&lt;/strong&gt; that I could wear to my sister&amp;rsquo;s wedding in 2024.&lt;/p&gt;
&lt;p&gt;Harry was down to have a look at suits as well, so we set out, first to have a look at the same tailors as Top Gear, and then to visit the tailors recommended by our hostel host.&lt;/p&gt;
&lt;p&gt;We only had 35 hours remaining in Hoi An, so tonight we had a fantastic time choosing the styles, colours and materials for our suits, along with some initial measurements.
We were like kids in a candy shop, except now quarter aged men in a suit shop.
Linen, Cashmere, Wool, Silk, in any colour and any combination it&amp;rsquo;s no wonder that half the town is suit shops catering to tourists.
An australian brother and sister we met at the hostel also partook, having a velvet smoking jacket and &amp;ldquo;designer&amp;rdquo; dress made.&lt;/p&gt;
&lt;p&gt;As for the price, it was pretty good but no doubt you could haggle a better price than me!&lt;/p&gt;
&lt;p&gt;For 2 linen shirts and 2 three-piece linen suits my total came to 15.5 &lt;em&gt;million&lt;/em&gt; Vietnamese Dong (~£500).
I thought this was a great deal and I didn&amp;rsquo;t want to spoil the moment with haggling, but talking to a friend from singapore, they managed to get a more classic 2 piece cashmere-wool suit for only ~£100 after knocking half off the price.
Your results may vary!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_suit_fitting_hu_9987631496c16578.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Suiting up"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_suit_fitting_hu_4c6b7db2cb93629a.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Suit measurements, featuring my beige linen and Harry in the background&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The next day we had a series of re-fittings for our suits to go to, so it was mostly a blur of riding our bikes between cafe, tailors, shop, tailors, bar, tailors, bar.
Fantastic day!&lt;/p&gt;
&lt;p&gt;In the evening we picked up our suits, and went out to a &amp;ldquo;tiger tiger&amp;rdquo; bar with people from the hostel.
Harry regretted staying in Da Nang, as he had to cling onto the back of a scooter for 45 mins with his suit, whilst not entirely sober.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_party_hu_59722e87cf8fbd.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1406"
 height="2048"
 class="mx-auto my-0 rounded-md"
 alt="Party in Hoi An"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/hoi_an_party_hu_1d3d25368d7838ac.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Travelling is about meeting people after all&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="train-from-hoi-an-to-saigon" class="relative group"&gt;Train from Hoi An to Saigon &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/vietnam_train_hoian_to_saigon_hu_c63f92ed79a5429f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Train from Hoi An to Saigon"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/vietnam_train_hoian_to_saigon_hu_797d0e39b2234482.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The views from the train. Somewhere between Hoi An and Saigon&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m told the north calls Saigon &amp;ldquo;Ho Chi Minh City&amp;rdquo;, while the south calls Ho Chi Minh City &amp;ldquo;Saigon&amp;rdquo;.
I still can&amp;rsquo;t tell which one is right.&lt;/p&gt;
&lt;p&gt;Anyway, I was back on the Vietnamese railway network for an 18.5 hour trip down the coast again.
This time, as I&amp;rsquo;m getting on halfway through the train&amp;rsquo;s route from Hanoi -&amp;gt; Ho Chi Minh City, the cabin/bed was a bit less clean, so something to be aware of if you make the journey yourself.&lt;/p&gt;
&lt;p&gt;In my cabin this time was a Scottish couple in their 60&amp;rsquo;s, continuing their adventurous retirement.
I chatted with them for a while, and they shared their plans to travel across Cambodia.
I hadn&amp;rsquo;t booked the next leg of my trip yet, so I took their advice and reserved some coaches using &lt;a href="https://12go.asia/en" target="_blank" rel="noreferrer"&gt;12go.asia&lt;/a&gt;, apparently the most trustworthy website to use.
Supposedly buses can really start to range in comfort around this area, so while I can&amp;rsquo;t speak for all of them, I can say I used Giant Ibis and they were quite good.&lt;/p&gt;
&lt;p&gt;This couple reminded me a lot like my girlfriend and I&amp;rsquo;s hero&amp;rsquo;s of 2023: &lt;a href="https://www.yorkshirepost.co.uk/arts-and-culture/film-and-tv/race-across-the-world-yorkshire-winners-of-travel-show-on-their-gap-decade-4583339" target="_blank" rel="noreferrer"&gt;Tony and Elaine&lt;/a&gt;.
They had taken part on the BBC show &lt;a href="https://www.bbc.co.uk/programmes/profiles/J5RczFz3CqyT1g80rV0HLV/elaine-and-tony" target="_blank" rel="noreferrer"&gt;Race Across the World&lt;/a&gt;, travelling from London to Singapore across 50 days on a budget of only £1329 each.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still working on convincing Feiyang to do this with me&amp;hellip;&lt;/p&gt;
&lt;h2 id="ho-chi-minh-city--saigon" class="relative group"&gt;Ho Chi Minh City / Saigon &lt;/h2&gt;&lt;p&gt;We have just over 24 hours in Saigon, so what else to do besides of course, the Ho Chi Minh war remnants museum.&lt;/p&gt;
&lt;h3 id="war-remnants-museum" class="relative group"&gt;War Remnants Museum &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/saigon_war_museum_hu_6132c6770ba1549e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="War Remnants Museum"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/saigon_war_museum_hu_27377c1394c9fb88.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;No photos from the inside, it gets quite graphic&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Harry and I spent a few hours here walking around sombrely, with it&amp;rsquo;s harrowing honest portrayal of the effects of the war playing through our heads.
Having never quite understood the impacts of &amp;ldquo;agent orange&amp;rdquo; before, I was horrified.
The museum does a traumatically excellent job of conveying the human impact of such dioxins, and shows in graphic detail the deformations and destruction it has wrought upon all generations nearby.
The inhumanity of this war, the indecency of the soldiers, the indiscriminate razing of &lt;em&gt;all life&lt;/em&gt; shocked me.
I wept a bit.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.independent.co.uk/life-style/health-and-families/agentorangevietnamwarusdamirsagolj-a7664491.html" target="_blank" rel="noreferrer"&gt;This article&lt;/a&gt; captures some of the essence of what the museum showed, but the in person experience is something that cannot be conveyed in this article, or any other so far detached.&lt;/p&gt;
&lt;h3 id="cu-chi-tunnels" class="relative group"&gt;Cu Chi Tunnels &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/cu_chi_tunnel_hu_69a1bec6a8610d91.JPG"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Cu Chi Tunnels"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/cu_chi_tunnel_hu_c7af2de1b5708b6f.JPG"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Snug fit in the Cu Chi Tunnels&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;On the complete other end of the spectrum, the Cu Chi Tunnels.&lt;/p&gt;
&lt;p&gt;For this, we were granted a ridiculously cheerful tour guide, who insisted on singing his favourite American songs for the entire 2 hour journey to the tunnels.&lt;/p&gt;
&lt;p&gt;On arrival, it&amp;rsquo;s quite what you would expect, with a medium density forest giving way to the odd stretch of dirt, and a couple holes for the tourists to peek / jump inside.&lt;/p&gt;
&lt;p&gt;Coming from the war remnants museum, this was a bit underwhelming, with the only &lt;em&gt;authentic&lt;/em&gt; part of the experience being the occasional &lt;strong&gt;crack&lt;/strong&gt; of M16 rifle fire by an American (tourist, this time).&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/cu_chi_gun_hu_941980534550d86f.JPG"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="American with a gun"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/cu_chi_gun_hu_74c43cfec8070750.JPG"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;It didn&amp;rsquo;t feel very &lt;em&gt;ethical&lt;/em&gt; to fire American guns near a war site, but Americans will be Americans&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="bui-vien" class="relative group"&gt;Bui Vien &lt;/h3&gt;&lt;p&gt;Our time in Saigon - Vietnam in general - was coming to a close.&lt;/p&gt;
&lt;p&gt;We caught back up with Alfonso (from the train ride earlier) for a few beers down in Bui Vien street.&lt;/p&gt;
&lt;p&gt;Whilst it&amp;rsquo;s not the craziest scene in South East Asia, it&amp;rsquo;s still enough to put you off western tourists, with the classic affair of cheap drinks and soft drugs fuelling a late night culture.&lt;/p&gt;
&lt;p&gt;We stayed for a bit, but after having our fill of food and Saigon beer and struggling to find a good rooftop bar with live music, we called it a night.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/saigon_rooftop_bar_hu_9bc9e31a5c47c317.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Drinks in Bui Van"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/06/mini-sabbatical-4-vietnam/saigon_rooftop_bar_hu_a6891d786edacbe1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Drinks with Alfonso and Harry&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="to-cambodia" class="relative group"&gt;To Cambodia &lt;/h2&gt;&lt;p&gt;I left early the next day, with just enough time to grab a last Banh Mi with Harry before jumping on my first Bus of the trip.&lt;/p&gt;
&lt;p&gt;Bus stops aren&amp;rsquo;t quite what you would expect, considering the prevalence of this mode of transport.&lt;/p&gt;
&lt;p&gt;I waited for my Giant Ibis coach from Ho Chi Minh to Phnom Penh outside a seemingly random cafe on a normal street.
Only the dozen or so confused looking backpackers could give away it&amp;rsquo;s true purpose.
I was following in the footsteps of that scottish couple from before, and back to being alone.&lt;/p&gt;
&lt;p&gt;I had achieved a cross country trip in 8 days, the complete reverse of Top Gear from my youth.&lt;/p&gt;
&lt;p&gt;Writing this looking back now, I miss Vietnam, I mmissed it as soon as I left in truth.
The chaos, the community, the suits.
I know I&amp;rsquo;ll be back for more of them all!&lt;/p&gt;
&lt;p&gt;Looking ahead, my flight to London leaves in 12 days from Singapore.
I still have 2 more countries I want to see&amp;hellip;&lt;/p&gt;</content:encoded></item><item><title>🇨🇳/🇭🇰 Mini-Sabbatical Part 3: Chengdu to Hong Kong</title><link>https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/</link><pubDate>Mon, 13 May 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/</guid><category>Travel</category><category>The 'Mini Sabbatical'</category><category>China</category><description>On the way out of China</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="qingchengshan" class="relative group"&gt;Qingchengshan &lt;/h2&gt;&lt;p&gt;Before leaving Chengdu (where I unfortunately missed out on my chance to see Pandas thanks to illness ☹️), we were recommended to visit a nearby resort town called Qingchengshan.&lt;/p&gt;
&lt;p&gt;Transport links were good (a short train from Chengdu) and the hotels seemed nice and quite cheap, so why not!&lt;/p&gt;
&lt;p&gt;Upon arrival, it seems this was one of those towns that had been through a &amp;ldquo;boom&amp;rdquo; and &amp;ldquo;bust&amp;rdquo; period and never quite made it made it on the other side.&lt;/p&gt;
&lt;p&gt;All of the buildings must have been less than 20-30 years old, so quite modern by resort standards, but many had fallen into disrepair.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_derelict_hu_7957bffdc136d9f0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Derelist building in Qingchengshan"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_derelict_hu_c89d147005c8910e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;This was next to the tourist information office in Qingchengshan, which was pretty dead when we asked for information&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Still, more for us!
Our hotel (like many in the area) was a hot springs resort hotel, and we were lucky enough to have pretty much the entire place to ourselves, so we inevitably spent most of our time relaxing around the hot springs.
At least Feiyang did, my weak British genes kept me out of the hottest pools for the most part.&lt;/p&gt;
&lt;p&gt;We were also staying opposite to a fantastic traditional style restaurant, where all food was prepared in the same fashion as an ancient village would have done.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_ducks_hu_7e1be565b3aad9f6.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Nice restaurant"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_ducks_hu_f1a2d4cf47bfcb13.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Ducks just hanging about&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This was my first experience of so many dried meats in one place, and we only wished we found out about it earlier, as by the time we got around to visiting, they were only 30 minutes before closing.&lt;/p&gt;
&lt;p&gt;One of the days we stayed, we went for a couple hours of walking to a nearby tourist village, past the Sichuan University.
I think they were having exams that day, as hundreds of students meandered about looking mildly stressed, munching on some sausages and snacks from the food carts that stopped enterprisingly outside of the entrance.
We grabbed a 20p spicy processed sausage as we passed, though I&amp;rsquo;m fairly sure that gave us some digestive issues later on.&lt;/p&gt;
&lt;p&gt;In the village, we found a cute-but-not-quite-Gubei traditional village.
It was clearly not quite as affluent as some other areas we had been to, but that made it all the more interesting!
Passing by shops with more traditional food, tea houses with Koi fish, local farmers markets or bamboo woodworking shops, the place felt much more &amp;ldquo;real&amp;rdquo; than the cities we had become accustomed to.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_village_hu_29d7b143c32be19b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Qingchengshan Village"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_village_hu_227d072273041dad.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Beneath this bridge you could rent pedalo boats, but we chose to get bubble tea instead&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Whilst I probably wouldn&amp;rsquo;t recommend Qingchengshan for the first time visitor, if you had more time than us it seemed like a good entrance to the nearby National Park, and I suppose you could always spend a bit more time in the hot springs!
We had spent long enough in the region where I had high expectations of Pandas and Sichuan Peppers, and ended up being ill for most of it.
We are as fast West as we were going to get on our trip, and we are now looking at having to race down to Hong Kong in one week&amp;rsquo;s time, to make sure Feiyang gets back to England for her Accountancy exams!&lt;/p&gt;
&lt;h2 id="yangshuo" class="relative group"&gt;Yangshuo &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_train_station_hu_df0c9f0da46e4a10.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Train station massage chairs"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/qingchengshan_train_station_hu_8e404837e4e29eb8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I miss these massage chairs so much as I travel now. £1 and you get 15 minutes of relaxation&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Leaving Qingchengshan, we make sure to enjoy the £1 train station massage chairs while we wait!
The scenery so far has been fairly flat all the way from Beijing to Chengdu, though you can sometimes see mountains in the distance.
Yangshuo however greeted us with a completely different, slightly alien landscape.
Perhaps that&amp;rsquo;s why this region is famous for inspiring Avatar&amp;rsquo;s imagination-capturing floating cloud forests.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_train_station_hu_5c8ee54a19662e41.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Yangshuo from the station"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_train_station_hu_ab50cabb6c020dee.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Pandora?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;For those unaware, Yangshuo lies on the Li river, near the larger town of Guilin.
It&amp;rsquo;s at roughly the same latitude as Taiwan, the same Longitude as Hainan, and has a similarly tropical climate to both.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_river_hu_d4c52e0443656a5b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Li river"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_river_hu_3d7c3fc326b38ce7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The river bank is dotted with rafts where you can rent a traditional outfit, and have your photo taken on the boat, with a bird chained in the background. Not our cup of tea but apparently a hit with the local tourists!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s claim to fame is obviously the jaw dropping scenery afforded by the smooth surrounding mountains, rice fields and bamboo sheltered river.
Though quite strangely it appears the town was not much of a tourist hotspot until the foreigners arrived.
Supposedly, an American bought up some land by the river in the 80s, and opened a very fancy hotel that is still fully booked out months into the future.
Many have tried to capitalise on this success, and our own hotel was owned by a Belgian couple who live on/off in the village, with tales of dozens more airbnb&amp;rsquo;s popping up.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_hotel_breakfast_hu_165d862b5d6fe8f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Hotel breakfast"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_hotel_breakfast_hu_4fb975419b23f875.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Hotel breakfast views don&amp;rsquo;t get much better&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I think we may have timed this trip quite well, being slightly out of peak season, and so soon after the lifting of COVID restrictions, we were mostly alone in the hotels we stayed.
This one was clearly catering for western tourists, yet it was only us and another Russian couple who were staying.
No complaints from us though, as we could reserve the best view every morning!&lt;/p&gt;
&lt;h3 id="bamboo-rafts" class="relative group"&gt;Bamboo rafts &lt;/h3&gt;&lt;p&gt;We had a couple days around town, and decided to spend one of them doing the &lt;em&gt;classic&lt;/em&gt; bamboo raft trip down the river.
Anticipating lots of sun and some great photos opportunities, we made sure to pick up some nice cheap straw hats before getting on a raft.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_me_hats_hu_4c8ec7625294e8ac.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="2 Hatz"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_me_hats_hu_66c44034d010607d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Embarrassing tourist, me? No&amp;hellip;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This was probably the single most memorable thing we did on this trip.
A 2 hour float down the Li river, in fantastic weather, with some of the most spectacular views in this corner of the world.
You&amp;rsquo;d struggle to find anything else more relaxing than this!&lt;/p&gt;
&lt;p&gt;Our captain(?) kept calling me &amp;ldquo;Hello&amp;rdquo; as the white guy on board, but he made sure to take some nice photos of us!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_raft_us_3_hu_af85d1bb905cd94.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2571"
 height="3429"
 class="mx-auto my-0 rounded-md"
 alt="Us on a raft"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_raft_us_3_hu_4e856a3b1e1d3842.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Yes, yes, it&amp;rsquo;s a cheesy pose I know&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I recognised the river on one of the banknotes, and found that the 20 yuan banknote denotes a location not too far from where we were!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_20_yuan_hu_af4949ca20db352a.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="20 yuan note"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_20_yuan_hu_c0f3d306dbc340c8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;20 Yuan close enough&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You could visit it if you have time, but you basically have to take the ferry from Yangshuo to Guilin, so we made do with a near-enough shot.
I have this hobby where for each country I visit, I keep a denomination of the local currency and hang it on my wall at home as a souvenir.
It turns out to be a bit more manageable than fridge magnets, but having bank notes represent famous places from the country is certainly more interesting than a random politician!&lt;/p&gt;
&lt;p&gt;Further down the stream you begin to notice that we are on a bit of a man-made ride though.
Aside from the hundreds of bamboo rafts, and &lt;em&gt;sheer abundance&lt;/em&gt; of electric mopeds about, you notice that the river banks themselves have been shaped by concrete, and planted with bamboo.
Not that I&amp;rsquo;m complaining, I do like some bamboo.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_raft_bamboo_hu_db8c8b3e66213fc8.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Bamboo river"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_raft_bamboo_hu_f2c4d86baa619ac4.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I wish bamboo like this grew everywhere&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="e-scootering" class="relative group"&gt;E-Scootering &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_bike_in_river_hu_2e251e4ae9fc7380.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Electric Mopeds"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_bike_in_river_hu_683ca73fd9c703fb.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;These mopeds were everywhere&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Despite the fact that this town is in the middle of the countryside, it&amp;rsquo;s not quite &lt;em&gt;rural&lt;/em&gt; enough to feel like it has been untouched by technology.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_car_under_wraps_hu_373645bd2638defb.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Electric car under wraps"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_car_under_wraps_hu_8a36b40bca8f2db6.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;As I passed, I felt like this photo summed up the &lt;em&gt;feeling&lt;/em&gt; of China in one image&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Again, every car you see (aside from the tour buses) are electric, and you lose count of the seemingly self-replicating electric mopeds that litter the streets.
I think it only cost us ~£15 to rent an e-scooter for the day, and nobody checked our licenses or asked for a deposit, they just let us go out on our own adventure.&lt;/p&gt;
&lt;p&gt;Without ever having ridden a moped before, we set out for the rest of the day on the bike.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_shit_rental_bike_2_hu_251518fe597e8dc5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="E-Moped"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_shit_rental_bike_2_hu_9bf52217bea82a45.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Our magnificent steed&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A 20 minute drive from our hotel was the start of a riverside drive that was supposed to be dotted with cafes and other shops.
To be honest, we didn&amp;rsquo;t have enough time to fully explore the area, but we had fun zipping about from one area to the next, stopping to admire the views and get away from other people for a while.&lt;/p&gt;
&lt;p&gt;Along the way we stopped at an old lady&amp;rsquo;s stall by the river where Feiyang introduced me to a &amp;ldquo;bean drink&amp;rdquo;.
Whilst I can&amp;rsquo;t remember the name of it, it came in a little tub, and you drink from a spoon.
The gritty, bland-but-sweet taste wasn&amp;rsquo;t really to my liking, but it took Feiyang back to her childhood.&lt;/p&gt;
&lt;p&gt;We also stopped by a western style cafe amongst the rice fields, where you can hardly tell where the rice ends and the instagram models begin, due to sheer number of photo-shoots taking place.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_rice_field_us_hu_5076e266c18ba2c7.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Photo shoot by the rice fields"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_rice_field_us_hu_26a15a3fd1e2f4fd.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Not ones to miss out, we also took photos, blocking out the others&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_us_on_bike_hu_f5503c894782f145.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Us on the scooter"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_us_on_bike_hu_aa9016532953bcce.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Feiyang clinging on for dear life&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As the sun set, we booked a full body massage (my first!) at the hotel, and drove back to the scooter rental place.&lt;/p&gt;
&lt;p&gt;Touristy, but deservedly so.
10/10 recommend you visit Guilin/Yangshuo, if only for the nature rather than the cities.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_street_hu_2712fdcdd4d45a9c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Streets in Yangshuo"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/yangshuo_street_hu_a8f954fe30c600b3.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Not much going on in the town, but good enough for some places to eat and buy some souvenirs&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="hong-kong" class="relative group"&gt;Hong Kong &lt;/h2&gt;&lt;p&gt;I&amp;rsquo;ll spare you a recap of the ~8 hours it took us to get from Yangshuo to Hong Kong, but it was something like &amp;ldquo;train-train-3(!)-immigration-borders-train-hotel&amp;rdquo;.
Around this time it was Feiyang&amp;rsquo;s turn to get ill, so once we checked in to our hotel, she stayed behind to rest while I went out to try and get some laundry done.&lt;/p&gt;
&lt;p&gt;I had bought some e-sims using &lt;a href="https://mobimatter.com" target="_blank" rel="noreferrer"&gt;MobiMatter&lt;/a&gt; (use the code JJHAS96592 if you feel the need 😉), and for the most part it had worked fine throughout South East Asia, and even China.
However, Hong Kong is a bit of a strange place.&lt;/p&gt;
&lt;p&gt;Once I had found a laundrette, it was completely automatic.
No worries, I had a card for contactless.
Ok, Hong Kong has some strange Octopus payment scheme, so not contactless&amp;hellip;
No worries, I have WeChat pay.
There&amp;rsquo;s no WiFi, but I have an e-sim right?
Well, turns out you need to register your identity via a passport scan before using any sim in Hong Kong, so they can explicitly match up any internet traffic to your identity. WTF?&lt;/p&gt;
&lt;p&gt;Anyway, after a quick jaunt back to the hotel to set this up, I finally pay for my laundry and have enough time to quickly check out the view from Kowloon point before I needed to go to sleep.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_skyline_hu_4bdc3e3ed203dcf2.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Hong Kong Skyline at night"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_skyline_hu_10fc3adc37296c5b.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Probably the most impressive skyline in all of South East Asia. Looking from Kowloon to Victoria&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;On the way back, I suddenly got a Deja Vu of some of the scenes from one of my favourite cheesy films, Rush Hour 2.
In that, Jackie Chan is seen crawling up and fighting on some of the famous Bamboo scaffolding surrounding the cities buildings.
I was afraid that 22 years of health and safety regulations would have put an end to this scaffolding practise, or that it was a strange stereotype and bamboo scaffolding didn&amp;rsquo;t actually exist, but no!
The bamboo scaffolding is real!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_scaffolding_hu_6261509f92d64441.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Bamboo scaffolding"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_scaffolding_hu_45d54ca74618bd3e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Imagine Jackie Chan up this&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We had two days in Hong Kong, so split it roughly into a day around Hong Kong Island, and a day around Lantau Island.&lt;/p&gt;
&lt;h3 id="victoria-peak" class="relative group"&gt;Victoria Peak &lt;/h3&gt;&lt;p&gt;Starting out early, we looked up the top things to do in Hong Kong, and chose to travel up to Victoria Peak to get some good views of the city.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t quite appreciate this from the night before, but Hong Kong is incredibly hilly.
We took the Peak Funicular up to the top, and I&amp;rsquo;d recommend this to anyone visiting, despite the fact we got lost a few times trying to find the start of it!&lt;/p&gt;
&lt;p&gt;Since Hong Kong is so hilly, and was kind of built by &lt;em&gt;whoever was in charge at the time&lt;/em&gt;, the roads are a bit all over the place as they follow the contours of the land.
We were stuck in Hong Kong park for a good 30 minutes before we could find the right exit, and made sure to swear our way through our clothes running up and down the same hills.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_victoria_cable_car_hu_f7ccf6debfd8f8c0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Peak Funicular"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_victoria_cable_car_hu_faa23804eed5f3ea.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Feels more like a rollercoaster than a train&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Once on the funicular, you get another dose of how steep Hong Kong can be, as you climb well over a 30% gradient up to the top.&lt;/p&gt;
&lt;p&gt;At the top, you get another glimpse at the density of Hong Kong.&lt;/p&gt;
&lt;p&gt;You would have been able to see the infamous Kowloon Walled City were it still standing, but regardless, Hong Kong is still one of the most densely inhabited places you can visit.
Almost every building that can be built, has been built as a high rise apartment block.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_victoria_peak_hu_b6b16620fb60c471.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Hong Kong from the top"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_victoria_peak_hu_c31cb3ed99c7ce0b.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Sorry for spoiling the view&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a certain beauty to it, and it does remind me of a denser, hillier Singapore, but we&amp;rsquo;ll get to that later.&lt;/p&gt;
&lt;p&gt;The rest of the day we spent pretty much just walking around, shopping and eating.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have any pictures, but we explored some of the famous night markets, where you can buy ay designer bag you want, for £5!
We also managed to get apparently the best Dim Sum Feiyang has ever tried, but you&amp;rsquo;ll have to ask her for the restaurant as I&amp;rsquo;m quite frankly useless when it comes to food.&lt;/p&gt;
&lt;h3 id="lantau-island" class="relative group"&gt;Lantau Island &lt;/h3&gt;&lt;p&gt;Hong Kong is made up of over 200 islands, of which the bulk of what you might think of as &amp;ldquo;Hong Kong&amp;rdquo; is just contained within the Kowloon Peninsula, and Hong Kong Island.
Outside of this, are the New Territories, a collection of landmass that were originally inhaled by the British as part of the now-expired 99 year lease, which actually makes up more than 86% of Hong Kong&amp;rsquo;s total territory.&lt;/p&gt;
&lt;p&gt;Lantau Island is the location where you would find Disneyland, Hong Kong Airport (technically reclaimed land), and some beautiful beaches.&lt;/p&gt;
&lt;p&gt;We decided to visit because it is also the location of a large Buddha statue that seemed quite interesting to us.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_cable_car_hu_fee2ace0106b83af.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Lantau Cable Car"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_cable_car_hu_2070fff3d362bc20.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;~6km of Cable Car to avoid a half day of hiking, feels worth it&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;To get there, we took the Ngong Ping 360 cable car all the way to the top.
This offers a &amp;ldquo;crystal&amp;rdquo; cabin (basically double the price) where you can see through the floor to the passers by below.
Not sure it is worth the price delta, but it&amp;rsquo;s certainly fun to see others in your cabin freak out!&lt;/p&gt;
&lt;p&gt;Arriving at the top, we found ourselves intruding on a kind of race event.
There were 5k/10k/other races going on around the island, with each of them having to run up and down all of the stairs to the main Buddha statue.
My hat goes off to some of these people, who are clearly double my age and twice as fit, so that put some things into perspective at least.
They also had to contend with an already crowded staircase swarming with Aunties and clueless tourists alike, so I&amp;rsquo;m sorry if I got in the way of anyone&amp;rsquo;s PB.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_buddha_hu_de8facc2eb4ebcef.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2316"
 height="3088"
 class="mx-auto my-0 rounded-md"
 alt="Buddha statue"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_buddha_hu_c369151e5d19fd86.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Feiyang or Buddha?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I wish we had more time on this island, and others, as there are supposedly some amazing hikes you could do!&lt;/p&gt;
&lt;p&gt;Lama Island to the South is apparently a bit like Pulau Ubin from Singapore, in that it has mostly been left untouched by technological progress, being kept in a stasis of dirt roads, no internet and simple housing.
Whilst I don&amp;rsquo;t know if this is true or not, the islands still hold some secrets that beg to be explored!&lt;/p&gt;
&lt;h3 id="leaving" class="relative group"&gt;Leaving &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_bye_feiyang_hu_fd8b9c11441dc4a8.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Feiyang leaving back to Englang"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-3-chengdu-to-hongkong/hongkong_bye_feiyang_hu_2417954df28931ac.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Bye, Feiyang! See you in 3 weeks&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Feiyang left Hong Kong early in the morning, and I gave her most of my cash so she could get a taxi straight to the airport.
Her flight was at 7am, mine not until 2pm, so we parted ways as she head back to England.
My own flight back to England is booked 20 days later, departing from Changi airport, so I now have ~3 weeks to get from Hong Kong to Singapore on my own.&lt;/p&gt;
&lt;p&gt;I spent some time down by the Kowloon peninsula to think about what I wanted to get up to over the next few weeks.
Also, I wanted to reflect on my time in Hong Kong.&lt;/p&gt;
&lt;p&gt;After &lt;a href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/"&gt;spending some time in Singapore&lt;/a&gt;, and having known both were ex-British colonies, I was fully expecting Hong Kong to feel the same as Singapore.&lt;/p&gt;
&lt;p&gt;Yet, it felt different.&lt;/p&gt;
&lt;p&gt;Hong Kong was much more chaotic, feeling less safe.
Despite it also being independent for less time than Singapore, it felt less &amp;ldquo;Westernised&amp;rdquo;.
Over 90% of the population of Hong Kong are Chinese according to the latest figures, so you don&amp;rsquo;t get quite the same international mix as you do with Singapore.&lt;/p&gt;
&lt;p&gt;Whilst I can&amp;rsquo;t speak for the population, some citizens we talked to did express some concerns about the new governance.
Free speech is no longer as free as it once was, and some inhabitants are struggling to adapt to this power shift.
Though the British lease ended over 20 years ago, I feel the nation is still struggling to find it&amp;rsquo;s own place.
Or, struggling to lose it.&lt;/p&gt;
&lt;p&gt;I would imagine that the working culture in Hong Kong is very similar to Singapore, but the living conditions appear to be less favourable by most metrics.
It is a place I would like to experience fully, but not one that I would readily choose over a similar location, such as Singapore.&lt;/p&gt;
&lt;p&gt;That being said, the biggest similarity I felt was the airports.
Both were absolutely marvellous.&lt;/p&gt;</content:encoded></item><item><title>🇨🇳 Mini-Sabbatical Part 2: Beijing to Chengdu</title><link>https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/</link><pubDate>Tue, 07 May 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/</guid><category>Travel</category><category>The 'Mini Sabbatical'</category><category>China</category><description>Travelling West to tick off bucket lists</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="back-in-beijing" class="relative group"&gt;Back in Beijing &lt;/h2&gt;&lt;p&gt;Gubei was awesome, but the unrelenting march of time moves on, and so we find ourselves on the way back to Beijing.&lt;/p&gt;
&lt;p&gt;Along we way we stopped for a quick break to relieve ourselves at a rest stop.
Most countries have these places, and they all seem to stand out for different reasons.&lt;/p&gt;
&lt;p&gt;For the French, it&amp;rsquo;s the nice public toilets and picnic benches.&lt;/p&gt;
&lt;p&gt;For the British, it&amp;rsquo;s the fact that Welcome Break somehow have a monopoly.&lt;/p&gt;
&lt;p&gt;For the Americans, it&amp;rsquo;s the strange business-park layout that forces you to drive between buildings.&lt;/p&gt;
&lt;p&gt;For the Chinese, &lt;a href="https://www.odditycentral.com/news/shopping-mall-high-tech-urinals-provide-urine-tests-for-a-fee.html" target="_blank" rel="noreferrer"&gt;it&amp;rsquo;s the urinals that measure your glucose levels&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bit surreal, but we continued regardless (I didn&amp;rsquo;t pay to have it done).&lt;/p&gt;
&lt;h3 id="olympic-park" class="relative group"&gt;Olympic Park &lt;/h3&gt;&lt;p&gt;We still had a couple of hours of sunlight to kill on the way back to the flat, so we thought it would be a good chance to see the buildings that put Beijing on the map for me.
The Beijing 2008 Olympic Games Park!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_birds_nest_hu_add69ba5e4ae6346.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="The Birds Nest"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_birds_nest_hu_275056bd45f7f7c2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The Beijing Olympic park is not too dissimilar from Olympic parks from other cities to be honest.
There is the centrepiece stadium, now used by local sports teams or for concerts.
There is of course a &lt;em&gt;huge&lt;/em&gt; shopping mall (in this case, under the whole complex) and a few museums to take advantage of the mass transit systems that had to be built.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_olympic_tower_hu_e7fd405e4f5a6513.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Olympic Tower"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_olympic_tower_hu_e56e69e721c88471.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A few architectural standouts won&amp;rsquo;t go amiss either, such as the &lt;a href="https://en.wikipedia.org/wiki/Beijing_Olympic_Tower" target="_blank" rel="noreferrer"&gt;Beijing Olympic Tower&lt;/a&gt; (that strangely was only build 6 years after the games).
Whilst we didn&amp;rsquo;t go up it, the views would I&amp;rsquo;m sure have been incredible.&lt;/p&gt;
&lt;p&gt;The last place we visited here was the &lt;a href="https://en.wikipedia.org/wiki/Olympic_Forest_Park" target="_blank" rel="noreferrer"&gt;Olympic Forest Park&lt;/a&gt;.
For a city so vast and so heavily developed, it is always welcome to escape into nature a bit, and this park absolutely scratches that itch for so many of Beijing&amp;rsquo;s residents.
Even offering bike + kayak rental for a small fee, it&amp;rsquo;s a quite literal breath of fresh air.&lt;/p&gt;
&lt;p&gt;Even though it&amp;rsquo;s pretty far out (right on the edge of the city, a couple hours to get to for us!), it was &lt;strong&gt;absolutely rammed&lt;/strong&gt;.
I could liken it maybe to Hyde Park in peak summer, but with almost zero tourists (as Beijing &lt;a href="https://www.statista.com/statistics/1136687/china-number-of-arrivals-of-inbound-international-tourists-in-beijing/#:~:text=Arrivals%20of%20overseas%20tourists%20in%20Beijing%202013%2D2023&amp;amp;text=In%202023%2C%20around%201.17%20million,from%20inbound%20tourism%20that%20year." target="_blank" rel="noreferrer"&gt;didn&amp;rsquo;t really have many outside visitors&lt;/a&gt; when I arrived).&lt;/p&gt;
&lt;p&gt;The running track that goes through the park was quite comical, with people practically queuing to get past one another, but I digress - clearly it has a strong demand and we must be grateful for it&amp;rsquo;s existence.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_olympic_forest_feiyang_hu_9e0523a2a89b4cd5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Feiyang in the Forest Park"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_olympic_forest_feiyang_hu_d7c6d3141fd0ebf1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We enjoyed sunset with a short hike, then slowly made our way back to the flat.&lt;/p&gt;
&lt;h3 id="tian-tan-park" class="relative group"&gt;Tian Tan Park &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_park_hu_977d39c31cf25244.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Tian Tan Park"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_park_hu_bc0cf59106a7f7b6.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;More parks!&lt;/p&gt;
&lt;p&gt;In the morning, we grabbed ourselves a Chinese pancake and McDonalds coffee (don&amp;rsquo;t judge me) from near Feiyang&amp;rsquo;s flat, and set out to tick some more items off the Tripadvisor list.&lt;/p&gt;
&lt;p&gt;Tian Tan (also called the Temple of Heaven) is one of the largest parks in Beijing, or at least the largest one &lt;a href="https://www.openstreetmap.org/?mlat=39.8822&amp;amp;mlon=116.4066&amp;amp;zoom=15#map=14/39.8884/116.3924" target="_blank" rel="noreferrer"&gt;located centrally&lt;/a&gt;.
Within it, you&amp;rsquo;ll fine a well landscaped park, complete with many areas for the traditional &amp;ldquo;Auntie Dance Class&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This was probably my favourite thing that I saw throughout Asia that I really wish the West had more of.
If you are retired, you need to keep fit &lt;em&gt;somehow&lt;/em&gt;, so why not join a group and dance to some wildly out of genre tiktok pop songs in a group?
I loved it!&lt;/p&gt;
&lt;p&gt;There were some Uncles joining in, but typically they would join the Uncle Class, who would be trying out some other activities such as Tai Chi.&lt;/p&gt;
&lt;p&gt;We spotted one absolute legend of an Uncle travelling around on his new toy, a motorised suitcase.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_scooter_man_hu_3abed56667d28568.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Legendary Uncle on a Suitcase"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_scooter_man_hu_98e7f90bf0b319cd.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The legend in question&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Not quite sure what he was trying to do here, as the suitcase was walking pace, and the cobblestone actually forced him to fall over a couple times, but it was funny to see so I grant him that.&lt;/p&gt;
&lt;p&gt;In the center of the Temple of Heaven is the Hall of Prayer for Good Harvests, and the highest concentration of school field trips.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_selfie_hu_15a738ca3921082f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Temple of Heaven selfie"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tian_tan_selfie_hu_dc52604a4343ef0d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I am ashamed to admit that I learnt almost nothing from the countless temples we visited.
Big fan of the architecture, but I just can&amp;rsquo;t recall anything in particular that stood out about this temple.&lt;/p&gt;
&lt;h3 id="lama-temple" class="relative group"&gt;Lama Temple &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_temple_6_hu_fcbb67ac76558ec0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Lama Temple"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_temple_6_hu_275f0ce0f5754671.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Lama Temple. Why can&amp;rsquo;t all buildings be this pretty?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In an attempt to experience more, on recommendation from Feiyang&amp;rsquo;s Mum, we went to visit the &lt;a href="https://en.wikipedia.org/wiki/Yonghe_Temple" target="_blank" rel="noreferrer"&gt;Lama temple&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This was the first Buddhist temple I had ever visited, and what first struck me as intriguing were the large communal &lt;a href="https://en.wikipedia.org/wiki/Censer" target="_blank" rel="noreferrer"&gt;Censers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_temple_hu_fd14f5366fa09e9e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Lama Temple Prayer"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_temple_hu_75cccf245e97ddb7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The idea is that you pick up 3 sticks of incense (specifically 3, to transcend towards equilibrium, stability and infinity).
Upon lighting your incense, you stand in front of the Censer, say your prayer and place them inside to burn with the rest.&lt;/p&gt;
&lt;p&gt;Very peaceful, I really enjoyed the atmosphere.
I was also perhaps starting to get a bit lightheaded from all of the smoke.&lt;/p&gt;
&lt;h3 id="summer-palace" class="relative group"&gt;Summer Palace &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_hu_ec3a9e9ac2717182.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Summer Palace"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_hu_fc2e5455ed03d663.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Summer Palace is a &lt;strong&gt;must&lt;/strong&gt; visit if you are in Beijing for more than a week.&lt;/p&gt;
&lt;p&gt;Not to be confused with the &amp;ldquo;Old Summer Palace&amp;rdquo; (just down the road, but destroyed by the French+British in the mid-1800&amp;rsquo;s), it is a wonderful example of traditional architecture blending in with nature.
Of course, all places this beautiful are mired in some form of controversy.
For the Summer Palace, a significant proportion of funds that were supposed to be used to upgrade the Chinese Navy were instead rerouted to expanding the Summer Palace in celebration of the Empress&amp;rsquo;s 60th birthday.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_view_2_hu_272c97d3f7229d32.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3828"
 height="3023"
 class="mx-auto my-0 rounded-md"
 alt="View from the top of the Summer Palace"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_view_2_hu_c4a587fb90b0f937.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Stunning views from the top&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Besides it&amp;rsquo;s history, nowadays it is simply a tourist attraction that can be booked through WeChat, with great views over the surrounding area, and some great walking routes around the expansive and well maintained gardens.&lt;/p&gt;
&lt;p&gt;We were visiting in late October, so the nights were beginning to draw in a bit earlier, but sunset gave this place a mystical feeling, and as we walked back to the car, past street artists along the promenade of the lake, we took some time to slow down and watch the sun set.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_family_hu_aa7800491c8db123.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Sunset"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_summer_palace_family_hu_a79c32bf4a3174b0.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="museums" class="relative group"&gt;Museums &lt;/h3&gt;&lt;p&gt;Entering our second week in Beijing, we were struggling to find things to do.&lt;/p&gt;
&lt;p&gt;The issue with accidentally aligning our trip with the Belt and Road conference, was that whilst the weather was amazing the previous week, all major attractions near Tiananmen Square were shut.
Now that the diplomats have left, a huge wave of bookings via WeChat meant that the Forbidden City along with most other attractions had sold out.
&lt;strong&gt;Top Tip: Book tickets on WeChat well in advance&lt;/strong&gt;.
Supposedly 85k tickets are available for the forbidden city every day, and they sell out in minutes.&lt;/p&gt;
&lt;p&gt;Also weirdly enough, as soon as the diplomats left, the pollution came back.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_forbidden_city_panorama_hu_fd6c3de5c7b29291.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3894"
 height="1970"
 class="mx-auto my-0 rounded-md"
 alt="Forbidden City Pollution"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_forbidden_city_panorama_hu_60cc1f32d81c55e9.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Despite the health warning, we climbed up a hill to see this view&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Better luck next time, I guess?&lt;/p&gt;
&lt;p&gt;I still have a few more things to see in Beijing before I can consider it &amp;ldquo;ticked off&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_hu_9a2202b6eb17b10c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="National Museum of China"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_hu_965b1872ebd39a87.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The National Museum of China&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The National Museum of China is one of the largest museums in the world (I actually can&amp;rsquo;t tell whether or not it is &lt;em&gt;the&lt;/em&gt; largest, it didn&amp;rsquo;t feel as big as the Louvre to me).&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_sculpture_hu_bc72e4073e7b0793.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="The Road to Rejuvenation"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_sculpture_hu_7ef3584eb065a1c3.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Road to Rejuvenation, this section covered the distressing starts of the cultural revolution&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We saw one chunk of it, with the impressive &lt;a href="https://www.nytimes.com/2011/04/04/world/asia/04museum.html" target="_blank" rel="noreferrer"&gt;but quite politicised&lt;/a&gt; &lt;em&gt;The Road to Rejuvenation&lt;/em&gt; exhibit covering the highs and lows of the Chinese people over the last 200 years.
Since the start of the CCP it has apparently been all highs.&lt;/p&gt;
&lt;p&gt;Of course, I&amp;rsquo;m not blind to propaganda from all sides, and naturally you wouldn&amp;rsquo;t expect a museum funded by a government, showcasing all of the recent failures of that government.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_paintin_hu_8ec48af14c519c15.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Burning books"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_china_museum_paintin_hu_3fb5832e364d2858.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;He who controls the past controls the present&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As we cycle back through Tiananmen Square to head back to the flat, I admire the famous smooth face on the wall, and wonder what he&amp;rsquo;s seen over the years perched up there.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tiananmen_square_mao_hu_c7d0be3845078be2.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Mao"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/beijing_tiananmen_square_mao_hu_bac22696cbfba234.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I wanted to get closer but honestly couldn&amp;rsquo;t figure out how to traverse the square, I think I needed another WeChat booking&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="adventures-in-xian" class="relative group"&gt;Adventures in Xi&amp;rsquo;an &lt;/h2&gt;&lt;p&gt;I knew absolutely nothing about Xi&amp;rsquo;an (much as I did with the rest of China), but there are 2 things I will remember about Xi&amp;rsquo;an.
The Wall, and the Statues.&lt;/p&gt;
&lt;h3 id="terracotta-army" class="relative group"&gt;Terracotta Army &lt;/h3&gt;&lt;p&gt;As we pull up to the compound early in the morning, we are faced by a veritable sea of &lt;a href="https://www.trendyadventurer.com/post/chinese-aunties-pose-inspiration-insta-photo-dynamite" target="_blank" rel="noreferrer"&gt;Aunties&lt;/a&gt;.
No need to worry though, having researched beforehand the fastest route to Pit 1, and armed with our younger legs we pace our way to the front, being some of the first to enter the halls that morning.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_terracotta_army_close_2_hu_3b09843e35628b0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Terracotta Army"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_terracotta_army_close_2_hu_72e45f813a8e281d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Thousands of intricate, lifesize soldiers, built around 70 generations ago&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As the morning light streamed across the hall, it was a bit corny to say that it was a special sight, but it truly was.&lt;/p&gt;
&lt;p&gt;You can read up about the army from many other sources if you want to learn more, so I won&amp;rsquo;t bore you too much.
However something you might not have realised (I didn&amp;rsquo;t) is that each soldier was once beautifully and vibrantly painted, and this paint was in fact still present when the soldiers were first unearthed in the 70&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_terracotta_army_sculpture_close_hu_ab7236c1eb211765.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="The kneeling soldier"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_terracotta_army_sculpture_close_hu_87f0e9d22bca59de.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Imagine his armour a deep purple, with red and yellow accents&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;50 years of public display and tourism subsequently caused this paint to fade and flake away, cautionary tale of how tourism and the commercialisation of history can erode history itself.
Leaving the museum, we walk past a McDonalds, Starbucks and a cinema, the irony entirely lost on us.&lt;/p&gt;
&lt;h3 id="the-wall" class="relative group"&gt;The Wall &lt;/h3&gt;&lt;p&gt;An almost perfect rectangle with a 14km circumference.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_city_wall_temple_hu_2e77edaa6e9fd198.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Xi&amp;rsquo;an city wall"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_city_wall_temple_hu_9a390b144ac16c6.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We &lt;a href="https://www.strava.com/activities/10106719484" target="_blank" rel="noreferrer"&gt;rented a couple of bikes&lt;/a&gt; and marvelled in amazement at what an architectural achievement it must have been to build this defence system so well, so long ago (though only around 500 years in all fairness).&lt;/p&gt;
&lt;p&gt;At night, there was some kind of theatrical performance inside the main building by the south gate, and the entire perimeter is lit up by LEDs, truly one of the best cities to visit whilst in China.&lt;/p&gt;
&lt;h3 id="a-park-some-shops-and-a-buddhist-temple" class="relative group"&gt;A park, some shops, and a Buddhist temple &lt;/h3&gt;&lt;p&gt;Outside of the wall are the usual suspects of cool places to visit in a chinese city: A park, some shops, and a Buddhist temple.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_park_lights_hu_be3425c9aece51bb.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="A random park in Xi&amp;rsquo;an"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_park_lights_hu_f5d839ae0dc5208a.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I can&amp;rsquo;t remember the name of this park, but it was pristine&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t remember much about the park, besides the fact that it was quite expensive to enter, pretty empty, and had a wonderful light/fountain show in the main lake.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_shopping_street_hu_4895ffcb7388c040.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Shopping in Xi&amp;rsquo;an"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_shopping_street_hu_dd6283ac721df238.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;As for the shops, there is this ridiculously over the top main street, with interactive artwork, public performances and at least a dozen electric car brand showrooms flanking either side of it.&lt;/p&gt;
&lt;p&gt;On the electric car topic, China is so full of such high quality electric cars that it boggles the western mind.&lt;/p&gt;
&lt;p&gt;We saw everything from small electic Jeep knockoffs for £8k (my favourite), to £25k Tesla-esque cars, all the way up to the wackiest £16k &lt;strong&gt;car for babies&lt;/strong&gt;.
I don&amp;rsquo;t really know how to explain it, but they have built a car that is custom designed to fit 2 parents and a baby.
The front seats turn around to view the kid, there is a camera in the back trained on the kid with a live view up front, and special baby bottle warmers under the arm rests.
I don&amp;rsquo;t necessarily think that it would be the best purchase decision, but they seemed to have some kind of leasing program where you graduate into a proper car after a few years, so I guess it works fine for whatever audience they are targeting&amp;hellip;&lt;/p&gt;
&lt;p&gt;The temple we visited was pretty memorable, but only for childish reasons (I never seem to learn too much from my travels).&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_buddhist_temple_hu_1ebf1726d2f162e6.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Giant Wild Goose Pagoda"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_buddhist_temple_hu_47f64f3a337027a2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Giant Wild Goose Pagoda&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In the centre sat the Giant Wild Goose Pagoda, an impressive tower that bears no resemblance to a goose.&lt;/p&gt;
&lt;p&gt;In one of the surrounding buildings, an intricate wooden carving of &lt;a href="https://ia803001.us.archive.org/1/items/journeytothewestwuchengen1592/Journey%20to%20the%20West%20-%20Wu%20Cheng_en%201592.pdf" target="_blank" rel="noreferrer"&gt;The Journey to the West&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_buddhist_temple_feiyang_hu_c99182ac15bff59d.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Inside a temple"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/xian_buddhist_temple_feiyang_hu_ec468b32f439f699.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Culture is frankly lost on me&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Feiyang tried her best to explain it to me, but I couldn&amp;rsquo;t quite get over how some dude, a pig, a monkey and a horse could really get along with each other.&lt;/p&gt;
&lt;h2 id="disappointment-in-chengdu" class="relative group"&gt;Disappointment in Chengdu &lt;/h2&gt;&lt;p&gt;Ever since first trying &amp;ldquo;proper&amp;rdquo; chinese food (according to Feiyang), I had fallen in love with the Sichuan pepper.&lt;/p&gt;
&lt;p&gt;As a direct result of this and the allure of seeing pandas where pandas are from, I made sure to extend our route all the way West to Chengdu, despite the considerable length of time we would be stuck on trains.&lt;/p&gt;
&lt;p&gt;Upon arriving in Chengdu however, I was unfortunately hit like a train by what I think was probably the O.G. of COVID-19 strains.&lt;/p&gt;
&lt;p&gt;This meant we had to sadly cancel our Panda visit, and I spent all day in bed at the hotel whilst Feiyang went cafe hopping, revising for her exams and reading her books.&lt;/p&gt;
&lt;p&gt;I did manage to crawl out of the hotel for just long enough to get a proper Sichuan hotpot at a Jay Chou themed restaurant.
Boy was it spicy!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/chengdu_spicy_hotpot_hu_9b6c2a479753fe07.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Jay Chou hotpot"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/05/mini-sabbatical-2-beijing-to-chengdu/chengdu_spicy_hotpot_hu_c28d4f0645b95269.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Those are tears of joy, and a 50/50 blend of spicy/covid nose running&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>🇨🇳 Mini-Sabbatical Part 1: Shanghai to Beijing</title><link>https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/</link><pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/</guid><category>Travel</category><category>The 'Mini Sabbatical'</category><category>China</category><description>Embarking on my mini-sabbatical, I must first enter China</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="landing-in-shanghai" class="relative group"&gt;Landing in Shanghai &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/leaving_singapore_hu_312fcfab5e4c1bc5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Leaving from Singapore"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/leaving_singapore_hu_4289979657dda96.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Looking like a proper tourist, I leave my hotel in Singapore for the last time&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;My flight is at 8:05 AM from Changi.&lt;/p&gt;
&lt;p&gt;A week ago I had bought a backpack just for this trip, 2 days ago I started packing, yesterday I dropped off the rest of my stuff with a coworker to pick up on the way back.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m ready.
Despite the comforts offered to me in Singapore, I feel well prepared for the next 6 weeks living out of this bag.
I have sampled the food, hung out with the locals, I feel like I know what to expect from China, and yet it still occasionally feels mysterious.&lt;/p&gt;
&lt;p&gt;My girlfriend, Feiyang (王飞扬), has been travelling from London since the day before, due to arrive in Shanghai Pudong International Airport just after I leave from Singapore, so we&amp;rsquo;ve planned to meet up at the hotel while she spends the morning with an old school friend.&lt;/p&gt;
&lt;p&gt;I board, so eager to land I forget whatever I was reading on the flight.&lt;/p&gt;
&lt;p&gt;On arrival, I&amp;rsquo;m immediately reminded that China is not-quite-Singapore, not-quite-Thailand.&lt;/p&gt;
&lt;h3 id="scammed-by-a-taxi" class="relative group"&gt;Scammed by a taxi &lt;/h3&gt;&lt;p&gt;Stepping out of the international arrivals section, a guy comes up to me in a suit, claiming he works for the airport (with an official looking pin on his blazer to qualify himself).&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Do you need a taxi?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I still believe taxi&amp;rsquo;s are &amp;ldquo;basically free&amp;rdquo;, from my experience so far around South East Asia and, besides, none of my translation/navigation apps work and I can&amp;rsquo;t read Mandarin well enough to communicate with anyone.
So I say yes.&lt;/p&gt;
&lt;p&gt;We proceed to walk towards, and then straight past, the Taxi pickup zone, and towards the car park.
&amp;ldquo;Uh, taxi&amp;rsquo;s are here?&amp;rdquo; I point to the queue of at least 15 official taxis, with a matching orderly queue of prospective passengers.&lt;/p&gt;
&lt;p&gt;Never mind that, we continue into the car park, where a very fancy looking &lt;a href="https://www.xpeng.com" target="_blank" rel="noreferrer"&gt;xpeng&lt;/a&gt; electric car is awaiting me.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;How much?&amp;rdquo; I ask, expecting roughly £15 worth for the 40 minute drive.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;550&amp;rdquo;.
This is in Yuan, so my basic maths of converting to GBP already tells me I&amp;rsquo;m getting ripped off.&lt;/p&gt;
&lt;p&gt;Unfortunately, I have absolutely no idea how much things cost in this part of the world, my first impressions are that this place costs roughly the same as New York.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;I only have 300&amp;rdquo; I reply, opening my wallet to prove what little Thai Baht or Indonesian Rupiah I had exchanged on departure had afforded me about half a taxi&amp;rsquo;s worth of currency.&lt;/p&gt;
&lt;p&gt;No worries though, the man happily shoves his hand into my wallet, takes the cash (all of the cash I had) and waves me into the Taxi.&lt;/p&gt;
&lt;p&gt;Welcome to China!&lt;/p&gt;
&lt;p&gt;In the taxi, I test out my esim + Wechat account, thankfully it works.
Feiyang helpfully informs me I&amp;rsquo;ve been ripped off, and that I should have got one of the official taxis, obviously.&lt;/p&gt;
&lt;h3 id="the-bund-choking-on-intestines" class="relative group"&gt;The Bund, choking on intestines &lt;/h3&gt;&lt;p&gt;We meet at the hotel, but head straight for the Bund to see the sights, and have dinner with her friend.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_bund_hu_14f11c8c80506ecf.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Meeting at the Bund in Shanghai"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_bund_hu_c8dc78c024cefae7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;First time seeing each other for 3 months&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The place is so crowded!
Every restaurant appears to require a booking (not sure why I&amp;rsquo;m surprised, London is the same), and the sea of people in and around the Bund is only broken by the occasional Chinese military sentry guard, standing like a statue on a plinth.&lt;/p&gt;
&lt;p&gt;At the hotpot, amongst many kinds of meat and veg, we ate some duck intestine.
Normally this would be fine, but my recent decision to get braces meant that I could no longer chew very well.&lt;/p&gt;
&lt;p&gt;So I swallowed it whole, or at least most of it.
The end bit got caught on a piece of my braces, leading me to perform the final act of a sword swallower and pull out the entire 30cm strand of intestine from my throat, with the accompanying gagging.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_street_hu_fd1a5a18f7ee86de.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Shanghai&amp;rsquo;s high street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_street_hu_24d75051ca655ed1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;On this street is a Huawei shop directly opposite Apple, selling totally-not-copied wares&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Great first impression with China, and Feiyang&amp;rsquo;s friend.
We went back to the hotel shortly afterwards, tired from the days events!&lt;/p&gt;
&lt;h3 id="china-or-europe" class="relative group"&gt;China or Europe? &lt;/h3&gt;&lt;p&gt;Day 2 we started with a coffee and croissant from the very European feeling old streets.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_old_street_hu_d3ef9b4f1833698.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Shanghai old streets"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_old_street_hu_2bc15c09ded15ea7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Shanghai or Europe?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Shanghai in general felt very westernised.
It was clear that it was somehow different to the rest of China, but we couldn&amp;rsquo;t quite put our finger on it.
The Bund was famously owned by various European trading companies, and it&amp;rsquo;s banks are lined with European inspired architecture, but aside from this there was also a slightly different feeling to the people there.
It might have something to do with the fact that Feiyang was asked twice if she was a model, so that made us feel quite cool.&lt;/p&gt;
&lt;p&gt;Checking out the Chenghuang temple area, we stopped for some lunch.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_chenghuang_temple_hu_46f65d0d6d2f9254.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Chenghuang"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_chenghuang_temple_hu_bfa9452713c92970.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This was a peculiar mix of very ancient religious temple, with a disney-esque commercial building, with tourist shops, buddhist temples and gold jewellery shops side by side.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_chenghuang_temple_bridge_hu_5b6f85f341a553b1.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Chenghuang bridge"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_chenghuang_temple_bridge_hu_d0c9794d591676ae.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Pretty bridge with a tea house in the middle&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Continuing with the European strangeness, I had my first experience with the Chinese nouveau riche as we had dinner in Xintiandi.
For those who don&amp;rsquo;t know, it&amp;rsquo;s basically like the Covent Garden / Mayfair of London, complete with Lululemon, On Running and DJI shops (to summarise our personalities).&lt;/p&gt;
&lt;p&gt;Not something I expected in such a recently wealthy country, but then again totally understandable.
This would continue to be a theme with all big cities we visited throughout China.
Luxury is IN.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_xintiandi_hu_2ec2e81bf238cd3d.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Xintiandi"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_xintiandi_hu_867be0005e8854dd.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Luxury is IN in China&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="oriental-pearl" class="relative group"&gt;Oriental Pearl &lt;/h3&gt;&lt;p&gt;Of course, no trip to Shanghai would be complete without the obligatory trip to the &lt;a href="https://en.wikipedia.org/wiki/Oriental_Pearl_Tower" target="_blank" rel="noreferrer"&gt;Oriental Pearl TV Tower&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_oriental_pearl_hu_94ce003be5922821.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Oriental Pearl Tower"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_oriental_pearl_hu_eb7e0c23d98c2226.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Built in 1995, the city has extended skywards around it.
Whilst it used to be a TV broadcast tower (back when TV was delivered by these large broadcasting antennae), it is now purely a tourist attraction, with a rotating restaurant, and weirdly misplaced arcade inside the red balls.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t realise this, but it is also designed to look very similar to a sort of sugary caramel street snack (balls on a stick).
I think I prefer the look of the building to the taste of this snack though.&lt;/p&gt;
&lt;p&gt;You can get some great views though!
Both looking out, and looking down&amp;hellip;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_skyscrapers_hu_1f2a06c41e1c267c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Looking out from Oriental Pearl"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_skyscrapers_hu_f014773c08ada0d4.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The pollution and skyscrapers extends as far as the eye can see, in all directions&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_oriental_pearl_looking_down_hu_ca2e73fc3bba1f71.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Looking down from Oriental Pearl"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_oriental_pearl_looking_down_hu_21b7a8ade66847f1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Why can&amp;rsquo;t all skyscrapers have glass floors?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Day 4, have you settled in yet?
Good.
Let&amp;rsquo;s go to the Capital.&lt;/p&gt;
&lt;h2 id="beijing" class="relative group"&gt;Beijing &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_to_beijing_train_hu_f395e9b9bff4ded7.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Train to Beijing"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/shanghai_to_beijing_train_hu_69c26cfadc333620.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Trains are quick in China, Shangahi to Beijing in &amp;lt; 5 hours&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="meeting-the-gfs-family" class="relative group"&gt;Meeting the GF&amp;rsquo;s Family &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_meeting_family_hu_8fc47835d98dd8cb.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2955"
 height="3940"
 class="mx-auto my-0 rounded-md"
 alt="Meeting the Family"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_meeting_family_hu_34921f036e02a9ef.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;We didn&amp;rsquo;t mean to stand in height order&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Isn&amp;rsquo;t he cold?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I had packed for a 6 week long beach trip, without first checking the weather in Beijing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s 14 degrees and I look like a complete mug in my shorts and birkenstocks.&lt;/p&gt;
&lt;p&gt;The language barrier is quite the challenge, but we seem to get along just fine as they drive us from the train station and around the city (past Tiananmen square and the Mao photo).
We stopped for a hearty meal then back to the parent&amp;rsquo;s district where Feiyang and I checked into a hotel opposite their flat.
Still easing in gently.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_suburbs_hu_120fae6f6b62e265.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Beijing suburbs"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_suburbs_hu_c89faf21db4cd175.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Awoke to the sound of military training&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;In the morning, we are accompanied to views of the sprawling suburbs of Beijing.
The expansiveness of Beijing drew parallels with Los Angeles in my mind.
The benefit to Beijing is that even though the easiest way to travel is by car, it at least has a functioning metro system.&lt;/p&gt;
&lt;p&gt;We are roughly 9 miles from central Beijing.
A mere 20 years ago this would have been right in the boonies, as evident by the remnants of farms and military training grounds nearby (we actually awoke to the sounds of horns and distant marching beats!)&lt;/p&gt;
&lt;p&gt;Nowadays however, this is prime commuter belt territory, and we took advantage of the tube system every day to get around.
Weirdly, I had to scan my passport to enter the tube!
Why?&lt;/p&gt;
&lt;h3 id="belt-and-road-summit" class="relative group"&gt;Belt and Road Summit &lt;/h3&gt;&lt;p&gt;Well, turns out the week we decided to come to Beijing was the week of the annual &lt;a href="https://www.bbc.co.uk/news/world-asia-china-67143322" target="_blank" rel="noreferrer"&gt;Belt and Road Summit, with Putin in attendance&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We would later find out that this high profile summit substantially changes Beijing for it&amp;rsquo;s duration.
For one, there was almost no pollution whatsoever (to later change).
For another, the security was &lt;em&gt;tight&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianmen_east_me_hu_5801e283f7b6c8a6.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="2944"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Qianmen East"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianmen_east_me_hu_5cfd27ce46b8f9a7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The yellow barrier in the background had passport checks&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianmen_east_hu_1f7054d221aa2851.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Qianmen East, other direction"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianmen_east_hu_208951caa8988ef.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;We were happy though!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This was our current issue - if you wanted to get anywhere near Tiananmen square, you needed to scan your identification, and even then you are not actually allowed in the square, designed to hold 1 million people.
Since 2021 you have needed to &lt;a href="https://english.beijing.gov.cn/latest/news/202111/t20211124_2543664.html" target="_blank" rel="noreferrer"&gt;book entrance to the square&lt;/a&gt;, to avoid the spread of &lt;del&gt;contrarian ideas&lt;/del&gt; COVID.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_guards_hu_85f6d348d3de8ae.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Guards"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_guards_hu_d9fcb81353c18ad8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;These guys were more tourist attraction than guards&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Given the fact that all museums and typical attractions were closed, we decided to spend the rest of the day visiting some of Feiyang&amp;rsquo;s favourite districts, and going shopping to get me some slightly warmer clothing.&lt;/p&gt;
&lt;p&gt;Getting a few rental bikes was very easy via WeChat, and I must say that Beijing offer some of the most comfortable cycling paths I&amp;rsquo;ve ever experienced from a major city!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_cycling_hu_b00852fcc7902d4e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3672"
 height="2066"
 class="mx-auto my-0 rounded-md"
 alt="Cycling in Beijing"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_cycling_hu_2dfa38e95a80e170.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Cycling is &lt;em&gt;fantastic&lt;/em&gt; in Beijing&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Not much else to note from our shopping trip, but it seems that Beijing may have accidentally hired too many reserve police for the week of the B+R Summit, we kept tripping over police cars and off duty officers.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_police_2_hu_9dedf28a6dd87c9f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Police on their break"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_police_2_hu_cb0c789d4fedcff4.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Uniqlo must be a national security risk&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="qianhai" class="relative group"&gt;Qianhai &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_street_trees_hu_669847810784c5d8.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Cycling to Qianhai"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_street_trees_hu_56d51361e41c081b.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Beijing was all a bit of a blur, but I do remember Qianhai as one of my favourite spots.&lt;/p&gt;
&lt;p&gt;A short cycle away from Tiananmen Square, it is a little region surrounding Jingshan park and Qianhai lake, where you can get lost amongst old traditional houses-turned-shops, before eventually winding up around the lake for unbeatable sunset views.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianhai_hu_60d786c7b94b195f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Qianhai"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianhai_hu_7b79f4ab00ca4e45.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Secluded canal walk to the lake&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianhai_above_hu_472d56693506dfda.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Qianhai Lake"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_qianhai_above_hu_70007f127b2c753e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;A great place to have a cocktail and watch the sun set&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;We met up with another of Feiyang&amp;rsquo;s old friends here for hotpot, this time I didn&amp;rsquo;t make a fool of myself, but some fascinated locals seemed to want to try out their broken English with me - they say they hadn&amp;rsquo;t met a white person before.
I called bull, even as I realised I also hadn&amp;rsquo;t seen another westerner since leaving Singapore.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_hotpot_hu_db19a160361e6292.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Beijing Hotpot"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/beijing_hotpot_hu_6c9c15a8c9b0be97.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Traditional Beijing Hotpot&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;By this point in the trip, we&amp;rsquo;ve finally hit the weekend and Feiyang&amp;rsquo;s parents have promised they would take us on a trip out of town!
So we hop in the car for a few hours drive.
I&amp;rsquo;m starting to worry about Feiyang&amp;rsquo;s Dad&amp;rsquo;s driving.
She gets her good eyesight from him, and he was making full use of the hard shoulder in each traffic jam.
We eventually made it though.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_in_car_hu_8cadd6238cfed3cd.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Driving to Gubei"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_in_car_hu_5aabf7babc9f532.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m completely clueless about what to do around here so I didn&amp;rsquo;t even know the name of the place, but later found out we would be spending some evenings in Gubei Water Town!&lt;/p&gt;
&lt;h2 id="gubei-water-town" class="relative group"&gt;Gubei Water Town &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_gate_me_hu_b8a65293ac922e7c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Gubei Water Town entrance"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_gate_me_hu_d7125e5c10a4ce9d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Traditional looking entrance, with a Starbucks inside. Highly recommend the Black Tea Soy Latte.&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.gubeiwatertown.com" target="_blank" rel="noreferrer"&gt;Gubei Water Town&lt;/a&gt; was probably one of my favourite places I visited in China.&lt;/p&gt;
&lt;p&gt;I know, that&amp;rsquo;s a bit of an uninspiring statement, since it&amp;rsquo;s all quite artificial, but there was something about it I really enjoyed.
As far as I know, the town is not actually a historical water town, but a replica of the Wuzhen Water Town from the south of China, and &lt;em&gt;only&lt;/em&gt; around 500 years old.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s not just some quaint old village.
The whole place has been converted to house discreet museums, tea houses, restaurants, activities and hot springs in amongst the ancient streets.
Maybe it was more surprising for me since I couldn&amp;rsquo;t read any of the maps.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_boat_under_bridge_hu_1aec0b8d008aff7f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Boat under a bridge at Gubei"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_boat_under_bridge_hu_9ff95f610c1ea2c7.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Willow trees enchant this village&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Not least, I loved it because it was just so beautiful!
We were visiting in Autumn, and the red leaves and crisp air yielded some great sights.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_tower_hu_67e92ffe79d5c703.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Gubei Tower"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_tower_hu_edb99a3193e4e98d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Never did end up hiking to this tower, but I think it was smaller than it appeared&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_family_hu_ba1275eaea9a679e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2800"
 height="4198"
 class="mx-auto my-0 rounded-md"
 alt="Feiyang and the Wang family"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_family_hu_f5facb17259cb740.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Wangs&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_me_hu_c4ff857f644e7b0f.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Me in Gubei"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_me_hu_7a60c59c25ee6415.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Me in Gubei&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_smol_cat_hu_dac4af59c89d42a7.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Smol Cat in Gubei"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_smol_cat_hu_cce27bb2e3926b57.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;We even found some smol cats&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="cultural-site" class="relative group"&gt;Cultural Site &lt;/h3&gt;&lt;p&gt;Once we peeled our eyes away from the colourful trees, we ended up stumbling into a few of the town&amp;rsquo;s cultural heritage sites.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_feiyang_hu_679c2245c81b0bea.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2600"
 height="3467"
 class="mx-auto my-0 rounded-md"
 alt="Yongshun Dye House"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_feiyang_hu_f08f1118d95233c2.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Yongshun Dye House was 90% instagram hotspot, 10% museum&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A bit ashamed to admit I took almost no photos of the ancient textiles factory, alcohol distillery, replica villagers house or the public traditional chinese theatre.
You just have to trust me that they existed, and were really interesting, I promise.&lt;/p&gt;
&lt;p&gt;I do however have this one &lt;strong&gt;sick&lt;/strong&gt; photo of me surprising everyone at archery.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_archery_me_hu_a045ead6b6afe468.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Me mastering archery"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_archery_me_hu_b113dea3ea414de8.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;If you look really closely, you can see my concentration face. If you look even closer you can see my opponent on the left was not impressed&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Whilst I&amp;rsquo;m not actually much good at it, I at least wasn&amp;rsquo;t useless, which can only be a welcome surprise for the people who have watched me choke on hotpot and fail to converse in basic sentences with them for the last week.&lt;/p&gt;
&lt;h3 id="great-wall" class="relative group"&gt;Great Wall &lt;/h3&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_2_hu_645039ea67d599a0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="The Great Wall"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_2_hu_8d461bf26a10670.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;長城&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been looming over us since we arrived in Gubei.&lt;/p&gt;
&lt;p&gt;長城, &lt;em&gt;Changcheng&lt;/em&gt;, Great Wall.&lt;/p&gt;
&lt;p&gt;You hear about it so much, &amp;ldquo;it can be seen from space&amp;rdquo;, &amp;ldquo;500,000 people died building it&amp;rdquo;, &amp;ldquo;the locals dismantled it to build houses&amp;rdquo;.
It feels like it should be a pilgrimage, an arduous trek up a mountain to touch this world wonder.&lt;/p&gt;
&lt;p&gt;Nah, turns out you can just take a cable car right to the top!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_family_hu_e95fc29110c67383.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="The Wangs on the Great Wall"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_family_hu_f1d0a3d722e76e7f.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The views were incredible, but this stretch of the Great Wall (Simatai) is not particularly long.
You find yourself cut short, unable to go beyond a few of the towers, beyond which the wall returns back to a ruinous state.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_5_hu_2c44851f7d91d365.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Great Wall again"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_great_wall_5_hu_49e908f419e0d37e.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I stared at this view for ages, trying to sear it into my memory&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="hot-springs" class="relative group"&gt;Hot Springs &lt;/h3&gt;&lt;p&gt;In the evening, we returned back to Gubei and decided to visit one of the Hot Spring baths.
By this time the temperature had plunged to ~3 degrees.&lt;/p&gt;
&lt;p&gt;I had been to a few of these places before, I remember the &lt;a href="https://szechenyibath.com" target="_blank" rel="noreferrer"&gt;Széchenyi&lt;/a&gt; baths in Budapest, a vast hot pool to fit hundreds of people.
When I last visited, the air was -15C, with the steam from the baths causing my towel to freeze solid.&lt;/p&gt;
&lt;p&gt;These baths were much smaller and, calmer.
There were maybe 10 small pools indoors and one outdoors, all at varying temperatures between 33 and 46 degrees, with varying mineral content.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m less used to this, so whilst Feiyang and her family jumped straight into the hottest one, I took my time to work my way up.
I don&amp;rsquo;t want to feel like the boiling frog!&lt;/p&gt;
&lt;p&gt;The view from the outside pool was mesmerising.
I don&amp;rsquo;t know how, but these city planners had managed to cram an LED into every single nook and crevice of each stone wall of Gubei.
The results were astonishing, with the already-too-good-to-be-true town transforming into a movie set overnight!&lt;/p&gt;
&lt;p&gt;I wish I took photos, but my phone was dead by this point, so you&amp;rsquo;ll have to do with &lt;a href="https://letmegooglethat.com/?q=gubei&amp;#43;water&amp;#43;town&amp;#43;lights&amp;#43;at&amp;#43;night" target="_blank" rel="noreferrer"&gt;what everyone else has already taken&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It might seem a bit touristy (and it is), but I&amp;rsquo;d recommend giving Gubei a visit if you have a bit too much time in Beijing.
It&amp;rsquo;s a remarkably calming place.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_parents_hu_f3fa4484edcd1bbf.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Wangs in Gubei"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/04/mini-sabbatical-1-shanghai-to-beijing/gubei_parents_hu_7782a3e907da8b60.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>🤔 Reflecting on 3 months living and working in Singapore</title><link>https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/</link><pubDate>Wed, 07 Feb 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/</guid><category>Thoughts</category><category>The 'Mini Sabbatical'</category><description>What I learned from my time working and living in the city-state of Singapore</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="preconception" class="relative group"&gt;Preconception &lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Disneyland With the Death Penalty&amp;rdquo;
William Gibson - &lt;a href="https://www.wired.com/1993/04/gibson-2/" target="_blank" rel="noreferrer"&gt;Wired, 1993&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/marina-top-down_hu_fff6861a52739ba3.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Marina Bay Sands aerial view"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/marina-top-down_hu_da7f876013794b75.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;A billionaire&amp;rsquo;s playground&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;An often quoted metaphor, that draws responses from both crowds.
&amp;ldquo;I like Disneyland, whats not to like about that?&amp;rdquo;, &amp;ldquo;That&amp;rsquo;s kinda dystopian&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;The country has progressed quite a bit in the 30 years since that was written, but it still echoes throughout general sentiment.&lt;/p&gt;
&lt;h2 id="arrival" class="relative group"&gt;Arrival &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/police-bot_hu_691f45af2366a71c.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1828"
 height="2437"
 class="mx-auto my-0 rounded-md"
 alt="Police robot"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/police-bot_hu_5195b86d19e53baa.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Greeted by robocop&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I landed in Singapore on Monday, 1st August.
I was supposed to originally fly out a week prior, but delayed it due to having already booked tickets with my Dad to see our first ever Formula E (it’s a strange sport, we were sat inside! The races don&amp;rsquo;t last particularly long, but give it a few more years and I could see it taking on Formula 1!)&lt;/p&gt;
&lt;p&gt;Heathrow was… Heathrow-ish?
I checked in a bit early and had a few hours to kill, which I duly spent eating a microwaved fish and chips in the overcrowded Wetherspoons at Terminal 5.
Anyway, premium economy was nice - I never realised you could have metal cutlery and wine on a plane!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/changi-jewel-2_hu_1af5d771367bee14.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Changi Airport"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/changi-jewel-2_hu_c965ac0060c902a3.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The airport of the country is synonymous with the country itself&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;For those who haven’t yet experienced it, let me tell you, Singapore Changi airport is in a league of its own!
It’s a masterpiece of architecture and dignified travel, and almost unimaginable to the average european flier.&lt;/p&gt;
&lt;p&gt;Not that I got to see much of it, as my work-booked taxi driver whisked me away immediately on arrival, a mere 20 or so minutes after landing the plane!
I almost fail to appreciate this comfortable efficiency, that will come to become thematic of my overall experience of this new country.
I ask my driver how he finds Singapore.
He says he loved his 30 years in residence, besides some feedback for the weather, and recommends a few touristy activities for me to try out once I settle in.
We cross the nation in 25 minutes.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/skyscrapers_hu_d8cd73d274216377.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Skyscrapers"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/skyscrapers_hu_a33ecb1e3c37c9c9.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Commute from the hotel to the office was 100 metres&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/raffles-skyscrapers_hu_d0ce8da04ae51b7b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Raffles Place Skyscrapers"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/raffles-skyscrapers_hu_a0ea39053872cbcc.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The financial hub&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;My base for the next 90 days is Raffles place, the original British landing site and previous colonial centre point of South East Asia.
I find it fitting for my first foray into this part of the world.&lt;/p&gt;
&lt;p&gt;After checking in and generally gawking at my new hotel, I enthusiastically change into a pair of shorts, text a co-worker-friend and head out for a few drinks to meet the rest of the crew I’ll be working with.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/chijmes_hu_52a91fe14a150fe8.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Chijmes"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/chijmes_hu_e6be4b9c113fabc5.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Chijmes is a fun area for drinks, but I spent most time at Boat Quay&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="the-weather" class="relative group"&gt;The Weather &lt;/h2&gt;&lt;p&gt;I had been warned “you’ll be sweating after 5 minutes outside, and frozen after 5 minutes inside”, so I had packed a mix of shorts, trousers and hoodies.
As it turns out, I was quite comfortable with both, as long as I didn’t move too much outside, or sit too still inside.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/monkey_hu_576b82a3d5a28093.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Monkey"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/monkey_hu_8ada2435f7d0a636.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Monkeys are everywhere around MacRitchie, apparently they steal Koi fish from nearby house&amp;rsquo;s ponds&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/lizard_hu_aad050db3148e776.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="Lizard"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/lizard_hu_71102d1426a0ad4d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Lizards are rarer, but can still be found around the botanical gardens&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/cicada_hu_77130a27f5ee7954.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3456"
 height="5184"
 class="mx-auto my-0 rounded-md"
 alt="Cicada"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/cicada_hu_e311e4e398710b3d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Cicadas are heard (read: will drive you insane), but rarely seen&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/strangling-fig_hu_f82f6e0a06b6606e.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Strangling Fig"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/strangling-fig_hu_c69dc2baa39cb76a.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;These trees feel almost mystical, just wish they would grow more in Europe&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;On my second weekend I attempted the &lt;a href="https://beta.nparks.gov.sg/visit/parks/central-catchment-nature-reserve/activities/hiking-nature-walk" target="_blank" rel="noreferrer"&gt;MacRitchie Reservoir&lt;/a&gt; hike - a 10km hike around one of the few naturally forested areas left in the centre of the island.
I highly recommend giving this a go if you visit, as you’ll be tripping over cicadas, frogs, monkeys, turtles, strangling figs and a whole host of other interesting flora and fauna.
However, do go with a lot of water, sun cream, bug spray and very breathable clothing!
My first naïve hike was performed in a cotton shirt and shorts and, by the end of it, I might as well had swam through the reservoir instead.&lt;/p&gt;
&lt;p&gt;A quick trip to Uniqlo fixed that, and I was lightly draped with breathable, practically disposable clothes for the remainder of my time there.
If you are coming from a Northern European country, I’d probably recommend bringing 2 days worth of clothes with you, and just buy whatever you need once you arrive.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/yoga_hu_608f0aac907de288.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Yoga"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/yoga_hu_8a4c5b30a3930a00.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Top tip: Sunrise yoga at the top of Marina Bay Sands is almost the same price as the normal ticket&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A few weeks into my stay, I thought I’d try and take up running again.
I figured the consistent 7am-7pm sunlight hours worked well with my optimistic morning jog + dip-in-the-pool-to-cool-off routine.
The challenge (besides my pathetic fitness level) is to run as far as you can before the sun really starts to shine and you become too dehydrated to walk straight.
Realistically I only did this just under 20 times, but I loved it, and made some noticeable health improvements whilst out there.&lt;/p&gt;
&lt;h2 id="the-government" class="relative group"&gt;The government &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/city-planning_hu_832a1e7e90506838.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="City Planning Museum"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/city-planning_hu_36a03d863364b9b1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Best museum in Singapore&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a sucker for a good museum.
I also love a well planned urban environment.&lt;/p&gt;
&lt;p&gt;As a consequence, it turns out I &lt;em&gt;really&lt;/em&gt; loved the &lt;a href="https://www.ura.gov.sg/Corporate/Singapore-City-Gallery" target="_blank" rel="noreferrer"&gt;Singapore City Gallery&lt;/a&gt;!
I spent &lt;strong&gt;hours&lt;/strong&gt; reading every little plaque about various iterative designs for how to use the reclaimed land on the south side of the island.
Where waste goes, how they ensure energy and water security, to how they plan for the fittingly named &lt;a href="https://education.nationalgeographic.org/resource/urban-heat-island/" target="_blank" rel="noreferrer"&gt;Urban Heat Island Effect&lt;/a&gt;, I am just continuously in awe at it all.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/ufo-supreme-court_hu_582164d299cb2412.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Singaporean Supreme Court"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/ufo-supreme-court_hu_cdd3b69baa1eab28.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The Supreme Court building looks as if a UFO landed on top&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always liked the idea of re-attempting a stint at Architecture (I originally went to visit my old university for an architecture open-day, before giving up and enrolling in computer science for the good old fashioned employment prospects).
So for anyone interested in a similar thing - I recommend this museum.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href="#the-food-and-activities"&gt;The food and activities&lt;/a&gt; for more recommendations.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/hawker_hu_818ae7b8c9e10b47.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Hawker Centre"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/hawker_hu_48105f7818b68e2f.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;You reserve a seat at a hawker centre by placing a packet of tissues, this is some strange unspoken rule&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Also - NO CRIME!
The European mind can hardly comprehend this, but you can genuinely accidentally leave your laptop in a cafe, and have full confidence it will still be there by the time you come back, hours later.
There is no vandalism, and consequently there are actual public amenities available.&lt;/p&gt;
&lt;p&gt;The point here is, you don&amp;rsquo;t get this kind of stuff without a good amount of support from the people running the country.&lt;/p&gt;
&lt;p&gt;Whilst &amp;ldquo;From third world to first&amp;rdquo; is still on my reading TODO list, I left with much more confidence in the competence of the government than I&amp;rsquo;ve ever got from living in the UK or the US.&lt;/p&gt;
&lt;h2 id="the-people" class="relative group"&gt;The people &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/arab-st_hu_3195d3f8023555c6.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Arab Street"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/arab-st_hu_9231a8cd0152f4e3.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Arab street is effectively a street of bars next to a Mosque&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;A bit of a weird topic to reflect on, but I&amp;rsquo;ve found that any time I move somewhere for a while, I notice &lt;em&gt;something different&lt;/em&gt; about the people I am surrounded by.
So I thought it&amp;rsquo;s worth spending a bit of time reflecting on that.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/shopping-centre_hu_b3dd623b05cf0fd5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Shopping Centre"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/shopping-centre_hu_e39042ba6c12e09c.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Shopping is a national pastime&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Of course, Singapore is more of an international transitory city than a closed-off city.
A solid half of everyone I met was an immigrant, but they never seemed to feel &amp;ldquo;out of place&amp;rdquo; (aside from the construction/cleaning workers, who all appeared to be shuttled in to the country on the back of open roof vans every day).
You can notice a great variety in the locals between Little India and Chinatown, but on the whole they seem to follow a few patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They are typically quite wealthy (I never met ay of &amp;ldquo;the help&amp;rdquo;, but I heard many people talking about how they hire &amp;ldquo;help&amp;rdquo;)&lt;/li&gt;
&lt;li&gt;They are very kind&lt;/li&gt;
&lt;li&gt;They respect their community, and in general have a deep appreciation of their Country&lt;/li&gt;
&lt;li&gt;They are very social, also amongst &amp;ldquo;co-workers&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;This was an interesting realisation, but I found myself hanging out with co-workers on the weekend quite quickly in Singapore, whereas that is less of a cultural norm in London (or perhaps that&amp;rsquo;s just a reflection on me!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/temple_hu_3119467b221e6a99.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Temple"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/temple_hu_e79739f5966bd423.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Beautifully colourful Hindu temples&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Honourable mention of course also goes out to my parents and my friends who came over to stay or travel with me for a few weeks.&lt;/p&gt;
&lt;h2 id="the-work" class="relative group"&gt;The work &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/buildings_hu_3e1317c5e2e825c2.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Buildings"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/buildings_hu_cb772251524e62d.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I didn&amp;rsquo;t work in this building, but they do all blur into one&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Ah yes, that thing&amp;hellip; the reason I was sent to Singapore&amp;hellip;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be honest, the work was more difficult than I originally imagined.
I was sent over with a vague mission of &amp;ldquo;improve &amp;lt; insert general description of company problem here &amp;gt;&amp;rdquo;, and seemingly the only resource available to me was my own time.
To make matters worse, the Singapore office of my company is less than one-fifth the size of the London headquarters, and is primarily a sales/marketing outpost, with only a handful of full time Engineers.
In summary, it is a satellite office with no engineering leadership.&lt;/p&gt;
&lt;p&gt;As a result, I emphatically struggled to progress most of my initiatives I tried to introduce, which was a strange new frontier for me to encounter.
In London, I can generally have confidence in relying on a support network of peers all around the org chart to progress or bounce ideas off of for a new initiative, and people are welcoming to trying new ideas.
In Singapore, we required &amp;ldquo;consensus&amp;rdquo; and &amp;ldquo;approval from management&amp;rdquo; (read: London&amp;rsquo;s approval) to do anything.
This is strange to me, as this was even in domains wholly owned by the team out in Singapore.&lt;/p&gt;
&lt;p&gt;Furthermore, there was much less of a culture of challenging decisions.
I&amp;rsquo;m quite happy to have my ideas challenged, as long as the approach is logical, and in return I&amp;rsquo;m quite happy with raising my objections to an idea if I think it is logically flawed.
However, in the team I was placed in Singapore, this just was not happening.
I&amp;rsquo;m yet to fully rationalise why that is.&lt;/p&gt;
&lt;p&gt;The other side to the work was working on-call.
This has it&amp;rsquo;s ups and downs, but in general was just a bit of a drain on energy.&lt;/p&gt;
&lt;p&gt;Overall, I liked the general vibes of working out in Singapore, but if I come again I would try and work for a company who:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is focused on engineering/development in Singapore&lt;/li&gt;
&lt;li&gt;Is either headquartered in Singapore, or has strong leadership presence.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-food-and-activities" class="relative group"&gt;The food and activities &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/f1-bridge_hu_57c628d1ebf3806b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="5184"
 height="3456"
 class="mx-auto my-0 rounded-md"
 alt="F1"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/f1-bridge_hu_14b884d016ca9edc.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;My first F1 experience was unforgettable!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;This point is almost too obvious to mention, but I LOVED the variety and quality of food, and the general atmosphere.&lt;/p&gt;
&lt;p&gt;I was staying by the Marina Bay, and a common &amp;ldquo;first day&amp;rdquo; activity when someone would visit was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take the MRT to Gardens by the Bay&lt;/li&gt;
&lt;li&gt;Go to the Cloud Forest&lt;/li&gt;
&lt;li&gt;Watch the &amp;ldquo;super tree&amp;rdquo; light show&lt;/li&gt;
&lt;li&gt;Walk through the Marina Bay Sands hotel and shopping centre&lt;/li&gt;
&lt;li&gt;Watch the Marina Bay light and fountain show&lt;/li&gt;
&lt;li&gt;Either go left, and check out whatever festival is being ran in the car park&lt;/li&gt;
&lt;li&gt;Or go right, and watch some free outdoor concert&lt;/li&gt;
&lt;li&gt;Walk around the F1 track&lt;/li&gt;
&lt;li&gt;Either go past the Fullerton, towards Lau Pa Sat. Or past Raffles, towards any one of the other hawker markets for some dinner.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/supertree-light-show-3_hu_f56143863dcd19a0.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Supertree Light Show"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/supertree-light-show-3_hu_7f1b33c722d1e508.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The light show runs 3 times a night&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;I did this so many times, and never tired of it!&lt;/p&gt;
&lt;p&gt;I won&amp;rsquo;t go into too much detail, but if you&amp;rsquo;re even remotely interested in architecture, museums, hikes, or eating and drinking, I&amp;rsquo;d highly recommend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ura.gov.sg/Corporate/Singapore-City-Gallery" target="_blank" rel="noreferrer"&gt;Singapore City Gallery&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Obviously, I already mentioned this earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gardensbythebay.com.sg/en/things-to-do/attractions/cloud-forest.html" target="_blank" rel="noreferrer"&gt;Cloud Forest / Flower Dome&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Worlds tallest indoor waterfall. This was my very first stop, and I ended up going back here 3 more times just for the sheer beauty of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.laupasat.sg" target="_blank" rel="noreferrer"&gt;Lau Pa Sat&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I must have visited almost every stall here during my stay. I&amp;rsquo;m also a big fan of the big fans.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gardensbythebay.com.sg/en/things-to-do/calendar-of-events/garden-rhapsody.html" target="_blank" rel="noreferrer"&gt;Garden Rhapsody&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;free light show&lt;/strong&gt;, &lt;strong&gt;every day&lt;/strong&gt;! Such a nice atmosphere, you lay on the warm ground and look up at the lights.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jewelchangiairport.com/en/attractions/forest-valley.html" target="_blank" rel="noreferrer"&gt;The Jewel Changi&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;The waterfall is the big attraction, but just look at all those Orchids! The butterfly park and the walking net are the cherry on top.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.marinabaysands.com/attractions/sands-skypark.html" target="_blank" rel="noreferrer"&gt;Marina Bay Sands&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;The building synonymous with Singapore goes without saying, but did you know you can also go for morning yoga for only 5 SGD more?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mountfaberleisure.com" target="_blank" rel="noreferrer"&gt;Henderson Waves / Cable Car&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;One is a bridge, one is a cable car. Neither are museums, but both are very pretty!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.judiciary.gov.sg/discover-the-courts" target="_blank" rel="noreferrer"&gt;The Supreme Court&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t think you can visit - but it looks like a UFO landed on a building&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://atlasbar.sg" target="_blank" rel="noreferrer"&gt;Atlas Bar&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;BEAutiful art-deco style bar. Just don&amp;rsquo;t try and enter in shorts and Birkenstocks like I did. They don&amp;rsquo;t like it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.raffles.com/singapore/" target="_blank" rel="noreferrer"&gt;Raffles Hotel&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;It sits on 1 Beach Road and is absolutely iconic of colonial Singapore. Just remember to go to the &lt;strong&gt;writers bar&lt;/strong&gt; and not the &lt;strong&gt;long bar&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chijmes.com.sg" target="_blank" rel="noreferrer"&gt;Chijmes&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;Strange one, it&amp;rsquo;s a food court around an old church. Similar ish to &lt;a href="https://mercatometropolitano.com/mercato-mayfair/" target="_blank" rel="noreferrer"&gt;Mercato Mayfair&lt;/a&gt; in London.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.1-arden.sg" target="_blank" rel="noreferrer"&gt;1-Arden&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;I stayed in this building, and would occasionally go to the top of the 51st floor to admire the field of boats stretching out into the distance, or to just watch the Marina light shows whilst enjoying a drink.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The list could go on, but I&amp;rsquo;m getting nostalgic now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, I&amp;rsquo;d be happy to go back!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/clarke-quay_hu_1acbd8847d3033c9.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3840"
 height="2160"
 class="mx-auto my-0 rounded-md"
 alt="Clarke Quay"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/clarke-quay_hu_2df6200bd3933bc4.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Clarke Quay, and Boat Quay are the night life capitals - expensive drinks and easy acquaintances can be found here!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/lau-pa-sat_hu_d1600fb5e50f31fa.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Lau Pa Sat"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/lau-pa-sat_hu_d3fa61536cc81f71.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Lau Pa Sat, hands down the best hawker centre in Singapore&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/green-skyscraper_hu_267cbae6d0c126b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Green Skyscraper"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/green-skyscraper_hu_d3826764626a5435.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Singapore has some amazing green skyscraper planning restrictions - leading to skyscrapers that have an entirely foliage facade!&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/old-vs-new_hu_1cc2bd6da9e4edd5.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Old vs new buildings"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/old-vs-new_hu_70467e4a8e443002.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Singaporean public housing is indistinguishable from private. Here is their most impressive one, overshadowing some traditional terraced houses&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/park-plaza_hu_3c181f44d257e582.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Park Plaza"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/park-plaza_hu_4854f40655614ca1.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;More green skyscraper laws produced this - an architectural marvel that triples its original footprint with new green spaces&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/raffles-hotel_hu_3db14122212fc99b.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Raffles Hotel"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/raffles-hotel_hu_156a06a3bea16327.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Raffles Hotel. Singaporean sling is overpriced, but the Writers bar is worth visiting&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/sunset-at-fullerton_hu_ebb3e46d64f910a7.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Sunset at Fullerton"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/02/reflections-on-singapore/sunset-at-fullerton_hu_a14b45e364b7506b.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Sunset from the terrace at the Fullerton hotel&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>📉 Inflation adjusted net worth/salary spreadsheet</title><link>https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/</link><pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/</guid><category>Data</category><category>Personal Finance</category><description>Money ain&amp;rsquo;t what it used to be</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can copy the following spreadsheet and play around with the data yourself:
&lt;a href="https://docs.google.com/spreadsheets/d/1ZdCkdBwqU7dHfWr3AUOXHwwyKrXEODSAca4LGXAxuOg/edit?usp=sharing" target="_blank" rel="noreferrer"&gt;PUBLIC: Inflation adjusted personal finance&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you, like me, enjoy watching &lt;em&gt;number go up&lt;/em&gt; graphs, then you&amp;rsquo;ve probably also got some method of tracking basic financial metrics in a spreadsheet, or via some other sort of means.&lt;/p&gt;
&lt;p&gt;Well, we are but simple creatures, and we do like to see &lt;strong&gt;number go up&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The thing is, the last few years have been a bit more, shall we say, &lt;em&gt;tricky&lt;/em&gt; than normal years.
The swinging 20&amp;rsquo;s have been at it again, with the following bargain bucket of little bombs being dropped on the economy in the last 4 years:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Global Pandemic&lt;/li&gt;
&lt;li&gt;Climate Emergency&lt;/li&gt;
&lt;li&gt;Russo-Ukraine War&lt;/li&gt;
&lt;li&gt;China-Taiwan escalation&lt;/li&gt;
&lt;li&gt;Various shipping route disruptions&lt;/li&gt;
&lt;li&gt;AI hysteria (this one has barely begun)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, this spells for an atypical combination of over-demand and supply-restriction, that has lead to fairly shocking inflation figures in much of the world.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/uk-cpi-inflation-30y_hu_d577542a4c732438.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1804"
 height="766"
 class="mx-auto my-0 rounded-md"
 alt="UK Inflation Data 1993-2023"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/uk-cpi-inflation-30y_hu_b09af3277ffbd497.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;UK Inflation Data for the last 30 years. Source: &lt;a href="https://www.ons.gov.uk/economy/inflationandpriceindices/timeseries/l55o/mm23" target="_blank" rel="noreferrer"&gt;ons.gov.uk&lt;/a&gt;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Whilst this is not entirely random on the scale of human history, this is certainly my first experience of meaningful inflation, and it coincides just nicely with the beginning of my professional career, so I&amp;rsquo;m left feeling a bit like Harold here.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/inflation-hurts-my-friend_hu_9f375a83117044f4.jpeg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1753"
 height="1668"
 class="mx-auto my-0 rounded-md"
 alt="A man who received a 3% now cries about runaway inflation"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2024/01/inflation-adjusted-spreadsheet/inflation-hurts-my-friend_hu_e2b31b3896c6fe21.jpeg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;My thoughts exactly. Credit to &lt;a href="https://lizfarmer.substack.com/p/inflation-is-ruining-everything" target="_blank" rel="noreferrer"&gt;Liz Farmer&lt;/a&gt;&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m so unused to this, I thought I would humble myself and rebase my personal finance tracking, by inflation-adjusting all net-worth and salary data.
The results were very insightful and only a little bit disheartening.&lt;/p&gt;
&lt;p&gt;Now you can too!&lt;/p&gt;
&lt;p&gt;The spreadsheet below allows you to calculate your own inflation adjusted data, however it is very UK focused, and I&amp;rsquo;m not entirely convinced my maths is correct, but it should be good-enough to grok whether you are on the right track or not.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1ZdCkdBwqU7dHfWr3AUOXHwwyKrXEODSAca4LGXAxuOg/edit?usp=sharing" target="_blank" rel="noreferrer"&gt;Google Sheets PUBLIC: Inflation adjusted personal finance&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All you need to do is copy the sheet to your own drive, and modify data under &amp;ldquo;Net Worth&amp;rdquo;.
It will calculate your real-term (inflation adjusted) YoY (Year over Year) percentage growth.
If you wish, you can even repurpose the data by replacing it with your salary!&lt;/p&gt;
&lt;p&gt;This is probably slightly more depressing, as salary is sadly not cumulative.&lt;/p&gt;
&lt;p&gt;And before you ask, no, these figures do not reflect my personal finances.
I wish life were that simple.&lt;/p&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ons.gov.uk/economy/inflationandpriceindices/timeseries/l55o/mm23" target="_blank" rel="noreferrer"&gt;Office for National Statistics UK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>🤔 Setting up for a Mini Sabbatical</title><link>https://jamesjarvis.io/posts/2024/01/mini-sabbatical-setup/</link><pubDate>Wed, 17 Jan 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/01/mini-sabbatical-setup/</guid><category>Thoughts</category><category>The 'Mini Sabbatical'</category><description>Preparing for 117 days living, working and travelling in South East Asia</description><content:encoded>&lt;p&gt;This is part of the &lt;strong&gt;mini-sabbatical&lt;/strong&gt; series.
Read more &lt;a href="https://jamesjarvis.io/tags/mini-sabbatical/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="why" class="relative group"&gt;Why? &lt;/h2&gt;&lt;p&gt;Why bother?&lt;/p&gt;
&lt;h3 id="meeting-the-girlfriends-family" class="relative group"&gt;Meeting the girlfriend&amp;rsquo;s family &lt;/h3&gt;&lt;p&gt;By September 2023 it would have been ~2 years since I started dating my girlfriend, so I thought it was about time I said hi to her parents!
To complicate matters, her family were still in Beijing, China.&lt;/p&gt;
&lt;p&gt;I still wanted to meet them of course, and wanted to make this a priority for 2023 (along with learning a toddler&amp;rsquo;s level of Mandarin, which I unfortunately failed).
So became the goal of &amp;ldquo;meet the family&amp;rdquo;!&lt;/p&gt;
&lt;h3 id="rebound-from-grief" class="relative group"&gt;Rebound from grief &lt;/h3&gt;&lt;p&gt;In December 2022, I was quite heavily affected by the passing of my Grandmother, after her long and exhausting battle with Bone Cancer.
Those who knew us knew how close we were, and her passing seriously rocked my emotional foundations, in addition to that of my family.&lt;/p&gt;
&lt;p&gt;I try to make sure I take away at least one maxim from each fundamental moment or figure in my life.
From my Nan, these were innumerable, but to pick a few:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you think something is wrong, check it &lt;strong&gt;now&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This goes without saying, if you suspect you have a health condition, act on it &lt;strong&gt;immediately&lt;/strong&gt;.
It may never just &amp;ldquo;go away&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Do what you have to do, then do what you want to do.
&lt;ul&gt;
&lt;li&gt;Something that was barked a lot at me as a kid, primarily about homework.
I feel it has it&amp;rsquo;s own renewed value in an age of such easy distractions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;ldquo;At least I had a go&amp;rdquo;
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;ll never forget this quote, it&amp;rsquo;s the kind of thing I wish we could all say when we look back on our lives.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stay independant.
&lt;ul&gt;
&lt;li&gt;My Nan&amp;rsquo;s husband passed away 30 years before she did, but she never let this slow her down and she continued travelling, making memories and friends well into her eighties.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Be friendly, and keep your friends close.
&lt;ul&gt;
&lt;li&gt;I have never seen a funeral so full of friends, sharing such amazing memories.
My Nan had this innate ability to form a bond with anyone, no matter how brief the first contact.
Every Christmas her house would be decorated with a hundred cards, from friends all over the world.
Almost every day up until she passed, she would be on the phone or having tea with another.
I even remember being shocked at how she could stay in contact with a couple she had met whilst on a cruise, 20 years prior!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After her passing, I did feel a bit empty.
The impact on me was nothing compared to my parents, and I&amp;rsquo;m aware my actions have been extremely selfish in contract, just another character flaw I&amp;rsquo;m working on.&lt;/p&gt;
&lt;p&gt;Given this, I needed some time to reflect, and to make some more memories and friends of my own.
So with me, I packed a diary, and I designated 2023 as a year of &amp;ldquo;learning&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="depressurising-from-work" class="relative group"&gt;Depressurising from work &lt;/h3&gt;&lt;p&gt;From August 2022 to June 2023, work became insanely busy, with a sequence of &amp;ldquo;death march&amp;rdquo; mismanaged development cycles that sucked a lot of the spare energy out of me, as I tech-lead two large streams of work.
We seemed to have this concept of the &amp;ldquo;hero developer&amp;rdquo; at the company I worked, who could/would work tirelessly to deliver an almost impossible feat of code-smashing.
Each time we burn out a &amp;ldquo;hero&amp;rdquo; we say to ourselves &lt;code&gt;woah that was crazy, we can't do that again!&lt;/code&gt;, but somehow we always repeat the same mistake.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure many other companies suffer the same delusions.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t necessarily an entirely bad thing, during these crunch time periods the rate of learning is dramatically increased (partially due to the rate of mistakes also increasing), and you have the ability to grow much stronger professionally, having survived these challenges.&lt;/p&gt;
&lt;p&gt;The problems can come when you fail to sufficiently separate work and life, leading to work encroaching on the precious sanctuary of your personal life.
I unfortunately saw this happening to me, so I put my foot down and started planning for a period of time where I deliberately remove myself from this style of work for a bit.&lt;/p&gt;
&lt;p&gt;Having now come back from this trip, several people at my work have come up to me expressing how much they want to do the same - some have even put plans in motion to do so!
So I feel this emotion is much more common than I had first thought, and we could all do with some extended time off from work every now and then.&lt;/p&gt;
&lt;p&gt;Additionally, I had felt that I was starting to stagnate as an Engineer, and I wanted a new medium to challenge myself with.
Thankfully my manager was very receptive to this, and whilst he took a 3 week break of his own, he allowed me to get a slight flavour of management in his place (see: &lt;a href="#trialling-out-management"&gt;Trialling out management&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="how" class="relative group"&gt;How? &lt;/h2&gt;&lt;p&gt;In late 2022 / early 2023 (I can&amp;rsquo;t remember) I approached my manager requesting a 3 month sabbatical.
Turns out this wasn&amp;rsquo;t quite as easy as I had hoped, and came with a fairly significant opportunity cost, so we &amp;ldquo;pivoted&amp;rdquo;.
There was an opportunity within the company to take part in a secondment to Singapore to assist with the production support team, handling live client incidents within the APAC region.&lt;/p&gt;
&lt;p&gt;This sounded somewhat daunting, but combined with a revised 6 week sabbatical (of which only 3 were unpaid), it came with a few key advantages over the original plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Much lower opportunity cost (3 weeks unpaid vs 3 months)&lt;/li&gt;
&lt;li&gt;The company paid for the big flight tickets to/from Singapore (thanks!)&lt;/li&gt;
&lt;li&gt;Put up in a nice hotel for 3 months, get to hang out with some really cool people from Singapore and take part in all the &amp;ldquo;crazy Singapore office&amp;rdquo; stories I had heard so much about.&lt;/li&gt;
&lt;li&gt;My GF could only take 3 weeks holiday from work anyway, so this reduced the time I was travelling along&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, we agreed on the duration, and queued up my secondment, so the dates were set!
31st July -&amp;gt; 27th November.&lt;/p&gt;
&lt;h2 id="pre-departure" class="relative group"&gt;Pre-departure &lt;/h2&gt;&lt;p&gt;Preparing for a sabbatical is half the battle.
If you aren&amp;rsquo;t clear on what you want to do, and you haven&amp;rsquo;t prepared for it, you may end up just twiddling your thumbs for 3 months!&lt;/p&gt;
&lt;p&gt;For my particular case, I had to get a few travel things organised before setting off, as I already had a fairly good idea of what I wanted to do, and how to do it (I just wanted to travel, experience new cultures, meet the girlfriend&amp;rsquo;s family, and journal).
If you are planning your own sabbatical, I&amp;rsquo;d encourage you to think about what you want to focus on during this valuable time!&lt;/p&gt;
&lt;h3 id="visas-and-vaccinations" class="relative group"&gt;Visas and Vaccinations &lt;/h3&gt;&lt;p&gt;For a long time, I didn&amp;rsquo;t really know where I would end up going, so with the knowledge of &amp;ldquo;China at some point&amp;rdquo; I made a &amp;ldquo;Grand Asian Itinerary&amp;rdquo; and started listing places I wanted to visit.
Once the dates were settled, I split this into 3 weeks of China, and 3 weeks of everywhere else, with the intention that China would be the first 3 weeks due to other scheduling constraints.
For China we knew we wanted to spend around a week in Beijing, and travel to some other key places (Great Wall, Terracotta Army, Shanghai, Sichuan province for the food), so for the most part we just placed these on the map and connected the dots with what we could reasonably travel to by train.&lt;/p&gt;
&lt;p&gt;For the remaining 3 weeks, I wanted to try to mimic &lt;a href="https://www.bbc.co.uk/programmes/m0002tvs" target="_blank" rel="noreferrer"&gt;Race Across the World&lt;/a&gt; as much as possible, so despite it being shockingly cheap, I tried to avoid planes as much as possible whilst around South East Asia.
Once we had decided on Hong Kong being the last destination from the China portion, and knowing I had a return flight from Singapore to catch, it once again became a connect-the-dots exercise.&lt;/p&gt;
&lt;h4 id="chinese-visa" class="relative group"&gt;Chinese Visa &lt;/h4&gt;&lt;p&gt;Thanks to the UK passport, I only needed a tourist visa from China.
Unfortunately, the plan was a bit in flux still, and I had some slight challenges since I was applying for the Visa more than 3 months in advance of my visit to China (not strictly allowed according to the rules).&lt;/p&gt;
&lt;p&gt;The whole Visa process itself was quite daunting, and this was not helped by the fact that their online application system was in a half-half state of readiness.
Since covid started, China had stopped issuing tourist visas, and only restarted applications in ~April 2023.
I was applying in May/June so they were still ramping up and changing rules as I went through the application, which was fun.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://bio.visaforchina.cn/LON3_EN/qianzhengyewu" target="_blank" rel="noreferrer"&gt;application website&lt;/a&gt; had a slightly different set of rules to the &lt;a href="http://gb.china-embassy.gov.cn/eng/visa/qzxz/" target="_blank" rel="noreferrer"&gt;Chinese embassy site&lt;/a&gt; and I even contacted both the Singaporean embassy and the London embassy to see where would be best to apply from.&lt;/p&gt;
&lt;p&gt;In the end, as with most bureaucratic issues, once you talk to a reasonable person, the issue becomes a non-issue, and they were mostly ok with me applying a few months in advance.
They even granted me a 2 year Visa instead of my requested 3 month one!&lt;/p&gt;
&lt;p&gt;The only hiccup I had while applying, was that during my visa appointment, sat in front of the application interviewer, they asked to see my flight tickets, which I hadn&amp;rsquo;t booked!
The Visa rules had changed in between me booking the appointment, and it actually taking place, so I needed to hurriedly book return flights from London to Beijing (not cheap!) whilst sat in front of the interviewer.
Let me just say, that was one of the most stressful and expensive mornings of my life!&lt;/p&gt;
&lt;p&gt;Not least because the first set of tickets I hurriedly bought, were non-refundable, and I had spelt my own name wrong on the tickets! 🤦‍♂️&lt;/p&gt;
&lt;h4 id="vaccinations" class="relative group"&gt;Vaccinations &lt;/h4&gt;&lt;p&gt;For the most part, I just took everything recommended from the &lt;a href="https://www.fitfortravel.nhs.uk/destinations#asia-east" target="_blank" rel="noreferrer"&gt;Fit for Travel NHS website&lt;/a&gt;, under &amp;ldquo;East Asia&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;This required a few visits to the doctors/pharmacy to consult about vaccinations (ultimately deciding a couple were not worth the cost), and then ultimately have them administered over a few sessions.&lt;/p&gt;
&lt;p&gt;Hilariously, the first vaccination session I had 5 vaccinations in one go, and ended up passing out (I&amp;rsquo;m not good with needles!), so that certainly felt like the weirdest ~£300 I ever spent.&lt;/p&gt;
&lt;p&gt;Overall, vaccinations were the easiest part of this to organise.&lt;/p&gt;
&lt;h3 id="wrapping-up-work" class="relative group"&gt;Wrapping up work &lt;/h3&gt;&lt;p&gt;Since I had planned this so far in advance, myself and my manager had months to prepare for this time off from normal work duties.
When this process started, I was tech-leading a relatively significant chunk of work for one of the company&amp;rsquo;s (notoriously large) major version releases, so at least half of the 6 months before setting off would be dedicated to completing this stream of work.
Afterwards however, I had nothing concretely planned, so let&amp;rsquo;s skip forward to that bit.&lt;/p&gt;
&lt;h4 id="handing-off-responsibility" class="relative group"&gt;Handing off responsibility &lt;/h4&gt;&lt;p&gt;Before you head off for an extended time from work (or quit!), it&amp;rsquo;s common courtesy to give plenty of heads-up to your team to make sure you aren&amp;rsquo;t going to place any undue stress on people.&lt;/p&gt;
&lt;p&gt;For myself, aside from the above mentioned workstream, I only had a few low-importance things I was sole owner of, so I had kept a fairly good &lt;a href="https://en.wikipedia.org/wiki/Bus_factor" target="_blank" rel="noreferrer"&gt;Bus Factor&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;At the time, I had been running informal knowledge shares and discussion sessions for around 2 years within my team, partly to practise public speaking / whiteboard skills, but also to encourage healthy forms of debate and open conversations around tricky problems and upcoming feature ideas with the wider team.
However, after 2 years it had started becoming a bit stale, and I felt it needed a change of leadership to reinvigorate the concept.&lt;/p&gt;
&lt;p&gt;I was pleased to see that coming back these sessions were still happening, with a new runner, a little bit differently than I had thought, but that was the goal!&lt;/p&gt;
&lt;h4 id="trialling-out-management" class="relative group"&gt;Trialling out management &lt;/h4&gt;&lt;p&gt;A weird section in my recent career, but one I found very insightful.&lt;/p&gt;
&lt;p&gt;My manager went on a 3 week holiday, and given my apparently alright organisational skills during time as a tech lead, we thought it could be a fun challenge to try and have me fill his shoes for a few weeks.&lt;/p&gt;
&lt;p&gt;Obviously, whilst I&amp;rsquo;m fine playing around with my own career, we didn&amp;rsquo;t want this impacting any of my teammates, so there were no significant challenges for myself (no upcoming reviews, no significant ongoing work, no resourcing constraints, no unresolved pay disputes, etc), and we (correctly) anticipated this would be plain sailing.&lt;/p&gt;
&lt;p&gt;I had a few small challenges, around battling a bit for resources with the other managers, and attempting to have serious productive conversations with my peers and friends about their career, but it was fun!&lt;/p&gt;
&lt;p&gt;Three things that really stuck out for me were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transparency is key (even on the seemingly unimportant things).
&lt;ul&gt;
&lt;li&gt;I had some feedback from the director that I hadn&amp;rsquo;t been as transparent as I could have been regarding department level goings-on.
His point being that as you learn more about department level changes, it begins to break down that barrier between management/non-management, and can employees engage with the company.
Transparency is something I value so it shocked me to realise I was failing myself!
From that point I started each standup with a quick recap of the managers meetings, obviously avoiding mentioning things that introduce too much uncertainty.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1:1&amp;rsquo;s are the best.
&lt;ul&gt;
&lt;li&gt;You have individual challenges with each person having their own motivations and personality types, but just having time to sit down and work out how each person can best work towards their own goals (or find them!) is both a fun challenge, and extremely rewarding in the long run (if it works!).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I am currently &lt;strong&gt;terrible&lt;/strong&gt; at politics.
&lt;ul&gt;
&lt;li&gt;I&amp;rsquo;m starting to believe that being an effective manager is 80% down to your skills in politics.
Unfortunately I have much to learn here.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;m extremely grateful for the opportunity, but I think I can currently deliver the most value as an Individual Contributor.&lt;/p&gt;
&lt;h4 id="on-call-lead" class="relative group"&gt;On-call lead &lt;/h4&gt;&lt;p&gt;For 3 months I acted as lead of a core on-call rota.&lt;/p&gt;
&lt;p&gt;A quick win was in optimising the rotation schedule:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For every week period, for the next 6 months we need 2 engineers available for on-call.&lt;/li&gt;
&lt;li&gt;We also need to know who else may be able to act as a replacement, in case of illness.&lt;/li&gt;
&lt;li&gt;We also need to space out shifts, to avoid burning out an engineer, but keep them frequent enough to grow skills.&lt;/li&gt;
&lt;li&gt;We have ~20 engineers in this rota&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This was previously a nightmare, but I introduced a google sheet with some fancy scheduling formulas, then gave everyone access at once to allocate their own desired/if-i-have-to/cannot-do periods.
After a few days we had a rock solid rota for 6 months, with backups for each week, all requiring much less effort on the rota lead&amp;rsquo;s part than previous methods.
Win-win!&lt;/p&gt;
&lt;p&gt;We also had a sudden influx of new people who wanted to join the rota (we had a lot of engineers who joined, and were now becoming tenured enough to warrant addition to the rota), this was a good thing as we had slowly been losing people from the rota over the last year, and our production-running experience bus factor was dangerously low.
My opinion was that the most effective way to upskill a team quickly, is to follow a &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9258902/" target="_blank" rel="noreferrer"&gt;see one, do one, teach one&lt;/a&gt; approach.
So I accepted almost everybody who applied into the rota, with the provision that they should self-arrange a shadow on-call session with an experienced member in the months before their first week of oncall.&lt;/p&gt;
&lt;p&gt;I also encouraged more senior members of the rota to slowly remove themselves, to make way for new talent, and to free up their own time for more valuable pursuits in technical design.&lt;/p&gt;
&lt;p&gt;The issue was, that the new applicants had somewhat underestimated the challenges of on-call.
Whilst our clients were not impacted, the first month of this new round of oncallers did feel quite chaotic at times, as people rapidly ramped up their understanding of and skills working with older versions of our product, in hostile situations.&lt;/p&gt;
&lt;p&gt;Coming back to the situation now, 7 months later, turns out I was right.
All of these new oncallers are performing well, and are now much better at handling support requests than when they started.&lt;/p&gt;
&lt;p&gt;Again, I&amp;rsquo;m very grateful for the opportunity, and would like to try it again in the future.
However at the current company it is an unfortunately thankless role, so there is little incentive to take part.&lt;/p&gt;
&lt;h4 id="working-abroad" class="relative group"&gt;Working abroad &lt;/h4&gt;&lt;p&gt;A bit of fun, I decided to organise a 3 day remote-work holiday with some co-workers in Nice, France.&lt;/p&gt;
&lt;p&gt;To make sure this wouldn&amp;rsquo;t be seen as a complete jolly by the rest of the company, we designated these days as &amp;ldquo;reset days&amp;rdquo; where we could finally work on some designs for long outstanding tech-debt / product improvement ideas that were not officially in the roadmap.&lt;/p&gt;
&lt;p&gt;As a bit of a cathartic release, and a lot of fun with some good friends, it was a success!&lt;/p&gt;
&lt;p&gt;This is something I want to do much more of, but the political capital I spent trying to get this approved was probably not worth it.&lt;/p&gt;
&lt;h4 id="preparing-for-the-rest-of-the-year" class="relative group"&gt;Preparing for the rest of the year &lt;/h4&gt;&lt;p&gt;Then, the rest of the year!&lt;/p&gt;
&lt;p&gt;I spent a good deal of time planning for what kind of impact I wanted to have on my Singapore rotation, as well as discussing my career goals with my manager to make sure my upcoming work would allow me to progress on this front.&lt;/p&gt;
&lt;p&gt;Unfortunately, the rotation to Singapore to assist with production support is not viewed as a valuable activity for an engineer in my company (despite the high price tag associated), so this 3 month block was assumed to delay my promotion goals.&lt;/p&gt;
&lt;p&gt;Additionally, I would be missing out on a &amp;ldquo;design&amp;rdquo; phase in the company, where many of the &amp;ldquo;cool&amp;rdquo; upcoming projects are divided amongst hopeful tech-leads, like a sounder of pigs at a trough.&lt;/p&gt;
&lt;p&gt;Losing this was a bit of a blow to me professionally, but if you are planning on going for a sabbatical, you will face similar challenges.&lt;/p&gt;
&lt;p&gt;I knew personally that this 4 months chunk out of everyday work, achieving some of my own life goals was going to be far more valuable than the opportunity cost of a bit more time in employment.&lt;/p&gt;
&lt;p&gt;Your mileage may vary, but I strongly encourage anyone to at least consider a sabbatical at some point in their career - ideally multiple!&lt;/p&gt;</content:encoded></item><item><title>📚 Year of books</title><link>https://jamesjarvis.io/posts/2024/01/year-of-books/</link><pubDate>Tue, 02 Jan 2024 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2024/01/year-of-books/</guid><category>Reading</category><category>Thoughts</category><description>2023 was a year of reading</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&amp;lsquo;Classic’ – a book which people praise and don’t read&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I personally think there is significant value in taking time to reflect upon your actions, and setting some intentions going forward.&lt;/p&gt;
&lt;p&gt;For reflection, I have been recording &lt;a href="https://jamesjarvis.io/tags/one-second-everyday/"&gt;a second of my entire adult life&lt;/a&gt; as a form of yearly reflection from June-June, and now have this blog to express my intents on a more frequent basis.&lt;/p&gt;
&lt;p&gt;However, I also like to set my own New Years Resolutions, as a significant &lt;a href="https://www.clearerthinking.org/post/our-best-tools-for-new-year-s-resolutions" target="_blank" rel="noreferrer"&gt;Temporal Milestone&lt;/a&gt; I can guide myself against for the year ahead.
I still struggle with writing effective goals, but I typically manage to tick at least half of them off.&lt;/p&gt;
&lt;p&gt;One of the goals I set myself for 2023 was to read 10 books.
I used to love reading as a kid, and have fond memories of ignoring the calls to go to sleep from my parents when I was 8, churning through the Harry Potter and Alex Rider series.
Since I left school, for some reason I had dropped out of the habit of reading, and I quite missed it.
So, I set up a &lt;a href="https://goodreads.com/james_jarvis" target="_blank" rel="noreferrer"&gt;Goodreads account&lt;/a&gt;, signed up to &lt;a href="https://www.audible.co.uk/" target="_blank" rel="noreferrer"&gt;Audible&lt;/a&gt; and tried to track my progress in some shoddily written reviews.&lt;/p&gt;
&lt;p&gt;The following has been extracted from a &lt;a href="#appendix"&gt;short script&lt;/a&gt; I co-authored with the help of ChatGPT, to export all of my reviews made in 2023.&lt;/p&gt;
&lt;h3 id="tldr" class="relative group"&gt;TL;DR? &lt;/h3&gt;&lt;p&gt;Clearly I have some progress to make on my own writing&amp;hellip;&lt;/p&gt;
&lt;p&gt;These reviews are pretty slopping and fairly valueless, and even while writing them I found I hadn&amp;rsquo;t
always absorbed the content of the book as well as I would like.&lt;/p&gt;
&lt;p&gt;That being said, it is &lt;strong&gt;an amazing start!&lt;/strong&gt;
I am very proud of myself for making this much progress, and have become very fond of my kindle/audible unwind time, and may have even learned something along the way!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve learned that reading lists, much like TODO lists have this funny habit of forever getting longer, the closer you get to the end, and that I am a bit of sucker for a certain style of front cover.&lt;/p&gt;
&lt;p&gt;For 2024, one of my primary goals is to write more, and to write more publicly (fail fast, thanks &lt;a href="https://x.com/levelsio" target="_blank" rel="noreferrer"&gt;Levels&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This is the start of my efforts to contribute to this goal, hello!&lt;/p&gt;
&lt;h2 id="four-thousand-weeks-time-management-for-mortals" class="relative group"&gt;Four Thousand Weeks: Time Management for Mortals &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3tI5Q0O" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h2 id="staff-engineer-leadership-beyond-the-management-track" class="relative group"&gt;Staff Engineer: Leadership Beyond the Management Track &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3tLEIy7" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Very interesting read, and a sure addition to my bookshelf I’ll be referring to for years to come!
Very well laid out references too&lt;/p&gt;
&lt;h2 id="1984" class="relative group"&gt;1984 &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3H9Jt7O" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h2 id="21-lessons-for-the-21st-century" class="relative group"&gt;21 Lessons for the 21st Century &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3NUKq7z" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not quite as interesting as the more historical/informational Sapiens and Homo Deus, but still good to read. Contains more opinions than I’d probably say necessary but still insightful!&lt;/p&gt;
&lt;h2 id="atomic-habits-an-easy--proven-way-to-build-good-habits--break-bad-ones" class="relative group"&gt;Atomic Habits: An Easy &amp;amp; Proven Way to Build Good Habits &amp;amp; Break Bad Ones &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3tI5Q0O" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Whilst itself not containing anything groundbreaking, I would recommend reading this at least once (ideally repeat reading it every few years) to remind you to focus on your priorities and motivate you to not become a “fair weather person”.&lt;/p&gt;
&lt;h2 id="values-building-a-better-world-for-all" class="relative group"&gt;Value(s): Building a Better World for All &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/4aOzouk" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I appreciate the reflective focus of this book. I recall lots of focus on the impacts of the global pandemic and the global financial crisis (of which his section on the unravelling of the crisis from his perspective as a trader was my favourite). However I am left with a feeling that perhaps I haven’t learnt much, if anything what I have come away with is a renewed appreciation of planning for adverse scenarios and aligning incentive structures/markets for a shared purpose. Perhaps this is one of those books that aim only to ignite questions.&lt;/p&gt;
&lt;h2 id="what-if-2-additional-serious-scientific-answers-to-absurd-hypothetical-questions-what-if-2" class="relative group"&gt;What If? 2: Additional Serious Scientific Answers to Absurd Hypothetical Questions (What If?, #2) &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3H9gXmF" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(not provided)&lt;/p&gt;
&lt;h2 id="sandworm-a-new-era-of-cyberwar-and-the-hunt-for-the-kremlins-most-dangerous-hackers" class="relative group"&gt;Sandworm: A New Era of Cyberwar and the Hunt for the Kremlin&amp;rsquo;s Most Dangerous Hackers &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/4aM6MSr" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Having read this recently after finishing the similar but less focused “This is how they tell me the world ends”, I’m left ironically with a greater sense of dread from this book.
“Sandworm” does more to focus directly on the Russian links to various high profile hacks in the 2010’s, and notes the direct and indirect links these have had with the Russian/Ukraine conflicts of the 2010’s and 2020’s.
For me, much of the contents of the book detailing NotPetya and WannaCry have been published elsewhere, but I find more curiosity in the US defence exercises conducted on the electricity grid.
Highly recommended read, along with “this is how they tell me the world ends”, but beware that this book will play on (perhaps very accurate) fears of the Russian state, at every opportunity.&lt;/p&gt;
&lt;h2 id="amp-it-up-leading-for-hypergrowth-by-raising-expectations-increasing-urgency-and-elevating-intensity" class="relative group"&gt;Amp It Up: Leading for Hypergrowth by Raising Expectations, Increasing Urgency, and Elevating Intensity &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/4aJjLo9" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Interesting read. As with any leadership book it is generally an ego massage for the writer, however this one does bear some important messages. He describes the importance of having a product mindset for yourself (delivering value, building diverse but relevant experience), and of the difference between “drivers” and “passengers”.&lt;/p&gt;
&lt;p&gt;I’m not sure what the key takeaway would be that I’ll implement in my own life, but it’s a good thing to read occasionally to remind yourself to stay on the track creating the most value&lt;/p&gt;
&lt;h2 id="the-happiest-man-on-earth" class="relative group"&gt;The Happiest Man on Earth &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3S7qpNH" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m not sure it’s possible to give this book a bad review. Eddie is clearly a very inspiring spirit, having lived through the hardest of times and still left with a kindness in his heart.
Reading this you are jerked into reflection on your own position in life.
The audible narration is also fantastic, and a great match with what you would imagine the author sounds like.&lt;/p&gt;
&lt;h2 id="becoming" class="relative group"&gt;Becoming &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3S8NxdF" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An inspiring book from the coolest First Family of modern times. It is reassuringly honest from a political perspective, and is a recommended read for any young person scared of their own social mobility&lt;/p&gt;
&lt;h2 id="that-will-never-work-the-birth-of-netflix-and-the-amazing-life-of-an-idea" class="relative group"&gt;That Will Never Work: The Birth of Netflix and the Amazing Life of an Idea &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/48oYL4j" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of a limited set of exciting and insightful biographies of influential entrepreneurs. The story of Netflix is different from what I first imagined, but my main takeaway would have to be Randolph’s Rules!&lt;/p&gt;
&lt;h2 id="how-not-to-be-a-boy" class="relative group"&gt;How Not To Be a Boy &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/41MfGv8" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ll be honest, I’ve never actually watched any of Webb’s work. However I can’t recommend this book enough. His message is rarely told from such a first hand perspective, and it’s one that I feel will become more mainstream in the years to come. Personally I still don’t quite understand football, either.&lt;/p&gt;
&lt;h2 id="bad-blood-secrets-and-lies-in-a-silicon-valley-startup" class="relative group"&gt;Bad Blood: Secrets and Lies in a Silicon Valley Startup &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3H8kiSV" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Believable if only in its disheartening representation of Silicon Valley. If you are just looking for a summary of the wrongdoings of Elizabeth Holmes, then this might be a bit overkill and a documentary will suffice. However the events portrayed in this book are an insightful mix of Lying, Cheating, and Sociopathic tendencies.&lt;/p&gt;
&lt;h2 id="the-light-we-carry-overcoming-in-uncertain-times" class="relative group"&gt;The Light We Carry: Overcoming in Uncertain Times &lt;/h2&gt;&lt;p&gt;3/5 :star:
&lt;a href="https://amzn.to/47ydOI0" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Having read Becoming quite recently (and being very pleased with it!), I’m not sure this book offers much more value or new insights. My main takeaway from this book would have to be Grandma Robinson’s tips on teaching independence.&lt;/p&gt;
&lt;h2 id="wild-from-lost-to-found-on-the-pacific-crest-trail" class="relative group"&gt;Wild: From Lost to Found on the Pacific Crest Trail &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3RW3nbs" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’m ashamed to admit I started reading this book with an expectation of what I would get out of it. Much like the outcome of Sheryl’s journey, the whole purpose of reading this is about the journey of the unknown.
Some parts I felt myself prematurely repelled against (cheating, lying, emotional manipulation, inability to face consequences, sexual promiscuity, assumptions for help, naivety, heroin addiction, swallowing her mother’s ashes).
However, what did I expect?
I had an assumption this would be another privileged person travelling for the fun of it. Rather, this was a genuinely troubled person attempting to reset by taking on the biggest challenge they could imagine, alone.
Some parts did not resonate with me and that’s ok, the experience is nonetheless valid.&lt;/p&gt;
&lt;h2 id="the-culture-map-breaking-through-the-invisible-boundaries-of-global-business" class="relative group"&gt;The Culture Map: Breaking Through the Invisible Boundaries of Global Business &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/48o5ziH" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Erin delivers a clear, concise set of personal anecdotes and a framework for rationalising the effects of culture on communication. The book is very focused on the context of business, but the lessons learnt can be applied to any cross cultural communication.
I’d recommend this for anyone engaging in long term cooperation (business or otherwise) with people from multiple diverse countries.&lt;/p&gt;
&lt;h2 id="chavs-the-demonization-of-the-working-class" class="relative group"&gt;Chavs: The Demonization of the Working Class &lt;/h2&gt;&lt;p&gt;3/5 :star:
&lt;a href="https://amzn.to/3tHoxSm" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This book is perhaps a bit too long, and bounces around the topics of class warfare, race and immigration, with little structure.
I admire it for sharing extremely relevant stories from Britain’s political past, but I’m not left with the impression that this book has been impartial in its investigation.&lt;/p&gt;
&lt;h2 id="build-an-unorthodox-guide-to-making-things-worth-making" class="relative group"&gt;Build: An Unorthodox Guide to Making Things Worth Making &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/47polF6" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To begin, I see other reviewers comment on Tony’s personal failures and unhealthy leadership styles. I can’t comment on this context as the sum total of what I know about this man comes from this book, so I shall only refer to the book review.&lt;/p&gt;
&lt;p&gt;Build is a well structured, if a little petty, guide to a product focused mindset. A lot of the concepts around finding product market fit, storytelling, focusing on press release first, structuring an organisation to ensure stakeholders have to agree (i.e making support sign off on new sales) feels like well founded advice and common sense.
Some parts felt needlessly petty (a constant revert back to why google is awful), and some parts just felt like reflections on luck (right place right time hiring for Apple).&lt;/p&gt;
&lt;p&gt;In general, I found the book very enjoyable to read, however I would be concerned with repeating all but the product focused points. I fear most organisations would not tolerate such abrasiveness.&lt;/p&gt;
&lt;h2 id="rich-dad-poor-dad" class="relative group"&gt;Rich Dad, Poor Dad &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/47psOYj" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To be honest, I don’t know what to do with this information. But this is a good framework for analysing your current position (cashflow and balance sheet) and making steps to prioritise asset building.
In the UK it’s a little less impactful to “pay yourself first”, and many recurrent tax efficient investment schemes are not available. However this book is probably one of the most impactful triggers for learning more on the subject!&lt;/p&gt;
&lt;h2 id="12-rules-for-life-an-antidote-to-chaos" class="relative group"&gt;12 Rules for Life: An Antidote to Chaos &lt;/h2&gt;&lt;p&gt;3/5 :star:
&lt;a href="https://amzn.to/3vrPlGV" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The book is far too long, contains numerous logical errors or contradictions, is both harsh and heartfelt and I fail to see what I actually learnt from this book. That being said, I don’t think it is completely without value, and to the right audience it clearly resonates. I just think it should be called “12 vague themes for struggling young men” instead.&lt;/p&gt;
&lt;h2 id="outliers-the-story-of-success" class="relative group"&gt;Outliers: The Story of Success &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3RPR2oR" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Outliers is one popular science book that is well worth reading.
He proposes the concept that “genius” is a combination of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A sufficiently high IQ (though beyond 120 has negligible effects)&lt;/li&gt;
&lt;li&gt;Proper upbringing (concerted cultivation, as he notes in a few case studies)&lt;/li&gt;
&lt;li&gt;Practical intelligence (derived from the latter upbringing)&lt;/li&gt;
&lt;li&gt;Situational luck (noting similarities of prominent figures and their economic situations during formative years).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyone who falls trap to society’s worshipping of the “lone genius” should read this book to zoom out a little. A related book for the latter chapters around the power distance law and cultural effects on education and work, I would recommend “The Culture Map”.&lt;/p&gt;
&lt;h2 id="permanent-record" class="relative group"&gt;Permanent Record &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3H5f4HL" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Something I didn’t expect to take away from this book would be an understand of how manipulatively flawed it’s intelligence organisations are structured. The fact that security clearance is not necessarily related to public/private roles seems strange.&lt;/p&gt;
&lt;p&gt;The book provides an insightful (yet slightly dull) overview of his time contracting and training through the intelligence community, until ultimately suffering from a burst of epileptic illness, and after spending considerable time indoors, monitoring the traumatic events occurring throughout the Arab Spring, he forms a clearer view of where his own government is failing their people.&lt;/p&gt;
&lt;p&gt;My review of Edward’s character is overwhelmingly positive. From his description of events, given his oath to the American people, he did the right thing by disclosing wrongdoings of the 5 eyes governments.&lt;/p&gt;
&lt;h2 id="surely-youre-joking-mr-feynman-adventures-of-a-curious-character" class="relative group"&gt;&amp;ldquo;Surely You&amp;rsquo;re Joking, Mr. Feynman!&amp;rdquo;: Adventures of a Curious Character &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/3tS6icV" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The tales do occasionally come off as a bit show-offish, and he is clearly a bit arrogant of his own abilities. However it’s possible that this was entirely reasonable!&lt;/p&gt;
&lt;p&gt;I’m not sure what I expected when going into this book, but it is very much focused on how the man operated, and not on his achievements. So without undertaking external research of Feynman, you are still left with only hints of what his main achievements were about.&lt;/p&gt;
&lt;p&gt;His mind was certainly a curious one, and it is extremely refreshing to hear someone detail the ins and outs of his lifelong(!) passion, enthusiasm and energy for all things science. Additionally, after around 1945 the extracurricular focus of his life gets progressively saucier, having switched subjects, cracked safes, learnt languages, moved countries, played in a “band”, frequented bars, drew models professionally, and repeatedly mentioned his adoration of women! Although his “womanising” manner may appear a bit out of fashion nowadays.&lt;/p&gt;
&lt;p&gt;Whilst I wouldn’t consider him a direct role model, his curiosity is infectious, and I wish all readers absorb at least some of his passion!&lt;/p&gt;
&lt;h2 id="less-is-more-how-degrowth-will-save-the-world" class="relative group"&gt;Less Is More: How Degrowth Will Save the World &lt;/h2&gt;&lt;p&gt;5/5 :star:
&lt;a href="https://amzn.to/48D3sId" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I thoroughly agree, with about 50% of the solutions in this book, and the remainder I feel are too optimistic and not realistic.&lt;/p&gt;
&lt;p&gt;Degrowth is a damaging name, for a movement that sounds like it makes sense for humanity: factor in the costs of all externalities (especially negative) when pricing a good or service, and provide a metric of economic progress that is more human-values driven (quality of life, sustainability etc) than merely monetary-value.&lt;/p&gt;
&lt;p&gt;The book is well written, and the audiobook is similarly well narrated, however this type of book is more valuable in print format, where you can refer back to sections of interest later.&lt;/p&gt;
&lt;p&gt;Something I don’t agree with, or at least haven’t formed a good enough of an opinion around yet, is that this book strangely reiterates the claim that distributing wealth equally would result in an instant improvement in quality of life for all. As far as I am aware, economies currently rely on inequality to price goods competitively, however more reading on my part is required.&lt;/p&gt;
&lt;p&gt;Regulation and individual behavioural changes alone are a tough thing to rely on, which this book unfortunately primarily suggests.
I however primarily like the concepts of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mandatory N year guarantees on new products&lt;/li&gt;
&lt;li&gt;Community share-stations for seldom used goods&lt;/li&gt;
&lt;li&gt;Limitations on lowest-highest compensation ratios&lt;/li&gt;
&lt;li&gt;Direct democracy for long term societal strategies&lt;/li&gt;
&lt;li&gt;Externality Tax on goods and services, based on their negative externalities on society/environment. Positive externality becomes a grant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I think this is a good book for the future generation to read, but I don’t expect much action to come along with it, until the public is genuinely aware of the societal problems we will face if we continue to exceed our planetary quotas.&lt;/p&gt;
&lt;h2 id="the-power-of-habit-why-we-do-what-we-do-in-life-and-business" class="relative group"&gt;The Power of Habit: Why We Do What We Do in Life and Business &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3Ha6CXF" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A good book, but not one I would recommend as a “must read”. The author presents many insightful case studies, although some of which are slightly dubious, and I would have preferred a less opinionated form of writing, presenting the facts first.&lt;/p&gt;
&lt;p&gt;The key takeaway for me, is identification of the cue, routine and reward habit loop; keystone habits; and that a habit exists primarily within the basal ganglia, and away from conscious thought.&lt;/p&gt;
&lt;h2 id="life-time" class="relative group"&gt;Life Time &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3vnpEau" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;An interesting book, although I’ll admit that a combination of my reading times, and the bombardment of unfamiliar medical terms/acronyms meant the book had an ironically sleep inducing quality!&lt;/p&gt;
&lt;p&gt;My main takeaway would be that “sleep is important”, with a side order of “when you take medication or eat food in relation to sleep is important”.&lt;/p&gt;
&lt;p&gt;I’ll admit that I’m not the perfect target audience, as I don’t feel reading this book has given me the filtered information I need to actively improve my own health, although I have absorbed the gist of it.&lt;/p&gt;
&lt;h2 id="the-everything-store-jeff-bezos-and-the-age-of-amazon" class="relative group"&gt;The Everything Store: Jeff Bezos and the Age of Amazon &lt;/h2&gt;&lt;p&gt;4/5 :star:
&lt;a href="https://amzn.to/3TTNrJ9" target="_blank" rel="noreferrer"&gt;find online&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A great autobiography of Amazon and its infamous founder. However it is starting to show its age a bit. Quite poetic considering the opening chapter describes a conversation with Bezos, who questions whether the book is being written too soon.&lt;/p&gt;
&lt;p&gt;I didn’t realise quite how… ruthless Amazon is/was.
It is quite happy to engage in savage business tactics, and suck the humanity out of any worker, all in pursuit of the hallowed customer experience.&lt;/p&gt;
&lt;p&gt;I quite liked the final comparisons between Steve Jobs (who valued profit extraction from addicted customers) and his own biological father (who ran the same small niche shop for decades).&lt;/p&gt;
&lt;p&gt;Well worth a read, but be cautious of the survivorship bias of tech CEOs from this era.&lt;/p&gt;
&lt;h3 id="appendix" class="relative group"&gt;Appendix &lt;/h3&gt;&lt;h4 id="code-for-parsing-goodreads-data-export" class="relative group"&gt;Code for parsing Goodreads data export &lt;/h4&gt;&lt;script src="https://gist.github.com/jamesjarvis/504b03e0b94a1647c1563fd99d602579.js"&gt;&lt;/script&gt;
&lt;h4 id="affiliate-links" class="relative group"&gt;Affiliate Links &lt;/h4&gt;&lt;blockquote&gt;
&lt;p&gt;[!note]
This blog post contains affiliate links, which may earn me a small commission if used.
You are more than welcome to not use these, but doing so helps support this blog.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded></item><item><title>📖 Blogging Site</title><link>https://jamesjarvis.io/posts/2023/07/blogging-site/</link><pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2023/07/blogging-site/</guid><category>Projects</category><description>Owning my place on the internet, like the good old days</description><content:encoded>&lt;p&gt;I am growing up &lt;em&gt;&lt;strong&gt;[citation needed]&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;With this, comes a lot of realisations about what I value from the internet, and in particular about the things I build.&lt;/p&gt;
&lt;h3 id="the-rewrite" class="relative group"&gt;The rewrite &lt;/h3&gt;&lt;p&gt;My first iteration of this personal website was written in GatsbyJS, primarily as a means to show off the previous things I have built &lt;a href="https://jamesjarvis.io/posts/2019/02/portfolio-site/"&gt;more info in this previous article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, I rarely wrote to this website, and I never really promoted it on other platforms for the purpose of getting views.&lt;/p&gt;
&lt;p&gt;I also wanted to write about things that didn&amp;rsquo;t necessarily fall under the rather specific category of &amp;ldquo;project&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;As such, my website was starting to develop an identity crisis and the weakest part of the website was, frustratingly, my own writing.&lt;/p&gt;
&lt;p&gt;I was originally hoping that this website would offer me a creative outlet where I could practise and improve my own writing style, with the auxillary goal of basically being a verbose CV to show to prospective employers or my peers.&lt;/p&gt;
&lt;p&gt;But, GatsbyJS was simply too flexible for this purpose and in turn became a burden, drawing away my own attention from writing and providing content for this site.&lt;/p&gt;
&lt;p&gt;This rewrite, is deliberately hands-off.&lt;/p&gt;
&lt;p&gt;I wanted to keep the same design language, but with a further emphasis on &lt;strong&gt;writing&lt;/strong&gt;, both project-style where I want to write a summary, but also to create the space for more long-form content in the future.
Eventually, I would like to expand this approach to also create the space for engagement with readers in the future (once I get readers!), however this will not be a priority yet until I am confident in the content.&lt;/p&gt;
&lt;p&gt;For now, &lt;strong&gt;the rewrite&lt;/strong&gt; has resulted in removing a few thousands lines of JavaScript, leaving the entire website as just a collection of markdown files and image assets.
Much nicer.&lt;/p&gt;
&lt;h3 id="why-not-medium-devto-xcom-etc" class="relative group"&gt;Why not [medium, dev.to, x.com, etc]? &lt;/h3&gt;&lt;p&gt;I want full control over my presence on the internet.&lt;/p&gt;
&lt;p&gt;I want to be able to decide entirely by myself whether I am public, private, free for all to read, or behind a paywall.&lt;/p&gt;
&lt;p&gt;I want to have at least a false sense of security that my writing will not be too easy to crawl for LLM&amp;rsquo;s to reproduce.&lt;/p&gt;
&lt;p&gt;But most of all, I want to be able to go back to the old micro-web of days gone past, where each person has their own bubble on the internet.
I think it&amp;rsquo;s quite a charming approach, and I hope you do too.&lt;/p&gt;
&lt;p&gt;I will possibly start to link to my website from other platforms when I post a new article, but I want the location to stay here, on this domain.&lt;/p&gt;
&lt;h3 id="learning-to-write" class="relative group"&gt;Learning to write &lt;/h3&gt;&lt;p&gt;I am going to take a mini-sabbatical from work later this year, spending 4.5 months out of the U.K., working and travelling around South East Asia.&lt;/p&gt;
&lt;p&gt;I will be leaving my personal laptop here, only taking my phone, camera and a notebook.
I&amp;rsquo;m hoping to teach myself how to enjoy the creative process.
If that works, You&amp;rsquo;ll be hearing more from me soon!&lt;/p&gt;</content:encoded></item><item><title>24 Years Old</title><link>https://jamesjarvis.io/posts/2023/06/24-years-old/</link><pubDate>Fri, 23 Jun 2023 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2023/06/24-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2022 to 23rd June 2023.&lt;/p&gt;
&lt;p&gt;This year has been an unfortunate reset.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2022 to 23rd June 2023.&lt;/p&gt;
&lt;p&gt;This year has been an unfortunate reset.&lt;/p&gt;
&lt;p&gt;Coming back from “the Italian trip”, I am forced to scrap my beloved but troublesome Z4. However I continue to enjoy a wonderful summer, I take Feiyang camping, we try surfing, I go to Wimbledon, Northern Ireland, several weddings, long walks and a bit of kayaking.&lt;/p&gt;
&lt;p&gt;November was the hardest month to date. I’m crashed into on the way to a holiday with Feiyang, totalling my car. I lose my best friend, Nan. Things are put back into perspective. We have a quieter Christmas.&lt;/p&gt;
&lt;p&gt;I set goals for 2023, to learn, and to travel. I make an attempt to pick up Mandarin, I set a new personal reading record, and put into motion plans to spend some time out of work. I move out of my flat and wish Konrad all the best at Google. My cousin and her wife got married in Scotland!&lt;/p&gt;
&lt;p&gt;Around this point, my Grandad’s Dementia has worsened to the point where we move him into a care home and my parents tackle selling both his and my Nans houses. Our adoring but ailing dog, Dusta, has to be put down.&lt;/p&gt;
&lt;p&gt;However, the year ends on a high with summer back in full swing! Dad retires just in time for us to spend mine and my sister’s birthday on a boat in the Norfolk Broads!&lt;/p&gt;
&lt;p&gt;My Mum has been our rock. Feiyang has been there for everything. I wish my parents the best start to their happy retirement. Stay tuned!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/QCvCP7k04H8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>23 Years Old</title><link>https://jamesjarvis.io/posts/2022/06/23-years-old/</link><pubDate>Thu, 23 Jun 2022 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2022/06/23-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2021 to 23rd June 2022.&lt;/p&gt;
&lt;p&gt;As the world slowly started to shake off the pandemic I decided to move to London with Konrad. Then I immediately got COVID &lt;em&gt;facepalm&lt;/em&gt;.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2021 to 23rd June 2022.&lt;/p&gt;
&lt;p&gt;As the world slowly started to shake off the pandemic I decided to move to London with Konrad. Then I immediately got COVID &lt;em&gt;facepalm&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Living in my favourite city in the world for a whole year has been a lot of fun (and v expensive), making some new friends and getting used to a bit more of a settled down lifestyle, although it is a bit scary!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve continued with my hobby of making and breaking lots of software, sailed on the Thames, hiked Snowdonia, and met Feiyang!&lt;/p&gt;
&lt;p&gt;My love-hate relationship with the BMW has continued, from having to almost scrap it in November to driving it 3000 miles around Europe in June; I finally drove to the Italian lakes!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/yV09NppzBfA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>22 Years Old</title><link>https://jamesjarvis.io/posts/2021/06/22-years-old/</link><pubDate>Wed, 23 Jun 2021 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2021/06/22-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2020 to 23rd June 2021.&lt;/p&gt;
&lt;p&gt;First year in full time work (at a smol company called ThoughtMachine) and first year I missed a few days filming!&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2020 to 23rd June 2021.&lt;/p&gt;
&lt;p&gt;First year in full time work (at a smol company called ThoughtMachine) and first year I missed a few days filming!&lt;/p&gt;
&lt;p&gt;With most of my life + lifestyle banned under pandemic restrictions it’s been a bit quieter than I would have liked, and there’s been some tough times, but things will change!&lt;/p&gt;
&lt;p&gt;Kicked off this year climbing a mountain, exploring Cornwall, spending a lot of time sat behind a computer, had a wonderful Christmas with the family, walked dozens of kilometres hanging out with my dad, and then walked 42k in one day with Sam!&lt;/p&gt;
&lt;p&gt;I built a dashboard, link scraper and a few other things, shaved my head, impulse bought an old bmw as a semi fixer-upper, travelled to Scotland the day after lockdowns started to lift and ended the year starting to see people again!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/Iw0WANu2XTk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>⠪ Mapping the Internet, part deux</title><link>https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/</link><pubDate>Fri, 05 Feb 2021 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/</guid><category>Projects</category><description>Links on links on links with a UI, man</description><content:encoded>&lt;p&gt;Did reading the previous instalment of &amp;ldquo;mapping the internet&amp;rdquo; &lt;a href="https://jamesjarvis.io/posts/2020/10/backlink-crawler/"&gt;read here&lt;/a&gt; leave you a bit&amp;hellip; underwhelmed?&lt;/p&gt;
&lt;p&gt;Same here.
I mean, sure I had built a little program that could follow and store links on the internet, but it couldn&amp;rsquo;t be ran continuously (could not store the crawling state between runs), and there was just no easy way to traverse or visualise the graph &lt;em&gt;yawn&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, in this chapter I am going to go through how we have improved this service to become the beautifully graphical service that is:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jamesjarvis.github.io/web-graph/" target="_blank" rel="noreferrer"&gt;jamesjarvis.github.io/web-graph&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NOTE: By default, the graph starts from &lt;a href="https://jamesjarvis.io" target="_blank" rel="noreferrer"&gt;jamesjarvis.io&lt;/a&gt;, but if you want to change it to start from a page of your choosing (provided it has managed to scrape that part of the web already), you can give it a shot by changing the url query parameter such as: &lt;a href="https://jamesjarvis.github.io/web-graph/?url=https://en.wikipedia.org/wiki/London" target="_blank" rel="noreferrer"&gt;/?url=https://en.wikipedia.org/wiki/London&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="part-1-maintaining-state" class="relative group"&gt;Part 1: Maintaining state &lt;/h2&gt;&lt;p&gt;So I wanted to eventually run this service on a raspberry pi 4 I currently have just sitting in my attic doing &lt;a href="https://jamesjarvis.io/posts/2020/01/speedtest/"&gt;occasional speedtests&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also decided that I want to be able to stop and start the crawls (say, when performing an upgrade), without losing any data between runs.&lt;/p&gt;
&lt;p&gt;In order to facilitate this, I need to have a list of URL&amp;rsquo;s that have been &amp;ldquo;seen&amp;rdquo; but not &amp;ldquo;crawled&amp;rdquo; yet.&lt;/p&gt;
&lt;p&gt;I had 3 ways I could think of doing this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Spin up a message queue system, like &lt;a href="https://kafka.apache.org" target="_blank" rel="noreferrer"&gt;kafka&lt;/a&gt; or &lt;a href="https://www.rabbitmq.com" target="_blank" rel="noreferrer"&gt;rabbitMQ&lt;/a&gt; to store unprocessed URLs and yeet them out to processors for the actual crawling.&lt;/li&gt;
&lt;li&gt;Add another table in the database, with the pending URLs.&lt;/li&gt;
&lt;li&gt;Store this information in a simple queue file (read from the top, append to the bottom).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I tried all 3:&lt;/p&gt;
&lt;h3 id="rabbitmq" class="relative group"&gt;RabbitMQ &lt;/h3&gt;&lt;p&gt;First, I tried RabbitMQ, and got it working after a few hours of mucking about with it.&lt;/p&gt;
&lt;p&gt;However, it &lt;em&gt;ate&lt;/em&gt; my poor raspberry pi&amp;rsquo;s RAM as soon as the queue was over a few thousand URLs, and I couldn&amp;rsquo;t work out how to persist messages properly.&lt;/p&gt;
&lt;p&gt;I also didn&amp;rsquo;t really need the complexity, as I didn&amp;rsquo;t want my ISP to boot me off the network for making a continuous 100 requests/s, so I wouldn&amp;rsquo;t have bothered with more than one consumer anyway.&lt;/p&gt;
&lt;p&gt;If I was building this to be an actual, scaleable service, then I&amp;rsquo;d have swallowed the extra AWS bill and continued, but this ain&amp;rsquo;t it chief.&lt;/p&gt;
&lt;h3 id="whack-it-in-a-db-table" class="relative group"&gt;Whack it in a DB table &lt;/h3&gt;&lt;p&gt;Another embarrassing thing about the infra for this project is that I&amp;rsquo;m running the raspberry pi with an 8 year old 1TB external hard drive I had lying around.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not the fastest and is in fact the biggest performance bottleneck (if I could be bothered, I would have bought an SSD but this isn&amp;rsquo;t worth £80 + dealing with this limitation is interesting enough).&lt;/p&gt;
&lt;p&gt;As a result of my cheapskate-ness, this is also out of the question, I needed something more lightweight.&lt;/p&gt;
&lt;h3 id="simple-file-based-queue-system" class="relative group"&gt;Simple file based queue system &lt;/h3&gt;&lt;p&gt;This was the way, effectively traverse the web in a breadth-first fashion by appending any found URLs to the end of a list, and crawl any URLs by taking from the top.&lt;/p&gt;
&lt;p&gt;Nice and easy.&lt;/p&gt;
&lt;h2 id="part-2-making-the-data-easy-to-query" class="relative group"&gt;Part 2: Making the data easy to query &lt;/h2&gt;&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/api-splashscreen_hu_7a4a464dd193f5b6.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1962"
 height="398"
 class="mx-auto my-0 rounded-md"
 alt="Splashscreen for the API"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/api-splashscreen_hu_882532e23f69ab76.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Screenshot of the API splashscreen&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Eventually, I wanted to expose this information, but in an easily cacheable and web friendly way.&lt;/p&gt;
&lt;p&gt;Enter: an API service.&lt;/p&gt;
&lt;p&gt;You can actually check it out if you want at &lt;a href="https://api.jamesjarvis.io" target="_blank" rel="noreferrer"&gt;api.jamesjarvis.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been set up to be as easily cache-able (thanks to cloudflare) as possible, and it&amp;rsquo;s open for anyone to use, provided you&amp;rsquo;re aware it&amp;rsquo;s hitting the shitbox in my attic and I don&amp;rsquo;t want my ISP to throw me off their network.&lt;/p&gt;
&lt;p&gt;Also, I used different queries than the first iteration of this project, in order to speed it up.
Indexes help a lot as well! Once the DB grew to &amp;gt;100k items queries used to take minutes, and now after some enthusiastic indexing can take &amp;lt;1s.&lt;/p&gt;
&lt;p&gt;Some fun things you can do with it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find all pages at a particular host (limited to 100): &lt;a href="https://api.jamesjarvis.io/pages/en.wikipedia.org" target="_blank" rel="noreferrer"&gt;/pages/en.wikipedia.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Get an overview of a particular page (just URL, host and links from, limited to 100): &lt;a href="https://api.jamesjarvis.io/page/e518da42a48097ceb7648a9961428e300f2db545" target="_blank" rel="noreferrer"&gt;/page/HASH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find all links &lt;em&gt;from&lt;/em&gt; a particular page (limited to 100): &lt;a href="https://api.jamesjarvis.io/linksFrom/e518da42a48097ceb7648a9961428e300f2db545" target="_blank" rel="noreferrer"&gt;/linksFrom/HASH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find all links &lt;em&gt;to&lt;/em&gt; a particular page (limited to 100): &lt;a href="https://api.jamesjarvis.io/linksTo/e518da42a48097ceb7648a9961428e300f2db545" target="_blank" rel="noreferrer"&gt;/linksTo/HASH&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last one is currently not being used by myself, though I may make an inverse graph traversal, whereby you can discover all the pages that link to a page&amp;hellip;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also set up my &lt;a href="https://jamesjarvis.io/posts/2020/06/eink-dashboard/"&gt;e-ink display&lt;/a&gt; to monitor the number of &lt;a href="https://api.jamesjarvis.io/countPages" target="_blank" rel="noreferrer"&gt;URL&amp;rsquo;s crawled&lt;/a&gt; and &lt;a href="https://api.jamesjarvis.io/countLinks" target="_blank" rel="noreferrer"&gt;links found&lt;/a&gt; for my own amusement as well.&lt;/p&gt;
&lt;h3 id="self-hosted" class="relative group"&gt;Self hosted?? &lt;/h3&gt;&lt;p&gt;Yup, it&amp;rsquo;s slow as shit and is as reliable as my ISP (who apparently work on a &lt;em&gt;best effort&lt;/em&gt; case), but thanks to some aggressive cloudflare caching, the most common endpoints should be relatively quick.&lt;/p&gt;
&lt;h2 id="part-3-graphical-representation" class="relative group"&gt;Part 3: Graphical representation &lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;What would a visual representation of browsing the internet look like?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/web-graph_hu_cbfd0b32849a0905.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2278"
 height="1716"
 class="mx-auto my-0 rounded-md"
 alt="Look mum, I&amp;rsquo;ve crashed my browser!"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2021/02/mapping-the-internet-part-two/web-graph_hu_1d7c42e8451b227f.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Check it out at &lt;a href="https://jamesjarvis.github.io/web-graph/" target="_blank" rel="noreferrer"&gt;jamesjarvis.github.io/web-graph&lt;/a&gt; , and if you want to start from a website of your choosing, you can modify the url query param like: &lt;code&gt;https://jamesjarvis.github.io/web-graph/?url={your_page_here}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Because I couldn&amp;rsquo;t be bothered to set up a proper react application + build process for this project, the whole thing is in one html file, and actually transpiles the required javascript from reactJS source on load time - maybe not the fastest but hey this isn&amp;rsquo;t exactly a performance project + it&amp;rsquo;s so easy to deploy.&lt;/p&gt;
&lt;p&gt;You can check out the whole front-end source &lt;a href="https://github.com/jamesjarvis/web-graph/blob/master/frontend/index.html" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;, ~200 lines is all you need for this &lt;em&gt;beauty&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I ended up using a react wrapper around &lt;a href="https://d3js.org" target="_blank" rel="noreferrer"&gt;D3.js&lt;/a&gt; for the actual graphing, and it made me remember just how much I love and hate javascript.
It&amp;rsquo;s a rocky relationship.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also notice that running this site is very cpu intensive, and yes it is, nothing more to add really.
My personal record was &lt;code&gt;1874 nodes&lt;/code&gt; and &lt;code&gt;3556 links&lt;/code&gt; expanded before my browser crashed, your mileage may vary.&lt;/p&gt;
&lt;h2 id="part-4-what-have-i-learnt-from-this" class="relative group"&gt;Part 4: What have I learnt from this? &lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Hardware can be a real bottleneck, next time use an SSD for IO intensive operations.&lt;/li&gt;
&lt;li&gt;Building services to be resilient to failure is extremely liberating.&lt;/li&gt;
&lt;li&gt;JavaScript still sucks to use, package management is still hell and documentation is generally just a bit weak, considering you get zero type information from the language itself.&lt;/li&gt;
&lt;li&gt;Proper database indexes are the difference between good and shit.&lt;/li&gt;
&lt;li&gt;Caching is still amazing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Some of my favourite snippets of code:&lt;/p&gt;
&lt;h3 id="channel-based-interface-for-reading-off-of-a-queue" class="relative group"&gt;Channel based interface for reading off of a queue &lt;/h3&gt;&lt;p&gt;Look how neat this is, as waiting to read from the queue channel / sending to the processing channel are both blocking operations, this works as fast as these two components.
We are also able to pre-fetch a number of items from the queue&amp;rsquo;s file if we wanted to improve performance a bit.&lt;/p&gt;
&lt;p&gt;This also enables an easy method of gracefully shutting down the program.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;linkProcessor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;linkprocessor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewLinkProcessor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;linkStorage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;failOnError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Could not initialise link processor&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Begin processing...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;urlProcessingChan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;linkProcessor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SpawnWorkers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sigs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;chan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sigs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIGTERM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIGHUP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SIGKILL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ticker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewTicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Minute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;processing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;processing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;sigs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;processing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Received signal %s, shutting down gracefully...\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DeQueue&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;urlProcessingChan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%d urls in the queue&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;linkProcessor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GracefulShutdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;===== Shut down link processor =====&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="periodic-batcher-from-a-buffered-channel" class="relative group"&gt;Periodic batcher from a buffered channel &lt;/h3&gt;&lt;p&gt;This is a slightly improved version from the original post.&lt;/p&gt;
&lt;p&gt;This turns out to be a great way to convert a message by message insert operation into a batchable operation.
It also works as a great way to rate limit database operations, as you can still fill up the channel up to the buffer size, and slowly drain it at whatever rate you choose.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;PageBatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;endSignal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="kd"&gt;chan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;doneChan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;chan&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="c1"&gt;// We want it to die on the endSignal, but otherwise keep looping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;endSignal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;doneChan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;After&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Millisecond&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="nx"&gt;Remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxBatch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bufChan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;					&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;					&lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Remaining&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="c1"&gt;// The batch processing&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BatchAddPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;				&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Batch adding pages failed!: %e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;			&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;		&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title>🗺 Visualising location history</title><link>https://jamesjarvis.io/posts/2020/12/mappyboi/</link><pubDate>Tue, 01 Dec 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/12/mappyboi/</guid><category>Projects</category><description>Where did he come from, where did he go?</description><content:encoded>&lt;p&gt;&lt;a href="https://github.com/jamesjarvis/mappyboi" target="_blank" rel="noreferrer"&gt;Check it out on GitHub!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So this one is more of a revisit than a totally unique project, but this all came about thanks to a little sprinkling of &lt;em&gt;dependency hell&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The goal of this little project was to be able to visualise my google location history (and other source of location info such as strava activities or workouts from my apple watch) on a strava style heatmap &lt;a href="https://www.strava.com/heatmap" target="_blank" rel="noreferrer"&gt;like this one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My first foray into this was little more than a fork of luka1199/geo-heatmap &lt;a href="https://github.com/luka1199/geo-heatmap" target="_blank" rel="noreferrer"&gt;link&lt;/a&gt; as I&amp;rsquo;m a sucker for believing that a lot of GitHub stars means a project is well maintained (silly me).&lt;/p&gt;
&lt;p&gt;A previous fork I made tried to incorporate Poetry &lt;a href="https://python-poetry.org" target="_blank" rel="noreferrer"&gt;link&lt;/a&gt; for more deterministic python dependency management and execution.
Sounds good right?&lt;/p&gt;
&lt;h2 id="python-dependency-hell" class="relative group"&gt;Python dependency hell &lt;/h2&gt;&lt;p&gt;However, when trying to run this script after upgrading to macOS 11, I was getting some issues while trying to download NumPy (see more &lt;a href="https://github.com/numpy/numpy/issues/17784" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I know this may seem like a little issue, but the goal for this project was to simply rerun this script every year or so, minimal effort so I can just update a file with my latest location history.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NumPy doesn&amp;rsquo;t work? Why the fuck not? Why do I care? What does NumPy have to do with creating a .html file?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since this is ultimately a fairly simple project I decided to just spend a couple hours and rewrite in one of the most backwards compatible languages I know of: &lt;strong&gt;Golang&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I also wanted to reduce the dependency on random remote scripts in the resultant .html file as well, so I could open this file with no internet connectivity, in 50 years if I wanted to.&lt;/p&gt;
&lt;h2 id="you-cannot-escape-dependencies" class="relative group"&gt;You cannot escape dependencies &lt;/h2&gt;&lt;p&gt;Ok so this section is a &lt;em&gt;little bit of a lie&lt;/em&gt;, given enough effort I&amp;rsquo;m sure you can.&lt;/p&gt;
&lt;p&gt;My goal of just having a simple program I can run once every year with zero code touching is kinda sorta there (I haven&amp;rsquo;t given it enough time to check).
I&amp;rsquo;m hoping that Go&amp;rsquo;s promise of constant backwards compatibility should help this out, and the removal of reliance on remote scripts means that as long as the one dependency I use in go doesn&amp;rsquo;t go offline, then we should be chill.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Why do you even have dependencies?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m lazy, ok?&lt;/p&gt;
&lt;p&gt;Only downside going ahead is that I am completely reliant upon the following packages (and github itself) remaining publicly accessible.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;github.com/tkrajina/gpxgo v1.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;github.com/urfave/cli/v2 v2.3.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Whilst this little pain in the ass has taught me to be a little bit hesitant to blindly import random dependencies, tbh I&amp;rsquo;ll probs carry on doing so, because dependencies are hell but I love getting code for free.&lt;/p&gt;</content:encoded></item><item><title>⠪ Mapping the Internet (?)</title><link>https://jamesjarvis.io/posts/2020/10/backlink-crawler/</link><pubDate>Sun, 04 Oct 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/10/backlink-crawler/</guid><category>Projects</category><description>Links on links on links, man</description><content:encoded>&lt;p&gt;Once upon a time I was looking at my website, and I realised that I tend to link to a lot of random sites within each post I write.&lt;/p&gt;
&lt;p&gt;I thought it would be interesting to find out all of the sites that I link to, and see if I could categorise them.&lt;/p&gt;
&lt;p&gt;Unfortunately, I never really got around to figuring out the whole categorisation thing (like what do you even do? Manually classify them? Do some kind of NLP on the page title? &lt;a href="http://data.webarchive.org.uk/opendata/ukwa.ds.1/classification/" target="_blank" rel="noreferrer"&gt;These guys&lt;/a&gt; have attempted it previously but even that dataset only contains ~27k URL&amp;rsquo;s and seems fairly limited to UK sites).&lt;/p&gt;
&lt;p&gt;This then got me thinking about what kind of sites &lt;em&gt;link to me&lt;/em&gt;.
This would be a &lt;strong&gt;backlink checker&lt;/strong&gt;, that for some reason I had never heard of or thought about before.&lt;/p&gt;
&lt;p&gt;I knew that Google, the NSA and many others regularly crawl the internet in order to improve their search products - &lt;a href="https://www.cloudflare.com/learning/bots/what-is-a-web-crawler/" target="_blank" rel="noreferrer"&gt;cloudflare explains it well&lt;/a&gt; - and I roughly knew that the more linked to your site was, the more popular it would be in search rankings.&lt;/p&gt;
&lt;p&gt;However I didn&amp;rsquo;t know how to find your individual backlinks - I just assumed it was some secretly guarded knowledge due to the sheer amount of effort required to find these backlinks.&lt;/p&gt;
&lt;p&gt;Of course, me being me I didn&amp;rsquo;t bother googling &amp;ldquo;uh how do i found out who links to my site on the interwebs pls&amp;rdquo;, I just thought it would be easier to build a crawler myself 🤦‍♂️.&lt;/p&gt;
&lt;p&gt;If you want to find out your own backlinks from an actual SEO service, skip to &lt;a href="#Part-2:-Actual-SEO-services-for-finding-your-own-backlinks"&gt;Part 2&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="part-1-building-a-link-spider" class="relative group"&gt;Part 1: Building a link spider &lt;/h2&gt;&lt;p&gt;I attempted and revisited this several times (to improve performance, mainly), but it basically started because I was heading to &lt;a href="https://en.wikipedia.org/wiki/Wales" target="_blank" rel="noreferrer"&gt;the middle of nowhere&lt;/a&gt; for a family holiday and I wanted to leave my laptop back at home doing some crawling while I couldn&amp;rsquo;t hear the fans.&lt;/p&gt;
&lt;p&gt;Originally, I thought I would just write the crawler from scratch (it&amp;rsquo;s not hard to do tbf), but then I stumbled across &lt;a href="http://go-colly.org/" target="_blank" rel="noreferrer"&gt;Colly&lt;/a&gt; that looked like it could speed up development for me.&lt;/p&gt;
&lt;p&gt;My original version just used a basic colly set up, with a simple postgresql db set up to record pages visited, and links from page to page.
Simple enough, and took an hour or so to code, so I left it running the evening before we left to see how far it could go.&lt;/p&gt;
&lt;p&gt;Well, when I came back 4 days later I found that the fans had stopped, and discovered that the process had killed itself after scraping only 1.5 million links over 36 hours (averaging only ~12 links per second).&lt;/p&gt;
&lt;p&gt;I couldn&amp;rsquo;t see an obvious reason why it would have crapped itself, so I had a deeper look using go&amp;rsquo;s fantastic inbuilt &lt;a href="https://pkg.go.dev/net/http/pprof" target="_blank" rel="noreferrer"&gt;pprof&lt;/a&gt; tool for delving into the internal stats of a running go app.&lt;/p&gt;
&lt;p&gt;What I had found out was that the crawler had likely ran out of memory, but most surprising to me was that colly&amp;rsquo;s crawlers seemed to just spawn another process for each &lt;code&gt;a[href]&lt;/code&gt; element found, causing them to spawn hundreds of goroutines &lt;em&gt;every second&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is a bit daft, so the first improvement I made was to switch to colly&amp;rsquo;s &lt;a href="http://go-colly.org/docs/examples/queue/" target="_blank" rel="noreferrer"&gt;queue mode&lt;/a&gt;, as that seemed to handle colly&amp;rsquo;s goroutine obsession, and allowed me to sacrifice scraping certainty (since any links found beyond the queue limit are just discarded) for runtime certainty.&lt;/p&gt;
&lt;p&gt;Secondly, let&amp;rsquo;s focus on that paltry 12 links/second.
The first improvement I could think of was just &lt;a href="https://youtu.be/uNy_MLr8mXA" target="_blank" rel="noreferrer"&gt;&lt;em&gt;spawning more processes&lt;/em&gt;&lt;/a&gt;, but the new bottleneck became the way that I was pushing data to postgresql.&lt;/p&gt;
&lt;p&gt;Previously, I was just creating a new insert transaction every time a new link was found, that was hammering my db with well over 2000 transactions per second and likely being the reason why all of these goroutines were hanging around for so long.&lt;/p&gt;
&lt;p&gt;So, I moved to &lt;strong&gt;batching&lt;/strong&gt;, by creating &lt;em&gt;n&lt;/em&gt; database workers, I could happily push as much data into them through some go channels, and then I could consume up to &lt;em&gt;x&lt;/em&gt; links at a time from these channels, and whack those in the database in one go.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Worker is the worker process for the link batcher&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// This is straight up nicked from https://blog.drkaka.com/batch-get-from-golangs-buffered-channel-9638573f0c6e&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;LinkBatcher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;endSignal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;chan&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// We want it to die on the endSignal, but otherwise keep looping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;endSignal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Die on endSignal received&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Now I&amp;#39;m typing this blog, I realise there is a potential deadlock here,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// whereby the endSignal may not be received while we wait for the next link&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// oh well, turns out we never use an endSignal in an infinite scrape anyway ¯\_(ツ)_/¯&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bufChan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;remains&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxBatch&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Here we use a go label to break out of the repetition loop if there are no more links&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// in the channel, otherwise it will naturally break once the max batch size is reached.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;remains&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bufChan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Remaining&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Then we just whack those links into a database batch insert function.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;lb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BatchAddLinks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Batch adding links failed!: %e&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Obviously, this introduces a whole bunch of fun async issues, such as potential duplicates and foreign key constraints (this can be solved by reorganising the db structure), and to that I say &lt;em&gt;fuck it&lt;/em&gt;; &lt;code&gt;ON CONFLICT DO NOTHING&lt;/code&gt;, turning a blind eye to those issues I should probably engineer out of this.&lt;/p&gt;
&lt;p&gt;The only thing I did kinda care about was removing duplicates from being added to the channel, since if I was going to add 5000 links, with 4000 of those potential duplicates, it would seriously slow down any transaction.&lt;/p&gt;
&lt;p&gt;For this, I just used a simple &lt;a href="https://www.interviewcake.com/concept/java/lru-cache" target="_blank" rel="noreferrer"&gt;LRU Cache&lt;/a&gt; called &lt;a href="https://github.com/hashicorp/golang-lru" target="_blank" rel="noreferrer"&gt;golang-lru&lt;/a&gt; to filter out some of the most common URLs.&lt;/p&gt;
&lt;p&gt;In the current iteration (that I&amp;rsquo;m not going to bother improving for the foreseeable future and you can critique &lt;a href="https://github.com/jamesjarvis/web-graph" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;), I managed to collect ~ 50 million links between ~ 9 million pages in ~ 3 days.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a happy 16x improvement upon my initial attempt, but I am unfortunately starting to hit the limits of my 7 year old laptop (running the &lt;code&gt;COUNT(*)&lt;/code&gt; query just to get those numbers took several minutes with nothing else running&amp;hellip;)&lt;/p&gt;
&lt;p&gt;If I can be fully bothered, I may write another post exploring the data, or leave it running a couple weeks and upload a csv file of the links found, but for now I&amp;rsquo;ll leave you with a couple interesting things I found:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wikipedia is a crawler&amp;rsquo;s best friend, with the #1 number of pages found.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Top 5 for reference:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;host&lt;/th&gt;
					&lt;th&gt;num_pages&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;en.wikipedia.org&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;2375201&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;twitter.com&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;533493&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;web.archive.org&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;464023&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;artuk.org&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;394299&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&amp;ldquo;t.co&amp;rdquo;&lt;/td&gt;
					&lt;td&gt;258350&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;I only managed to find a total of 5 external backlinks to &amp;lt;jamesjarvis.io&amp;gt; pages through this crawler, all of which I also link to within my own website, so I guess I would have had to run the crawler a LOT longer in order to organically find any proper backlinks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Regrettably, I am unable to draw any further conclusions, since my old ass laptop ran out of storage before completing this simple query for finding the top 5 backlinked sites:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-SQL" data-lang="SQL"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from_page_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;num_backlinks&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;links_visited&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INNER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pages_visited&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;links_visited&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_page_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pages_visited&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;num_backlinks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LIMIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(No, really, apparently running this query took up 10GB+ of temporary storage on the database and since my laptop is filled with 200GB of &amp;ldquo;other&amp;rdquo;, it just died.)&lt;/p&gt;
&lt;p&gt;#GetJamesADecentDevMachine2021&lt;/p&gt;
&lt;p&gt;In the future, I would like to continue with the original &amp;ldquo;mapping the internet&amp;rdquo; goal, and see if it would be possible to generate an image of the internet link graph?
Although certainly not with this laptop&amp;hellip;&lt;/p&gt;
&lt;h2 id="part-2-actual-seo-services-for-finding-your-own-backlinks" class="relative group"&gt;Part 2: Actual SEO services for finding your own backlinks &lt;/h2&gt;&lt;p&gt;Ok, that handcrafted web crawler might have been cool and all, but the max I could get before crashing my PC was only a few million links, at a pathetic 100 links/second.&lt;/p&gt;
&lt;p&gt;This pales to the big leagues, who &lt;a href="https://ahrefs.com/big-data" target="_blank" rel="noreferrer"&gt;according to ahrefs&lt;/a&gt; have approximately a &lt;em&gt;fuck ton&lt;/em&gt; more resources than I do for this kind of stuff.
Some things you just have to leave to the professionals&amp;hellip;&lt;/p&gt;
&lt;p&gt;So heres the list of all the free* backlink checkers if you are ever curious about your own SEO performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ahrefs.com/backlink-checker" target="_blank" rel="noreferrer"&gt;Ahrefs&lt;/a&gt; - seems to have the largest trough of data at their disposal.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neilpatel.com/backlinks/" target="_blank" rel="noreferrer"&gt;NeilPatel&lt;/a&gt; - I&amp;rsquo;ve started using this tool now and it seems pretty cool. Might be a good game to increase your backlinks overtime.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://smallseotools.com/backlink-checker/" target="_blank" rel="noreferrer"&gt;SmallSEOTools&lt;/a&gt; - This one got some slightly weird results for me, so idk how good it is.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.seoreviewtools.com/valuable-backlinks-checker/" target="_blank" rel="noreferrer"&gt;SEOReviewTools&lt;/a&gt; - This one was kinda interesting, as it showed uses of static assets from my site. So if you want to see why one of your images is getting 1000+ views and your posts aren&amp;rsquo;t, this could help.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thehoth.com/backlinks-checker/" target="_blank" rel="noreferrer"&gt;TheHoth&lt;/a&gt; - Wants an email, not a fan of that.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sitechecker.pro/backlinks-checker/" target="_blank" rel="noreferrer"&gt;SiteChecker&lt;/a&gt; - Limits results so whilst you can see a count of backlinks, you can&amp;rsquo;t see more than 20 of the actual referring urls.&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>👨‍🎓 Graduating in a Pandemic/Recession</title><link>https://jamesjarvis.io/posts/2020/08/uni-memoirs/</link><pubDate>Sat, 01 Aug 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/08/uni-memoirs/</guid><category>Thoughts</category><description>Well, that was underwhelming&amp;hellip;</description><content:encoded>&lt;p&gt;So yeah, that text message above is the only celebration of completing university that I have&amp;hellip;&lt;/p&gt;
&lt;p&gt;My sister graduated a year before me, and photos of her throwing her cap in the air are scattered around my family&amp;rsquo;s mantlepieces.
Yet, all I have is a text?&lt;/p&gt;
&lt;p&gt;Now, I&amp;rsquo;m being a little unfair - obviously this is not just a problem for me, millions of students around the world are having to deal with a slightly dampened celebration to end their &lt;em&gt;very&lt;/em&gt; expensive education.
Furthermore, the university has said that they will try and hold a ceremony in November at the Cathedral (however, November is also a likely bet for a winter wave of coronavirus).&lt;/p&gt;
&lt;p&gt;But, here I am.&lt;/p&gt;
&lt;h2 id="grades" class="relative group"&gt;Grades &lt;/h2&gt;&lt;p&gt;This is a simple one.
The United Kingdom follows a &lt;a href="https://en.wikipedia.org/wiki/British_undergraduate_degree_classification" target="_blank" rel="noreferrer"&gt;three tier classification system&lt;/a&gt;, and you can read more about it if you really want to compare UK vs {insert country here} grades.&lt;/p&gt;
&lt;p&gt;For me, I now have a First Class Honours Bachelors of Science degree in Computer Science (Artificial Intelligence) with a year in industry.&lt;/p&gt;
&lt;p&gt;As is typical with &lt;a href="https://jamesjarvis.io/posts/2020/01/speedtest/"&gt;most things I do&lt;/a&gt;, I logged these grades (including per module and per assignment, but that&amp;rsquo;s too boring to share) into a spreadsheet.&lt;/p&gt;
&lt;p&gt;I made the spreadsheet back in year 1, when I realised the path of least resistance of uni was to just work harder in the early years, to give yourself some headroom later on to get worse grades (or to just take a holiday and not work as hard as you should - like I tended to do).
This turned out to be a good idea, as even though I ended up with &lt;code&gt;80.3%&lt;/code&gt; overall, you can see the trendline moving downwards!&lt;/p&gt;
&lt;iframe title="University grades" width="785" height="461" seamless frameborder="0" scrolling="no" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vQJoij4NY302PZpMmS2EB6Im7FD2LE2SB84i072PFup64P6BVSSSH4nv-YPKYnsauYqHU6UIs_5dsgK/pubchart?oid=1448414517&amp;amp;format=interactive"&gt;&lt;/iframe&gt;
&lt;p&gt;Ultimately, do grades matter?&lt;/p&gt;
&lt;p&gt;







&lt;/p&gt;
&lt;p&gt;Well, any additional effort I put in to get above 70% was kinda pointless, and probably time better spent kayaking or other socialising but 🤷‍♂️.&lt;/p&gt;
&lt;p&gt;I actually started looking for my next job before I graduated, and to be honest &lt;em&gt;most of the recruiters didn&amp;rsquo;t ask my grade&lt;/em&gt;, not even my predicted.&lt;/p&gt;
&lt;p&gt;What they cared about most was my personal projects, previous work experience at Cisco, and &lt;a href="https://jamesjarvis.io/posts/2018/12/musish/"&gt;Musish&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="but-at-what-cost" class="relative group"&gt;But at what cost? &lt;/h2&gt;&lt;p&gt;Ok, I&amp;rsquo;m more than just a little bit salty at how much University costs.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not a fan of how all my peers blindly told me (and everyone of my age) to go to university &lt;em&gt;ignore the fine print costs&lt;/em&gt;, and have a good time, go drinking, get good grades, get a job.&lt;/p&gt;
&lt;p&gt;In my second year I realised how expensive it was to have fun at university, not to mention the 5.4% interest on all student loans!!&lt;/p&gt;
&lt;p&gt;So, all my money saved from working in my third and fourth years I used to pay for my tuition, and I stopped going out as much to save some money.
I&amp;rsquo;m just annoyed it took me almost 2 years to realise, and nobody even mentioned the real world impacts of this when I started.&lt;/p&gt;
&lt;p&gt;If I had the option, I would have probably skipped the first year and jumped straight into the second year.
Sure, there would be a little less time to party but I wasn&amp;rsquo;t exactly a sesh gremlin in my first year either.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d much rather work hard &lt;em&gt;and&lt;/em&gt; play hard.&lt;/p&gt;
&lt;h2 id="what-i-really-learnt-from-university" class="relative group"&gt;What I really learnt from university &lt;/h2&gt;&lt;p&gt;Ultimately, I agree with a lot of the things &lt;a href="https://www.cnbc.com/2020/03/09/elon-musk-says-college-is-for-fun-not-for-learning-echoing-thiel.html" target="_blank" rel="noreferrer"&gt;said by Elon Musk, and others&lt;/a&gt;, that university is more for the social aspect than anything else.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not necessarily a bad thing.&lt;/p&gt;
&lt;p&gt;I have never jumped out my comfort zone, tried more things, met more people, changed my opinions as much as I did at university.&lt;/p&gt;
&lt;p&gt;You can see from &lt;a href="https://jamesjarvis.io/tags/"&gt;my One Second Everyday videos&lt;/a&gt; just how amazing the experience was.&lt;/p&gt;
&lt;p&gt;What I loved was the sheer concentration of people all similar age, all &lt;em&gt;trying&lt;/em&gt; to learn about something they are interested in.&lt;/p&gt;
&lt;p&gt;I used to tag along to lectures from different courses, and made &lt;a href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/"&gt;WhatsUpKent&lt;/a&gt;, a little web app to make it easy for others to do the same.
There&amp;rsquo;s nothing like walking out of a databases lecture and into a lecture on quantum mechanics, and then into a lecture on postmodern cartoons.&lt;/p&gt;
&lt;p&gt;This curiosity and the knowledge that &amp;ldquo;yeah, I can actually do that if I want&amp;rdquo; is something that I treasure from my time at Kent, and I have to shout out the Travel Society, Sailing Club and Kayaking Club and all my housemates for being absolute legends 🙌.&lt;/p&gt;
&lt;h2 id="what-next" class="relative group"&gt;What next? &lt;/h2&gt;&lt;p&gt;Well, I had hoped to take a few months off and travel a &lt;em&gt;heck of a lot&lt;/em&gt; in 2020.
But, coronavirus put an end to that.&lt;/p&gt;
&lt;p&gt;As for the recession, well, I decided to get a job in a startup.
&lt;a href="https://thoughtmachine.net/" target="_blank" rel="noreferrer"&gt;ThoughtMachine&lt;/a&gt; to be precise, and whilst I&amp;rsquo;ve only been there for a couple weeks as of writing this I&amp;rsquo;ve been really enjoying the learning curve.&lt;/p&gt;
&lt;p&gt;Yes, I know it&amp;rsquo;s not the smartest idea to work in a risky startup during a recession but hey, if I can&amp;rsquo;t go trekking across Australia I need to fulfil my risk appetite somehow 😉.&lt;/p&gt;
&lt;p&gt;I had hoped to move to London with a few friends but London&amp;rsquo;s rent is a little too high considering how much you are able to do there during a recession, so I have decided to stay with the fam for a bit.&lt;/p&gt;
&lt;p&gt;







&lt;/p&gt;</content:encoded></item><item><title>21 Years Old</title><link>https://jamesjarvis.io/posts/2020/06/21-years-old/</link><pubDate>Tue, 23 Jun 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/06/21-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2019 to 23rd June 2020.&lt;/p&gt;
&lt;p&gt;Waved goodbye to Cali, met the fam in Florida. Quick catch ups with the friends and family I haven’t seen for a year then straight into the final part of my degree.
Joined Kayaking this time, got to know some lovely people and even travel to Wales with them! Kept working part time with my Cisco team throughout uni, and tinkering in my free time. Took mum to Morocco, met some friends in Barcelona, and had a weekend in Amsterdam with Maj and Sam just a few days before the Coronavirus lockdown!&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2019 to 23rd June 2020.&lt;/p&gt;
&lt;p&gt;Waved goodbye to Cali, met the fam in Florida. Quick catch ups with the friends and family I haven’t seen for a year then straight into the final part of my degree.
Joined Kayaking this time, got to know some lovely people and even travel to Wales with them! Kept working part time with my Cisco team throughout uni, and tinkering in my free time. Took mum to Morocco, met some friends in Barcelona, and had a weekend in Amsterdam with Maj and Sam just a few days before the Coronavirus lockdown!&lt;/p&gt;
&lt;p&gt;Lockdown meant I had to slow down a bit, enjoy time with the family and celebrate mine and my sister&amp;rsquo;s birthday at home for the first time in 4 years.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/mRPCmN24fRs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>☂️ E-Ink Weather Dashboard</title><link>https://jamesjarvis.io/posts/2020/06/eink-dashboard/</link><pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/06/eink-dashboard/</guid><category>Projects</category><description>Fun little rarely updating dashboard.</description><content:encoded>&lt;p&gt;Another one of my lockdown projects&amp;hellip;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always like the idea of making an always-on display.
Something like the Magic Mirror project &lt;a href="https://magicmirror.builders/" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;, or a productivity dashboard using an LCD display &lt;a href="https://www.jlwinkler.com/2017-05-25/raspberry-pi-productivity-dashboard/" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;, but I also wanted something that is a bit more visible in bright light and uses a little bit less electricity.&lt;/p&gt;
&lt;p&gt;Hence, I settled on the idea of making a giant e-ink display that I could use to show whatever I wanted.
Until I saw &lt;a href="https://amzn.to/3iHGepG" target="_blank" rel="noreferrer"&gt;how expensive the panels are&lt;/a&gt;, and I settled on a much smaller &lt;a href="https://amzn.to/2E5lol0" target="_blank" rel="noreferrer"&gt;7.5&amp;quot; e-ink 2 colour display&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-does-it-do" class="relative group"&gt;What does it do? &lt;/h2&gt;&lt;p&gt;Well, there&amp;rsquo;s a few modes (in case I ever get bored).&lt;/p&gt;
&lt;p&gt;Normally, I keep it in &lt;em&gt;weather&lt;/em&gt; mode, whereby every 10 minutes it will update and show the following:&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_weather_hu_4f74bde528523a7d.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="2577"
 height="4030"
 class="mx-auto my-0 rounded-md"
 alt="Weather mode"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_weather_hu_5e9350a3bbb027a7.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;The red splotches are rain&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temperature&lt;/li&gt;
&lt;li&gt;Current weather conditions&lt;/li&gt;
&lt;li&gt;Rain chart for the next few hours&lt;/li&gt;
&lt;li&gt;Air quality&lt;/li&gt;
&lt;li&gt;Sunrise and Sunset times&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.isstracker.com/" target="_blank" rel="noreferrer"&gt;The next time the ISS will pass overhead&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Weather radar of the UK &lt;a href="https://www.metoffice.gov.uk/public/weather/observation/rainfall-radar#?map=Rainfall&amp;amp;zoom=5" target="_blank" rel="noreferrer"&gt;(just because it looks cool)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I won&amp;rsquo;t lie, the 3 hour rainwall forecast is nowhere near as accurate as &lt;a href="https://darksky.net/" target="_blank" rel="noreferrer"&gt;DarkSky&lt;/a&gt; was, and the display panel I was sent didn&amp;rsquo;t display red&amp;rsquo;s anywhere near as vibrantly as other panels I have seen (I think it was just a faulty panel but I couldn&amp;rsquo;t be bothered to pay for shipping to China and wait another month), but overall it&amp;rsquo;s worked exactly as I have envisioned!&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also the &lt;em&gt;cowsay&lt;/em&gt; mode, whose sole purpose is to present a random dad joke every hour, in the popular &lt;a href="https://en.wikipedia.org/wiki/Cowsay" target="_blank" rel="noreferrer"&gt;linux cli tool&lt;/a&gt; format.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_cowsay_hu_46cd555b09ddb5d9.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Cowsay mode"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_cowsay_hu_4d6cffc2196960dd.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;cowsay moo&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="how-to-build-it" class="relative group"&gt;How to build it? &lt;/h2&gt;&lt;p&gt;It&amp;rsquo;s relatively simple, really&amp;hellip;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_pi_hu_b60fcc4fbe981e87.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="The hardware"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/eink-dashboard/display_pi_hu_89878cb97343790.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;I like raw materials just as much as I like an easy assembly&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You only need a few components: A &lt;a href="https://amzn.to/2DWrynQ" target="_blank" rel="noreferrer"&gt;Raspberry Pi Zero W&lt;/a&gt;, an e-ink display (I chose &lt;a href="https://amzn.to/2E5lol0" target="_blank" rel="noreferrer"&gt;this 7.5&amp;quot; 2 colour display from Waveshare&lt;/a&gt;), and &lt;em&gt;something&lt;/em&gt; to mount it all one.&lt;/p&gt;
&lt;p&gt;The instructions for putting it together are fairly self explanatory, so I&amp;rsquo;m not going to bore you.
Setting up a headless Raspberry Pi (so you can just access it over SSH is explained beautifully simply over at &lt;a href="https://www.raspberrypi.org/documentation/configuration/wireless/headless.md" target="_blank" rel="noreferrer"&gt;the Raspberry Pi site&lt;/a&gt;)
Aside from that it&amp;rsquo;s just plug and play.&lt;/p&gt;
&lt;p&gt;The software is a little bit more of a pain in the ass, Waveshare have a &lt;a href="https://github.com/waveshare/e-Paper" target="_blank" rel="noreferrer"&gt;GitHub repo&lt;/a&gt; with drivers for each of their displays, but no perfect method of building a UI for these displays, so the best way to push something to the display is in the form of a bitmap (essentially png) image.
The refresh rate of the display is a pathetic ~1 minute so don&amp;rsquo;t worry too much about how long it takes to build that image.&lt;/p&gt;
&lt;p&gt;I have a repository with all the code for this project on my GitHub &lt;a href="https://github.com/jamesjarvis/eink-dashboard" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;, that you just need to clone into the RPI&amp;rsquo;s home directory, and then write your own &lt;code&gt;settings.py&lt;/code&gt; file from the example file provided.&lt;/p&gt;
&lt;p&gt;It makes extensive use of various API&amp;rsquo;s, including &lt;a href="https://www.climacell.co/weather-api/" target="_blank" rel="noreferrer"&gt;Climacell&lt;/a&gt; for the weather data, &lt;a href="http://api.open-notify.org/iss-pass.json" target="_blank" rel="noreferrer"&gt;ISS Open Notify&lt;/a&gt; for the ISS times, &lt;a href="https://icanhazdadjoke.com/" target="_blank" rel="noreferrer"&gt;ICanHazDadJoke&lt;/a&gt; for the dad joke service, and &lt;a href="https://helloacm.com/api/cowsay/" target="_blank" rel="noreferrer"&gt;This online cowsay generator&lt;/a&gt; because I couldn&amp;rsquo;t be bothered to generate it myself, although looking back it would probably have been easier to do it manually.&lt;/p&gt;
&lt;p&gt;For the map images, I used the &lt;a href="https://github.com/openmaptiles/maptiler-toner-gl-style" target="_blank" rel="noreferrer"&gt;OpenStreetMap Toner&lt;/a&gt; style tiles for the map and the &lt;a href="https://www.metoffice.gov.uk/public/weather/observation/rainfall-radar#?map=Rainfall&amp;amp;zoom=5" target="_blank" rel="noreferrer"&gt;MetOffice rain radar&lt;/a&gt; tiles for the rain overlays.
I originally used &lt;a href="https://openweathermap.org/weathermap" target="_blank" rel="noreferrer"&gt;OpenWeatherMap&lt;/a&gt;, but whilst it was good at global coverage of rainfall, it had very low resolution.&lt;/p&gt;
&lt;p&gt;To run the scripts all you need to do is create a cron job for it to update every &lt;em&gt;x&lt;/em&gt; minutes.
You can enter the cron editor with &lt;code&gt;crontab -e&lt;/code&gt; and just input &lt;code&gt;*/10 * * * * python3 /home/pi/mappyboi.py&lt;/code&gt; for a 10 minute update schedule.&lt;/p&gt;
&lt;h2 id="next-steps" class="relative group"&gt;Next steps &lt;/h2&gt;&lt;p&gt;I practically never do hardware projects and this has been super fun!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m still thinking of ideas to use it for (if you have any ideas of a cool use for this format of display, contact me!)&lt;/p&gt;
&lt;p&gt;Ideas I&amp;rsquo;ve currently considered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
 
 &lt;a href="https://jamesjarvis.io/posts/2020/03/predictions/"&gt;Coronavirus cases tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Public transit departure times&lt;/li&gt;
&lt;li&gt;Health dashboard&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dougswordclocks.com/" target="_blank" rel="noreferrer"&gt;Word clock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>📸 Indoor Garden Timelapse</title><link>https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/</link><pubDate>Tue, 02 Jun 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/</guid><category>Projects</category><description>Watching plants grow</description><content:encoded>&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/timelapse_hu_63fbe563749f552f.gif"
 
 &gt;
 








 
 
 
 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 &lt;img
 width="480"
 height="639"
 class="mx-auto my-0 rounded-md"
 alt="Indoor Garden Timelapse"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/timelapse_hu_228c83f17ec9875e.gif"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Who knew plants could move so fast?&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Another lockdown project!&lt;/p&gt;
&lt;p&gt;For some reason I&amp;rsquo;ve been getting into gardening over the lockdown, from building an automatic irrigation system for our newly built vegetable patch to taking part (and winning) a sunflower growing competition, it&amp;rsquo;s about the most interesting thing I could think of doing whilst being stuck in my house during a great spell of weather.&lt;/p&gt;
&lt;p&gt;This year, for my birthday I received an &lt;a href="https://amzn.to/31Xp40r" target="_blank" rel="noreferrer"&gt;indoor vegetable garden&lt;/a&gt;, and thought it would be fun to set up a timelapse camera to monitor the plants growing!&lt;/p&gt;
&lt;p&gt;Since I&amp;rsquo;m currently also slightly addicted to Raspberry Pi&amp;rsquo;s (now up to 4 in my collection!), I thought this would be a good use for one of them.&lt;/p&gt;
&lt;p&gt;So, I bought the &lt;a href="https://thepihut.com/products/adafruit-raspberry-pi-zero-w-camera-pack-includes-pi-zero" target="_blank" rel="noreferrer"&gt;Raspberry Pi Zero W camera combo&lt;/a&gt;, strapped it to the side of the garden and adjusted the focus of the camera with a pair of pliers to improve the focus a little bit.&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/pi-cam_hu_ce26cdc5074701af.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3024"
 height="4032"
 class="mx-auto my-0 rounded-md"
 alt="Pi Cam"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/pi-cam_hu_2b3703ccfdd36823.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The end result is this cute little video:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/DiBl9JMlBUI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;This little video was the result of 2 months of growing and almost 200GB of images!
I set up the camera to take a photo every 30 seconds (which in hindsight was a little bit too often, and the final video only took a frame each 16 minutes)&lt;/p&gt;
&lt;h2 id="scripts" class="relative group"&gt;Scripts &lt;/h2&gt;&lt;p&gt;I thought I would share the little script I used to pull images from the camera, sort them into good (clear, well exposed) and bad (too dark, fuzzy, etc), and then render them into a timelapse&amp;hellip;&lt;/p&gt;
&lt;p&gt;Firstly, on the camera all you need is a little script that helps with actually taking the photos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;take &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +&lt;span class="s2"&gt;&amp;#34;%Y-%m-%d_%H_%M_%S&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; raspistill -t &lt;span class="m"&gt;100&lt;/span&gt; -q &lt;span class="m"&gt;20&lt;/span&gt; -o /home/pi/timelapse-images/&lt;span class="nv"&gt;$DATE&lt;/span&gt;.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;take
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="m"&gt;29&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;take
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just &lt;code&gt;chmod +x&lt;/code&gt; it and add it to the cron jobs with &lt;code&gt;crontab -e&lt;/code&gt; and if you want it to run every minute, then append this to the crontab:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* * * * * bash /home/pi/camera.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, on another computer (preferably faster and on the same network as your RPI), you can set up a little script like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;!!! Requires EXTERNAL-SSD to be plugged in at all times !!!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Retrieving latest images&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rsync -a -v --ignore-existing --remove-source-files pi@pi-cam.local:/home/pi/timelapse-images/ /Volumes/EXTERNAL-SSD/timelapse-images
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Filtering and linking based on shutter speed to get rid of flickers - VERY SLOW STEP&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Checking and skipping a few thousand photos...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; f in /Volumes/EXTERNAL-SSD/timelapse-images/*.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;fname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# If not bad and not good (ie: not sorted yet), process and filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; ! -f /Volumes/EXTERNAL-SSD/filtered-timelapse-images/&lt;span class="nv"&gt;$fname&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ! -f /Volumes/EXTERNAL-SSD/bad-timelapse-images/&lt;span class="nv"&gt;$fname&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;exiftool -exif:shutterspeedvalue -s -s -s &lt;span class="nv"&gt;$f&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -c 3-&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;sss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;/.*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# If the correct shutter speed, then place in the filtered folder, else cache in the bad folder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$sss&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -gt &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Linking &lt;span class="nv"&gt;$fname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ln -s &lt;span class="nv"&gt;$f&lt;/span&gt; /Volumes/EXTERNAL-SSD/filtered-timelapse-images/&lt;span class="nv"&gt;$fname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; Caching bad photo &lt;span class="nv"&gt;$fname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ln -s &lt;span class="nv"&gt;$f&lt;/span&gt; /Volumes/EXTERNAL-SSD/bad-timelapse-images/&lt;span class="nv"&gt;$fname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#echo Skipping $fname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Generating timelapse&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -r &lt;span class="m"&gt;1920&lt;/span&gt; -pattern_type glob -i &lt;span class="s1"&gt;&amp;#39;/Volumes/EXTERNAL-SSD/filtered-timelapse-images/*.jpg&amp;#39;&lt;/span&gt; -vf &lt;span class="s2"&gt;&amp;#34;transpose=1&amp;#34;&lt;/span&gt; -vcodec libx265 -r &lt;span class="m"&gt;60&lt;/span&gt; /Volumes/EXTERNAL-SSD/filtered-timelapse.mp4 -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Done!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;open /Volumes/EXTERNAL-SSD/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script obviously requires an external ssd, and will require some modifications for you to use.
It also requires &lt;a href="https://ffmpeg.org/" target="_blank" rel="noreferrer"&gt;ffmpeg&lt;/a&gt; to be installed locally, so make sure that&amp;rsquo;s all set up before any annoying errors hit you in the face.&lt;/p&gt;
&lt;p&gt;Basically all this script does is download the latest images from the RPI, delete them from the RPI once done, then filter them into symlinked directories of &amp;ldquo;good&amp;rdquo; and &amp;ldquo;bad&amp;rdquo; photos - essentially caching them.&lt;/p&gt;
&lt;p&gt;Then it triggers a rendering job that takes &lt;em&gt;absolutely FOREVER&lt;/em&gt; to create a h.265 encoded timelapse of it all.
(Originally I used h.264 but h.265 took up honestly 1/8th of the space without losing much quality which is fantastic!)&lt;/p&gt;
&lt;p&gt;P.S. The gif at the start of the page is generated with a one liner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -ss &lt;span class="m"&gt;3&lt;/span&gt; -t &lt;span class="m"&gt;20&lt;/span&gt; -i /Volumes/JARVIS-SSD/filtered-timelapse.mp4 -filter_complex &lt;span class="s2"&gt;&amp;#34;[0:v] fps=10,scale=480:-1,split [a][b];[a] palettegen [p];[b][p] paletteuse&amp;#34;&lt;/span&gt; /Volumes/JARVIS-SSD/timelapse.gif
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, gifs are rather inefficient, the better option would be an &lt;a href="https://developers.google.com/speed/webp/faq" target="_blank" rel="noreferrer"&gt;animated webp&lt;/a&gt; image, which is unfortunately not supported by GatsbyJS, nor some &lt;a href="https://caniuse.com/#search=webp" target="_blank" rel="noreferrer"&gt;old browsers&lt;/a&gt;, but it would be 10% the size of the gif version (and better quality!) - to generate it I used the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ffmpeg -ss &lt;span class="m"&gt;3&lt;/span&gt; -t &lt;span class="m"&gt;20&lt;/span&gt; -i /Volumes/JARVIS-SSD/filtered-timelapse.mp4 -filter_complex &lt;span class="s2"&gt;&amp;#34;[0:v] fps=10,scale=640:-1&amp;#34;&lt;/span&gt; -vcodec libwebp -lossless &lt;span class="m"&gt;1&lt;/span&gt; -q &lt;span class="m"&gt;30&lt;/span&gt; -preset default -loop &lt;span class="m"&gt;0&lt;/span&gt; -an -vsync &lt;span class="m"&gt;0&lt;/span&gt; /Volumes/JARVIS-SSD/timelapse.webp -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hope you&amp;rsquo;ve enjoyed!&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/garden-patch_hu_a6a3fe19d4ad5a2a.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3890"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Garden Before"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/garden-patch_hu_4d3e44eb70f4faff.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/garden-patch-grown_hu_362d937e1756d0b7.jpg"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="4032"
 height="3024"
 class="mx-auto my-0 rounded-md"
 alt="Garden After"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2020/06/indoor-garden-timelapse/garden-patch-grown_hu_e3aa607e0f9d56d9.jpg"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>📦 IPFS Web Hosting</title><link>https://jamesjarvis.io/posts/2020/05/ipfs-web-hosting/</link><pubDate>Sat, 02 May 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/05/ipfs-web-hosting/</guid><category>Projects</category><description>I thought IPFS was supposed to be permament&amp;hellip;</description><content:encoded>&lt;p&gt;2020 has been defined by The Lockdown &lt;a href="https://www.bbc.co.uk/news/uk-52084517" target="_blank" rel="noreferrer"&gt;(yay?)&lt;/a&gt;.
From March to July (and perhaps again, if the &lt;a href="https://www.bbc.co.uk/news/uk-53159918" target="_blank" rel="noreferrer"&gt;(potential)&lt;/a&gt; second wave is to come), basically everything shut down and we were all forced to spend time with family, and do nothing.&lt;/p&gt;
&lt;p&gt;Well, around this time I was thinking &amp;ldquo;what are the problems humanity will face in the next 100 years?&amp;rdquo;, and at some point I will write a little post outlining my daft ideas.&lt;/p&gt;
&lt;p&gt;But during this, I came across the &lt;a href="https://ipfs.io" target="_blank" rel="noreferrer"&gt;IPFS&lt;/a&gt; project, and I&amp;rsquo;m astonished at the idea of solving a problem that does not yet exist.&lt;/p&gt;
&lt;h2 id="what-is-ipfs" class="relative group"&gt;What is IPFS &lt;/h2&gt;&lt;p&gt;Their goal is to create a distributed web protocol that can help distribute content to where it is most requested.
Ideally, this aims to prevent issues of enormous latencies that may arise from traditional centralised services, if humanity becomes interplanetary.&lt;/p&gt;
&lt;p&gt;An example being, if you are living on mars, and the twitter servers are still hosted on earth, who would want to browse twitter if it took &lt;a href="https://blogs.esa.int/mex/2012/08/05/time-delay-between-mars-and-earth/" target="_blank" rel="noreferrer"&gt;13 minutes&lt;/a&gt; between opening twitter and each tweet starting to load?&lt;/p&gt;
&lt;p&gt;Exactly, &lt;a href="https://www.youtube.com/watch?v=zGxwbhkDjZM" target="_blank" rel="noreferrer"&gt;ain&amp;rsquo;t nobody got time for that&lt;/a&gt;.
IPFS is basically a mix between a conventional file system, and torrents.
The basic idea is that if an IPFS node requests a file (using a content-addressable hash), then that node automatically starts serving that file to other nodes requesting it.
The benefit could be that if for example a video were to go viral, rather than the central server being absolutely hammered with requests, each person would essentially be downloading it off their neighbour, greatly reducing network congestion.&lt;/p&gt;
&lt;p&gt;Now, I am certainly not the first to do this, and a great write up can be found &lt;a href="https://withblue.ink/2019/03/20/hugo-and-ipfs-how-this-blog-works-and-scales.html" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Long story short, I set up a little &lt;a href="https://github.com/ipfs/go-ipfs" target="_blank" rel="noreferrer"&gt;Go-IPFS&lt;/a&gt; node on my Raspberry Pi, and uploaded a copy of my site to &lt;a href="https://ipfs.jamesjarvis.io" target="_blank" rel="noreferrer"&gt;this probably out of date mirror&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, more detail:&lt;/p&gt;
&lt;h2 id="gatsbyjs-sucks-with-ipfs" class="relative group"&gt;GatsbyJS sucks with IPFS &lt;/h2&gt;&lt;p&gt;This website is (currently) built with GatsbyJS, &lt;a href="https://jamesjarvis.io/posts/2019/02/portfolio-site/"&gt;as outlined here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Only thing is, GatsbyJS does not support relative links by default.
Sure, you can enable &lt;a href="https://www.gatsbyjs.org/packages/gatsby-plugin-ipfs/" target="_blank" rel="noreferrer"&gt;gatsby-plugin-ipfs&lt;/a&gt; to try and fix the relative urls problem, but it is not compatible with most other plugins.&lt;/p&gt;
&lt;p&gt;As a result, Gatsby on IPFS does not work with manifests, sitemaps, or the most important gatsby-image integration.&lt;/p&gt;
&lt;p&gt;So sure, if you browse the mirror on a normal browser, then it will work fine, since IPFS content is being forwarded through the &lt;a href="https://www.cloudflare.com/distributed-web-gateway/" target="_blank" rel="noreferrer"&gt;cloudflare gateway&lt;/a&gt; the url is being formatted with the normal domain, and all the links work fine.&lt;/p&gt;
&lt;p&gt;However, if you browse the mirror on a browser with integrated IPFS (as it should do), then stuff like images and some other content will not load correctly.&lt;/p&gt;
&lt;h2 id="the-future" class="relative group"&gt;The future &lt;/h2&gt;&lt;p&gt;I spent a few hours on this problem, and honestly I just gave up.&lt;/p&gt;
&lt;p&gt;Perhaps in the future Gatsby will update to include relative URLs by default, but if you are absolutely desparate to host your content through IPFS, then I would recommend a different static site generator, such as &lt;a href="https://gohugo.io" target="_blank" rel="noreferrer"&gt;Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are looking at a potentially commercially viable implementation of IPFS, I would recommend you check out &lt;a href="https://filecoin.io" target="_blank" rel="noreferrer"&gt;Filecoin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I know, I know &amp;ldquo;not another cryptocurrency&amp;rdquo;, but this one is designed to pay people to host their content on IPFS, and in the future could potentially take on the big cloud providers?&lt;/p&gt;</content:encoded></item><item><title>🍲 Risotto Play</title><link>https://jamesjarvis.io/posts/2020/04/risotto-play/</link><pubDate>Mon, 20 Apr 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/04/risotto-play/</guid><category>Projects</category><description>Online playground for a useless programming language</description><content:encoded>&lt;p&gt;&lt;a href="https://play.risotto.dev/" target="_blank" rel="noreferrer"&gt;Try it out here!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sometime back in 2018, a friend of mine started building his own programming language, &amp;ldquo;Risotto&amp;rdquo; &lt;a href="https://github.com/risotto/risotto" target="_blank" rel="noreferrer"&gt;(GitHub link)&lt;/a&gt; (although I wanted the name to be &amp;ldquo;Ravioli&amp;rdquo; so the syntax could be &amp;ldquo;Ravioli Ravioli, give me the formuoli&amp;rdquo; &lt;a href="https://www.youtube.com/watch?v=z9r8Swai8_g&amp;amp;feature=youtu.be&amp;amp;t=32" target="_blank" rel="noreferrer"&gt;(I know, I&amp;rsquo;m immature)&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Anywho, I&amp;rsquo;ve enjoyed using services such as &lt;a href="https://goplay.space/" target="_blank" rel="noreferrer"&gt;The Go Play Space&lt;/a&gt; and &lt;a href="https://repl.it/" target="_blank" rel="noreferrer"&gt;Repl&lt;/a&gt; in the past, and wanted to replicate this kind of environment (whilst paying 0 for hosting) for Risotto.&lt;/p&gt;
&lt;h2 id="the-api" class="relative group"&gt;The API &lt;/h2&gt;&lt;p&gt;&lt;a href="https://github.com/risotto/play" target="_blank" rel="noreferrer"&gt;Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This runs on &lt;a href="https://kubesail.com/" target="_blank" rel="noreferrer"&gt;Kubesail&lt;/a&gt; for easy K8s deployment (and the free tier), with the API written in Go, and spawning a process running the code passed to it.&lt;/p&gt;
&lt;p&gt;In order to keep the API service performant, there&amp;rsquo;s a little bit of IP addressed rate limiting, and runtime constraints, but overall the traffic is low enough that this hasn&amp;rsquo;t come close to being an issue yet.&lt;/p&gt;
&lt;p&gt;The API is designed so that if anyone wants, they can use it for their own purposes, which is highly encouraged (get Risotto out there!)&lt;/p&gt;
&lt;p&gt;It is also covered with Unit Tests, and automatic CI/CD.&lt;/p&gt;
&lt;h2 id="the-ui" class="relative group"&gt;The UI &lt;/h2&gt;&lt;p&gt;&lt;a href="https://play.risotto.dev" target="_blank" rel="noreferrer"&gt;play.risotto.dev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/risotto/play-ui" target="_blank" rel="noreferrer"&gt;Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is hosted with &lt;a href="https://pages.github.com/" target="_blank" rel="noreferrer"&gt;GitHub pages&lt;/a&gt; for easy CI/CD and just fantastic performance.&lt;/p&gt;
&lt;p&gt;Written in React (TypeScript flavour), it&amp;rsquo;s fairly simple but is optimised for responsive design and even has a cute little &amp;ldquo;Share&amp;rdquo; feature, so you can share your creations with others.&lt;/p&gt;</content:encoded></item><item><title>🦠 COVID-19 (Coronavirus) automatic predictions</title><link>https://jamesjarvis.io/posts/2020/03/predictions/</link><pubDate>Thu, 19 Mar 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/03/predictions/</guid><category>Data</category><description>Learning about pandas</description><content:encoded>&lt;p&gt;







&lt;/p&gt;
&lt;p&gt;This project was a slightly morbid experiment with data plotting and predictions.&lt;/p&gt;
&lt;p&gt;The idea was to have a set of graphs that can automatically update as new data is published, since the coronavirus pandemic is such a rapidly changing event.
A Python script was written to collect the latest data from &lt;a href="https://github.com/CSSEGISandData/COVID-19" target="_blank" rel="noreferrer"&gt;John Hopkins University&amp;rsquo;s repo&lt;/a&gt;, and generate graphs (both exponential and logistical curve predictions) based on this data.&lt;/p&gt;
&lt;p&gt;Then, using the wonderful &lt;a href="https://github.com/features/actions" target="_blank" rel="noreferrer"&gt;GitHub Actions&lt;/a&gt;, this script was rerun every hour, and if the graphs generated were different to previously, it would automatically commit and push these changes &lt;a href="https://github.com/jamesjarvis/corona-infection-prediction-uk" target="_blank" rel="noreferrer"&gt;to the repo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am not en expert, I&amp;rsquo;m just curious with how well the data can predict the future.&lt;/p&gt;
&lt;p&gt;Another morbid graph (if you want to check out the previous predictions, you are welcome to go through the repo&amp;rsquo;s history to see how well it predicted as time progressed):&lt;/p&gt;
&lt;p&gt;







&lt;/p&gt;</content:encoded></item><item><title>📈 Graphing Monzo Growth</title><link>https://jamesjarvis.io/posts/2020/03/graphing-monzo-growth/</link><pubDate>Sun, 01 Mar 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/03/graphing-monzo-growth/</guid><category>Data</category><description>Finally, a bank people don&amp;rsquo;t hate</description><content:encoded>&lt;p&gt;Monzo &lt;a href="monzo.com"&gt;(here)&lt;/a&gt; is a digital &amp;ldquo;challenger&amp;rdquo; bank from the UK.&lt;/p&gt;
&lt;p&gt;I thought it would be interesting to use GitHub to automatically update and store data regarding the growth of Monzo&amp;rsquo;s current account user numbers. You can visit the page &lt;a href="https://jamesjarvis.github.io/monzo-users/" target="_blank" rel="noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since their website includes an auto updating tally of users, I just found the api and the python scripts utilise this.&lt;/p&gt;
&lt;p&gt;Similar to the &lt;a href="https://jamesjarvis.io/posts/2020/03/predictions/"&gt;COVID-19 infection predictions&lt;/a&gt;, this uses GitHub actions to automatically update and store data regarding the growth of Monzo&amp;rsquo;s current account user numbers.
It also builds a &lt;a href="https://jamesjarvis.github.io/monzo-users" target="_blank" rel="noreferrer"&gt;simple react webpage&lt;/a&gt; to display the data in a graph.
Or, if you prefer you can download &lt;a href="https://raw.githubusercontent.com/jamesjarvis/monzo-users/master/monzo_users.csv" target="_blank" rel="noreferrer"&gt;the data&lt;/a&gt; for yourself.&lt;/p&gt;
&lt;p&gt;Feel free to make a PR if you have some data that can fill in the gaps.&lt;/p&gt;
&lt;p&gt;Some (better) visualisations can be found here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bankstats.joecarter.xyz/d/000000001/monzo-current-acc?orgId=1&amp;amp;refresh=5m&amp;amp;from=now-1y&amp;amp;to=now" target="_blank" rel="noreferrer"&gt;Grafana current account growth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.tombowdit.ch/d/AWZDPrYik/monzo?orgId=2&amp;amp;refresh=30m&amp;amp;from=now-6M&amp;amp;to=now" target="_blank" rel="noreferrer"&gt;Another, grafana approach&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>🌩️ Automated speedtest internet monitoring</title><link>https://jamesjarvis.io/posts/2020/01/speedtest/</link><pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2020/01/speedtest/</guid><category>Data</category><description>How to check if your broadband provider is lying to you</description><content:encoded>&lt;p&gt;A quick monitoring project.&lt;/p&gt;
&lt;p&gt;As anyone from the UK will know, our internet speeds aren&amp;rsquo;t quite up to par with the rest of the developed world &lt;a href="https://www.speedtest.net/global-index" target="_blank" rel="noreferrer"&gt;(Don&amp;rsquo;t believe me? Check it out)&lt;/a&gt;.
From personal experience, I very rarely achieve the advertised internet speeds, even when directly connected to the router.
Similarly, some ISP&amp;rsquo;s I have used seem to have loads of dropouts, and fairly poor response to criticisms of speed.
So, I though I would try to monitor the internet a bit closer, I had a spare RPI hanging around not really doing much besides a minecraft server, and thought it would be an interesting experiment.&lt;/p&gt;
&lt;p&gt;So, I set up an &lt;a href="https://ifttt.com/" target="_blank" rel="noreferrer"&gt;IFTTT&lt;/a&gt; webhook, and a cronjob on the RPI to automatically update a Google Sheets document with the latest speedtest results.&lt;/p&gt;
&lt;p&gt;Inspiration thanks to &lt;a href="https://makezine.com/projects/send-ticket-isp-when-your-internet-drops/" target="_blank" rel="noreferrer"&gt;this project&lt;/a&gt;, and I&amp;rsquo;ve had a lot of fun experimenting with the data retrieved.&lt;/p&gt;
&lt;h2 id="part-1-university" class="relative group"&gt;Part 1: University &lt;/h2&gt;&lt;iframe title="University accommodation speedtest results" width="100%" height="650" seamless frameborder="0" scrolling="no" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vR3YSLPrb0yc1ojf6e7nxZ8EBW_3vrpvtDJzRqdw4ay8TEackXMFCkMy2hRk-9hVjTg0-8ZnUDPoZnF/pubchart?oid=1937794798&amp;amp;format=interactive"&gt;&lt;/iframe&gt;
&lt;iframe title="University week speedtest heatmap" width="100%" height="650" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vR3YSLPrb0yc1ojf6e7nxZ8EBW_3vrpvtDJzRqdw4ay8TEackXMFCkMy2hRk-9hVjTg0-8ZnUDPoZnF/pubhtml?gid=1353413610&amp;amp;single=true&amp;amp;widget=true&amp;amp;headers=false"&gt;&lt;/iframe&gt;
&lt;p&gt;Whilst at university, my internet was being provided by &lt;a href="https://www.bt.com/" target="_blank" rel="noreferrer"&gt;BT&lt;/a&gt;, and the fastest we could supposedly get was 35mb download speeds.
However, we were having constant dropouts and nothing was being done about it.&lt;/p&gt;
&lt;p&gt;As it turns out, we have NEVER achieved our advertised internet speed, and dropped out a number of times in the few months I have run this (although as it only runs every half hour, I&amp;rsquo;m pretty sure we have dropped out more frequently than this).&lt;/p&gt;
&lt;p&gt;Other interesting insights from this data include seeing how the &lt;a href="https://www.bbc.co.uk/news/technology-51947447" target="_blank" rel="noreferrer"&gt;Coronavirus internet surge&lt;/a&gt; did in fact slow down our internet as everyone moved to remote work.&lt;/p&gt;
&lt;h2 id="part-2-back-home" class="relative group"&gt;Part 2: Back Home &lt;/h2&gt;&lt;iframe title="Home speedtest results" width="100%" height="650" seamless frameborder="0" scrolling="no" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vR3YSLPrb0yc1ojf6e7nxZ8EBW_3vrpvtDJzRqdw4ay8TEackXMFCkMy2hRk-9hVjTg0-8ZnUDPoZnF/pubchart?oid=1087168737&amp;amp;format=interactive"&gt;&lt;/iframe&gt;
&lt;iframe title="Home week speedtest heatmap" width="100%" height="650" src="https://docs.google.com/spreadsheets/d/e/2PACX-1vR3YSLPrb0yc1ojf6e7nxZ8EBW_3vrpvtDJzRqdw4ay8TEackXMFCkMy2hRk-9hVjTg0-8ZnUDPoZnF/pubhtml?gid=545090524&amp;amp;single=true&amp;amp;widget=true&amp;amp;headers=false"&gt;&lt;/iframe&gt;
&lt;p&gt;As mentioned previously, thanks to &lt;a href="https://coronavirus.data.gov.uk/" target="_blank" rel="noreferrer"&gt;Coronavirus&lt;/a&gt;, the university campus (and all associated societies, events, basically anything fun) just &lt;a href="https://www.kent.ac.uk/coronavirus" target="_blank" rel="noreferrer"&gt;abruptly stopped&lt;/a&gt;.
So, I moved back in with the &amp;lsquo;rents.&lt;/p&gt;
&lt;p&gt;Our internet here is provided by &lt;a href="https://www.virginmedia.com/" target="_blank" rel="noreferrer"&gt;Virgin Media&lt;/a&gt;, on a 350mb/s(!!) plan.
Now unfortunately thanks to the &lt;a href="https://www.raspberrypi.org/products/raspberry-pi-3-model-b/" target="_blank" rel="noreferrer"&gt;Raspberry Pi I am using&lt;/a&gt;, the Ethernet port only supports 100 Base.
As a result, none of the speedtests will actually reach 350mb/s (but if it drops below that, then we should see a difference).&lt;/p&gt;
&lt;p&gt;(Update - June 2020), upgraded to a &lt;a href="https://www.raspberrypi.org/products/raspberry-pi-4-model-b/" target="_blank" rel="noreferrer"&gt;newer Raspberry Pi&lt;/a&gt;, so should be able to show faster speeds.&lt;/p&gt;
&lt;p&gt;However, this connection actually has far more significant variance, with the most noticeable pattern contained within the upload speedtest (presumably virgin media throttles this channel to support more downloads at peak times).
Something also to note is that this environment has ~ 5x more devices on the network, which could be a bit of an issue as well.&lt;/p&gt;</content:encoded></item><item><title>📆 WhatsUpKent: Everything happening at the University of Kent</title><link>https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/</link><pubDate>Mon, 04 Nov 2019 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/</guid><category>Projects</category><category>Data</category><description>Finding out better lectures than the ones I was paying for</description><content:encoded>&lt;p&gt;In October 2019, I was looking for a challenge.&lt;/p&gt;
&lt;p&gt;University &lt;a href="https://web.archive.org/web/20200322103909/https://www.kent.ac.uk/" target="_blank" rel="noreferrer"&gt;(look mum, I&amp;rsquo;m on the front page!)&lt;/a&gt; was going ok, but I didn&amp;rsquo;t feel stimulated enough, and wanted to see what else there was on offer.
Turns out paying £9k per year to learn from 20 year old textbooks isn&amp;rsquo;t exactly riveting, so I was looking to see what other interesting lectures I could discover on campus.
Also, my friends and I liked to use disused seminar rooms to work in since the library was often overcrowded and I wanted an easy way to discover which seminar rooms were not being used.&lt;/p&gt;
&lt;p&gt;I also wanted to stretch my legs and learn a bit of Golang, Kubernetes, Typescript and Graph databases.&lt;/p&gt;
&lt;p&gt;So, I decided to create a service that would gather all student&amp;rsquo;s timetables and present the information in an easy to use dashboard, to offer students the opportunity to explore other courses in their spare time.&lt;/p&gt;
&lt;p&gt;Thanks to the university (accidentally?) publishing student timetables as publicly accessible ical links, it proves fairly simple to just brute force and scrape all ical timetables from their website.
Of course, having to iterate through 50,000 timetables can be quite time consuming, so I chose &lt;a href="https://golang.org/" target="_blank" rel="noreferrer"&gt;Golang&lt;/a&gt; to write the server, thanks to it&amp;rsquo;s remarkably easy multithreading syntax.&lt;/p&gt;
&lt;p&gt;Since the data being retrieved was fundamentally relational, I chose to store it in a &lt;a href="https://dgraph.io/" target="_blank" rel="noreferrer"&gt;graph database called DGraph&lt;/a&gt;.
This allowed me to achieve not only some quick queries on the data, I was also able to just easily expose a read only graphql endpoint directly to the database. Simple! :)&lt;/p&gt;
&lt;p&gt;At this point, we are now looking at a few different services for the api: the scraper, a caching service (just to speed up repetetive large queries), and the dgraph database instance (which itself requires 2 pods).
So, for deployment I chose to look towards Kubernetes.
I bought the cheapests little VPS I could, and whacked on a &lt;a href="https://k3s.io/" target="_blank" rel="noreferrer"&gt;k3s lightweight kubernetes&lt;/a&gt; instance and set that up in the CI/CD (ran with GitHub actions).
As always, the &lt;a href="https://github.com/jamesjarvis/WhatsUpKent-UI" target="_blank" rel="noreferrer"&gt;frontend&lt;/a&gt; was hosted with GitHub pages.&lt;/p&gt;
&lt;p&gt;Overall, the project was a success.
It managed to scrape (and continuously check for updates and re-scrape) thousands of lectures and seminars on campus, from all students, and all courses.
It was hosted at &lt;a href="https://whatsupkent.com" target="_blank" rel="noreferrer"&gt;whatsupkent.com&lt;/a&gt;, with the backend code hosted in &lt;a href="https://github.com/jamesjarvis/WhatsUpKent" target="_blank" rel="noreferrer"&gt;GitHub&lt;/a&gt;.
Unfortunately, I decided to close down the service before the uni got mad at me (also, I couldn&amp;rsquo;t be bothered to pay the £5 a month hosting fees), but relaunching it would be as easy as pie if demand ever increases for a service like this.&lt;/p&gt;
&lt;h2 id="a-few-screenshots" class="relative group"&gt;A few screenshots &lt;/h2&gt;&lt;p&gt;The API:








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/api_splashscreen_hu_6bfae2744f7b4226.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 &lt;img
 width="956"
 height="466"
 class="mx-auto my-0 rounded-md"
 alt="API splashscreen"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/api_splashscreen_hu_85c9442a8ec90c85.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Event info:








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/day_unfiltered_hu_59afa4e33362a92d.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1391"
 height="1112"
 class="mx-auto my-0 rounded-md"
 alt="Event info"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/day_unfiltered_hu_b164c7cc292f94c0.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Room finder:








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/room_finder_hu_af241af7c5d4dee6.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1391"
 height="1136"
 class="mx-auto my-0 rounded-md"
 alt="Room finder"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/room_finder_hu_8178f050e9d19edf.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Agenda view:








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/agenda_filtered_hu_6f99eaddb47038af.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1391"
 height="1136"
 class="mx-auto my-0 rounded-md"
 alt="Agenda"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/agenda_filtered_hu_8566b093e7106078.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Filtered week:








&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/week_filtered_hu_5ec1bcbe77398872.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="1391"
 height="1136"
 class="mx-auto my-0 rounded-md"
 alt="Filtered week"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/11/whatsupkent-everything-happening-at-the-university-of-kent/week_filtered_hu_112081ccb0229089.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>20 Years Old</title><link>https://jamesjarvis.io/posts/2019/06/20-years-old/</link><pubDate>Sun, 23 Jun 2019 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2019/06/20-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2018 to 23rd June 2019.&lt;/p&gt;
&lt;p&gt;I moved to California for a year to pursue my dreams of Silicon Valley. Travelled by car more than I have ever before, became a much better developer, became somewhat American and much more independant.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2018 to 23rd June 2019.&lt;/p&gt;
&lt;p&gt;I moved to California for a year to pursue my dreams of Silicon Valley. Travelled by car more than I have ever before, became a much better developer, became somewhat American and much more independant.&lt;/p&gt;
&lt;p&gt;Made some incredible memories and international friends this year, but the pace isn&amp;rsquo;t slowing down any time soon!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/aROoZL6x8sk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>🖊 Git Art</title><link>https://jamesjarvis.io/posts/2019/02/git-art/</link><pubDate>Tue, 05 Feb 2019 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2019/02/git-art/</guid><category>Projects</category><description>Commit stuff, with &lt;em&gt;style&lt;/em&gt;</description><content:encoded>&lt;p&gt;My roommate Tim &lt;a href="https://www.linkedin.com/in/timothylee0/" target="_blank" rel="noreferrer"&gt;(his LinkedIn)&lt;/a&gt; and I decided to start challenging ourselves with little applications we could develop.&lt;/p&gt;
&lt;p&gt;The first thing we thought of was a way to decorate your GitHub activity board, example below:&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2019/02/git-art/example-board_hu_1a8476a01262a9.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 &lt;img
 width="1164"
 height="254"
 class="mx-auto my-0 rounded-md"
 alt="Example board"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2019/02/git-art/example-board_hu_43c7e4e5ad5fc17a.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;The idea being that you could just draw or type (or both) anything that you wanted to on a canvas that represented your github activity board, and with one simple script you could create the required commits and upload that new repo to your GitHub.&lt;/p&gt;
&lt;p&gt;This is thanks to a feature/flaw in git that allows you to create commits (even empty commits) with any date attached.
Therefore, all we need to do to generate a cute little activity graph is to simply work out the date ranges required, how many commits to make each day, and to generate a script that allows the user to do this.&lt;/p&gt;
&lt;p&gt;We used React for the front end, and wrote simple JavaScript functions to generate the bash script which is available for you to download and run.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jamesjarvis.github.io/git-art/" target="_blank" rel="noreferrer"&gt;Check out the website&lt;/a&gt;, or if you&amp;rsquo;d prefer, &lt;a href="https://github.com/jamesjarvis/git-art" target="_blank" rel="noreferrer"&gt;jump straight to the code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Made open source under the &lt;a href="http://www.wtfpl.net" target="_blank" rel="noreferrer"&gt;WTFPL licence&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>🖥 Open Source Portfolio Website</title><link>https://jamesjarvis.io/posts/2019/02/portfolio-site/</link><pubDate>Sat, 02 Feb 2019 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2019/02/portfolio-site/</guid><category>Projects</category><description>I wanted a personal website, I made a personal website.</description><content:encoded>&lt;p&gt;&lt;a href="https://jamesjarvis.io/"&gt;This very site&lt;/a&gt; you are reading, is open source, under the A-GPL licence with all the source code hosted on GitHub &lt;a href="https://github.com/jamesjarvis/jamesjarvis.io" target="_blank" rel="noreferrer"&gt;(fork off)&lt;/a&gt;.
You may fork it and fill in your own data if you wish, which is surprisingly easy to do, all thanks to GatsbyJS &lt;a href="https://www.gatsbyjs.org/" target="_blank" rel="noreferrer"&gt;(link)&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I created this with GatsbyJS as I wanted to have my own personal portfolio site which simply consumes data stored externally (though within the same repo), rather than hard coding everything, which I felt was the issue with many other portfolio sites.&lt;/p&gt;
&lt;p&gt;Now, I wanted to have a personal site so I could have a place to publicise the work I have done in the past, what I am planning in the future, and my thoughts and ramblings (As well as just to have a place for my &amp;lsquo;digital identity&amp;rsquo; where I can link together all of my online personas into a single place).&lt;/p&gt;
&lt;p&gt;I am a little bit cheap however, so after spending $30 on domain fees I didn&amp;rsquo;t want to spend any more money on actually hosting it. Which brings me to some of my favourite pieces of tech: the free kind.&lt;/p&gt;
&lt;h2 id="how-to-host-for-no-cost-whatsoever" class="relative group"&gt;How to host for no cost whatsoever &lt;/h2&gt;&lt;p&gt;Since we are already using GitHub as a way to host our source code (for free!), we might as well use the latest and greatest &lt;a href="https://pages.github.com" target="_blank" rel="noreferrer"&gt;GitHub Pages&lt;/a&gt; to host the page source files for free as well! (I know right!??).&lt;/p&gt;
&lt;p&gt;Since we are making a &lt;a href="https://jamstack.org" target="_blank" rel="noreferrer"&gt;JAMStack&lt;/a&gt; site, all we have is front-end stuff which we just need to plonk in any old static web hosting provider. Other great examples are &lt;a href="https://www.netlify.com" target="_blank" rel="noreferrer"&gt;Netlify&lt;/a&gt;, and even on &lt;a href="https://zeit.co/now" target="_blank" rel="noreferrer"&gt;Zeit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To build your site, I would recommend setting up a CI/CD integration using GitHub actions, and pointing this to deploy to whatever hosting service you use (GitHub pages is the easiest I feel as you only need to push changes to another branch/folder within your repo).&lt;/p&gt;
&lt;p&gt;That is basically all you need to do.&lt;/p&gt;
&lt;p&gt;I would recommend also putting your site behind &lt;a href="https://www.cloudflare.com" target="_blank" rel="noreferrer"&gt;Cloudflare&lt;/a&gt;, as this can speed up access to your site due to the way they cache it on any of their CDN nodes - again, all for free!&lt;/p&gt;
&lt;p&gt;If you get to the point where you would like a &amp;rsquo;lil bit of backend with your site, say for sending contact information or retrieving particular information which is too client-side heavy, then go &lt;a href="https://serverless.com" target="_blank" rel="noreferrer"&gt;Serverless&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Serverless lambda hosting is extremely quick to set up, maintain, and cheap! Not to mention the fact that you can choose between Amazon, Azure or Google to host your functions, the whole world of data hungry tech corporations are just begging to let you run code with them. Again, for FREE*(or super cheap).&lt;/p&gt;
&lt;p&gt;If you are going to go down this whole rabbit hole, I&amp;rsquo;d recommend having a &lt;a href="https://github.com/DevProgress/onboarding/wiki/Using-Circle-CI-with-Github-Pages-for-Continuous-Delivery" target="_blank" rel="noreferrer"&gt;little read first&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="have-fun" class="relative group"&gt;Have fun &lt;/h2&gt;&lt;p&gt;Check out the code on GitHub &lt;a href="https://github.com/jamesjarvis/jamesjarvis.io" target="_blank" rel="noreferrer"&gt;https://github.com/jamesjarvis/jamesjarvis.io&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As mentioned before, feel free to fork it and change the content yourself.&lt;/p&gt;
&lt;p&gt;The content is hosted in &lt;code&gt;assets/&lt;/code&gt; and &lt;code&gt;src/pages/projects/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you have any more questions, reach out to me!&lt;/p&gt;</content:encoded></item><item><title>🎵 Musish: The Unofficial, Open Source Apple Music Web Player</title><link>https://jamesjarvis.io/posts/2018/12/musish/</link><pubDate>Wed, 12 Dec 2018 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2018/12/musish/</guid><category>Projects</category><description>How I was kinda developer-famous for 5 minutes</description><content:encoded>&lt;p&gt;







&lt;/p&gt;
&lt;p&gt;On December 1st 2018, a group of friends and I attended the MLH Local Hack Day in San Francisco.&lt;/p&gt;
&lt;p&gt;Made by myself &lt;a href="https://jamesjarvis.io" target="_blank" rel="noreferrer"&gt;(me)&lt;/a&gt;, Brychan &lt;a href="https://brychan.io" target="_blank" rel="noreferrer"&gt;(link)&lt;/a&gt;, Raphael &lt;a href="https://raphaelvigee.com" target="_blank" rel="noreferrer"&gt;(link)&lt;/a&gt;, and Filip &lt;a href="https://www.linkedin.com/in/filip-grebowski-b24810116/" target="_blank" rel="noreferrer"&gt;(link)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This particular hackathon was sponsored by GitHub and Microsoft, and had a theme of creating the best open source project for the community. We came first in San Francisco for our project.&lt;/p&gt;
&lt;p&gt;We decided to make an &lt;a href="https://musi.sh" target="_blank" rel="noreferrer"&gt;Apple Music web player&lt;/a&gt;, since pretty much every single other music streaming platform already had one. Some people aren&amp;rsquo;t sure why Apple Music would need a web player, since surely you could just use iTunes for that?&lt;/p&gt;
&lt;p&gt;Well, as was &lt;a href="https://forums.macrumors.com/threads/apple-music-gets-another-unofficial-web-player-with-launch-of-musish.2166187/#post-27018681" target="_blank" rel="noreferrer"&gt;hilariously summarised in a comment on Macrumors&lt;/a&gt;, iTunes isn&amp;rsquo;t exactly lightweight.&lt;/p&gt;
&lt;p&gt;Musi.sh (Musish) is an &lt;a href="https://github.com/musish/musish" target="_blank" rel="noreferrer"&gt;open source project&lt;/a&gt; now, using the A-GPL license, and as of February 2019, has over &lt;a href="https://github.com/Musish/Musish/stargazers" target="_blank" rel="noreferrer"&gt;1400 stars&lt;/a&gt;, and &lt;a href="https://github.com/Musish/Musish/graphs/contributors" target="_blank" rel="noreferrer"&gt;9 contributors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We released it (sent out a few emails) while walking around Central Park, NY on the 18th January 2019. We weren&amp;rsquo;t really prepared with what was to come, and have since had quite a few articles written about it.&lt;/p&gt;
&lt;h2 id="analytics-and-feedback" class="relative group"&gt;Analytics and Feedback &lt;/h2&gt;&lt;p&gt;According to Google Analytics, we have had over 50,000 unique users on Musi.sh from over 110 different countries, and we have found some very positive articles written about it at least 13 different languages found so far.&lt;/p&gt;
&lt;p&gt;Some notable mentions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.businessinsider.com/uk-tech-100-2019-most-important-interesting-and-impactful-people-uk-tech-2019-9?r=US&amp;amp;IR=T#97-the-undergraduate-students-who-beat-apple-to-building-a-web-player-for-apple-music-4" target="_blank" rel="noreferrer"&gt;Business Insider Tech 100 2019 #97&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20200322103909/https://www.kent.ac.uk/" target="_blank" rel="noreferrer"&gt;University of Kent homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://web.archive.org/web/20200322104018/https://www.kent.ac.uk/courses/profiles/undergraduate/computer-science-year-industry-musish" target="_blank" rel="noreferrer"&gt;University of Kent profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://9to5mac.com/2019/01/18/apple-music-web/" target="_blank" rel="noreferrer"&gt;9to5Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://9to5mac.com/2019/01/21/apple-music-mac-app/" target="_blank" rel="noreferrer"&gt;9to5Mac again&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gizmodo.com/how-to-play-apple-music-from-the-web-1831977569" target="_blank" rel="noreferrer"&gt;Gizmodo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.macrumors.com/2019/01/21/apple-music-web-player-musish/" target="_blank" rel="noreferrer"&gt;Macrumors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cultofmac.com/601520/musish-apple-music-web-portal/" target="_blank" rel="noreferrer"&gt;Cult of Mac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thenextweb.com/apps/2019/01/22/use-apple-music-in-your-browser-with-this-pretty-web-interface/" target="_blank" rel="noreferrer"&gt;The Next Web&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.01net.com/actualites/musi-sh-le-service-qui-donne-acces-a-apple-music-depuis-un-navigateur-web-1617352.html#xtor=AL-123461" target="_blank" rel="noreferrer"&gt;01Net (France)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://myapple.pl/posts/18640-kolejny-web-player-apple-music-musish-stawia-na-podobienstwo-do-pierwowzoru" target="_blank" rel="noreferrer"&gt;My Apple (Poland)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/search?q=Musi.sh" target="_blank" rel="noreferrer"&gt;Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also, we made it to #1 and #2 on GitHub trending for all JavaScript projects and all languages respectively on the 19th January 2019, which was our favourite achievement of all!&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2018/12/musish/javascript_trending_hu_9ff961b25cdfbe13.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3538"
 height="2430"
 class="mx-auto my-0 rounded-md"
 alt="JavaScript trending"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2018/12/musish/javascript_trending_hu_4213d50c26a7151a.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Number 1 on JavaScript trending&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;







&lt;figure&gt;
 &lt;a
 
 href="https://jamesjarvis.io/posts/2018/12/musish/all_trending_hu_212633dc320d1f33.png"
 
 &gt;
 








 
 
 &lt;picture
 class="mx-auto my-0 rounded-md"
 
 &gt;
 
 
 
 
 
 
 
 &lt;img
 width="3538"
 height="2430"
 class="mx-auto my-0 rounded-md"
 alt="All languages trending"
 loading="lazy" decoding="async"
 src="https://jamesjarvis.io/posts/2018/12/musish/all_trending_hu_1bf0a6dc2b20b204.png"
 /&gt;
 &lt;/picture&gt;
 


 &lt;/a&gt;
 &lt;figcaption class="text-center"&gt;Number 2 on GitHub trending&lt;/figcaption&gt;
 &lt;/figure&gt;&lt;/p&gt;</content:encoded></item><item><title>19 Years Old</title><link>https://jamesjarvis.io/posts/2018/06/19-years-old/</link><pubDate>Sat, 23 Jun 2018 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2018/06/19-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2017 to 23rd June 2018.&lt;/p&gt;
&lt;p&gt;My second year of university, I was on the committee of both sailing and travel societies, I got some exciting job offers, ended a relationship and I said some sad goodbyes before my year in California!&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2017 to 23rd June 2018.&lt;/p&gt;
&lt;p&gt;My second year of university, I was on the committee of both sailing and travel societies, I got some exciting job offers, ended a relationship and I said some sad goodbyes before my year in California!&lt;/p&gt;
&lt;p&gt;Had an amazing year, and I’ve loved documenting it like this. I can’t wait to find out what the next year (and this 3rd decade of life) has for me!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/nhmEgzpafPc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item><item><title>18 Years Old</title><link>https://jamesjarvis.io/posts/2017/06/18-years-old/</link><pubDate>Fri, 23 Jun 2017 00:00:00 +0000</pubDate><author>hello@jamesjarvis.io (James Jarvis)</author><guid>https://jamesjarvis.io/posts/2017/06/18-years-old/</guid><category>One Second Every Day</category><description>&lt;p&gt;From 23rd June 2016 to 23rd June 2017.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t manage to film every day, but I&amp;rsquo;m so glad I started this, and I don&amp;rsquo;t plan on stopping any time soon.&lt;/p&gt;</description><content:encoded>&lt;p&gt;From 23rd June 2016 to 23rd June 2017.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t manage to film every day, but I&amp;rsquo;m so glad I started this, and I don&amp;rsquo;t plan on stopping any time soon.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/2JItNd1gNx0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;
</content:encoded></item></channel></rss>