<?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>google &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/google/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>google &#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[Is it possible to allow sideloading *and* keep users safe?]]></title>
		<link>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/</link>
					<comments>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 30 Aug 2025 11:34:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[scam]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63058</guid>

					<description><![CDATA[In which I attempt to be pragmatic.  Are you allowed to run whatever computer program you want on the hardware you own? This is a question where freedom, practicality, and reality all collide into a mess.  Google has recently announced that Android users will only be able to install apps which have been digitally signed by developers who have registered their name and other legal details with…]]></description>
										<content:encoded><![CDATA[<p>In which I <em>attempt</em> to be pragmatic.</p>

<p>Are you allowed to run whatever computer program you want on the hardware you own? This is a question where freedom, practicality, and reality all collide into a mess.</p>

<p>Google has recently announced that Android users will only be able to install apps which have been digitally signed by developers who have registered their name and other legal details with Google.  To many people, this signals the death of "sideloading" - the ability to install apps which don't originate on the official store<sup id="fnref:sideload"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#fn:sideload" class="footnote-ref" title="Post by @Gargron@mastodon.social View on Mastodon" role="doc-noteref">0</a></sup>.</p>

<script data-allowed-prefixes="https://mastodon.social/" async="" src="https://mastodon.social/embed.js"></script>

<p>I'm a fully paid-up member of the Cory Doctorow fanclub. Back in 2011, he gave a speech called "<a href="https://boingboing.net/2012/08/23/civilwar.html">The Coming War on General Computation</a>". In it, he rails against the idea that our computers could become traitorous; serving the needs of someone other than their owner.  Do we want to live in a future where our computers refuse to obey our commands? No! Neither law nor technology should conspire to reduce our freedom to compute.</p>

<p>There are, I think, two small cracks in that argument.</p>

<p>The first is that a user has no right to run anyone else's code, if the code owner doesn't want to make it available to them.  Consider a bank which has an app. When customers are scammed, the bank is often liable. The bank wants to reduce its liability so it says "<a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">you can't run our app on a rooted phone</a>".</p>

<p>Is that fair? Probably not. Rooting allows a user to fully control and customise their device. But rooting also allows malware to intercept communications, send commands, and perform unwanted actions. I think the bank has the right to say "your machine is too risky - we don't want our code to run on it."</p>

<p>The same is true of video games with strong "anti-cheat" protection. It is disruptive to other players - and to the business model - if untrustworthy clients can disrupt the game. Again, it probably isn't <em>fair</em> to ban users who run on permissive software, but it is a <em>rational</em> choice by the manufacturer. And, yet again, I think software authors probably should be able to restrict things which cause them harm.</p>

<p>So, from their point of view it is pragmatic to insist that their software can only be loaded from a trustworthy location.</p>

<p>But that's not the only thing Google is proposing. Let's look at <a href="https://android-developers.googleblog.com/2025/08/elevating-android-security.html">their announcement</a>:</p>

<blockquote><p>We’ve seen how malicious actors hide behind anonymity to harm users by impersonating developers and using their brand image to create convincing fake apps. The scale of this threat is significant: our recent analysis found <strong>over 50 times more malware</strong> from internet-sideloaded sources than on apps available through Google Play.</p></blockquote>

<p>Back in the early days of Android, you could just install any app and it would run, no questions asked. That was a touchingly naïve approach to security - extremely easy to use but left users vulnerable.</p>

<p>A few years later, Android changed to show user the permissions an app was requesting. Here's a genuine screenshot from <a href="https://shkspr.mobi/blog/2013/04/what-can-android-learn-from-symbians-security-model/">an app which I tried to sideload in 2013</a>:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/04/Legit-App-Permissions.png" alt="A terrifying list of permissions." width="480" height="800" class="aligncenter size-full wp-image-28202">

<p>No rational user would install a purported battery app with that scary list of permissions, right? Wrong!</p>

<p>We know that <a href="https://www.nngroup.com/articles/how-little-do-users-read/">users don't read</a> and they especially <a href="https://discovery.ucl.ac.uk/id/eprint/1389027/1/KrolWarnings-CameraReady.pdf">don't read security warnings</a>.</p>

<p>There is no UI tweak you can do to prevent users bypassing these scary warnings. There is no amount of education you can provide to reliably make people stop and think.</p>

<p>Here's the story of <a href="https://www.bbc.co.uk/news/business-64981507">a bank literally telling a man he was being scammed</a> and he <em>still</em> proceeded to transfer funds to a fraudster.</p>

<blockquote><p>It emerged that, in this case, Lloyds had done a really good job of not only spotting the potential fraud but alerting James to it. The bank blocked a number of transactions, it spoke to James on the phone to warn him and even called him into a branch to speak to him face-to-face.</p></blockquote>

<p>Here's another one where <a href="https://www.bbc.co.uk/news/uk-england-leeds-67208755">a victim deliberately lied to their bank</a> even after acknowledging that they had been told it was a scam.</p>

<p>Android now requires you to deliberately turn on the ability to side-load. It will give you prompts and warnings, force you to take specific actions, give you pop-ups and all sorts of confirmation steps.</p>

<p>And people still click on.</p>

<p>Let's go back to Google announcement. This change isn't being rolled out worldwide immediately. They say:</p>

<blockquote><p>This change will start in a few select countries specifically impacted by these forms of fraudulent app scams, often from repeat perpetrators.</p>

<p>…</p>

<p>September 2026: These requirements go into effect in Brazil, Indonesia, Singapore, and Thailand. At this point, any app installed on a certified Android device in these regions must be registered by a verified developer.</p></blockquote>

<p>The police in Singapore have a page <a href="https://www.police.gov.sg/Media-Hub/News/2024/20241106_advisory_on_the_prevalence_of_malware_scams_affecting_android_users">warning about the prevalence of these scams</a>. They describe how victims are tricked or coerced into turning off all their phone's security features.</p>

<p>Similarly, there are estimates that <a href="https://www.gasa.org/post/1-in-3-brazilians-targeted-by-scammers-in-2024-state-of-scam-report">Brazil lost US$54 <strong>billion</strong> to scams in 2024</a> (albeit not all through apps).</p>

<p>There are <a href="https://www.reddit.com/r/indonesia/comments/1mjpnlo/optimisasi_apk_pemerintah_yg_kyk_kontol_enables/?tl=en">anecdotal reports from Indonesia</a> which show how easily people fall for these fake apps.</p>

<p>Thailand is also <a href="https://web.archive.org/web/20230121052244/https://www.bangkokpost.com/tech/2487659/phone-users-warned-over-malicious-apps">under an ongoing onslaught of malicious apps</a> with some apps raking in <a href="https://thethaiger.com/hot-news/crime/thai-police-crackdown-on-app-scam-seizing-nearly-1-million-baht">huge amounts of money</a>.</p>

<p>It is absolutely rational that government, police, and civic society groups want to find ways to stop these scams.</p>

<p>Google is afraid that if Android's reputation is tarnished as the "Scam OS" then users will move to more secure devices.</p>

<p>Financial institutions might stop providing functionality to Android devices as a way to protect their customers. Which would lead to those users seeking alternate phones.</p>

<p>Society as a whole wants to protect vulnerable people. We all bear the cost of dealing with criminal activity like this.</p>

<p>Given that sideloaded Android apps are clearly a <em>massive</em> vector for fraud, it obviously behoves Google to find a way to secure their platform as much as possible.</p>

<h2 id="and-yet"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#and-yet">And Yet…</a></h2>

<p>This is quite obviously a bullshit powerplay by Google to ensnare the commons. Not content with closing down parts of the Android Open Source Project, stuffing more and more vital software behind its proprietary services, and freezing out small manufacturers - now it wants the name and shoe-size of every developer!</p>

<p>Fuck that!</p>

<p>I want to use my phone to run the code that I write. I want to run my friends' code. I want to play with cool open source projects by people in far-away lands.</p>

<p>I remember <a href="https://shkspr.mobi/blog/2015/11/the-day-google-deleted-me/">The Day Google Deleted Me</a> - we cannot have these lumbering monsters gatekeeping what we do on our machines.</p>

<p>Back in the days when I was a BlackBerry developer, <a href="https://shkspr.mobi/blog/2012/06/how-do-you-solve-a-problem-like-blackberry/#what-specific-things-could-the-research-in-motion-developer-relations-team-do-or-communicate-that-would-make-you-more-likely-to-develop-applications-for-the-blackberry-10-platform">we had to wait ages for RIM's code-signing server to become available</a>. I'm pretty sure the same problem affected Symbian - if Nokia was down that day, you couldn't release any code.</p>

<p>Going back to their statement:</p>

<blockquote><p>To be clear, developers will have the same freedom to distribute their apps directly to users through sideloading or to use any app store they prefer.</p></blockquote>

<p>This is a lie. I can only distribute a sideloaded app <strong>if Google doesn't nuke my account</strong>. If I piss off someone there, or they click the wrong button, or they change the requirements so I'm no longer eligible - my content disappears.</p>

<p>They promise that <a href="https://developer.android.com/developer-verification">Android will still be open to student and hobbyist developers</a> - but would you believe anything those monkey-punchers say?  Oh, and what a fricking insult to call a legion of Open Source developers "hobbyists"!</p>

<p>I hate it.</p>

<p>I also don't see how this is going to help. I guess if scammers all use the same ID, then it'll be easy for Android to super-nuke all the scam apps.</p>

<p>Perhaps when you install a sideloaded app you'll see "This app was made by John Smith - not a company. Here's his photo. Got any complaints?  Call his number."</p>

<p>But what's going to happen is that people will get their IDs stolen, or be induced to register as a developer and then sign some malware. They'll also be victims.</p>

<h2 id="so-whats-the-solution"><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#so-whats-the-solution">So What's The Solution?</a></h2>

<p>I've tried to be pragmatic, but there's something of a dilemma here.</p>

<ol start="0">
<li>Users should be free to run whatever code they like.</li>
<li>Vulnerable members of society should be protected from scams.</li>
</ol>

<p>Do we accept that a megacorporation should keep everyone safe at the expense of a few pesky nerds wanting to run some janky code?</p>

<p>Do we say that the right to run free software is more important than granny being protected from scammers?</p>

<p>Do we pour billions into educating users not to click "yes" to every prompt they see?</p>

<p>Do we try and build a super-secure Operating System which, somehow, gives users complete freedom without exposing them to risk?</p>

<p>Do we hope that Google won't suddenly start extorting developers, users, and society as a whole?</p>

<p>Do we chase down and punish everyone who releases a scam app?</p>

<p>Do we stick an AI on every phone to detect scam apps and refuse to run them if they're dodgy?</p>

<p>I don't know the answers to any of these questions and - if I'm honest - I don't like asking them.</p>

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

<li id="fn:sideload">
<blockquote class="mastodon-embed" data-embed-url="https://mastodon.social/@Gargron/115093185284473606/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"> <a href="https://mastodon.social/@Gargron/115093185284473606" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z" fill="currentColor"></path></svg> <div style="color: #787588; margin-top: 16px;">Post by @Gargron@mastodon.social</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote>

<p><a href="https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/#fnref:sideload" 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=63058&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/is-it-possible-to-allow-sideloading-and-keep-users-safe/feed/</wfw:commentRss>
			<slash:comments>33</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Contactless Payments with GrapheneOS]]></title>
		<link>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/</link>
					<comments>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 11:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GrapheneOS]]></category>
		<category><![CDATA[nfc]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61636</guid>

					<description><![CDATA[Google&#039;s monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the de facto way to use NFC payments on Android. There&#039;s one problem though - it only works with Google&#039;s Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure GrapheneOS - …]]></description>
										<content:encoded><![CDATA[<p>Google's monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the <i lang="la">de facto</i> way to use NFC payments on Android. There's one problem though - it only works with <em>Google's</em> Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure <a href="https://grapheneos.org/">GrapheneOS</a> - you'll be locked out of it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/GPay-fs8.png" alt="This device can't be set up to pay contactless. Your device doesn't meet pay contactless security standards. It may be rooted or running uncertified software." width="504" class="aligncenter size-full wp-image-61637">

<p>First of all, Google is lying. It <em>does</em> meet security standards and it is <em>not</em> rooted.  I get that <a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">I have no right to run someone else's software in an environment they don't like</a>, but this is just misinformation.  3rd party OSes are often <em>more</em> secure that a stock OS which has been left to rot by an unresponsive manufacturer.</p>

<p>Anyway, here's how you can use contactless payments on Graphene.</p>

<h2 id="prerequisites"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#prerequisites">Prerequisites</a></h2>

<p>I'm going to tell you what I did. If you found another way, leave a comment or write your own blog post.</p>

<p>I'm using the latest version of Graphene (2025062000) with Play Services installed. The app is running in my main profile. None of the advanced app protection has been toggled for the app. NFC is on.</p>

<p>You will have to agree to <a href="https://www.curve.com/legal/privacy/">Curve's privacy policy</a>. And the privacy policy of your credit card. Look, if you're using Graphene, you're probably overly privacy sensitive. If you're concerned about The Man™ knowing that you used your card to buy a breakfast beer and then sharing that with 958 trusted partners, just use cash instead.</p>

<h2 id="install-curve"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#install-curve">Install Curve</a></h2>

<p><a href="https://www.curve.com/join#D4MK9ZKN">Here's a referral link to install Curve</a> - join and you get £10.  Or, you can <a href="https://play.google.com/store/apps/details?id=com.imaginecurve.curve.prd">install directly from the Play Store</a>.</p>

<p>You'll need to create an account and pass KYC / AML checks. <a href="https://www.fca.org.uk/consumers/fca-firm-checker/firm-10456-925447">Curve are regulated by the FCA</a> so you should feel safe giving your details to them.</p>

<h2 id="add-a-card"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#add-a-card">Add a card</a></h2>

<p>Curve is a <em>virtual</em> card provider. So add your existing Visa or MasterCard to the app (no Amex). When you spend on Curve, you're actually spending on the underlying card you've added. Curve promise cheaper foreign exchange fees and a few other perks. But what we're really interested in is NFC payments.</p>

<h2 id="set-up-curve-pay"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-up-curve-pay">Set up Curve Pay</a></h2>

<p>On your app's dashboard, you should see a banner saying "Curve Pay is good to go!". If not, head into your account and set it up there.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-to-go-fs8.png" alt="Curve dashboard." width="504" class="aligncenter size-full wp-image-61638">

<p>If it has all set up, you should see a welcome tutorial explaining how contactless works.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-To-Go-fs8.png" alt="Animation showing how to hold your phone to an NFC payment terminal." width="504" class="aligncenter size-full wp-image-61639">

<h2 id="set-your-default-wallet"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-your-default-wallet">Set your default wallet</a></h2>

<p>On your phone, go to Settings → Connected devices → Connection Preferences → NFC → Contactless Payments.</p>

<p>Or, search your settings for Pay.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Pay-Location-fs8.png" alt="Settings search page." width="504" class="aligncenter size-full wp-image-61640">

<p>Select your default wallet app - in this case, Curve.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Default-Wallet-App-fs8.png" alt="List of available wallet apps." width="504" class="aligncenter size-full wp-image-61641">

<h2 id="pay-for-something"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#pay-for-something">Pay for something</a></h2>

<p>You need to make sure NFC is turned on before you can use NFC payments. I know that sounds obvious, but I forgot to do it the first time and got very confused.</p>

<p>Go to a local shop, pick up something, hand it to the merchant, wave your phone over the payment terminal like you are a technowizard from the future.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Notification-fs8.png" alt="Notification showing I paid £3.95 for a sticky bun." width="504" class="aligncenter size-full wp-image-61642">

<p>Enjoy eating whatever you paid for!</p>

<h2 id="thats-it"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#thats-it">That's it!</a></h2>

<p>Once you're done, you can turn of NFC if you're paranoid.</p>

<p>Apparently, <a href="https://justfollow.me.uk/@sborrill/114761774161342879">Curve also works with Garmin Smart Watches</a> - but I don't have one to test out.</p>

<p>If you've found this blog post useful, I'd be grateful if you signed up with <a href="https://www.curve.com/join#D4MK9ZKN">my referral link for Curve</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61636&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/feed/</wfw:commentRss>
			<slash:comments>23</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Too many overflows reporting Gmail spam]]></title>
		<link>https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/</link>
					<comments>https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 03 May 2025 11:34:30 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[users]]></category>
		<category><![CDATA[ux]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=59814</guid>

					<description><![CDATA[What does the humble ⋮ symbol mean to you?  To geeks, it is a compelling attraction. Something cool and esoteric lives in there! All sorts of goodies to explore and configure.  To normal people, it is invisible. Normal people don&#039;t go pushing random icons on their apps because computers are fragile and may break if you do the wrong thing.  To me, it is a sign that product managers are a menace a…]]></description>
										<content:encoded><![CDATA[<p>What does the humble <kbd>⋮</kbd> symbol mean to you?</p>

<p>To geeks, it is a compelling attraction. Something cool and esoteric lives in there! All sorts of goodies to explore and configure.</p>

<p>To normal people, it is invisible. Normal people don't go pushing random icons on their apps because computers are fragile and may break if you do the wrong thing.</p>

<p>To me, it is a sign that product managers are a menace and must be stopped. A hundred thousand icons vying for your attention have been stuffed away because no one has the authority to prioritise user needs.</p>

<blockquote><p>As a | user who has received some spam</p>

<p>I want to | easily report it as spam</p>

<p>So that | <del>Google's AI can become ever stronger</del> my inbox is easier to manage</p></blockquote>

<p>How do you report spam?  On the web, it is possible if you're prepared to enter the forbidden lair of <kbd>⋮</kbd>. Click the one nearest the message and you'll see:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-Web-2nd.webp" alt="Web version of Gmail. The second overflow menu has a report spam option." width="771" height="623" class="aligncenter size-full wp-image-59816">

<p>But there is no "report spam" button in the Gmail app. Try to find it. I promise you it isn't there.</p>

<p>No, not even behind the door of mysteries which is <kbd>⋮</kbd>.  See:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-App-2nd.webp" alt="App version of Gmail. The second overflow menu has no report spam option." width="504" height="710" class="aligncenter size-full wp-image-59818">

<p>Ah ha! <strong>FOOLISH USER!!</strong> You thought that you could transfer a mastered skill from one environment to another? You are an idiot. A buffoon. The Eloi at Google mock your Morlock ways.</p>

<p>Here is the report spam button in the Gmail app - hidden in the <em>top</em> <kbd>⋮</kbd> menu!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-App-1st.webp" alt="App version of Gmail. The first overflow menu has a report spam option." width="504" height="710" class="aligncenter size-full wp-image-59819">

<p>And, just for completeness, here's what the top <kbd>⋮</kbd> on the web has.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-Web-1st.webp" alt="Web version of Gmail. The first overflow menu has no report spam option." width="771" height="623" class="aligncenter size-full wp-image-59817">

<h2 id="why"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#why">Why?!</a></h2>

<p>Why do the Monkey-Punchers at Google have such scorn for its users?  Is it because their illegal monopoly means they don't have to compete for users? Do their perverse internal politics only reward employees for adding features, not removing them? Perhaps the web team and the app team are engaged in holy war around a doctrinal schism over icon placement?</p>

<p>We may never know.</p>

<h2 id="ok-but-why"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#ok-but-why">OK, but why?</a></h2>

<p>Why do the overflows on the web have icons but on the Android app they're barren?</p>

<p>Why is the order of the options completely different on both?</p>

<p>Why are the names different for the same functions?</p>

<p>We can only assume that the web team are Montagues and the app team Capulets.</p>

<h2 id="what-is-going-on"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#what-is-going-on">What is going on?</a></h2>

<p>Moving a UI from the big screen to the small screen is difficult. Some options aren't relevant in either context. Some labels are too big. Some prioritisation needs to happen. I accept that.</p>

<p>But users only have limited cognitive plasticity. They have a mental model of how a UI works and they expect it to be <em>reasonably</em> consistent.</p>

<p>I keep making the same mistake. Whether I'm on the web or app, I <em>always go to the wrong option!</em> This makes me feel like an idiot. I have a hundred apps to use, each with subtly different UIs - I can't be expected to keep them all straight.  But I do expect the a common set of paradigms if the services are under the auspices of a single company.</p>

<p>Why are there two <kbd>⋮</kbd> menu options? I <em>think</em> the top relates to the conversation whereas the second relates to the specific message? But maybe I'm wrong.</p>

<h2 id="two-out-of-three-aint-bad"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#two-out-of-three-aint-bad">Two out of three ain't bad</a></h2>

<p>I lied earlier. There's a <strong>third</strong> way to report spam.</p>

<p>On the web, hover over one of the mysterious small icons - the ones with ridiculously thin lines and low contrast - and you'll be rewarded with this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Report-Spam.webp" alt="Icon bar with report spam." width="507" height="264" class="aligncenter size-full wp-image-59824">

<h3 id="make-it-make-sense"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#make-it-make-sense">Make it make sense!!</a></h3>

<iframe title="‘Spamalot’ promete carcajadas con Adal Ramones, Omar Chaparro y un reparto espectacular | Hoy" width="620" height="349" src="https://www.youtube.com/embed/z9Qu137_4As?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=59814&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Google has no faith in its ability to launch new products]]></title>
		<link>https://shkspr.mobi/blog/2025/01/google-has-no-faith-in-its-ability-to-launch-new-products/</link>
					<comments>https://shkspr.mobi/blog/2025/01/google-has-no-faith-in-its-ability-to-launch-new-products/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 20 Jan 2025 12:34:44 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[products]]></category>
		<category><![CDATA[rant]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=55396</guid>

					<description><![CDATA[Back when I was a product manager for a large mobile network operator, we faced a constant problem. How do you launch a new product to the public?  Most people are reluctant to try new things. Even in the exciting world of proto-smartphones, convincing someone to download, install, configure, and use a new app was difficult. Sure, we could run expensive advertising campaigns. Send hopeful text…]]></description>
										<content:encoded><![CDATA[<p>Back when I was a product manager for a large mobile network operator, we faced a constant problem. How do you launch a new product to the public?</p>

<p>Most people are reluctant to try new things. Even in the <em>exciting</em> world of proto-smartphones, convincing someone to download, install, configure, and use a new app was difficult. Sure, we could run expensive advertising campaigns. Send hopeful text messages. Have a big celebrity endorsement. Or maybe get our customer service reps to push it.</p>

<p>In the end, we pre-installed it on every device we sold. Then we forcibly pushed it to every supported phone on our network.  The backlash was incredible. As you might expect, people think of their phones as their own personal space. Having a new app shoved on there felt like an invasion. It took up memory space, true, but more importantly it took up <em>psychological</em> space. We had reminded customers that we thought of them as little more than cattle; a resource we controlled with an aim to extract value.</p>

<p>Google is in a similar boat today.  They have absolutely no confidence that their Gemini AI Assistant is any good. They've run countless tests with customers and it is a dud. But they've invested a lot of money, so it needs to launch.  Customers, in the main, decline to install it and they certainly refuse to pay for it. So what's Google's solution?</p>

<p>They have forcibly installed it, jacked up the prices, and made it impossible to remove.</p>

<p>These are not the actions of a company which believes in its own products.</p>

<p>To be fair to Google, it is a problem seen in many businesses. They crave instant success, they want to see massive overnight numbers, and they have a winner-takes-all mentality. But the real world isn't like that. <a href="https://en.wikipedia.org/wiki/The_customer_is_not_a_moron">Customers aren't morons</a> but they lead busy and complex lives. You product is important to you, but it is <em>utterly</em> irrelevant to most customers. It is your job to convince people that your product has merits. You have to listen to them <em>and</em> get their consent.</p>

<p>People don't deserve to be tricked into installing something. Forcing people to use your product is <em>disrespectful</em></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=55396&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/01/google-has-no-faith-in-its-ability-to-launch-new-products/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Review: Pebblebee Clip Universal - and Android "Find My Device" Tracker ★★★⯪☆]]></title>
		<link>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/</link>
					<comments>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 11 Jan 2025 12:34:15 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ble]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[review]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=54516</guid>

					<description><![CDATA[Android is belatedly getting a Bluetooth tracker feature which doesn&#039;t rely on proprietary apps. Long-time readers will know that back in 2016 I reviewed both the Chipolo and the TinTag.  Both of those were adequate at finding things which were in range of your phone, but hopeless at finding lost items - because they required everyone to have a special app installed.  But now, under pressure from …]]></description>
										<content:encoded><![CDATA[<p>Android is belatedly getting a Bluetooth tracker feature which doesn't rely on proprietary apps. Long-time readers will know that back in 2016 I reviewed both the <a href="https://shkspr.mobi/blog/2016/11/review-chipolo-plus/">Chipolo</a> and the <a href="https://shkspr.mobi/blog/2016/06/tintag-unboxing-and-review/">TinTag</a>.  Both of those were adequate at finding things which were in range of your phone, but hopeless at finding lost items - because they required <em>everyone</em> to have a special app installed.</p>

<p>But now, under pressure from Apple's incredible Find My network, Google has started rolling out a similar service to modern Android phones. In <em>theory</em> it should be much better; Android has a higher market share than iOS in most parts of the world I'm interested in visiting. But Apple's monoculture means they can quickly roll out the network to a much higher range of devices than Google.</p>

<p>The Pebblebee "Universal" range works with both Apple and Android's networks. But, crucially, <em>not at the same time</em>. You can reset the device and swap it between your iPhone and Galaxy - but it won't connect to both networks simultaneously.</p>

<p>Hey, remember when Google and Apple collaborated so that Covid tracing apps were interoperable no matter the device? Good times, man! But, y'know, this is just for protecting property, not life. So we'll give them a pass…</p>

<p>This is what the Pebblebee Clip looks like.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-box.jpg" alt="Small plastic disk with a small metal ring." width="1024" height="1024" class="aligncenter size-full wp-image-55182">

<p>It's a fairly unobtrusive small disk. Clip it to a thing with the included clip, hide it in the lining, glue it to a device. The logo is a clickable button which is used for <a href="https://help.pebblebee.com/article/hx8kcsewp0-get-started-with-your-pebblebee-for-android">pairing the device</a>, resetting, and checking the battery.</p>

<p>It also comes with a ridiculously short USB-C-to-C cable which can only be used for charging.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-USB.jpg" alt="A USB-C cable that is only a couple of cm long." width="1024" height="768" class="aligncenter size-full wp-image-55184">

<p>Dump it and grab a longer cable from your big box of cables. Total e-Waste, shouldn't have been included.</p>

<p>When you tell the app to make the PebbleBee identify itself, you're rewarded with this display of loud beeps and disco lasers.</p>

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

<p>The lights are bright and the sound is piercing - especially considering its size. It fits neatly in a hand and is small enough to tuck away in a pocket.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblebee-lights.jpg" alt="The disk has a USB-C socket at the bottom and flashing lights on the side." width="1024" height="768" class="aligncenter size-full wp-image-55183">

<p>But what's it like to use?</p>

<h2 id="pros"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#pros">Pros</a></h2>

<ul>
<li>USB-C rechargable. No more faffing about trying to find a new battery. No e-Waste. No worrying if it'll last an entire trip. Shove it into to any USB power source and you're good to go.</li>
<li>Loud beeper. One of the main reasons I got this was that it (reportedly) has the loudest speaker on the market. I can't compare it to others but it is certainly good enough for hearing in a crowded train carriage.</li>
<li>Lights. The sides light up - handy for giving you a visual cue as to where it is.</li>
<li>Small, light, and includes a keyring connector.</li>
<li>You can <a href="https://blog.google/products/android/android-find-my-device/#:~:text=Share%20accessories">share trackers between accounts</a>. My wife and I each have a suitcase. We don't just want to know where our own bag is - we both want to know where <em>both</em> bags are.</li>
</ul>

<h2 id="cons"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#cons">Cons</a></h2>

<p>The downsides of the device are minimal - depending on your use case.</p>

<ul>
<li>Not waterproof. Certainly water resistant - but the USB-C socket is an ingress point for fluids.</li>
<li>No Ultra Wide Band. That means you don't get a precise direction when looking for something - just the distance. UWB isn't supported on Google's "Find My Device" network right now, so this isn't a great loss.</li>
<li>No wireless charging.</li>
<li>Cost. Even in bulk, with a discount, they were £25 each.</li>
</ul>

<h2 id="security"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#security">Security</a></h2>

<p>Anyone who finds your tracker can <a href="https://help.pebblebee.com/article/aroje5h88v-how-to-factory-reset-a-clip-or-card">factory reset it</a>. I can't help but feel there should be a way to prevent that. But, to be honest, if a thief has found your token they can just throw it away or destroy it.</p>

<p>Firmware updates aren't available in the Google Find My app. So you'll need to <a href="https://help.pebblebee.com/article/ako3p1yfzd-fmd-update">use Pebblebee's own app</a>.</p>

<p>The USB-C port is for power only. They don't show up as a device when connected to a computer.</p>

<h2 id="testing"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#testing">Testing</a></h2>

<p>I wasn't able to <a href="https://github.com/GrapheneOS/os-issue-tracker/issues/4079">connect to the PebbleBee using GrapheneOS</a> - one of the downsides of using a hyper-secure version of Android.</p>

<p>I used a separate phone, but couldn't get the device to pair. I kept getting this message:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/upgrade-fs8.png" alt="Error saying I need to upgrade my Android version." width="504" height="533" class="aligncenter size-full wp-image-55187">

<p>I had to go to Setting → Google → Devices → Scan for nearby devices. Only then could I add it to Find My Device.</p>

<p>The FMD service lets you share devices with another Google account. Perfect for families and loved ones! When I tried to use it, I got this error message on the GrapheneOS phone.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/not-available-fs8.png" alt="Error saying &quot;Device sharing is not available on this device&quot;." width="504" height="504" class="aligncenter size-full wp-image-55186">

<p>That's probably a GrapheneOS issue. But it is dissapointing these sorts of things aren't standardised and baked into the OS.</p>

<p>In terms of tracking - a bit crap. In Gatwick airport - a pretty busy destination - they stayed tracked for a bit after we dropped off our bags. But in less busy destinations, they never pinged the network.  They claim a 150m range which <em>ought</em> to several times better than an AirTag. But without a critical mass of Android users opted-in to the network, it is pointless.</p>

<h2 id="privacy"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#privacy">Privacy</a></h2>

<p>I'm a bit of a privacy nut. There's no doubt that these can be used to stalk people - but the Find My app is supposed to alert you if it detect a tag following you.</p>

<p>Is having Google and Apple know where all your stuff is a good thing? Well, probably not. But if it is a choice between seeing where a thief has taken my laptop bag and a multinational knowing what train I took, I guess I'm surprisingly OK with it.</p>

<p>Yes, it is a Devil's Bargain. Location is useful for surveillance (be it advertising or police) but it is also useful for personal security. It isn't nice living in a <a href="https://en.wikipedia.org/wiki/Panopticon">Panopticon</a> but it also isn't nice to lose your expensive possessions.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/#verdict">Verdict</a></h2>

<p>From a tech point of view - they sort of work! BLE is now an established technology and is well supported on all modern phones. Google's "Find My" app is basic, but works at tracking your devices when they're near you. The device is loud, bright, and is quickly recharged.</p>

<p>If you have a phone that support it, they're a reasonable device. At £25 each, they are optimistically priced.  Especially given the coverage issues.</p>

<p>And that's the crux of the issue. As of yet, the network simply isn't as expansive as the Apple version.  Apple have the ability to push out a service to millions of users, Google don't. While there are more Android users (certainly in my part of the world) there isn't a mechanism to bootstrap this network.</p>

<p>Back in the day when Google was ambitious, they would have stuck sensors all around the country or ran a massive campaign encouraging people to get involved or launched a cool API or given out a million trackers as freebies. But Google is now a timid and cautious shadow of its former self. Everyone in tech half-expects the Find My Device network to join the <a href="https://killedbygoogle.com/">Google Graveyard</a> like so many other interesting projects.</p>

<p>So, for now, these are great if you're within a few hundred metres of them. And they're barely adequate under any other circumstances.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=54516&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/01/review-pebblebee-clip-universal-and-android-find-my-device-tracker/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2024/01/pebblesmall.mp4" length="1081023" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Is Android Unicode Yet?]]></title>
		<link>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/</link>
					<comments>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 07 Oct 2024 11:34:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=53054</guid>

					<description><![CDATA[Google&#039;s Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last decade.  Back in 2013, Google created the &#34;Noto&#34; project. Its aim? To include &#34;all the world&#039;s languages&#34;. They wanted to banish &#34;tofu&#34; - the little white blocks □ which indicate a missing character - hence t…]]></description>
										<content:encoded><![CDATA[<p>Google's Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last <em>decade</em>.</p>

<p>Back in 2013, Google created the "Noto" project. Its aim? <a href="https://www.npr.org/sections/codeswitch/2014/08/03/337168933/-no-tofu-doesn-t-equate-to-no-problem-for-google-universal-typeface">To include "all the world's languages"</a>. They wanted to banish "tofu" - the little white blocks □ which indicate a missing character - hence the name "No Tofu" / "Noto".</p>

<p>There was great flurry and excitement which has, thankfully, been sustained over the years. Noto continues to churn out regular updates to their fonts. Android began to use Noto but, for some unknown reason, it only rarely uses the latest versions. This means whole swathes of modern characters are missing from Android.</p>

<p>You can see <a href="https://cs.android.com/android/platform/superproject/main/+/main:external/noto-fonts/;bpv=1">all the fonts included in the Android Open Source Project</a>. If you want to download them all, run: <code>git clone https://android.googlesource.com/platform/external/noto-fonts</code></p>

<p>Open up the fonts in your favourite editor, and you'll see just how outdated they are.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/09/Noto-Symbols-fs8.png" alt="Fontforge showing the version is from 2013." width="1221" height="546" class="aligncenter size-full wp-image-53076">

<p>For example, Gujarati is stuck on 2013's version (1.03) despite <a href="https://github.com/notofonts/gujarati/releases">v2.106 being released in 2023</a></p>

<p>It's a similar story for the technical symbols block - Android is stuck on v1.09 despite <a href="https://github.com/notofonts/symbols/releases">a decade of advances</a>.</p>

<p>A few, like <a href="https://github.com/notofonts/hentaigana">Hentaigana</a> were only created recently - and so are on the latest version. But the majority are woefully outdated.</p>

<p>Perhaps that's just a lack of love for AOSP? Not at all. I downloaded <a href="https://developer.android.com/about/versions/15/download">the latest beta version of Android 15</a> and went through all the fonts it included.  They're exactly the same<sup id="fnref:hebrew"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:hebrew" class="footnote-ref" title="Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags." role="doc-noteref">0</a></sup>.</p>

<h2 id="how-bad-is-it"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#how-bad-is-it">How bad is it?</a></h2>

<p>I decided to compare all the recently published Noto fonts and those available in AOSP.</p>

<p>I <a href="https://github.com/notofonts/notofonts.github.io">downloaded all the most recent Noto fonts from GitHub</a>. It does take some time for fonts to be tested on phones so, in the spirit of fairness, I grabbed the 2024-01-01 release.</p>

<p>Here's what I found.</p>

<p>Of the 224 non-Emoji fonts in Noto, AOSP only has about 140. About a third are simply missing.</p>

<p>Of the fonts included with Android 15, how many were updated within the last 2 years?  <strong>Ten</strong>.  Not a typo.</p>

<p>Despite a regular publishing cadence from another Google project, Android is ignoring the vast majority of updates.</p>

<p>This means Android is missing entire languages, has severely outdated fonts in others, and - most importantly - <a href="https://unicodepowersymbol.com/">doesn't include the Unicode Power Symbol</a>.</p>

<p>Noto is a great effort - but Android is failing to keep up.</p>

<h2 id="what-now"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#what-now">What now?</a></h2>

<p>I've <a href="https://issuetracker.google.com/issues/366415133">raised a bug on the AOSP bug tracker</a><sup id="fnref:die"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:die" class="footnote-ref" title="Which is where all bug reports submitted by the public go to die." role="doc-noteref">1</a></sup>. And I've published this ranty blog post. If you work for Google, or an Android manufacturer, please give the Android team a nudge and get them to update.</p>

<p>Ideally, Project Treble would allow for these fonts to be updated, so even older versions of Android could benefit from them.</p>

<h2 id="full-list-of-fonts-dates-and-versions"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#full-list-of-fonts-dates-and-versions">Full List of Fonts, Dates, and Versions</a></h2>

<p>I've generated this based on the 2024-01-01 release of Noto and the AOSP source code from 2024-09-13.  I've placed the dates next to each other for ease of comparrison. Empty cells means the font doesn't exist in that release.</p>

<p>I've tried to transcribe all the data accurately. Corrections very much welcome.</p>

<table><thead>
  <tr>
    <th></th>
    <th colspan="2">Noto</th>
    <th colspan="2">AOSP</th>
  </tr>
  <tr>
    <td>Font Name</td>
    <td>Version</td>
    <td>Date</td>
    <td>Date</td>
    <td>Version</td>
  </tr>
</thead>
<tbody>

  <tr>
    <td>Noto Fangsong KSS Rotated Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Fangsong KSS Vertical Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Kufi Arabic Regular</td>
    <td>2.108</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Looped Thai Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Music Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic Regular</td>
    <td>2.018</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic UI Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Nastaliq Urdu Regular</td>
    <td>3.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Rashi Hebrew Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>3</td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Unjoined Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Anatolian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Arabic Regular</td>
    <td>2.012</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Sans Avestan Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Balinese Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bamum Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bassa Vah Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Batak Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali UI Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bhaiksuki Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Brahmi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Buginese Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Buhid Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Canadian Aboriginal Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Carian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Caucasian Albanian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Chakma Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Cham Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Cherokee Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Chorasmian Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Coptic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cuneiform Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Cypriot Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cypro Minoan Regular</td>
    <td>1.503</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Deseret Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Duployan Regular</td>
    <td>3.001</td>
    <td>2019</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Egyptian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Elbasan Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Elymaic Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Glagolitic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Gothic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Grantha Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati UI Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gunjala Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Hanifi Rohingya Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hanunoo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Hatran Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2024</td>
    <td>3.001</td>
  </tr>
  <tr>
    <td>Noto Sans Imperial Aramaic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Indic Siyaq Numbers Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Pahlavi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Parthian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Javanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kaithi Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Kawi Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kayah Li Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Kharoshthi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2016</td>
    <td>1.901</td>
  </tr>
  <tr>
    <td>Noto Sans Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Khudawadi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Lao Looped Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lepcha Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Limbu Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Linear A Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Linear B Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lisu Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Lycian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lydian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Mahajani Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam UI Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.103</td>
  </tr>
  <tr>
    <td>Noto Sans Mandaic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Manichaean Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Marchen Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Masaram Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Math Regular</td>
    <td>2.539</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mayan Numerals Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Medefaidrin Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td>2020</td>
    <td>1.001</td>
  </tr>
  <tr>
    <td>Noto Sans Meetei Mayek Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mende Kikakui Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Meroitic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Miao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Modi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2018</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Mongolian Regular</td>
    <td>3.001</td>
    <td>2023</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mono Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mro Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Multani Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Myanmar Regular</td>
    <td>2.107</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans NKo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans NKo Unjoined Regular</td>
    <td>2.004</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nabataean Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nag Mundari Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nandinagari Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans New Tai Lue Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Newa Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nushu Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ogham Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Ol Chiki Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Hungarian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Italic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Old North Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Permic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Persian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Old Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old South Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Turkic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Oriya Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2015</td>
    <td>1.01</td>
  </tr>
  <tr>
    <td>Noto Sans Osage Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Osmanya Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Pahawh Hmong Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Palmyrene Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Pau Cin Hau Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phags-Pa Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans PhagsPa Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phoenician Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Psalter Pahlavi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Rejang Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Runic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Samaritan Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Saurashtra Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Sharada Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Shavian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Siddham Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans SignWriting Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala UI Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sora Sompeng Regular</td>
    <td>2.101</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Soyombo Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Sundanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Syloti Nagri Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.09</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols 2 Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Regular</td>
    <td>3</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Eastern Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Western Regular</td>
    <td>3</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tagalog Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Tagbanwa Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Le Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Tham Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Viet Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Takri Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Supplement Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tangsa Regular</td>
    <td>1.506</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Telugu UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Thaana Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Looped Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh APT Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Adrar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Agraw Imazighen Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ahaggar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Air Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Azawagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ghat Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Hawad Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Rhissa Ixa Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh SIL Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Tawellemmet Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tirhuta Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ugaritic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vai Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vithkuqi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Wancho Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Warang Citi Regular</td>
    <td>3.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Yi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Zanabazar Square Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.07</td>
  </tr>
  <tr>
    <td>Noto Serif Ahom Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Serif Balinese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Display Regular</td>
    <td>2.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dives Akuru Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dogra Regular</td>
    <td>1.007</td>
    <td>2022</td>
    <td>2019</td>
    <td>1.004</td>
  </tr>
  <tr>
    <td>Noto Serif Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Grantha Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2021</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Hentaigana ExtraLight Regular</td>
    <td></td>
    <td></td>
    <td>2023</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Khitan Small Script Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Makasar Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Myanmar Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif NP Hmong Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Old Uyghur Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Oriya Regular</td>
    <td>1.051</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Ottoman Siyaq Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Sinhala Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Tangut Regular</td>
    <td>2.169</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Tibetan Regular</td>
    <td>2.103</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Toto Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Vithkuqi Regular</td>
    <td>1.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Yezidi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Traditional Nushu Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
</tbody></table>

<h2 id="code"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#code">Code</a></h2>

<p>This Python code will get all the TTF fonts in a directory, and its sub-directories, and then print a Markdown table of name, version, and copyright date.</p>

<pre><code class="language-python">import os
import glob

filelist = glob.glob('**/*.ttf', recursive=True)

for file in sorted(filelist):
        filename = os.fsdecode(file)
        if filename.endswith(".ttf"):
                font = ttLib.TTFont(filename)
                ttf_name      = font["name"].getDebugName(1)
                ttf_style     = font["name"].getDebugName(2)
                ttf_version   = font["name"].getDebugName(5).split()[1].split(";")[0]
                ttf_copyright = font["name"].getDebugName(0).split()[1].split("-")[-1]
                print ( f"| {ttf_name} {ttf_style} | {ttf_version} | {ttf_copyright} |")
</code></pre>

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

<li id="fn:hebrew">
<p>Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:hebrew" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:die">
<p>Which is where all bug reports submitted by the public go to die.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:die" 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=53054&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[DMCA as a vector for pornographic spam?]]></title>
		<link>https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/</link>
					<comments>https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 08 Jul 2024 11:34:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[copyright]]></category>
		<category><![CDATA[DMCA]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51055</guid>

					<description><![CDATA[There&#039;s a law in the USA called the DMCA - Digital Millennium Copyright Act. Amongst its myriad provisions is the ability for copyright holders to send takedown notices to service providers. If someone has ripped off your content, you can send them a legal letter saying &#34;take that down&#34;.  People often send DMCA requests to Google saying &#34;this site has stolen my copyrighted content - please remove …]]></description>
										<content:encoded><![CDATA[<p>There's a law in the USA called the DMCA - Digital Millennium Copyright Act. Amongst its myriad provisions is the ability for copyright holders to send takedown notices to service providers. If someone has ripped off your content, you can send them a legal letter saying "take that down".</p>

<p>People often send DMCA requests to Google saying "this site has stolen my copyrighted content - please remove that page from Google."</p>

<p>Google, to their credit, let me know that they'd recently received a complaint about me 😢</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/Notice-of-DMCA-removal-from-Google-Search-fs8.png" alt=" To: Webmaster of https://shkspr.mobi/, Google has been notified, according to the terms of the Digital Millennium Copyright Act (DMCA), that some of the material found on your site allegedly infringes upon the copyrights of others. We’re in the process of removing the allegedly unlawful materials from Google Search results. The notice that we received, with any personally identifying information removed, may be found on the website of Lumen, a third-party aggregator of legal complaint notices, at https://lumendatabase.org/notices/42788513. " width="920" height="566" class="aligncenter size-full wp-image-51080">

<p>Ah, dammit! What photo had I inadvertently copied?<sup id="fnref:copy"><a href="https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/#fn:copy" class="footnote-ref" title="I try to use Creative Commons or copyright-free images where possible. But I'm only human and sometime slip up." role="doc-noteref">0</a></sup>  Here's what Google said:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/URLs-fs8.png" alt="Two URls from my blog. Both relate to CSS." width="920" height="194" class="aligncenter size-full wp-image-51079">

<p>Huh? Back in 2020, I wrote a blog post called "<a href="https://shkspr.mobi/blog/2020/04/this-blog-strips-off-for-css-naked-day/">This blog strips off for CSS Naked Day</a>". It contains a single image:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/04/Firefox-menu-fs8.png" alt="Firefox menu. Go to View, the Page Style, then No Style." width="518" height="239" class="aligncenter size-full wp-image-34632">

<p>That's a screenshot that I took of Firefox.  My use of my image on my site isn't a copyright infringement.</p>

<p>WTAF?</p>

<p>Scrolling through the <a href="https://lumendatabase.org/notices/42788513">legal complaint</a> I found I was in illustrious company.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/07/adulturls-fs8.png" alt="A long list of adult or explicit URls. My domain name is snugly nestled in the middle." width="599" height="600" class="aligncenter size-full wp-image-51078">

<p>After accessing the full report, I discovered that the complaint was made on behalf of an OnlyFans user called "<strong>firefoxs</strong>"  who has - to quote her bio - the "#1 Nicest Tits On OF"<sup id="fnref:qual"><a href="https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/#fn:qual" class="footnote-ref" title="A claim which I am unable to substantiate." role="doc-noteref">1</a></sup>.</p>

<p>Needless to say, I dispute the allegation and I've filed a DMCA Counter Notification.</p>

<p>Perhaps this is just a case of an overzealous lawyer hitting every website which contains an image called "Firefox"? Or perhaps it is a ploy to get a bunch of irate webmasters to visit an OnlyFans page to assess the evidence?</p>

<p>Either way, I think the biggest pair of tits on the Internet are firefoxs' copyright lawyers!</p>

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

<li id="fn:copy">
<p>I try to use Creative Commons or copyright-free images where possible. But I'm only human and sometime slip up.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/#fnref:copy" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:qual">
<p>A claim which I am unable to substantiate.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/#fnref:qual" 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=51055&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/dmca-as-a-vector-for-pornographic-spam/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Inconsistency is a feature, not a bug]]></title>
		<link>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/</link>
					<comments>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 05 Apr 2024 11:34:18 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[ux]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=50083</guid>

					<description><![CDATA[Some of my best friends are designers. But I think we can all agree that - however well-meaning - they can be a little obsessive.  Whether it is fretting over tiny details, or trying to align to a grid which doesn&#039;t exist, or spending time removing useful affordances in the name of æsthetics - they always find a way to make something prettier at the expense of usability.  Google used to have some …]]></description>
										<content:encoded><![CDATA[<p>Some of my best friends are designers. But I think we can all agree that - however well-meaning - they can be a <em>little</em> obsessive.  Whether it is <a href="https://shkspr.mobi/blog/2013/01/are-designers-crazy/">fretting over tiny details</a>, or trying to <a href="https://shkspr.mobi/blog/2018/11/the-myth-of-the-pixel-perfect-grid/">align to a grid which doesn't exist</a>, or spending time <a href="https://shkspr.mobi/blog/2021/06/whatever-happened-to-ui-affordances/">removing useful affordances in the name of æsthetics</a> - they always find a way to make something prettier at the expense of usability.</p>

<p>Google used to have some beautiful logos for its apps. Each had a distinct shape, style, and colour.  Then, someone decided that they all needed a consistent visual language.  And <a href="https://techcrunch.com/2020/10/06/googles-new-logos-are-bad/?guccounter=1">this mess was born</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Google-Workspace-Icons-bad.webp" alt="Row of Google's old icons followed by their new variants. " width="1024" height="435" class="aligncenter size-full wp-image-50097">

<p><em>*sigh*</em> I get it. I really do. Brand is a thing. Users often use visual heuristics to identify similar groups. Having each team go wild on an icon design doesn't always reflect the professionalism and consistency that you want to project.  The logos aren't <em>awful</em> - but I find them a little boring. Not the worst sin in the world. Though that's only half the problem.</p>

<p>In Google's Android, they've decided that - for consistency - all icons must be firmly encased in a white circle. It makes everything look clean, consistent, friendly, and...</p>

<p><a href="https://www.reddit.com/r/mildlyinfuriating/comments/jksggh/i_cant_identify_the_google_apps_at_a_single/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/What-Google-Sees-fs8.png" alt="Google's icons in white circles. Underneath is a row of indistinguishable multi-coloured squares." width="1024" height="687" class="aligncenter size-full wp-image-50098"></a></p>

<p>...oh.</p>

<p>I apologise for getting old. My visual acuity isn't what it once was. When I'm staring at my phone, with its screen caked in fingerprint grease, on a juddering bus, after a long day at work, all I want is a <em>quick</em> way to identify the app I want to use.</p>

<p>Like most people, my brain has evolved to take mental shortcuts. It looks for a distinct shape and colour to identify things. I simply can't do that with modern Android's adaptive icons. They all look like white circles with a splodge of colour in the middle.</p>

<p>A few years ago, I wrote about <a href="https://shkspr.mobi/blog/2018/11/annoyed-by-androids-circular-icons-heres-how-to-fix-them/">fixing Android's circular icons</a>. Sadly, I don't have the skill to produce my own icon pack. But using the open source <a href="https://codeberg.org/kaanelloed/Iconeration/">Iconeration</a> I was able to manually set my icons to be <em>beautifully</em> inconsistent.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/icons.webp" alt="Homescreen filled with multicoloured icons of various shapes." width="504" height="807" class="aligncenter size-full wp-image-50099">

<p>With a glance, I can immediately see which is which. Do I care that they're not all aligned perfectly? Nope!</p>

<p>I've got a high-resolution screen, I want high-resolution artwork. Look at that Firefox icon! It is <em>gorgeous!</em>  It isn't a pale, flat, blob - it has texture and uniqueness.</p>

<p>Phones used to be wild and unique - now they're all boring black rectangles. User Interfaces used to reflect the aspirations of their designers - now they're just a bland corporate mediocrity.</p>

<p>I hope, one day soon, the fashion pendulum will swing back and interfaces can become interesting again.  Until that day, I'll use <a href="https://codeberg.org/kaanelloed/Iconeration/">Iconeration</a> to make my phone easier and more delightful <em>for me.</em></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=50083&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/04/inconsistency-is-a-feature-not-a-bug/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Notes on installing GrapheneOS on a Pixel 8 Pro - some bugs & oddities]]></title>
		<link>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/</link>
					<comments>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 13 Mar 2024 12:34:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[GrapheneOS]]></category>
		<category><![CDATA[LineageOS]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49860</guid>

					<description><![CDATA[These are notes to myself - and anyone else who finds them useful.  Before starting, I booted the Google OS to install the latest firmware and an eSIM. After a few days of enduring Google&#039;s naggy software, I was ready to commit to installing something better.  I tried using the Web Installer. It managed to flash some of the partitions and then failed with:  Failed to execute &#039;claimInterface&#039; on…]]></description>
										<content:encoded><![CDATA[<p>These are notes to myself - and anyone else who finds them useful.</p>

<p>Before starting, I booted the Google OS to install the latest firmware and an eSIM. After a few days of enduring Google's naggy software, I was ready to commit to installing something better.</p>

<p>I tried using <a href="https://grapheneos.org/install/web">the Web Installer</a>. It managed to flash <em>some</em> of the partitions and then failed with:</p>

<p><code>Failed to execute 'claimInterface' on 'USBDevice'</code></p>

<p>So I used the <a href="https://grapheneos.org/install/cli">CLI instructions</a> which were comprehensive. Worth re-reading them a few times to make sure you understand what needs doing. I (foolishly) assumed my fastboot didn't need updating. Tsk!</p>

<p>And then... it just worked!</p>

<p>Well, almost. The device saw the previously installed eSIM, but wouldn't connect to its network. I manually removed it, reloaded it. Still nothing.  So I manually chose the network and that seemed to fix it. No idea if that's a problem with the network, the eSIM, or something else.</p>

<h2 id="bugs"><a href="https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/#bugs">Bugs</a></h2>

<p>As soon as I booted, my network provider sent me a text. I opened up the default messaging app and saw this error:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/messaging-fs8.png" alt="This app was built for an older version of Android. It might not work properly and doesn't include the latest security and privacy protections. Check for an update or contact the app's developer." width="1008" height="588" class="aligncenter size-full wp-image-49880"></p>

<p>This is <a href="https://discuss.grapheneos.org/d/8249-why-does-the-default-sms-app-warn-it-was-built-for-an-older-version-of-android/4">a known problem</a> but it makes for a crappy user-experience. There's no way to update the app in Graphene - you need to manually install your preferred SMS app.</p>

<p>In similar UX fails, I tried to add the clock widget to my home screen. This is what I saw.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Clock-fs8.png" alt="Hard to see graphics." width="1008" height="1851" class="aligncenter size-full wp-image-49881"></p>

<p>If you peer carefully, you'll see an analogue <em>and</em> digital clock. I hadn't switched to dark mode or anything like that - this is the default experience.</p>

<p>I wanted to see how long I could go before installing Google Play Services. The answer was... five minutes. I tried to log in to my password manager using a WebAuthN token and it wouldn't work. The default Vanadium browser can't handle them.  Again, this is a known problem - but it does slightly undermine the attraction of Graphene. I'm privacy conscious and want as little Google in my life as possible. I'm security conscious and want to use MFA everywhere. Pick one.</p>

<p>Partway through the day, I got this internal error:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/03/Unable-fs8.png" alt="Pop up saying it was unable to fetch a list of apps." width="1008" height="840" class="aligncenter size-full wp-image-49882">

<p>I was happily browsing the web with no connectivity issues. So I'm not sure what caused that.</p>

<p>It's annoying that Graphene doesn't support LineageOS's bottom-button changes. I have a decade of muscle-memory saying back is on the right. There's no way to change it, so I've swapped to gesture navigation.</p>

<p>The icon size on the stock launcher are far too small. On a massive screen like the 8 Pro they are tiny. So I've installed <a href="https://github.com/NeoApplications/Neo-Launcher">NeoLauncher</a> which is a lot more customisable.</p>

<p>The only other (non-essential) thing missing is the ability to use Cast to screen share a device. There's a button in the UI, but it does nothing.</p>

<p>Setting up a work-profile required a little bit of a work-around, but seems to have worked. Hurrah for forum threads detailing the various tricks you need.</p>

<p>A software update <a href="https://grapheneos.org/releases#2024031100">allowed DisplayPort via USB-C</a>.  I plugged the 8 Pro into my USB-C hub, it detected the ethernet, keyboard, mouse, and display - graphics came through fine. Although there's <a href="https://mastodon.social/@Edent/112084893031982717">no way to rotate an external screen</a> - so you're stuck with landscape orientation.  My HDMI adapters showed as detected via a little icon - but no video came out.</p>

<p>The Graphene camera's interface isn't as good as GCam and it is missing a bunch of options. Installing the stock Pixel camera worked - and there are lots of hacky derivatives.</p>

<p>Other than that, it has been pretty good so far. My banking apps work, call recording works, 5G and Bluetooth works, eSIM and regular SIM works. There have been a few odd things where apps have complained that they can't work and then suddenly sprang to life - but that might just be Android.</p>

<p>The only big thing Graphene is missing is Google Pay / Wallet. It is <em>so</em> convenient using tap to pay - but getting rid of the rest of the incessant Google bloat is worth the sacrifice.</p>

<p>Overall, I'm happy with the decision to nuke the original Google software. I know they say they'll support the device for 7 years - but I literally have no reason to trust them. Maybe I'm being naïve trusting a group of random hackers to produce a more secure OS - but I'd rather that than further entanglement with an organisation which has repeatedly shown contempt for its customers and users.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49860&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/notes-on-installing-grapheneos-on-a-pixel-8-pro-some-bugs-oddities/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Google Books - search results confuse reviewers with authors]]></title>
		<link>https://shkspr.mobi/blog/2023/09/google-books-search-results-confuse-reviewers-with-authors/</link>
					<comments>https://shkspr.mobi/blog/2023/09/google-books-search-results-confuse-reviewers-with-authors/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 22 Sep 2023 11:34:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[bugs]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46814</guid>

					<description><![CDATA[Google Books is one of many projects that Google has forgotten about. There&#039;s no support available and, of course, it&#039;s impossible to send them a bug report. The best anyone can do is write a ranty blog post and hope it gets noticed.  When I search for my name in Google Books, it returns books I have reviewed. These aren&#039;t books that I&#039;ve written. They don&#039;t mention, quote, or cite me. My reviews …]]></description>
										<content:encoded><![CDATA[<p>Google Books is one of <em>many</em> projects that Google has forgotten about. There's no support available and, of course, it's impossible to send them a bug report. The best anyone can do is write a ranty blog post and hope it gets noticed.</p>

<p>When I search for my name in Google Books, it returns books I have <em>reviewed</em>. These aren't books that I've written. They don't mention, quote, or cite me. My reviews don't appear on the dust-jacket. Google has got confused.</p>

<p>Here's an example.</p>

<p>Go to the <a href="https://books.google.com/advanced_book_search?hl=en">Google Books Advanced Search Page</a> - marvel at how it retain the old Google logo and looks like it hasn't been updated since the early 2000s!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/Google-Books-Search-fs8.png" alt="Google Books Search page. It looks old and outdated." width="1024" height="261" class="aligncenter size-full wp-image-46816">

<p>When I do a search for "Terence Eden" - these are the results.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/09/Google-Books-Search-Results-fs8.png" alt="Google Books Search Results page." width="1061" height="715" class="aligncenter size-full wp-image-46815">

<p>I have reviewed both <a href="https://shkspr.mobi/blog/2020/01/book-review-terry-pratchetts-discworld-imaginarium/">Terry Pratchett's Discworld Imaginarium</a> (excellent) and <a href="https://shkspr.mobi/blog/2021/04/book-review-good-data-by-sam-gilbert/">Good Data by Sam Gilbert</a> (terrible) - but that's my only connection to them. If you go into the results in Google Books, you won't find my name at all.  It's not like Google adds my reviews into its service either.</p>

<p><a href="https://twitter.com/edent/status/1209082854099030016">This has been a problem for at least four years</a>.</p>

<p>As I scroll through the results, there are several books which do mention me (thanks authors!) but loads which are just picking up my review.</p>

<p>To get an idea of the scale of the problem, here's <a href="https://www.google.com/search?tbo=p&amp;tbm=bks&amp;q=%22Terence+Eden%22&amp;tbs=,cdr:1,cd_min:Jan+1_2+2021,cd_max:Dec+31_2+2024&amp;num=10">a search for my name in books published during the last few years</a>. Nearly every result is a book I have reviewed. None of those books contain my name.</p>

<p>Now, earlier I said it is impossible to report bugs to Google Books. That's not quite true. Last year I contacted them on Twitter.  They said:</p>

<blockquote class="social-embed" id="social-embed-1531656670920704000" 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/googlebooks" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRh4BAABXRUJQVlA4IBIBAABQBwCdASowADAAPrVQok2nJCMiJzgKSOAWiWQAzdH/5dgjDUcgCywIlfV7TrC4V8wGVuIlGdJtM3nsLQxvhdQcFR0AAP7+Lo/1ps8sL3zSX5buvB7oXtZHrfqQvF9u3QBgx63ZNzu3AqB0shaC8yfmEdTWvAK5LIHwHD8ilkyaaGDYhU+MQM7/+L5f4nVMbxfPdy0Mz4h+OxIJGlRT+qcoQNZzTk+I/1Pim3FB8qudcP4TAwuwi/x3Y125L0PGX60ExhGp7Xf9V8mBC/6xiZMWHYxbL6wWkiGJKcNN6jKoKWbJgSKJiQMkSIrKd1PaUOlNops4p4vJ7gyWiTFjBLmO18YVeqojzJusWw53CdyFHIAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Google Books</p>@googlebooks</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/edent/status/1525792630436683779">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> Hi, thank you for your feedback. I've passed it along to our engineering team. -Cait</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/googlebooks/status/1531656670920704000"><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="2022-05-31T15:19:41.000Z" itemprop="datePublished">15:19 - Tue 31 May 2022</time></a></footer></blockquote>

<p><em>*sigh*</em></p>

<p>Perhaps their pivot to AI will fix their towering pile of bugs?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46814&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/09/google-books-search-results-confuse-reviewers-with-authors/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I don't think you need to be civil to puppy-smashers]]></title>
		<link>https://shkspr.mobi/blog/2023/08/i-dont-think-you-need-to-be-civil-to-puppy-smashers/</link>
					<comments>https://shkspr.mobi/blog/2023/08/i-dont-think-you-need-to-be-civil-to-puppy-smashers/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 01 Aug 2023 11:34:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[privacy]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46464</guid>

					<description><![CDATA[My good friend Jess wrote this a little while ago:  Jessica Rose@jesslynnroseThe function of a system is its output.If you have dog grooming machine that sometimes smashes puppies and you keep running it, you&#039;re in the dog smashing business.If you work for a mass surveillance company that keeps enabling genocide and undermining democracy...❤️ 2,323💬 23🔁 013:19 - Thu 07 January 2021  The whole thre…]]></description>
										<content:encoded><![CDATA[<p>My good friend Jess wrote this a little while ago:</p>

<blockquote class="social-embed" id="social-embed-1347170900706263041" 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/jesslynnrose" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRuYBAABXRUJQVlA4INoBAABwCgCdASowADAAPrVKnUmnJCKhKq1Q4BaJZgCdM0q9xjxFz1zzdVxuTmg82LD0o4CVFa29xKQUTYpw8DfqFOuWXgrJC/ZlHxrxH7etc8XskwlaxteZKxbI+M5AAAD+/rc5WOIdVP7k6cw0EXHSnj65cRH+HhAs2wF0lzAMrjdIhnHGkljJILOfuHv81JJkhv55JEUxYmyaOw4ncF/fjiWAh26+S0zOwFfrsiQ1weJhhMOwR/xdsD39RHqmYjqYs8wGddQiG+AUP8Ft8IS9AirOMe2Z62jLqYEia77KAAK6KH1jpYUnFVmeRCyC9fak7dC9nbHZb/q9oNkWW6nxIJiJxaSKBsI5Cyt8zKSiH6YNoYEmbv41mcItQjrYyrnDGeEWGGIk6RlZ0jDYBNuWm7TtI0GL7/nDmnnZRG4T2xtf2NNxAT3hHvbQfdv0848EsemO+tD6GmadaAEW+uqJRwKPfbtq8igaxeA8RUOXB+Q72xGwocz+6ZppJ4T3+7vN6lcdQ1acT7cIuLQxH7N/yLSF9NIrwBGHNmKuMhKevxetS9A/lkjM+L1v8oBbe9nw8W8VZdxYEH4cweInNdOSTI4oA3UuCjBMENc2WAuIPpY9F207prCuPoRu4AA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Jessica Rose</p>@jesslynnrose</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">The function of a system is its output.<br><br>If you have dog grooming machine that sometimes smashes puppies and you keep running it, you're in the dog smashing business.<br><br>If you work for a mass surveillance company that keeps enabling genocide and undermining democracy...</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/jesslynnrose/status/1347170900706263041"><span aria-label="2323 likes" class="social-embed-meta">❤️ 2,323</span><span aria-label="23 replies" class="social-embed-meta">💬 23</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-01-07T13:19:06.000Z" itemprop="datePublished">13:19 - Thu 07 January 2021</time></a></footer></blockquote>

<p>The whole thread is worth reading. One thing she doesn't cover is how you should respond when someone proposes to implement a puppy-smashing machine.</p>

<p>If you don't agree with puppy-smashing (and there are two sides to every argument) then it's very important to be polite and civil while discussing the issue - because puppy-smashers are real people with valid feelings.</p>

<p>For example, you could say to them:</p>

<ul>
<li>I'm not so sure that's a great idea. Please would you reconsider?</li>
<li>Hey, just so you know, not everyone is down for puppy smashing. Any thoughts on addressing that?</li>
<li>Interesting. But have you read <em>Smith et al</em>'s work on differential smashing of pets?</li>
<li>You're the good guys! Is there any way you can exclude my puppy from being smashed? He's a service dog.</li>
<li>Perhaps you could only smash puppies 10% of the time? No worries if not!!!</li>
</ul>

<p>And so on. That way you get to have a calm and respectful decision about the the hard work people are doing.  Even if someone is threatening to smash <em>your</em> puppy, you need to keep a cool head and make sure you don't raise your voice.</p>

<p>Right?</p>

<p>No.</p>

<p>The <em>correct</em> response is "What the actual juddering fuck is wrong with you? Don't be such an absolute thundercunt! I'm going to call the authorities right now, you literal scumbag!"</p>

<p>It was <a href="https://web.archive.org/web/20210820211909/https://twitter.com/SonofBaldwin/status/1325516933178028032">Robert Jones, Jr. who said</a>: "We can disagree and still love each other. Unless your disagreement is rooted in my oppression, your denial of my humanity, my right to exist."<sup id="fnref:baldwin"><a href="https://shkspr.mobi/blog/2023/08/i-dont-think-you-need-to-be-civil-to-puppy-smashers/#fn:baldwin" class="footnote-ref" title="Often mis-attributed to James Baldwin" role="doc-noteref">0</a></sup></p>

<p>I don't think you need to be civil to those people who are deliberately trying to harm you. Sure, you might get a more positive reaction if you gently cajole them or politely help them see the error of their ways. But sometimes it is important to let people know <em>vociferously</em> just how much their plans will hurt you and your puppies.</p>

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

<li id="fn:baldwin">
<p>Often mis-attributed to James Baldwin&nbsp;<a href="https://shkspr.mobi/blog/2023/08/i-dont-think-you-need-to-be-civil-to-puppy-smashers/#fnref:baldwin" 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=46464&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/08/i-dont-think-you-need-to-be-civil-to-puppy-smashers/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The Future of the Web is VNC]]></title>
		<link>https://shkspr.mobi/blog/2023/07/the-future-of-the-web-is-vnc/</link>
					<comments>https://shkspr.mobi/blog/2023/07/the-future-of-the-web-is-vnc/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 31 Jul 2023 11:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Satire (Probably)]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46412</guid>

					<description><![CDATA[Many gallons of digital ink spilled at Google&#039;s plans for &#34;Web Environment Integrity&#34; which - depending on who you believe - is either an entirely reasonable proposal to protect users or a devious plan to add DRM to the entire web.  (It&#039;s the latter, obviously.)  We&#039;ll never know exactly whether users want this because Google is pathologically adverse to performing or publishing user research. …]]></description>
										<content:encoded><![CDATA[<p>Many gallons of digital ink spilled at Google's plans for "Web Environment Integrity" which - depending on who you believe - is either an entirely reasonable proposal to protect users or a devious plan to add DRM to the entire web.</p>

<p>(It's the latter, obviously.)</p>

<p>We'll never know exactly whether users want this <a href="https://github.com/RupertBenWiser/Web-Environment-Integrity/issues/46">because Google is pathologically adverse to performing or publishing user research</a>.</p>

<p>Anyway, I have a solution to all of Google's problems.  Forget this notion of untrusted "user agents" executing code on untrustworthy computers. I have a foolproof way of getting pixel-perfect rendering on every device. It also stops scraping. And, as a little side effect, completely defeats ad blocking.</p>

<p>It's <a href="https://en.wikipedia.org/wiki/Virtual_Network_Computing">VNC</a>.</p>

<p>This takes "Server Side Rendering" to the extreme. Render exactly how you want the page to look and then stream it over a remote framebuffer protocol. Users get to see <em>exactly</em> what you want them to see - ads included!</p>

<p>Just imagine the possibilities. No more worrying about which browser is being used - render everything through Chrome and stream to everyone!</p>

<p>Users simply can't alter the content they see - which keeps them safe from hackers, and protects your advertising revenue.</p>

<p>Low bandwidth? VNC will simply degrade the quality of what you see. Look, do you really want poor people viewing your expensive website?</p>

<p>Those naughty hackers won't be able to copy and paste your content - the trusted VNC viewer simply won't let them.</p>

<p>Want to track users across multiple sites? Might be tricky.  Just route all your content through Google's <del>AMP</del> VNC service!</p>

<p>...ugh... I've reinvented <a href="https://blogs.opera.com/news/2015/04/opera-mini-history-new-version-android/">Opera Mini</a> and given myself a sad.</p>

<p>There are <em>so</em> many decent people working at Google. And all the good they're trying to do is being drowned out by mediocre and mendacious crap like this.  Google desperately needs to be broken up. It's simply untenable to have the largest browser in the hands of the largest web advertising firm. Android isn't safe with a firm which priorities their advertisers' needs over their customers' needs.</p>

<p>The thing is, this is coming. There is literally nothing you can do to stop it. Your protests are meaningless next to the desire for some people at Google to sanitise the web.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46412&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/the-future-of-the-web-is-vnc/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[A weird (trap?) artefact in Google Maps]]></title>
		<link>https://shkspr.mobi/blog/2023/07/a-weird-trap-artefact-in-google-maps/</link>
					<comments>https://shkspr.mobi/blog/2023/07/a-weird-trap-artefact-in-google-maps/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 11 Jul 2023 11:34:51 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[maps]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=46229</guid>

					<description><![CDATA[Cartographers occasionally sneak deliberate mistakes into their maps. Known as trap streets they are a simple &#34;copyright trap&#34;. If someone copies their map without permission, the fake street shows evidence of the source of plagiarism.  Google do this sometimes. They once proclaimed that Argleton was a real place - despite its non-existence.  While I was looking for something to do in London…]]></description>
										<content:encoded><![CDATA[<p>Cartographers occasionally sneak deliberate mistakes into their maps. Known as <a href="https://tardis.fandom.com/wiki/Trap_street">trap streets</a> they are a simple "copyright trap". If someone copies their map without permission, the fake street shows evidence of the source of plagiarism.</p>

<p>Google do this sometimes. They once proclaimed that <a href="https://www.lancashiretelegraph.co.uk/news/19101362.argleton--town-lancashire-doesnt-actually-exist/">Argleton was a real place</a> - despite its non-existence.</p>

<p>While I was looking for something to do in London recently, I came across this curious entry.</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Ancient-Meta-Vault-fs8.png" alt="Screenshot of Google maps. in the middle of Mayfair is an entry for an Ancient Metal Vault." width="1024" height="768" class="aligncenter size-full wp-image-46231">
Why does Google think there is an "Ancient Metal Vault" in Mayfair?</p>

<p>There's nothing similar on <a href="https://www.openstreetmap.org/search?query=woodstock%20street%2C%20london#map=19/51.51413/-0.14735">OpenStreetMap</a>. Similarly Bing and Ordnance Survey show nothing there.</p>

<p>I thought it might be a historic place - but there are <a href="https://www.google.com/search?q=%22ancient+metal+vault%22">no search results for it</a>.</p>

<p>What does <a href="https://www.google.com/maps/place/Ancient+Metal+Vault/@51.5141323,-0.1474774,19z/data=!4m6!3m5!1s0x4876052ca46f24cd:0x48169e2262e6dddc!8m2!3d51.514177!4d-0.1474029!16s%2Fg%2F11k54crmk3?entry=ttu">Google Maps say about the place</a>?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/07/Details-fs8.png" alt="Screenshot of a blank details page." width="510" height="370" class="aligncenter size-full wp-image-46230">

<p>Nothing. Except a UK mobile phone number. When I called, I got an <em>American</em> "This number is not in service" message.</p>

<p>If it were a dozen years ago, I'd've thought this was the start of some augmented reality game. But, instead, I think it's most likely an artefact from some old mapping data they've imported.</p>

<p>Either that, or it is time to go digging up some London streets in the dead of night for an exciting caper!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=46229&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/07/a-weird-trap-artefact-in-google-maps/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Gardening & Time Travel with Google Earth]]></title>
		<link>https://shkspr.mobi/blog/2023/05/gardening-time-travel-with-google-earth/</link>
					<comments>https://shkspr.mobi/blog/2023/05/gardening-time-travel-with-google-earth/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 24 May 2023 11:34:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[home]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45799</guid>

					<description><![CDATA[There&#039;s no one dafter than the previous owner of your property. Over the years we&#039;ve found dodgy wiring, horrificly bodged plaster, and things plumbed in backwards.  We&#039;ve started re-doing our garden recently. The hideous decking was quickly rotting away and needed removing. But what would we find under there?  Google&#039;s StreetView for the web lets you take a short trip back in time - if you&#039;re…]]></description>
										<content:encoded><![CDATA[<p>There's no one dafter than the previous owner of your property. Over the years we've found dodgy wiring, horrificly bodged plaster, and things plumbed in backwards.</p>

<p>We've started re-doing our garden recently. The hideous decking was quickly rotting away and needed removing. But what would we find under there?</p>

<p>Google's StreetView for the web lets you take a short trip back in time - if you're lucky, you might catch a glimpse of what your garden looked like over the year.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/streetview-history.jpg" alt="Row of photos going back a decade." width="1004" height="119" class="aligncenter size-full wp-image-45800">
(That's a random house I found, not mine!)</p>

<p>But what about satellite images? Both Bing and Google provide an overhead view of your property. But they only show the most recent images.</p>

<p>There is a way to see previous satellite imagery though! Using the (appallingly named) <a href="https://support.google.com/earth/answer/168344">Google Earth Pro Desktop</a> app. It's available for Linux, Mac, and Windows. Hidden away at the top is a magic little icon:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/Show-Historical-Imagery.jpg" alt="Icon with a tooltip which says &quot;Show Historical Imagery&quot;." width="668" height="188" class="aligncenter size-full wp-image-45810">

<p>Drag it around and you can go back in time - up to the 1940s in some cases.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/Black-and-White-1945.jpg" alt="Black and White aerial photos of London from 1945." width="956" height="660" class="aligncenter size-full wp-image-45811">

<p>Now, the fidelity of the images isn't always brilliant but it's often enough to get a sense about what your area was like long ago.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/Satellite-Houses.jpg" alt="Overhead photo from 2003 of a house." width="906" height="787" class="aligncenter size-full wp-image-45812">

<p>And that's how we found out that the decking was covering a rather fine ornamental pond!</p>

<p>So I've spend the last few weekends excavating it. And cursing the previous owners for filling it with their concrete rubble, sweet wrappers, and broken bricks!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45799&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/05/gardening-time-travel-with-google-earth/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The new .zip TLD is going to cause some problems]]></title>
		<link>https://shkspr.mobi/blog/2023/05/the-new-zip-tld-is-going-to-cause-some-problems/</link>
					<comments>https://shkspr.mobi/blog/2023/05/the-new-zip-tld-is-going-to-cause-some-problems/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 13 May 2023 11:34:42 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[tld]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45766</guid>

					<description><![CDATA[Many years ago, Google applied for the .zip Top Level Domain. ICANN, in its infinite wisdom, granted it. And now, I think, bad things are going to happen.  You see computers try to be helpful. They see you wrote &#34;visit example.com&#34; and autolink the thing which looks like a domain name. That&#039;s handy - especially as most people don&#039;t have the time or skill to write HTML.  So what happens when…]]></description>
										<content:encoded><![CDATA[<p>Many years ago, Google applied for the <code>.zip</code> Top Level Domain. ICANN, in its infinite wisdom, granted it. And now, I think, bad things are going to happen.</p>

<p>You see computers <em>try</em> to be helpful. They see you wrote "visit example.com" and autolink the thing which looks like a domain name. That's handy - especially as most people don't have the time or skill to write HTML.</p>

<p>So what happens when things which are <em>not</em> domain names look like they are domain names? I've been worrying about this for a few years:</p>

<blockquote class="social-embed" id="social-embed-567820810371735553" 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">Grrr... Because .zip is a valid TLD, it's impossible to know whether <a href="http://example.zip">example.zip</a> should be a URL or a filename.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/567820810371735553"><span aria-label="9 likes" class="social-embed-meta">❤️ 9</span><span aria-label="5 replies" class="social-embed-meta">💬 5</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2015-02-17T23:00:05.000Z" itemprop="datePublished">23:00 - Tue 17 February 2015</time></a></footer></blockquote>

<p>Right now there is an old tweet, blog, email, or instant message from an authority figure which points to a non-existent .zip domain.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/people-of-Twitter-talking-about-photos.zip-there-are-lots-of-them.png" alt="people of Twitter talking about photos.zip there are lots of them." width="748" height="777" class="aligncenter size-full wp-image-45773">

<p>Is that domain available to buy? Well, <a href="https://www.registry.google/tlds/tech/">let's look at Google's Domain Availability site</a></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/Screenshot-how-exciting-photos.zip-is-available.png" alt="Screenshot how exciting photos.zip is available." width="860" height="508" class="aligncenter size-full wp-image-45772">

<p><small>(No, I don't know where the missing "T" is either.)</small></p>

<p>Yup! OK, premium domains like <code>photos.zip</code> appear to be about £1,000 - which should put off some scammers. But the price for non-premium .zips is between £10-£30.</p>

<p>Look, I doubt a former president ever Tweeted "Hey, anyone know how I extract files from something called <a href="https://blah.zip">blah.zip</a> on a Mac?" but I'll bet you that something, somewhere, is going to be abused with this new TLD.</p>

<p>I feel like a curmudgeonly old fart. Don't we have <em>enough</em> TLDs? What's the limit?  There are very few meaningful controls on who can register all but the most retrictive TLDs (looking at you, <code>.int</code>!)  So at what point do we just give up and same everyone can have their own Top Level?</p>

<p>Anyway, have fun determining if the link you see was ever intended to link to a website!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45766&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/05/the-new-zip-tld-is-going-to-cause-some-problems/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Reddit is Dropping AMP]]></title>
		<link>https://shkspr.mobi/blog/2023/03/reddit-is-dropping-amp/</link>
					<comments>https://shkspr.mobi/blog/2023/03/reddit-is-dropping-amp/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 27 Mar 2023 11:34:43 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[amp]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[reddit]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45430</guid>

					<description><![CDATA[As part of its continuing quest to alienate all its long-time users provide a better user experience to everyone, Reddit recently announced a slew of changes.  Buried in amongst all the hullabaloo from whinging ungrateful brats thoughtful comments from people with justifiable concerns, was this snippet from a Reddit employee:   An Improved Web Experience - Reddit   Long time readers will remember …]]></description>
										<content:encoded><![CDATA[<p>As part of its continuing quest to <del>alienate all its long-time users</del> provide a better user experience to everyone, <a href="https://www.reddit.com/r/reddit/comments/11zso11/an_improved_web_experience/">Reddit recently announced a slew of changes</a>.</p>

<p>Buried in amongst all the <del>hullabaloo from whinging ungrateful brats</del> thoughtful comments from people with justifiable concerns, was this snippet from a Reddit employee:</p>

<blockquote><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/reddit.png" alt="Whoops - looks like some of the changes we were planning got out of the bag a bit early - yes, the change to compact and i.reddit.com is part of this project. We also intend to deprecate the amp platform this year. We are making these changes in an effort to streamline the experience and reduce the number of ways you can access Reddit on the web. This is part of our broader effort to simplify reddit talked about earlier this month. The changes that happened today to i.reddit.com and compact, and the ones coming to amp do not impact old.reddit." width="845" height="307" class="aligncenter size-full wp-image-45431">
<p><cite><a href="https://www.reddit.com/r/reddit/comments/11zso11/comment/jdeicso/">An Improved Web Experience - Reddit</a></cite>
</p></blockquote>

<p>Long time readers will remember that I <a href="https://shkspr.mobi/blog/2020/12/i-have-resigned-from-the-google-amp-advisory-committee/">resigned from the Google AMP Advisory Committee</a> having been a long time critic of the project.</p>

<p>AMP was an interesting idea (what if we made HTML fast again?!) and brought forth some interesting technologies (like <a href="https://web.dev/signed-exchanges/">Signed Exchanges</a>) - but it ended up being a re-invented WAP<sup id="fnref:wap"><a href="https://shkspr.mobi/blog/2023/03/reddit-is-dropping-amp/#fn:wap" class="footnote-ref" title="Not that one. I mean Wireless Application Protocol!" role="doc-noteref">0</a></sup> which routed everything through a single point of failure.</p>

<p>I genuinely hate to see projects fail - but I can't help but hope this is the start of more people realising that giving unfettered control to an abusive monopoly like Google isn't a good decision.</p>

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

<li id="fn:wap">
<p>Not <a href="https://www.youtube.com/watch?v=hsm4poTWjMs&amp;pp=ygUDd2Fw"><em>that</em></a> one. I mean <a href="https://en.wikipedia.org/wiki/Wireless_Application_Protocol">Wireless Application Protocol</a>!&nbsp;<a href="https://shkspr.mobi/blog/2023/03/reddit-is-dropping-amp/#fnref:wap" 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=45430&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/03/reddit-is-dropping-amp/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Who is the author "JC Shakespeare"?]]></title>
		<link>https://shkspr.mobi/blog/2022/08/who-is-the-author-jc-shakespeare/</link>
					<comments>https://shkspr.mobi/blog/2022/08/who-is-the-author-jc-shakespeare/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 20 Aug 2022 11:34:27 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[shakespeare]]></category>
		<category><![CDATA[yak shaving]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43327</guid>

					<description><![CDATA[Knowledge graphs are tricky beasts to create. Trying to extract semantic metadata from documents is a gargantuan task. Mix them together and you have a recipe for disaster.  While yak-shaving for my MSc, I found an interesting looking research paper authored by one JC Shakespeare.    As you can probably tell from that snippet, there is something a bit hinkey going on here.  Here&#039;s the page that…]]></description>
										<content:encoded><![CDATA[<p>Knowledge graphs are tricky beasts to create. Trying to extract semantic metadata from documents is a gargantuan task. Mix them together and you have a recipe for disaster.</p>

<p>While yak-shaving for my MSc, I found an interesting looking research paper authored by one JC Shakespeare.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-14-55-19-JC-Shakespeare-Google-Scholar.png" alt="Screenshot of Google Scholar result for &quot;Tech Media Corruption in the Age of Information by JC Shakespeare&quot;." width="1224" height="233" class="aligncenter size-full wp-image-43328">

<p>As you can probably tell from that snippet, there is something a bit hinkey going on here.  Here's the page that Google Scholar has scraped:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/tech-media.png" alt="Screenshot showing a quote which ends with &quot;Shakespeare comma Julius Caesar&quot;." width="688" height="583" class="aligncenter size-full wp-image-43329">

<p>It's pretty easy to see what has happened here. The algorithm (whether via simple AI or complex regular expression) "knows" that a typical surname followed by a comma followed by a typical given name is almost certainly a reference.</p>

<p>And so "JC Shakespeare" becomes the author of a delightfully diverse set of papers.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-11-57-13-JC-Shakespeare-Google-Scholar.png" alt="Screenshot of Google Scholar results. Shakespeare has, apparently, written about law, technology, wine, and an article in German." width="1674" height="1288" class="aligncenter size-full wp-image-43330">

<p>Of course, Julius Caesar isn't the only play which gets picked up in this way:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-10-16-RII-Shakespeare-richard-Google-Scholar.png" alt="Narrative integrity Autobiographical identity by RIl Shakespeare." width="1142" height="230" class="aligncenter size-full wp-image-43331">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-10-24-Narrative-and-Identity.png" alt="Narrative integrity Autobiographical identity and the meaning of the &quot;good life&quot; Mark Freeman and Jens Brockmeier How sour sweet music is When time is broke, and no proportion kept! So is it in the music of men's lives. Shakespeare, Richard Il." width="448" height="359" class="aligncenter size-full wp-image-43332">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-11-42-HVI-Shakespeare-richard-Google-Scholar.png" alt="Apprenticeship HVI Shakespeare - The American Dreams." width="1110" height="252" class="aligncenter size-full wp-image-43333">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-11-51-The-American-Dreams-of-John-B.-Prentis-Slave-Trader.png" alt="CHAPTER 2 Apprenticeship Be merry Peter, and feare not thy Master. Fight for the credit of the Prentices. -Shakespeare, Henry VI." width="526" height="303" class="aligncenter size-full wp-image-43334">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-13-57-TA-Shakespeare-richard-Google-Scholar.png" alt="Postmodern Color A Shakespeare - Spirits Hovering Over the Ashes." width="1094" height="262" class="aligncenter size-full wp-image-43335">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-2022-08-01-at-15-14-04-Spirits-Hovering-Over-the-Ashes.png" alt="Postmodern Color Ye white-lim'd walls! Ye alehouse painted signs! Coal-black is better than another hue, In that it scorns to bear another hue; For all the water in the ocean Can never turn the swan's black legs to white, Although she lave them hourly in the flood. -Shakespeare, Titus Andronicus." width="556" height="362" class="aligncenter size-full wp-image-43336">

<p>Remember, AI is a great tool. It can be remarkably quick at drawing <em>nearly</em> correct conclusions from a diverse data set. When talking about AI, we usually discuss false positives and false negatives. But we also need to ask "is this the sort of mistake a human would make?"</p>

<p>As it happens, Google has been making this class of mistakes for a few years:</p>

<blockquote class="social-embed" id="social-embed-1252389218514427909" 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/AlexanderRKlotz" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRqABAABXRUJQVlA4IJQBAABQCQCdASowADAAPrVInkonJCahrjgMyOAWiUAWI9/BuirdMNrg1Sz55/rfaXmCfaeqIzPF0iD9ov7iOwItKdtRumJkBpm2XRr+KYNSOOoXKqrIAAD++wDBLLeHNQAK6RBqxf1UN4IesUTj3gRnm2gja6pS63AR//5Hw5HJEm4K7pSl62u+jSRDJrXAaQogbvcq0qoNbzYLdkBpNP7459VTpgtFvRMGyxMl8BwtEWVLAJB44PaCiPUvZ5GZlJn0nJWmXbAU1RNJJkfN19tW/fLmmZAiX3/MLBhKDW10C/meqEIW/zowaIWib+WSXAY4T9PieDKEUwi/lT0wT8VvnkkS8tK3C4ZbJWYmofpV57l+2/T/xlL5OT2QMEmDlMImkoGGRRWsmPaCTBE1NFEfF3RKMqJtpYqbhZPRVH2B1gc6ITdJAkCxeDosKPOuNk4XK/9lokZvXVx9cUMC8aCh6c/zP81Run4nbxXz5y7S881le+xmTlTRFXWIopEO4y9iThcM6sVemPUCH5HoH1yWMJcDq6AAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Alex Klotz</p>@AlexanderRKlotz</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 Scholar has parsed this cafeteria lunch menu as an author list, and it's delightful <a href="https://x.com/AlexanderRKlotz/status/1252389218514427909/photo/1">pic.x.com/jobE6Z7bpI</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/EWFhVUyUMAIUItI.png" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/AlexanderRKlotz/status/1252389218514427909"><span aria-label="18044 likes" class="social-embed-meta">❤️ 18,044</span><span aria-label="84 replies" class="social-embed-meta">💬 84</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-04-21T00:10:32.000Z" itemprop="datePublished">00:10 - Tue 21 April 2020</time></a></footer></blockquote>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43327&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/08/who-is-the-author-jc-shakespeare/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Failing at reporting Android bugs]]></title>
		<link>https://shkspr.mobi/blog/2022/07/failing-at-reporting-android-bugs/</link>
					<comments>https://shkspr.mobi/blog/2022/07/failing-at-reporting-android-bugs/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 21 Jul 2022 11:34:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=41839</guid>

					<description><![CDATA[I try to write good bug reports, I really do. I fill out templates when asked. I try to include reproducible proof of the bug. I&#039;ll even give a screenshot or screen recording to prove I&#039;m not making things up. If I&#039;m familiar enough with the programming language, I&#039;ll also attempt to say roughly where the problem lies.  Sadly, that&#039;s not always enough.  Two years ago today, I wrote what I thought …]]></description>
										<content:encoded><![CDATA[<p>I try to write good bug reports, I really do. I fill out templates when asked. I try to include reproducible proof of the bug. I'll even give a screenshot or screen recording to prove I'm not making things up. If I'm familiar enough with the programming language, I'll also attempt to say <em>roughly</em> where the problem lies.</p>

<p>Sadly, that's not always enough.</p>

<p>Two years ago today, I wrote what I thought was <a href="https://issuetracker.google.com/issues/161727315">a pretty comprehensive bug report for Android OS</a>.</p>

<p>I included links to public forums where other people were experiencing the issue. I even posted some code which was designed to fix the issue.</p>

<p>Like most public Android bugs, it was assigned to some anonymous drone within the Googleplex - whereupon it was promptly ignored, never to be fixed.</p>

<p>The bug itself is quite minor. But it shows up in all sorts of places, and probably causes people around the world daily annoyance. I don't <em>think</em> it is a security bug - although I'd love to be proved wrong - so there's not much incentive for Google to fix things.</p>

<p>I get that Google receives thousands of bug reports. And I know that triaging them must be a time-consuming problem.</p>

<p>Open Source maintainers don't have to take orders from their users, nor do they have to prioritise trivial complaints. But it is just so frustrating to be unable to make even the merest dent in a bug.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=41839&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/07/failing-at-reporting-android-bugs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Google's AI Doesn't Understand Restaurant Menus]]></title>
		<link>https://shkspr.mobi/blog/2022/06/googles-ai-doesnt-understand-restaurant-menus/</link>
					<comments>https://shkspr.mobi/blog/2022/06/googles-ai-doesnt-understand-restaurant-menus/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 12 Jun 2022 11:34:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42688</guid>

					<description><![CDATA[In the glorious future, every website will be chock-full of semantic metadata. Restaurants won&#039;t have a 50MB PDF explaining the chef&#039;s vision for organic cuisine - instead, they&#039;ll have little scraps of data on the HTML page like:  &#34;hasMenuItem&#34;:{   &#34;@type&#34;:&#34;MenuItem&#34;,    &#34;name&#34;:&#34;Dodo In A Bun&#34;,    &#34;description&#34;:&#34;The legendary extinct bird cooked in tomato sauce, served in a gluten-free bun.&#34;,    …]]></description>
										<content:encoded><![CDATA[<p>In the glorious future, every website will be chock-full of semantic metadata. Restaurants won't have a 50MB PDF explaining the chef's vision for organic cuisine - instead, they'll have <a href="https://schema.org/Menu">little scraps of data on the HTML page</a> like:</p>

<pre><code class="language-json">"hasMenuItem":{
  "@type":"MenuItem",
   "name":"Dodo In A Bun",
   "description":"The legendary extinct bird cooked in tomato sauce, served in a gluten-free bun.",
     "offers":{
       "@type":"Offer",
       "price":"7.99",
       "priceCurrency":"GBP"
     },
</code></pre>

<p>But, for now, they don't.  So Google uses MACHINE LEARNING and DEEP AI to scrape the menus out of PDFs and photos submitted by patrons.  It works about as well as you'd expect.</p>

<h2 id="examples"><a href="https://shkspr.mobi/blog/2022/06/googles-ai-doesnt-understand-restaurant-menus/#examples">Examples</a></h2>

<p>Here's a bunch of screenshots from Google Maps. Would a human have made these mistakes? (No they'd make much more interesting mistakes!)</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/Burger.jpeg" alt="Chicken £0.86. Gourmet Burger £810.76. Veggie US$10.76." width="540" height="540" class="aligncenter size-full wp-image-42691">

<p>Are those realistic prices for burgers? Would a place that sells a gold-covered burger also sell second-hand chicken? Is it usual that UK menus offer items in different currencies? What about this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/paper.jpeg" alt="A side dish called &quot;plain paper&quot; for £45" width="540" height="540" class="aligncenter size-full wp-image-42694">

<p>Is that a likely name for a side dish? You wouldn't find that even in trendy Shoreditch. And, again with the weird pricing. Side dishes rarely cost that much. Still, it could be worse…</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/tikka.jpeg" alt="Chicken Tika Massala listed for £1,990." width="540" height="304" class="aligncenter size-full wp-image-42695">

<p>I <em>guarantee</em> you the little curry shop I was looking at didn't have anything on the menu that pricey!</p>

<p>Other times, it seems to just pick random words in a vague attempt to be "useful".</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/Salad.jpg" alt="List of salads including one called &quot;the&quot;. And another called &quot;middle&quot;." width="540" height="540" class="aligncenter size-full wp-image-42696">

<p>Perhaps my favourite is this British restaurant which offers <del>spam, spam, and more spam</del>:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/05/egg.jpg" alt="A menu with the word &quot;egg&quot; written three times." width="540" height="405" class="aligncenter size-full wp-image-42698"></p>

<p>There were dozens (dozens!) of examples I found within a few minutes of looking for somewhere nearby to grab a cheap lunch. To be fair, when the website has supplied data in an appropriate format, Google is good at displaying it. But when Google tries to be clever... ah.</p>

<p>There is, of course, no way for a user to contact Google and say "I dunno, man. This looks kinda off."</p>

<h2 id="whose-fault-is-it-anyway"><a href="https://shkspr.mobi/blog/2022/06/googles-ai-doesnt-understand-restaurant-menus/#whose-fault-is-it-anyway">Whose Fault Is It Anyway?</a></h2>

<p>Obviously, restaurateurs should provide machine-readable descriptions of their menus. That way search engines, smart speakers, and all sorts of funky computers will be able to parse the food available.</p>

<p>But they don't. Because they're busy cooking.</p>

<p>Google has discovered that it takes 90% of the effort to get 90% of the way there - but the last 10% takes the next 90% of the effort.</p>

<p>As ever, a feature has launched and it is of dubious value to business owners and customers - but I'm sure a product manager at Google got their wings.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42688&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/06/googles-ai-doesnt-understand-restaurant-menus/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
	</channel>
</rss>
