<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Posts on byJP</title><link>https://www.byjp.me/posts/</link><description>Recent content in Posts on byJP</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>CC BY-NC-SA 4.0</copyright><lastBuildDate>Sun, 22 Feb 2026 07:56:17 +0000</lastBuildDate><atom:link href="https://www.byjp.me/posts/index.xml" rel="self" type="application/rss+xml"/><atom:link href="https://www.byjp.me/opensearch.xml" rel="search" type="application/opensearchdescription+xml"/><item><title>An every day 'Every Day Calendar'</title><link>https://www.byjp.me/posts/everyday-calendar/</link><pubDate>Sun, 15 Feb 2026 07:56:20 +0000</pubDate><guid>https://www.byjp.me/posts/everyday-calendar/</guid><description>I internet-enabled my Every Day Calendar! Now it talks fluent goals.garden (♥︎ ATProto) and I can update it from anywhere. It's so simple, I bet you could do it too. #atproto #electronics #hardware #making #project #calendar</description><content:encoded>
&lt;blockquote>
&lt;p>You can skip ahead to &lt;a href="#get-making">making your own&lt;/a>, if you like!&lt;/p>
&lt;/blockquote>
&lt;p>A long while ago I splashed out on an &lt;a href="https://yetch.studio/products/every-day-goal-calendar" target="_blank">Every Day Calendar&lt;/a>. I loved the idea of taking pride in routine, I adored its beautiful &amp;amp; simple &lt;em>physical&lt;/em> interface for that, and &lt;a href="https://www.youtube.com/watch?v=sMDMAc8msVk" target="_blank">Simone Giertz's videos&lt;/a> sparked joy every time I saw them, so backing her &lt;a href="https://www.kickstarter.com/projects/simonegiertz/the-every-day-calendar" target="_blank">kickstarter&lt;/a> was a hard choice &lt;em>not&lt;/em> to make.&lt;/p>
&lt;p>My one reservation though, was that it missed an online component — I wanted it to be truly &lt;em>every&lt;/em> day, not just the ones when I was at home. But I like hardware hacking, and knew Simone was &lt;a href="https://gitlab.com/simonegiertz/the-every-day-calendar" target="_blank">releasing all the code&lt;/a> for the calendar (😍), so figured I'd be able to make that happen &lt;em>somehow&lt;/em>. The spark of inspiration didn't come though, and I happily enjoyed the physical calendar on the wall in my office.&lt;/p>
&lt;p>…until this January, when I discovered the lovely &lt;a href="https://goals.garden/" target="_blank">goals.garden&lt;/a> site — &lt;a href="https://bluesky.app/profile/did:plc:7gm5ejhut7kia2kzglqfew5b" target="_blank">Sri&lt;/a> had clearly been inspired by Simone's Every Day Calendar too! This was perfect for me; it &lt;a href="https://sri.leaflet.pub/3mbg43rkass2y" target="_blank">launched&lt;/a> right on the new year, while I was abroad travelling with my Dad, so it meant I could start my new years' intentions without my physical calendar &lt;em>and&lt;/em> it was built on top of my favourite technology of the moment: &lt;a href="https://atproto.com" target="_blank">ATProto&lt;/a> (the tech behind &lt;a href="https://bsky.app" target="_blank">Bluesky&lt;/a>).&lt;/p>
&lt;p>This weekend, &lt;em>gloriously&lt;/em> timed with Sri's fresh improvements to &lt;a href="https://goals.garden" target="_blank">goals.garden&lt;/a>, I finally put together all the pieces I needed to internet-enable my Every Day Calendar! It ended up being simple enough that &lt;a href="#get-making">I bet you could do it too&lt;/a>.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/everyday-calendar/my-calendar.jpg"
alt="Me updating my Every Day Calendar from goals.garden on my phone, and vice-versa."/>
&lt;/figure>
&lt;h2 id="building-on-atproto">Building on ATProto&lt;/h2>
&lt;p>Building in the ATProto ecosystem is &lt;em>fun&lt;/em>. You entirely own your own data, so there are no developer accounts with large companies to register for, or API limits or restrictions on what you can do. Sri built the &lt;a href="https://goals.garden" target="_blank">goals.garden&lt;/a> site on ATProto, so it stores &lt;a href="https://pdsls.dev/at://did:plc:ephkzpinhaqcabtkugtbzrwu/garden.goals.completion/3meq4efcirstr" target="_blank">little data records&lt;/a> on the account &lt;em>I own&lt;/em> to track my daily completions. I can edit those records directly, delete them, add to them however I like, and goals.garden displays what it finds — &lt;strong>instant interoperability&lt;/strong>.&lt;/p>
&lt;p>In fact this flexibility was the spark that meant this could happen at all: I needed the data in a specific format to suit the excellent &lt;a href="https://www.microcosm.blue/" target="_blank">microcosm APIs&lt;/a> and the &lt;em>tiny&lt;/em> processor I added to my calendar… so I just edited my own records to include the &lt;a href="https://atproto.com/specs/at-uri-scheme" target="_blank">AT URI&lt;/a> I needed. I didn’t need permission from anyone else to do that, or to take time on coordinating when I wanted to experiment. When it worked, I reached out to Sri to find out if he'd be kind enough to add these same attributes to his app. He was! (Thank you Sri!)&lt;/p>
&lt;h2 id="get-making">Get making&lt;/h2>
&lt;p>&lt;img src="https://www.byjp.me/posts/everyday-calendar/internals.jpg" alt="The inside of my Every Day Calendar, with a QT Py ESP32-S3 microprocessor soldered into four of the existing pads on the circuit board">&lt;/p>
&lt;p>This is the entirety of the physical changes I made to my calendar. You’ll need a soldering iron, a pair of wire-strippers, an &lt;a href="https://thepihut.com/products/adafruit-qt-py-esp32-s3-wifi-dev-board" target="_blank">Adafruit QT Py ESP32-S3&lt;/a> (£12) and &lt;em>half&lt;/em> a &lt;a href="https://thepihut.com/products/stemma-qt-qwiic-jst-sh-4-pin-cable-100mm-long" target="_blank">Qwiic/Stemma QT cable&lt;/a> (£1).&lt;/p>
&lt;p>You can follow the &lt;a href="https://tangled.org/byjp.me/every-day-calendar" target="_blank">codebase’s guide&lt;/a> to solder things up, flash the firmware, and get your calendar sync’d up.&lt;/p>
&lt;p>Do &lt;a href="https://bsky.app/profile/byjp.me" target="_blank">let me know&lt;/a> how you get on! I’ve a busy life at the moment (more on that soon), but I’ll do my best to help you if you’re having trouble.&lt;/p>
&lt;p>Huge thanks to &lt;a href="https://www.simonegiertz.com/" target="_blank">Simone&lt;/a> for the hardware, &lt;a href="https://bsky.app/profile/sr.xyz" target="_blank">Sri&lt;/a> for the website, &lt;a href="https://bsky.app/profile/fool.dev" target="_blank">Momin&lt;/a> for fun firmware improvements, &lt;a href="https://www.microcosm.blue/" target="_blank">Microcosm&lt;/a> for their excellent APIs, the &lt;a href="https://atproto.com" target="_blank">ATProto&lt;/a> team, and the thousands of engineers who built the hundreds of open source libraries this is built upon.&lt;/p></content:encoded></item><item><title>What awesomeness is this‽</title><link>https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/</link><pubDate>Thu, 17 Jul 2025 15:40:50 +0000</pubDate><guid>https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/</guid><description>This custom made, almost kilogram brass curio is infuriatingly WONDERFUL. I &lt;em>will&lt;/em> break into it… eventually. #puzzle #birthday #miriscient #conlang #toki-pona</description><content:encoded>&lt;img src="https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/the-puzzle.jpg" alt="A circular brass puzzle box, roughly 10cm in diameter. It has what looks like the projection of lines of latitude and longitude on the front surface, and 5 glass covered holes through the middle, spread across an oscillating line of metal set into the middle." />&lt;br/>
&lt;p>It is extremely hard to be speechless on a blog. There's a certain amount of &lt;em>telling people what's going on&lt;/em> needed. Let me try and get over my awe-struck amazement enough to tell you about the puzzle box my friends Hugo and Margot &lt;strong>made&lt;/strong> 🤯 and gave me at my recent 40th birthday party.&lt;/p>
&lt;figure>
&lt;svg viewBox="0 0 2048 1536" preserveAspectRatio="xMidYMid meet">
&lt;image alt="A circular brass puzzle box, roughly 10cm in diameter. It has what looks like the projection of lines of latitude and longitude on the front surface, and 5 glass covered holes through the middle, spread across an oscillating line of metal set into the middle." href="./the-puzzle.jpg" width="2048" height="1536"/>
&lt;a xlink:href="#bump-1">&lt;circle cx="582" cy="443" r="46" fill="transparent"/>&lt;/a>
&lt;a xlink:href="#bump-2">&lt;circle cx="646" cy="834" r="52" fill="transparent"/>&lt;/a>
&lt;a xlink:href="#matterhorn">&lt;circle cx="1025" cy="457" r="48" fill="transparent"/>&lt;/a>
&lt;a xlink:href="#kilimanjaro">&lt;circle cx="1198" cy="705" r="48" fill="transparent"/>&lt;/a>
&lt;a xlink:href="#everest">&lt;circle cx="1388" cy="506" r="51" fill="transparent"/>&lt;/a>
&lt;/svg>
&lt;figcaption>
This thing is &lt;em>heavy&lt;/em> by the way. 859g of machined brass, 10cm in diameter and 1.4cm deep. I'm being precise in my measurements because &lt;em>anything could be a clue! 🕵️‍♂️&lt;/em>
&lt;/figcaption>
&lt;/figure>
&lt;p>I excitedly showed it to &lt;em>so&lt;/em> many people at that party, sharing my intrigue and joy, that I promised to blog through my attempts to open it — so here we go!&lt;/p>
&lt;blockquote class="alert alert-important">
&lt;p class="alert-heading">
❕
Important
&lt;/p>
&lt;p>I'm taking you on my journey as I solve my puzzle. &lt;em>Please don't share ideas, suggestions, or spoilers with me&lt;/em>. I'm taking my time in enjoying this wonderful gift, don't take away my fun! ☺️&lt;/p>
&lt;/blockquote>
&lt;h2 id="the-cryptex">The cryptex&lt;/h2>
&lt;p>I started with the lettering around the outside. I'd been told this puzzle box is tied to my own skills, so it's not surprising that I immediately recognised &lt;a href="https://en.wikipedia.org/wiki/Toki_Pona" target="_blank">toki pona&lt;/a>, written in the joyful lettering called &lt;em>sitelen pona&lt;/em>. This is a lovely &amp;quot;conlang&amp;quot; (constructed language) I started learning a few years ago.&lt;/p>
&lt;p>I won't go down too much of a tangent, but this tiny language was constructed in 2001 by Sonja Lang to &amp;quot;simplify thought&amp;quot;. It only has just over 100 words, so context is key and concepts get refined by others to slowly build up an idea of what's being described.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/edge.jpg"
alt="The wooden veneer around the outside of my brass puzzle box, with toki pona laser etched into it."/>
&lt;/figure>
&lt;p>I &lt;em>think&lt;/em> the glyphs around the outside of my puzzle box make three sentences:&lt;/p>
&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">
&lt;div class="tokipona">
&lt;p>sewi pi nena suli li tawa e sitelen lon sinpin::&lt;br/>
nena pilin selo e pana waso la jelo anpa uta la pimeja jo uta..&lt;br/>
mute nasa ale ale olin wan selo..&lt;/p>
&lt;/div>
&lt;p>You can try and translate it yourself with an &lt;a href="https://nimi.li/" target="_blank">online toki pona dictionary&lt;/a> if you like! Here's what I made of the first sentence. (I'll translate the others here next time!)&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>glyph&lt;/th>
&lt;th>word&lt;/th>
&lt;th>meaning&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">sewi&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/sewi" target="_blank">sewi&lt;/a>&lt;/td>
&lt;td>up, top, highest, awesome, inspiring&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">pi&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/pi" target="_blank">pi&lt;/a>&lt;/td>
&lt;td>&lt;em>modifier: refinements follow&lt;/em>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">nena&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/nena" target="_blank">nena&lt;/a>&lt;/td>
&lt;td>bump, hill&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">suli&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/suli" target="_blank">suli&lt;/a>&lt;/td>
&lt;td>big, tall, important&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">li&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/li" target="_blank">li&lt;/a>&lt;/td>
&lt;td>&lt;em>modifier: verb follows&lt;/em>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">tawa&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/tawa" target="_blank">tawa&lt;/a>&lt;/td>
&lt;td>motion&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">e&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/e" target="_blank">e&lt;/a>&lt;/td>
&lt;td>&lt;em>modifier: direct object follows&lt;/em>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">sitelen&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/sitelen" target="_blank">sitelen&lt;/a>&lt;/td>
&lt;td>image, picture, writing&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">lon&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/lon" target="_blank">lon&lt;/a>&lt;/td>
&lt;td>located at&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;link rel="stylesheet" href="https://www.byjp.me/css/tokipona.css">&lt;span class="tokipona">sinpin&lt;/span>&lt;/td>
&lt;td>&lt;a href="https://nimi.li/sinpin" target="_blank">sinpin&lt;/a>&lt;/td>
&lt;td>vertical surface, wall&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>There are three modifiers in this sentence, defining relationships between the words around them:&lt;/p>
&lt;ul>
&lt;li>&lt;em>&lt;a href="https://nimi.li/pi" target="_blank">pi&lt;/a>&lt;/em> indicates that the &amp;quot;up&amp;quot; is also a &amp;quot;hill&amp;quot; and &amp;quot;tall&amp;quot; or &amp;quot;important&amp;quot;. I think this describes the bumps on the surface of the puzzle! This is the sentence's subject.&lt;/li>
&lt;li>&lt;em>&lt;a href="https://nimi.li/li" target="_blank">li&lt;/a>&lt;/em> tells me that I should interpret the next word as a verb — so it's not &lt;em>motion&lt;/em>, but to &lt;em>make&lt;/em> motion — or to move!&lt;/li>
&lt;li>&lt;em>&lt;a href="https://nimi.li/e" target="_blank">e&lt;/a>&lt;/em> points me at the object of the sentence, an image located at a wall.&lt;/li>
&lt;/ul>
&lt;p>So, being a little liberal, I translate this as:&lt;/p>
&lt;blockquote>
&lt;p>Move the bumps on the top to a wall to make an image.&lt;/p>
&lt;/blockquote>
&lt;p>I went to a dark room, and shone a bright light through these &amp;quot;important bumps&amp;quot; and…&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/projecting.jpg"
alt="A hard-to-take photo of a bright light emitting out of the glass bumps on the top of my puzzle, in a dark room."/>
&lt;/figure>
&lt;p>Holy crap &lt;em>images&lt;/em>. It's a tiny slide projector!&lt;/p>
&lt;h2 id="the-projector">The projector&lt;/h2>
&lt;p>There's only a few millimetres for each &amp;quot;slide&amp;quot; in these holes, so the photos are blurry at best, but here they are, on my wall, as I moved the light between them. (I've laid them out here in the same order as the photo of the puzzle box above. You can click on a bump up top, and it'll scroll to and highlight the relevant image here.)&lt;/p>
&lt;div class="circle-images">
&lt;img alt="a blurry picture of a mountain with three sharp peaks next to each other" id="bump-1" src="./bump-1.jpg">
&lt;img alt="a blurry picture of a sharp and pointy, snow covered mountain" id="matterhorn" src="./bump-3-matterhorn.jpg">
&lt;img alt="a blurry picture of a massive, broad mountain" id="everest" src="./bump-5-everest.jpg">
&lt;img alt="a blurry picture of a snowy mountain framed between two other much smaller ones" id="bump-2" src="./bump-2.jpg">
&lt;img alt="a blurry picture of a mountain with giraffes in the foreground" id="kilimanjaro" src="./bump-4-kilimanjaro.jpg">
&lt;/div>
&lt;style>
.circle-images {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 1rem;
img {
border-radius: 50%;
width: 25%;
}
&lt;pre>&lt;code>&amp;amp;:target{
outline: 2px solid var(--accent);
}
&lt;/code>&lt;/pre>
&lt;p>}
&lt;/style>&lt;/p>
&lt;p>These are mountains! These friends of mine know I love a good climb, but I don't think I've scaled any of these behemoths. They seem to be from all around the world — I immediately recognised &lt;a href="#kilimanjaro">Kilimanjaro&lt;/a> with the giraffes, but what about the other ones?&lt;/p>
&lt;p>It's interesting that the bump showing Kilimanjaro (roughly 3.1ºS, 37.4ºE) is just below the &amp;quot;equator&amp;quot; on the brass surface, and just over two vertical lines right… or &lt;em>East&lt;/em> of the middle. That'd make each of the divisions on the brass front about 15º (vertically as well, as that'd put the poles at ±90º).&lt;/p>
&lt;p>I initially thought the first one showed the &lt;a href="https://en.wikipedia.org/wiki/Torres_del_Paine_National_Park" target="_blank">Torres del Paine&lt;/a> (which I am &lt;a href="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story">predisposed to spotting everywhere&lt;/a> 😜), but the shape isn't &lt;em>quite&lt;/em> right, and these brass lines put this image North of the equator, not in Patagonia.&lt;/p>
&lt;p>So here are my guesses at positions for each of the bumps, using their position on the puzzle box, and looking for tall mountains in the area that look similar!&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>#&lt;/th>
&lt;th>Location&lt;/th>
&lt;th>My best guess&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>1&lt;/td>
&lt;td>36.6ºN, 118.3ºW&lt;/td>
&lt;td>&lt;a href="https://en.wikipedia.org/wiki/Mount_Whitney" target="_blank">Mount Whitney&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2&lt;/td>
&lt;td>26ºS, 68ºW ?&lt;/td>
&lt;td>&lt;a href="https://en.wikipedia.org/wiki/Nevado_Tres_Cruces" target="_blank">Nevado Tres Cruces&lt;/a>?&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3&lt;/td>
&lt;td>45.5ºN, 7.5ºE&lt;/td>
&lt;td>&lt;a href="https://en.wikipedia.org/wiki/Matterhorn" target="_blank">Matterhorn&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>4&lt;/td>
&lt;td>3.1ºS, 37.4ºE&lt;/td>
&lt;td>&lt;a href="https://en.wikipedia.org/wiki/Mount_Kilimanjaro" target="_blank">Kilimanjaro&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5&lt;/td>
&lt;td>27.6ºN, 86.6ºE&lt;/td>
&lt;td>&lt;a href="https://en.wikipedia.org/wiki/Mount_Everest" target="_blank">Everest&lt;/a>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;del>The first two of these I'm much less certain of&lt;/del>. The first is Mount Whitney—those peaks are unmistakable! Nevado Tres Cruces doesn't &lt;em>quite&lt;/em> look the same though. I'm going to have to do some more exploring!&lt;/p>
&lt;h2 id="the-adventure-continues">The adventure continues!&lt;/h2>
&lt;p>And that that's where I think I'll leave this puzzle update! You can follow along with the &lt;a href="https://www.byjp.me/series/puzzle-box/">Puzzle Box series&lt;/a> series, &lt;a href="https://www.byjp.me/">my blog, or my socials&lt;/a> if you'd like to see what I figure out next!&lt;/p></content:encoded><enclosure url="https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/the-puzzle.jpg" length="213157" type="image/jpeg"/></item><item><title>Leaving Meta &amp; how to reach me</title><link>https://www.byjp.me/posts/leaving-meta/</link><pubDate>Fri, 31 Jan 2025 14:13:45 +0000</pubDate><guid>https://www.byjp.me/posts/leaving-meta/</guid><description>I'm leaving Instagram &amp;amp; Facebook. I want less corporation in my human connection; here's how to reach me! ☺️ #internet #social</description><content:encoded>
&lt;p>I'm leaving Meta's platforms wherever I can. Soon that'll be Facebook and Instagram, and one day (I hope) WhatsApp too.&lt;/p>
&lt;p>&lt;strong>tl;dr&lt;/strong>: Pick any of these that work for you to contact me, or follow me: &lt;a href="https://www.byjp.me/">This website&lt;/a>, &lt;a href="mailto:hello@byjp.me" target="_blank" rel="me noopener" title="Email">Email&lt;/a>, &lt;a href="https://signal.me/#eu/092dSvsDjSYGU_6W2Z4fvXJfktdozKIidYs91EA9I3kukc-3xOtB_aAg3QxUOznZ" target="_blank" rel="me noopener" title="Signal">Signal&lt;/a>; &lt;a href="https://bsky.app/profile/byjp.me" target="_blank" rel="me noopener" title="Bluesky">Bluesky&lt;/a>, &lt;a href="https://hachyderm.io/@byjp" target="_blank" rel="me noopener" title="Mastodon">Mastodon&lt;/a>, &lt;a href="https://pixelfed.social/@jphastings" target="_blank" rel="me noopener" title="Pixelfed">Pixelfed&lt;/a>, &lt;a href="https://www.byjp.me/index.xml">RSS&lt;/a>.&lt;/p>
&lt;p>I doubt anyone will be particularly surprised I'm deleting Facebook &amp;amp; Insta, I've barely been active on these sites for years and even failed a &lt;a href="https://www.byjp.me/posts/goodbye-big-social/">promise to leave before&lt;/a>, but this time feels different. This post serves as their tombstone for me.&lt;/p>
&lt;h2 id="how-to-keep-in-touch">How to keep in touch?&lt;/h2>
&lt;p>One thing I've missed even &lt;em>within&lt;/em> these platforms for a few years now is actually being able to &lt;em>follow along with my friends' lives&lt;/em> (that's you!) instead of getting lost in adverts. Even though I'm trying to be more intentional about reaching out to people, I still miss chatting with so many of you, and that sucks.&lt;/p>
&lt;p>So, if you want to &lt;strong>contact me for a chat&lt;/strong> instead, you can always send me a message on &lt;a href="https://signal.me/#eu/092dSvsDjSYGU_6W2Z4fvXJfktdozKIidYs91EA9I3kukc-3xOtB_aAg3QxUOznZ" target="_blank" rel="me noopener" title="Signal">Signal&lt;/a>, or a good old &lt;a href="mailto:hello@byjp.me" target="_blank" rel="me noopener" title="Email">Email&lt;/a>.&lt;/p>
&lt;p>And if you'd rather &lt;strong>follow my world passively&lt;/strong>, you can too! This site is the core of anything I post online now, but everything gets copied elsewhere to make it easy for you. &lt;strong>Photos&lt;/strong> go to &lt;a href="https://bsky.app/profile/byjp.me" target="_blank" rel="me noopener" title="Bluesky">Bluesky&lt;/a> and &lt;a href="https://pixelfed.social/@jphastings" target="_blank" rel="me noopener" title="Pixelfed">Pixelfed&lt;/a>, &lt;strong>&amp;quot;tweets&amp;quot;&lt;/strong> go to &lt;a href="https://hachyderm.io/@byjp" target="_blank" rel="me noopener" title="Mastodon">Mastodon&lt;/a> and &lt;a href="https://bsky.app/profile/byjp.me" target="_blank" rel="me noopener" title="Bluesky">Bluesky&lt;/a>, &lt;strong>articles&lt;/strong> go to all three.)&lt;/p>
&lt;p>(If you know what &lt;a href="https://en.wikipedia.org/wiki/RSS" target="_blank">RSS&lt;/a> is then you probably already know there are feeds everywhere here, including a &lt;a href="https://www.byjp.me/podcast">'podcast' of sorts&lt;/a>, for posts with recordings.)&lt;/p>
&lt;h2 id="why-are-you-leaving-meta">Why are you leaving Meta?&lt;/h2>
&lt;p>I'm at a bit of a loss as to what to say here. I hope it's telling enough that I'm cautious of explaining &lt;em>why&lt;/em> I'm leaving Meta in a publicly accessible place? If you'd like to chat about it, just get in touch! Perhaps we can even go for a bite or a drink too.&lt;/p></content:encoded></item><item><title>Yule's Chocolates</title><link>https://www.byjp.me/posts/truly-chocolates/</link><pubDate>Tue, 14 Jan 2025 12:10:59 +0000</pubDate><guid>https://www.byjp.me/posts/truly-chocolates/</guid><description>I judge these Christmassy chocolates Not Quality Enough (most of the time) #chocolate #review #Christmas</description><content:encoded>
&lt;p>Here I am, two weeks into 2025, and I've reached the &lt;em>Quality Street Watershed&lt;/em>. I've nibbled my way through all the &amp;quot;good&amp;quot; ones, those remaining after we were given one at our Christmassy gathering, and now each colourful chocolate I unwrap is just the &lt;em>slightest&lt;/em> bit disappointing.&lt;/p>
&lt;p>Naturally there is a pecking (scoffing?) order to these treats, and I decided to rank them as I worked my way through:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name (Count&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>)&lt;/th>
&lt;th>Notes&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Orange Chocolate Crunch&lt;/strong> (5)&lt;/td>
&lt;td>The undeniable best. These were gone before I blinked.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>The Green Triangle&lt;/strong> (4)&lt;/td>
&lt;td>Hazelnutty deliciousness. Yes please.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>The Purple One&lt;/strong> (6)&lt;/td>
&lt;td>Surprised me with tastiness. I'd normally leave these lower down the list!&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Milk Chocolate Block&lt;/strong> (4)&lt;/td>
&lt;td>Solid chocolatey punch. Dependable. Probably in the mid-highs on everyone's list.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Caramel Swirl&lt;/strong> (8)&lt;/td>
&lt;td>I prefer my chocs with a bit of a bite, so the caramel innards lower this a little, but still delicious.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Orange Creme&lt;/strong> (7)&lt;/td>
&lt;td>Just a little too intense to be good enough for the faves. You could probaby twist my arm though.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Fudge&lt;/strong> (6)&lt;/td>
&lt;td>So plain. So dry‽ Meh incarnate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Coconut Eclair&lt;/strong> (7)&lt;/td>
&lt;td>Coconut shouldn't exist in chocolate form. I'm looking at you too Bounty. But at least it's still chocolate.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Toffee Penny&lt;/strong> (6)&lt;/td>
&lt;td>IT'S IN MY TEETH.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Toffee Finger&lt;/strong> (6)&lt;/td>
&lt;td>Chewy in summer, but rock hard an impenetrable in their native time of year. Or maybe I&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Strawberry Delight&lt;/strong> (7)&lt;/td>
&lt;td>I refuse to accept that anyone finds these tasty. &lt;em>NOPE.&lt;/em>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>That gap in the middle? That's the watershed. Once I've eaten down the list that far I know that the holiday season is truly over, and it's time to embrace the new year.&lt;/p>
&lt;p>Though I didn't count what came in &lt;em>this&lt;/em> tin&lt;sup id="fnref1:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>, I'm also cynically unsurprised that my &amp;quot;worth eating&amp;quot; chocs are only 5 of the 11 types&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>, and make up even less by count at just 40% of the tin! Here's to having friends with different tastes &amp;amp; sharing with them 😅&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>I didn't count mine — they were a gift during a house party we were throwing and it seemed… perhaps a &lt;em>tad&lt;/em> antisocial to count them right then, or to forbid anyone from eating them that night 😅 These counts are from &lt;a href="https://www.gazettelive.co.uk/whats-on/counted-every-chocolate-quality-street-30527339" target="_blank">the first search result&lt;/a> that claimed to have counted them this winter.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>Yes, the post's title is also a 5 letter anagram of the 11 unique letters in &amp;quot;quality street&amp;quot;. So &amp;quot;clever&amp;quot; is this reference that I have to explain it. In detail.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></content:encoded></item><item><title>Easy image minification</title><link>https://www.byjp.me/posts/releases/jpegli/</link><pubDate>Fri, 11 Oct 2024 10:24:33 +0100</pubDate><guid>https://www.byjp.me/posts/releases/jpegli/</guid><description>I wrote the &lt;code>jpegli&lt;/code> CLI tool to quickly reduce the pixel- and byte-size of images for my blog, using JPEGli compression. #JPEGli #CLI #code</description><content:encoded>
&lt;p>I've not written anything substantial here in &lt;em>some time&lt;/em>, and sadly that's not going to change today!&lt;/p>
&lt;p>I do have a mini-announcement about a tool I built for image posting here though — I've released the &lt;a href="https://github.com/jphastings/jpegli" target="_blank">&lt;code>jpegli&lt;/code>&lt;/a> command line tool which:&lt;/p>
&lt;ul>
&lt;li>Ensures the image is no larger than 2048×1920px (maintaining aspect ratio)&lt;/li>
&lt;li>Compresses the image with the impressive &lt;a href="https://opensource.googleblog.com/2024/04/introducing-jpegli-new-jpeg-coding-library.html" target="_blank">JPEGli&lt;/a> algorithm&lt;/li>
&lt;/ul>
&lt;p>JPEGli is a (relatively) new way of producing JPEG images but at significantly smaller file sizes (with no real noticeable difference). The end up &lt;em>roughly&lt;/em> the size of WebP images, but (being JPEG images) they're readily understood &lt;em>everywhere&lt;/em>.&lt;/p>
&lt;p>If this sounds useful then you can download for mac/linux/windows &lt;a href="https://github.com/jphastings/jpegli/releases" target="_blank">from github&lt;/a> or you can do any of the following&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># With Homebrew installed&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install jphastings/tools/jpegli
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># With Go installed&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">go install github.com/jphastings/jpegli@latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Do &lt;a href="https://www.byjp.me/standing-invitation">let me know&lt;/a> if you use it, or would like to see some improvements/changes to how it works. It's very basic at the moment!&lt;/p></content:encoded></item><item><title>Alien Clay</title><link>https://www.byjp.me/posts/reviews/books/adrian-tchaikovsky/alien-clay/</link><pubDate>Thu, 20 Jun 2024 11:24:33 +0000</pubDate><guid>https://www.byjp.me/posts/reviews/books/adrian-tchaikovsky/alien-clay/</guid><description>'Alien Clay' by Adrian Tchaikovsky was an excellent read/listen! Compelling &amp;amp; full of thoughtful moments, I can't recommend it enough. #books #Sci-fi #psychology #environment #audiobooks</description><content:encoded>
&lt;figure class="book" itemscope itemtype="https://schema.org/Book">
&lt;a href="https://openlibrary.org/books/OL50716070M" target="_blank" title="Open book details" itemprop="url">&lt;img src="https://www.byjp.me/posts/reviews/books/adrian-tchaikovsky/alien-clay/alien-clay.jpg" width="180" height="276" alt="The cover of the book Alien Clay" itemprop="image">&lt;/a>
&lt;figcaption>
&lt;cite>&lt;a href="https://openlibrary.org/books/OL50716070M" target="_blank" title="Open book details" itemprop="url">&lt;span itemprop="name">Alien Clay&lt;/span>&lt;/a>&lt;/cite>&lt;span class="authors list" itemprop="author" itemscope itemtype="https://schema.org/Person"> by &lt;a href="https://openlibrary.org/authors/OL7468980A" target="_blank" itemprop="url">&lt;span itemprop="name">Adrian Tchaikovsky&lt;/span>&lt;/a>&lt;/span>&lt;/figcaption>
&lt;/figure>
&lt;p>I really enjoyed this book! I've read quite a few of Adrian Tchaikovsky's books, and they've always engaged me thoroughly with their astute science and focus on the &lt;em>psychology&lt;/em> of the protagonists (even &lt;a href="https://openlibrary.org/works/OL32485761W/Children_of_Time" target="_blank">when they're not human&lt;/a>). &lt;cite>Alien Clay&lt;/cite> is similarly compelling, &lt;em>thrilling&lt;/em> even, full of existential questions set in a dystopian human future that reminded me of 1984 much more than what you might envision from a &amp;quot;Sci-Fi&amp;quot; book.&lt;/p>
&lt;p>Our protagonist is highly educated, and I feel like this was partially so that Tchaikovsky could really lean into the highly intelligent dry humour that comes with academic territory. I loved it.&lt;/p>
&lt;p>This book is &lt;em>very&lt;/em> smart, especially in how the camaraderie between the characters is paired with narrative device; like the occasional non-linear timeline, first-person story telling, and plenty of nods to the alert reader (listening to an audiobook it took me a beat to get why &amp;quot;they're only a letter a way&amp;quot; is a grin-inducing reason for our protagonist to miss a gun being shot while someone else is shouting!) — but I never found it inaccessible, nor was there any &lt;a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/Technobabble" target="_blank">technobabble&lt;/a> my (admittedly rusty) physics and chemistry could spot. It was an absolute page-turner for me.&lt;/p>
&lt;p>⚠️ The next paragraph(s) contain spoilers!&lt;/p>
&lt;p>I &lt;em>adored&lt;/em> slowly realising how much our narrator-protagonist had been 'taken over' by the Kiln ecology in the time-shifted central part of the plot. Slowly deciding that Professor Daghdev had been infected 'enough' to be an unreliable narrator for the previous chapter was a thrill; almost as much as having to &lt;em>walk back&lt;/em> that assumption when I learned that, as much as Kiln changes people, it also doesn't really change them at all — only neutralising the basic human conflict between needing a sense of self but without an overpowering ego. &lt;em>Especially&lt;/em> with the highly egotistical world of academia, and the suppression of the ego in an authoritarian culture, as backdrops to the entire story.&lt;/p>
&lt;p>🛟 Spoilers over!&lt;/p>
&lt;p>If you're one for a bit of escapism with a very real world undertone, lots of smart writing that doesn't get in the way, and a satisfying plot then I can't recommend this enough!&lt;/p></content:encoded></item><item><title>Furiosa: A Mad Max Saga</title><link>https://www.byjp.me/posts/reviews/movies/furiosa-a-mad-max-saga/</link><pubDate>Sun, 16 Jun 2024 10:44:15 +0000</pubDate><guid>https://www.byjp.me/posts/reviews/movies/furiosa-a-mad-max-saga/</guid><description>Max barely features, but it's gloriously mad. Explosions and brutality galore, but a moving central plot that made me stay for the story.</description><content:encoded>
&lt;figure class="film" itemscope itemtype="https://schema.org/Movie">
&lt;a href="https://www.themoviedb.org/movie/786892-furiosa-a-mad-max-saga" target="_blank" title="Open film details" itemprop="url">
&lt;img src="https://www.byjp.me/posts/reviews/movies/furiosa-a-mad-max-saga/poster.webp" width="1024" height="1537" alt="The poster for the film Furiosa: A Mad Max Saga" itemprop="image">
&lt;/a>
&lt;figcaption>
&lt;a href="https://www.themoviedb.org/movie/786892-furiosa-a-mad-max-saga" target="_blank" title="Open film details" itemprop="url">&lt;span itemprop="name">Furiosa: A Mad Max Saga&lt;/span>&lt;/a> (&lt;span itemprop="datePublished">2024&lt;/span>)
&lt;/figcaption>
&lt;/figure>
&lt;p>I really enjoyed this film! It is &lt;em>a lot&lt;/em> of explosions and brutality, but it was continually compelling — even as I questioned why I was so invested. At 2h20m it definitely made me feel my sleepy age (I saw it yesterday evening, on my 39th birthday, and I was squinting and yawning by the end!) but I felt more impressed that a relatively slow paced film gripped me for so long.&lt;/p>
&lt;p>It's a proper odyssey, with poor Furiosa only wanting to get home; but the trials she faces grow organically out of the plot and the universe, and give Furiosa a depth I didn't expect from a character/actor who's almost entirely expressionless through the film.&lt;/p>
&lt;p>This entry in the Mad Max continuum (though I've only watched &lt;a href="https://www.themoviedb.org/movie/9659-mad-max" target="_blank">the first&lt;/a>, and &lt;a href="https://www.themoviedb.org/movie/76341-mad-max-fury-road" target="_blank">Fury Road&lt;/a>) steers away from exploring the whats and whys of the apocalyptic world they live in, tempting though I'm sure it was in a 2024 that has &lt;em>so many&lt;/em> parallels, and instead lets us draw our own conclusions. The men in power who lie and rabble-rouse to get the power they desire, just so they can watch the world burn (again); how much we all embrace making ourselves vulnerable for the hope of human connection; the power dynamics and game theory in a world where two thirds of what you need is only necessary because of collective attitudes.&lt;/p>
&lt;p>I'm certain I'll watch this again—and as a stand-alone film—which, for a long and relatively simple plot, is something very uncommon for me. I hope you enjoy it too!&lt;/p></content:encoded><dc:relation>https://trakt.tv/comments/685347</dc:relation><dc:relation>https://hachyderm.io/@byjp/112636298861095286</dc:relation><dc:relation>https://bsky.app/profile/byjp.me/post/3kv6m2uq6uc2y</dc:relation><dc:relation>https://www.themoviedb.org/review/66713279deffc650e983ca1a</dc:relation></item><item><title>git download-subpath</title><link>https://www.byjp.me/posts/git-download-subpath/</link><pubDate>Tue, 14 May 2024 13:08:10 +0100</pubDate><guid>https://www.byjp.me/posts/git-download-subpath/</guid><description>I made a git helper tool that lets you retrieve files from a subpath of git without downloading the whole of the (possibly huge) repo. #git #computers #tools</description><content:encoded>
&lt;p>My blog has ~250MB of &lt;a href="https://www.byjp.me/photos">photos&lt;/a> in it (as I &lt;a href="https://www.byjp.me/posts/archiving-instagram-posts/">archived my Instagram here&lt;/a> — &lt;em>a decade&lt;/em> of photos) which means that every time I want some files from &lt;a href="https://github.com/by-jp/www.byjp.me" target="_blank">my blog's repo&lt;/a> I've needed to pull down all that data to get at the few files I want.&lt;/p>
&lt;p>This isn't a problem on my laptop where I work on my blog (as it's already cloned), but I also keep my &lt;a href="https://getindiekit.com" target="_blank">IndieKit&lt;/a> config in there, which I need to copy to the server it runs from. I don't want to have to download hundreds of MB (and growing!) of photo data every time I want to update it.&lt;/p>
&lt;p>So I built &lt;code>git-download-subpath&lt;/code>, which is a bash script around &lt;a href="https://git-scm.com/docs/partial-clone" target="_blank">git's partial clone&lt;/a> functionality.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">$ git download-subpath
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># usage: git-download-subpath &amp;lt;repo&amp;gt; &amp;lt;subpath&amp;gt; [destination]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git download-subpath https://github.com/by-jp/www.byjp.me indiekit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Successfully downloaded to ./indiekit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This script (which you can find &amp;amp; download below) completes these steps:&lt;/p>
&lt;ol>
&lt;li>Clones a &amp;quot;no tree&amp;quot; copy of the repo to a temporary directory (just references to commits &amp;amp; the latest files, not the data itself)&lt;/li>
&lt;li>Completes a &amp;quot;no cone&amp;quot; sparse checkout of the subpath desired&lt;/li>
&lt;li>Moves that desired subpath over the working directory (or the destination, if specified)&lt;/li>
&lt;/ol>
&lt;p>I'm no bash expert, so there may be subtle bugs here; let me know if you spot them!&lt;/p>
&lt;p>&lt;em>Copy the following bash to &lt;code>git-download-subpath&lt;/code> somewhere in your &lt;code>$PATH&lt;/code> (I keep it in &lt;code>/usr/local/bin&lt;/code>), and mark as executable with &lt;code>chmod +x git-download-subpath&lt;/code>:&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nb">set&lt;/span> -e
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">repo&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$1&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">subpath&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$2&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> -z &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">repo&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">||&lt;/span> -z &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;usage: git-download-subpath &amp;lt;repo&amp;gt; &amp;lt;subpath&amp;gt; [destination]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> -z &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$3&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">dest&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">pwd&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">dest&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>realpath &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$3&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> ! -d &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> is not a directory that exists&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> -d &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> already exists, exiting to avoid replacing&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span> &lt;span class="m">3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cross-platform create temporary dir: https://unix.stackexchange.com/a/84980/&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">tmpdir&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>mktemp -d 2&amp;gt;/dev/null &lt;span class="o">||&lt;/span> mktemp -d -t &lt;span class="s1">&amp;#39;git-download-subpath&amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">tmpdir&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git clone -n --depth&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span> --filter&lt;span class="o">=&lt;/span>tree:0 &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">repo&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> repo &amp;gt; /dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> repo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git sparse-checkout &lt;span class="nb">set&lt;/span> --no-cone &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &amp;gt; /dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git checkout &amp;gt; /dev/null 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="o">[[&lt;/span> ! -d &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;The directory &amp;#39;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#39; doesn&amp;#39;t exist in this repo.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">exit&lt;/span> &lt;span class="m">5&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">cp -r &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;Successfully downloaded to &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">dest&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">subpath&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content:encoded><dc:relation>https://gist.github.com/jphastings/6560bb173399fc3a155913b33e5f0f0c</dc:relation></item><item><title>IndieSearch</title><link>https://www.byjp.me/posts/indiesearch/</link><pubDate>Sun, 12 May 2024 21:27:36 +0100</pubDate><guid>https://www.byjp.me/posts/indiesearch/</guid><description>I built a prototype for client-side, fully distributed search for the IndieWeb — check out the demo &amp;amp; a little explainer. #IndieWeb #search #decentralised #demo #IPFS</description><content:encoded>
&lt;p>I've been exploring what totally decentralised and local-first compatible search might look like for the web. Here's a quick video demo of a prototype I've built called &lt;em>IndieSearch&lt;/em>, powered by the (awesome) client-side search tool called &lt;a href="https://pagefind.app" target="_blank">Pagefind&lt;/a> (or read on, if videos aren't your thing).&lt;/p>
&lt;div
style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe
src="https://player.vimeo.com/video/945570914?dnt=0"
style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allow="fullscreen">
&lt;/iframe>
&lt;/div>
&lt;p>Firstly, I should be clear that I designed this based on the premise that you want to search the sites you've &lt;em>previously visited&lt;/em>. It's not intended to help with discovering new sites directly (but I do have some plans for how this might change in the future).&lt;/p>
&lt;p>IndieSearch works as a browser extension (in my video I'm using &lt;a href="https://www.byjp.me/posts/arc-new-browser/">Arc&lt;/a>, a Chromium-based browser). That extension provides the search homepage, but its most important job is to check for a specific HTML &lt;code>&amp;lt;link&amp;gt;&lt;/code> tag on the pages I visit &amp;amp; store what it finds. It looks for something like this:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">link&lt;/span> &lt;span class="na">rel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;search&amp;#34;&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;application/pagefind&amp;#34;&lt;/span> &lt;span class="na">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;/search&amp;#34;&lt;/span> &lt;span class="na">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;byJP&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>href&lt;/code> attribute is the location of the site's &lt;a href="https://pagefind.app" target="_blank">Pagefind&lt;/a> index, and the &lt;code>title&lt;/code> is what we'll show to the person searching when they're managing their sites. There they can sort through supported sites they've visited, seeing the new ones, and flagging them to be included or excluded in future searches.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/indiesearch/config-popup.webp"
alt="The IndieSearch config page, showing a newly visited site, three sites to be included in search results, and one excluded" height="600"/>
&lt;/figure>
&lt;p>Any time they visit the IndieSearch homepage (a page served from their browser extension) they can now search all the sites supporting IndieSearch they've visited and/or included. (I'd also like to build a website at &lt;a href="https://indiesearch.club" target="_blank">indiesearch.club&lt;/a> which bounces you straight to your extension's search homepage, for convenience).&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/indiesearch/indiesearch.webp"
alt="Using IndieSearch to query this blog; looking for &amp;#39;Appreciate&amp;#39; and finding my recent post on Easy appreciation."/>
&lt;/figure>
&lt;h2 id="whats-good">What's good&lt;/h2>
&lt;ul>
&lt;li>The search is blazing fast, as Pagefind's indexing method breaks up the search data so clients only need to download the relevant parts of the index, then the fragments of any search hits. Usually this is ~30kB per search, per site.&lt;/li>
&lt;li>The search index is entirely static! No need for a special server; just some odd-looking files in a directory of your site. (This is me just boasting Pagefind's best feature.)&lt;/li>
&lt;li>IndieSearch doesn't have many moving parts (awesome!), and its &lt;em>very&lt;/em> simple to &lt;a href="https://pagefind.app/docs/" target="_blank">add Pagefind support to a site&lt;/a>, so adoption has fewer obstacles.&lt;/li>
&lt;li>&lt;a href="https://pagefind.app/docs/ui-usage/" target="_blank">PageFindUI&lt;/a>'s is powerful, pre-built, and has loads of great features that work out-of-the-box (like search facets).&lt;/li>
&lt;li>Index configuration is almost entirely done by the indexer (ie. the site owner), with presentation configurable by the UI (within IndieSearch's code) — this is entirely down to &lt;a href="https://cloudcannon.com/" target="_blank">CloudCannon&lt;/a>'s awesome work with Pagefind — have I raved enough about it yet?&lt;/li>
&lt;/ul>
&lt;h2 id="whats-difficult">What's difficult&lt;/h2>
&lt;ul>
&lt;li>Scalability is rough; an extra 30kB per site, per search could make searching all your most frequented sites quite bulky. Having said this, Pagefind's queries send suitable cache headers, so this could be limited, particularly for sites that change infrequently.&lt;/li>
&lt;li>IndieSearch requires that everyone uses the exact same search index structure &amp;amp; platform (Pagefind). CloudCannon have done something awesome here, but there's not much by way of standards or broad industry adoption behind the format they use — I'd like to see more permanence in the index format, and Pagefind's contributor base.&lt;/li>
&lt;li>I don't have any good ideas for how IndieSearch could work on mobile, or on browsers that don't have extensions.&lt;/li>
&lt;/ul>
&lt;h2 id="whats-next">What's next?&lt;/h2>
&lt;p>Firstly, if you like where I'm going with this — give me a clap, for motivation! 😄&lt;/p>
&lt;figure style="text-align:center">&lt;form class="claps" action="https://byjp-claps.web.val.run/posts/indiesearch/" method="post">
&lt;button type="submit" title="Show appreciation for the post on this page" data-interactions="0">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg>&lt;span>46&lt;/span>&lt;/button>
&lt;/form>&lt;br/>
&lt;small style="font-style: italic">Press this to show appreciation!&lt;/small>
&lt;/figure>
&lt;p>I know I want to get IndieSearch into the various extension stores so it's easy to install, even in this prototype stage. (The &lt;a href="https://github.com/jphastings/indiesearch" target="_blank">code is on Github&lt;/a>, by the way, if you're feeling brave and want to try it yourself.) This is also my first foray into building browser extensions, so I've a lot to learn (especially on how to support Firefox, Safari, and Chromium all at once).&lt;/p>
&lt;p>I'd also be interested in adding some IndieWeb-themed features, like being able to sync your indexed sites with a blogroll, or seeing if I can convince the Pagefind team to include &lt;a href="https://microformats.org" target="_blank">microformats&lt;/a> context to their indexer.&lt;/p>
&lt;p>Oh! And if you use Pagefind on your site already, add that provisional &lt;code>&amp;lt;link&amp;gt;&lt;/code> tag to your site &amp;amp; let me know! It'd be great to have some other test sites out there.&lt;/p>
&lt;p>It's tangentially related, but I'm still desperate to see the #IPFS folks allow DNSLink records to travel offline, and be associated with their SSL certs. The &lt;code>TXT&lt;/code> record at &lt;code>_dnslink.www.byjp.me&lt;/code> that allows IPFS enabled browsers to see &lt;code>/ipns/www.byjp.me&lt;/code> and resolve whichever &lt;code>/ipfs/Qm…&lt;/code> CID is the current version of my site &lt;em>also&lt;/em> contains references to my entire Pagefind search index. If you've pinned my site on IPFS you've &lt;em>also&lt;/em> cached a local copy of my search index. If pinning &lt;code>/ipns/www.byjp.me&lt;/code> also pinned an assertion that &amp;quot;at {timestamp} the root CID of &lt;a href="https://www.byjp.me" target="_blank">www.byjp.me&lt;/a> was &lt;code>Qm…&lt;/code> as signed by that domain's SSL certificate&amp;quot; then IndieSearch could provide full, local-first search of IndieWeb sites on a local machine, or local network, totally detached from the internet.&lt;/p>
&lt;p>I can dream 😁&lt;/p>
&lt;p>Let me know your thoughts too — my Webmentions, &lt;a href="https://hachyderm.io/@byjp" target="_blank">Mastodon&lt;/a>, &lt;a href="https://bsky.app/profile/byjp.me" target="_blank">Bluesky&lt;/a>, and &lt;a href="https://www.byjp.me/standing-invitation">email&lt;/a> are always open 😊&lt;/p></content:encoded><dc:relation>https://hachyderm.io/@byjp/112430316826482911</dc:relation><dc:relation>https://bsky.app/profile/byjp.me/post/3ksd4xxfks62v</dc:relation><dc:relation>https://vimeo.com/manage/videos/945570914</dc:relation></item><item><title>Guessing Vinyl Colours</title><link>https://www.byjp.me/posts/guessing-vinyl-colours/</link><pubDate>Tue, 07 May 2024 15:13:43 +0100</pubDate><guid>https://www.byjp.me/posts/guessing-vinyl-colours/</guid><description>I used my Nix Mini colorimeter &amp;amp; a bit of maths to estimate transparency for some adhesive vinyl I bought. #maths #colour #vinyl #SilhouetteCameo</description><content:encoded>
&lt;p>I've been getting a lot more use from my &lt;a href="https://www.silhouetteamerica.com/featured-product/cameo" target="_blank">Silhouette Cameo 4&lt;/a> plotter/cutter recently, and I've been using a couple of different vinyls to make things. I found it annoying that I couldn't get a good read on what the colour was before I purchased them, so here's the readings I've taken for the vinyls I bought &amp;amp; where I bought them in case any one else finds them useful!&lt;/p>
&lt;p>I took readings for their colour on both black and white card to try and estimate transparency — the process I followed is below. You can see the cheaper &amp;quot;IModeur&amp;quot; yellow vinyl is thinner, and transparent enough to make a difference!&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Vinyl colour&lt;/th>
&lt;th>Approx colour&lt;/th>
&lt;th>On top of &lt;div class="swatch" style="--color: rgba(239 236 230 / 100%)" >#efece6&lt;/div>&lt;/th>
&lt;th>On top of &lt;div class="swatch" style="--color: rgba(64 63 66 / 100%)" >#403f42&lt;/div>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Red&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(185 0 9 / 98%)" >185,0,9 (98%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(194 0 11 / 100%)" >#c2000b&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(174 0 13 / 100%)" >#ae000d&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Yellow&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(254 192 0 / 99%)" >254,192,0 (99%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(255 192 0 / 100%)" >#ffc000&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(251 191 0 / 100%)" >#fbbf00&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.amazon.co.uk/dp/B09JG886SK" target="_blank">IModeur Glossy Yellow&lt;/a>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(219 196 11 / 83%)" >219,196,11 (83%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(248 212 14 / 100%)" >#f8d40e&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(167 165 55 / 100%)" >#a7a537&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Lime Green&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(100 164 43 / 99%)" >100,164,43 (99%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(101 164 44 / 100%)" >#65a42c&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(100 163 44 / 100%)" >#64a32c&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.amazon.co.uk/dp/B09JG7Y1Y4" target="_blank">IModeur Glossy Green&lt;/a>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 119 47 / 99%)" >0,119,47 (99%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 122 48 / 100%)" >#007a30&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 116 49 / 100%)" >#007431&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Azure Blue&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 90 173 / 100%)" >0,90,173 (100%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 90 173 / 100%)" >#005aad&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 90 173 / 100%)" >#005aad&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.amazon.co.uk/dp/B09JGBNNCT" target="_blank">IModeur Glossy Blue&lt;/a>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 137 206 / 99%)" >0,137,206 (99%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 138 209 / 100%)" >#008ad1&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(0 136 202 / 100%)" >#0088ca&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Ice Blue&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(59 159 211 / 100%)" >59,159,211 (100%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(58 159 212 / 100%)" >#3a9fd4&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(60 158 209 / 100%)" >#3c9ed1&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.gmcrafts.co.uk/product/sampler-pack-basic-oracal-651-for-silhouette/" target="_blank">Oracal 651 sample&lt;/a>: Lilac&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(187 147 186 / 100%)" >187,147,186 (100%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(188 146 186 / 100%)" >#bc92ba&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(187 147 186 / 100%)" >#bb93ba&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.amazon.co.uk/dp/B09MHNX66S" target="_blank">IModeur Glossy White&lt;/a>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(238 236 237 / 95%)" >238,236,237 (95%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(239 236 236 / 100%)" >#efecec&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(228 229 230 / 100%)" >#e4e5e6&lt;/div>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;a href="https://www.amazon.co.uk/dp/B09MH8GL3N" target="_blank">IModeur Glossy Black&lt;/a>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(5 0 8 / 100%)" >5,0,8 (100%)&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(4 0 8 / 100%)" >#040008&lt;/div>&lt;/td>
&lt;td>&lt;div class="swatch" style="--color: rgba(6 0 7 / 100%)" >#060007&lt;/div>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;em>I'll keep an up-to-date list of vinyl I buy and their colours in my &lt;a href="https://www.byjp.me/memex/art-design/plotting/">memex page on plotting&lt;/a>.&lt;/em>&lt;/p>
&lt;h3 id="colorimetric-process">Colorimetric process&lt;/h3>
&lt;p>I measured these by putting two squares of the vinyl on black card and on white card, then using the difference between their measured colours (using my trusty &lt;a href="https://www.nixsensor.com/mini-3-color-sensor/" target="_blank">Nix Mini 2&lt;/a>) to deduce their colour &lt;em>including&lt;/em> transparency.&lt;/p>
&lt;p>This process isn't perfect, in the real world a material can be differently transparent at different frequencies. My process was:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Measure the sRGB values for both the plain white ($R_c^w$, $G_c^w$, $B_c^w$) and black ($R_c^b$, $G_c^b$, $B_c^b$) card I'm using as backing paper (values in the table headers above).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Measure the sRGB values for the vinyl being tested on both black and white card (in the right-most two columns above).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Calculate the &lt;a href="https://en.wikipedia.org/wiki/Grayscale#Colorimetric_%28perceptual_luminance-preserving%29_conversion_to_grayscale" target="_blank">colorimetric greyscale&lt;/a> value for both the white and black card ($Y_c^w$, $Y_c^b$), and the vinyl on both black and white card ($Y_v^w$, $Y_v^b$), from their measured RGB values&lt;/p>
$$Y = 0.2126R + 0.7152G + 0.0722B$$&lt;/li>
&lt;li>
&lt;p>Calculate the alpha value for the vinyl from the greyscale values:&lt;/p>
$$A = 1 - \frac{Y_v^w - Y_v^b}{Y_c^w - Y_c^b}$$&lt;/li>
&lt;li>
&lt;p>Use the calculated alpha to find the 'true' red, green, and blue values for the vinyl, averaging the results from the black and white backing card:&lt;/p>
$$R = \frac{R_c^w + R_c^b}{2} + \frac{R_c^w + R_c^b - R_v^w - R_v^b}{2 A}$$&lt;/li>
&lt;li>
&lt;p>Clip the calculated sRGB values to be within [0, 255], for the oddities!&lt;/p>
&lt;/li>
&lt;/ol></content:encoded></item><item><title>Easy appreciation</title><link>https://www.byjp.me/posts/easy-appreciation/</link><pubDate>Sat, 06 Apr 2024 23:48:55 +0100</pubDate><guid>https://www.byjp.me/posts/easy-appreciation/</guid><description>I've built a &amp;quot;clap&amp;quot; feature into my blog so you can show appreciation anonymously and easily, if you want. #community #ValTown #ProgressiveEnhancement #IndieWeb</description><content:encoded>
&lt;p>Here in my little career break I'm spending a lot of time thinking about &lt;em>community&lt;/em>. This blog hasn't had much of a need for community (there's such an ecclectic mix of stuff here that people stumble upon it rather than frequent it) but as I've been building in tools like &lt;a href="https://indieweb.org/Webmention" target="_blank">webmentions&lt;/a>, and pulling comments from other sites (like &lt;a href="https://www.byjp.me/posts/chef-gpt/#interactions">on this post&lt;/a>), I've noticed the absence of an easy &amp;quot;I appreciate this&amp;quot; mechanism for passers-through.&lt;/p>
&lt;p>Yesterday I built a clap button, the one you can see below this paragraph, and on every page at the bottom of the post (though sometimes its a heart instead of a clap, for aesthetic reasons). If you click it it lets me know you appreciate my post, and keeps track of how many times that's happened (you can press it more than once if you really like something!)&lt;/p>
&lt;figure style="text-align:center">&lt;form class="claps" action="https://byjp-claps.web.val.run/posts/easy-appreciation/" method="post">
&lt;button type="submit" title="Show appreciation for the post on this page" data-interactions="0">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg>&lt;span>55&lt;/span>&lt;/button>
&lt;/form>&lt;br/>
&lt;small style="font-style: italic">Press this to show appreciation!&lt;/small>
&lt;/figure>
&lt;p>I decided to make this button totally anonymous; this makes it much easier for you to use, but the lack of tracking also means that—for me—it's a feel good vibe rather than data I can get analytical over. If you like the sound of it, you can try it out 😜&lt;/p>
&lt;h2 id="going-a-little-deeper">Going a little deeper&lt;/h2>
&lt;p>For those more technically inclined, there are some minor smarts behind the scenes here. My site tries to be as decentralised as possible, but recording &amp;amp; retrieving claps needed something centralised (distributed systems are complex!) so I ended up using &lt;a href="https://val.town" target="_blank">val.town&lt;/a>. These folks offer an &lt;em>awesome&lt;/em> platform for simple lambda-like web functions; I &lt;em>love&lt;/em> that they can be totally public &amp;amp; transparent — you can see (and copy!) the one that &lt;a href="https://www.val.town/v/byjp/claps" target="_blank">drives my claps here&lt;/a>.&lt;/p>
&lt;p>That 'val' accepts &lt;code>POST&lt;/code> requests (incrementing the number of claps), &lt;code>GET&lt;/code> requests (telling you how many claps a post has), and the special &lt;code>GET /&lt;/code> which lists the claps for every post. That last endpoint is useful for the code behind my static site builder (&lt;a href="https://gohugo.io" target="_blank">hugo&lt;/a>), it &lt;a href="https://github.com/by-jp/www.byjp.me/blob/38751361ff6b8730428d8227f98189312576a709/layouts/partials/claps.html#L8-L17" target="_blank">pulls that data&lt;/a> as the site is being built (at least once a day) so the clap counts are accurate reasonably quickly without needing any javascript.&lt;/p>
&lt;p>Speaking of not needing javascript, the button is also a &lt;code>&amp;lt;form&amp;gt;&lt;/code> and the 'val' also handles &lt;code>text/html&lt;/code> requests, so you can use this button even if you have javascript turned off. (&lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement" target="_blank">Progressive enhancement&lt;/a> for the win!)&lt;/p>
&lt;p>…but of course javascript gives me more flexibility. I can record your clap without you leaving the page, and give the button an accented colour to give you some feedback. It also means that, when you click that button, I can recording your appreciation in your browser's local database. This means it'll remain accented for you (&amp;quot;you already showed your appreciation for this at least once&amp;quot;) when you &lt;em>next&lt;/em> visit the same page, but while maintaining your anonymity and control. (If you ever 'clear browsing data' for this site, they'll stop being accented, but the clap still remains, anonymously, in my 'val').&lt;/p>
&lt;p>If you find this interesting enough to want to reproduce it on your own blog, please &lt;a href="https://www.byjp.me/standing-invitation">reach out&lt;/a>! I can definitely make it easier to use on other sites 😅&lt;/p>
&lt;h2 id="whats-appreciated">What's appreciated?&lt;/h2>
&lt;p>I doubt this little tool will get much use — my site is a lovely wild garden for me, rather than a valuable resource for others — but to end with a little fun, here's a list of the six most appreciated posts across my site right now.&lt;/p>
&lt;ol class="small-post-list">&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z">&lt;/path>&lt;polyline points="14 2 14 8 20 8">&lt;/polyline>&lt;line x1="16" y1="13" x2="8" y2="13">&lt;/line>&lt;line x1="16" y1="17" x2="8" y2="17">&lt;/line>&lt;polyline points="10 9 9 9 8 9">&lt;/polyline>&lt;/svg>
&lt;a href="https://www.byjp.me/posts/easy-appreciation/">Easy appreciation&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 73&lt;/small>
&lt;/li>&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z">&lt;/path>&lt;polyline points="14 2 14 8 20 8">&lt;/polyline>&lt;line x1="16" y1="13" x2="8" y2="13">&lt;/line>&lt;line x1="16" y1="17" x2="8" y2="17">&lt;/line>&lt;polyline points="10 9 9 9 8 9">&lt;/polyline>&lt;/svg>
&lt;a href="https://www.byjp.me/posts/indiesearch/">IndieSearch&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 67&lt;/small>
&lt;/li>&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71">&lt;/path>&lt;path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71">&lt;/path>&lt;/svg>
&lt;a href="https://www.byjp.me/">Page&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 38&lt;/small>
&lt;/li>&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z">&lt;/path>&lt;/svg>
&lt;a href="https://www.byjp.me/notes/2024-11-21/singlefile/">Note&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 33&lt;/small>
&lt;/li>&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z">&lt;/path>&lt;polyline points="14 2 14 8 20 8">&lt;/polyline>&lt;line x1="16" y1="13" x2="8" y2="13">&lt;/line>&lt;line x1="16" y1="17" x2="8" y2="17">&lt;/line>&lt;polyline points="10 9 9 9 8 9">&lt;/polyline>&lt;/svg>
&lt;a href="https://www.byjp.me/posts/leaving-meta/">Leaving Meta &amp;amp; how to reach me&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 13&lt;/small>
&lt;/li>&lt;li>
&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">&lt;path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z">&lt;/path>&lt;polyline points="14 2 14 8 20 8">&lt;/polyline>&lt;line x1="16" y1="13" x2="8" y2="13">&lt;/line>&lt;line x1="16" y1="17" x2="8" y2="17">&lt;/line>&lt;polyline points="10 9 9 9 8 9">&lt;/polyline>&lt;/svg>
&lt;a href="https://www.byjp.me/posts/40th-puzzle-box/what-a-gift/">What awesomeness is this‽&lt;/a>
&lt;small style="opacity: 0.6">&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256" fill="currentColor">&lt;path d="M160.22,24V8a8,8,0,0,1,16,0V24a8,8,0,0,1-16,0ZM196.1,41a7.91,7.91,0,0,0,4.17,1.17,8,8,0,0,0,6.84-3.83l8-13.11a8,8,0,0,0-13.68-8.33l-8,13.1A8,8,0,0,0,196.1,41Zm47.51,12.59a8,8,0,0,0-10.08-5.16l-15.06,4.85a8,8,0,0,0,2.46,15.62,8.15,8.15,0,0,0,2.46-.39l15.05-4.85A8,8,0,0,0,243.61,53.55ZM217,97.58a80.22,80.22,0,0,1-10.22,94c-.34,1.73-.72,3.46-1.19,5.18A80.17,80.17,0,0,1,58.77,216L23.5,155a26,26,0,0,1,19.24-38.79l-3-5.2a26,26,0,0,1,19.2-38.78L58.24,71A26,26,0,0,1,95.47,36.53,26.06,26.06,0,0,1,140.3,37l12.26,21.2A26.07,26.07,0,0,1,195.81,61ZM109.07,55l0,0h0l25,43.17a26,26,0,0,1,17.33-10L126.42,45a10,10,0,1,0-17.35,10ZM72.12,63l6.46,11.17a26.05,26.05,0,0,1,17.32-10L89.45,53A10,10,0,1,0,72.12,63Zm111.54,81-20.22-35a10,10,0,0,0-17.74,9.25L158.3,140a8,8,0,0,1-13.87,8l-36.5-63A10,10,0,1,0,90.58,95l26.05,45a8,8,0,0,1-13.87,8L71,93h0l0,0a10,10,0,0,0-17.33,10l35.22,61A8,8,0,0,1,75,172L54.72,137a10,10,0,0,0-17.34,10l35.27,61a64.12,64.12,0,0,0,117.42-15.44A63.52,63.52,0,0,0,183.66,144Zm19.41-38.42L181.93,69A10,10,0,0,0,164.55,79l33,57.05A80.2,80.2,0,0,1,207,161.51,64.23,64.23,0,0,0,203.07,105.58Z">&lt;/path>&lt;/svg> 12&lt;/small>
&lt;/li>
&lt;/ol>
&lt;script>
const list = document.currentScript.previousSibling;
for (const clap of list.querySelectorAll('li')) {
const clapKey = `clap:${clap.children[1].pathname}`;
if (localStorage.getItem(clapKey)) {
clap.children[2].classList.add('accent')
}
}
&lt;/script></content:encoded><dc:relation>https://hachyderm.io/@byjp/112229385641236069</dc:relation><dc:relation>https://bsky.app/profile/byjp.me/post/3kpjvofkuah2f</dc:relation></item><item><title>ChefGPT</title><link>https://www.byjp.me/posts/chef-gpt/</link><pubDate>Fri, 15 Mar 2024 19:13:34 +0000</pubDate><guid>https://www.byjp.me/posts/chef-gpt/</guid><description>I asked ChatGPT to give me a recipe for the ingredients I had at home, cooked its suggestion blind and… was unsurprised. I still got a lot from it though! #food #recipes #mela #LLMs #AI</description><content:encoded>
&lt;p>A few weeks ago I started my year with &lt;a href="https://zoe.com/" target="_blank">Zoe&lt;/a>, the science-backed diet learning programme. I've loved seeing my glucose levels respond to the foods I eat in realtime, and the blood, fat, and gut microbiome reports that arrived a few days ago have been &lt;em>fascinating&lt;/em>. I'm trying to shift my diet to meet what I've learned there (more on this below), but this evening I found myself with lots of fresh ingredients not long for this world, and no immediate ideas on how to combine them.&lt;/p>
&lt;h2 id="zoe">Zoe&lt;/h2>
&lt;p>A quick aside to outline the changes I'm making to my diet because of what I've learned from Zoe. None of these will be news to those of you who've spent time learning about the dietary needs of humans this decade (especially if you've read anything by &lt;a href="https://en.wikipedia.org/wiki/Tim_Spector" target="_blank">Tim Spector&lt;/a>, or have a copy of &lt;a href="https://openlibrary.org/works/OL34953020W/Glucose_Goddess_Method" target="_blank">The Glucose Goddess Method&lt;/a>, like &lt;span class="h-card">&lt;a href="https://instagram.com/yvetteedrei" rel="sweetheart spouse friend met" class="u-url p-name" target="_blank">Yvette&lt;/a>&lt;/span> does) but, at least, these ideas have been made newly concrete for me:&lt;/p>
&lt;ul>
&lt;li>My blood sugar control is &amp;quot;poor&amp;quot;. To balance this I'm trying to wildly reduce refined sugars in my diet, reduce carbohydrates in general, and try to sequence them after fats and proteins to reduce how much they make my my blood-glucose levels swing.&lt;/li>
&lt;li>My blood fat control is surprisingly good. This means I can lean into gaining energy from fats if the reduction in carbohydrates leaves me with a deficit. I need to remain careful though, it still takes ~6 hours for fat to clear my bloodstream, so one of lunch or dinner should be lower in fat.&lt;/li>
&lt;li>My microbiome score is middling to poor. This is unsurprising (a family trait), but this means I'm trying to lean further into high-fibre greens (like broccoli, spinach, and kale), tofu, mushrooms, and &lt;a href="https://www.reddit.com/user/pfobwpfo/comments/18ohqi2/nuts/" target="_blank">nuts&lt;/a>.&lt;/li>
&lt;/ul>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/chef-gpt/gut-boosters.webp"
alt="A list of Zoe&amp;#39;s &amp;#34;updated gut booster&amp;#34; foods, for me. Inlcuding almonds, broccoli, spring greens, hazelnuts, and more."/>
&lt;figcaption>I now have a large selection of Zoe's recommendated foods at home. But do they include nuts, or just legumes? I'd best call David Mitchell.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>And so the scene is set for my ChefGPT challenge…&lt;/p>
&lt;h2 id="sudo-make-me-a-sandwich-meal">sudo make me a &lt;del>sandwich&lt;/del> meal&lt;/h2>
&lt;p>I'm &lt;em>extremely&lt;/em> skeptical about Large Language Models (or LLMs)—things like &lt;a href="https://chatgpt.openai.com" target="_blank">ChatGPT&lt;/a>, or what the world is calling &amp;quot;AI&amp;quot; this decade. They're eerily lifelike at responding to human questions, and can give answers that are in the right ballpark most of the time, but their energy consumption (both when being &amp;quot;trained&amp;quot; and used), their ethics (selective application of copyright), and their &amp;quot;intelligence&amp;quot; are all &lt;em>highly&lt;/em> questionable. When I'm skeptical about something, I like to learn about how it works, its limtations, and how to recognise what it produces; these are all things I think will be particularly useful for LLMs in the months and years ahead.&lt;/p>
&lt;p>So, with that in mind and my rapidly wilting vegetables in hand, I decided to ask ChatGPT to write a recipe for me to cook. I'm not the first to try this, and I won't be the last to write about it, but I want to document tis little adventure, the results and my tasting notes, so I can look back and laugh in 25 years' time.&lt;/p>
&lt;p>I wrote a prompt (and re-wrote it a few times, fiddling with the output) so that I'd end up with a recipe I could use in my favourite recipe app, &lt;a href="https://mela.recipes" target="_blank">Mela&lt;/a>. In my prompt I included my general request (including my Zoe-taught guidelines), the full list of ingredients I had to hand, and some details of &lt;a href="https://mela.recipes/fileformat/index.html" target="_blank">Mela's (awesome) file format&lt;/a>, so it'd be easy to import and use.&lt;/p>
&lt;p>If you like reading prompts meant for LLMs you can peek in here.&lt;/p>
&lt;blockquote>
&lt;p>Give me a tasty recipe, that keeps glucose levels low, which I can make with any of the following ingredients I have available:&lt;/p>
&lt;p>Smoked salmon
Gnocchi
Broccoli
Brussel Sprouts
Onions
Sweet Potato
Mushrooms
Butter beans
Almonds
Sunflower seeds
Hazelnuts
Sweetcorn
Chickpeas
Tuna
Tomatoes&lt;/p>
&lt;p>Give your answer in JSON format with the keys: &lt;code>id&lt;/code> (a UUID), &lt;code>title&lt;/code>, &lt;code>text&lt;/code> (the description of the recipe), &lt;code>images&lt;/code> (an empty array), &lt;code>categories&lt;/code> (an empty array), &lt;code>yield&lt;/code> (the yield as a string, eg. &amp;quot;4 people&amp;quot;), &lt;code>prepTime&lt;/code> (the prep time, in the format 3h 30m), &lt;code>cookTime&lt;/code> (the time to cook, in the format 3h 30m), &lt;code>totalTime&lt;/code> (the total time to cook, in the format 3h 30m), &lt;code>ingredients&lt;/code> (a list of ingredients, in metric measurements, separated with &lt;code>\n&lt;/code>), &lt;code>instructions&lt;/code>(one paragraph per step, separated by &lt;code>\n\n&lt;/code>. It's very important you don't use numbers), &lt;code>notes&lt;/code> (written in markdown, containing any other notes if any are needed), and &lt;code>nutrition&lt;/code> (an empty string).&lt;/p>
&lt;/blockquote>
&lt;h2 id="importing-into-mela">Importing into Mela&lt;/h2>
&lt;p>ChatGPT &lt;em>is&lt;/em> impressive, in that it did produce a recipe for &amp;quot;Smoked Salmon and Vegetable Gnocchi Stir-Fry&amp;quot;. It's definitely a low-glucose recipe, and in exactly the right structure to import into Mela. I copied it's response, put it in a text editor, saved it with a &lt;code>.melarecipe&lt;/code> extension and openned it in Mela.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/chef-gpt/recipe.webp"
alt="A simple and elegant screenshot of the Mela recipe app showing the recipe generated by ChatGPT. You can read the recipe in the PDF linked to in this image&amp;#39;s caption."/>
&lt;figcaption>Mela's gorgeous user interface, inviting me to start a-cookin'. If you'd like to try the same recipe (🫣) then you can use the mela recipe data below, or &lt;a href="recipe.pdf">grab the PDF&lt;/a>.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>If you're the kind of person who likes reading JSON recipe files (hi friend!), then get a load of this!&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;bf30de65-8497-4d8a-93d1-fdcb9fc7b8ad&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;title&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Smoked Salmon and Vegetable Gnocchi Stir-Fry&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;This recipe offers a delicious stir-fry featuring smoked salmon, gnocchi, and an array of low-glycemic vegetables. The combination of flavors and textures makes it a satisfying and balanced meal that won&amp;#39;t spike glucose levels.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;images&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;categories&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;yield&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;4 servings&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prepTime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;15 minutes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;cookTime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;20 minutes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;totalTime&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;35 minutes&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ingredients&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;200g smoked salmon\n400g gnocchi\n1 cup broccoli florets\n1 cup brussel sprouts, halved\n1 onion, sliced\n1 medium sweet potato, cubed\n200g mushrooms, sliced\n1/4 cup almonds\n2 tbsp sunflower seeds\n2 tbsp hazelnuts\n1/2 cup sweetcorn\n1/2 cup chickpeas\n150g butter beans\n1 can tuna, drained\n2 tomatoes, diced\n2 tbsp olive oil\nSalt and pepper to taste&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;instructions&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Begin by boiling gnocchi in a large pot of salted water until they float, then drain and set aside. In a large skillet, heat olive oil over medium heat. Add sliced onions and cook until translucent. Next, add sweet potatoes, broccoli, and brussel sprouts, cooking until slightly tender. Stir in mushrooms, sweetcorn, chickpeas, and butter beans. Once the vegetables are cooked to your liking, add the cooked gnocchi and smoked salmon, stirring gently to combine. Toss in diced tomatoes and tuna, then sprinkle with almonds, sunflower seeds, and hazelnuts. Season with salt and pepper, and cook for an additional 2-3 minutes until everything is heated through. Serve hot and enjoy!&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;notes&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;* Feel free to adjust the vegetables based on personal preference or availability.\n* This recipe is versatile - you can add additional herbs or spices for extra flavor.\n* Ensure to check the label when purchasing smoked salmon to ensure it doesn&amp;#39;t contain added sugars or sauces.&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;nutrition&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>So, the fact that it looks so good is &lt;em>definitely&lt;/em> Mela's fault (did I mention how much I like that app?), but nothing here looked like it'd kill me so I dug out my large skillet and got to work.&lt;/p>
&lt;h2 id="the-proof-is-in-the-eating">The proof is in the eating&lt;/h2>
&lt;p>As I followed the recipe (I made sure not to read ahead too closely, to keep the sense of suspense alive) I began to realise &lt;del>ChefGPT's first mistake&lt;/del> why a statistical word-picker won't be making your most loved recipes any time soon. It turns out my prompt &amp;quot;with any of the following ingredients I have available&amp;quot; ended up being interpreted more like &amp;quot;using exactly all of these ingredients&amp;quot;.&lt;/p>
&lt;p>So I got a &lt;em>Smoked salmon, Gnocchi, Broccoli, Brussel Sprout, Onion, Sweet Potato, Mushroom, and Butter bean&lt;/em> stir fry with &lt;em>Almonds, Sunflower seeds, Hazelnuts, Sweetcorn, Chickpeas, Tuna, and Tomatoes&lt;/em> on top. 🤷&lt;/p>
&lt;p>I kept going. For science.&lt;/p>
&lt;p>I appreciated that the instructions were trivial to follow, and there was room for my expression as a sous-chef too. I decided to add a little water in the middle of step 3 to help the diced sweet potato soften up, and I ended up taking the advice in the notes and dropping the chickpeas and sweetcorn, to keep the carbohydrate count lower. All the while my apprehension was growing.&lt;/p>
&lt;p>Finally, just over 35 minutes later (good timing guesses!), I plated up and got out my notepad.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/chef-gpt/plating.webp"
alt="A photo of a serving of ChefGPT&amp;#39;s work, smartly plated up in a pasta bowl, knife and fork either side."/>
&lt;/figure>
&lt;p>It… wasn't bad? I mean, there aren't many ways you can screw up a stir fry, so a safe choice there for sure. It was definitely edible, and even enjoyable perhaps?… to a point.&lt;/p>
&lt;p>Where it started to fall down is the exact same place I see LLMs fall down when I've used them as a &amp;quot;co-author&amp;quot; of software. A statistical word-picker isn't &lt;em>thinking&lt;/em>, so has no sense of composition or balance.&lt;/p>
&lt;p>This was very clear as I smelled my creation — &lt;em>wow&lt;/em>, definitely tuna there. It wasn't gross by any means, but there's no part of that tuna which was matched or blended into other aromas to make something interesting and new. Even the &amp;quot;pepper to taste&amp;quot; didn't keep that initial dominating smell at bay.&lt;/p>
&lt;p>As I took my first mouthful I noticed that the butter beans, slightly undercooked, combined with the various nuts made for a very aggressive texture mismatch; soft, silty beans with hard, crunchy almonds and hazelnuts was definitely a novel experience.&lt;/p>
&lt;p>But, after these few eyebrow-raising moments, I realised I could stop cringing, it was actually pretty tasty; the flavours were all good, even if they weren't exactly jamming together.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/chef-gpt/joey-trifle-good.webp"
alt="An animated clip from the TV show Friends. Joey is describing the layers of an uncoventionally constructed trifle as he eats it: &amp;#34;Custard, good. Jam, good. Meat… gooooood!&amp;#34;"/>
&lt;/figure>
&lt;p>Despite the lingering dominance of the tuna, the total absence of the smoked salmon, and those textural WTF moments, I really enjoyed this adventure, and might even get ChatGPT to offer ideas in the future—in emergencies, and with some heavy editing.&lt;/p>
&lt;p>This recipe did give me some interesting ideas around adding hazelnuts into other dishes; the mellow flavour that came from them spending a little time steaming next to the veg was really enjoyable. I'd probably toast and crush them though, to minimize that jarring texture clash.&lt;/p>
&lt;p>It's not a recipe that'll be staying in my library, but it did become a member of the &lt;a href="https://www.youtube.com/playlist?list=PLdAiyt6EtZP4wkMoQIHp2h00Ta9PyBtdi" target="_blank">clean plate club&lt;/a>, and when I asked Zoe to check it out, it gave a commendable score of 65/100 for matching my dietary needs. Zoe helpfully proclaims this as being squarely in the &amp;quot;Enjoy regularly&amp;quot; category. Thanks, but no thanks.&lt;/p></content:encoded><dc:relation>https://hachyderm.io/@byjp/112102305952063134</dc:relation><dc:relation>https://bsky.app/profile/byjp.me/post/3knrhqsj6ac23</dc:relation></item><item><title>Bookmarks With Omnivore</title><link>https://www.byjp.me/posts/bookmarks-with-omnivore/</link><pubDate>Sun, 21 Jan 2024 09:41:59 +0000</pubDate><guid>https://www.byjp.me/posts/bookmarks-with-omnivore/</guid><description>I created an importer that brings articles I've read &amp;amp; enjoyed in Omnivore into my blog as IndieWeb bookmarks! #omnivore #bookmarks #IndieWeb #Micropub #go #code #CosyWeb</description><content:encoded>
&lt;p>Yesterday, recovering from a nasty (thankfully non-Covid) cold, I decided to build an import tool for pulling articles I've read &amp;amp; enjoyed in &lt;a href="https://omnivore.app" target="_blank">Omnivore&lt;/a> into this blog as &lt;a href="https://www.byjp.me/booksmarks">bookmarks&lt;/a> (in the &lt;a href="https://indieweb.org/bookmark" target="_blank">IndieWeb style&lt;/a>).&lt;/p>
&lt;p>Check out an example here with my bookmark of &lt;a href="https://www.byjp.me/bookmarks/the-tyrany-of-obviousness">The Tyrany of Obviousness&lt;/a> by P.E. Moskowitz.&lt;/p>
&lt;p>I promise I won't gush about Omnivore &lt;em>too&lt;/em> much, but there's a good reason I put the effort into building a custom integration here. Omnivore is brilliant. It's been the first read-it-later app I've found simple &amp;amp; powerful enough to actually &lt;em>read&lt;/em> from. The text-to-speech systems they have are &lt;em>outstanding&lt;/em> (use &amp;quot;Fable&amp;quot; if you like an English/SSB accent!), being able to subscribe to RSS feeds, email newsletters, and pull (even some paywalled) browser articles in make it useful everywhere, and their dedication to open source and commitment to &lt;a href="https://docs.omnivore.app/about/pricing.html" target="_blank">sustainable growth&lt;/a> make me love this tool even more.&lt;/p>
&lt;p>So my import tool had a lot to live up to! I decided to start with a proof-of-concept #Go importer (it's available &lt;a href="https://github.com/by-jp/www.byjp.me/tree/main/tools/import/omnivore" target="_blank">in this blog's repo&lt;/a> under an MIT licence). It works surprisingly well! It seeks out articles that have been completely read and have at least 1 annotation (as a signal for &amp;quot;I like it enough to share it&amp;quot;), then pulls my commentary, highlights, and the title/author/summary into the markdown frontmatter &amp;amp; content so I can display my bookmark.&lt;/p>
&lt;h2 id="limitations">Limitations&lt;/h2>
&lt;p>I built this as a sick-day hack so I could figure out if it was worthwhile making something more permanent, so it definitely has its limitations!&lt;/p>
&lt;ul>
&lt;li>I have to manually run a &lt;code>task import&lt;/code> to pull any new articles into my blog. (I may automate this, but the What's Next section, below, has a better idea)&lt;/li>
&lt;li>It re-processes every article every time it runs. Large lists will likely be slow.&lt;/li>
&lt;li>A limitation of Omnivore's API means that the &lt;code>readAt&lt;/code> timestamp (which I use as the publish timestamp for my bookmark) gets updated &lt;em>every&lt;/em> time you read that article.
&lt;ul>
&lt;li>The Omnivore team have very kindly said they'll consider putting a &lt;code>firstRead&lt;/code> column in the response for usecases like this! It's been absolutely delightful to have a human response from their team, and even moreso to have something like this considered, even if it never makes it to the top of the backlog. (Thanks Jackson!)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>I haven't yet tested if this will work articles that get pulled into Omnivore by email (another frankly awesome feature) but there's only one way to find out!&lt;/li>
&lt;/ul>
&lt;h2 id="whats-next">What's next&lt;/h2>
&lt;p>I'm already enjoying this tool a bunch, so I think I'll develop it further. If others are interested I'll try to make it something easy to run as well (do get in touch on &lt;a href="https://hachyderm.io/@byjp" target="_blank">mastodon&lt;/a> or &lt;a href="https://www.byjp.me/standing-invitation/" target="_blank">send an email&lt;/a> if that sounds interesting!)&lt;/p>
&lt;p>My thoughts are to turn this into a service/serverless function that will listen for Omnivore's excellent &lt;a href="https://docs.omnivore.app/integrations/webhooks.html" target="_blank">webhooks&lt;/a>, (configurably) filter down to events that should result in &amp;quot;publish a new bookmark&amp;quot;, and trigger the &lt;a href="https://indieweb.org/Micropub" target="_blank">Micropub&lt;/a> endpoint of your blog with all the same highlight/annotation information.&lt;/p>
&lt;p>This should mean that you could publish your favourite Omnivore articles to your blog no matter what it looks like or where it lives! Lots of blogging tools &lt;a href="https://indieweb.org/Micropub/Servers#CMS_Software" target="_blank">already support Micropub&lt;/a> (&lt;a href="https://micro.blog" target="_blank">micro.blog&lt;/a> is a fave of mine), and tools like &lt;a href="https://getindiekit.com" target="_blank">IndieKit&lt;/a> (which is great, I use it here) can integrate with almost any statically generated blog too. This feels like a great way to make it available for all!&lt;/p>
&lt;p>Long live the &lt;a href="https://maggieappleton.com/cozy-web" target="_blank">cosy web&lt;/a>, filled with stories and articles recommended by friends and humans, not corporations and algorithms!&lt;/p></content:encoded><dc:relation>https://hachyderm.io/@byjp/111793793066838551</dc:relation><dc:relation>https://bsky.app/profile/byjp.me/post/3kjihigmapz2a</dc:relation></item><item><title>Importing Tweets</title><link>https://www.byjp.me/posts/importing-tweets/</link><pubDate>Fri, 19 Jan 2024 15:35:04 +0000</pubDate><guid>https://www.byjp.me/posts/importing-tweets/</guid><description>More than a year after I closed my Twitter account, I've imported my tweets to my blog. #twitter #import #code #archive #nostalgia</description><content:encoded>
&lt;p>It wasn't until I started writing this post that I realised how long I was a user of Twitter. For 2 days shy of 13 years (from Nov 16, 2009 to Nov Nov 14, 2022) I posted &lt;a href="https://www.byjp.me/notes/twitter/860849128724713472">random thoughts&lt;/a>, experimented (with &lt;a href="https://www.byjp.me/notes/twitter/22679551">geotagging&lt;/a>, &lt;a href="https://www.byjp.me/notes/twitter/78268982">OAuth&lt;/a> and more), and watched it change the internet with the invention of &lt;a href="https://www.byjp.me/notes/twitter/1412088964">hashtags&lt;/a>, retweets (&lt;a href="https://www.byjp.me/notes/twitter/2460448329/">before&lt;/a> it was &amp;quot;via&amp;quot;), &lt;code>@&lt;/code>tags (&lt;a href="https://www.byjp.me/notes/twitter/74694">before&lt;/a>—while watching Ze Frank's The Show, &lt;a href="https://www.byjp.me/notes/twitter/113686952">after&lt;/a>—when my friends all had handles that were just their names).&lt;/p>
&lt;p>I even used it during its SMS-powered phase, where the 140 charcter limit came from; a tweet starting with your username (&lt;a href="https://www.byjp.me/notes/twitter/70903">as they did&lt;/a> back then) allowed for 20 characters of username and 140 characters of thought was the 160 limit of SMS.&lt;/p>
&lt;p>In late 2022 I became very worried about the (then new) management of Twitter, particularly the choices it was making in data security, so I decided to vote with my feet. I collected my data with their export functionality, checked it briefly, then put it on a backup drive and forgot about it. Until this weekend…&lt;/p>
&lt;p>I threw together some (crappy) #Go code that processes the data from a Twitter export &lt;code>.zip&lt;/code> file and creates Hugo compatible markdown files for this blog. You can see the code &lt;em>in&lt;/em> this blog's repo (currently &lt;a href="https://github.com/by-jp/www.byjp.me/tree/main/tools/archive/twitter" target="_blank">on Github&lt;/a>).&lt;/p>
&lt;p>This code also tries to rescue as much data from other silos as possible (like link shorteners and image hosters), but there's definitely plenty missing. If you find a &lt;code>t.co&lt;/code> or &lt;code>j.mp&lt;/code> shortener link still in there, then the data has already succumbed to linkrot, and I've left the (now dead) URL there in the unlikely event that I can pull info from an archive somewhere.&lt;/p>
&lt;p>I &lt;em>did&lt;/em> manage to manually download my (few) #audioboo recordings from what's now &lt;a href="https://audioboom.com" target="_blank">audioboom.com&lt;/a>, and serve them up here. If you want a few, short, mostly grumble-based, recordings of my voice from 15 years ago, you've come to the right place.&lt;/p>
&lt;p>It's probably my age, and my &lt;a href="https://www.byjp.me/posts/mum">recent&lt;/a> proximity to death, but I've really enjoyed travelling back into my past by reading through my early days of Twitter over-sharing. In fact, all the digital history work I've done around importing things into this blog has been thoroughly enjoyably nostalgic. I'd recommend it!&lt;/p>
&lt;p>And on that note I'll leave you with a nostalgic track, the first I seem to have posted to Twitter, The Mistabishi Remix of The Temper Trap's &lt;em>Science Of Fear&lt;/em>:&lt;/p>
&lt;figure class="embed audio spotify">
&lt;iframe src="https://open.spotify.com/embed/track/0Z7CwV9ps38j0JvFmg43yr" height="80" frameBorder="0" allowfullscreen="" allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy">&lt;/iframe>
&lt;figcaption>
🎶 The Temper Trap: &lt;em>Science Of Fear (Mistabishi Remix)&lt;/em>&lt;br/>
&lt;a href="https://song.link/s/0Z7CwV9ps38j0JvFmg43yr" target="_blank" style="font-style:italic;">Listen elsewhere&lt;/a>
&lt;/figcaption>
&lt;/figure></content:encoded></item><item><title>A pre-wedding celebration</title><link>https://www.byjp.me/posts/adventure-awaits/a-pre-wedding-celebration/</link><pubDate>Sun, 19 Nov 2023 17:15:01 -0400</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/a-pre-wedding-celebration/</guid><description>Yvette &amp;amp; I celebrated our upcoming wedding in Venezuela!</description><content:encoded>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-pre-wedding-celebration/header.webp"
alt="JP and Yvette look lovingly at each other, in white attire, in front of a vista across Caracas."/>
&lt;/figure>
&lt;p>As any of you who’ve been reading this blog for a while know, &lt;a href="../a-patagonian-love-story/">Yvette and I are engaged&lt;/a> — in the past few months, while we giddily awaited &amp;amp; planed our wedding next Summer, we realised that not all of Yvette’s family and friends here in Venezuela would be able to join us in France.&lt;/p>
&lt;p>We decided to make our trip here to Venezuela a little longer one so we could both celebrate (Yvette’s sister) Christie’s medschool graduation and have a pre-wedding celebration in Yvette’s late Aunt’s house, on the hills of La Florida in Caracas.&lt;/p>
&lt;p>Yesterday was the day! We gathered 15 of Yvette’s (now our!) Venezuelan nearest &amp;amp; dearest for some some delicious treats, lots of stories &amp;amp; conversation, a glass of &lt;em>espumante&lt;/em> or two, and some heartfelt speeches from the two of us.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-pre-wedding-celebration/family.webp"
alt="Some of our guests! Clockwise from me in the middle is Tío Michel and Tía Stella, cousin Ángela, her daughter Mariángela, then Yvette&amp;#39;s Dad Henri, and Yvette!"/>
&lt;figcaption>Some of our guests! Clockwise from me in the middle is Tío Michel and Tía Stella, cousin Ángela, her daughter Mariángela, then Yvette's Dad Henri, and Yvette!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>First the food! Venezuela has a &lt;em>delicious&lt;/em> bread-like bap called arepa (imagine pita bread but thick as a crumpet and made from ground corn instead of wheat) — always filled with the most incredible flavours. My favourite was &lt;em>reina pepiada&lt;/em> (a shredded chicken and avocado mix) with a delicious local cheese, all stuffed into a toasted palm-sized mini &lt;em>arepa chicharrón&lt;/em> (where the arepa flour is mixed with deep fried pork rind 🤤). I may have had a few of these…&lt;/p>
&lt;p>&lt;a href="https://instagram.com/caracascatering" target="_blank">Caracas Catering&lt;/a> looked after us incredibly well, but our dessert was always going to be brownies from &lt;span class="h-card">&lt;a href="https://instagram.com/yvetteedrei" rel="sweetheart spouse friend met" class="u-url p-name" target="_blank">Yvette&lt;/a>&lt;/span> &amp;amp; Christie’s childhood friend Isabel, who now runs a brownie business here in Caracas called &lt;a href="https://instagram.com/topbrownies" target="_blank">Top Brownies&lt;/a>. She made us a hundred delicious and beautiful brownie morsels — with fillings like guava and cheesecake and salted caramel and extra chocolate — each just big enough to make you want a hundred more. When her business eventually expands to the UK I’m going to grow a few waist sizes.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-pre-wedding-celebration/yvette.webp"
alt="Yvette descends the spiral staircase that is the centrepiece of this stunning home, in her elegant white toga-esque dress."/>
&lt;figcaption>Yvette descends the spiral staircase that is the centrepiece of this stunning home, in her elegant white toga-esque dress.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We finished the day with some heartfelt speeches from the two of us. We thanked everyone for joining us—and Christie particularly for her amazing work preparing the house for us before we arrived—and took a few minutes to tell Yvette’s family about our love for each other, and for our Mums — both very much present in all of us, despite their absence. It was magical and perfect, especially with my new family-to-be, under the tropical sun, in this wonderful family home.&lt;/p>
&lt;p>Yvette’s tireless planning of this incredible day showed in every detail, and I’m so thankful that she took on such a huge task while I was mentally absent, planning Mum’s funeral. Clearly our love for everyone involved in both those days brought out the best in us, and I couldn’t have wished for a better way to meet my new family, and celebrate with them. 🥰&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/pre-wedding-celebration/</dc:relation></item><item><title>Back travelling</title><link>https://www.byjp.me/posts/adventure-awaits/back-travelling/</link><pubDate>Thu, 16 Nov 2023 05:54:04 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/back-travelling/</guid><description>Why there's been such a big gap in posts, and our upcoming trip to Venezuela!</description><content:encoded>
&lt;p>Well! Here we are nearly a year after we left on our sabbatical and half a year since it finished! After Buenos Aires we fit many more activities into our days, and made more friends along the way, leaving us with much less time for writing blog posts.&lt;/p>
&lt;p>I'm a little sad about the gap here, we never wrote about three wonderful partying weeks in Brazil, a hot and gorgeous week in San Pedro de Atacama, an epic off-road adventure through the Bolivian salt flats… and that only took us to mid-March!&lt;/p>
&lt;p>At that point I took a sad but lovely sabbatical interlude. An impromptu long week visiting my Mum at home (with my brother too, visiting from Vancouver). Her terminal cancer diagnosis shocked us all and made it a very easy choice to include &lt;em>Cirencester, UK&lt;/em> in my sabbatical. She passed away &lt;a href="https://www.byjp.me/posts/mum/" target="_blank">just over a month ago&lt;/a>, and I'm still so happy that the last month of our sabbatical included such a cosy, memory-filled week!&lt;/p>
&lt;p>Chris and I then went back to his home in Vancouver. Mum was so keen to enjoy the rest of our planned trip vicariously we knew we were going to be adventuring for five — Yvette and I, Chris and his wife Rose, soaking in the sights for Mum back in the UK. We managed to squeeze in two superbly snowy ski days in Whistler before the four of us snoozed our way across the Pacific to Japan!&lt;/p>
&lt;p>I badly want to retrospectively add some posts her for Japan at the very least as, &lt;em>wow&lt;/em>, it's only become more fun, beautiful and inimitable since my last visit 14 years ago!&lt;/p>
&lt;p>If you've not already guessed why I'm writing this post though, we are indeed back travelling again! Only for an all too brief two weeks, but it's back to South America — Venezuela this time, to visit Yvette's family, celebrate our wedding next year with those who can't join us then, and to attend her sister's medschool graduation. It's going to be a busy fortnight!&lt;/p>
&lt;p>You might wonder why we didn't add Venezuela to our itinerary earlier this year — bizarrely, courtesy of the strained relationship between the USA and Yvette's birth country, there are almost no flights into Venezuela from South America! There was one extremely slow &amp;amp; multi-hop trip via Panama, or an &amp;quot;easy&amp;quot; flight via… Portugal.&lt;/p>
&lt;p>…which is exactly the flight we're catching now! See you in Caracas soon! 🛫🇬🇧👋🇻🇪🛬&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/back-travelling</dc:relation></item><item><title>Mum</title><link>https://www.byjp.me/posts/mum/</link><pubDate>Mon, 16 Oct 2023 20:01:24 +0100</pubDate><guid>https://www.byjp.me/posts/mum/</guid><description>My Mum passed away; my brother &amp;amp; I wrote a few words to let our friends and family know. #mum #death</description><content:encoded>
&lt;blockquote>
&lt;p>My brother and I wrote these few words last week as a way to let friends and family know of my Mum's passing. We've all been progressively more absent from the rest of our lives these last few weeks, and the kind words friends and family have sent us in response have been overwhelmingly lovely.&lt;/p>
&lt;p>Of the very few people who read this blog I doubt any knew my Mum, and this blog's theme to date has been more towards my tech &amp;amp; creative side than my personal life, but this is important enough to me that I want to include this message here too.&lt;/p>
&lt;/blockquote>
&lt;p>Friends and family,&lt;/p>
&lt;p>It's with a heavy heart that we share the news of our Mum, Helen Hastings-Spital's, passing on Thursday October 12th after half a year with cancer. She died peacefully, surrounded by family, at a lovely hospice in Cheltenham. We are immensely proud of her. She embraced the challenges of these few months whole-heartedly, channelling any uncertainty or anxiety into acceptance, love and care, for herself and everyone around her, playfully cracking jokes with her doctors at any opportunity.&lt;/p>
&lt;p>Mum's loving, nurturing and creative spirit extended beyond her family and friends to all living things. Whether it was curating colourful blooms or cultivating a bountiful veg garden harvest, Mum's garden overflowed with plants of all kinds. Its beauty at any time of year reflecting the beauty she brought into our lives, its ever-changing colours—particularly rich the sunny weekend just gone—demonstrating the deep interconnectedness of all life that Mum felt and shared with us.&lt;/p>
&lt;p>She was an indescribably wonderful Mum. She gave us our creativity, taught us her empathetic kindness, and has been a steady guide through life's challenges; even now its the open and loving conversations she started with us, guiding us through our loss of her.&lt;/p>
&lt;p>We'd like to thank the many, many people who supported her this year particularly: friends and family at home, the countless doctors and nurses of the NHS at Cheltenham General Hospital, and the Sue Ryder hospice at Leckhampton Court. We were amazed particularly by the serenity and quality of palliative care the Sue Ryder charity offered Mum—we're both seeking ways to support them now, and we'd invite you to do the same if you're looking for a cause to share time, energy, or donations with.&lt;/p>
&lt;p>We miss you Mum. Thanks for everything.&lt;/p>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/mum/mum.webp"
alt="From left to right: Mum on black rock sands beach with very-baby-Chris and 2-year-old me, Mum enjoying the sun at Chris&amp;#39; COVID-conscious wedding day, Mum with tween JP and Chris walking around the lake next to our house."/>
&lt;figcaption>From left to right: Mum on black rock sands beach with very-baby-Chris and 2-year-old me, Mum enjoying the sun at Chris' COVID-conscious wedding day, Mum with tween JP and Chris walking around the lake next to our house.&lt;/p>
&lt;/figcaption>
&lt;/figure></content:encoded><dc:relation>https://www.facebook.com/chrismhs/posts/pfbid02VuHgpqAC2LPFdkqvWySGQ5w1Wp7eEH8SSne6wnSA6P9b1pQkNQ9HK4DsKYXBg6rdl</dc:relation></item><item><title>Leith Hill Tower hike</title><link>https://www.byjp.me/posts/hikes/leith-hill-tower/</link><pubDate>Mon, 14 Aug 2023 07:14:19 +0100</pubDate><guid>https://www.byjp.me/posts/hikes/leith-hill-tower/</guid><description>A delightful Saturday walk out of London, from Ockley to Dorking.</description><content:encoded>
&lt;div class="hike-info">
&lt;span class="name">📍 Ockley to Dorking, via Leith Hill Tower&lt;/span>
&lt;div class="stats">
&lt;span class="distance">→ 15.4km&lt;/span>
&lt;span class="total-ascent">↑429m&lt;/span>
&lt;span class="total-descent">↓466m &lt;/span>
&lt;span class="duration">@ 3h51m&lt;/span>
&lt;/div>
&lt;details>
&lt;summary>Waypoints&lt;/summary>&lt;div class="waypoint">
&lt;details>
&lt;summary>Ockley Railway Station&lt;/summary>
&lt;p class="description">Direct trains from London Victoria leaving (for us, on a Saturday), once every hour taking roughly 1h10.&lt;/p>
&lt;/details>
&lt;/div>&lt;div class="waypoint">
&lt;details>
&lt;summary>Leith Hill Tower&lt;/summary>
&lt;p class="description">Beautiful views of all of South East England. The Tower (£3 entry, card accepted) takes you to the highest point of the SE (and higher than the shard above sea level). Good views even in cloudy weather.&lt;/p>
&lt;/details>
&lt;/div>&lt;div class="waypoint">
&lt;details>
&lt;summary>Main road walking&lt;/summary>
&lt;p class="description">There&amp;#39;s 100m or so walking along a main road&amp;#39;s verge without a path. Cars were kind!&lt;/p>
&lt;/details>
&lt;/div>&lt;div class="waypoint">
&lt;details>
&lt;summary>The King&amp;#39;s Arms&lt;/summary>
&lt;p class="description">A lovely pub, in fact the oldest in Dorking, with good food for the end of the hike.&lt;/p>
&lt;/details>
&lt;/div>&lt;div class="waypoint">
&lt;details>
&lt;summary>Dorking Railway Station&lt;/summary>
&lt;p class="description">Trains left every 15 minutes or so for us (on a Saturday late afternoon), and went direct to London Victoria.&lt;/p>
&lt;/details>
&lt;/div>&lt;small>&lt;a href="https://www.byjp.me/posts/hikes/leith-hill-tower.gpx">Download gpx&lt;/a>&lt;/small>
&lt;/details>
&lt;/div>
&lt;p>On Saturday we went for day hike across &lt;a href="https://surreyhills.org/" target="_blank">Surrey Hills&lt;/a>, from Ockley Station to Dorking, via the beautiful vistas of Leith Hill Tower. It was such a lovely hike!&lt;/p>
&lt;p>Being just over an hour from Victoria Station in London made it easy to get to and back from within a day, and it gave us the opportunity to visit the highest point in South East England — all 304m of it 😂&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/hikes/leith-hill-tower/leith-hill-tower.webp"
alt="Leith Hill Tower stretching up above the treeline on an overcast day."/>
&lt;figcaption>Leith Hill Tower looks a lot more foreboding here than it should!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Surrey Hills is an &lt;a href="https://en.wikipedia.org/wiki/Area_of_Outstanding_Natural_Beauty" target="_blank">Area of outstanding Natural Beauty&lt;/a>—one of the nearest to London—and it's easy to see why. As the brief rainfall that welcomed us onto our hike faded away we came across Barn Cottage, with a helpful QR code carefully posted to a tree at its entrace. It pointed us to &lt;a href="https://www.macspeedee.com/barncottage/" target="_blank">a website&lt;/a> describing the history of this stunning Orné style &amp;quot;chocolate box&amp;quot; cottage, and the landscape before us.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/hikes/leith-hill-tower/barn-cottage.webp"
alt="The beautiful Barn Cottage, with its slanted roof nearly reaching the floor, black wooden walls, and pretty white windows and doors, all coated in greenery of many kinds."/>
&lt;figcaption>I can imagine reading a book at the garden table here, and I can't stop imagining it.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The hike was easy most of the way, with a half an hour of noticeable incline, and 15 more minutes right before the tower that definitely let us know we were travelling vertically. Nothing as severe as the 2,100m two-day hike &lt;span class="h-card">&lt;a href="https://chris.hastings-spital.co.uk" rel="sibling friend met" class="u-url p-name" target="_blank">Chris&lt;/a>&lt;/span> was taking on at the same time near Vancouver, but still very enjoyable — and a wonderful view for lunch!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/hikes/leith-hill-tower/tower-top.webp"
alt="A selfie of JP and Yvette looking out across the UK&amp;#39;s South East landscape from the top of a tower."/>
&lt;figcaption>It was a beautiful view, even with the overcast greyness — if you squint you can see London over Yvette's left shoulder, near the tree breaking the horizon.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We finished off our hike in Dorking. Sadly &lt;a href="https://www.denbies.co.uk/" target="_blank">Denbies Vineyard&lt;/a> closes at 5pm, so we missed out on a tour, but we did briefly visit the sunny Star Inn for a refreshing half, and then the charming &lt;a href="https://www.kingsarmsdorking.co.uk/" target="_blank">The King's Arms&lt;/a> for a tasty bite and another celebratory tipple.&lt;/p>
&lt;p>All in all, an extremely good day!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/hikes/leith-hill-tower/finishing-half.webp"
alt="The three of us clink our half-pint glasses in celebration."/>
&lt;/figure></content:encoded></item><item><title>An IndieWeb IPFS offer</title><link>https://www.byjp.me/posts/ipfs-indieweb-offer/</link><pubDate>Sun, 13 Aug 2023 15:44:14 +0100</pubDate><guid>https://www.byjp.me/posts/ipfs-indieweb-offer/</guid><description>An offer: I'll pin your static IPFS-based IndieWeb site on my homelab! Get in touch :) #IPFS #IndieWeb #hosting #static-site #WWW #HomeLab #admarus #offer</description><content:encoded>
&lt;p>If you're hosting a static IndieWeb site and (want to) keep an up-to-date copy on &lt;a href="https://ipfs.io" target="_blank">IPFS&lt;/a>, I'm offering to pin a replica of your site on my energy efficient #HomeLab in London (in the UK), making it more highly available, as well as being searchable with &lt;a href="https://admarus.net/" target="_blank">Admarus&lt;/a>.&lt;/p>
&lt;p>To get started, just &lt;a href="mailto:ipfs@byjp.me?subject=Re:%20An%20IndieWeb%20IPFS%20offer&amp;amp;body=Hi%20JP!%0A%0AWould%20you%20be%20interested%20in%20pinning%20my%20IndieWeb%20site%20on%20IPF%3F%20You%20can%20see%20it%20at%E2%80%A6">send me an email&lt;/a> and I'll get it set up! (If I think your site isn't suitable for this offer—perhaps it violates one of the &lt;a href="https://terra-ignota.fandom.com/wiki/Black_Laws" target="_blank">Black Laws&lt;/a>—we can chat about it.)&lt;/p>
&lt;p>If you'd like help in publishing your static blog to IPFS please reach out! I'm passionate about this tech (this blog is automatically co-hosted on IPFS, check it out &lt;a href="https://www-byjp-me.ipns.dweb.link/" target="_blank">on dweb.link&lt;/a>!), I'd love to help you out with understanding and automating your process where I can.&lt;/p>
&lt;hr>
&lt;p>I run a power-efficient homelab at my home in London (a &lt;a href="https://turingpi.com/product/turing-pi-2/" target="_blank">Turing Pi 2&lt;/a> rig I should blog about soon), so I have a terrabyte or two of SSD storage with a roughly gigabit upload link, that runs at under 10W of total power consumption (at average load). Perfect for serving relatively low-volume static sites!&lt;/p>
&lt;p>I would love to run it off-grid, like the &lt;em>super&lt;/em> cool &lt;a href="https://solar.lowtechmagazine.com/about/the-solar-website/" target="_blank">Low←Tech Magazine&lt;/a>, but neither London's weather nor the orientation of my flat make that possible today — but maybe one day!&lt;/p>
&lt;p>I'll be assuming you have your IPFS-based site set up with &lt;a href="https://docs.ipfs.tech/concepts/dnslink/" target="_blank">DNSLink&lt;/a> — ie. you have a &lt;code>TXT&lt;/code> record set up for &lt;code>_dnslink.your.domain.here&lt;/code> with the contents &lt;code>dnslink=/ipfs/&amp;lt;CID to your site&amp;gt;&lt;/code>. I'll be polling for changes on that DNS record at roughly your DNS record's TTL, and swapping the pin out on my homelab if I see it change.&lt;/p>
&lt;p>Initially I'll have my IPFS server configured so that you won't be able to use this as &lt;em>primary&lt;/em> hosting for your site, but I'll consider it if things go well. (That could include a webhook to request an update of your pin.)&lt;/p></content:encoded></item><item><title>Barbie</title><link>https://www.byjp.me/posts/reviews/movies/barbie/</link><pubDate>Sat, 29 Jul 2023 07:51:48 +0100</pubDate><guid>https://www.byjp.me/posts/reviews/movies/barbie/</guid><description>I went to see Barbie; it was superb!</description><content:encoded>
&lt;figure class="film" itemscope itemtype="https://schema.org/Movie">
&lt;a href="https://www.themoviedb.org/movie/346698-barbie" target="_blank" title="Open film details" itemprop="url">
&lt;img src="https://www.byjp.me/posts/reviews/movies/barbie/poster.webp" width="480" height="720" alt="The poster for the film Barbie" itemprop="image">
&lt;/a>
&lt;figcaption>
&lt;a href="https://www.themoviedb.org/movie/346698-barbie" target="_blank" title="Open film details" itemprop="url">&lt;span itemprop="name">Barbie&lt;/span>&lt;/a> (&lt;span itemprop="datePublished">2023&lt;/span>)
&lt;/figcaption>
&lt;/figure>
&lt;p>This was an &lt;em>excellent&lt;/em> film that left me emotionally stretched in just the right way. It's an adult movie with childhood references (not a kids' film at all), and seems pitched at people roughly my age (&lt;a href="https://song.link/s/2KVwlelhxKUy8LVV6JypH3" target="_blank">Matchbox Twenty&lt;/a> referenced as a track for wooing is too close for comfort!) It &lt;em>superbly&lt;/em> voices the internal contradictions women need to navigate to be accepted. It works hard not to centre Ken, even while his role is a critical counterpoint, but also gives a little airtime to how much a male-dominated world makes it hard to be a man too.&lt;/p>
&lt;p>⚠️ The next paragraph(s) contain spoilers!&lt;/p>
&lt;p>In fact using Ken — an obviously one-dimensional doll of a man — as the very literal face of the very literal patriarchy neatly sidesteps any &amp;quot;but not all men&amp;quot; reactions getting in the way of the message. (I think they also rolled in some &lt;a href="https://en.wikipedia.org/wiki/Incel" target="_blank">incel&lt;/a> representation into his persona, giving him his own mini-arc to self-understanding and maturity.)&lt;/p>
&lt;p>🛟 Spoilers over!&lt;/p>
&lt;p>The writing is out of this world, the pacing is spot on, and Margot Robbie utterly &lt;em>nails&lt;/em> the role — especially the emotional and physical aspects of being a doll in a way that playfully nods to the many ways that children play with Barbie.&lt;/p>
&lt;p>⚠️ The next paragraph(s) contain spoilers!&lt;/p>
&lt;p>I remember wondering on a few occasions how the plot was going to resolve without requiring Ken to &amp;quot;win&amp;quot;, be &amp;quot;defeated&amp;quot;, or overly-centred. I shouldn't have worried; the battle and show number, followed by Ken being very emotionally mature while he faces his immaturity towards his relationship with Barbie was excellent!&lt;/p>
&lt;p>🛟 Spoilers over!&lt;/p>
&lt;p>It's a wonderful film that I'd encourage everyone to see. It's &lt;em>hard&lt;/em> to watch, as a man—feeling responsible for so many challenges women face—but Barbie doesn't judge, it voices. It's a message that informs me, helps me, as well as entertaining me, but it isn't meant for &lt;em>me&lt;/em>; the extent to which Yvette felt seen, understood and perfectly spoken on behalf of &lt;em>is&lt;/em> this movie, and why it deserves all the praise it's getting.&lt;/p></content:encoded><dc:relation>https://bsky.app/profile/byjp.me/post/3k3nnlam35u2p</dc:relation><dc:relation>https://hachyderm.io/@byjp/110796686011083451</dc:relation><dc:relation>https://trakt.tv/comments/585047</dc:relation><dc:relation>https://www.themoviedb.org/review/64c4e33dcadb6b01066cb4b9</dc:relation></item><item><title>Trusting randomness at a distance</title><link>https://www.byjp.me/posts/mental-poker/randomness/</link><pubDate>Tue, 25 Jul 2023 19:25:00 +0100</pubDate><guid>https://www.byjp.me/posts/mental-poker/randomness/</guid><description>How can people in different places trust the other's dice-rolls? #tech #web #trustless #games #protocol #randomness</description><content:encoded>
&lt;p>Last week I wrote about what a distributed game protocol is, and why they're useful: for playing games (cards, board games, etc.) with someone who isn't physically present with you. I covered &amp;quot;&lt;a href="../open-games/">open games&lt;/a>&amp;quot;, those which only need the players and the board (like Chess), and omit randomness, fate, and secrecy. If you haven't read that post, you should! It covers some context you'll need for this one.&lt;/p>
&lt;p>Keep reading if you're interested in how we can design a protocol that allows us to play a game remotely where you can trust that your opponent isn't cheating with their dice rolls!&lt;/p>
&lt;p>This post series:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="../open-games/">Open games&lt;/a>&lt;/li>
&lt;li>&lt;a href="../randomness/">Games with randomness&lt;/a> (this post)&lt;/li>
&lt;li>Games with fate and secrets (Coming soon!)&lt;/li>
&lt;/ul>
&lt;h2 id="trusting-randomness">Trusting randomness&lt;/h2>
&lt;p>It may seem obvious, but let's take a moment to understand why we might need randomness in games, and where the problem comes from when we're trying to use it remotely.&lt;/p>
&lt;p>Perhaps you're familiar with &lt;a href="https://en.wikipedia.org/wiki/Snakes_and_ladders" target="_blank">Snakes and Ladders&lt;/a>, &lt;a href="https://en.wikipedia.org/wiki/Sorry!_%28game%29" target="_blank">Sorry&lt;/a>, or the arch-nemesis of games, &lt;a href="https://en.wikipedia.org/wiki/Monopoly_%28game%29" target="_blank">Monopoly&lt;/a>. These meet all the requirements of an &amp;quot;&lt;a href="../open-games/">open game&lt;/a>&amp;quot;, but &lt;em>also&lt;/em> use one or more dice — the most common way to introduce randomness to a boardgame. Throw an evenly weighted cube around and you get a random 1-6 number to help introduce a little chaos to your game.&lt;/p>
&lt;p>If we tried taking the playing-locally approach to a remote game, you'd quickly run into trust problems. If I tell you I rolled a six, and just &lt;em>happened&lt;/em> to land on this ladder (and not that slippery snake), you might wonder how I get so lucky all the time. We could play with webcams turned on and roll our dice on-screen, but with AI going the way it is, it won't be long until someone could fake a dice throw on video in real time. We could include a friend in our game, as our official dice-roller —someone who we trust to not bias their rolls to either one of us — but they'd probably get bored very quickly and leave us stuck.&lt;/p>
&lt;p>We &lt;em>have&lt;/em> good &lt;a href="https://en.wikipedia.org/wiki/Random_number_generation" target="_blank">random number generators&lt;/a> on computers but, whether they're &lt;a href="https://en.wikipedia.org/wiki/Random_number_generation#%22True%22_vs._pseudo-random_numbers" target="_blank">pseudo- or true-random&lt;/a>, they're still generated locally, so suffer the same problem. This seems like an unsolvable problem, until maths takes a proud step forwards, ripping off its shirt and glasses.&lt;/p>
&lt;h2 id="maths-to-the-rescue">Maths to the rescue&lt;/h2>
&lt;p>Thankfully for us, and at least until quantum computing gets really freaky, there are mathematical operations that are easy to do one way, but very hard to do the other way. It's just like mixing two paints; &lt;a href="https://www.dulux.co.uk/en/colour-details/volcanic-red" target="_blank">volcanic red&lt;/a> and &lt;a href="https://www.dulux.co.uk/en/colour-details/blue-babe" target="_blank">blue babe&lt;/a> make some kind of light purple when mixed, but if I gave you that purple and asked you to tell me the exact colours that made it… you'd have to try &lt;em>every combination&lt;/em> of colours (and ratios!) to determine the precise inputs I used. (You can actually find artists who do literally this kind of colour matching &lt;a href="https://www.youtube.com/shorts/jI1rbZJVK8g" target="_blank">on YouTube&lt;/a> — it is an extremely complex process!)&lt;/p>
&lt;p>Maths offers us the same kind of deal; there are some mathematical operations that are very easy to do one way, and very hard (or impossible) to do the other way. For example, remembering last week's post, I can tell you the check digit from my credit card is 6 without fear that you'll enjoy a spending spree at my expense, but it is the only one of my card numbers that ends in a six so it can also identify that particular card (for me).&lt;/p>
&lt;p>In the (very simple and unoriginal) protocol I designed for randomness in games I make use of &amp;quot;&lt;a href="../open-games/#consistent-hashing-algorithms">consistent hashing algorithms&lt;/a>&amp;quot; (as described in the previous post) to allow our players to make promises to each other that they can't take back.&lt;/p>
&lt;p>In brief, these algorithms take a number, letter, word, or even a book, and turn it into a unique very large number called a &amp;quot;hash&amp;quot; — the hash is always the same given the same input. You can share a hash of something important without giving that thing away.&lt;/p>
&lt;p>The letters &lt;code>F103533&lt;/code> mean nothing special to you, but if share them with you, then later tell you that they are the start of the &lt;a href="https://coding.tools/sha256" target="_blank">SHA-256 hash&lt;/a> of the phrase &amp;quot;I choose number 7&amp;quot;, you can know I did indeed choose the number 7 before &lt;em>you&lt;/em> knew my choice.&lt;/p>
&lt;p>There's only one more important piece of maths to know about: pseudo random number generators (&lt;a href="https://en.wikipedia.org/wiki/Pseudorandom_number_generator" target="_blank">PRNGs&lt;/a>). Because generating &lt;em>true&lt;/em> random numbers can be very slow, these algorithms are regularly used to take an initial and random number (a &amp;quot;seed&amp;quot;) and generate an infinite sequence of unpredictable random numbers from it. If a PRNG is well designed you can't predict the next number &lt;em>unless&lt;/em> you know the seed (and how many previous numbers have been generated). Conversely, if you &lt;em>do&lt;/em> know the seed, then &lt;em>every single number&lt;/em> can be predicted, because a PRNG with the same seed always makes the same sequence of numbers.&lt;/p>
&lt;h2 id="the-protocol">The protocol&lt;/h2>
&lt;p>To &amp;quot;roll a dice&amp;quot; in a distributed game we now need a few extra steps, but thankfully they're all very simple for a computer to accomplish:&lt;/p>
&lt;ol>
&lt;li>Alice generates a random number she promises to use (&lt;code>A&lt;/code>) and sends Bob the hash of it (&lt;code>H&lt;/code>).&lt;/li>
&lt;li>Bob receives (&lt;code>H&lt;/code>) and sends Alice a random number (&lt;code>B&lt;/code>) she &lt;em>must&lt;/em> make use of.&lt;/li>
&lt;li>Alice combines those two random numbers (&lt;code>C = A+B&lt;/code>) and uses it as the seed to a PRND to get a number from 1 to 6 (&lt;code>D&lt;/code>, the dice roll).&lt;/li>
&lt;li>Alice sends Bob her move, including the dice roll (&lt;code>D&lt;/code>) and her original random number (&lt;code>A&lt;/code>)&lt;/li>
&lt;li>Bob checks that the hash of &lt;code>A&lt;/code> is indeed &lt;code>H&lt;/code> (if it isn't, then Alice cheated!)&lt;/li>
&lt;li>Bob checks that the PRNG with seed &lt;code>C&lt;/code> does indeed make the dice roll &lt;code>D&lt;/code> (if it isn't, then Alice cheated!)&lt;/li>
&lt;/ol>
&lt;details>
&lt;summary>Expand this to see the geeky sequence diagram!&lt;/summary>
&lt;pre class="mermaid">sequenceDiagram
participant A as Alice
participant B as Bob
activate A
A-->>A: Generate a large random number (R1)
A->>B: Game invitation&lt;br/>Includes H1 = hash(R1)
deactivate A
activate B
B-->>B: Generate large random numbers (R2, R3)
B->>A: Accept invitation&lt;br/>Includes R2, H3 = hash(R3)
deactivate B
activate A
Note over A: Turn PRNG seed is R1 + R2
A->>A: Game state 'chance' move, using RNG
Note over A: Alice decides move
A-->>A: Generate large random numbers (R4, R5)
A->>B: Initial game move&lt;br/>Includes R1, R4, H5 = hash(R5)
deactivate A
loop Repeats for each player
activate B
Note over B: Validate hash(R1) == H1&lt;br/>Replicate chance elements and validate move&lt;br/>Else declare protocol failure
Note over B: Turn PRNG seed is R3 + R4
B->>B: Game state 'chance' move, using RNG
Note over B: Decides move
B-->>B: Generate large random numbers (R6, R7)
B->>A: Responding game move&lt;br/>Includes R3, R6, H7 = hash(R7)
deactivate B
end
&lt;/pre>
&lt;/details>
&lt;p>And that's it! You can now play a game of chance with an opponent who you aren't with and may not be able to trust. This class of problems (distributed game protocols) are studied under the name &amp;quot;&lt;a href="https://en.wikipedia.org/wiki/Mental_poker" target="_blank">mental poker&lt;/a>&amp;quot; — and we still have the most challenging part to cover — &lt;strong>games with fate and secrecy&lt;/strong>, in the third and last post of this series, coming soon!&lt;/p></content:encoded></item><item><title>Trust and simple games</title><link>https://www.byjp.me/posts/mental-poker/open-games/</link><pubDate>Sun, 16 Jul 2023 07:26:11 +0100</pubDate><guid>https://www.byjp.me/posts/mental-poker/open-games/</guid><description>How can people play (board/card) games without a trusted third party, and without cheating? #tech #web #trustless #games #protocol</description><content:encoded>
&lt;p>Yesterday I wrote a behemoth of a blog post about why I'm excited about distributed protocols, with not-really-that-short descriptions of 4 different projects that are gently ticking over in my head. It was a mess 😂&lt;/p>
&lt;p>I've decided to split it apart into a mini-series on distributed game protocols (and probably another post on my favourite distributed microblogging protocol, ATProto, and why I think it's so interesting).&lt;/p>
&lt;p>This is the first in the distributed game protocols series, covering what they are and why they're useful, and the simplest form I've been thinking about: open games, like Chess and Go.&lt;/p>
&lt;p>This post series:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="./">Open games&lt;/a> (this post)&lt;/li>
&lt;li>&lt;a href="../randomness/">Games with randomness&lt;/a>&lt;/li>
&lt;li>Games with fate and secrets (Coming soon!)&lt;/li>
&lt;/ul>
&lt;h2 id="what-and-why">What and why?&lt;/h2>
&lt;p>To collaborate on anything we need &lt;em>some&lt;/em> level of agreed methodology for accomplishing our desired outcome — a &lt;em>protocol&lt;/em>. When you're playing a game with someone — &lt;a href="https://en.wikipedia.org/wiki/Yaniv_%28card_game%29" target="_blank">Yaniv&lt;/a>, &lt;a href="https://en.wikipedia.org/wiki/Chess" target="_blank">Chess&lt;/a>, &lt;a href="https://en.wikipedia.org/wiki/Scrabble" target="_blank">Scrabble&lt;/a>, or perhaps even &lt;a href="https://en.wikipedia.org/wiki/Pandemic_%28board_game%29" target="_blank">Pandemic&lt;/a> — the game's protocols (the rules) usually fall into 5 categories:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>you&lt;/strong> and &lt;strong>your opponent(s)&lt;/strong>: the players/agents in the game, independent and often identical in terms of role, those who make decisions.&lt;/li>
&lt;li>&lt;strong>random chance&lt;/strong>: the dice you roll, to bring a little chaos to the game.&lt;/li>
&lt;li>&lt;strong>fate&lt;/strong>: the deck of cards you shuffled at the start, which you only see as you draw.&lt;/li>
&lt;li>&lt;strong>the board&lt;/strong>: the 'state' of the game, a record of the outcomes of the decisions, randomness, and fated changes up to this point.&lt;/li>
&lt;li>&lt;strong>secrets&lt;/strong>: the cards or tiles in your hand that your opponent can't see.&lt;/li>
&lt;/ul>
&lt;p>When you're in the real world these things are all very simple to bring about — you and your friend(s) are sitting together, the dice are fair, you can see cheating peeks at the cards, there is only one shared board, and you can (mostly) keep your cards secret from your neighbour.&lt;/p>
&lt;p>What happens when you want to play a game like this when you're not in the same place? We have the internet — messaging apps, email and everything else — so communicating our decisions is easy enough, but after this things get tricky.&lt;/p>
&lt;p>You &lt;em>claim&lt;/em> you rolled a six with your fair dice; how can I know you didn't cheat? You claim you didn't know the next card in the deck was going to be in your favour, but how do I know you didn't peek? We both &lt;em>think&lt;/em> we've kept track of the board in the same way, but what happens if one of us made a mistake, and we're actually playing two different games? How do I draw a card from the deck and keep it secret from you, while also being able to prove I did draw that one?&lt;/p>
&lt;p>&lt;em>These&lt;/em> are the problems that distributed game protocols address, and I'll cover the simplest of these in this blog post: the players and the board.&lt;/p>
&lt;h2 id="open-games">Open games&lt;/h2>
&lt;p>I call the set of games that has no chance, fate, or secrecy &amp;quot;open&amp;quot; because literally all parts of it are open and visible at all times. The difficulty of the game is in the breadth of possible choices by the players, and the (un)predictability of the effect those choices have.&lt;/p>
&lt;p>Games like &lt;a href="https://en.wikipedia.org/wiki/Chess" target="_blank">Chess&lt;/a> and &lt;a href="https://en.wikipedia.org/wiki/Go_%28game%29" target="_blank">Go&lt;/a> are great examples here, and playing them with a distributed protocol is far older than the internet. Game geeks have a &lt;a href="https://en.wikipedia.org/wiki/History_of_chess" target="_blank">long history&lt;/a> of playing chess remotely, using a &lt;a href="https://en.wikipedia.org/wiki/Chess_notation" target="_blank">standard notation&lt;/a> of some kind to communicate moves to each other — &lt;a href="https://en.wikipedia.org/wiki/Correspondence_chess" target="_blank">correspondence chess&lt;/a>, as it's still called.&lt;/p>
&lt;p>Below is a sequence diagram I've put together to show how simple a game of remote chess can be played. It's so simple it feels a little strange to spend time documenting and diagramming it!&lt;/p>
&lt;pre class="mermaid">%% My apologies, I can only render sequence diagrams in Javascript at the moment!
%% Please visit the site in a Javascript enabled browser to see this.
sequenceDiagram
participant A as Alice
participant B as Bob
Note over A: Alice decides move
A->>B: Initial game move
loop Until the game ends
Note over B: Bob validates Alice's move
Note over B: Bob decides move
B->>A: Responding game move
Note over A: Alice validates Bob's move
Note over A: Alice decides move
A->>B: Responding game move
end
Note over B: Bob is defeated
B->>A: Acknowledgement of defeat
&lt;/pre>
&lt;p>The only place a protocol like this can sometimes go wrong is if there is an error in one of the messages sent between players, a piece accidentally moved to the wrong square, or an over enthusiastic cat near the chessboard.&lt;/p>
&lt;p>In the case of &lt;em>noticeable&lt;/em> incorrectness (bad kitty, you knocked the pieces off the board!) a player can request a description of the board from the other. But how might we detect a subtle error?&lt;/p>
&lt;h3 id="consistent-hashing-algorithms">Consistent hashing algorithms&lt;/h3>
&lt;p>Naturally, a very simple way of detecting errors here would be to scribble down the full layout of the new chessboard on the postcard containing your move as you make your correspondence chess play; but for more complex games, or where the amount of space you have for transmitting your move is small, we'd need something more sophisticated.&lt;/p>
&lt;p>In computing, &lt;a href="https://en.wikipedia.org/wiki/Error_detection_and_correction" target="_blank">error detection and correction codes&lt;/a> are used &lt;em>literally everywhere&lt;/em> to be able to detect (and optionally correct) exactly these kinds of otherwise invisible errors. In modern digital systems the components that store the 1s and 0s at the foundation of your machine are so small that an errant particle from the sun can (and does!) flip a zero to a one, or vice versa, at any moment — error correction codes are how we get around this.&lt;/p>
&lt;p>A distributed game protocol can use similar techniques to protect your game from subtle errors too. The one method I want to introduce before the next post is &lt;a href="https://en.wikipedia.org/wiki/Hash_function" target="_blank">hashing algorithms&lt;/a>. These are processes for turning an arbitrarily large amount of data into a small(ish) number that changes a lot, even when the data changes only a little.&lt;/p>
&lt;p>You probably have a perfect example of this close at hand: your credit card number. The last digit of that long number on your card &lt;em>isn't a part of your card number&lt;/em>, it's a &amp;quot;check digit&amp;quot;. If you type one of your digits incorrectly, the check digit will be off, and a computer can know to ask you to check your typing.&lt;/p>
&lt;p>They use the &lt;a href="https://en.wikipedia.org/wiki/Luhn_algorithm" target="_blank">Luhn algorithm&lt;/a>, and you can check your credit card number is correct right now:&lt;/p>
&lt;ol>
&lt;li>Write your credit card number out on a piece of paper, with some space between each digit (a piece you can destroy afterwards!)&lt;/li>
&lt;li>Double every other digit&lt;/li>
&lt;li>Anywhere that became a double-digit number, add the two digits together&lt;/li>
&lt;li>Sum all the numbers&lt;/li>
&lt;li>If the final number is divisible by 10 (ie. ends in a zero) then the card number is valid.&lt;/li>
&lt;/ol>
&lt;p>Here's a worked example with short (not a) credit card number: 4417 8259&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-plain" data-lang="plain">&lt;span class="line">&lt;span class="cl">Step 1: 4 4 1 7 8 2 5 9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Step 2: 8 4 2 7 16 2 10 9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Step 3: 8 4 2 7 7 2 1 9
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Step 4: 8 12 14 21 28 30 31 40
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">40 ends in a zero; the card is valid!
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can try out what happens if there's an error; if you put a 6 instead of that 7, then 21 becomes 22, and 40 becomes 41 (not a valid card!)&lt;/p>
&lt;p>Credit card manufacturers take their &lt;em>actual&lt;/em> credit card number (one digit too short) and follow the same process above, with one final twist to calculate the last digit.&lt;/p>
&lt;p>Put an &lt;code>X&lt;/code> for the last digit of your card (removing the last column of working), and find the new sum in Step 4 — in my example that would be &lt;code>31&lt;/code>. I note that &lt;code>40&lt;/code> is the next divisible-by-ten number above &lt;code>31&lt;/code>, and calculate &lt;code>40 - 31 = 9&lt;/code>. This means &lt;code>9&lt;/code> must be the last digit of my fake-card for it to be valid.&lt;/p>
&lt;p>This is a (very simple) consistent hashing algorithm — a way to consistently turn larger data into a smaller number which represents that data. We'll need more of them as we look at &lt;a href="../randomness/">Games with Randomness&lt;/a> in the next post!&lt;/p></content:encoded></item><item><title>A linkrot-free URL shortener</title><link>https://www.byjp.me/posts/link-shortener/</link><pubDate>Sat, 08 Jul 2023 11:08:45 +0100</pubDate><guid>https://www.byjp.me/posts/link-shortener/</guid><description>Using IPFS to build a trivial link shortener that doesn't hide &amp;amp; hoard the destination from the world. #tech #web #ipfs #shortlinks #val.town #indieweb</description><content:encoded>
&lt;p>Link shorteners are superbly useful, but &lt;em>really bad&lt;/em> for the longevity of the world wide web. Every time you use tinyurl.com, bit.ly, or similar you are taking something open and direct (the web address of the think you're pointing people to) and hiding it within the black box that is the company behind that site. We can improve this dire situation with the InterPlanetary FileSystem!&lt;/p>
&lt;p>If tinyurl.com closes its doors, or if bit.ly is bought by a billionaire who charges people to see the long link behind the short one, part of the interlinking fabric that holds the web together is lost. This is the way the web &amp;quot;rots&amp;quot;; by the removal of the content that holds it together.&lt;/p>
&lt;p>However short links are &lt;em>incredibly&lt;/em> useful; humans can't remember the long sequences of letters and numbers that some web addresses need to be, so what's to be done?&lt;/p>
&lt;p>&lt;em>Ugh. JP. &lt;strong>I get it&lt;/strong>. Let me &lt;a href="#how-ipfs-link-shortening-works">skip to the cool part&lt;/a>.&lt;/em>&lt;/p>
&lt;h2 id="what-is-ipfs">What is IPFS?&lt;/h2>
&lt;p>A few days ago the InterPlanetary FileSystem (IPFS) released a new version of their flagship server with an exciting new feature — the ability to perform redirects (geekier folks can &lt;a href="https://specs.ipfs.tech/ipips/ipip-0002/" target="_blank">read about it here&lt;/a>). To explain why this is so valuable, I'll quickly talk about IPFS, and why it's already solving many similar problems.&lt;/p>
&lt;p>&lt;a href="https://ipfs.tech/" target="_blank">IPFS&lt;/a> is a way of storing &amp;amp; requesting data on the internet by referring to it based on &lt;em>its content&lt;/em>, rather than &lt;em>its location&lt;/em>.&lt;/p>
&lt;p>A web address today looks like &lt;code>www.byjp.me/posts&lt;/code>. This contains the name of the server you should contact to get my site (&lt;code>www.byjp.me&lt;/code>), and where on that server the page is that lists all my posts (&lt;code>/posts&lt;/code>) — it's all &lt;em>location&lt;/em> based. If my server dies, then everyone has forever lost access to what's on my site — this is what's known as &amp;quot;&lt;a href="https://en.wikipedia.org/wiki/Link_rot" target="_blank">link rot&lt;/a>&amp;quot;.&lt;/p>
&lt;p>In the world of IPFS data is accessed, instead, by a Content ID (&amp;quot;CID&amp;quot;) — a name that is derived from, and unique to, the data it points to, rather than where it's located. The way this works is fairly technical, but the same data &lt;em>always&lt;/em> produces the same CID, and the CID uniquely refers to that data&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/p>
&lt;p>Another of my sites (a 3D model of my brain) has the CID &lt;code>QmPgEidvA67eUxtSgLQy2N5cWXh8WQ8r7iYQn1ecjrL8Mz&lt;/code>. You can see it at &lt;a href="https://ipfs.io/ipfs/QmPgEidvA67eUxtSgLQy2N5cWXh8WQ8r7iYQn1ecjrL8Mz" target="_blank">ipfs.io&lt;/a>, at &lt;a href="https://cloudflare-ipfs.com/ipfs/QmPgEidvA67eUxtSgLQy2N5cWXh8WQ8r7iYQn1ecjrL8Mz" target="_blank">Cloudflare&lt;/a>, &lt;a href="https://dweb.link/ipfs/QmPgEidvA67eUxtSgLQy2N5cWXh8WQ8r7iYQn1ecjrL8Mz" target="_blank">dweb.link&lt;/a> or any other IPFS server, as I have it stored on an IPFS server connected to the internet.&lt;/p>
&lt;p>This means that if Jo Bloggs makes a copy of my site (&amp;quot;pins&amp;quot; that CID), and then my site goes down forever, everyone can still view my site, &lt;em>exactly&lt;/em> as it was meant to be, by getting it from Jo Bloggs instead of me. I'm glossing over some details here but, broadly, so long as someone cares about the data in question: link rot defeated.&lt;/p>
&lt;h2 id="how-ipfs-link-shortening-works">How IPFS link shortening works&lt;/h2>
&lt;p>So, you may be asking, how does this help with URL shorteners? This new 'redirects' feature of the IPFS server (called &lt;a href="https://github.com/ipfs/kubo#readme" target="_blank">kubo&lt;/a>) means information on how to redirect people (from a shortlink to a long URL) can be stored &lt;em>in a file on IPFS&lt;/em>, which is much more resistant to link rot, and used to do redirections transparently forever.&lt;/p>
&lt;p>My domain &lt;code>byjp.fyi&lt;/code> serves content from IPFS, specifically a &lt;code>_redirects&lt;/code> file (&lt;a href="https://byjp.fyi/_redirects" target="_blank">see it live here&lt;/a>&lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup>) that holds all of my shortlinks and their destinations. This makes the redirects work as expected, but also ensures anyone who pins &lt;code>/ipns/byjp.fyi&lt;/code> on their IPFS server will &lt;em>always&lt;/em> be able to know what my shortlinks were pointing to, even if my site disappears.&lt;/p>
&lt;p>If you're feeling non-technical today, that's it! I hope you enjoyed your trip into my geeky world. If you're interested in how this works in depth, or getting this working for yourself, then read on…&lt;/p>
&lt;hr>
&lt;h2 id="how-do-i-do-this-too">How do I do this too?&lt;/h2>
&lt;p>If you too want to run your own (free!) URL shortener that is resilient to link rot then follow the steps below — then &lt;a href="https://www.byjp.me/standing-invitation">get in touch&lt;/a>, I'll happily pin your shortened domain locally, so we've got some more protection against link rot.&lt;/p>
&lt;p>These instructions assume you're confident with Github, Cloudflare &amp;amp; code, but you should be able to make it through even if you're not, and you can always reach out to me if you have questions!&lt;/p>
&lt;ol>
&lt;li>Set up the prerequisites:
&lt;ul>
&lt;li>You'll need a domain you want to host your shortlinks on. I tend to buy mine on Cloudflare (hit &amp;quot;Register domains&amp;quot; in the dashboard)&lt;/li>
&lt;li>You'll need to be using Cloudflare as your nameserver for this domain to follow these instructions exactly (though other DNS providers that have APIs to update DNS records should work)&lt;/li>
&lt;li>You'll need an account with &lt;a href="https://filebase.com" target="_blank">Filebase&lt;/a>, or any other API-capable IPFS pinning service.&lt;/li>
&lt;li>To follow my code exactly you'll need a bucket in Filebase called &amp;quot;microsites&amp;quot;.&lt;/li>
&lt;li>A Github account&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Fork my &lt;a href="https://github.com/by-jp/byjp.fyi" target="_blank">byjp.fyi&lt;/a> repo, and rename your fork to be whatever domain you registered.
&lt;ul>
&lt;li>I'll refer to this as &lt;code>github.com/yourghname/your.tld&lt;/code> from here on. You &lt;em>can&lt;/em> call the repo something different to what your domain is, but you'll need to edit the deploy scripts.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Add some secrets to your repo (see your repo's Settings &amp;gt; Secrets and variables &amp;gt; Actions):
&lt;ul>
&lt;li>&lt;code>CLOUDFLARE_ZONE_ID&lt;/code> needs to be the Zone ID for the domain you're using (find it on the side pane of the Overview page for your domain in Cloudflare)&lt;/li>
&lt;li>&lt;code>CLOUDFLARE_TOKEN&lt;/code> needs to be a &lt;a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank">Cloudflare token&lt;/a> with &lt;code>Zone.Web3 Hostnames:Edit&lt;/code> permissions for the Zone (domain) you're using.&lt;/li>
&lt;li>&lt;code>FILEBASE_KEY&lt;/code> needs to be the &amp;quot;Key&amp;quot; from your &lt;a href="https://console.filebase.com/keys" target="_blank">Filebase access keys page&lt;/a>.&lt;/li>
&lt;li>&lt;code>FILEBASE_SECRET&lt;/code> needs to be the &amp;quot;Secret&amp;quot; from the same place.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Create a Web3 Gateway for your domain in Cloudflare:
&lt;ul>
&lt;li>There's a tab called &amp;quot;Web3&amp;quot; on the left when you're viewing your domain, click &amp;quot;Create Gateway&amp;quot;&lt;/li>
&lt;li>The &amp;quot;Hostname&amp;quot; should be the same as your repo name, and the domain you've bought&lt;/li>
&lt;li>&amp;quot;Gateway Type&amp;quot; should be &amp;quot;IPFS DNSLink&amp;quot;&lt;/li>
&lt;li>You can leave the DNSLink field empty (we'll be replacing it via the API shortly)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Nearly there! In Github, manually edit the &lt;code>public/_redirects&lt;/code> file in your new repo
&lt;ul>
&lt;li>Perhaps change the &lt;code>/me&lt;/code> link to point to your own homepage&lt;/li>
&lt;li>You probably want to remove all my other shortlinks, but keep the bottom one (starting &lt;code>/*&lt;/code>), as it manages shortlinks that don't exist.&lt;/li>
&lt;li>Commit your changes&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>A few minutes after you committed you should see a green tick in Github, and your shortlinks site should be active! Visit your domain at a random path to see the 404 page, and at any shortlink you added to see it work.&lt;/li>
&lt;/ol>
&lt;p>If you'd also like an API to add a new shortlink, you'll need a &lt;a href="https://val.town" target="_blank">val.town&lt;/a> account:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Go to my val and fork it: &lt;a href="https://byjp.fyi/new" target="_blank">byjp.fyi/new&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Create another val with &lt;code>export const shortlink_domain = 'your.tld'&lt;/code> in it, referring to your domain.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>And another again with &lt;code>export const shortlink_repo = 'yourghname/your.tld'&lt;/code> in it, referring to your github repo.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>You can now send a query like below to have a new shortlink added to your repo!&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl &lt;span class="s2">&amp;#34;https://yourvtname-addshortlink.express.val.run/example?to=http://example.com&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> -H &lt;span class="err">&amp;#39;&lt;/span>Authorization: Bearer abc123
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>The host refers to your &lt;em>val.town&lt;/em> username, so here &lt;code>yourvtname-addshortlink.express.val.run&lt;/code> would only be accurate if your val.town account name was &lt;code>yourvtname&lt;/code>.&lt;/li>
&lt;li>The path refers to the shortlink you want to make, so here &lt;code>/example&lt;/code> means you'd be hitting &lt;code>your.tld/example&lt;/code> when complete.&lt;/li>
&lt;li>The &lt;code>to&lt;/code> query parameter is the destination, here that's &lt;code>http://example.com&lt;/code>. It'll fail if you try and redirect to something on &lt;code>your.tld&lt;/code> 😉&lt;/li>
&lt;li>The Bearer token (&lt;code>abc123&lt;/code> above) needs to be a &lt;a href="https://github.com/settings/tokens?type=beta" target="_blank">fine grained Github personal access token&lt;/a> (or the organisation equivalent) with at least &amp;quot;Read and Write access to code&amp;quot; for the &lt;code>yourghname/your.tld&lt;/code> repo.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h2 id="caveats--thoughts">Caveats &amp;amp; thoughts&lt;/h2>
&lt;p>I'd like to build a &lt;a href="https://raycast.com" target="_blank">Raycast&lt;/a> extension for making new shortlinks. It's stopped raining now, so maybe later!&lt;/p>
&lt;p>If you try to post new shortlinks with the val.town API faster than the deploy time for the repo then your API call will be rejected, and you'll have to try again. I'd like to get some auto-retries in there.&lt;/p>
&lt;p>With val town and Raycast being drivable by Typescript I'd like to release this as a package, so it's mega easy to use. Perhaps it'll even have tests 😲&lt;/p>
&lt;p>I'd &lt;em>really&lt;/em> like to be able to publish this blog with &amp;quot;other things I'd like to be included in the root hash&amp;quot;, so I could say &amp;quot;resolve &lt;code>/ipns/byjp.fyi/&lt;/code> and include that IPFS data here&amp;quot;, so this blog always includes a 'backup' of the shortlinks. This feels like it's the tip of a bigger feature IPFS might include around deeper archival support.&lt;/p>
&lt;p>Removing shortlinks is still a manual edit of the Github repo away. I don't see much value in allowing that to be automated any time soon.&lt;/p>
&lt;p>I do need to trust val.town with write access to my shortlinks repo — if something leaked out of that part of the flow then back folks could hijack links folks may trust are mine isn't great. I should probably check the shortlinks every now and again.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>It's not &lt;em>technically&lt;/em> unique, there are just more different combinations of these names (Content IDs, or &amp;quot;CIDs&amp;quot;) than there are atoms in the universe, so the likelihood of two being the same for different data is &lt;em>vanishingly&lt;/em> small.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;li id="fn:2">
&lt;p>For convenience's sake, I keep my &lt;code>_redirects&lt;/code> file and other files associated to byjp.fyi &lt;a href="https://github.com/by-jp/byjp.fyi" target="_blank">on github&lt;/a>, with a &lt;a href="https://github.com/by-jp/byjp.fyi/blob/main/.github/workflows/deploy.yaml" target="_blank">deploy workflow&lt;/a> which pins all the files on &lt;a href="https://filebase.com/" target="_blank">Filebase&lt;/a>, and updates Cloudflare with the new DNS entry every time I publish a new shortlink.&lt;/p>
&lt;p>I also use &lt;a href="https://val.town" target="_blank">val.town&lt;/a> (an &lt;em>incredibly&lt;/em> cool Javascript functions in-the-cloud service) to build an API for adding new shortlinks. Automate all the things! If you had one of my Github access tokens, you could add shortlinks to my domain by heading to &lt;a href="https://byjp-addshortlink.express.val.run/example?to=https://example.com" target="_blank">this URL&lt;/a>. You can read my val &amp;amp; see how it works at &lt;a href="https://byjp.fyi/new" target="_blank">byjp.fyi/new&lt;/a>.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></content:encoded><dc:relation>https://bsky.app/profile/byjp.me/post/3jzz5ksqk342f</dc:relation><dc:relation>https://hachyderm.io/@byjp/110678606565568698</dc:relation></item><item><title>Uncommon time-telling</title><link>https://www.byjp.me/posts/uncommon-time-telling/</link><pubDate>Sun, 18 Jun 2023 08:30:00 +0100</pubDate><guid>https://www.byjp.me/posts/uncommon-time-telling/</guid><description>The Human Era, International Fixed Calendar, and .beat time: Weird and wonderful ways of telling time that I adore. #time #date #calendar #human-era #InternationalFixedCalendar #beat</description><content:encoded>
&lt;p>Recently I've become a little obsessed by a handful of uncommon methods of transcribing the date and time. Perhaps it's because I bought myself an Apple watch recently (so I can play with how I read the time), but I've always enjoyed learning about time, and how we humans love to try and parcel it up.&lt;/p>
&lt;p>There are three novelties I've been enjoying, the Human Era calendar, the International Fixed Calendar, and Swatch Internet Time.&lt;/p>
&lt;p>As I write this it is the year 2023, June 18th, at roughly 8:30 am (or 08:00, as I tend to write it).&lt;/p>
&lt;p>Right now, with these three uncommon time systems, it is the year 12,023, Sol 1st, at roughly @395…&lt;/p>
&lt;h2 id="the-human-era">The human era&lt;/h2>
&lt;p>This proposed year-numbering system puts the year zero at a convenient point very near the begining of &lt;a href="https://en.wikipedia.org/wiki/Holocene" target="_blank">the Holocene&lt;/a> (our current geological epoch), instead of the birth of Jesus, as used in our standard &lt;a href="https://en.wikipedia.org/wiki/Gregorian_calendar" target="_blank">Gregorian calendar&lt;/a>.&lt;/p>
&lt;p>The effect is simple: add 10,000 years to the current date — an extra &amp;quot;1&amp;quot; at the front of any &lt;a href="https://en.wikipedia.org/wiki/Common_Era" target="_blank">CE&lt;/a> year.&lt;/p>
&lt;p>Right now it is year 12,023 of the &lt;a href="https://en.wikipedia.org/wiki/Holocene_calendar" target="_blank">Human Era&lt;/a>.&lt;/p>
&lt;p>There's few better places to learn about something than the &lt;a href="https://www.youtube.com/@kurzgesagt" target="_blank">Kurzgesagt — In a Nutshell&lt;/a> Youtube channel, and their explainer on the &lt;a href="https://youtu.be/czgOWmtGVGs" target="_blank">Human Era calendar&lt;/a> is no exception. Go have a watch, I'll wait!&lt;/p>
&lt;p>I really like this year-numbering system — it's easy to adopt (and un-adopt for others), it brings all humanity together (regardless of religious beliefs), and it brings the monumental efforts of our ancestors closer to us. We build on the shoulders of giants (always).&lt;/p>
&lt;h2 id="the-international-fixed-calendar">The international fixed calendar&lt;/h2>
&lt;p>This reformed calendar changes what month and day it is at any given moment of the year. In 1902 (ahem 11,902) a &lt;a href="https://en.wikipedia.org/wiki/Moses_B._Cotsworth" target="_blank">British accountant&lt;/a> made the (very reasonable!) proposal that months should all be the same length, exactly 4 weeks. This required a thirteenth month, named &lt;em>Sol&lt;/em>, placed between June and July.&lt;/p>
&lt;p>Right now it is Sunday Sol 1st in the &lt;a href="https://en.wikipedia.org/wiki/International_Fixed_Calendar" target="_blank">International Fixed Calendar&lt;/a>.&lt;/p>
&lt;p>This change, Cotsworth claimed, would bring much-needed simplicity to defining timespans in industry and commerce, where computers didn't yet exist to trivially tell you what day of the week it was this time next month or year.&lt;/p>
&lt;p>It also brought another few interesting things to the table:&lt;/p>
&lt;ul>
&lt;li>The 1st of every month is a Sunday, the 2nd always a Monday, and so on. Always, in every year.&lt;/li>
&lt;li>4 weeks for every month means regular monthly bills and paychecks will always be exactly the same.&lt;/li>
&lt;li>Statistical comparisons between months are more accurate (the proportion of week and weekend days is the same between months, always)&lt;/li>
&lt;li>Moveable public holidays (like the US' Thanksgiving, which always sits on a Thursday) have a fixed date too.&lt;/li>
&lt;/ul>
&lt;p>The eagle-eyed among you might wander what happens on leap years, and point out that 28 times 13 is only 364 days anyway. One of my favourite parts of the IFC is how the weekdays stay aligned — both problems handled by 1 or 2 special days each year.&lt;/p>
&lt;p>Firstly, the last day of the year is always &amp;quot;Year Day&amp;quot; and, though computer systems might record it as December 29th, it technically sits aside from any month. Similarly, on leap years (decided as with &lt;a href="https://en.wikipedia.org/wiki/Leap_year#Gregorian_calendar" target="_blank">Gregorian calendar leap years&lt;/a>), there's an extra day after June 28th that's also attached to no month, being called &amp;quot;Leap Day&amp;quot;. These two days are always public holidays.&lt;/p>
&lt;p>Oddly enough the &lt;a href="https://en.wikipedia.org/wiki/Eastman_Kodak_Company" target="_blank">Eastman Kodak Company&lt;/a> (or Kodak as we'd all know it) used the International Fixed Calendar between 1928 and 1989 for everything it did.&lt;/p>
&lt;p>(Check out &lt;a href="https://apps.apple.com/gb/app/international-fixed-calendar/id1107327564" target="_blank">this great free app&lt;/a> for viewing the current IFC date on your iPhone or recent Mac)&lt;/p>
&lt;h2 id="swatch-internet-time-beat-time">Swatch Internet Time (.beat time)&lt;/h2>
&lt;p>This way of writing time, proposed by the &lt;a href="https://en.wikipedia.org/wiki/Swatch" target="_blank">Swatch&lt;/a> corporation in 1998, was made as something of a marketing gimmick, it appears.&lt;/p>
&lt;p>Right now it is @395, &lt;a href="https://en.wikipedia.org/wiki/Swatch_Internet_Time" target="_blank">.beat time&lt;/a>.&lt;/p>
&lt;p>Simply enough, there are 1,000 &amp;quot;.beats&amp;quot; in a day, written as a three digit whole number preceded by an &lt;code>@&lt;/code> symbol. @0 occurrs at midnight in the UTC+1 timezone, which is the same timezone used by Swatch's headquarters in Biel, Switzerland (when it's not in daylight saving's time).&lt;/p>
&lt;p>Though it's not my favourite of these uncommon date/time-writing methods, I find it fascinating that it effectively used French revolutionary decimal time, and expressed a belief of what the internet would become that's so much more futuristic than the almost invisible mundanity it is today, 25 years later.&lt;/p>
&lt;p>(Check out &lt;a href="https://apps.apple.com/us/app/beat-internet-time/id1570173118" target="_blank">this great free app&lt;/a> for viewing the current .beat time on your iPhone or recent Mac)&lt;/p>
&lt;hr>
&lt;p>That's enough weird ways of writing time for now. One of these days I'll figure out how to bend the software I use to build this blog to my will, and have it (optionally 😅) display the dates and times with these uncommon writing systems!&lt;/p></content:encoded></item><item><title>Arc: a new browser</title><link>https://www.byjp.me/posts/arc-new-browser/</link><pubDate>Fri, 09 Jun 2023 10:27:44 +0100</pubDate><guid>https://www.byjp.me/posts/arc-new-browser/</guid><description>A new web-browser that really is helping me fall in love with the internet again. #web #browser #90s</description><content:encoded>
&lt;p>It seems to me like new browsers are very popular at the moment. I love that this means a &lt;em>Change&lt;/em> is probably coming, it's about time.&lt;/p>
&lt;p>I've oscillated a little through web browsers in the roughly two and a half decades(!) I've been a &amp;quot;netizen&amp;quot;, but they've almost always been tied to my OS. I've literally &lt;em>just&lt;/em> started using &lt;a href="https://arc.net/" target="_blank">Arc&lt;/a>, and I'm already adoring it.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/arc-new-browser/arc.png"
alt="A screenshot of the Arc browser, viewing the homepage of this blog."/>
&lt;figcaption>What the Arc browser looks like&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Why do I like it so quickly? It's extremely well designed; the novel choice to put a border around the viewport makes web pages feel like something to be appreciated again, the vertical tab bar—and the choice to archive any non-pinned tabs when you close that window—makes it easy to find what you're looking for and keep only what you need, the &amp;quot;Little Arc&amp;quot; windows really feel like peeking into other websites while keeping focus on the original one, and a thousand other choices made for your &lt;em>enjoyment&lt;/em>.&lt;/p>
&lt;p>I'll write more after using it for a while but, weirdly, the one thing that's made me love it more than anything else? The 'make Arc your default browser' dialog offered &amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, and &amp;quot;Let me try it for a week&amp;quot;. Very smart, and just what I wanted.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/arc-new-browser/little-arc.webp"
alt="The &amp;#39;Little Arc&amp;#39; browser windows make it really easy to dip into a site quickly, from another webpage, or another app."/>
&lt;figcaption>The 'Little Arc' browser windows make it really easy to dip into a site quickly, from another webpage, or another app.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Writing this got me reminiscing; it's not a lens I thought I'd ever use to look back on my life to date, but here we go…&lt;/p>
&lt;h2 id="my-history-in-browsers">My history in browsers&lt;/h2>
&lt;p>I started on the world wide web with &lt;a href="https://en.wikipedia.org/wiki/Netscape_%28web_browser%29#/media/File:Apple_Unix_with_Netscape.png" target="_blank">Netscape&lt;/a>. It sat on my school's Apple Macintoshes and you could find me, too frequently, seeking the arcane knowledge of the world. I remember my first HTML(3) was written on one of those macs, I &lt;em>think&lt;/em> I also had a Geocities site (I've never been able to find it in the archives though). Doors opened, potential oozed everywhere — I'm pretty sure that's where all this started for me!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/arc-new-browser/ie-browser-extensions.png"
alt="A very old version of Internet Explorer with so many toolbar browser extensions the web page is only a few pixels high."/>
&lt;figcaption>Who could forget how &lt;em>everything&lt;/em> you installed also required you add a new IE browser toolbar.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>I switched &lt;a href="https://en.wikipedia.org/wiki/Internet_Explorer#/media/File:Internet_Explorer_1.0.png" target="_blank">Internet Explorer&lt;/a> when Windows 95 came to my family home, and the school library gained three new computers. I was building web 1.0 sites fairly often by this point, I cringe at the thought of most of them (for the content and at my lack of awareness), but the notepad.exe written HTML was glorious.&lt;/p>
&lt;p>I swapped to &lt;a href="https://en.wikipedia.org/wiki/Firefox#/media/File:Firefox_96_screenshot.png" target="_blank">Firefox&lt;/a> at University, as I converted the aging computer I'd built to &lt;a href="https://en.wikipedia.org/wiki/Arch_Linux" target="_blank">Arch Linux&lt;/a>. It's so funny looking at some of the angsty passive aggression I expressed towards Internet Explorer, and it's finicky requirements!&lt;/p>
&lt;p>&lt;img src="https://www.byjp.me/posts/arc-new-browser/no-ie.png" alt="A screenshot of HTML I wrote, with a paragraph of text saying: &amp;#34;Oh dear. You seem to be using Internet Explorer. I&amp;#39;m going to be straight with you. Internet Explorer is one of the big black misery holes in my life. I don&amp;#39;t really have time to make my little web projects fit in with Microsoft&amp;#39;s need to adhere to their own standards, rather than the ones set by the international &amp;#39;world wide web consortium&amp;#39; (or w3c). Internet Explorer (even IE8, the latest version) is the only modern browser that doesn&amp;#39;t display SVG images, which is exactly what Project Prime depends on. Seeing as you&amp;#39;re using internet explorer you wouldn&amp;#39;t see anything at all! I do apologise that you can&amp;#39;t view our creation in your browser, but please, please consider moving to a browser that doesn&amp;#39;t make web developers&amp;#39; lives hell! Mozilla&amp;#39;s Firefox, Apple&amp;#39;s Safari, Google&amp;#39;s Chrome and Opera are all superlative browsers and they all will get you viewing Project Prime the way it&amp;#39;s supposed to look.">&lt;/p>
&lt;p>Then came relative stability for me; my parents, seeing my obvious passion for computing, gave me an intel macbook for my 21st birthday, and I've been in that ecosystem ever since. The clean experience of &lt;a href="https://en.wikipedia.org/wiki/Safari_%28web_browser%29" target="_blank">Safari&lt;/a> quickly gave way to &lt;a href="https://en.wikipedia.org/wiki/Google_Chrome" target="_blank">Google Chrome&lt;/a> as I discovered the power of &lt;a href="https://developer.chrome.com/docs/devtools/" target="_blank">Chrome DevTools&lt;/a> while building websites.&lt;/p>
&lt;p>My only brief time away from Chrome since then was to &lt;a href="https://en.wikipedia.org/wiki/Brave_%28web_browser%29" target="_blank">Brave&lt;/a>, a Chromium-based browser (with basically all the same features) that was (is?) doing some really interesting things in attempting to move the web &lt;em>away&lt;/em> from advertising as its main source of revenue. I &lt;em>loved&lt;/em> that idea (and still do), but I ultimately disagreed with the idea of replacing existing adverts with your own to feed your own business. I never did like &lt;a href="https://en.wikipedia.org/wiki/Cuckoo#Brood_parasitism" target="_blank">cuckoos&lt;/a>.&lt;/p>
&lt;p>It's interesting to note that the browser my phone uses has broadly been unimportant. They all do &lt;em>basically&lt;/em> the same thing, with the only partially valuable feature being the syncing of tabs between devices (which no-one seems to have 'gotten right' yet).&lt;/p>
&lt;p>Perhaps &lt;a href="https://arc.net" target="_blank">Arc&lt;/a> is my next browser of choice, only time will tell.&lt;/p></content:encoded></item><item><title>Archiving Instagram posts</title><link>https://www.byjp.me/posts/archiving-instagram-posts/</link><pubDate>Sat, 29 Apr 2023 10:48:31 +0100</pubDate><guid>https://www.byjp.me/posts/archiving-instagram-posts/</guid><description>Archiving my Instagram account, and releasing the code that imported it to this Hugo-driven site. #instagram #social</description><content:encoded>
&lt;p>I spent a little time this weekend reminding myself of what writing code is like (before I start work again on Tuesday, after &lt;a href="https://adventure.awaits.us" target="_blank">4 months travelling&lt;/a>). After my recent post on &lt;a href="https://www.byjp.me/posts/goodbye-big-social">leaving Meta's social networks&lt;/a> I decided to create a script to convert the GDPR-provided archive of all my activity on Instagram into this blog.&lt;/p>
&lt;p>You can find it at #from-instagram — &lt;del>I'll figure out a good place to leave a permanent link soon!&lt;/del>&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/archiving-instagram-posts/instgram-posts.webp"/>
&lt;figcaption>A screenshot of the new archival page on this blog; tiled photos from my instagram feed.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>If this incredibly specific challenge is something you also face, you can find the (slap-dash) code I wrote in the &lt;a href="https://github.com/by-jp/www.byjp.me/tree/main/tools/archive/instagram" target="_blank">repo that contains this blog&lt;/a>.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>I switched to treating Instagram photos as a part of my &lt;a href="https://www.byjp.me/photos">photos stream&lt;/a>, but left the #from-instagram tags on there, in case you want to find those specifically.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></content:encoded></item><item><title>Goodbye big-social</title><link>https://www.byjp.me/posts/goodbye-big-social/</link><pubDate>Fri, 28 Apr 2023 15:21:00 +0000</pubDate><guid>https://www.byjp.me/posts/goodbye-big-social/</guid><description>Why I'm leaving 'big' social media. #social-media #friends</description><content:encoded>
&lt;p>I'm pretty fed up of Facebook and Instagram. I barely use them, but when I do I &lt;em>binge&lt;/em>, and end up feeling terrible afterwards. I'm familiar with how sites like these use data analytics to group humans into buckets according to the best ways to maximise dopamine release, and the &lt;em>percent of our day&lt;/em> we spent on their sites/apps, and it makes me itch.&lt;/p>
&lt;p>I don't want my attention to be milked. I don't want to feel &lt;em>more&lt;/em> distant from my friends on the platforms that claim to connect me with them. Six advertisements and four rose-tinted travel &amp;quot;influencer&amp;quot; posts between anything relating to my friends' lives isn't useful or good for me. It's clearly time to leave.&lt;/p>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/goodbye-big-social/insta-ages.jpg"
alt="My first, precisely middle, and last posts on instagram. From left to right: the &amp;#39;Creepy mounted fox head&amp;#39; I apparently joined Instagram to post a photo of (Nov 20, 2010); a scan of an old and wonderful photo of my Mum&amp;#39;s late partner, Tony, standing over a moped looking ready to fly (Jan 4, 2017); a photo of my fiancée looking out over stunning Rio de Janiero from Pão de Açucar (Feb 15, 2023)."/>
&lt;figcaption>My first, precisely middle, and last posts on instagram. From left to right: the 'Creepy mounted fox head' I apparently joined Instagram to post a photo of (Nov 20, 2010); a scan of an old and wonderful photo of my Mum's late partner, Tony, standing over a moped looking ready to fly (Jan 4, 2017); a photo of my fiancée looking out over stunning Rio de Janiero from Pão de Açucar (Feb 15, 2023).&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>I joined Facebook in 2005, excited at the technical and societal marvel that was &lt;a href="https://en.wikipedia.org/wiki/Web_2.0" target="_blank">web 2.0&lt;/a>, and Instagram (then independent of Meta) in 2010, delighting at having both a camera &lt;em>and&lt;/em> the internet in my pocket at once. I enjoyed sharing and creating on those platforms then (I did it though none of my friends had joined yet!) but now my every word and pixel is fed into a runaway marketing algorithm, and I'm going to get off the train.&lt;/p>
&lt;p>Sadly, by removing my accounts, I'll lose my ability to reach out to long-lost friends whose numbers and emails I no longer have. But I don't like being held hostage, so I've written this post on my own site (its &lt;a href="https://byjp.me" target="_blank">homepage&lt;/a> has all the best ways to get in touch with me), and I'll be sending messages to as many people as I can to reconnect and point them there.&lt;/p>
&lt;p>&lt;strong>I'll be leaving just after my birthday this year, June 16th&lt;/strong> (as anyone inclined to wish me well then is someone who may want to know where I've gone to!) but you can find me online in a host of other, more friendly and sedate, places already (check the &lt;a href="https://byjp.me" target="_blank">byJP.me homepage&lt;/a> for the up-to-date ones).&lt;/p>
&lt;p>You can also &lt;a href="https://www.byjp.me/posts/thoughts-on-postcards/">send me a postcard&lt;/a>, or message me on &lt;em>&lt;a href="https://signal.org/" target="_blank">Signal&lt;/a>&lt;/em>, &lt;em>iMessage&lt;/em>, and (if you twist my arm) &lt;em>WhatsApp&lt;/em>. For my address or my phone number, being more sensitive, just say hello &lt;a href="mailto:hello@byjp.me">by email&lt;/a>, and I'll excitedly share with you!&lt;/p></content:encoded></item><item><title>Interlude: Pack Post</title><link>https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/</link><pubDate>Sat, 11 Mar 2023 11:45:44 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/</guid><description>Things got too exciting and busy for blog posts! Here's a pack-post interlude while we figure out how to slow down 😅</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/feature.jpg"/>
&lt;/figure>
We’ve been so busy recently, here in the middle of the Atacama desert, that I’ve not had time to write a post for you all! However I’ve been sneaky and (perhaps somewhat unexpectedly) well prepared, and put together an interlude post for a quiet moment while we were in Buenos Aires!&lt;/p>
&lt;p>So, to sate your curiosity and while away a spare 2 minutes, here is a brief “pack post”, showing you my travel possessions for these 4 months. Everything I’ve been carrying with me for handling the blistering equatorial sun in Brazil, the multi-day Patagonian hikes, skiing in Vancouver, and the chilly springtime in Japan. A total of just under 17kgs of clothes and comfort items — just over a quarter of my weight again (so I try not to carry it for too long!)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/img-1.jpg"
alt="Everything that travels with me in one picture — I’ll describe the contents in the paragraphs that follow, from bottom to top."/>
&lt;figcaption>Everything that travels with me in one picture — I’ll describe the contents in the paragraphs that follow, from bottom to top.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>You can see across the bottom here I’ve gone all-in on the packing pouches. The &lt;a href="https://www.muji.us/collections/packing/products/recycled-nylon-gusset-case-double-ohfa0a" target="_blank">Muji ones&lt;/a> on the right, and the yellow &lt;a href="https://www.osprey.com/us/en/product/ultralight-packing-cube-set-PACKCBSET.html" target="_blank">Osprey ones&lt;/a> have been &lt;strong>so useful&lt;/strong> for keeping clothes roughly ironed-looking, even when they’re squished into a backpack. They’re also great for isolating the smelly ones that need washing (the red pack at the bottom) from the smarts (on the bottom right) and the things I need regular access to like socks &amp;amp; boxers (the small Osprey pack next to my sunglasses).&lt;/p>
&lt;p>In the middle you can see other crucial parts of my hold-luggage (which also tend to stay in hostels while we go out); my overpriced-but-actually-extremely-nice olive grey &lt;a href="https://www.peakdesign.com/products/small-wash-pouch" target="_blank">wash bag from Peak Design&lt;/a> (the Chinese USB-C recharging electric toothbrush inside it has been superb!), my micro fibre towel (which has been travelling with me now for 20 years, here also protecting the maté cup I won in our Buenos Aires cookery class), a medical kit (for hikes or spots away from civilisation), the beige self-packing mini backpack from Mystery Ranch (which will likely grow as we accumulate knick-knacks), and the blue bag-o-stuff that holds adapter cables, my penknife, overflow medical stuff and a spare battery.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/img-2.jpg"
alt="The Maté (tea) cup I won in Buenos Aires! Maté is everywhere in Argentina."/>
&lt;figcaption>The Maté (tea) cup I won in Buenos Aires! Maté is everywhere in Argentina.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The black and orange bundles in the lower middle are, respectively, a superb Rab wind/waterproof jacket and a gorgeously warm “marmalade” Rab down layer—both bought in sales without being aware of the brand's usual expense, let’s hope I don’t have to replace them any time soon…&lt;/p>
&lt;p>Oh, and of course, the emergency pisco which Yvette’s long-time friend Gaby gave us in Sandiago de Chile (did she &lt;em>know&lt;/em> we’d be celebrating so soon afterwards??)&lt;/p>
&lt;p>Looking at the top row there, the four different sets of shoes I’ve brought with me were definitely the most challenging part of the pack. Flip flops were clearly necessary for the shared shower spaces of the hiking &lt;em>refugios&lt;/em> as much as Brazil’s gorgeous hot &amp;amp; sandy beaches; the hiking boots even more crucial to prevent twisted ankles.&lt;/p>
&lt;p>The trainers have meant walking around cities has been super comfortable (they also let my knee injury recover way faster, not having to shift a half kilo of boot every full step), and the deck shoes were a concession to wanting to look smart on occasion—charming our way into special events, dates together on Valentine’s day and Yvette’s birthday, and visiting the fancy bars we keep finding out are on the &lt;a href="https://www.worlds50bestbars.com/list/1-50" target="_blank">world’s top 50 list&lt;/a> (You’ll notice a shirt to go with them down the bottom right there too!)&lt;/p>
&lt;p>Finally, on the left, my trusty &lt;a href="https://tilley.com/collections/best-brimmed-hats" target="_blank">Tilley hat&lt;/a>. Bought as a gift to myself in 2013 so I’d have some head-protection as I joined my Dad for his incredible drive/safari from Alexandria to Cape Town in honour of definitely-not-turning-seventy-what-are-you-talking-about. These Tilley hats are so good (especially because of their lifetime-long, no quibbles, guarantee and warranty) that Mum, Chris &amp;amp; Rose gave Yvette a Tilley hat of her own before we set off—she’s wears it proudly everywhere!&lt;/p>
&lt;p>All this fits into the green &lt;a href="https://www.osprey.com/us/en/product/aether-trade-55-AETHER55F20.html" target="_blank">Osprey Aether 55&lt;/a> underneath my hat — they describe this pack size as being for “days, weeks and maybe months”, but there’s still enough space for a few small souvenirs in there for sure!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/img-3.jpg"
alt="I’m still impressed by how much space there is left over once all this kit is thrown together."/>
&lt;figcaption>I’m still impressed by how much space there is left over once all this kit is thrown together.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>My hand-luggage—kept in that Chile-bought orange &lt;a href="https://www.osprey.com/us/en/product/hikelite-18-HIKELITE18.html" target="_blank">Osprey Hikelite 18&lt;/a>—is surprisingly camera-dominated. My trusty &lt;a href="https://fujifilm-x.com/en-us/products/cameras/x-t30-ii/" target="_blank">Fujifilm X-T30 II&lt;/a> has been behind many of the best photos you’ve seen on this blog, I love its shape as much as the photos it takes! It sits there in the red neoprene cover, next to a cut-down photographer’s kit: a wider lens for panoramas, a flexi-legged mini tripod, and a stack of filters for pretending I know what I’m doing. (The filter lens caps I &lt;a href="https://amzn.eu/d/2gRZjp8" target="_blank">found online&lt;/a>  mean I can keep all this kit super small, I’d recommend them!)&lt;/p>
&lt;p>Tucked around that are the various pieces of space-aged wizardry that keep us entertained on chill days and let us write this blog. Chris’ old iPad and a &lt;a href="https://www.apple.com/uk/shop/product/MJQJ3B/A/magic-keyboard-for-ipad-pro-11-inch-4th-generation-and-ipad-air-5th-generation-british-english-white" target="_blank">magic keyboard&lt;/a> (it makes typing so easy it almost justifies the cost… almost), an old Kindle Paperwhite (as I write this I’ve been through 6 books and have two on the go—Yvette and I are also reading &lt;em>The Colour of Magic&lt;/em> together 💚), and my Sony &lt;a href="https://www.sony.co.uk/headphones/products/wf-1000xm4" target="_blank">WF-1000XM4&lt;/a> headphones, which I’m having a love/hate relationship with at the moment. They’re easily the best headphones I’ve ever owned—they fit into a (slightly bulging) pocket, have superb quality, and bring the music that keeps me sane to wherever we’re waiting—but the battery has almost totally gone in the right earbud and, at 14 months old, I’m having a fight with Sony over their replacement, which is challenging from a different continent! [PS. I subsequently left them in the shared space at our Florianópolis hostel overnight, and they grew legs, so… yay, I get to claim on insurance to get a new pair? 😅]&lt;/p>
&lt;p>Eye-mask, ear plugs, tissues, money/passport pouch, water bottle &amp;amp; duct tape make up the bulk of the rest. Two call outs there: always travel with duct tape (you can see it holding the pisco cork in place here, it’s also blacked out blinky lights in bedrooms for better sleep, and has even made a make-shift plug for a much-needed bath!), and get yourself a &lt;a href="https://wise.com/gb/card/" target="_blank">Wise card&lt;/a>, it’s been the best investment for good travel exchange rates, particularly in Argentina.&lt;/p>
&lt;p>The final flourishes include a &lt;a href="https://www.genkithings.com/products/genki-audio" target="_blank">Genki Audio&lt;/a> (I helped kickstart it back in… last decade 😳) which we use for splitting the bluetooth audio two ways while watching downloaded episodes of &lt;a href="https://trakt.tv/shows/tom-clancy-s-jack-ryan" target="_blank">Jack Ryan&lt;/a> on long flights), a walkie-talkie (for when we’re hiking different routes, or otherwise apart without good internet calling), and—of course—my beloved engagement gift, the compass that Yvette so carefully had engraved with her own handwriting.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/interlude-pack-post/img-4.jpg"
alt="A photo of JP with both backpacks on, giving a thumbs up, in a hostel lobby."/>
&lt;figcaption>What’s got this guy looking so perky?&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Getting all this stuff in these bags doesn’t take long, you probably spent more time reading about what’s in it — what a… filler post 😂 If you find yourself interested or travelling on a weight-budget do leave a comment or send me an email, I’ll be happy to share more info on what’s worked well and what hasn’t!&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/interlude-pack-post-2</dc:relation></item><item><title>Embracing IndieWeb</title><link>https://www.byjp.me/posts/indieweb/</link><pubDate>Wed, 01 Mar 2023 09:01:45 -0300</pubDate><guid>https://www.byjp.me/posts/indieweb/</guid><description>Embracing the indieweb, an internet run by humans not corporations. #tech #web #indieweb #fediverse</description><content:encoded>
&lt;p>In December I killed my Twitter account. I was minorly proud of how long I'd been around there (ID 15751: palindromic &lt;em>and&lt;/em> an early adopter; living that nerd life), even if I was mostly a lurker, however Musk's layoffs affected friends I trust, and Twitter's security &amp;amp; ethics teams — two teams I wanted to be at full strength.&lt;/p>
&lt;p>I wanted to give Mastodon a try (I was already using &lt;a href="https://pixelfed.org" target="_blank">PixelFed&lt;/a> from the Fediverse) and a friend recommended &lt;a href="https://hachyderm.io/@nova" target="_blank">@nova&lt;/a>'s &lt;a href="https://hachyderm.io" target="_blank">Hachyderm&lt;/a> instance. It's been wonderful for so many reasons (&lt;em>thank you&lt;/em> for the tip &lt;a href="https://hachyderm.io/@julz" target="_blank">Julz&lt;/a>!) — in particular Nova's expert technical direction of the instance (though I've still to watch one of her twitch streams), the lovely people I've connected with, and the rapidly evolving approach Hachyderm has taken to administration and funding (including &lt;a href="https://nivenly.org" target="_blank">Nivenly&lt;/a>, its parent org).&lt;/p>
&lt;p>Like many of the tech-oriented folks on Hachyderm I've also embraced the nostalgia of early-twitter, 'web 1.0', and &lt;a href="https://indieweb.org/POSSE" target="_blank">POSSE&lt;/a> (Publish your Own Site, Syndicate Elsewhere). I say &amp;quot;nostalgia&amp;quot;, as that's the overwhelming feeling for me, but moving towards open protocols, decentralising, and bringing more creative diversity back to the web are all important to me, and to the web in general.&lt;/p>
&lt;p>I plan on bringing more of the &lt;a href="https://indieweb.org/" target="_blank">IndieWeb&lt;/a> to my sites, at least once I'm back in front of a real computer after &lt;a href="https://adventure.awaits.us" target="_blank">my sabbatical&lt;/a>, but I plan on at least adding links to my &lt;a href="https://www.byjp.me/friends">friends' sites&lt;/a> as so many seem to be following a similar journey of starting to own their own spaces online.&lt;/p>
&lt;p>In the meanwhile, come and say hi in the Fediverse — I'm &lt;a href="https://hachyderm.io/@byjp" target="_blank">@byJP&lt;/a>!&lt;/p></content:encoded></item><item><title>Buenos Aires: Eres Hermosa</title><link>https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/</link><pubDate>Thu, 23 Feb 2023 21:23:48 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/</guid><description>Six wonderful days in Buenos Aires exploring live jazz, great food, cocktails and wonderful people.</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/feature.jpg"/>
&lt;/figure>
It’s about time I publish this post about our time in Buenos Aires! I’m getting quite delayed in tidying &amp;amp; posting my notes (we left on the 4th of Feb, and it’s now the 23rd…), mainly because of how much we’re fitting into our Brazilian days! As much as I want to be present and explore everything possible, I also want to write about what its been like for future us; after all, we become the stories we tell ourselves — adventure awaits!&lt;/p>
&lt;hr>
&lt;p>Buenos Aires is clearly a city of the arts. Everywhere we turned we saw creativity; incredible graffiti, superb jazz, punk &amp;amp; rock performances, &lt;em>three&lt;/em> of the world’s top 50 bars, inventive (and free) museums, even the sombre but stunning cemetery &lt;em>&lt;a href="https://en.wikipedia.org/wiki/La_Recoleta_Cemetery" target="_blank">La Recoleta&lt;/a>&lt;/em> (and so much more!) Each of these places was overflowing with people expressing themselves, and doing it with skill and style. Even as we put our backpacks down in our hostel room, we heard the Argentinian rock trio formed from the hostel staff throwing an evening gig for us guests.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-1.jpg"
alt="Hostel Viajero’s in house band—the staff—playing Música Ligera, a track from one of Yvette’s favourite bands Soda Stereo moments after we arrive on our first night in town."/>
&lt;figcaption>Hostel Viajero’s in house band—the staff—playing Música Ligera, a track from one of Yvette’s favourite bands Soda Stereo moments after we arrive on our first night in town.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>We managed to squeeze &lt;em>a lot&lt;/em> into just 6 days; as ever for us, it somewhat revolved around truly excellent food and drink. The &lt;em>Choripán&lt;/em> (&lt;strong>Chori&lt;/strong>zo in &lt;strong>&lt;em>pán&lt;/em>&lt;/strong>, ie. bread) from &lt;em>San Telmo&lt;/em>’s ‘antiques’ market was delicious, the literally world-class cocktails at &lt;a href="https://www.worlds50bestbars.com/the-list/floreria-atlantico.html" target="_blank">Florería Atlántico&lt;/a> were bordering on ruinously addictive, but it was our (now traditional) new-country-new-cookery-class at &lt;em>The Argentine Experience&lt;/em> that really stood out for me.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-2.jpg"
alt="From left to right: Yvette relaxing in one of the tucked-away markets in San Telmo old town; the architecturally world-renowned Puente de la Mujer (“women’s bridge”) our gate to one of the many ecological parks; Yvette enjoying one of those world-class cocktails at Florería Atlántico; how we first tried to learn Tango, using this rather lovely stone guide outside an old Tango hotspot—don’t worry, we also got lessons!"/>
&lt;figcaption>From left to right: Yvette relaxing in one of the tucked-away markets in San Telmo old town; the architecturally world-renowned Puente de la Mujer (“women’s bridge”) our gate to one of the many ecological parks; Yvette enjoying one of those world-class cocktails at Florería Atlántico; how we first tried to learn Tango, using this rather lovely stone guide outside an old Tango hotspot—don’t worry, we also got lessons!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The cookery class we picked was slightly more “for fun” than “for learning” this time around, which suited us extremely well. Sitting opposite us were two utterly lovely people who’d travelled all the way from Northern Ireland, and seemed as nervous as we did, wandering into an imposing room full of Spanish-speakers and impeccably dressed sous-chefs. They really needn’t have been…&lt;/p>
&lt;p>We introduced ourselves over a glass of &lt;em>divine&lt;/em> Argentinian wine, having immediately been put to enjoyable task making our own &lt;a href="https://en.wikipedia.org/wiki/Empanada" target="_blank">empanadas&lt;/a>, and preparing for the “extravagant empanada making competition” (for which, we were excitedly told, there were &lt;em>prizes&lt;/em>). They asked us how we met, and how our trip had been so far. We grinned our way through our &lt;a href="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/">engagement story&lt;/a> (we’re both still adoring describing our mountain-top engagement!) and, as their grins grew beyond vicariousness, we asked with suspicion: how had &lt;em>they&lt;/em> met? Never have I seen people forget about such delicious steak and light up at being invited to tell a story!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-3.jpg"
alt="Our utterly lovely neighbours for The Argentine Experience, pictured here with us after our class had made a serious dent in Argentina’s wine reserves."/>
&lt;figcaption>Our utterly lovely neighbours for The Argentine Experience, pictured here with us after our class had made a serious dent in Argentina’s wine reserves.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>It turns out they &lt;strong>met&lt;/strong> on a mountain. The &lt;em>biggest&lt;/em> mountain! He was (and still is) a marathon runner, and had been invited to attempt the world’s first &lt;a href="https://en.wikipedia.org/wiki/Everest_Marathon" target="_blank">Everest marathon&lt;/a>; she was the trip doctor, joining to make sure the brain-addling that I believe must be needed to attempt to run 26 miles even &lt;em>partially&lt;/em> up the world’s tallest peak didn’t consume them all whole. They met on the bus taking them up to the starting point the day before, him escaping the hectic interior of the bus for some sun-time on the roof, her pointing out how little ozone there was to protect a very white Irishman from the sun and offering to apply sunscreen!&lt;/p>
&lt;p>Though I've shamefully forgotten their names, I'll not soon forget how they've since both survived cancer, and &lt;a href="https://www.macmillan.org.uk/" target="_blank">MacMillan Cancer Support&lt;/a> continues to benefit from their medical skill and marathon fundraising; she has even received an MBE for her work there. If our marriage ends up being even half as adventurous and close as the one these two have clearly lived and breathed (for more than a quarter century!) I’ll be an extremely happy man.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-4.jpg"
alt="From left to right: Yvette looking stunning in the Jardín Botánico; the two of us enjoying a rest in one of Buenos Aires’ many parks; Yvette carefully avoiding walking through the middle of the Tori in the Jardín Japonés—practice to avoid angering the spirits in Japan!"/>
&lt;figcaption>From left to right: Yvette looking stunning in the Jardín Botánico; the two of us enjoying a rest in one of Buenos Aires’ many parks; Yvette carefully avoiding walking through the middle of the Tori in the Jardín Japonés—practice to avoid angering the spirits in Japan!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Our time spent not eating and drinking was filled with wonderful walks around the city, evenings of live music, and tours of the city’s history. The &amp;quot;eco[logical] park&amp;quot; and its surrounds gave us so much to enjoy; it is a once-upon-a-zoo, responsibly divesting itself of animals not from the region, and focusing instead on ecological education — a very worthy goal if you ask me. Just next door is the beautiful &lt;a href="https://en.wikipedia.org/wiki/Buenos_Aires_Botanical_Garden" target="_blank">botanical garden&lt;/a> (now 125 years old!), the planetarium (where I got to practice my Spanish using my astrophysics), and a prelude of what’s to come for us: the &lt;em>&lt;a href="https://en.wikipedia.org/wiki/Buenos_Aires_Japanese_Gardens" target="_blank">Jardín Japonés&lt;/a>&lt;/em>, a lovely homage to Japan's (horti)culture right in the centre of the city (we even got to practice our Japanese, すごい!)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-5.jpg"
alt="From left to right: The overwhelming Teatro Colón opera house, which could easily warrant its own blog post, with its world-best acoustics—I wish the season had started!; Yvette, Ravi, and I enjoying more delicious Argentinian wine; Yvette giving Buenos Aires’ oldest tree (a ~230 year old rubber tree) un gran abrazo."/>
&lt;figcaption>From left to right: The overwhelming Teatro Colón opera house, which could easily warrant its own blog post, with its world-best acoustics—I wish the season had started!; Yvette, Ravi, and I enjoying more delicious Argentinian wine; Yvette giving Buenos Aires’ oldest tree (a ~230 year old rubber tree) un gran abrazo.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Making friends is always such fun while travelling, especially as making one often means more. As we were heading out one evening Yvette made a lovely feline friend in Jaguar the cat (whose name is also a bilingual pun, good for hostels, as it’s pronounced in Spanish “How are [you]”). While she was petting Jaguar, Yvette also got to know Ravi, a once-upon-a naval engineer, now working in Vancouver(!) operating the district heating systems of downtown instead of the frigates that set out from Hong-Kong. We loved our evening with him at a beautiful theatre bar in the old town, San Telmo, and later at De los Cojones (a bar whose name translates weirdly well into English as “the dog’s bollocks” — though I sincerely hope the English never looked to dogs for what Spanish-speakers seem to revere in bulls!)&lt;/p>
&lt;p>I’m rambling again, but I’ve saved the best till last. A true pleasure for me, especially given how much we’ve tried and failed to find safe passage into Venezuela, I got to meet another branch of Yvette’s family. Cheryl, Yvette’s cousin, lives in Buenos Aires and made my visit so special both by putting up with my poor Spanish speaking, and by making me feel like part of the family as we put the world to rights over (yet another) delicious glass of Argentinian wine, and as she showed us the outstanding &lt;a href="https://en.wikipedia.org/wiki/Kirchner_Cultural_Centre" target="_blank">Kirchner cultural centre&lt;/a>. This (free!) museum/art gallery/expo-centre, enormous and beautiful, is a clear signpost of how deeply Buenos Aires cares about giving its people a creative voice. Despite its labyrinthine size, we managed to find a way to the roof — granting us all a view of the city we’d never seen, and even a look right across the river mouth to Uruguay.&lt;/p>
&lt;p>To Cheryl, Ravi, Jaguar, and all the folks who make Buenos Aires such a wonderful city, thank you!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/buenos-aires-eres-hermosa/img-6.jpg"
alt="JP, Cheryl, and Yvette grinning in the sun on the top of the Kirchner cultural centre."/>
&lt;/figure></content:encoded><dc:relation>https://adventure.awaits.us/buenos-aires-eres-hermosa</dc:relation></item><item><title>Get on your trekking shoes!</title><link>https://www.byjp.me/posts/adventure-awaits/get-on-your-trekking-shoes/</link><pubDate>Sat, 04 Feb 2023 15:44:56 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/get-on-your-trekking-shoes/</guid><description>Hiking in Patagonia — it's been incredible!</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/get-on-your-trekking-shoes/feature.jpg"/>
&lt;/figure>
So, Patagonia! What can I tell you? Everything you’ve heard about it is absolutely true: it is stunning, you’ll do loads of awesome trekking, you’ll taste delicious food and wine, and you’ll meet incredible people on every corner. There are, however, some special things you’ll only be able to discover when you get here. In this post I will try to share with you all the discoveries I made, as well as some memories that I will definitely cherish for the rest of my life (bear with me, I promise I’m not exaggerating!).&lt;/p>
&lt;p>We started our trekking trip doing the famous W circuit in &lt;strong>Torres del Paine National Park&lt;/strong> , in the Chilean Patagonia. Nothing less than the stunning &lt;em>Mirador base Torres&lt;/em> was our first challenge, and I had made up my mind from the start that no matter how hard it was going to be -and it was for me the most challenging trek of the whole W circuit, I was making it to the top.&lt;/p>
&lt;p>Why such determination, Yvette? Glad you asked! Because I had made a plan to propose to JP at the top. And lucky for me, he got very excited with the idea and said YESS!! I repeat: he.said.YES!! At this point, all the pain from sore muscles and blisters in my feet magically disappeared, and everything that looked beautiful on the way up was now looking gorgeous on our way down: the blueness of the river, the intense green of the trees, the smiley people, the cool suspension bridges, the sound of the wind blowing through the trees that sometimes mixed with the sound of the water going downstream… a dream!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/get-on-your-trekking-shoes/img-1.jpg"
alt="These are all pictures of our trek to Mirador Base Torre. From top left to bottom: the view of the river as we were going up, the two of us at the top after I popped the question, me crossing one of the suspension bridges, a picture I took of JP at the top that I really really like, my happy face on the way down, and one of the beautiful birds we spotted along the way."/>
&lt;figcaption>These are all pictures of our trek to Mirador Base Torre. From top left to bottom: the view of the river as we were going up, the two of us at the top after I popped the question, me crossing one of the suspension bridges, a picture I took of JP at the top that I really really like, my happy face on the way down, and one of the beautiful birds we spotted along the way.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Stuck inside a cloud, little by little we completed our 5 days of trekking as we had planned. We stayed at four amazing Refugios: Central, Cuernos, Paine Grande and Grey. They were all incredibly well organised, clean and full of like minded people enjoying the trekking experience. To me it felt a lot like being back at summer camp, with the added bonus of being able to buy beer - I absolutely loved it!&lt;/p>
&lt;p>With the adrenaline and the excitement of completing this incredible challenge together still running through our systems, we were ready to hit the road to get to El Calafate, in the Argentinean Patagonia. We started our adventure with a visit to &lt;strong>Perito Moreno Glacier&lt;/strong>. Unbelievable! Seeing this massive, millennial block of ice sitting majestically in front of us was definitely a humbling experience. I tried to see if we could find Scrat looking for its acorn, but no luck!&lt;/p>
&lt;p>Right after this, we headed up to El Chaltén, Argentina’s official Trekking Capital, for four more days of daily trekking. Hey, I did tell you to get on your trekking shoes, didn’t I? :)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/get-on-your-trekking-shoes/img-2.jpg"
alt="From top left: trying to fit in the whole Perito Moreno in a picture; us in front of El Chorrillo, a beautiful waterfall in El Chaltén; JP standing on a rock in front of El Chorrillo; stunning Laguna Capri and a rainbow at the back; us in our way to the windy glacier in Laguna Torre; and a picture of gorgeous Río las Vueltas."/>
&lt;figcaption>From top left: trying to fit in the whole Perito Moreno in a picture; us in front of El Chorrillo, a beautiful waterfall in El Chaltén; JP standing on a rock in front of El Chorrillo; stunning Laguna Capri and a rainbow at the back; us in our way to the windy glacier in Laguna Torre; and a picture of gorgeous Río las Vueltas.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>This time round we were able to do one day treks, which meant we came back to sleep at our hostel everyday, and most importantly: we only had to carry our lunch and water bottles on our way up the mountain. We were Ferraris! OMG we were so fast this time. I definitely recommend doing Torres del Paine first when planning your trip to Patagonia as this will give you the perfect training for the next treks to come -JP may not agree with me on this one as his knees were giving him a bit of a hard time after the W circuit.&lt;/p>
&lt;p>I have absolutely loved every minute of this non-stop trekking adventure. It has reminded me how much I miss trekking regularly. To give you an idea, I used to go trekking to &lt;a href="https://youtu.be/lyMgySRtJvg" target="_blank">Sabas Nieves in Caracas&lt;/a> almost every day! I’m definitely going to incorporate more trekking into my life, and I know JP is already keen for the same (if not, I’m not sure I can find any surprises as enjoyable as this one to give him at the top of every mountain to keep him excited! Haha).&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/get-on-your-trekking-shoes</dc:relation></item><item><title>Argentinian Patagonia</title><link>https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/</link><pubDate>Thu, 02 Feb 2023 16:39:20 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/</guid><description>Injured IT bands kept me from trekking in El Chaltén, but no complaints! From wild glaciers to windy peaks, Argentina is pure magic.</description><content:encoded>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/header.jpg"/>
&lt;/figure>
&lt;p>I've been stuck moderately immobile for a bit, while my &lt;a href="https://en.wikipedia.org/wiki/Iliotibial_band_syndrome" target="_blank">IT-bands&lt;/a> recover from so much hiking (and so little preparation!), so you’ve got another post from me, written mostly while Yvette enjoyed the hiking in “Argentina’s trekking capital” here in El Chálten. (Don’t pity me too much; the sky is throwing everything at poor Yvette as she scales the nearby peaks, and our hostel bar offers £1.20 (quarter litre!) glasses of excellent Argentinian wine with back-to-back bangers from &lt;em>Queen&lt;/em> on the radio—I'm having a great time!)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/el-chalten.jpg"
alt="The view across the Las Vueltas river basin, from the gentle waterfall walk we were able to take on our more injured days in El Chaltén."/>
&lt;figcaption>The view across the Las Vueltas river basin, from the gentle waterfall walk we were able to take on our more injured days in El Chaltén.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>First off, here in Argentina, I’ve found that &lt;em>everyone&lt;/em> we’ve chatted to (local, hiker, store clerk, backpacker, taxi driver…) has been welcoming, kind, and surprisingly generous with their time — even taking time to reply slowly in Spanish for folks like me, stumbling through their mother tongue like a drunken toddler. I would have thought this was “small town vibes” but folks here tell me it’s the same everywhere, Argentinians—and South Americans in general—are so frequently lovely it can’t be chance.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/jp-and-yvete.jpg"
alt="Left to right: JP at the beautiful Chorillo del Salto waterfall outside El Chalten; Yvette holding onto… everything in the face of blistering winds over Laguna Torre."/>
&lt;figcaption>Left to right: JP at the beautiful Chorillo del Salto waterfall outside El Chalten; Yvette holding onto… everything in the face of blistering winds over Laguna Torre.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>If the people have been superb, the landscapes here have been out of this world. I still dream of the cosy waterfall a short &amp;amp; flat walk from here, nestled into the rock with what feels like an oasis of green lapping up the glacial snowmelt. I could also write for days about the enormous beauty of the &lt;em>Perito Moreno&lt;/em> glacier in El Calafate, and the bittersweet privilege of being able to see one of the only glaciers in the world that's &lt;a href="https://www.nationalgeographic.com/travel/article/perito-moreno-glacier-collapse-video-argentina-patagonia-spd" target="_blank">still growing&lt;/a>.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/perito-moreno.jpg"
alt="The corner of the Perito Moreno glacier; the scale isn&amp;#39;t apparent until you notice the kayakers on the right of the photo… these towering ice blocks are taller than our apartment building!"/>
&lt;figcaption>The corner of the Perito Moreno glacier; the scale isn't apparent until you notice the kayakers on the right of the photo… these towering ice blocks are taller than our apartment building!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The biggest hike I managed in El Chaltén was along the &lt;em>Fitz Roy&lt;/em> river. I was so pleased to be able to get &lt;em>some&lt;/em> hiking done in this place so filled with opportunity for it! We took a 20km there-and-back route following the river to the &lt;em>Laguna Torre&lt;/em>, where the icy 100km/h winds scream down the glacier, and occasionally force you, grinning, to the ground with their sheer strength. Despite the low cloud, the views were incredible, and we adored every moment.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/laguna-torre-route.jpg"
alt="Our route from El Chaltén to Laguna Torre. We&amp;#39;ll have to come back to hike around Fitz Roy, just off the top of this map, as we weren&amp;#39;t able to fit it in around our injuries!"/>
&lt;figcaption>Our route from El Chaltén to Laguna Torre. We'll have to come back to hike around Fitz Roy, just off the top of this map, as we weren't able to fit it in around our injuries!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/laguna-torre.jpg"
alt="Left to right: the peak (of a still unnamed mountain, for us) emerges from the cloud with its extremely icy summit; JP and Yvette find a moment of calm in the winds for a selfie across Laguna Torre towards the glacier."/>
&lt;figcaption>Left to right: the peak (of a still unnamed mountain, for us) emerges from the cloud with its extremely icy summit; JP and Yvette find a moment of calm in the winds for a selfie across Laguna Torre towards the glacier.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Our return to El Calafate (named for the tasty calafate fruit, very similar to &lt;a href="https://en.wikipedia.org/wiki/Berberis" target="_blank">barberries&lt;/a> or maybe cranberries?) gave us time to relax and to stroll around the very calming &lt;em>Reserva Laguna Nimez&lt;/em>. It's an ecological reserve with incredible bird life on the shores of the enormous (and shockingly blue) &lt;em>Lago Argentino&lt;/em>. A strafing run from a low-flying &lt;a href="https://en.wikipedia.org/wiki/Chilean_flamingo" target="_blank">Chilean Flamingo&lt;/a>, and a pair of &lt;a href="https://en.wikipedia.org/wiki/Cinereous_harrier" target="_blank">Cinereous Harriers&lt;/a> so close we could have touched them, were absolutely highlights (especially as we’ve become accidental birders while we’ve been here—&lt;a href="https://merlin.allaboutbirds.org/" target="_blank">Merlin&lt;/a> has made it so easy to learn and identify them!)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/argentinan-patagonia/el-calafate.jpg"
alt="From left to right: JP as an ecological warden; we pose in central El Calafate in font of the city sign and… Christmas tree‽; Yvette adoring a windy-but-wonderful walk through the bird reserve."/>
&lt;figcaption>From left to right: JP as an ecological warden; we pose in central El Calafate in font of the city sign and… Christmas tree‽; Yvette adoring a windy-but-wonderful walk through the bird reserve.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Anyway; it may be a rainy day, but I’m going to go exploring! I’m still stuck in disbelief that it’s already been a month, but somehow also that it’s &lt;em>only&lt;/em> been a month…&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/argentinan-patagonia</dc:relation></item><item><title>A Patagonian love story</title><link>https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/</link><pubDate>Sun, 22 Jan 2023 09:09:42 -0300</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/</guid><description>Exciting times as we hike the W, and visit Torres del Paine.</description><content:encoded>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/header.webp"
alt="The three stunning spires of Torres del Paine,standing in front of the lagoon on top of the mountain."/>
&lt;figcaption>Torres del Paine&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>A day or two before arriving in Patagonia I started looking at reviews of the “W” circuit hike that is one of the star attractions of the region. It’s a 70km hike with two 1km high viewpoints to reach, that we were planning to complete over 5 days (and 4 nights staying in well tended hostels, or &lt;em>refugios&lt;/em>), so getting some advice from those before us seemed prudent at the least!&lt;/p>
&lt;p>One review stood out to me: “Completing this trek was one of the best experiences of my life”, said Helen from Minnesota. As much as I do it myself, I do tend to roll my eyes at hyperbole — sure Torres del Paine is world-class beautiful, and I know how far people travel from around the world to walk the “W” and the “O” circuits, but… of a &lt;em>life?&lt;/em>&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/the-w-route.webp"
alt="This is the route we walked, from right to left. You can see why it&amp;#39;s called the &amp;quot;W&amp;quot;! (I forgot to turn on the tracking for the first half hour of day 3!)"/>
&lt;figcaption>This is the route we walked, from right to left. You can see why it's called the &amp;quot;W&amp;quot;! (I forgot to turn on the tracking for the first half hour of day 3!)&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Well, my Minnesotan friend, how right you were! Not only was every moment of the hike eye-wateringly beautiful but also, at the practically divine peak of &lt;em>Mirador Base las Torres&lt;/em>, Yvette proposed to me! “Adventure awaits, mi amor”, the engraving in the compass said, as the needle swung to point directly at her, “and I would love you to be part of all my adventures to come… Will you marry me?”&lt;/p>
&lt;p>Any of you who’ve hung out with us will know there was only ever going to be one answer to that question, but saying “yes” in such a majestic space was even more a privilege and joy.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/engagement-compass.webp"
alt="The two of us cuddling in front of the engraved inside of my new engagement compass, it reads &amp;#34;And I would love you to be part of all my adventures to come… Will you marry me? ❤️&amp;#34;"/>
&lt;figcaption>The magical engagement compass&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>That first day was beautiful even before the summit — neither the spitting rain (nor Yvette’s nerves, it seems) could stop our ear-to-ear grins. The final rock-scramble to the top was definitely a tricky one (my &lt;a href="https://en.wikipedia.org/wiki/Iliotibial_tract" target="_blank">IT-bands&lt;/a> are still complaining), but that moment where the three towers rose above the eerie other-worldly terrain still glows within me.&lt;/p>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/first-day.webp"
alt="Day 1, from left to right: Yvette at the river at Refugio Chileno; that same river coming down the valley towards the &amp;quot;Windy Pass&amp;quot;; the two of us looking very happy with ourselves as a newly engaged couple at the Mirador Base las Torres; one of the many waterfalls that refreshed us enough to make the hike; our surprisingly excellent dinner at Refugio Central."/>
&lt;figcaption>Day 1, from left to right: Yvette at the river at &lt;em>Refugio Chileno&lt;/em>; that same river coming down the valley towards the &amp;quot;Windy Pass&amp;quot;; the two of us looking very happy with ourselves as a newly engaged couple at the &lt;em>Mirador Base las Torres&lt;/em>; one of the many waterfalls that refreshed us enough to make the hike; our surprisingly excellent dinner at &lt;em>Refugio Central&lt;/em>.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>With such a momentous first summit you might think that we barely noticed the rest of our 5 day hike, but Torres del Paine continued to show us its most beautiful side. The weather only improved and, on the second day alone, gave us bird-filled hikes along pebbly beaches, long (and very well maintained) rope and plank bridges across raging snowmelt rivers, and wonderful &lt;em>refugios&lt;/em> (hostel refuges) filled with surprisingly good food, reasonably priced beer, and the most lovely hikers from around the globe. (We learned a great Israeli card game called “Yaniv”, taught to us by new Dutch friends — the kind of combination you’ll only get while backpacking!)&lt;/p>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/middle-days.webp"
alt="Days 2 &amp;amp; 3, from left to right: Yvette hiking the pleasantly wandering path to Refugio Cuernos; the beautiful glacial lakeside views nearing Refugio Cuernos; Yvette donning my &amp;#39;marmalade&amp;#39; down jacket as we cool down (with a beer) post-hike at Cuernos; the rather unstable long and rocky downward route from Cuernos onwards; the two of us waving a fond good-riddance to Miradors Frances and Británico (on the right of the valley)"/>
&lt;figcaption>Days 2 &amp;amp; 3, from left to right: Yvette hiking the pleasantly wandering path to &lt;em>Refugio Cuernos&lt;/em>; the beautiful glacial lakeside views nearing &lt;em>Refugio Cuernos&lt;/em>; Yvette donning my 'marmalade' down jacket as we cool down (with a beer) post-hike at &lt;em>Cuernos&lt;/em>; the rather unstable long and rocky downward route from Cuernos onwards; the two of us waving a fond good-riddance to &lt;em>Miradors Frances&lt;/em> and &lt;em>Británico&lt;/em> (on the right of the valley)&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Day three was a little more challenging for me, especially after my mistake of not stretching down on day 1 with all the celebrations! The 1km high &lt;em>Mirador Británico&lt;/em> (the British viewpoint, hilariously just a little higher up the path from the &lt;em>Mirador Frances&lt;/em>) was rather daunting — that 1,042m climb, the rock-scrabble down, and the 8km onward hike put a very long day between us and our next &lt;del>refugio&lt;/del> beer…&lt;/p>
&lt;p>We made it most of the way to the &lt;em>Mirador Frances&lt;/em>, but at the point my knees were causing stops every 5 minutes, Yvette—travelling on a French passport—proudly proclaimed that “this spot looks very French to me”, which was all the excuse I needed!&lt;/p>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/last-days.webp"
alt="Days 4 &amp;amp; 5, from left to right: Post-hike beers at Refugio Paine Grande preparing for the final stages; fields of beautiful orchids hidden from the wind on the Western fork of the &amp;quot;W&amp;quot;; early morning near Refugio Grey, the two of us (and a tiny moon) on the chilly glacial beach at our North-most point; the unexpectedly hot final hike, we&amp;#39;d left as much baggage as possible at Paine Grande, time for improvised hats; finito! Cuernos spearing the sky behind Yvette, who grins at the thought of a celebratory beer hunt."/>
&lt;figcaption>Days 4 &amp;amp; 5, from left to right: Post-hike beers at &lt;em>Refugio Paine Grande&lt;/em> preparing for the final stages; fields of beautiful orchids hidden from the wind on the Western fork of the &amp;quot;W&amp;quot;; early morning near &lt;em>Refugio Grey&lt;/em>, the two of us (and a tiny moon) on the chilly glacial beach at our North-most point; the unexpectedly hot final hike, we'd left as much baggage as possible at &lt;em>Paine Grande&lt;/em>, time for improvised hats; finito! &lt;em>Cuernos&lt;/em> spearing the sky behind Yvette, who grins at the thought of a celebratory beer hunt.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>The journey to &lt;em>Refugio Grey&lt;/em>, the last of our hiking pit-stops, was as beautiful as the refuge was comfortable. Whole hillsides of fuscia orchids, brazen &lt;em>&lt;a href="https://en.wikipedia.org/wiki/Chimango_caracara" target="_blank">Chimango Caracara&lt;/a>&lt;/em> and other wonderful wildlife preening just off the path, with the enormous glacier always poised at the end of the Lake Grey — it made the 30º sun and 65km/h winds &lt;em>enjoyable&lt;/em>, not just worth tolerating!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/the-glacier.webp"
alt="The view from Mirador Grey out towards Refugio Grey and the glacier, which is part of a single 1,495km² icefield that spans most of Southern Chile and Argentina."/>
&lt;figcaption>The view from &lt;em>Mirador Grey&lt;/em> out towards &lt;em>Refugio Grey&lt;/em> and the glacier, which is part of a single 1,495km² icefield that spans most of Southern Chile and Argentina.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Wow, I’ve rambled on almost longer than our hike! Suffice to say that you should immediately plan your trip to Patagonia’s beautiful &lt;em>Torres del Paine&lt;/em>, it’s the hike of a lifetime &lt;em>even if&lt;/em> you don’t have a wonderful human craftily planning its next thrilling chapter.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/a-patagonian-love-story/the-happy-couple.webp"
alt="The new bride-and-groom-to-be!"/>
&lt;figcaption>The new bride-and-groom-to-be!&lt;/p>
&lt;/figcaption>
&lt;/figure></content:encoded><dc:relation>https://adventure.awaits.us/a-patagonian-love-story/</dc:relation></item><item><title>Cartagena, ¡la fantástica!</title><link>https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/</link><pubDate>Tue, 10 Jan 2023 22:04:03 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/</guid><description>Cartagena nos recibió con sus vibrantes calles, historia fascinante y rincones como Blue Apple Beach, donde sostenibilidad y comunidad van de la mano.</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/feature.jpg"/>
&lt;/figure>
🇬🇧 &lt;a href="#en-GB">&lt;em>See below for an English translation!&lt;/em>&lt;/a>&lt;/p>
&lt;p>¿Se acuerdan que comenté que me puse como meta hacer que JP posteara algo en español? Bueno, logré convencerlo de traducir mis posts. Con esto no solo se me hace más fácil escribir a mí, también empieza a practicar él - a veces, me sorprende mi astucia.&lt;/p>
&lt;p>Ahora bien, hablemos de Cartagena: Wow, ¡cuánto orgullo! Volver a caminar por las calles de su ciudad amurallada con sus fachadas de colores vibrantes, llenas de flores que las adornan a lo largo de todo el año - una de las ventajas de no tener un invierno tan marcado. Entrar en sus casas con esos patios internos preciosos, llenos de plantas tropicales, que ahora sirven de espacio para restaurantes y bares increíbles - Alquímico, el bar número 10 del mundo ¡está allí! Caminar por sus calles donde cualquier local te responde a cualquier pregunta con una sonrisa y con un &lt;em>“con mucho gusto”&lt;/em>.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-1.jpg"
alt="Un par de fachadas. Una con un JP al frente."/>
&lt;figcaption>Un par de fachadas. Una con un JP al frente.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Históricamente, Cartagena siempre fue un puerto de vital importancia para transportar oro hacia Europa, con lo que, constantemente era atacada por fuerzas extranjeras. ¿Tal vez les suene de algo la batalla de Jenkins’ Ear de 1741? ¿O a lo mejor les suena más el nombre de “Blas de Lezo”? Bueno, como no quiero hacer de esto un artículo de Wikipedia, solo les voy a adelantar que JP no estaba muy contento cuando conoció la historia contada desde la perspectiva Colombo-Española (aquí les dejo &lt;a href="https://es.wikipedia.org/wiki/Blas_de_Lezo" target="_blank">el artículo de Wikipedia&lt;/a>. Lean un poquito y entenderán por qué, jaja).&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-2.jpg"
alt="Una imagen del Fuerte de San Felipe de Barajas, donde hay una estatua de Blas de Lezo"/>
&lt;figcaption>Una imagen del Fuerte de San Felipe de Barajas, donde hay una estatua de Blas de Lezo&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Y como no solo vinimos a aprender historia, aprovechamos de pasar un día en uno de los fabulosos clubes de playa que se encuentran a media hora en bote desde Cartagena, ¡el único con &lt;a href="https://www.bcorporation.net/en-us/certification" target="_blank">certificación de B Corporation&lt;/a>! Se llama &lt;a href="https://www.blueapplebeach.com/" target="_blank">Blue Apple Beach&lt;/a>, y por favor, no dejen de ir si vienen a Cartagena. Una de las cosas que más me sorprendió fue ver que lograron que Corona - sí, la cerveza mexicana - construyera un taller allí dentro de sus instalaciones, para crear un espacio seguro donde 6 señoras de bajos recursos pueden trabajar, aprender y vender sus artesanías.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-3.jpg"
alt="Aquí les dejo una foto de la piscina de Blue Apple Beach y el mensaje en la pared del taller de las señoras"/>
&lt;figcaption>Aquí les dejo una foto de la piscina de Blue Apple Beach y el mensaje en la pared del taller de las señoras&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>¡Qué ganas tengo ya de volver a seguir viendo a esta ciudad crecer!&lt;/p>
&lt;hr>
&lt;p>&lt;a name="en-GB">&lt;/a>🇬🇧 &lt;em>And now JP's English translation!&lt;/em>&lt;/p>
&lt;p>Do you remember my promise to make JP post here in Spanish? Well, I managed to convince him to translate my posts. This not only makes it easier for me to write, but also lets him practice — sometimes I’m surprised by my own cunning!&lt;/p>
&lt;p>Now, let’s talk about Cartagena: Wow, I’m so proud! To walk again through the streets of this beautiful walled city, building façades so vibrantly coloured, full of flowers adorning them all year round — one of the perks of not having such a hard winter. Entering its houses with their beautiful internal patios, full of tropical plants, that make these incredible restaurants and bars such welcoming places; &lt;em>Alquímico&lt;/em>, the 10th best bar in the world, it’s right here! Walking through its streets, where every local will reply to every question with a &lt;em>“con mucho gusto”&lt;/em> — “with my pleasure.”&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-1.jpg"
alt="A few of these beautiful façades, one with a JP in front!"/>
&lt;figcaption>A few of these beautiful façades, one with a JP in front!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Historically, Cartagena has always been a port of critical importance for transporting gold back to Europe, because of that, it was constantly attacked by invaders. Are you familiar with the name &lt;em>Blas de Lezo&lt;/em>? Or perhaps more familiar with the Battle of Jenkins’ Ear of 1741? Well, since I don’t want to make this a Wikipedia article, suffice to say that JP wasn’t very happy when he learned the story told from the Colombo-Spanish perspective… (if you read a little&lt;a href="https://en.wikipedia.org/wiki/Blas_de_Lezo" target="_blank">of the Wikipedia article&lt;/a> you’ll understand why, haha!)&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-2.jpg"
alt="A photo of the Fort of San Felipe de Barajas, where there&amp;#39;s a statue of Blas de Lezo."/>
&lt;figcaption>A photo of the Fort of San Felipe de Barajas, where there's a statue of Blas de Lezo.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>And because we didn’t only come here for a history lesson, we took the opportunity to spend a day at a fabulous beach club only 30 minutes speedboat ride from Cartagena. It’s the only one with &lt;a href="https://www.bcorporation.net/en-us/certification" target="_blank">B-Corp certification&lt;/a>! It’s called Blue Apple Beach — please &lt;a href="https://www.blueapplebeach.com/" target="_blank">go there&lt;/a> if you’re visiting Cartagena. One of the most surprising things was that they managed to get Corona — yes, the Mexican beer — to build a workshop where “…six local women have a safe space to work, learn, and sell the products they make by hand.”&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena-la-fant/img-3.jpg"
alt="Left: a photo of the pool at Blue Apple Beach, right: The message posted on the wall of the ladies&amp;#39; workshop"/>
&lt;figcaption>Left: a photo of the pool at Blue Apple Beach, right: The message posted on the wall of the ladies' workshop&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>I can’t wait to come back and see again how this city keeps growing!&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/cartagena-la-fant</dc:relation></item><item><title>An aerial Pacific sunset</title><link>https://www.byjp.me/posts/adventure-awaits/an-aerial-pacific-sunset/</link><pubDate>Mon, 09 Jan 2023 13:58:51 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/an-aerial-pacific-sunset/</guid><description>We saw a breathtaking Pacific sunset from 12,500m, where the horizon blazed ruby red and sky turned into an earth-sized rainbow. Unforgettable!</description><content:encoded>
&lt;p>We were graced with a rare treat on the flight South to Santiago de Chile; being in the West-facing window seats for a &lt;em>stunning&lt;/em> sunset over the Pacific.&lt;/p>
&lt;p>If you’ll forgive my inner physicist a moment; being 12,500m up means the sun can get &lt;em>even lower&lt;/em> below the horizon and still be visible, with more of our atmosphere even further refracting our local star’s white light up through and onto the sky.&lt;/p>
&lt;p>The upshot? Our setting sun grows to almost fill the horizon through our little porthole. It burns the deepest ruby red, the thin slice between endless cloud and blackest space becomes, in every direction, a vibrant earth-sized rainbow, with an electrifying ultraviolet stripe holding back the stars.&lt;/p>
&lt;p>Can you tell I’m moved? I’d share a picture with you but, no word of a lie, these intensities and frequencies of light &lt;em>just can’t be captured&lt;/em>, or displayed, by anything short of custom or laboratory photographic equipment. Instead, here’s a lovely picture of a sleepy Yvette, from just before the sky dazzled us.&lt;/p>
&lt;p>&lt;img src="https://www.byjp.me/posts/adventure-awaits/an-aerial-pacific-sunset/yvette-sunset.jpg" alt="Yvette, smiling at the camera in front of the plane window and the sunset at 12,500m">&lt;/p>
&lt;p>After a very long day of travel this gorgeous sunset was quite literally, and only, a sight for sore eyes.&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/an-aerial-pacific-sunset</dc:relation></item><item><title>Cartagena soleada</title><link>https://www.byjp.me/posts/adventure-awaits/cartagena/</link><pubDate>Sun, 08 Jan 2023 17:20:43 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/cartagena/</guid><description>Our trip starts with luxury we can't expect from the rest of it; everything is wonderful here — especially the Caribbean food! 🤤</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena/feature.jpg"/>
&lt;/figure>
¡Guao, que tan gloriosa es Colombia! We've had an absolutely stunning start to our backpacking holiday — so good, in fact, that you'd be hard pressed to call it anything but luxurious!&lt;/p>
&lt;p>So far as I can tell there are three reasons for this; the weather is &lt;em>perfection&lt;/em> (always sunny, but a constant offshore breeze), the exchange rate is very much in our favour, and the abundance of Caribbean fruits, cooking, and food of all kinds makes even thrown-together meals a whirlwind of deliciousness.&lt;/p>
&lt;p>It's my ambition to head to a cookery class in each of the countries we go to, for making friends over food, and learning a little more about the culture. Cartagena's own &lt;em>Lunático Cooking Studio&lt;/em> couldn't have been more what we were looking for!&lt;/p>
&lt;p>We started our &lt;em>Lunático&lt;/em> experience early, visiting the city's &lt;em>enormous&lt;/em> fresh produce market (4 street blocks square!) with our chef-to-be, and tasted every fruit and veg we could find. There were probably 20 I'd never seen before (and I have a love for trying new fruit when I travel), and even the ones I know from home had a richness of flavour that apparently only Carribean sun can provide — papaya will never be the same again.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena/img-2.jpg"
alt="Chef Andres shows us the Granadilla fruit at a market stall."/>
&lt;figcaption>These 'Granadilla' fruit look similar to passion fruit, but they're sweet, not sour at all, and you eat them by cracking a hole like a hard boiled egg, then sucking out the deliciousness!&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Those few hours of market wandering with new friends went by in a flash, and the hours of cooking class with them — learning just how sweet the Cartagenan tooth is! — were as delicious as they were fun. We had time for three courses; stunning Colombian ceviche made with a vegan banana emulsion/mayonnaise, a taro &amp;amp; cheese soup called &lt;em>Mote de queso&lt;/em>, and the most Colombian of combinations: &lt;em>Posta negra&lt;/em> (blackened topside beef) and &lt;em>Arroz con coco&lt;/em> (coconut rice). That rice is moreish to an extreme — it uses caramelized coconut milk and cane sugar to make every bite drive you further into addiction. The recipe is at the bottom. 😜&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/cartagena/img-1.jpg"
alt="JP at the Lunático Cooking Studio, proud of his Ceviche, Yvette enjoying the warm breeze in the rooftop bar of Alquímico."/>
&lt;figcaption>JP at the Lunático Cooking Studio, proud of his Ceviche, Yvette enjoying the warm breeze in the rooftop bar of Alquímico.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>There's so much I could write about our 4 day stop in Cartagena (as I sit here in Bogota airport, waiting for our flight to Santiago de Chile), but the kind people and delicious food &amp;amp; drink stand apart. I'll leave you with another tale of deliciousness — the wonderful bar &lt;em>Alquímico.&lt;/em> Though we didn't know it at the time it's clear why it's currently the &lt;a href="https://www.worlds50bestbars.com/the-list/alquimico.html" target="_blank">10th best bar in the world&lt;/a>. These highly prized spots are given not just to amazing cocktail capabilities (and &lt;strong>wow&lt;/strong> they have those), but also for the unusual and inventive.&lt;/p>
&lt;p>&lt;em>Alquímico&lt;/em> is certainly unique in Cartagena, with its three tiered bar, each floor with a different menu and vibe. The speakeasy-esque ground floor was particularly fun; we made friends with a Swiss barman there for a holiday and research—what a job! We got chatting, and discovered his favourite bar in London is &lt;a href="https://www.barnightjar.com/" target="_blank">our beloved local&lt;/a>; so we'll certainly be visiting &lt;a href="https://instagram.com/manhattan_ge?igshid=YmMyMTA2M2Y=" target="_blank">his bar&lt;/a> if (when?) we visit Switzerland too.&lt;/p>
&lt;p>Folks, it's time you visited Colombia, and its jewel Cartagena. The flight from the UK is a little long but &lt;em>so&lt;/em> easy, and we'd definitely come back with you…&lt;/p>
&lt;hr>
&lt;h1 id="arroz-con-coco-brown-coconut-rice">Arroz con coco (Brown coconut rice)&lt;/h1>
&lt;p>Truly delicious sweeter rice with clear, but not overpowering, coconut overtones. This is a real South American treat, and very common in Cartagena!&lt;/p>
&lt;p>Source: Lunático Cooking Studio, Cartagena, Colombia&lt;br>
Servings: 4 people&lt;/p>
&lt;h2 id="ingredients">Ingredients&lt;/h2>
&lt;ul>
&lt;li>1 fresh coconut&lt;/li>
&lt;li>1 cup rice&lt;/li>
&lt;li>1/4 cup raisins (optional)&lt;/li>
&lt;li>2 tbsp panela (brown cane sugar; granulated will work)&lt;/li>
&lt;li>Salt, to taste&lt;/li>
&lt;/ul>
&lt;h2 id="instructions">Instructions&lt;/h2>
&lt;ol>
&lt;li>Start with the coconut. Identify the two “eyes” of the coconut: two small, round indentations on one of its sides. One of these eyes will be more tender than the other. Using a knife, poke a hole into the softer of the eyes. Using a flat-head screw driver that you pound with a mallet, open the other, harder eye. Pour out the coconut water into a bowl and reserve.&lt;/li>
&lt;li>Crack open the coconut by holding it on one hand (well above the table!) and hitting it with a thick stick (rolling pin works well) on its equator — you’ll likely need to bring your arm right back!&lt;/li>
&lt;li>Using a sharp knife, a flat head screw driver, or a spoon if you’re feeling as skilled as our chefs, separate and scrape out the white meat of the coconut. If the inner husk remains (a very thin brown layer) that’s fine.&lt;/li>
&lt;li>Cut the meat into 2-inch chunks and place in a blender with the reserved coconut water. Blend until the coconut is finely ground.&lt;/li>
&lt;li>Strain the pureed coconut mixture over a fine mesh strainer in a large bowl, pressing down with your fingers to make sure all of the liquid is squeezed out. This liquid is called the coconut’s “first milk.” Set it aside.&lt;/li>
&lt;li>Return the strained coconut solids to the blender along with 2 cups of fresh water. Blend until well mixed and repeat the straining process above over another bowl. This liquid is called the coconut’s “second milk” and it will be used to cook the rice. Set it aside. Discard the coconut solids.&lt;/li>
&lt;li>In a caldero or heavy bottomed pot over medium-high heat, bring the reserved first milk to a boil and add 1 tablespoon of sugar to help the caramelization.&lt;/li>
&lt;li>Reduce heat and allow to simmer, stirring occasionally, removing the milk that sticks to the sides of the pot. The milk will reduce, leaving behind solids. Allow the solids to brown slowly and caramelize. Keep stirring to make sure the solids don’t burn. Once they’ve reached a dark brown color (think the color of molasses) they’re ready.&lt;/li>
&lt;li>Add 2 cups of the reserved second milk. (If you don’t have enough second milk, add water to make the full 2 cups.) Wait until the caramel is dissolved in this water. Season it with salt to taste and introduce the rice.&lt;/li>
&lt;li>Increase the heat to medium high and bring the rice to a boil. When it starts drying, reduce heat to medium and continue boiling until most of the liquid has been absorbed and small craters form on the surface. Cover, reduce heat to low and cook for about 20 minutes, or until rice is cooked through. Fluff with a fork, cover and let rest for 10 minutes before serving.&lt;/li>
&lt;/ol></content:encoded><dc:relation>https://adventure.awaits.us/cartagena</dc:relation></item><item><title>¡Ya casi!</title><link>https://www.byjp.me/posts/adventure-awaits/ya-casi/</link><pubDate>Fri, 30 Dec 2022 15:03:00 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/ya-casi/</guid><description>The feeling has hit, we're going to be off soon!</description><content:encoded>
&lt;p>&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/ya-casi/feature.jpg"/>
&lt;/figure>
This is it! &lt;em>Ya casi&lt;/em> - almost there! Only 3 days to grab our backpacks and head to Heathrow to start this adventure. Well, maybe it will start as we walk out the door and try to juggle all the TfL strikes, but that just makes it more fun.&lt;/p>
&lt;p>We’ve been packing around the house to make space for the lovely couple of friends that are coming to live here while we are away. As I start to hear the echo of the empty spaces, it started to kick in: that familiar feeling of packing it all because you are moving out of the country. Except this time everything is only going to go to the other bedroom, I'm not packing alone and, and most importantly, I'm coming back home. Which also feels kind of weird, because the idea of going to South America &lt;em>feels&lt;/em> like going home, even though we are sadly skipping Venezuela on this trip.&lt;/p>
&lt;p>I am beyond excited about going back to the places I know and showing them to JP. I think this will help him understand a lot more about me, and I’m SO looking forward to seeing all those known places through his eyes. Also, I’m really looking forward to seeing him having to speak more Spanish to be able to go around - watch this space, I’ve made it a personal challenge to get him to post something in Spanish here!&lt;/p>
&lt;p>Oh! I’m Yvette, by the way, the other half of this team. I was born and brought up in Venezuela to a Colombian Mum, a French Dad, and later a French stepdad (yeah I know, my mum had something for the French). As I say to my friends, I'm a citizen of the world, I just change who I pay my taxes to, but South America will always be my first home I can't wait to be back!&lt;/p>
&lt;p>Well, I guess I ought to get back to packing with JP. Let the adventures begin!!&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/ya-casi</dc:relation></item><item><title>Preparations</title><link>https://www.byjp.me/posts/adventure-awaits/preparations/</link><pubDate>Tue, 29 Nov 2022 20:49:00 +0000</pubDate><guid>https://www.byjp.me/posts/adventure-awaits/preparations/</guid><description>I've just finished my ninth-last day at work before our sabbatical begins. And for the first time, our travels are starting to feel real.</description><content:encoded>
&lt;figure class="big">
&lt;img src="https://www.byjp.me/posts/adventure-awaits/preparations/header.webp"/>
&lt;/figure>
&lt;p>I've just finished my ninth-last day at work before our sabbatical begins. Nine isn't a special number, and nor was today unique except, for the first time, our travels are starting to feel &lt;em>real&lt;/em>.&lt;/p>
&lt;p>Maybe it was our weekend of fun with family, celebrating our 4th anniversary yesterday, or that the mountain of Things To Do™ has shrunk enough to let the light from our semi-nomadic future shine back into 2022 — whatever it is, something has clicked into place, and I can't stop grinning!&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/preparations/the-plan.webp"
alt="A world map showing the planned flights from London to Cartagena, then Santiago de Chile, Patagonia, Rio in Brazil; a gap, then Lima in Peru to Vancouver, Canada, and finally Tokyo, Japan."/>
&lt;figcaption>We're crossing quite a lot of timezones.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Along with the excitement we're also working through some disappointing realisations, in particular that we're not likely to be able to visit Yvette's family in Venezuela. The &lt;a href="https://www.gov.uk/foreign-travel-advice/venezuela" target="_blank">FCDO advises heavily against trips&lt;/a>, recommendations from friends in the country are cautious at best, and the USA's &lt;a href="https://www.reuters.com/article/us-venezuela-politics-airlines-idUSKCN1S733E" target="_blank">prohibition of flights&lt;/a> over Venezuela has even made finding ways into the country challenging. This is crushing for both of us; I'd love to see Christie again, and to meet so many of Yvette's family for the first time, but Venezuela's instability has kept Yvette away for the last eight years, and it's going to really suck being so close, and yet so far.&lt;/p>
&lt;p>We're investigating the possibility of staying in Aruba during February and offering a space for Yvette's family to visit us there, which might work out depending on how quickly the &lt;a href="https://www.state.gov/joint-statement-on-venezuela-negotiations-2/" target="_blank">USA's recent U-turn&lt;/a> changes travel options. Yes, we've had &lt;a href="https://song.link/s/5qHYXcVvc9xsFB2uH7GpMN" target="_blank">Kokomo&lt;/a> stuck in our heads and blasting from speakers for days.&lt;/p>
&lt;figure>
&lt;img src="https://www.byjp.me/posts/adventure-awaits/preparations/beach-boys-kokomo.webp"
alt="The Beach Boys sitting on in and around a yellow truck, on a beach with a surfboard."/>
&lt;figcaption>Don't start playing Kokomo, or even thinking about it. I promise it won't leave your brain.&lt;/p>
&lt;/figcaption>
&lt;/figure>
&lt;p>Our trip's project management software is seeing a lot of use, we've taken full advantage of the recent sales to get lightweight backpacks, and friends have put us in touch with a lovely couple who are going to look after our flat while we're away too. There are 34 days remaining. As I said, it's starting to feel &lt;em>real&lt;/em>!&lt;/p>
&lt;p>Here's to the last few, important steps of our planning, to the last days of work, and to spending Christmas with our family and friends here in the UK before we set off!&lt;/p></content:encoded><dc:relation>https://adventure.awaits.us/preparations/</dc:relation></item><item><title>The Fujifilm Repair Centre</title><link>https://www.byjp.me/posts/fujifilm-repair-centre/</link><enclosure url="https://www.byjp.me/posts/fujifilm-repair-centre/index.mp3" length="465030" type="audio/mpeg"/><pubDate>Sat, 29 Oct 2022 11:22:11 +0100</pubDate><guid>https://www.byjp.me/posts/fujifilm-repair-centre/</guid><description>I've been extremely impressed with Fujifilm's Service Centre! #review #photography</description><content:encoded>
&lt;p>I've been pleasantly astounded by the quality of &lt;a href="https://repairs.fujifilm.eu/en/fujifilm-repair-centre/?zr=uk" target="_blank">Fujifilm's Service Centre&lt;/a> here in the UK. Honestly, it's likely to keep me using Fujifilm cameras at least until they change it.&lt;/p>
&lt;p>I noticed a week back that my &lt;a href="https://fujifilm-x.com/global/products/cameras/x-t30-ii/" target="_blank">X-T30&lt;/a> wasn't turning on. I'm planning a trip, and this camera is 2 years old and out of warranty, so I knew I needed to suck it up and prepare for an expensive repair.&lt;/p>
&lt;p>&lt;a href="https://repairs.fujifilm.eu/en/pricing/?prodgroup=2" target="_blank">The pricing&lt;/a> is a little confusing without context, and you can't get much more information until you &lt;a href="https://repairs.fujifilm.eu/en/fujifilm-repair-centre/?zr=uk" target="_blank">register&lt;/a>, but after a phonecall I was impressed — and even more so now I have a repaired camera in my hands, not 6 working days later.&lt;/p>
&lt;p>Mostly this is because the stated price (£130 for an X-T30) covers &lt;em>everything&lt;/em>. Postage (and packaging) in both directions, a renewed 1 year waranty, and &lt;em>any and every problem you specify, or that they notice, repaired&lt;/em>. All with a stated round-trip time of 5-10 days (even faster if you want to spend an extra £10).&lt;/p>
&lt;p>I mentioned to them that my camera wouldn't turn on, and also that I'd foolishly managed to burn some of the overlay into the electronic viewfinder by leaving it on while in webcam mode. Both of which they've fixed, but they also seem to have replaced the back LCD which only had a few small scratches.&lt;/p>
&lt;p>Now, £130 isn't cheap by any stretch, and I'm sure this would be annoying if I had a minor/cheap repair to do, but I'm really appreciating the knowledge that if anything goes wrong with this camera there is a ceiling on what the repair will cost, and that the quality of the service is so high.&lt;/p>
&lt;p>Fujifilm, you've made a happy customer a loyal one. Good work!&lt;/p></content:encoded></item><item><title>Thoughts on Postcards</title><link>https://www.byjp.me/posts/thoughts-on-postcards/</link><enclosure url="https://www.byjp.me/posts/thoughts-on-postcards/index.mp3" length="403129" type="audio/mpeg"/><pubDate>Fri, 21 Oct 2022 09:50:19 +0100</pubDate><guid>https://www.byjp.me/posts/thoughts-on-postcards/</guid><description>A love-postcard to postcards. #postcards</description><content:encoded>
&lt;p>I've long admired and played with #postcards. For me there's an art to every aspect of creating and sending them — designing, choosing, writing, drawing, doodling, stamping — each of which could stand books' worth of elaboration.&lt;/p>
&lt;p>Art is, in my humble opinion, at its greatest when limitlessly exploring a limited space, and a postcards provide plenty of just this kind of freeing limitation. They can be heartfelt and genuine precisely &lt;em>because&lt;/em> they don't immediately invite a reply (unlike practically all other interpersonal communication), they invite novelty (like Mr. Bingo's hilarious &lt;a href="https://mr.bingo/hate-mail-book/" target="_blank">Hate Mail&lt;/a>, or Lupi &amp;amp; Posavec's beautiful &lt;a href="https://www.dear-data.com/theproject" target="_blank">Dear Data&lt;/a>) &lt;em>because&lt;/em> they are so simple and (literally!) inflexible.&lt;/p>
&lt;p>Even now I'm slowly building a microsite gallery&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> for the postcards my friend Claire sends me whenever she travels. Every one of them contains just one message: &amp;quot;Shut up, JP&amp;quot; in the local language. I love them.&lt;/p>
&lt;input type="checkbox" id="postcard-shutup-singapore">
&lt;label for="postcard-shutup-singapore">
&lt;div class="postcard flip-book landscape" style="--postcard: url('/posts/thoughts-on-postcards/shutup-singapore.webp'); --aspect-ratio: 2161 / 1505">
&lt;img src="shutup-singapore.webp" loading="lazy" alt="A photograph of Singapore&amp;#39;s concrete &amp;#39;supertrees&amp;#39; and walkway in the Gardens at the Bay." width="500px">
&lt;div class="shadow">&lt;/div>
&lt;/div>
&lt;/label>
&lt;p>I honestly think I'll always enjoy playing with postcards, in one form or another. If you'd ever like to tell me about your appreciation of them, a postcard you've seen or enjoyed receiving or sending, do reach out by email (I have a &lt;a href="https://www.byjp.me/standing-invitation">standing invitation&lt;/a>)! …and if you'd like to send me a postcard you only need write me an email and ask for my address.&lt;/p>
&lt;div class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1">
&lt;p>I completed it! You can find it at &lt;a href="https://shutup.jp" target="_blank">shutup.jp&lt;/a> 😄&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/div></content:encoded></item></channel></rss>