<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>OpenBenches &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/openbenches/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Mon, 06 Apr 2026 14:28:44 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>OpenBenches &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Android now stops you sharing your location in photos]]></title>
		<link>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/</link>
					<comments>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 13 Apr 2026 11:34:48 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[geotagging]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=70143</guid>

					<description><![CDATA[My wife and I run OpenBenches. It&#039;s a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo&#039;s metadata, so we use that information to put the photos on a map.  Google&#039;s Android has now broken that.  On the web, we used to use:  &#60;input type=&#34;file&#34; accept=&#34;image/jpeg&#34;&#62;   That opened the phone&#039;s photo picker…]]></description>
										<content:encoded><![CDATA[<p>My wife and I run <a href="https://openbenches.org">OpenBenches</a>. It's a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo's metadata, so we use that information to put the photos on a map.</p>

<p>Google's Android has now broken that.</p>

<p>On the web, we used to use:</p>

<pre><code class="language-html">&lt;input type="file" accept="image/jpeg"&gt;
</code></pre>

<p>That opened the phone's photo picker and let the use upload a geotagged photo. But a while ago Google deliberately broke that.</p>

<p>Instead, we were <a href="https://issuetracker.google.com/issues/243294058#comment27">encourage to use the <em>file</em> picker</a>:</p>

<pre><code class="language-html">&lt;input type="file"&gt;
</code></pre>

<p>That opened the default file manager. This had the unfortunate side-effect of allowing the user to upload <em>any</em> file, rather than just photos. But it did allow the EXIF metadata through unmolested.  <a href="https://issuetracker.google.com/issues/428397711">Then Google broke that as well</a>.</p>

<p>Using a "Progressive Web App" doesn't work either.</p>

<p>So, can users transfer their photos via Bluetooth or QuickShare? No. <a href="https://issuetracker.google.com/issues/485307531">That's now broken as well</a>.</p>

<p>You can't even directly share via email without the location being stripped away.</p>

<p>Literally the <em>only</em> way to get a photo with geolocation intact is to plug in a USB cable, copy the photo to your computer, and then upload it via a desktop web browser?</p>

<h2 id="why"><a href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#why">Why?!?!?</a></h2>

<p><del>Because Google run an anticompetitive monopoly on their dominant mobile operating system.</del></p>

<p>Privacy.</p>

<p>There's a worry that users don't know they're taking photos with geolocation enabled. If you post a cute picture of your kid / jewellery / pint then there's a risk that a ne’er-do-well could find your exact location.</p>

<p>Most social media services are sensible and strip the location automatically. If you try to send a geotagged photo to Facebook / Mastodon / BlueSky / WhatsApp / etc, they default to <em>not</em> showing the location. You can add it in manually if you want, but anyone downloading your photo won't see the geotag.</p>

<p>And, you know, I get it. Google doesn't want the headline "Stalkers found me, kidnapped my baby, and stole my wedding ring - how a little known Android feature puts you in danger!"</p>

<p>But it is just so <em>tiresome</em> that Google never consults their community. There was no advance notice of this change that I could find. Just a bunch of frustrated users in my inbox blaming me for breaking something.</p>

<p>I don't know what the answer is. Perhaps a pop up saying "This website wants to see the location of your photos. Yes / No / Always / Never"? People get tired of constant prompts and the wording will never be clear enough for most users.</p>

<p>It looks like the only option available will be to develop a native Android app (and an iOS one?!) with all the cost, effort, and admin that entails. Android apps have <a href="https://developer.android.com/training/data-storage/shared/media#location-media-captured">a special permission for accessing geolocation in images</a>.</p>

<p>If anyone has a <em>working</em> way to let Android web-browsers access the full geolocation EXIF metadata of photos uploaded on the web, please drop a comment in the box.</p>

<p>In the meantime, please leave a +1 on <a href="https://github.com/whatwg/html/issues/11724#issuecomment-4192228562">this HTML Spec comment</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70143&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/feed/</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches hits 40k]]></title>
		<link>https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/</link>
					<comments>https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 12:34:11 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=68382</guid>

					<description><![CDATA[Back in November 2023, our crowdsourced website of memorial benches reached 30,000 entries. At the start of March this year, I was delighted when long-time contributor jrbray1 added this gorgeous memorial, taking us up to 40,000 benches catalogued:    You can read more about Dr Judy John and her work on biodiversity.  Using the power of advanced machine learning, it is possible to plot the growth …]]></description>
										<content:encoded><![CDATA[<p>Back in November 2023, our crowdsourced website of memorial benches <a href="https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/">reached 30,000 entries</a>. At the start of March this year, I was delighted when long-time contributor <a href="https://openbenches.org/user/6143">jrbray1</a> added this gorgeous memorial, taking us up to 40,000 benches catalogued:</p>

<p><a href="https://openbenches.org/bench/41445"><img src="https://images.weserv.nl/?url=openbenches.org/image/5314d81bfd373fa32a1483643b7febea54b9e7df/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="In fond memory ofDr Judy JohnBotanistEver supportiveAdviser and Friend of these woods" width="600" height="270"></a></p>

<p>You can <a href="https://coneyhallvillagera.org/2026/02/23/in-memory-of-dr-judy-john/">read more about Dr Judy John</a> and her work on biodiversity.</p>

<p>Using the power of advanced machine learning, it is possible to plot the growth on an innovative form of data visualisation known as "a graph"!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/Bench-Graph.webp" alt="A graph with a fairly straight line going up from 0 benches in 2017 to 40000 benches in 2026." width="942" height="502" class="aligncenter size-full wp-image-68386">

<p>That's the sort of "number go up" that investors like to see. I reckon someone will come along to give us a bazillion dollarydoos any minute now.</p>

<p>For those of you who like text rather than graphics, here are our historic milestones:</p>

<ul>
<li>10K - December 2018</li>
<li>20K - August 2021</li>
<li>30K - November 2023</li>
<li>40K - March 2026</li>
<li>50k - ??? Probably September 2027 ???</li>
</ul>

<p>Tell you what, when we get to fifty-thousand, we'll throw a big party and you'll all be invited 🥳</p>

<p>If you spot a lovely memorial bench while you're out and about, please take a geotagged photo and upload it to <a href="https://OpenBenches.org">OpenBenches.org</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68382&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches at FOSDEM]]></title>
		<link>https://shkspr.mobi/blog/2026/02/openbenches-at-fosdem/</link>
					<comments>https://shkspr.mobi/blog/2026/02/openbenches-at-fosdem/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 21 Feb 2026 12:34:03 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[fosdem]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=67898</guid>

					<description><![CDATA[At the recent FOSDEM, I did a very quick lightning talk about our OpenBenches project.  Sadly, despite the best efforts of the AV team, the video had a missing section. I took my own audio recording and zipkid took some photos, so I was able to recreate it using the Flowblade video editor.  Enjoy!    Many thanks to Edward Betts for running the dev room and providing the display laptop. …]]></description>
										<content:encoded><![CDATA[<p>At the recent FOSDEM, I did a very <a href="https://fosdem.org/2026/schedule/event/TFFDM8-openbenches/">quick lightning talk about our OpenBenches project</a>.</p>

<p>Sadly, despite the best efforts of the AV team, the video had a missing section. I took my own audio recording and <a href="https://gts.solfood.be/@zipkid">zipkid</a> took some photos, so I was able to recreate it using the <a href="https://github.com/jliljebl/flowblade">Flowblade video editor</a>.</p>

<p>Enjoy!</p>

<iframe title="OpenBenches at FOSDEM - GeoSpatial Room" width="560" height="315" src="https://tube.tchncs.de/videos/embed/9gdpF7WEV9N1ign6nFFNuw" style="border: 0px;" allow="fullscreen" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>

<p>Many thanks to <a href="https://edwardbetts.com/">Edward Betts</a> for running the dev room and providing the display laptop.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67898&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/02/openbenches-at-fosdem/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The cost of running OpenBenches.org]]></title>
		<link>https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/</link>
					<comments>https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 03 Feb 2026 12:34:16 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[fosdem]]></category>
		<category><![CDATA[foss]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=67279</guid>

					<description><![CDATA[After my recent presentation at FOSDEM, someone asked a pretty reasonable question. What does it cost to run OpenBenches?  It is, thankfully, surprisingly cheap! In part, that&#039;s because it is a relatively simple tech stack - PHP, MySQL, a couple of API calls to external services. It was designed to be as low cost while also being useful. Here&#039;s the breakdown:  Hosting - £171 per year  Our biggest …]]></description>
										<content:encoded><![CDATA[<p>After my recent presentation at FOSDEM, someone asked a pretty reasonable question. What does it cost to run <a href="https://openbenches.org/">OpenBenches</a>?</p>

<p>It is, thankfully, surprisingly cheap! In part, that's because it is a relatively simple tech stack - PHP, MySQL, a couple of API calls to external services. It was designed to be as low cost while also being useful. Here's the breakdown:</p>

<h2 id="hosting-171-per-year"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#hosting-171-per-year">Hosting - £171 per year</a></h2>

<p>Our biggest expense but, I think, our most reasonable. <a href="https://krystal.io/hosting">Krystal</a> charges around £342 for a 2 year contract. That includes unlimited bandwidth and storage, as well as the domain name.  We have nearly 400GB of photos and bot scraping means we can use over 900GB of bandwidth per month - so Krystal give us a rather good deal!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/April-Bandwidth.webp" alt="Graph showing sudden spikes in data use as our bandwidth is consumed by bots." width="930" height="355" class="aligncenter size-full wp-image-67531">

<p>Use <a href="https://www.awin1.com/cread.php?s=3990878&amp;v=117205&amp;q=524267&amp;r=1062999">this affiliate link and code <code>EDENT</code></a> to get a small discount.</p>

<h2 id="stadia-maps-us20-month"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#stadia-maps-us20-month">Stadia Maps - US$20 / month</a></h2>

<p>Geocoding is surprisingly hard to do locally. We need to transform latitude and longitude into addresses, and then back again. <a href="https://stadiamaps.com/">Stadia Maps</a> cost about the same as our hosting! What's rather annoying is that we only use about half the API calls in our plan. We need to find a cheaper solution.</p>

<h2 id="mapping-free"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#mapping-free">Mapping - Free!</a></h2>

<p>When we used Stadia for drawing maps, we regularly ran over our quota. So we switched to <a href="https://openfreemap.org/">OpenFreeMap</a> which produces gorgeous interactive maps.</p>

<p>The service has been rock solid and very responsive to bugs on GitHub.</p>

<h2 id="logo-us5"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#logo-us5">Logo - US$5</a></h2>

<p>I'm not a good designer, so we bought a <a href="https://thenounproject.com/icon/park-923893/">logo from The Noun Project</a> and then coloured it in. Bargain for a fiver!</p>

<h2 id="image-cdn-free"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#image-cdn-free">Image CDN - Free!</a></h2>

<p>Although we have unlimited bandwidth with Krystal, we're only located in one region - the UK. <a href="https://images.weserv.nl/">WeServ</a>. It's also pointless serving full resolution images to small screens.</p>

<p>So WeServ offers free image resizing and global CDNs. Personally, I'm not a fan of CloudFlare (their CDN partner) so I'm looking to change provider.</p>

<h2 id="ocr-free"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#ocr-free">OCR - Free!</a></h2>

<p>People don't want to type in the inscription of the photo, so we use <a href="https://cloud.google.com/vision/docs/ocr">Google Cloud Vision</a>.</p>

<p>We send less than 1,000 requests per month - <a href="https://cloud.google.com/vision/pricing">so we're inside their free tier</a>. If we get more popular, that'll get more expensive. But I don't know of a local-first OCR which is as good as Google's. Sadly, Tesseract is rubbish for extracting text from photos.</p>

<h2 id="authentication-free"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#authentication-free">Authentication - Free!</a></h2>

<p>We don't want to store anyone's passwords. The <a href="https://auth0.com/pricing">free tier of Auth0</a> allows us to do social login for up to 25,000 monthly users. Which is more than enough for us.</p>

<p>Sadly, Auth0 don't support the Fediverse, <a href="https://shkspr.mobi/blog/2024/12/creating-a-generic-log-in-with-mastodon-service/">so I had to build my own "Log-in with Mastodon" service</a>.</p>

<p>As much as we'd like to run social login locally, we simply don't want to be responsible for securing users' details &amp; API keys.</p>

<h2 id="software-free"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#software-free">Software - Free!</a></h2>

<p>As per <a href="https://www.openbenches.org/colophon">the OpenBenches colophon</a> we use a lot of cool FOSS. Small JS libraries, big PHP frameworks, and everything in between.</p>

<h2 id="income"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#income">Income</a></h2>

<p>Thanks to <a href="https://github.com/sponsors/openbenches/">GitHub Sponsors</a> we make a whopping US$3 per month!</p>

<p>Similarly, our <a href="https://opencollective.com/openbenches">OpenCollective Sponsors</a> brings in about £3 per month.</p>

<p>Merchandising! You can <a href="https://openbenches.myspreadshop.co.uk/all">buy OpenBenches branded t-shirts, mugs, and hats</a>. That nets us about £20 per year</p>

<p>Call it roughly £80 income. OK, it is better than nothing - but doesn't even cover a quarter of our costs. Sometimes people give us a higher donation privately, which is also very welcome. These people are <a href="https://github.com/openbenches/openbenches.org?tab=readme-ov-file#supporters">listed on our README</a>.</p>

<h2 id="total"><a href="https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/#total">Total</a></h2>

<p>On the assumption that our time is worthless (ha!) and that we only rarely go over our providers' API limits, and we get in <em>some</em> revenue, the cost of running OpenBenches is less than £300 per year.</p>

<p>That's not bad for a fun little hobby. People certainly spend more than that on Funkopops, vaping, and mechanical keyboards!</p>

<p>Nevertheless, I'm always slightly worried that we'll go viral and have an unexpectedly high bill from our API providers.</p>

<p>I would love to be able to hire a proper designer to make the site look a bit nicer. I also want to be able to buy a modern iPhone so that I can test it in the latest Safari.</p>

<p>If you have any suggestions for cutting costs, or non-scummy ways to help us raise funds, please drop a comment below.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67279&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/02/the-cost-of-running-openbenches-org/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Why do people leave comments on OpenBenches?]]></title>
		<link>https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/</link>
					<comments>https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 20 Dec 2025 12:34:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64154</guid>

					<description><![CDATA[I&#039;m still a believer in the promise of Web 2.0. The idea that giving people a curated space to chat produces tiny sparks of magic.  My wife Liz and I have been running the OpenBenches project for about 8 years - it&#039;s a crowd-sourced repository of memorial benches. People take a geotagged photo of a bench&#039;s plaque, upload it to our site, and we share it with the world.  Might sound a bit niche,…]]></description>
										<content:encoded><![CDATA[<p>I'm still a believer in the promise of Web 2.0. The idea that giving people a curated space to chat produces tiny sparks of magic.</p>

<p>My wife Liz and I have been running the <a href="https://openbenches.org">OpenBenches project</a> for about 8 years - it's a crowd-sourced repository of memorial benches. People take a geotagged photo of a bench's plaque, upload it to our site, and we share it with the world.  Might sound a bit niche, but we have around thirty-nine <em>thousand</em> benches catalogued from all over the world.</p>

<p>From the start, we had a comment form under each bench. Of course, we pre-moderate any comments. That <a href="https://www.openbenches.org/blog/online-safety-act/">helps with our Online Safety Act obligations</a> and prevents spam from being published. We don't collect any personal data, to reduce our GDPR exposure. Our comments are self-hosted using the excellent <a href="https://commentics.com/">Commentics</a> - which means we don't send people's data off to a 3rd party.</p>

<p>We <em>thought</em> that this would be used to tell us that an inscription was wrong, or if a bench had moved, or something like that.</p>

<p>We were completely wrong!</p>

<p>People use OpenBenches comments for all sorts of things. Of course, there are a few which provide details about the bench itself:</p>

<p><a href="https://openbenches.org/bench/33640"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/removed.webp" alt="This bench was removed after the river flooded and majorly eroded the bank earlier this year (spring 2025), and now two new benches are in approximately the same place but a little further back from the river." width="1248" height="402" class="aligncenter size-full wp-image-64159"></a></p>

<p>Other provide a little context about the person:
<a href="https://openbenches.org/bench/38738"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/info.webp" alt="
She competed under her birth name, Zsuzsa Nádor:
https://en.wikipedia.org/wiki/Zsuzsa_Nádor
There's a Wikipedia article about Roman, too:
https://en.wikipedia.org/wiki/Roman_Halter" width="1248" height="402" class="aligncenter size-full wp-image-64161"></a></p>

<p>But those sorts of comments are hardly the majority.  The comments break down (roughly) into these categories:</p>

<h2 id="i-want-to-know-more-about-this-person"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#i-want-to-know-more-about-this-person">I want to know more about this person</a></h2>

<p><a href="https://openbenches.org/bench/3225"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/grandson.webp" alt="I am the grandson of Janet Constance Hardie, who had a sister Ethel Hardie. Ethel Hardie married Harry Macinnes and then died in 1961. Ethel and Harry had a daughter named Ethel Elvery Macinnes. Is the Ethel Hardie, who is remembered on this bench related to the above Hardies of my family ? Best Regards, Neil Rowlandson" width="1248" height="582" class="aligncenter size-full wp-image-64163"></a></p>

<h2 id="i-sat-on-this-bench-searched-for-the-inscription-and-found-this-site-i-want-to-share-my-feelings"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#i-sat-on-this-bench-searched-for-the-inscription-and-found-this-site-i-want-to-share-my-feelings">I sat on this bench, searched for the inscription and found this site. I want to share my feelings</a></h2>

<p><a href="https://openbenches.org/bench/13312"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/devon.webp" alt="Sounds like she was an inspirational woman. Clearly gone to soon. Sat on her bench today whilst visiting from Devon." width="1248" height="282" class="aligncenter size-full wp-image-64164"></a></p>

<h2 id="thank-you-for-putting-a-bench-here"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#thank-you-for-putting-a-bench-here">Thank you for putting a bench here</a></h2>

<p><a href="https://openbenches.org/bench/38259"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/peace.webp" alt="A peaceful spot on the banks of the river Orwell. Thanks for those that funded it." width="1248" height="222" class="aligncenter size-full wp-image-64165"></a></p>

<h2 id="this-has-moved-me"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#this-has-moved-me">This has moved me</a></h2>

<p><a href="https://openbenches.org/bench/37741"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/amy.webp" alt="I'm sat on the bench now i didn't know the lady but so sad to pass at such a young age by what i have found on the internet she was liked loved and respected my thoughts with all the family even though it's been almost 4 years since her I'm sure she will never be forgotten. Someone has placed a bunch of yellow flowers on the bench that is what first made me stop and look RIP Amy" width="1248" height="642" class="aligncenter size-full wp-image-64166"></a></p>

<h2 id="my-heart-has-broken"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#my-heart-has-broken">My heart has broken</a></h2>

<p><a href="https://openbenches.org/bench/39228"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/miss.webp" alt="I love you. I miss you. I so long to see you." width="1248" height="224" class="aligncenter size-full wp-image-64167"></a></p>

<h2 id="i-cant-visit-this-bench-but-im-glad-someone-has-shared-a-photo"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#i-cant-visit-this-bench-but-im-glad-someone-has-shared-a-photo">I can't visit this bench, but I'm glad someone has shared a photo</a></h2>

<p><a href="https://openbenches.org/bench/13023"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/mary.webp" alt="Mary was my best friend, from primary school until she died. I have not visited her bench but hope those who sit there in that beautiful place will also have experienced wonderful friendships as I did." width="1248" height="402" class="aligncenter size-full wp-image-64170"></a></p>

<h2 id="thank-you-for-adding-a-photo"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#thank-you-for-adding-a-photo">Thank you for adding a photo</a></h2>

<p><a href="https://openbenches.org/bench/26373"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/thanks.webp" alt="This is my father’s memorial bench on half penny pier thank you to the person who took the photos x" width="1248" height="282" class="aligncenter size-full wp-image-64169"></a></p>

<h2 id="i-dont-know-the-person-this-bench-commemorates-but-i-want-to-let-them-know-theyre-still-loved-and-remembered"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#i-dont-know-the-person-this-bench-commemorates-but-i-want-to-let-them-know-theyre-still-loved-and-remembered">I don't know the person this bench commemorates, but I want to let them know they're still loved and remembered</a></h2>

<p><a href="https://openbenches.org/bench/35294"><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/mum.webp" alt="My mum and her girlfriends sat on the bench today and told your father stories about how they were visiting this place many decades ago. They hope your father was listening. All the best to you" width="1248" height="402" class="aligncenter size-full wp-image-64171"></a></p>

<h2 id="thats-nice"><a href="https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/#thats-nice">That's nice</a></h2>

<p>Hundreds of people sharing connections. Wanting to express their feelings. Understanding the terrible pain of loss and the hope that, someday, someone will think fondly of us.</p>

<p>You can <a href="https://openbenches.org/comments">view all the comments on OpenBenches.org</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64154&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/12/why-do-people-leave-comments-on-openbenches/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches 💖 OpenStreetMap]]></title>
		<link>https://shkspr.mobi/blog/2025/11/openbenches-%f0%9f%92%96-openstreetmap/</link>
					<comments>https://shkspr.mobi/blog/2025/11/openbenches-%f0%9f%92%96-openstreetmap/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 17 Nov 2025 12:34:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[OpenStreetMap]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63630</guid>

					<description><![CDATA[When Liz and I created the OpenBenches website, it was just designed to be a fun way for people to record memorial benches.  Since then things have got out of hand and we now have over thirty-nine thousand benches recorded!  Our plan was never to compete with something like OpenStreetMap. The OSM project is vast, complex, and brilliant - we are small, simple, and differently brilliant. But, over…]]></description>
										<content:encoded><![CDATA[<p>When Liz and I created <a href="https://openbenches.org/">the OpenBenches website</a>, it was just designed to be a fun way for people to record memorial benches.  Since then things have got out of hand and we now have over thirty-nine <em>thousand</em> benches recorded!</p>

<p>Our plan was never to compete with something like OpenStreetMap. The OSM project is vast, complex, and brilliant - we are small, simple, and <em>differently</em> brilliant. But, over the years, people have repeatedly asked if there's any way to combine the two data sets.</p>

<p>This has proved logistically complex for several reasons.</p>

<ol>
<li>Our users aren't experienced mappers.

<ul>
<li>Most of our entries are uploaded with fairly fuzzy GPS co-ordinates. Mobile phones aren't always the best at accurate locations and, besides, people tend to stand away from the bench when taking its photo. So our data isn't quite at the level of quality rightly demanded by OSM.</li>
</ul></li>
<li>OSM didn't have a tag specifically for memorial benches.

<ul>
<li>We started out site in 2017. OSM <a href="https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dbench">added the <code>Tag:memorial=bench</code> in 2021</a>. Up until then, there wasn't a great way to record that a bench was a memorial.</li>
</ul></li>
<li>Data licencing is complicated.

<ul>
<li>We chose the Creative Commons Attribution ShareAlike licence - it seemed like a good idea at the time! OSM use ODbL which is <a href="https://blog.openstreetmap.org/2017/03/17/use-of-cc-by-data/">subtly incompatible</a>. As such, OSM volunteers asked us to sign a waiver so they could use the data - which we happily did.</li>
</ul></li>
<li>Adding or editing data on OSM can be complicated.

<ul>
<li>OpenBenches is designed to be an upload-and-forget process. It doesn't matter much to us if a bench is recorded a dozen metres away from its true location. But that isn't the way OSM works. We didn't want to bulk upload data which was inaccurate, incomplete, or inappropriate. Luckily, there are now tools to help with that!</li>
</ul></li>
</ol>

<p>Things have been working away in the background. Some people have <a href="https://wiki.openstreetmap.org/wiki/Key:openbenches:id?uselang=en-GB">manually added <code>Key:openbenches:id</code> to appropriate benches</a>, and others have edited our database to make the locations closer to reality.</p>

<p>And now, thanks to the sterling work of the brilliant <a href="https://pietervdvn.me/">Pieter Vander Vennet</a> we're moving to our next phase of increased collaboration!</p>

<p>Firstly, there are about 1,060 benches on OpenStreetMap which have an OpenBenches ID. I've taken all those OSM IDs and put them into our database. Which means that the OpenBenches website can display a button like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/OpenBenches-website-with-an-OSM-link.webp" alt="OpenBenches website with an OSM link." width="1434" height="472" class="aligncenter size-full wp-image-63633">

<p>One click and you're looking at OSM - ready to investigate, edit, or admire.</p>

<p>But what about the <em>other</em> 38,000 benches? Well, that's where <a href="https://mapcomplete.org/">MapComplete</a> comes in.  MapComplete is sort of like Pokémon Go for maps. As you wander this Earth, you can complete little quests to help improve OpenStreetMap. For example, on the "Pubs" quest, you can add details of all the pubs you visit.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/MapComplete-screenshot-with-various-questions-about-a-pub.webp" alt="MapComplete screenshot with various questions about a pub." width="640" height="898" class="aligncenter size-full wp-image-63634">

<p>With the "Bench" quest, it is a little different.  If an OpenBench is sufficiently nearby an OSM bench, you'll get the option to link the two with a couple of clicks.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/MapComplete-screenshot-showing-two-benches-being-linked.webp" alt="MapComplete screenshot showing two benches being linked." width="1214" height="816" class="aligncenter size-full wp-image-63635">

<p>But there are <em>loads</em> of benches we have discovered which aren't in the OSM database. In which case, you can add a new bench to OSM using the data from OpenBenches!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/MapRoulette-screenshot-adding-a-new-bench.webp" alt="MapRoulette screenshot adding a new bench." width="640" height="635" class="aligncenter size-full wp-image-63636">

<p>This has been <a href="https://community.openstreetmap.org/t/guided-mapping-import-of-openbenches-org/97455">a couple of years in the making</a> - but it looks like most of the kinks are now sorted out.  I'm sure there will be a few early problems, and no doubt a bit of late-night bug fixing, but I hope that this is the start of something long-lasting.  The joy of decentralised sites using open data is that we can all build on each others' work in a spirit of fun and exploration.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63630&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/11/openbenches-%f0%9f%92%96-openstreetmap/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Reverse Geocoding is Hard]]></title>
		<link>https://shkspr.mobi/blog/2025/04/reverse-geocoding-is-hard/</link>
					<comments>https://shkspr.mobi/blog/2025/04/reverse-geocoding-is-hard/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 25 Apr 2025 11:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[geotagging]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=59857</guid>

					<description><![CDATA[My wife and I run OpenBenches - a crowd-sourced database of nearly 40,000 memorial benches.  Every bench is geo-tagged with a latitude and longitude. But how do you go from a string of digits to something human readable?  How do I turn -33.755780,150.603769 into &#34;42 Wallaby Way, Sydney, Australia&#34;?  Luckily, that&#039;s a (somewhat) solved problem. Services like OpenCage, StadiaMaps, OpenStreetMap,…]]></description>
										<content:encoded><![CDATA[<p>My wife and I run <a href="https://openbenches.org/">OpenBenches</a> - a crowd-sourced database of nearly 40,000 memorial benches.  Every bench is geo-tagged with a latitude and longitude. But how do you go from a string of digits to something human readable?</p>

<p>How do I turn <code>-33.755780,150.603769</code> into "42 Wallaby Way, Sydney, Australia"?</p>

<p>Luckily, that's a (somewhat) solved problem. Services like <a href="https://opencagedata.com/">OpenCage</a>, <a href="https://stadiamaps.com/">StadiaMaps</a>, <a href="https://nominatim.openstreetmap.org">OpenStreetMap</a>, and <a href="https://geocode.earth/">Geocode.Earth</a> all provide APIs which transform co-ordinates into addresses.  Done! Let's go home.</p>

<p>Except… Not everywhere <em>has</em> an address.  <a href="https://openbenches.org/bench/35905">Some benches are in parks</a>. They typically don't have a street number, but might have an interesting feature nearby to help with location. For example a statue or prominent landmark.</p>

<p>And… Not every address is relevant. <a href="https://openbenches.org/bench/26061">Some benches are on streets</a>. But we probably don't want to imply that the bench is <em>inside</em> or belongs to a specific nearby house.</p>

<p>Let's step back a bit. <em>Why</em> do we want to display a human-readable address?</p>

<p>We have two use-cases.</p>

<p>"As a visitor to the site, I want to:"</p>

<ol>
<li>Read a (rough) textual representation of where the bench is.</li>
<li>Click on a component of the address to see all benches within that area.</li>
</ol>

<p>The first is easy to explain:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/OB-Address.webp" alt="Map. Under it is an address of &quot;Middlewich, Cheshire East, England, United Kingdom&quot;." width="1134" height="638" class="aligncenter size-full wp-image-59858">

<p>The second is harder.  Suppose a bench is in Wellington, New Zealand. We want to create a URl like <a href="https://openbenches.org/location/New%20Zealand/Wellington/">openbenches.org/location/New Zealand/Wellington/</a>. That way, users can click on the word "Wellington" and find all the benches nearby. A user can also manually edit that URl to increase or decrease precision.</p>

<p>Both of these are problems of <em>precision</em>.</p>

<p>Let's take a look at <a href="https://nominatim.openstreetmap.org/reverse?lat=51.476845&amp;lon=-0.295296&amp;format=jsonv2">how one of the reverse geocoding services</a> deals with transforming <code>51.476845,-0.295296</code> into an address:</p>

<blockquote><p>Royal Botanic Gardens, Kew, Sandycombe Road, Kew, London Borough of Richmond upon Thames, London, Greater London, England, TW9 2EN, United Kingdom</p></blockquote>

<p><strong>That is <em>too much</em> address!</strong></p>

<p>Yes, it is technically accurate. But it contains far too much detail for humans, the postcode is irrelevant, and the weird-subdivisions are nothing that a local person would use.</p>

<p>Looking at the full API response, we can see:</p>

<pre><code class="language-json">{
  "place_id": 258770727,
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
  "name": "Royal Botanic Gardens, Kew",
  "display_name": "Royal Botanic Gardens, Kew, Elizabeth Cottages, Kew, London Borough of Richmond upon Thames, London, Greater London, England, TW9 3NJ, United Kingdom",
  "address": {
    "leisure": "Royal Botanic Gardens, Kew",
    "road": "Elizabeth Cottages",
    "suburb": "Kew",
    "city_district": "London Borough of Richmond upon Thames",
    "ISO3166-2-lvl8": "GB-RIC",
    "city": "London",
    "state_district": "Greater London",
    "state": "England",
    "ISO3166-2-lvl4": "GB-ENG",
    "postcode": "TW9 3NJ",
    "country": "United Kingdom",
    "country_code": "gb"
  }
}
</code></pre>

<p>Aha! Perhaps I can build a better address using just those components!</p>

<p>Except… Not every country has states. And not all states are used when giving addresses. Not every location is in a city. Some places have villages, prefectures, municipalities, and hamlets.</p>

<p>New York, New York is a valid address, but <a href="https://blog.opencagedata.com/post/99059889253/good-looking-addresses-solving-the-berlin-berlin">Berlin, Berlin</a> is not!</p>

<p>There's an <a href="https://github.com/OpenCageData/address-formatting">address formatter by OpenCage</a> which is pretty sensible about stripping off irrelevant details. But, to go back to my first point, not every map location on OpenBenches is a street address and - even if it is on a street - it probably shouldn't have a house number.</p>

<p>Well, there's kind of a solution to that! Most mapping provider have a <abbr title="Point of Interest">POI</abbr> function - we can find nearby things of interest and use them as a location.</p>

<p>Here's a <a href="https://openbenches.org/bench/36734">bench in Cook County, Illinois, USA</a>. The POI address is:</p>

<pre><code class="language-json">{
…
   "name": "Central Park",
   "coarse_location": "Des Plaines, IL, USA",
…
}
</code></pre>

<p>I <em>assume</em> there's only one Central Park in Des Plaines. Do people know that "Il" is Illinois? Would "Cook County" be useful?</p>

<p>On the subject of localisation, not everywhere speaks English. Do I want to display addresses like "<span lang="ja">原爆の子の像, 広島, 日本</span>"? How about "原爆の子の像, Hiroshima, Japan"?</p>

<p>We're an international site, but most benches are in Anglophone countries.</p>

<p>Of course, just because something is <em>physically</em> near a POI, that doesn't mean it is <em>logically</em> close to it.</p>

<p>Consider a bench situated <a href="https://www.openstreetmap.org/query?lat=50.580682&amp;lon=-3.467831">at the edge of this park</a>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/map.webp" alt="A map, with a marker situated just across a river." width="1328" height="1060" class="aligncenter size-full wp-image-59864"></p>

<p>The nearest POI is "Gay's Creamery" - across the river. Is that what you'd expect?  Is there any way to easily say "if a point is <em>inside</em> an amenity* then use that as the address?</p>

<p>I don't want the users of our site to have to select from a list of POIs or addresses, this should be as automated as possible.</p>

<h2 id="the-plan"><a href="https://shkspr.mobi/blog/2025/04/reverse-geocoding-is-hard/#the-plan">The Plan</a></h2>

<p>For each bench:</p>

<ol>
<li>Use StadiaMaps to get the nearest POI.</li>
<li>Get the data in English.</li>
<li>Concatenate the name and coarse location.</li>
<li>Save the "address".</li>
<li>Wait for complaints?</li>
</ol>

<p>Thoughts?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=59857&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/04/reverse-geocoding-is-hard/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Minimum Viable Clustered-Marker Globe using OpenFreeMap and MapLibre GL]]></title>
		<link>https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/</link>
					<comments>https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 14 Jan 2025 12:34:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[OpenStreetMap]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=55240</guid>

					<description><![CDATA[I love OpenFreeMap it is a quick, easy, and free way to add beautiful maps to your Open Source projects.  With the latest release of MapLibre-GL I wanted to see if there was an easy way to use both to make an interactive globe with clustered markers.  Spoiler alert: yes!  Basic Globe  Here&#039;s a basic example which I&#039;ve trimmed down from this example.    When you load the below code, you&#039;ll get a…]]></description>
										<content:encoded><![CDATA[<p>I love <a href="https://openfreemap.org/">OpenFreeMap</a> it is a quick, easy, and <em>free</em> way to add beautiful maps to your Open Source projects.  With the latest release of <a href="https://maplibre.org/maplibre-gl-js/docs/">MapLibre-GL</a> I wanted to see if there was an easy way to use both to make an interactive globe with clustered markers.</p>

<p>Spoiler alert: yes!</p>

<h2 id="basic-globe"><a href="https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/#basic-globe">Basic Globe</a></h2>

<p>Here's a basic example which I've trimmed down from <a href="https://maplibre.org/maplibre-gl-js/docs/examples/globe-vector-tiles/">this example</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/01/globe.webp" alt="A globe of the planet Earth with labels for countries." width="720" height="714" class="aligncenter size-full wp-image-55241">

<p>When you load the below code, you'll get a globe which you can spin and zoom. Nifty!</p>

<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Globe Projection using OpenFreeMap&lt;/title&gt;
        &lt;meta charset="utf-8"&gt;
        &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
        &lt;link rel="stylesheet" href="https://unpkg.com/maplibre-gl@5.0.0/dist/maplibre-gl.css"&gt;
        &lt;script src="https://unpkg.com/maplibre-gl@5.0.0/dist/maplibre-gl.js"&gt;&lt;/script&gt;
        &lt;style&gt;
            body { margin: 0;padding: 0; }
            html, body, #map { height: 100%; }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;div id="map"&gt;&lt;/div&gt;
        &lt;script type="module"&gt;
            const map = new maplibregl.Map({
                container: "map",
                style: "https://tiles.openfreemap.org/styles/liberty",
                zoom: 2,
                center: [0.123, 51.2345],
                pitch: 0,
                canvasContextAttributes: { antialias: true }
            });

            map.on('style.load', () =&gt; {
                map.setProjection({
                    type: 'globe',
                });
            });
        &lt;/script&gt;
    &lt;/body&gt;
&lt;/html&gt;
</code></pre>

<h2 id="adding-markers"><a href="https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/#adding-markers">Adding Markers</a></h2>

<p>In most respects, this acts like a normal MapLibre GL map.  To add a marker, add this code:</p>

<pre><code class="language-js">const marker = new maplibregl.Marker()
    .setLngLat([12.345, 54.321])
    .addTo(map);
</code></pre>

<h2 id="geojson-clusters"><a href="https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/#geojson-clusters">GeoJSON Clusters</a></h2>

<p>Now for the big one!  On <a href="https://openbenches.org/">OpenBenches</a> we display markers and <em>clusters</em> of markers. On a flat map, it looks like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/01/ob-clusters.webp" alt="Map of Europe. There are big circles on it saying how many markers are inside." width="655" height="655" class="aligncenter size-full wp-image-55243">

<p>We want to turn it into this beauty:</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-55240-2" width="620" height="687" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2025/01/b169e7bb1cfc045f.mp4?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2025/01/b169e7bb1cfc045f.mp4">https://shkspr.mobi/blog/wp-content/uploads/2025/01/b169e7bb1cfc045f.mp4</a></video></div><p></p>

<p>Here's the code, <a href="https://maplibre.org/maplibre-gl-js/docs/examples/cluster/">adapted from the tutorial</a>:</p>

<pre><code class="language-js">const map = new maplibregl.Map({
    container: "map",
    style: "https://tiles.openfreemap.org/styles/liberty",
    zoom: 2,
    center: [0.123, 51.2345],
    pitch: 0,
    canvasContextAttributes: { antialias: true }
});

map.on('style.load', () =&gt; {
    map.setProjection({
        type: 'globe',
    });
});

//  Load GeoJSON
async function load_GeoJSON() {
    const response = await fetch( "geo.json" )
    var benches_json = await response.json();
    return benches_json;
}

//  Asynchronous function to add custom layers and sources
async function addCustomLayersAndSources() {
    //  Get the data
    var geo_data = await load_GeoJSON();
    //  Load the GeoJSON
    if (!map.getSource('geo_data')) {
        map.addSource('geo_data', {
            type: 'geojson',
            data: geo_data,
            cluster: true,
            clusterMaxZoom: 17, // Max zoom to cluster points on
            clusterRadius: 50 // Radius of each cluster when clustering points (defaults to 50)
        });
    }

    //  Custom point marker
    if ( map.listImages().includes("marker-icon") == false ) {
        var image = await map.loadImage('/marker.png');
        map.addImage('marker-icon', image.data);
    }

    //  Add the clusters
    if (!map.getLayer('clusters')) {
        map.addLayer({
            id: 'clusters',
            type: 'circle',
            source: 'geo_data',
            filter: ['has', 'point_count'],
            paint: {
                // Use step expressions (https://maplibre.org/maplibre-style-spec/expressions/#step)
                // with three steps to implement three types of circles:
                //   * Blue, 20px circles when point count is less than 100
                //   * Yellow, 30px circles when point count is between 100 and 750
                //   * Pink, 40px circles when point count is greater than or equal to 750
                'circle-color': [
                    'step', ['get', 'point_count'],
                        '#51bbd655',
                    100, '#f1f07555',
                    750, '#f28cb155'
                ],
                'circle-radius': [
                    'step', ['get', 'point_count'],
                        20,
                    100, 30,
                    750, 40
                ],
                'circle-stroke-width': [
                    'step', ['get', 'point_count'],
                        1,
                    100, 1,
                    750, 1
                ],
                'circle-stroke-color': [
                    'step', ['get', 'point_count'],
                        '#000',
                    100, '#000',
                    750, '#000'
                ],
            }
        });

        //  Show number of markers in each cluster
        map.addLayer({
            id: 'cluster-count',
            type: 'symbol',
            source: 'geo_data',
            filter: ['has', 'point_count'],
            layout: {
                'text-field': '{point_count_abbreviated}',
                'text-font': ['Noto Sans Regular'],
                'text-size': 25
            }
        });

        //  Show individual markers
        map.addLayer({
            id: 'unclustered-point',
            source: 'geo_data',
            filter: ['!', ['has', 'point_count']],
            type: 'symbol',
            layout: {
                "icon-overlap": "always",
                'icon-image': 'marker-icon',  // Use the PNG image
                'icon-size': .1              // Adjust size if necessary
            }
        });
    }
}

//  Start by drawing the map
map.on('load', async () =&gt; {
    await addCustomLayersAndSources();
});
</code></pre>

<p>Obviously, there's a lot more you can do - but I hope this shows just how quickly you can get a clustermap working on a globe.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=55240&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/01/minimum-viable-clustered-marker-globe-using-openfreemap-and-maplibre-gl/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2025/01/b169e7bb1cfc045f.mp4" length="4330564" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[OpenBenches on the Volunteer Technologist Podcast]]></title>
		<link>https://shkspr.mobi/blog/2024/03/openbenches-on-the-volunteer-technologist-podcast/</link>
					<comments>https://shkspr.mobi/blog/2024/03/openbenches-on-the-volunteer-technologist-podcast/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 10 Mar 2024 12:34:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49855</guid>

					<description><![CDATA[I was delighted to be interviewed by the Volunteer Technologist podcast about our OpenBenches project.    Huge thanks to Gene Liverman for having me on.  It is available, as they say, wherever you get your podcasts. …]]></description>
										<content:encoded><![CDATA[<p>I was delighted to be <a href="https://www.volunteertechnologist.com/blog/uncovering-the-stories-behind-memorial-benches-with-terrence-eden/">interviewed by the Volunteer Technologist podcast</a> about our <a href="https://openbenches.org">OpenBenches project</a>.</p>

<p><a href="https://www.volunteertechnologist.com/blog/uncovering-the-stories-behind-memorial-benches-with-terrence-eden/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Podcast-Image-fs8.png" alt="Screenshot of a podcast player." width="597" height="212" class="aligncenter size-full wp-image-49857"></a></p>

<p>Huge thanks to <a href="https://fosstodon.org/@genebean">Gene Liverman</a> for having me on.</p>

<p>It is available, as they say, <a href="https://www.anildash.com/2024/02/06/wherever-you-get-podcasts">wherever you get your podcasts</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49855&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/openbenches-on-the-volunteer-technologist-podcast/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[30,000 Crowd-Sourced Memorial Benches!]]></title>
		<link>https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/</link>
					<comments>https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 11 Dec 2023 12:34:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48765</guid>

					<description><![CDATA[Way back in July 2017, Liz and I started OpenBenches.org. It was designed to be a fun way to record all the lovely memorial benches we saw on our walks.  A few weeks ago, Stuart Orford added the thirty-thousandth entry!    Here&#039;s what all that collective human effort looks like when plotted on a very exciting graph.    Using a proprietary mix of AI and BIG DATA, I can confidentially predict that…]]></description>
										<content:encoded><![CDATA[<p>Way back in July 2017, Liz and I started <a href="https://OpenBenches.org">OpenBenches.org</a>. It was designed to be a fun way to record all the lovely memorial benches we saw on our walks.</p>

<p>A few weeks ago, Stuart Orford added the <strong>thirty-thousandth</strong> entry!</p>

<p><a href="https://openbenches.org/bench/30934"><img src="https://images.weserv.nl/?url=openbenches.org/image/8533242934d5403e3db94492a1209be363abab1c/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="P.L.A. (Pat) Grice1931 - 2013I LIKE TO SIT AND THINK A LOT.A LOT IS WHAT I THINK ABOUT" width="600" height="452"></a></p>

<p>Here's what all that collective human effort looks like when plotted on a very exciting graph.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/12/cumbench-fs8.png" alt="Graph showing a steady progression from 0 to 30,000 over a few years." width="819" height="659" class="aligncenter size-full wp-image-48767">

<p>Using a proprietary mix of AI and BIG DATA, I can confidentially predict that there is a slight uplift in entries when the weather is nice. And, by the end of the decade, every bench in the solar system will be mapped.</p>

<p>You'll notice we've had <em>more</em> than 30k submissions. Some are duplicates - which I then merge with the originals. Some are not memorials - which I delete.</p>

<h2 id="more-stats"><a href="https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/#more-stats">More Stats!</a></h2>

<p>We have 535 registered users. Registration is <em>optional</em> for submitting - but mandatory if you want to edit an existing entry. Users can sign in with Twitter, Facebook, WordPress, GitHub, and LinkedIn - I'd like to add Mastodon, but Auth0 doesn't support it.</p>

<p>Photos have been taken with 455 different cameras. Ranging from the obscure <a href="https://openbenches.org/cameras/DJI">DJI FC330</a> (one photo) to the ubiquitous <a href="https://openbenches.org/cameras/motorola">Motorola G(7) Power</a> (9,825 photos). You can <a href="https://openbenches.org/cameras/">see all the different cameras and their statistics</a>.</p>

<p>The 69,074 photos which have been uploaded take up 281GB of disk space.</p>

<p>Bandwidth is about 5TB per year. About 1.5TB of that was <a href="https://www.vice.com/en/article/dy3vmx/an-ai-scraping-tool-is-overwhelming-websites-with-traffic">an incredibly aggressive "AI Crawler"</a> which has since been blocked.</p>

<p>We deliberately do not track visitor numbers. But Google's search console says we get about 170,000 impressions per year, and about 12,000 click throughs. However, Google refuses to index the majority of our pages. No idea why - it's has crawled them, but won't show them in search results.</p>

<p>18 people have <a href="https://github.com/openbenches/openbenches.org">contributed to our Open Source code on GitHub</a>.</p>

<p>A few times per year, people ask if they can use our data with OpenStreetMap. The answer is <a href="https://wiki.openstreetmap.org/wiki/Contributors#OpenBenches.org">yes, our data can be reused</a>. But there are two caveats. Firstly, our data includes historic benches which may not be present any more. Secondly, our benches are mapped with GPS, so might not give a location which is accurate enough for OSM. There is <a href="https://en.osm.town/@pietervdvn/109468004689289222">some ongoing work</a> to see if they can be combined. We're not competing with OSM - you should use them for mapping.</p>

<p>We've sold about a dozen <a href="https://openbenches.myspreadshop.co.uk/">t-shirts, mugs, stickers and other merch</a>. Doesn't bring in a huge amount of cash, but it is delightful to see people wearing the gear. We've had a few sponsors on <a href="https://opencollective.com/openbenches">OpenCollective</a> and <a href="https://github.com/sponsors/openbenches">GitHub Sponsors</a>. Again, not life-changing amounts of cash - but keeps things ticking along without adverts.</p>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/#whats-next">What's next?</a></h2>

<p>When we go on holiday, we take photos of benches - and we hope you do too!</p>

<p>That's all we want from this site. No VC buyout. No AI / NFT / Crypto grift. Just people exploring the psychogeography of their surroundings.</p>

<p>You can get involved by taking a geotagged photo of a memorial bench and uploading it to <a href="https://OpenBenches.org">OpenBenches.org</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48765&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Keeping a side project alive with t-shirts and cash]]></title>
		<link>https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/</link>
					<comments>https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 20 Jul 2023 11:34:29 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[Open Data]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46293</guid>

					<description><![CDATA[My wife and I run a side project called OpenBenches.org - it is a fun little crowd-sourced memorial bench site.  It&#039;s mostly fun, except when the bills come due!  Most hobby sites and side projects don&#039;t cost a lot to run. Lots of services have generous free tiers to (ab)use, and they can pay well in &#34;exposure&#34;. But OpenBenches is reaching a tipping point where it is slowly overwhelming us. …]]></description>
										<content:encoded><![CDATA[<p>My wife and I run a side project called <a href="https://OpenBenches.org">OpenBenches.org</a> - it is a fun little crowd-sourced memorial bench site.  It's <em>mostly</em> fun, except when the bills come due!</p>

<p>Most hobby sites and side projects don't cost a lot to run. Lots of services have generous free tiers to (ab)use, and they can pay well in "exposure". But OpenBenches is reaching a tipping point where it is slowly overwhelming us.</p>

<p>We've now got nearly 300GB of photos - which means our storage and bandwidth costs are on the high side. Yes, we could losslessly transcode them all (which takes up compute resources) or store them in Glacier (which involves transit costs) and get a better CDN (as opposed to using free tiers). Similarly, we do a lot of forward and reverse geo-coding, OCR, map drawing, and other little bits and pieces.</p>

<p>Basically, assuming we value our time at zero, OpenBenches costs us about £250 per year.</p>

<p>Now, that's not extravagant, but it's also not nothing. So, how do we make it cost neutral to us?</p>

<p>Having a paywall is the antithesis of open data.</p>

<p>Placing adverts next to memorials and expressions of grief feels grim, so we've decided against advertising.</p>

<p>We don't think that a VC is going to invest a million bucks into this. But, hey, if someone out there wants to make us an offer...</p>

<p>That leaves us with merchandising and sponsorship.</p>

<h2 id="merch"><a href="https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/#merch">Merch!</a></h2>

<p>We've <a href="https://openbenches.myspreadshop.co.uk/">opened a shop on Spreadshirt</a>.</p>

<p><a href="https://openbenches.myspreadshop.co.uk/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/merch.jpg" alt="A selection of hats, t-shirts, mugs, and waterbottles with our logo." width="1024" height="652" class="aligncenter size-full wp-image-46294"></a></p>

<p>Spreadshirt is pretty easy to use. Upload a graphic, select your products, launch. Each t-shirt brings us in about £4 after VAT. So far we've sold half a dozen things. Early days, but promising. It's a fairly low effort way to (hopefully) get in a trickle of cash.</p>

<h2 id="sponsorship"><a href="https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/#sponsorship">Sponsorship</a></h2>

<p>Perhaps you have enough t-shirts from random websites? Wouldn't you prefer a shout out on the website and unending gratitude?</p>

<p>We've set up <a href="https://github.com/sponsors/openbenches">GitHub sponsors</a> but, infuriatingly, it only accepts donations in USD - which means hefty foreign-exchange fees. Luckily, <a href="https://opencollective.com/openbenches">Open Collective</a> accepts payment in GBP which is a lot easier to manage.</p>

<p>Between the two of them, we've had about £175 so far this year. Again, a promising start.</p>

<h2 id="other-plans"><a href="https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/#other-plans">Other plans</a></h2>

<p>I'm not (para)social enough to do a Patreon. I don't want a job of delivering monthly newsletters, livestreaming my coding, or keeping the hype train running. I don't want <a href="https://kk.org/thetechnium/1000-true-fans/">1,000 True Fans</a>.  In short, we're not trying to make a profit out of this.</p>

<p>We just want to keep the site running for the foreseeable future and, hopefully, pay a bit forward to the brilliant Open Source projects we're built on.</p>

<p>For now we'll stick with those and see how the year plays out. If you have any clever ideas for how to make the site more self-sustaining, please let us know.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46293&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/keeping-a-side-project-alive-with-t-shirts-and-cash/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Who wrote "The call was short the shock severe"?]]></title>
		<link>https://shkspr.mobi/blog/2023/06/who-wrote-the-call-was-short-the-shock-severe/</link>
					<comments>https://shkspr.mobi/blog/2023/06/who-wrote-the-call-was-short-the-shock-severe/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 22 Jun 2023 11:34:09 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[meme]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[poem]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46052</guid>

					<description><![CDATA[A few weeks ago, someone uploaded this memorial bench to our site:  Photo CC BY-SA from Lewis MacKenzie.  It is a perfectly pleasant little memorial poem. I wondered about its origins.  A quick search shows that the opening couplet was used on war graves from 1916. But are its origins any earlier than that?  One of the problems of trying to search old records - especially newspapers - is that…]]></description>
										<content:encoded><![CDATA[<p>A few weeks ago, someone uploaded <a href="https://openbenches.org/bench/29100">this memorial bench to our site</a>:</p>

<p></p><div id="attachment_46053" style="width: 610px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-46053" src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/bench-inscription.jpg" alt="Bench with memorial inscription. The call was short the shock severe, To part with one we loved so dear, A cheery smile a heart of gold, One of the best this world could hold, Tis sad but true and we wonder why, The best are always first to die, See you in a bit Cliffski.&quot;" width="600" height="452" class="size-full wp-image-46053"><p id="caption-attachment-46053" class="wp-caption-text">Photo CC BY-SA from Lewis MacKenzie.</p></div><p></p>

<p>It is a perfectly pleasant little memorial poem. I wondered about its origins.</p>

<p>A quick search shows that the opening couplet was <a href="https://www.cwgc.org/find-records/find-war-dead/casualty-details/557538/i-woodhall/">used on war graves from 1916</a>. But are its origins any earlier than that?</p>

<p>One of the problems of trying to search old records - especially newspapers - is that text recognition isn't particularly effective.</p>

<p>But the <a href="https://www.britishnewspaperarchive.co.uk/search/results/1900-01-01/1949-12-31?basicsearch=%22the%20shock%20severe%22&amp;phrasesearch=the%20shock%20severe&amp;retrievecountrycounts=false&amp;sortorder=dayearly">British Newspaper Archive</a> has these examples from 1900:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/paper-clipping-fs8.png" alt="Paper clippings from Scottish newspapers." width="1024" height="576" class="aligncenter size-full wp-image-46054">

<p>The poem is different - and much less secular.</p>

<p>I wasn't able to find anything earlier than the year 1900.</p>

<p>Websites have variations of the poem, suggesting it might be from earlier.</p>

<blockquote><p>Dennis Townsend's headstone is cut with a family dedication that in one form or another has been in use from the late Victorian period - The cup was bitter the loss severe to part with one we loved so dear.
<a href="https://freepages.rootsweb.com/~tmi45/military/TMI19391945S-Z.htm">The Thurmaston Military Indexes</a></p></blockquote>

<p>That search took me back to 1891:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/1891-fs8.png" alt="Newspaper clipping from 1891." width="1024" height="297" class="aligncenter size-full wp-image-46055"></p>

<p>By searching variations, it's possible to find this from 1885:</p>

<blockquote><p>The following is the epitaph : The cup was bitter, the sting severe. To part with one we loved so dear
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/1885-fs8.png" alt="Scan of a paper from 1885." width="1024" height="272" class="aligncenter size-full wp-image-46057"></p></blockquote>

<p>The inscription can also be found on the <a href="https://www.geograph.org.uk/photo/5108069">Saunders Mausoleum in St Pancras &amp; Islington Cemetery</a>.</p>

<p></p><div id="attachment_46059" style="width: 1034px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-46059" src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/detail-of-geograph-5108069-by-Marathon.jpg" alt="&quot;A BITTER GRIEF A SHOCK SEVERE, TO PART WITH ONE I LOVED SO DEAR; MY LOSS IS GREAT I'LL NOT COMPLAIN, BUT TRUST IN CHRIST TO MEET AGAIN&quot;" width="1024" height="768" class="size-full wp-image-46059"><p id="caption-attachment-46059" class="wp-caption-text">Photo © <a title="View profile" href="https://www.geograph.org.uk/profile/43806">Marathon</a> (<a href="http://creativecommons.org/licenses/by-sa/2.0/">cc-by-sa/2.0</a>)</p></div><p></p>

<p>John Daniel Saunders died in the 1870s - but the inscription may be from after the death of Mary Saunders, his wife, in 1888.</p>

<p>There's a similar vintage inscription recorded in "<a href="https://www.google.co.uk/books/edition/Transactions_of_the_Devonshire_Associati/S7wVAAAAYAAJ?hl=en&amp;gbpv=1&amp;dq=%22but+trust+in+christ+to+meet+again%22&amp;pg=PA191&amp;printsec=frontcover">Transactions of the Devonshire Association for the Advancement of Science, Literature and Art (Volume 29)</a>"</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/transactions-fs8.png" alt="Clipping discussing a woman who died in 1879." width="518" height="221" class="aligncenter size-full wp-image-46063">

<p>Google books <em>thinks</em> the phrase appears in <a href="https://www.google.com/books/edition/Designs_for_Christian_Memorials/4N6azQEACAAJ?kptab=editions&amp;sa=X&amp;ved=2ahUKEwi-gJHZ7cD_AhXbSUEAHVXsBAMQmBZ6BAgHEAU">1857's Designs for Christian Memorials</a>. But doesn't have a searchable PDF.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/Google-Books-fs8.png" alt="Google books screenshot showing no preview available." width="522" height="177" class="aligncenter size-full wp-image-46058">

<p>There is <a href="https://www.google.co.uk/books/edition/_/gi4DAAAAQAAJ?hl=en&amp;sa=X&amp;ved=2ahUKEwizy9Gh8MD_AhVSFcAKHbSoCEsQ7_IDegQICxAD">a searchable 1886 edition</a> - but that doesn't contain the phrase.</p>

<p>The phrase pops up around the world - newspaper archives suggest it was popular in New Zealand. It also appears in the <a href="https://www.google.co.uk/books/edition/Quetta/eR8nAQAAIAAJ?hl=en&amp;gbpv=0&amp;bsq=%22james%20henry%20thomas%22%20quetta%201888">British cemeteries in Quetta, Baluchistan, Pakistan</a> in 1888:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/thomas-fs8.png" alt="Clipping from a book with the poem in it." width="472" height="150" class="aligncenter size-full wp-image-46061">

<p>At which point, the trail goes cold. At least for my limited resources. How curious that a snippet of a poem from nearly 150 years ago still resonates today.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46052&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/06/who-wrote-the-call-was-short-the-shock-severe/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Rewriting OpenBenches in Symfony]]></title>
		<link>https://shkspr.mobi/blog/2023/05/rewriting-openbenches-in-symfony/</link>
					<comments>https://shkspr.mobi/blog/2023/05/rewriting-openbenches-in-symfony/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 27 May 2023 11:34:32 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Symfony]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45783</guid>

					<description><![CDATA[I once described my ideal coding environment to a colleague as &#34;telneting directly into prod and damn the consequences!&#34;  I jest. But only a little. When I build for myself I treat best practices and coding styles as harmful. Chaotic evil but, hey, it&#039;s only myself I&#039;m hurting.  Anyway, my wife and I run a hobby site - OpenBenches.org - which was coded in a long alcopop fueled weekend. It&#039;s fair…]]></description>
										<content:encoded><![CDATA[<p>I once described my ideal coding environment to a <a href="https://mastodon.social/@jonodrew">colleague</a> as "telneting directly into prod and damn the consequences!"</p>

<p>I jest. But only a little. When I build for myself I treat best practices and coding styles as harmful. Chaotic evil but, hey, it's only myself I'm hurting.</p>

<p>Anyway, my wife and I run a hobby site - <a href="https://openbenches.org/">OpenBenches.org</a> - which was coded in a long alcopop fueled weekend. It's fair to say that it has exceeded our expectations in terms of people getting involved. But is underwhelming in terms of stability, speed, memory usage, efficiency, idempotency, and accessibility.</p>

<p>So I decided to rewrite it using a somewhat modern PHP framework. Partly to improve things and partly as a learning exercise.</p>

<p>I picked Symfony as it seemed to be under active development and had a reasonably simple "getting started" guide. The documentation looked good but, sadly, assumed a tonne of pre-existing knowledge. I ended up sending a few Pull Requests to improve it where I could.</p>

<p>Symfony suffers, like a lot of frameworks, from messy and inconsistent conventions. Some things are zero indexed, some from one. Why? Who know? Similarly, there are a bunch of random YAML (yeuch) files which need to be manually edited and a tangled mess of various config files scattered around.</p>

<p>But... in the end, the Symfony server is reasonably easy to use - with relatively sensible conventions and decent performance. It forced me to actually think about what I was doing and <em>why</em> I'd chosen certain conventions.</p>

<p>I won't claim it to be the best written code on the planet - and there's still some way to go in order to clean it up completely - but I'm pleased with the way things have turned out.</p>

<p>If you'd like to get involved - <a href="https://github.com/openbenches/openbenches.org">check out the code</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45783&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/05/rewriting-openbenches-in-symfony/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches at GeoMob London]]></title>
		<link>https://shkspr.mobi/blog/2023/01/openbenches-at-geomob-london/</link>
					<comments>https://shkspr.mobi/blog/2023/01/openbenches-at-geomob-london/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 25 Jan 2023 12:34:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[GeoMob]]></category>
		<category><![CDATA[GeoMobLON]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44710</guid>

					<description><![CDATA[Last week, Liz and I had the great pleasure of speaking at GeoMob London - a meet-up for digital geography nerds.  We gave a talk about OpenBenches and how far it has come since launch.  It blows our minds that we&#039;ve have over TWENTY-SIX THOUSAND unique benches added to the site.  And it is a little daunting to host nearly a quarter of a terabyte of photos from around the world.  We got lots of…]]></description>
										<content:encoded><![CDATA[<p>Last week, Liz and I had the great pleasure of speaking at <a href="https://thegeomob.com/">GeoMob London</a> - a meet-up for digital geography nerds.</p>

<p>We gave a talk about <a href="https://openbenches.org/">OpenBenches</a> and how far it has come since launch.  It blows our minds that we've have over TWENTY-SIX THOUSAND unique benches added to the site.  And it is a little daunting to host nearly a quarter of a terabyte of photos from around the world.</p>

<p>We got lots of great feedback (and free beer).  Yes, it was weird to be in a crowded lecture theatre again. And weirder still to be in a crowded pub talking about mapping with friends new and old.</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/GeoMob-Open-Benches.jpg" alt="Liz and Terence standing in a lecture theatre, presenting their work." width="1024" height="576" class="aligncenter size-full wp-image-44717"> All in all, an excellent night out.</p>

<p>You can read a summary of the event at:</p>

<iframe src="https://mapstodon.space/@geomob/109716492695183419/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" height="600" allowfullscreen="allowfullscreen"></iframe>

<p>Along with some nice feedback:</p>

<iframe src="https://mastodon.me.uk/@stevenfeldman/109717786352827521/embed" class="mastodon-embed" style="max-width: 100%; border: 0" width="400" height="600" allowfullscreen="allowfullscreen"></iframe>

<p>Our presentation wasn't recorded, but you can flick through it:</p>

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQjJHmy2nWLlBdZzLxmw42m0ImEB1A95wh1UOLg_F0O5OA8rxwOlYtfzHicReri3eoya5-rleSsZwyL/embed?start=false&amp;loop=false&amp;delayms=30000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44710&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/01/openbenches-at-geomob-london/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[You can have user accounts without needing to manage user accounts]]></title>
		<link>https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/</link>
					<comments>https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 13 Dec 2022 12:34:29 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Auth0]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[Social Media]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43758</guid>

					<description><![CDATA[The inimitable Simon Willison has a brilliant presentation all about managing side projects:    It is all good advice. But I gently disagree with the slide which says:  Avoid side projects with user accounts If it has user accounts it’s not a side-project, it’s an unpaid job  I get the sentiment. Storing passwords securely is hard. Dealing with users changing their names is hard. Updating avatars …]]></description>
										<content:encoded><![CDATA[<p>The inimitable Simon Willison has a brilliant presentation all about managing side projects:</p>

<iframe title="Massively increase your productivity on personal projects with comprehensive documentation and automated tests" id="talk_frame_938467" class="speakerdeck-iframe" src="//speakerdeck.com/player/1af98590ac6d4c0889c3286dfa37606c" width="620" height="348" style="aspect-ratio:620/348; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe>

<p>It is all good advice. But I gently disagree with the slide which says:</p>

<blockquote><p>Avoid side projects with user accounts
If it has user accounts it’s not a side-project, it’s an unpaid job</p></blockquote>

<p>I get the sentiment. Storing passwords securely is hard. Dealing with users changing their names is hard. Updating avatars is hard. GDPR is hard. It's just a lot of pain and suffering.</p>

<p>But I <em>still</em> have user accounts on one of my side projects while avoiding all those issues.  Here's how it works on <a href="https://openbenches.org/">OpenBenches</a>.</p>

<h2 id="use-auth0"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#use-auth0">Use Auth0</a></h2>

<p>The <a href="https://auth0.com/">Auth0 service</a> is a multi-vendor OAuth provider. That means I can offer a button which "login" which leads to this screen:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/10/Screenshot-2022-10-18-at-19-14-56-Log-in-OpenBenches.png" alt="Login page with buttons for Facebook, Twitter, WordPress, GitHub, and LinkedIn." width="500" height="708" class="aligncenter size-full wp-image-43760">

<p>Auth0 has <a href="https://marketplace.auth0.com/features/social-connections">around 60 different social login providers</a>. I picked the ones which best suited my users' demographic.</p>

<p>So the user hits "Sign In With Twitter<sup id="fnref:twit"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#fn:twit" class="footnote-ref" title="This blog post was written before Alan turned off the 2FA from Twitter. Then turned it back on. Then fired everyone. Then rehired them. Then whined about how much food they ate. Anyway, I've left…" role="doc-noteref">0</a></sup>", gives Twitter their username, password, blood sample, and 2FA token. Twitter gives OpenBenches an authentication token with <em>read only</em> access.</p>

<p>This is important. Even if I were hacked and the tokens stolen, an attacker wouldn't be able to alter the user's account on a different platform.</p>

<p>But, as it is, I don't store the token. So it can't be stolen.</p>

<h2 id="only-store-the-essentials"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#only-store-the-essentials">Only store the essentials</a></h2>

<p>Here's the database which contains my user "accounts":</p>

<pre><code class="language-sql">CREATE TABLE `users` (
  `userID` bigint(20) NOT NULL,
  `provider` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  `providerID` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  `name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
</code></pre>

<p>The <code>userID</code> is just an internally-used key which is incremented. I guess it could be a GUID or something.</p>

<p>The <code>provider</code> is a string like <code>twitter</code> or <code>facebook</code> or <code>linkedin</code> etc.</p>

<p>The <code>providerID</code> is the publicly available ID assigned by the social login service. Twitter gives everyone a number, LinkedIn gives everyone a random string, etc.</p>

<p>The <code>name</code> is the string that the provider calls you. My Twitter name is <code>@edent</code> and my LinkedIn name is <code>Thought Leader Terence Eden</code>.</p>

<p>That's it!  I don't store any access tokens. I don't store a date of birth. I don't store any data unnecessary to running my project.</p>

<h2 id="what-about-updates"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#what-about-updates">What about updates?</a></h2>

<p>I don't store URls to avatar images. Instead, I use <a href="https://cloudinary.com/documentation/social_media_profile_pictures">Cloudinary's Social Avatar service</a>. That's usually as simple as calling <code>res.cloudinary.com/demo/image/twitter/1330457336.jpg</code> - I have to fuss around a little for GitHub and Facebook.  So as soon as the user changes their avatar with their provider, it changes on my site.</p>

<p>Sometimes people change their names. Every time they log in to OpenBenches, I check to see if their <code>name</code> has changed - and update it if it has.</p>

<p>Most services don't let you change your internal ID. So that's fixed.</p>

<h2 id="where-it-goes-wrong"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#where-it-goes-wrong">Where it goes wrong</a></h2>

<p>It isn't all sunshine and roses though.  Here are two things which might give you cause for concern.</p>

<p>What if a user wants to merge their accounts? On OpenBenches we sometimes get users who set up two accounts - and then want data from each of them merged. So far, my answer has just been "no".</p>

<p>What if a user wants to delete their account? Well, they can delete it with Twitter or whoever. If someone asked, I'd probably delete their username from the table.  But it hasn't happened yet.</p>

<h2 id="should-you-do-this"><a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#should-you-do-this">Should you do this?</a></h2>

<p>I'm not your real dad.  It isn't my job to tell you how to live your life or set up your side projects.</p>

<p>Generally speaking, user accounts are bad news.  We resisted having them on OpenBenches for the longest time - people were anonymous.  But we had lots of users who wanted a leader board so they could show off how many benches they had uploaded.  The only way we could build that is with user accounts.  So we added it. <a href="https://openbenches.org/leaderboard">You can see the Leader Board in action</a>.</p>

<p>Building side projects can be a bit lonely. So it is sometimes nice to develop a community of people who want to use your stuff.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:twit">
<p>This blog post was written before Alan turned off the 2FA from Twitter. Then turned it back on. Then fired everyone. Then rehired them. Then whined about how much food they ate. Anyway, I've left Twitter. Come <a href="https://mastodon.social/@edent">join me on Mastodon</a>!&nbsp;<a href="https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/#fnref:twit" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43758&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/12/you-can-have-user-accounts-without-needing-to-manage-user-accounts/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[This Bench Does Not Exist]]></title>
		<link>https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/</link>
					<comments>https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 08 Apr 2022 11:34:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42149</guid>

					<description><![CDATA[We forced an AI to look at thousands of photos of memorial benches. Just because. Here are the results.                         You can view more at This Bench Does Not Exist.  Here&#039;s a video which shows how the process generates images. It gives you an idea of what the model &#34;thinks&#34; a bench is.    Download the model  You can download a 300MB StyleGAN neural net .PKL for your own use.  WHY?!? …]]></description>
										<content:encoded><![CDATA[<p>We forced an AI to look at <a href="https://openbenches.org">thousands of photos of memorial benches</a>. Just because. Here are the results.</p>

<p>
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0667.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0654.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0669.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10677.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10760.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0679.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0641.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0646.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10731.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10799.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10837.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10664.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0664.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0642.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0637.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0657.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0635.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0630.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed0634.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/seed10836.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="1" link="none" size="full" orderby="rand" ids="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332" include="42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332">
</p>

<p>You can view more at <a href="https://thisbench.doesnotexi.st/">This Bench Does Not Exist</a>.</p>

<p>Here's a video which shows how the process generates images. It gives you an idea of what the model "thinks" a bench is.</p>

<video width="1024" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/Bench-Generation.mp4" loop="" autoplay="" muted="" controls="">

<h2 id="download-the-model"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#download-the-model">Download the model</a></h2>

<p>You can <a href="https://g-75671f.f5dc97.75bc.dn.glob.us/benches/network-snapshot-011000.pkl">download a 300MB StyleGAN neural net .PKL</a> for your own use.</p>

<h2 id="why"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#why">WHY?!?</a></h2>

<p>What does a bench look like? How can you recognise it? Does the human brain process images of inanimate objects differently than it does with faces and animals? Is there an "uncanny valley" for seats?</p>

<p>5 years ago, my wife and I launched <a href="https://openbenches.org/">OpenBenches</a> - a site to crowdsource photos, inscriptions, and locations of memorial benches. We have been <em>astonished</em> at how popular it has. People have uploaded over 55,000 photos of about 22,000 benches!  That's around <a href="https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/">191GB of photos</a>. Nice ☺</p>

<p>I wanted to take all the photos of the benches, and train a computer to produce artificial images of benches. In a similar vein to <a href="https://knowyourmeme.com/memes/sites/this-person-does-not-exist">This [Cat|Person|Paper] Does Not Exist</a>, it's just an interesting way to show off how good (or not) computers are at generating images based off a large dataset.</p>

<h2 id="how"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#how">HOW?!?!</a></h2>

<p>It is <em>relatively</em> simple to create this. There is a pre-built set of scripts called <a href="https://github.com/NVlabs/stylegan3">StyleGAN3</a>. You can follow along with the tutorial provided. I was doing relatively well, until I hit the system requirements:</p>

<blockquote>
  1–8 high-end NVIDIA GPUs with at least 12 GB of memory. We have done all testing and development using Tesla V100 and A100 GPUs.
</blockquote>

<p>Ah. I don't even have <em>one</em> NVIDIA GPU - let alone 12! And the sponsorship for OpenBenches barely covers hosting. Let along buying expensive hardware.</p>

<p>I put the call out on Twitter and, very kindly, <a href="https://twitter.com/simonjbutcher/status/1500051051084455945">Simon Butcher</a> volunteered some hardware. Aren't people on the Internet nice!</p>

<p>The computation for the 512x512px training set was run for 20 days on an IBM AC922 POWER9 server running RHEL7, utilising all four Nvidia Tesla V100 SXM2 16GB GPUs.</p>

<p>The <a href="https://github.com/openbenches/openbenches.org#open-data-api">OpenBenches API</a> lets us grab the URls of all images, and metadata about whether they're a photo of the inscription or the bench.  There were about 25,000 photos to download and crunch through.</p>

<p>With that many images, it wasn't possible to manually go through to find images which shouldn't have been in the set. That might have led to some weirdness in the generation process.</p>

<h2 id="copyright"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#copyright">COPYRIGHT?!?!</a></h2>

<p>OK, so here's an odd question. All of the photos on the site have been licenced under Creative Commons. Mostly <a href="https://creativecommons.org/licenses/by-sa/4.0/">BY-SA 4.0</a> but a few imported from Flickr and other sites with different CC licences.</p>

<p>What's the copyright situation of the generated images?</p>

<p>I honestly don't know. If you do, stick a comment in the box below.</p>

<h2 id="weird"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#weird">WEIRD?!?!</a></h2>

<p>There are a number of "glitches" which seem inherent in AI generated images. Some are just weird little graphical quirks.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/glitch-bench.jpg" alt="A bench with a deformed arm." width="512" height="512" class="aligncenter size-full wp-image-42156">

<p>It's pretty easy to see where the AI has got a little confused. It is <em>totally</em> recognisable as a bench - but just the wrong side of the "uncanny valley" to look real.</p>

<p>Others, however, are full-on psychedelic hellscapes.</p>

<p>
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird03.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird92.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird15.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird31.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird04.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird70.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird116.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird108.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird117.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird57.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird110.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird02.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
<img width="512" height="512" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/weird89.jpg" class="attachment-full size-full" alt="" type="slideshow" columns="2" size="full" link="none" ids="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169" orderby="rand" include="42157,42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169">
</p>

<h2 id="inscriptions"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#inscriptions">Inscriptions</a></h2>

<p>Training a text model using GPT-2 was relatively easy. A few years ago <a href="https://shkspr.mobi/blog/2020/02/her-frown-lies-betwixt-two-fickle-eyes-teaching-an-ai-to-write-shakespearean-sonnets/">I taught an AI to write Shakespearean sonnets</a>. I used the same Google notebook to read in several thousand inscriptions and then generate new ones.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/04/en.png" alt="EN. HE LIKES THIS PLACE, BUT HE ONLY SERVES HIS LOVE FOR HIM.  In loving memory of Margaret Sheppard 1935 - 2017  Dedicated with love to the memory of Alan (Alan) Hutton who loved this place, as did his wife, his dogs. From his friends and family.  &quot;Seat here and get a view Of the world We all love. Enjoy the view.&quot;  IN LOVING MEMORY OF JACK AND JIM KORIN (BILL KORIN) WHO LOADED MANY HAPPY HOURS IN THIS GARDEN  IN LOVING MEMORY OF TONY DALRY OBEY &quot;SIT AND VISIT MY SPAIN&quot;  In loving memory of MARY &amp; KATE STEWART  IN MEMORY OF DAVID DICKERSON WHO LOVED THIS PLACE  This Chair Is Left To Rest &quot;IN LOVING MEMORY OF WIFE MRS. &amp; DOG SIT AND VISIT MY SPAIN  IN LOVING MEMORY OF JOHN KURTUS FROM A FOUNDEE OF ALL LIVEN ARE BEING SITTING HERE TO SIT AND REST HIS CHEST  IN MEMORY OF FRED AND MARGARET BEELL WHO LOVED THIS PLACE  IN MEMORY OF RENEE CAMPBELL 1930-2015  This seat is donated in thanks for the years to be spent on the park by the Rt. Air Staff with gratitude to the staff of P.E.I &amp; the R.A.A.L. For your love and understanding  This seat is donated in thanks for the years to be spent on the park by the R.A.A.L. and the R.A.A.L.  IN LOVING MEMORY OF MARY GILLESPEAK WHO LOVED THIS PLACE." width="1377" height="615" class="aligncenter size-full wp-image-42351">

<p>But… we decided not to use them in the end. It's <em>downright creepy</em> generating the name of someone and their date of death. It would be horrible to stumble on the website and find the details of you or a friend listed on there.</p>

<p>As there have already been lots of attempts to automatically generate semantically valid text based on an existing corpus - we dropped it from the site.</p>

<h2 id="thanks"><a href="https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/#thanks">THANKS!!!</a></h2>

<p>Huge thanks to:</p>

<ul>
<li><a href="https://twitter.com/simonjbutcher">Simon Butcher</a> for training the model on his supercomputer.</li>
<li><a href="https://blog.devopstom.com/">Tom O'Connor</a> for the <code>doesnotexi.st</code> subdomain.</li>
<li>All the hundreds of people who have generously uploaded their photos to OpenBenches.</li>
</ul>

<p>Here is another video for you to enjoy:</p>

<video width="1024" src="https://shkspr.mobi/blog/wp-content/uploads/2022/03/More-Bench-Generation.mp4" loop="" autoplay="" muted="" controls="">

<p>You can view more at <a href="https://thisbench.doesnotexi.st/">ThisBench.DoesNotExi.st</a>.</p>
</video></video><img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42149&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/04/this-bench-does-not-exist/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Using Soundex to find Duplicate Database Entries]]></title>
		<link>https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/</link>
					<comments>https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 03 Nov 2020 12:45:25 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37066</guid>

					<description><![CDATA[Our community website - OpenBenches - has over seventeen thousand crowd-sourced entries.  The nature of user-generated content is that there are bound to be duplicates. Especially around popular walking routes.  Here&#039;s how I culled around 200 duplicates using the awesome power of SOUNDEX!  Soundex is a clever algorithm for reducing a string of characters into a string which roughly represents its …]]></description>
										<content:encoded><![CDATA[<p>Our community website - <a href="https://openbenches.org">OpenBenches</a> - has over seventeen <em>thousand</em> crowd-sourced entries.  The nature of user-generated content is that there are bound to be duplicates. Especially around popular walking routes.  Here's how I culled around 200 duplicates using the awesome power of SOUNDEX!</p>

<p><a href="https://en.wikipedia.org/wiki/Soundex">Soundex</a> is a clever algorithm for reducing a string of characters into a string which <em>roughly</em> represents its pronunciation. The "roughly" is key here. We could just search the database for <em>identical</em> entries, but users often mistype entries. So comparing sounds is a good way to gloss over those mistakes.</p>

<p>This gives us the Soundex of every inscription in the database:</p>

<pre><code class="language-sql">SELECT soundex(`inscription`) FROM `benches` WHERE 1 
</code></pre>

<p>Which results in:</p>

<pre><code class="language-_">|soundex(`inscription`)                               | 
|=====================================================|
|D531323161545613216323                               |
|J51616565324126143216316531414                       |
|D232624132635253263532154                            |
|H6432534215361312345252342525321625342323153423163...| 
|A2316215635                                          |
</code></pre>

<p>Effectively, it's like a fuzzy hash for text.</p>

<p>So, here's how to get a list of all the Soundexs which have duplicates:</p>

<pre><code class="language-sql">SELECT `inscription`, SOUNDEX(`inscription`), COUNT(SOUNDEX(`inscription`))
    FROM    `benches`
    WHERE `published` = 1
    GROUP BY SOUNDEX(`inscription`)
    HAVING COUNT(SOUNDEX(`inscription`)) &gt; 1
    LIMIT 0 , 1024"
</code></pre>

<p>Which I can then use to produce a list of duplicates:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/10/List-of-duplicates.png" alt="List of duplicates on a website." width="1220" height="782" class="aligncenter size-full wp-image-37068">

<p>And I can then get a list of all benches with a <em>specific</em> Soundex:</p>

<pre><code class="language-sql">SELECT `benchID`, `inscription`, `address`
    FROM    `benches`
    WHERE  SOUNDEX(`inscription`) = "A123"
    AND  `published` = 1
</code></pre>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/10/Duplicates-listed-on-a-website.png" alt="Benches on a  website. One is called &quot;Bertie&quot; the other &quot;Bert&quot;." width="1120" height="571" class="aligncenter size-full wp-image-37069">

<p>In this case, I can see that they're similar but not identical - so I don't need to merge them.</p>

<p>I started off with a thousand possible duplicates and, after going through each of them, merged a couple of hundred dupes. That was a fun weekend!</p>

<h2 id="other-strategies"><a href="https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/#other-strategies">Other Strategies</a></h2>

<p>There were a couple of other things I thought of, and then discarded, to deal with dupes.</p>

<h3 id="ask-the-user-on-upload"><a href="https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/#ask-the-user-on-upload">Ask the user on upload</a></h3>

<p>This is probably the simplest. If a new upload has a similar Soundex to a nearby bench, ask the user if it a duplicate.
But, actually, that's fraught with complexity. It puts a lot of pressure on a new user to get it right. And, frankly, we're a tiny community which needs all the users it can get. So I decided to put the pressure back on me, the admin.</p>

<p>There are quite a few benches near each other which have identical inscriptions. So asking a user to check <em>which</em> bench they meant could also be complicated.</p>

<p>Which leads on to...</p>

<h2 id="check-proximity"><a href="https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/#check-proximity">Check proximity</a></h2>

<p>There are lots of benches near each other. That's understandable. But <em>calculating</em> how near any two benches are is a bit more complex.  They're stored in the database with separate latitude and longitude values. So, we can use the <a href="https://en.wikipedia.org/wiki/Haversine_formula">Haversine formula</a> to find all benches within, say, 250 metres of position <code>1.23,4.56</code>:</p>

<pre><code class="language-sql">SELECT
(
    6371 * ACOS(COS(RADIANS(1.23)) *
    COS(RADIANS(`latitude`)) *
    COS(RADIANS(`longitude`) -
    RADIANS(4.56)) +
    SIN(RADIANS(1.23)) *
    SIN(RADIANS(`latitude`)))
)
AS distance, benchID, latitude, longitude, inscription, published
FROM benches
WHERE published = true AND present = true
HAVING distance &lt; .25
ORDER BY distance
</code></pre>

<p>That's fine - but when combined with Soundex, it becomes much more complex. Effectively you then have to group similar sounds by geographic closeness. And, frankly, I really can't be bothered!</p>

<p>If you'd like to help out, the <a href="https://github.com/openbenches/openbenches.org">code to OpenBenches is open source</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37066&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/11/using-soundex-to-find-duplicate-database-entries/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How we organise and store thousands of UGC photos]]></title>
		<link>https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/</link>
					<comments>https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 28 Jan 2020 12:45:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33410</guid>

					<description><![CDATA[Our community project - OpenBenches is going really well. At the time of writing, we have 33,211 photos, taking up over 100GB.  Cameras and phones all have different ways of naming the photos they save. Some files are named with a datestamp - 2019-12-25_01.jpg. Others are sequential - photo_0001.jpg. Or they might have a system generated name - 7bba245908_k.jpg.  Storing all those photos in a…]]></description>
										<content:encoded><![CDATA[<p>Our community project - <a href="https://openbenches.org/">OpenBenches</a> is going really well. At the time of writing, we have <strong>33,211</strong> photos, taking up over 100GB.</p>

<p>Cameras and phones all have different ways of naming the photos they save. Some files are named with a datestamp - <code>2019-12-25_01.jpg</code>. Others are sequential - <code>photo_0001.jpg</code>. Or they might have a system generated name - <code>7bba245908_k.jpg</code>.</p>

<p>Storing all those photos in a single directory gives us a problem. What if two photos have the same name? Even if we split directories by username, or some other factor, we could still get clashes.</p>

<p>This is the solution we came up with:</p>

<ol>
<li>Take the hash of the photo. e.g. <code>A9342C5C39E5AE5F0077AECC32C0F81811FB8193</code></li>
<li>Rename the photo to the hash, add a <code>.jpg</code> extension.</li>
<li>Move the file to the <code>/photos/A/9/</code> directory. i.e. The first directory is the first letter of the hash, the sub-directory is the second letter of the hash.</li>
</ol>

<h2 id="why-do-this"><a href="https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/#why-do-this">Why do this?</a></h2>

<p>There's another practical reason to split files into sub-directories. What's the maximum number of files you can put in a directory?</p>

<p>For FAT32, it's <a href="https://answers.microsoft.com/en-us/windows/forum/all/what-is-the-maximum-number-of-files-i-can-place/9b371fae-5e09-4fe6-b24f-be16547896f3">65,536</a>. We're about halfway there! OK, let's hope I never have to move this code to an ancient Windows box!</p>

<p>Linux filesystems like <code>ext2</code> have an <a href="https://en.wikipedia.org/wiki/Ext2#File-system_limits">apparent limit of 31,998 files per directory - but suffer performance issues over 10,000</a>.</p>

<p>Even a default <code>ext3</code> partition seems to suffer after about <a href="https://web.archive.org/web/20200313234247/https://roopindersingh.com/programming/ext3-handling-large-number-of-files-in-a-directory/">2,000 files per directory</a>.</p>

<p>Applying <code>dir_index</code> seems to improve things, but still limits us to <a href="https://serverfault.com/questions/129953/maximum-number-of-files-in-one-ext3-directory-while-still-getting-acceptable-per/129956#129956">"easily" 200,000 files per directory</a>.</p>

<p>I don't know what software this might run on in the future. But it seems obvious to me that splitting files into 36 primary subdirectories reduces the risk of poor performance.</p>

<p>Or, perhaps we won't get billions of images of benches submitted, and this is the ultimate word in premature optimisation.</p>

<h2 id="is-sha1-the-best-hash"><a href="https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/#is-sha1-the-best-hash">Is SHA1 the best hash?</a></h2>

<p>Probably.  <a href="https://www.schneier.com/blog/archives/2005/02/cryptanalysis_o.html">SHA1 is not cryptographically secure</a>. A well funded adversary could create a photo with the same SHA1 hash as an existing photo.</p>

<p>But I don't care. Our system just rejects any file with an existing hash already in the system. So the risk of attack is low.  The chances of two legitimate photos having an identical SHA1 hash is miniscule.</p>

<p>And <a href="https://web.archive.org/web/20200306144315/https://automationrhapsody.com/md5-sha-1-sha-256-sha-512-speed-performance/">SHA1 is quick</a> and <a href="https://jacksondunstan.com/articles/3206">efficient</a>.</p>

<h2 id="a-word-about-metadata"><a href="https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/#a-word-about-metadata">A word about metadata</a></h2>

<p>We were originally planning to store the data in date-based directories. Or perhaps username directories. We even considered a separate directory structure depending on camera manufacturer.</p>

<p>In the end, it was easier to store the metadata in a database rather than relying on the vagueries of directory names.</p>

<h2 id="the-future"><a href="https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/#the-future">The Future</a></h2>

<p>I don't know how many photos we'll end up with. There are lots of benches.</p>

<p>This storage strategy means that I <em>could</em> mount a separate disk for each directory. In the future, when every bench in the world has a dozen photos, we could match storage needs to directory layout.</p>

<p>I'm sure there are better ways of organising large amounts of UGC - and I'd love to hear about them.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33410&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/01/how-we-organise-and-store-thousands-of-ugc-photos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches is a recipient of a Microgrant!]]></title>
		<link>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/</link>
					<comments>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 08 Jan 2020 08:20:43 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[money]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<category><![CDATA[Trade Union]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33766</guid>

					<description><![CDATA[We&#039;re delighted to announce that our OpenBenches.org project has been awarded a $250 microgrant from Icculus!  Ryan C. Gordon@icculusGoogle gave me an award for my contributions to Linux gaming and open source, and while I’m honored to be acknowledged, I can’t accept money from a company that is actively engaging in union busting.❤️ 2,934💬 0🔁 48402:20 - Wed 25 December 2019Ryan C. Gordon@icculu…]]></description>
										<content:encoded><![CDATA[<p>We're delighted to announce that our <a href="https://OpenBenches.org">OpenBenches.org</a> project has been awarded a <a href="https://icculus.org/microgrant2019/">$250 microgrant from Icculus</a>!</p>

<blockquote class="social-embed" id="social-embed-1209660053332082690" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1209660051645972481" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Google gave me an award for my contributions to Linux gaming and open source, and while I’m honored to be acknowledged, I can’t accept money from a company that is actively engaging in union busting.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660051645972481"><span aria-label="2934 likes" class="social-embed-meta">❤️ 2,934</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="484 reposts" class="social-embed-meta">🔁 484</span><time datetime="2019-12-25T02:20:05.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660051645972481">Replying to @icculus</a></small>When I agreed to the award, I hadn’t heard about <a href="https://twitter.com/eiais">@eiais</a>’s firing, or any of the others. It’s not much money, but I don’t think quantity is relevant.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660053332082690"><span aria-label="194 likes" class="social-embed-meta">❤️ 194</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T02:20:05.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote>

<blockquote class="social-embed" id="social-embed-1209660057614454784" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1209660055160840193" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660053332082690">Replying to @icculus</a></small>As such: I’m announcing the 2019 Icculus Microgrant. If you have a cool open source project, reply here about it and the one I like best, I’ll give $250 dollars. Do whatever you want with the money. I’ll try to pick one this week.<br><br>If anyone wants to match my donation, DM me.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660055160840193"><span aria-label="344 likes" class="social-embed-meta">❤️ 344</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="87 reposts" class="social-embed-meta">🔁 87</span><time datetime="2019-12-25T02:20:06.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/icculus" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4DAABXRUJQVlA4IBIDAABQDQCdASowADAAPrVKnUonJCKhsdmYAOAWiUAW/jG7CJAT09/NcKtnrEa73UwVw0qnmbeRv6c1EZefnNQQ6AFybExGlaSubkNhiyMmDWxePfuD3VV8kQLE2svLr8okqBU/DCTdtlcPg5PfRAmSYfZ/Yi8QAP74saAEl74jfz6tAZidx6XmCQGkhsWgikuTEz2n2Q+aMlmbi+hO8IoheuvXpTx/+yO/QHl0oEb3b8nYrvYOmdlfe/vtRlGm/7m7foDwbH1jtRtHS4qM5qBRs+/ZyoOrYTUJ49XO8OvuCJd9OIDddedc4dbsx63ybLI810nXVdZqSKQ8LjkFCZ8pknmMltKbN+LQNkRfzktoy+Fk7tweBZf1+G9CWw8EbQlnGD/jXG366V3Neb1QZiCAai5SYD9750j2d6P4zp0P1O88fTHXbEoci4fLoLs1A1Kn9//wYac+fiGsuFxt+f+7eKWWF0tipwuIYIArcPJ8VL0db9587BzO5IOVHKeZGPiKYWZO6Jpv5MFhzcLWqJMNVuptAyJODYNfHK/E9iWCJ/O+0yQ1K0ufLf5JnpApuQ062eZpP9VlP2LCc1Il6GnP/48Ca4fp6SYqsZw/7dn+alO9H9MMdGytjX2N17FYk9htmW/L5IIZYU4pwex4kwIBicfGLajfxvaIBDE9l9JNZ3AuIYQH8M0c8r70dNQreeDeFwKzPQ1Es0wFISn//P/madJQNvK8qrMos8hXShfU/0OCKFUutbJ+9D7kgOAFtOC4rAUZ/d7WGjQNyACoshAMQVeH3CyAR4//160sIVD7xLp1rWnkWxW1KX83+JtavEODOH2qfDXfGZgf8IPUJX7EVBKolukQkxKkLmbkQ8EG8y5NQsAUfJknLaddHmPbcmI3/ynrrXmz/a/2s6Z3psYYBG7hd1anoE7I4H3kRD4alb7uUDbT8XwATos1kSMbmwr3mFBBPWmJPEn7t33+e8mZHoMYEIlSqdVBgglfvYJZt2HyCfkkwn6iz5cW07PsuI1CWI2Qu9EpCOrKJsB1HG9vxa5uAAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Ryan C. Gordon</p>@icculus</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660055160840193">Replying to @icculus</a></small>(If I don’t get any good projects, I’ll buy 250 bucks worth of pizza for the next Google organizing  meeting or something. But if you’re proud of your project, tiny or not, that should be all you need to tweet it at me. Good luck!)</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/icculus/status/1209660057614454784"><span aria-label="164 likes" class="social-embed-meta">❤️ 164</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T02:20:06.000Z" itemprop="datePublished">02:20 - Wed 25 December 2019</time></a></footer></blockquote>

<p>Huge thanks to Ryan, and everyone else who chipped in.</p>

<p>Because I'm part of <a href="https://github.com/sponsors/edent">GitHub Sponsors</a>, the donation will be matched by GitHub.</p>

<p>So, that's US$500 - about £375. Nice!</p>

<p>If you'd like to sponsor us, you can do so on <a href="https://github.com/sponsors/edent">GitHub</a> or via <a href="https://paypal.me/edent/gbp10">PayPal directly</a>. Or, we have an <a href="https://www.amazon.co.uk/hz/wishlist/ls/13GFCFR2B2IX4?type=wishlist&amp;linkCode=sl2&amp;tag=shksprblogwish-21">Amazon wishlist</a> if you'd like to get us a physical present.</p>

<h2 id="what-will-we-spend-the-grant-on"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#what-will-we-spend-the-grant-on">What will we spend the grant on?</a></h2>

<p>This is what we said we'd use the money for:</p>

<blockquote class="social-embed" id="social-embed-1209755670008025089" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/icculus/status/1209660055160840193">Replying to @icculus</a></small><a href="https://twitter.com/icculus">@icculus</a> <a href="https://twitter.com/mjg59">@mjg59</a> My wife and I run <a href="https://openbenches.org/">openbenches.org</a><br>It's an open source / open data project which crowdsources photos of memorial benches.<br>$250 would allow us to move away from Google's OCR engine, and on to a faster web host.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1209755670008025089"><span aria-label="1 likes" class="social-embed-meta">❤️ 1</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-12-25T08:40:02.000Z" itemprop="datePublished">08:40 - Wed 25 December 2019</time></a></footer></blockquote>

<p>No one is auditing us, so we could spend it all on a luxury holiday to Bognor Regis. But we won't!</p>

<p>Although... <a href="https://openbenches.org/location/United%20Kingdom/West%20Sussex/Bognor%20Regis">There are a <em>lot</em> of unmapped benches in Bognor</a>...</p>

<h2 id="the-web-is-cheap"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#the-web-is-cheap">The web is cheap!</a></h2>

<p>Don't tell anyone who wants to give us money, but it's quite cheap to run a niche site on the web!</p>

<p>We're lucky to be in the free tier of our 3rd party providers:</p>

<ul>
<li><a href="https://opencagedata.com/">OpenCage</a> provides the reverse geocoding, and is free for 2,500 calls per day.</li>
<li><a href="https://www.cloudimage.io/">CloudImage</a> is free for small projects.</li>
<li><a href="https://auth0.com/">Auth0</a> does social login - and offers more features free for Open Source projects.</li>
<li><a href="https://www.mapbox.com/">MapBox</a> renders beautiful OpenStreetMap tiles for free, up to 50,000 per month.</li>
<li><a href="https://cloud.google.com/vision/pricing">Google Cloud Vision</a> we're just about within their 1,000 free scans per month limit.</li>
</ul>

<p>We've occasionally gone over those free limits, so will keep a couple of quid in reserve in case of a surge in our popularity.</p>

<p>Our major cost is hosting. We paid £300 for 3 years of shared hosting with <a href="https://krystal.uk/">Krystal.uk</a> - use code <code>EDENT</code> at checkout and we both get a fiver.</p>

<p>That hosting deal runs out in August this year, so the bulk of the grant will go to upgrading our package to something a bit bigger. Notably, we're capped at 2GB of RAM which we seem to regularly max out.</p>

<p>Because we have over 130GB of photos, we'll probably stay with Krystal - unless anyone knows of a UK based hosting provider with <a href="https://krystal.uk/green">impeccable green credentials</a>?</p>

<p>In the spirit of the grant, we'll look at moving away from Google's Cloud Vision.  Current contenders are</p>

<ol>
<li><a href="https://docs.aws.amazon.com/rekognition/latest/dg/text-detection.html">Amazon Rekognition</a>

<ul>
<li>Although they're just as ethically dubious</li>
</ul></li>
<li><a href="https://azure.microsoft.com/en-gb/services/cognitive-services/computer-vision/">Microsoft's Computer Vision</a>

<ul>
<li>Ditto!</li>
</ul></li>
<li>The Open Source <a href="https://github.com/tesseract-ocr/tesseract">Tesseract OCR</a>

<ul>
<li>Which is sponsored by Google...</li>
</ul></li>
</ol>

<p>Suggestions very welcome!</p>

<h2 id="unions"><a href="https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/#unions">Unions</a></h2>

<p>Regular readers will know that I'm a proud member of <a href="https://prospect.org.uk/">Prospect - the union for ambition</a>.   As a professional knowledge-worker, I rely on my union to provide me with legal services and support me in pay negotiations. If you're in the UK and want to be part of a union for professionals - <a href="https://prospect.org.uk/join/">join Prospect today</a>.</p>

<p>If you join Prospect, and mention my name, <a href="https://prospect.org.uk/mrm/">I'll make a £10 donation to charity</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33766&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/01/openbenches-is-a-recipient-of-a-microgrant/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[OpenBenches - some stats]]></title>
		<link>https://shkspr.mobi/blog/2018/11/openbenches-some-stats/</link>
					<comments>https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 26 Nov 2018 12:30:25 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[ODcamp]]></category>
		<category><![CDATA[Open Data]]></category>
		<category><![CDATA[OpenBenches]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30730</guid>

					<description><![CDATA[For the last year-and-a-bit, Liz and I have been running OpenBenches.org.  An open data website dedicated to memorial benches.  Here are some rough and ready numbers about how it has gone so far.  9,870 Benches  At the time of writing, we&#039;re a little shy of 10,000 benches.  As you can see, we have photos from all around the world.    9,000 UK Benches  The majority of our benches are in the UK. …]]></description>
										<content:encoded><![CDATA[<p>For the last year-and-a-bit, Liz and I have been running <a href="https://openbenches.org">OpenBenches.org</a>.  An open data website dedicated to memorial benches.</p>

<p>Here are some rough and ready numbers about how it has gone so far.</p>

<h2 id="9870-benches"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#9870-benches">9,870 Benches</a></h2>

<p>At the time of writing, we're a little shy of 10,000 benches.  As you can see, we have photos from all around the world.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/World-Map-of-Benches-fs8.png" alt="Map of the world. Markers mostly in the UK, Australia, New Zealand, and America." width="1222" height="597" class="aligncenter size-full wp-image-30733">

<h2 id="9000-uk-benches"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#9000-uk-benches">9,000 UK Benches</a></h2>

<p>The majority of our benches are in the UK.  Memorial benches seems like a peculiarly Anglosphere habit. I've spoken to people from all sorts of different countries, and they really are rare outside the English-speaking world.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/UK-map-of-benches-fs8.png" alt="UK map covered in thousands of markers." width="323" height="529" class="aligncenter size-full wp-image-30732">

<h2 id="110-registered-users"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#110-registered-users">110 Registered Users</a></h2>

<p>That's over a hundred people signing in with Twitter. We've recently added <a href="https://auth0.com/">Auth0</a> support, so people can sign in with Facebook and GitHub.</p>

<p>We also <a href="https://openbenches.org/leaderboard">added a leaderboard</a> so that our mate Jenny could see how many photos she added in Edinburgh.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/Leaderboard-of-Benches-fs8.png" alt="A leaderboard. Jenny is in 4th position." width="359" height="591" class="aligncenter size-full wp-image-30731">

<p>We still have lots of anonymous users.</p>

<h2 id="21840-photographs"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#21840-photographs">21,840 Photographs</a></h2>

<p>Most benches have two photos - one of the inscription, and then another of either the whole bench or a view from the bench.</p>

<p>We also have panoramic shots like this:</p>

<iframe style="border-style:none;" width="1024" height="400" allowfullscreen="" src="https://shkspr.mobi/pannellum/pannellum.htm#panorama=https://shkspr.mobi/blog/wp-content/uploads/2018/11/3396.jpeg&amp;autoRotate=2&amp;autoLoad=false&amp;title=Isle%20of%20Man"></iframe>

<h2 id="66gb-of-photos"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#66gb-of-photos">66GB of Photos</a></h2>

<p>All that media is pretty weighty.  Modern camera phones take high-res photos, and a typical shot is around 4MB.</p>

<p>At the moment, our hosting provider is holding up. Huge shout out to <a href="https://krystal.co.uk">Krystal Hosting</a> - use discount code <code>EDENT</code> for £5 off.</p>

<p>I am looking at using <a href="https://cloudinary.com/">Cloudinary</a> to speed up resizing and delivery. But at close to $100 a month, that's too much for a small hobby project.</p>

<h2 id="hundreds-of-moo-cards"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#hundreds-of-moo-cards">Hundreds of Moo Cards</a></h2>

<blockquote class="social-embed" id="social-embed-1049036744581165057" lang="">        <header class="social-embed-header">        <a href="https://twitter.com/edent" class="social-embed-user">            <img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="">            <div class="social-embed-user-names">                <p class="social-embed-user-names-name">Terence Eden is on Mastodon                </p>                @edent            </div>        </a>        <img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E">    </header>    <section class="social-embed-text">                Printed out loads of <a href="https://twitter.com/openbenches">@openbenches</a> moo cards in preparation for Open Data Camp in Aberdeen! Made with ♥ out of <a href="https://twitter.com/hashtag/OpenData">#OpenData</a> <br><br>Free tickets available tomorrow.<br><a href="https://twitter.com/hashtag/ODCamp6">#ODCamp6</a> <a href="https://twitter.com/hashtag/odcam">#odcam</a> <a href="https://x.com/edent/status/1049036744581165057/photo/1">pic.x.com/dVnUQt8Odn</a>        <div class="social-embed-media-grid">            <a href="https://pbs.twimg.com/media/Do7tV7vXkAAB1-g.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="An artfully arranged pile of business cards. " src="data:image/webp;base64,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"></a>            </div>                    </section>    <hr class="social-embed-hr">    <footer class="social-embed-footer">        <a href="">            <span aria-label="6 likes" class="social-embed-meta">❤️ 6</span>            <span aria-label="1 replies" class="social-embed-meta">💬 1</span>            <span aria-label="0 reposts" class="social-embed-meta">🔁 0</span>            <time datetime="{tweet_date}">20:40 - Sun 07 October 2018</time>        </a>    </footer></blockquote>

<p><a href="https://refer.moo.com/s/terryeden">Get 25% off your first Moo Card order</a>!</p>

<h2 id="261-commits-and-8-github-contributors"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#261-commits-and-8-github-contributors">261 Commits, and 8 GitHub contributors</a></h2>

<p>The whole site is <a href="https://github.com/edent/openbenches/">open source on GitHub</a> - and it has been lovely using the issues tab to discuss where the site should go next.</p>

<h2 id="lots-of-fun"><a href="https://shkspr.mobi/blog/2018/11/openbenches-some-stats/#lots-of-fun">Lots of Fun</a></h2>

<p>But, most importantly, it has been a lot of fun. It's wonderful seeing people from around the planet contributing.  Thank you to everyone who has submitted a bench, shared our links, or generally been supportive of this daft little endeavour.</p>

<p>Here are some of the benches which made us smile:</p>

<p><a href="https://openbenches.org/bench/321"><img src="https://images.weserv.nl/?url=openbenches.org/image/4efafc84a3588fd2f2e89149bc9ba3abac90648e/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="Higgins Greenhalgh1986 - 2000We hadn't the heart to tell himhe was a dog" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/1665"><img src="https://images.weserv.nl/?url=openbenches.org/image/ba40b291e87243978f5f4e0d72102fa9622e8907/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="In Loving Memory of Carol NelmesJune 1960 - March 2016She spent countless happy hours here withour dogs, Harry, Molly, Ollie and Ellie.Her smiles and laughter will never be forgotten.As she used to sing &quot;Always look on the bright side of life.&quot;Her husband, Tim." width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/2413"><img src="https://images.weserv.nl/?url=openbenches.org/image/0d0a0a8d29f168ff831356188f45d6778eab19fa/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="In MemoriamIn fond memory of Miles Kington, who hated this spot,because there was never anywhere to sit down and enjoy it from.Miles Kington, humorist. 1941-2008" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/273"><img src="https://images.weserv.nl/?url=openbenches.org/image/81792b9e7e611a04baeaabaf07dd83eb40b3669b/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="Memorial to theunknown husbandOften imagined. Much desired. Never found.Artwork by Elizabeth Croft. www.elizabethcroft.net" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/1333"><img src="https://images.weserv.nl/?url=openbenches.org/image/0a5cb2312feaadc5c2d2e3c04506648d34eb6f6f/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="It was on this bench in 2007 that the notorious artist Tracey Emin surrendered all her art rebel credibility when she decided to become a member of the Royal Academy of Arts" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/9385"><img src="https://images.weserv.nl/?url=openbenches.org/image/d348877eed744a71602992fb89de4fe3530e75c6/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="“A good spot for a fine pint.” As enjoyed by Edward (Steve) Gunningham.Who would have enjoyed the view, were it not for that tree!" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/4012"><img src="https://images.weserv.nl/?url=openbenches.org/image/29a9aceab4d332b8cfb1280afc6aee4c7c9084a3/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="&quot;If I take one more stepit will be the furthest away from home I've ever been&quot;Samwise GamgeeProudly provided by Rover Tours Group" width="600" height="450"></a></p>

<p><a href="https://openbenches.org/bench/8991"><img src="https://images.weserv.nl/?url=openbenches.org/image/0554bad190c7513ad105a172199d7ae708e98851/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="If you turn some species of shark upside down theywill go into a trance-like state called tonic immobilitylasting approximately fifteen minutes" width="600" height="450"></a></p>

<p>And, finally, Liz and her mum in New Zealand - sat on the bench dedicated to Liz's grandparents.</p>

<p><a href="https://openbenches.org/bench/538"><img src="https://openbenches.org/image/4ca169107e038ceeb65586b1a46c885614f7bd4f/" alt="Two women sat on a bench"></a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30730&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/11/openbenches-some-stats/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
