<?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>bug &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/bug/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Fri, 13 Mar 2026 15:18:22 +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>bug &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[An odd font rendering bug in Firefox and Safari]]></title>
		<link>https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/</link>
					<comments>https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 12:34:09 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[font]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=68692</guid>

					<description><![CDATA[First up, you should go and watch The Importance of Being Earnest with Ncuti Gatwa. It is a brilliant set of performances and a joy to see.  While perusing the programme on the National Theatre website I stumbled upon a little bug.  The incredible Ronkẹ Adékọluẹ́jọ́ has her name rendered in a most unusual style:    It rendered just fine in Chrome - but both Firefox and Safari misrendered some of t…]]></description>
										<content:encoded><![CDATA[<p>First up, you should go and watch <a href="https://www.youtube.com/watch?v=obX-HGs-PS8">The Importance of Being Earnest</a> with Ncuti Gatwa. It is a brilliant set of performances and a joy to see.</p>

<p>While perusing the <a href="https://www.nationaltheatre.org.uk/productions/the-importance-of-being-earnest/#cast">programme on the National Theatre website</a> I stumbled upon a little bug.  The incredible Ronkẹ Adékọluẹ́jọ́ has her name rendered in a most unusual style:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/ronke.webp" alt="Screenshot of a website. Contains a phone of a black woman next to her name. Any characters with accents in her name are rendered without boldface." width="2953" height="1798" class="aligncenter size-full wp-image-68694">

<p>It rendered just fine in Chrome - but both Firefox and Safari misrendered <em>some</em> of the accented characters.</p>

<p>Here's a minimum viable demo to show what's happening:</p>

<iframe height="300" style="width: 100%;" scrolling="no" title="FF Font Rendering Issue?" src="https://codepen.io/edent/embed/qEaRyrz?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true">
  See the Pen <a href="https://codepen.io/edent/pen/qEaRyrz">
  FF Font Rendering Issue?</a> by Terence Eden (<a href="https://codepen.io/edent">@edent</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>

<h2 id="fonts-are-hard-ok"><a href="https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/#fonts-are-hard-ok">Fonts are hard, OK?!?!</a></h2>

<p>Broadly speaking<sup id="fnref:complicated"><a href="https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/#fn:complicated" class="footnote-ref" title="It is a lot more complicated than that." role="doc-noteref">0</a></sup>, accented characters can be made in two way.</p>

<ol>
<li>Pre-composed. There is a separate code for the character <code>é</code></li>
<li>Combining. The plain letter <code>e</code> is immediately followed by the <em>combining</em> character <code>◌́</code> and the computer smushes them together.</li>
</ol>

<p>Similarly, a font file can have separate little drawings for each accented character or it can have separate accents.</p>

<p>In this case, the National Theatre is using the font "Helvetica Now Display W04".</p>

<p>The web font contains <code>é</code> (U+00E9) and both <code>◌́</code> (U+0301) &amp; <code>̣◌</code> (U+0323).</p>

<p>But doesn't include <code>ẹ</code> (U+1EB9) or <code>ọ</code> (U+1ECD).</p>

<p>So the ẹ́  and ọ́  have to be made by combining characters in the font.</p>

<p>On Chrome this works. On Firefox and Safari, it seems to break when the CSS is set to <code>font-weight: normal;</code>. This causes the browser to render those characters in the default fallback font - hence the slightly weird look.</p>

<h2 id="next-steps"><a href="https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/#next-steps">Next Steps</a></h2>

<p>I've raised <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=2023126">a bug with Firefox</a> and one with <a href="https://bugs.webkit.org/show_bug.cgi?id=309889">WebKit</a>.</p>

<p>Of course, it might be that they're doing the right thing and Chrome is in the wrong - but I think that's unlikely.</p>

<p>Now, time to fix the font I use on this website to prevent any rendering errors!</p>

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

<li id="fn:complicated">
<p>It is a <em>lot</em> more <a href="https://www.youtube.com/watch?v=5NPBIwQyPWE">complicated</a> than that.&nbsp;<a href="https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/#fnref:complicated" 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=68692&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/03/an-odd-font-rendering-bug-in-firefox-and-safari/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[A little oddity in the way curl deals with old dates]]></title>
		<link>https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/</link>
					<comments>https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 01 Sep 2025 11:34:48 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[time]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=63068</guid>

					<description><![CDATA[For boring technical reasons, computers think the world began on 1st of January 1970. To keep track of the future, they count the number of seconds since that momentous date.  So zero seconds represents midnight on that day.  So how do computers deal with dates before The Beatles&#039; Abbey Road was top of the UK album charts?  Negative numbers! Most modern computers can deal with dates far in the…]]></description>
										<content:encoded><![CDATA[<p>For boring technical reasons, computers think the world began on 1st of January 1970<sup id="fnref:who"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:who" class="footnote-ref" title="Although, who is to say it didn't? Were you there? Do you have proof? Maybe the Young Earth Creationists aren't ambitious enough?!" role="doc-noteref">0</a></sup>. To keep track of the future, they count the number of seconds since that momentous date.  So zero seconds represents midnight on that day<sup id="fnref:midnight"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:midnight" class="footnote-ref" title="Except! Psych! It doesn't! The UK was experimenting with year-round BST so there's actually an hour's difference. Time is hard™." role="doc-noteref">1</a></sup>.</p>

<p>So how do computers deal with dates <em>before</em> The Beatles' Abbey Road was top of the UK album<sup id="fnref:album"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:album" class="footnote-ref" title="Do not search for the number 1 single on that date. You'll give yourself a sad." role="doc-noteref">2</a></sup> charts?</p>

<p>Negative numbers! Most modern computers can deal with dates far in the past and, hopefully, far into the future. Again, for <a href="https://righteousit.com/2024/09/04/more-on-ext4-timestamps-and-timestomping/">boring technical reasons</a>, lots of computers can only save files with a date no earlier than 13th December 1901<sup id="fnref:book"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:book" class="footnote-ref" title="The music charts were less well-developed in 1901. But you could have read &quot;The Purple Cloud&quot; which is a brilliant early sci-fi novel." role="doc-noteref">3</a></sup>.</p>

<p>When you download a file from the Internet, the sending server can tell you when that file was last modified. That's useful if you only want to download the file if it has changed since you last got it.</p>

<p>It presents the date using <a href="https://www.rfc-editor.org/rfc/rfc1123">RFC 1123</a> format for reasons which are lost to the ages.</p>

<p><code>&lt; Last-Modified: Wed, 09 Oct 1940 16:45:49 +0100</code></p>

<p>Great!</p>

<p>If you use the venerable <code>wget</code> utility, it will happily save the file on your disk and tell you that is when it was created.</p>

<p>But what if you use <code>curl -OR</code> to download the file? The <code>-R</code> option says:</p>

<blockquote><p><a href="https://curl.se/docs/manpage.html#-R">Make curl attempt to figure out the timestamp of the remote file that is getting downloaded, and if that is available make the local file get that same timestamp. </a></p></blockquote>

<p>THIS IS A LIE!<sup id="fnref:lie"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:lie" class="footnote-ref" title="Everything you know is false! How deep does this conspiracy go!?!?" role="doc-noteref">4</a></sup></p>

<p>If curl sees a date with a negative time, it pretends that the past doesn't exist and that what you <em>really</em> wanted was to save the file with today's date and time.</p>

<p>Why does it do this?</p>

<p>I <em>think</em> it is because <a href="https://github.com/curl/curl/blob/f08ecdc586203026d1a81bd401486261f28848d3/src/tool_filetime.c#L89-L91">this code only checks for times ≥ 0</a>. Which, I guess, is pretty reasonable. There weren't <em>many</em> computers around before the 1970s<sup id="fnref:zero"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:zero" class="footnote-ref" title="Although, there were some. Not just the secret ones used to control the weather - but actual proper computers you could use to do maths!" role="doc-noteref">5</a></sup> so the chances of finding a file which predates disco are slim.</p>

<p>Should we storm the barricades and demand this temporal anomaly be rectified?<sup id="fnref:photon"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:photon" class="footnote-ref" title="Preferably by firing photon torpedoes. Or maybe ejecting the warp core. I'm not an engineer." role="doc-noteref">6</a></sup> Nah. I've <a href="https://github.com/curl/curl/discussions/18424">raised it as a discussion item on curl's GitHub</a>.</p>

<p>If you have strong opinions about this - please join in the discussion<sup id="fnref:help"><a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fn:help" class="footnote-ref" title="Or seek help from a mental health professional." role="doc-noteref">7</a></sup>.</p>

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

<li id="fn:who">
<p>Although, who is to say it didn't? Were you there? Do you have proof? Maybe the Young Earth Creationists aren't ambitious enough?!&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:who" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:midnight">
<p>Except! Psych! It doesn't! <a href="https://www.shellscript.sh/examples/1970/">The UK was experimenting with year-round BST</a> so there's actually an hour's difference. Time is hard™.&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:midnight" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:album">
<p>Do not search for the number 1 <em>single</em> on that date. You'll give yourself a sad.&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:album" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:book">
<p>The music charts were less well-developed in 1901. But you could have read "<a href="https://en.wikipedia.org/wiki/The_Purple_Cloud">The Purple Cloud</a>" which is a brilliant early sci-fi novel.&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:book" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:lie">
<p>Everything you know is false! How deep does this conspiracy go!?!?&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:lie" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:zero">
<p>Although, there were <em>some</em>. Not just the secret ones used to control the weather - but actual proper computers you could use to do maths!&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:zero" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:photon">
<p>Preferably by firing photon torpedoes. Or maybe ejecting the warp core. I'm not an engineer.&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:photon" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:help">
<p>Or seek help from a mental health professional.&nbsp;<a href="https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/#fnref:help" 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=63068&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/09/a-little-oddity-in-the-way-curl-deals-with-old-dates/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[An annoying SVG animation bug in Chrome]]></title>
		<link>https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/</link>
					<comments>https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 23 Jun 2025 11:34:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[chromium]]></category>
		<category><![CDATA[svg]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61537</guid>

					<description><![CDATA[Writing web standards is hard. You have to write a formal specification which is useful for machines, humans, and web developers.  I recently stumbled across what I think is a little bug which might be caused by a misreading of the SVG Animation specification.  Here you should see two overlapping circles gradually appear:                                                  If you&#039;re on Chrome, you…]]></description>
										<content:encoded><![CDATA[<p>Writing web standards is hard<sup id="fnref:experience"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:experience" class="footnote-ref" title="I do have some experience in this matter." role="doc-noteref">0</a></sup>. You have to write a formal specification which is useful for machines, humans, and web developers<sup id="fnref:webdev"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:webdev" class="footnote-ref" title="Back in 2006, Catharine A. MacKinnon provokatively asked &quot;Are Women Human?&quot;. Her argument (which I shall badly summarise) is that if women were human, then they'd be protected by universal human…" role="doc-noteref">1</a></sup>.</p>

<p>I recently stumbled across what I think is a little bug which <em>might</em> be caused by a misreading of <a href="https://svgwg.org/specs/animations/#KeyTimesAttribute">the SVG Animation specification</a>.  Here you should see two overlapping circles gradually appear:</p>

<svg width="170" height="170" xmlns="http://www.w3.org/2000/svg">
    <path fill="#2c4169" d="M170 0H0v170h170z"></path>
    <circle r="45" cx="50" cy="50" fill="#e4da2e" opacity="0">
        <animate attributeName="opacity" begin="0s" dur="30s" values="0;  1;" keyTimes="0;  1" fill="freeze"></animate>
    </circle>
    <circle r="45" cx="80" cy="80" fill="red" opacity="0">
        <animate attributeName="opacity" begin="0s" dur="30s" values="0;  1;" keyTimes="0;  1;" fill="freeze"></animate>
      </circle>
</svg>

<p>If you're on Chrome, you might only see one circle animate. Why? Bloody semicolons! The bane of every programmer's existence<sup id="fnref:eng"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:eng" class="footnote-ref" title="I imagine English literature students also find them confusing; everyone does." role="doc-noteref">2</a></sup>.</p>

<p>The <a href="https://svgwg.org/specs/animations/#KeyTimesAttribute">specification for SVG Animation</a> has this text for human readers:</p>

<blockquote><p><strong>keyTimes</strong></p>

<p>A semicolon-separated list of time values used to control the pacing of the animation. Each time in the list corresponds to a value in the ‘values’ attribute list, and defines when the value is used in the animation function.</p>

<p>[…]</p>

<p>If the last semicolon separator is followed by either just white space or no more characters, ignore both the separator and the trailing white space.</p></blockquote>

<p>To me, that isn't ambiguous. The text <code>keyTimes="0; 1;"</code> has a final semicolon with nothing after it. Therefore it should be ignored. Instead, Chrome throws an hissyfit and says <code>Error: &lt;animate&gt; attribute keyTimes: Invalid value, "0; 1;".</code></p>

<p>But maybe the humans who wrote the description were sloppy. There's also a machine-readable formal specification. It defines the acceptable sequence as being:</p>

<p><code>&lt;number&gt; [; &lt;number&gt;]* ;?</code></p>

<p>This isn't quite Backus–Naur form<sup id="fnref:bnf"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:bnf" class="footnote-ref" title="Also the bane of programmers everywhere!" role="doc-noteref">3</a></sup>, but rather <a href="https://www.w3.org/TR/css-values/#value-defs">CSS Values</a>.</p>

<ul>
<li>The <code>&lt;number&gt;</code> is a <a href="https://www.w3.org/TR/css-values/#component-types">component</a>.</li>
<li>The <code>[</code> and <code>]</code> are <a href="https://www.w3.org/TR/css-values/#component-combinators">grouping combinators</a>.</li>
<li>The <code>*</code> and <code>?</code> are <a href="https://www.w3.org/TR/css-values/#component-multipliers">component multipliers</a>

<ul>
<li><code>*</code> "indicates that the preceding type, word, or group occurs zero or more times."</li>
<li><code>?</code> "indicates that the preceding type, word, or group is optional (occurs zero or one times)."</li>
</ul></li>
<li>The <code>;</code> is just a semicolon<sup id="fnref:cig"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:cig" class="footnote-ref" title="Just like how sometimes a cigar is just a cigar." role="doc-noteref">4</a></sup>.</li>
</ul>

<p>Reading the definition tells us that a valid value will be a number, followed by zero-or-more groups of "semicolon and another number" with an optional final semicolon.</p>

<p>So, based on my reading, I think Chrome is wrong to throw an error here. Both Firefox and Safari work with a trailing semicolon.</p>

<p>Accordingly, I've <a href="https://issues.chromium.org/issues/427020732">raised a bug with the Chromium team</a>.  If you think I have erred in this matter, please let me know.</p>

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

<li id="fn:experience">
<p>I do have <a href="https://www.w3.org/TR/2018/WD-html53-20180426/">some experience in this matter</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:experience" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:webdev">
<p>Back in 2006, Catharine A. MacKinnon provokatively asked "<a href="https://doi.org/10.2307/j.ctvjnrvck">Are Women Human?</a>". Her argument (which I shall badly summarise) is that if women <em>were</em> human, then they'd be protected by universal human rights. Given the state of the world then (and now) it is hard to argue that women receive as great a level of attention as the <a href="https://www.the-tls.com/politics-society/rights-equality/default-male">default male</a>. I don't intend to trivialise MacKinnon's work - but I do find it interesting that developers are often treated separately from other humans.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:webdev" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:eng">
<p>I imagine English literature students also find them confusing; everyone does.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:eng" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:bnf">
<p>Also the bane of programmers everywhere!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:bnf" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:cig">
<p>Just like how <a href="https://quoteinvestigator.com/2011/08/12/just-a-cigar/">sometimes a cigar is just a cigar</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:cig" 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=61537&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[New Outlook doesn't unhide your taskbar - two quick fixes]]></title>
		<link>https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/</link>
					<comments>https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 23 Oct 2023 11:34:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[microsoft]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48467</guid>

					<description><![CDATA[I quite like the new Outlook for Windows. But it has a couple of annoying bugs. One of which is, when it is maximised it doesn&#039;t let you unhide your bottom task bar.  I&#039;ve set up Windows so the taskbar disappears whenever my cursor isn&#039;t at the bottom of the screen. When my mouse touches the bottom, the bar appears. Lovely! But Outlook breaks this functionality - which I&#039;m pretty sure existed…]]></description>
										<content:encoded><![CDATA[<p>I quite like the <a href="https://support.microsoft.com/en-us/office/getting-started-with-the-new-outlook-for-windows-656bb8d9-5a60-49b2-a98b-ba7822bc7627">new Outlook for Windows</a>. But it has a couple of annoying bugs. One of which is, when it is maximised it doesn't let you unhide your bottom task bar.</p>

<p>I've set up Windows so the taskbar disappears whenever my cursor isn't at the bottom of the screen. When my mouse touches the bottom, the bar appears. Lovely! But Outlook breaks this functionality - which I'm pretty sure <a href="http://www.tech2u.com.au/training/tech2u/win95_1/taskbar.html">existed back in Windows 95</a>.</p>

<p>Microsoft have received several complaints about this<sup id="fnref:see"><a href="https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#fn:see" class="footnote-ref" title="For examples, see &quot;new outlook client : Windows 10 taskbar will not unhide&quot; and &quot;New Windows client blocks the taskbar from unhiding&quot;" role="doc-noteref">0</a></sup>, but done nothing.</p>

<p>Anyway, here's two way you can fix it. Neither are particularly <em>good</em>, but they do work.</p>

<h2 id="dont-maximise"><a href="https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#dont-maximise">Don't maximise</a></h2>

<p>Rather than pressing the big square icon in the top right of the window, just drag the edges of your window to be as big as possible.</p>

<p>This is a stupid fix. Your window is now the same size as your screen but <em>technically</em> isn't maximised. So the taskbar doesn't get stuck behind Outlook.</p>

<h2 id="use-an-external-screen"><a href="https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#use-an-external-screen">Use an external screen</a></h2>

<p>This problem only occurs on my laptop's screen. So I plugged in an external monitor and moved the Outlook window to there.</p>

<p>When maximised, Outlook doesn't prevent the taskbar from appearing.</p>

<h2 id="what-causes-this-problem"><a href="https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#what-causes-this-problem">What causes this problem</a></h2>

<p>I'm pretty sure the New Outlook uses "fullscreen" rather than "maximise". That mode is often used for things like games where you don't want a taskbar suddenly appearing.</p>

<p>But the root cause is Microsoft's decision to ignore customer feedback. Look, bugs happen. That's just a fact of life. But absolutely no-one from the MS team is looking at customer complaints. Being "feature-driven" is great - but you need to close the loop to see if those features are working for customers.</p>

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

<li id="fn:see">
<p>For examples, see "<a href="https://answers.microsoft.com/en-us/outlook_com/forum/all/new-outlook-client-windows-10-taskbar-will-not/44486065-7ffa-423b-98b9-033b1cba1f02">new outlook client : Windows 10 taskbar will not unhide</a>" and "<a href="https://techcommunity.microsoft.com/t5/outlook/new-windows-client-blocks-the-taskbar-from-unhiding/m-p/3847666">New Windows client blocks the taskbar from unhiding</a>"&nbsp;<a href="https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/#fnref:see" 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=48467&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/new-outlook-doesnt-unhide-your-taskbar-two-quick-fixes/feed/</wfw:commentRss>
			<slash:comments>2</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[Responsible Disclosure: Chrome security bug let tabs draw over each other ($1k bounty)]]></title>
		<link>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/</link>
					<comments>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 04 Dec 2021 12:34:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40136</guid>

					<description><![CDATA[Chrome for Android had a flaw which let one tab draw over another - even if the tabs were on completely different domains. A determined attacker might have been able to abuse this to convince a user to download and installed a spoofed app.  See Chrome Bug #1242315 for details.  Demo  Here&#039;s a video of me on one site (Twistory.ml) opening a link to Twitter in a new tab.  Twitter&#039;s mobile site…]]></description>
										<content:encoded><![CDATA[<p>Chrome for Android had a flaw which let one tab draw over another - even if the tabs were on <em>completely different</em> domains. A determined attacker might have been able to abuse this to convince a user to download and installed a spoofed app.</p>

<p>See <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1242315">Chrome Bug #1242315</a> for details.</p>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#demo">Demo</a></h2>

<p>Here's a video of me on one site (Twistory.ml) opening a link to Twitter in a new tab.  Twitter's mobile site contains a <a href="https://web.dev/add-manifest/">Web Manifest</a> which should prompt the user to install an app. Rather than displaying this pop-up on Twitter's tab, Chrome displays it over the unrelated tab.</p>

<p></p><div style="width: 270px;" class="wp-video"><video class="wp-video-shortcode" id="video-40136-2" width="270" height="540" preload="metadata" controls="controls"><source type="video/webm" src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm">https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm</a></video></div><p></p>

<h2 id="why-this-is-a-problem"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#why-this-is-a-problem">Why this is a problem</a></h2>

<p>Here's a (somewhat unlikely) scenario.</p>

<p>You're on, for example, Reddit's website and see an interesting looking link to an external site. You open it in a new tab. All of a sudden, a pop-up appears saying "Reddit is better in the app! Click to download!!"</p>

<p>You download it. Unbeknownst to you, the pop-up was <strong>from the external site</strong>. They saw your <code>referer</code> header and automatically crafted a manifest file which sends you to a malicious copy-cat app. That app steals your password for Reddit, clones your identity, and kills your puppy.</p>

<h2 id="googles-response"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#googles-response">Google's response</a></h2>

<p>I was expecting Google to close this as <code>WONTFIX</code>. In my experience, Google's attitude to lots of bugs is the same as Steve Job's infamous "<a href="https://www.engadget.com/2010-06-24-apple-responds-over-iphone-4-reception-issues-youre-holding-th.html">You're holding it wrong</a>". Blame the user for not understanding how Google's poorly-tested and confusing products work.</p>

<p>But, to be fair, it was taken seriously. I didn't have to provide any extra detail and, while it was low severity, it was fixed promptly. Kudos!</p>

<p>Then came the agonising wait to see whether Google would pay out millions of dollars for this flaw...</p>

<h2 id="bounty"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#bounty">Bounty</a></h2>

<p>For UI bugs like this, Google tends to award $500 - see  <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1136714">1136714</a>, <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1133183">1133183</a>, and <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=841622">841622</a>. Although if you can draw over the security UI, the <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1162942">rewards are much higher</a>.</p>

<p>So I was pleasantly surprised to win a US$1,000 bounty!</p>

<p>Perhaps I could have sold it on the DarkWeb™ for <del>digital Beanie Babies</del> totally legitimate crypto-currency? Nah. Too much hassle! I'm going to plough the money into our <a href="https://openbenches.org">OpenBenches</a> project.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#timeline">Timeline</a></h2>

<ul>
<li>2021-08-23 Discovered and <a href="https://twitter.com/edent/status/1429734143974383617">disclosed</a>. Within a few hours it was accepted, and triaged. With the (fair) comment that "This doesn't look very scary to me."</li>
<li>2021-08-26 <a href="https://chromium-review.googlesource.com/c/chromium/src/+/3119088">Marked as fixed by this commit</a></li>
<li>2021-08-27 <a href="https://chromium-review.googlesource.com/c/chromium/src/+/3124684/">Further patches for related issue</a></li>
<li>2021-09-28 Given a gentle nudge, the Reward Panel offered $1k.</li>
<li>2021-10-08 After an annoying amount of back-and-forth, Google accepted my registration on their supplier platform. The cause of the delay? I used the W8 form from the IRS.gov site - and Google wanted me to use an older one 🙄</li>
<li>2021-11-01 After signing up on their supplier payment platform and jumping through yet more hoops, US$992.50 was deposited in my TransferWise account. Where's the missing $7.50? TransferWise fees? Plus, obviously, a fee to transfer it to GBP and then out to my normal bank account. After all the conversion and fees, it came to £722.64. Quite why the international behemoth Google can't pay in a local currency, I've no idea.</li>
<li>2021-12-03 Bug report set to public.</li>
<li>2021-12-04 Blog post published.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40136&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm" length="1679390" type="video/webm" />

			</item>
		<item>
		<title><![CDATA[What's the window size of a background tab?]]></title>
		<link>https://shkspr.mobi/blog/2021/09/whats-the-window-size-of-a-background-tab/</link>
					<comments>https://shkspr.mobi/blog/2021/09/whats-the-window-size-of-a-background-tab/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 04 Sep 2021 11:06:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40166</guid>

					<description><![CDATA[Whenever I open Twitter in a new tab on my phone, the page layout looks weird for a few seconds. It starts out looking like the desktop view and then, after a few seconds, it  snaps back to the mobile view.  What&#039;s causing this?  Try opening this link to a window size detector in a background tab. Then visit that tab.  On Chrome, this is what I see.    If I hit the refresh button on that tab, the …]]></description>
										<content:encoded><![CDATA[<p>Whenever I open Twitter in a new tab on my phone, the page layout looks weird for a few seconds. It starts out looking like the desktop view and then, after a few seconds, it  snaps back to the mobile view.</p>

<p>What's causing this?</p>

<p>Try opening <a href="https://www.rapidtables.com/web/tools/window-size.html">this link to a window size detector</a> in a background tab. Then visit that tab.</p>

<p>On Chrome, this is what I see.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/09/zero-size.png" alt="The Outer window size is zero by zero." width="400" class="aligncenter size-full wp-image-40169">

<p>If I hit the refresh button on that tab, the  Outer window size snaps back:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/09/full-size.png" alt="The Outer window size is 1413 by 768." width="400" class="aligncenter size-full wp-image-40168">

<p>What's going on?</p>

<p>According to the specification:</p>

<blockquote><p><a href="https://drafts.csswg.org/cssom-view/#dom-window-outerwidth">The <code>outerWidth</code> attribute must return the width of the client window. If there is no client window this attribute must return zero.</a></p></blockquote>

<p>This is where I get confused.  The <em>inner</em> width &amp; height are the amount of space the the browser has to display web content - so ignores the browser bar, menu bars, window decorations etc. The <em>outer</em> width &amp; height are the total amount of space the browser window has.</p>

<p>How can a browser window have no outer size, but simultaneously have an inner size???!?!</p>

<video class="aligncenter" id="video-40166-1" loop="1" autoplay="1" preload="metadata" muted="" width="268" height="250">
   <source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2021/09/bigger-on-the-inside.mp4?_=1">
</video>

<p>There <em>is</em> a client window. The tab may be rendering away in the background - but its parent still has a non-zero size.</p>

<p>There has been a <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=719296">bug report open on Chrome about this since <strong>2017</strong></a>.</p>

<p>Firefox takes a different approach. On desktop, both outer and inner are reported correctly for background tabs. On mobile, both outer and inner dimensions are set to zero.  This may change as it is a <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1579584">potential fingerprinting target</a>.</p>

<p>So, web developers, please don't rely on <code>window.innerHeight</code> and <code>window.outerHeight</code> - users may be opening your site in the background, which causes the browser to lie to you.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40166&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/09/whats-the-window-size-of-a-background-tab/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How do you raise a software bug with a book publisher?]]></title>
		<link>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/</link>
					<comments>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 23 Nov 2020 12:26:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[publishing]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37325</guid>

					<description><![CDATA[Recently, I bought an eBook which has a bug. I&#039;d like to explain what the bug is, why it is a problem, and how I&#039;m trying to get it corrected.  Amazon sells eBooks in KF8 format. That is an ePub with some proprietary extras. ePub is a standard based off HTML5. You can read the ePub 3 specification but, basically, it is a .zip of HTML files.  If you unzip an eBook, you can read the source code…]]></description>
										<content:encoded><![CDATA[<p>Recently, I bought an eBook which has a bug. I'd like to explain what the bug is, why it is a problem, and how I'm trying to get it corrected.</p>

<p>Amazon sells eBooks in <a href="https://wiki.mobileread.com/wiki/KF8">KF8 format</a>. That is an ePub with some proprietary extras. ePub is a standard based off HTML5. You can <a href="https://www.w3.org/publishing/epub3/epub-overview.html">read the ePub 3 specification</a> but, basically, it is a .zip of HTML files.  If you unzip an eBook, you can read the source code behind it.</p>

<p>When trying to read a Kindle book on a non-Kindle device, I noticed a bug. Some words were not displaying.  I took a look at the underlying source code, and found this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-09-20-27.png" alt="HTML code - a span wraps the first letter of a word." width="931" height="65" class="aligncenter size-full wp-image-37328">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-09-19-56.png" alt="HTML code - a span wraps the first word of a sentence.." width="680" height="65" class="aligncenter size-full wp-image-37329">

<p>Sometimes words and letters were wrapped with a <code>pagebreak</code> span like this:</p>

<pre><code class="language-html">&lt;span id="pg5" epub:type="pagebreak"&gt;‘But&lt;/span&gt; of course!’
</code></pre>

<p>When I tried to read the book using <a href="https://koreader.rocks/">KOReader</a> the word "‘But" didn't appear. Why?  Let's take a look at the <a href="https://idpf.github.io/epub-vocabs/structure/#pagination">ePub3 specification concerning page breaks</a>:</p>

<blockquote> <strong>pagebreak</strong>
<ul><li>  A separator denoting the position before which a break occurs between two contiguous pages in a statically paginated version of the content.
</li><li>  HTML usage context: phrasing and flow content, where the value of the carrying elements title attribute takes precedence over element content for the purposes of representing the pagebreak value</li></ul></blockquote>

<p>Here's the problem - eBooks can have page numbers. Despite "<a href="https://shkspr.mobi/blog/2011/02/quoting-page-numbers-from-ebooks-considered-harmful/">Page Numbers in eBooks Considered Harmful</a>" lots of publishers still use them. I guess it is <em>kind of</em> useful if you want to refer to something on a printed page - but eReaders allow you to change font size and line spacing, so the concept of a page is somewhat nebulous.</p>

<p>The way the spec is written, means that you can write something like:</p>

<pre><code class="language-html">&lt;span epub:type="pagebreak" id="page_123_a" title="123"&gt;123&lt;/span&gt;
</code></pre>

<p>You use the <code>id</code> for internal linking and the <code>title</code> attribute for the value.</p>

<p>Because of this, most eReaders do not display the physical page number inside the span. It has no semantic content for the reader, and breaks flow. If they did display it, you might end up reading text like this:</p>

<blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vel</p>

<p>9</p>

<p>risus at metus molestie tincidunt. Donec aliquet aliquam lorem, ...</p></blockquote>

<p>So KOReader <em>deliberately</em> ignores any text which is wrapped with <code>epub:type="pagebreak"</code>.</p>

<p>If you look at <a href="https://github.com/IDPF/epub3-samples/search?l=HTML&amp;q=pagebreak">the example ePubs provided by the International Digital Publishing Forum</a>, you'll see that the majority of their spans are self-closing.</p>

<pre><code class="language-html">&lt;span epub:type="pagebreak" id="p123-a" title="123"/&gt;
</code></pre>

<p>Very occasionally, you see something which has just a page number in it:</p>

<p><a href="https://github.com/IDPF/epub3-samples/blob/68ba020fe5c99625d45dd50a94c4b202c5f220e1/30/childrens-literature/EPUB/s04.xhtml#L11"><code>&lt;span epub:type="pagebreak" title="169" id="Page_169"&gt;169&lt;/span&gt;</code></a></p>

<p>I checked with <a href="https://github.com/koreader/koreader/issues/6894">KOReader</a> and they confirmed that they were following the spec. I agree with them. There's no reason to wrap readable content in a metadata span like that.</p>

<p>I've checked several other books from different publishers. None of them abuse <code>pagebreaks</code> this way.  I think Penguin Random House are doing it wrong and I would like to correct them.</p>

<h2 id="reporting-it"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#reporting-it">Reporting it</a></h2>

<p>I've previously <a href="https://shkspr.mobi/blog/2011/03/how-do-you-upgrade-an-ebook/">reported buggy ebooks to vendors</a>. But because the Kindle app doesn't exhibit this problem, I thought it was futile going via Amazon. So I thought I'd try going directly to the publisher.</p>

<p>Sadly, <a href="https://github.com/puk">Penguin UK's GitHub repo is dead</a>. Their dedicated digital publishing team <a href="https://mobile.twitter.com/PRHDigital">haven't tweeted in 2 years</a>.</p>

<p>Their <a href="https://www.penguin.co.uk/company/about-us/notices/faqs.html">contact page</a> has a suggestion for what to do if there is an error in an eBook:</p>

<blockquote><p>It is best if you return the book to the original bookshop from which it was purchased; they should be happy to exchange it for a perfect copy. If you have any difficulty with this then please return the cover and title page of the book to us.</p></blockquote>

<p>Hmmm....</p>

<p>I dropped them an email, and got back this very reasonable reply:</p>

<blockquote><p>Thank you for reaching out and bringing this to our attention. The distinction you’ve made is already a part of our specification; this was an oversight which we’re looking into as a result of your input—it bypassed checks both because it validates and also passes visual checks on all the major platforms we screen for. This isn’t reflective of our entire library and should be limited to specific titles which we’re currently investigating.</p></blockquote>

<p>That's fair enough. The rendering quirk is specification compliant - but hard to spot because of the Kindle monoculture.</p>

<h2 id="change-the-spec-change-the-world"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#change-the-spec-change-the-world">Change the spec, change the world</a></h2>

<p>I've made <a href="https://github.com/w3c/epub-specs/issues/1437">a suggestion on GitHub that the spec should be clarified</a>. I don't think it's particularly obvious that content in a <code>pagebreak</code> may not be displayed.</p>

<p>Most resources agree that the content of a <code>pagebreak</code> should either be blank, or be the page number.</p>

<blockquote><p>If you include the page numbers as text content within a <code>span</code> or <code>div</code>, the pages will be more easily accessible to both sighted users and users using assistive technologies. This method has been employed in previous DAISY standards. The potential downside, however, is that mainstream user agents will not provide equivalent functionality to turn off unwanted content, forcing users to hear and view the page numbers.</p>

<p><a href="https://kb.daisy.org/publishing/docs/navigation/pagelist.html#faq">Digital Accessible Information System (DAISY)</a></p></blockquote>

<h2 id="whose-fault-is-it-anyway"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#whose-fault-is-it-anyway">Whose fault is it anyway?</a></h2>

<p>This is a tricky one. I think Penguin have undoubtedly made a mistake with the way they publish ePubs. But, so far, KOReader is the only rendering engine I've found which suppresses the content of <code>pagebreak</code>s by default.</p>

<p>Generally speaking, a user wouldn't want to display page numbers on an eBook. Software could have a user defined toggle to switch them on or off. Luckily, KOReader has a variety of style-sheets for rendering eBooks - so I picked one which displayed <code>pagebreak</code> content.</p>

<p>Software is hard.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37325&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Whose bug is it anyway?]]></title>
		<link>https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/</link>
					<comments>https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 23 Jul 2020 11:46:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[usability]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=36025</guid>

					<description><![CDATA[I found a curious little bug and I&#039;m interested in who you think should take responsibility for it.  My mobile network provider sent me this message:   I clicked on the link, and got this error message from their website:   The error is caused by the trailing full-stop.   Remove the full-stop and the page loads.  There are four potential culprits here...  Virgin Media&#039;s Web Team  Should their…]]></description>
										<content:encoded><![CDATA[<p>I found a curious little bug and I'm interested in who <em>you</em> think should take responsibility for it.</p>

<p>My mobile network provider sent me this message:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/07/Imagepipe_6.jpg" alt="A text message. There is a URL which is linked." width="1024" height="552" class="aligncenter size-full wp-image-36027"></p>

<p>I clicked on the link, and got this error message from their website:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/07/Imagepipe_4.jpg" alt="A 404 error message on a website." width="1024" height="680" class="aligncenter size-full wp-image-36029"></p>

<p>The error is caused by the trailing full-stop.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/07/Imagepipe_5.jpg" alt="A URL in a web browser." width="1024" height="178" class="aligncenter size-full wp-image-36028"></p>

<p>Remove the full-stop and the page loads.</p>

<p>There are four potential culprits here...</p>

<h2 id="virgin-medias-web-team"><a href="https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#virgin-medias-web-team">Virgin Media's Web Team</a></h2>

<p>Should their website handle stray punctuation at the end of a URl?</p>

<p>Most webservers can be configured to take users to the page the server <em>thinks</em> they intended to go.  This is mostly useful behaviour, but occasionally falls foul of the common <a href="http://www.catb.org/~esr/jargon/html/D/DWIM.html">DWIM (Do What I Mean)</a> problems.</p>

<p>Even if the web team don't redirect, they should notice the elevated number of 404 errors and investigate the cause of it.</p>

<h2 id="whisper-systems-signal-app"><a href="https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#whisper-systems-signal-app">Whisper Systems' Signal App</a></h2>

<p>My SMS app should parse URls without trailing punctuation.  It is rare that a URl will deliberately end with a punctuation mark.  This <a href="https://github.com/signalapp/Signal-Android/issues/9449">issue has been raised with the team before</a>.</p>

<p>Apparently, according to the developers, this is <a href="https://github.com/signalapp/Signal-Android/issues/9122">a problem with Android's native library</a></p>

<h2 id="androids-url-parsing-library"><a href="https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#androids-url-parsing-library">Android's URl Parsing Library</a></h2>

<p>The same question as above. <a href="https://developer.android.com/reference/android/util/Patterns#WEB_URL">Android has a built in Web URl regular expression</a>. There are <a href="https://issuetracker.google.com/issues/67159235">reports that it is inconsistent in the way it parses URls</a>.</p>

<p>A URl which ends with a full-stop is valid. There is a semantic difference between <code>/page</code> and <code>/page.</code> or <code>/?id=a</code> and <code>/?id=a.</code></p>

<p>But the RFC doesn't take into account how humans actually communicate.</p>

<p>If I send a message saying "visit example.com/go, then example.com/next!" do I <em>really</em> mean for the <code>,</code> and <code>!</code> to be part of the path?</p>

<p>I can't find any evidence of Google testing this feature with users, nor a test suite to show people what URls are and are not matched.</p>

<p>It appears that the library only includes the punctuation if it is the last character in a string.</p>

<h2 id="virgin-medias-marketing-team"><a href="https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#virgin-medias-marketing-team">Virgin Media's Marketing Team</a></h2>

<p>These are who I think the real villains.  Software has bugs.  Part of any communications strategy is to test your messages to see whether they work. Not just as calls-to-action, but whether they <em>actually</em> work.</p>

<p>In this case, Virgin should have tested their message on a range of handsets and popular SMS apps.  If they had tested the end-to-end journey on Android, this wouldn't have happened.</p>

<h2 id="what-next"><a href="https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/#what-next">What next</a></h2>

<p>There's no point me asking Virgin to fix this. They have dreadful customer service and seem content to have a crappy user experience.</p>

<p>It's not Signal's fault that Android's parsing is buggy. Both Signal and Telegram greedily gobble up the <code>.</code> and treat it as part of the link. Interestingly, WhatsApp doesn't. I assume WhatsApp uses its own library.</p>

<p>So, <a href="https://issuetracker.google.com/issues/161727315">I've raise a bug with Android</a> where - no doubt - it will languish untouched for the next hundred years.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=36025&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/07/whose-bug-is-it-anyway/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Bug report: 4K iPlayer on the Amazon Fire Stick]]></title>
		<link>https://shkspr.mobi/blog/2020/01/bug-report-4k-iplayer-on-the-amazon-fire-stick/</link>
					<comments>https://shkspr.mobi/blog/2020/01/bug-report-4k-iplayer-on-the-amazon-fire-stick/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 29 Jan 2020 12:14:30 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[BBC]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[hdmi]]></category>
		<category><![CDATA[iplayer]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33818</guid>

					<description><![CDATA[Technology never works right. And video technology never works right even harder.  The Amazon 4K Fire Stick is a pretty cool bit of kit. It&#039;s an Android device which can push 4K HDR video with surround sound to your TV. But, like any technology, it&#039;s buggy. Here&#039;s the bug report I&#039;ve tried to send to Amazon and the BBC. They haven&#039;t answered - so I&#039;m publishing it here as well.  BBC iPlayer…]]></description>
										<content:encoded><![CDATA[<p>Technology never works right. And video technology never works right even harder.</p>

<p>The Amazon 4K Fire Stick is a pretty cool bit of kit. It's an Android device which can push 4K HDR video with surround sound to your TV. But, like any technology, it's buggy. Here's the bug report I've tried to send to Amazon and the BBC. They haven't answered - so I'm publishing it here as well.</p>

<p>BBC iPlayer supplies 4K video - but the app doesn't switch to 4K mode, it stays at 1080p.</p>

<h2 id="amazon-debug"><a href="https://shkspr.mobi/blog/2020/01/bug-report-4k-iplayer-on-the-amazon-fire-stick/#amazon-debug">Amazon debug</a></h2>

<p>To turn on the Fire stick's debug mode - and get access to X-Ray - <a href="https://developer.amazon.com/docs/fire-tv/system-xray.html">follow these instructions</a>.</p>

<p>This lets you see the bandwidth being used, HDCP information, and audio/video information.  Here's a 4K presentation via Amazon's own video player.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/Amazon-4K.jpg" alt="Amazon video with debug information" width="1024" height="560" class="aligncenter size-full wp-image-33823">
In the top left is the HDMI output information and bandwidth stats. On the right is the video codec data.</p>

<h2 id="iplayer"><a href="https://shkspr.mobi/blog/2020/01/bug-report-4k-iplayer-on-the-amazon-fire-stick/#iplayer">iPlayer</a></h2>

<p>Within iPlayer you can opt-in to the beta programme, this gives you access to 4K content.  But let's take a look at the debug information.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/iPlayer-Bug.jpg" alt="BBC video with debug information on it." width="1024" height="576" class="aligncenter size-full wp-image-33820">
4K video <em>is</em> being streamed at 25fps.  But if we look in the top left corner, the app hasn't switched out of 1080p @ 60fps.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/iPlayer-1080p.jpg" alt="iPlayer output at 1080p." width="1024" height="456" class="aligncenter size-full wp-image-33821"></p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/iPlayer-4K-detail.jpg" alt="iPlayer detail showing 4K." width="640" height="739" class="aligncenter size-full wp-image-33822">
The end result is a juddering rescaled mess.</p>

<p>So, if you or a friend works for either Amazon or the BBC, please ask them to take a look, eh?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33818&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/01/bug-report-4k-iplayer-on-the-amazon-fire-stick/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[102KB ought to be enough for any email]]></title>
		<link>https://shkspr.mobi/blog/2019/05/102kb-ought-to-be-enough-for-any-email/</link>
					<comments>https://shkspr.mobi/blog/2019/05/102kb-ought-to-be-enough-for-any-email/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 29 May 2019 11:19:00 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=32211</guid>

					<description><![CDATA[Another day, another Gmail bug which won&#039;t get fixed.  The original Android phone - HTC Dream - had 192MB of RAM.  The latest Android phones tend to have 6GB.  A 32 times increase in a decade.  Laptops have also leapt forwards in speed and memory. Sadly, no one on the Gmail team has noticed.  It&#039;s 2019, and Gmail app users are still seeing the dreaded &#34;[Message Clipped]  View entire message&#34;…]]></description>
										<content:encoded><![CDATA[<p>Another day, another Gmail bug which won't get fixed.</p>

<p>The original Android phone - HTC Dream - had 192MB of RAM.  The latest Android phones tend to have 6GB.  A 32 times increase in a decade.  Laptops have also leapt forwards in speed and memory. Sadly, no one on the Gmail team has noticed.</p>

<p>It's 2019, and Gmail app users are still seeing the dreaded "[Message Clipped]  View entire message" error.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Screenshot_20190528-204203__01.jpg" alt="The text of Romeo and Juliet - truncated. A &quot;View entire message&quot; link appears on screen." width="1080" height="649" class="aligncenter size-full wp-image-32222">

<p>It's just as bad on the web version of Gmail - even on Desktop Chrome.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Screenshot_2019-05-28-Five-things-on-Friday-on-Sunday-298-terence-eden-shkspr-mobi-Shkspr-mobi-Mail.png" alt="A truncated message." width="454" height="233" class="aligncenter size-full wp-image-32215"></p>

<p>Google don't even do fancy AI magic to truncate these messages. You'd think they'd truncate at the end of a word. Or even in the middle of a word.  They don't.</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/truncated-html.jpg" alt="Raw HTML in the middle of an email." width="1080" height="621" class="aligncenter size-full wp-image-32219">
Nope, just slam straight through that HTML. YOLO!</p>

<p>What causes this? For unknown reasons, Gmail truncates messages at 102KB. That's about half the storage space of a floppy disk.</p>

<p>I'm talking <span style="font-size:2em">🖬</span>, not <span style="font-size:1em">💾</span>!</p>

<p>This is annoying for people sending newsletters - even the mighty <a href="https://mailchimp.com/help/gmail-is-clipping-my-email/">MailChimp can do no more than offer some tips</a> to shrink your latest newsletter.</p>

<p>Worse still, marketing emails know that if they pad out their messages, they can <strong>hide the unsubscribe link!</strong></p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Truncated-spam.jpg" alt="A message cut off just before the unsubscribe link." width="1080" height="805" class="aligncenter size-full wp-image-32218">
Oh, and as a bonus, if you click on "View entire message" - you get <a href="https://www.google.com/a/cpanel/gmail.com/images/logo.gif">the old version of Gmail and Google's logo</a>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/logo.gif" alt="The old version of the Gmail logo." width="143" height="59" class="aligncenter size-full wp-image-32217">

<p>Google updated their logo in 2015. You'd think in the last <em>four years</em>, someone on the Gmail team would have received a long email and then filed a bug report. But no.</p>

<p>We can argue about whether emails should be chonkie-bois or not. But they are. People want full styling, images, and fancy features - not just ASCII text and the occasional <code>uuencode</code>d attachment. That's the world we're in now.</p>

<p>What can be done? There's literally no point me taking this up with Google. <a href="https://groups.google.com/forum/#!topic/gmail-users/OZkFhOYn5wU">People have been complaining about this</a> for <a href="https://groups.google.com/forum/#!searchin/gmail-users/message$20clipping|sort:date/gmail-users/KIKwhliQ-sU/c1E0ziF81dEJ">over a decade</a> and nothing has been done to fix it.</p>

<p>"User-focussed" my shiny metal arse.</p>

<p>So, here's a whinging blog post which - if I'm very lucky - <a href="https://shkspr.mobi/blog/2015/11/the-day-google-deleted-me/">won't make Google lock me out of my account again</a>.</p>

<p>Bill Gates probably didn't say <a href="https://quoteinvestigator.com/2011/09/08/640k-enough/">640KB ought to be enough for anyone</a> - but someone in the bowels of Google sure as hell believes 102KB ought to be enough for any email.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=32211&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/05/102kb-ought-to-be-enough-for-any-email/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Invisible Pink Unicorns - a Firefox emoji rendering bug]]></title>
		<link>https://shkspr.mobi/blog/2019/05/invisible-pink-unicorns-a-firefox-emoji-rendering-bug/</link>
					<comments>https://shkspr.mobi/blog/2019/05/invisible-pink-unicorns-a-firefox-emoji-rendering-bug/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 27 May 2019 18:42:32 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[emoji]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=32176</guid>

					<description><![CDATA[Here&#039;s a curious bug I just discovered in Firefox 67 for Linux.  Can you see this unicorn: →🦄 ←  What happens if you use CSS to change the opacity of an emoji?  Here&#039;s a unicorn, with a pink font colour:  🦄 Unicorn  Let&#039;s wrap that in this scrap of CSS to make it 50% opaque.  color: rgba(255, 105, 180, 0.5);   🦄 Unicorn  Hopefully, you see a semi-transparent philosophical argument. What if we set …]]></description>
										<content:encoded><![CDATA[<p>Here's a curious bug I just discovered in Firefox 67 for Linux.  Can you see this unicorn: <br>→<span style="font-size:1em;color: rgba(255, 105, 180, 0); text-shadow: .2em .2em .2em rgba(255, 105, 180, 0);
">🦄</span> ←</p>

<p>What happens if you use CSS to change the opacity of an emoji?</p>

<p>Here's a unicorn, with a pink font colour:</p>

<p><span style="font-size:3em;color: rgba(255, 105, 180);">🦄 Unicorn</span></p>

<p>Let's wrap that in this scrap of CSS to make it 50% opaque.</p>

<pre><code class="language-_">color: rgba(255, 105, 180, 0.5);
</code></pre>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0.5);">🦄 Unicorn</span></p>

<p>Hopefully, you see a semi-transparent <a href="https://en.wikipedia.org/wiki/Invisible_Pink_Unicorn">philosophical argument</a>. What if we set the opacity to <code>0.0</code> - that is, completely transparent?</p>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0.0);">🦄 Unicorn</span></p>

<p>There's a shunicorn there. If you don't believe me, try highlighting it!</p>

<p>Now, let's try a see-though beastie, but this time adding a drop-shadow:</p>

<pre><code class="language-_">color: rgba(255, 105, 180, 0.5); text-shadow: .2em .2em .2em #000;
</code></pre>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0.5); text-shadow: .2em .2em .2em #000;
">🦄 Unicorn</span></p>

<p>Good!  And now <em>fully</em> transparent text plus a drop-shadow:</p>

<pre><code class="language-_">color: rgba(255, 105, 180, 0); text-shadow: .2em .2em .2em #000;
</code></pre>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0); text-shadow: .2em .2em .2em #000;
">🦄 Unicorn</span></p>

<p>On Firefox, the text is invisible, but the emoji is completely visible - like this...</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/Screenshot_2019-05-27-Invisible-Pink-Unicorns-a-Firefox-rendering-bug.png" alt="The upper image is partially transparent. The lower image is completely opaque." width="604" height="239" class="aligncenter size-full wp-image-32189">

<p>This bug is not present on Firefox for Android, nor Chromium for Linux.</p>

<p>The only way on Firefox, to get a completely invisible pink unicorn plus a drop shadow is to use:</p>

<pre><code class="language-_">color: rgba(255, 105, 180, 0.002); text-shadow: .2em .2em .2em #000;
</code></pre>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0.002); text-shadow: .2em .2em .2em #000;
">🦄 Unicorn</span></p>

<pre><code class="language-_">color: rgba(255, 105, 180, 0.001); text-shadow: .2em .2em .2em #000;
</code></pre>

<p><span style="font-size:3em;color: rgba(255, 105, 180, 0.001); text-shadow: .2em .2em .2em #000;
">🦄 Unicorn</span></p>

<p><code>0.002</code> is invisible, but <code>0.001</code> is visible.</p>

<p>I've <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1554753">raised this as a bug on Mozilla's Bugzilla</a>.</p>

<p>In the meantime, if you can see the invisible pink unicorn, please let me know. Or contact a theologian.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=32176&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/05/invisible-pink-unicorns-a-firefox-emoji-rendering-bug/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Amazon Prime Video's weird Unicode problems]]></title>
		<link>https://shkspr.mobi/blog/2019/01/amazon-prime-videos-weird-unidcode-problems/</link>
					<comments>https://shkspr.mobi/blog/2019/01/amazon-prime-videos-weird-unidcode-problems/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 25 Jan 2019 12:19:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31255</guid>

					<description><![CDATA[It&#039;s 2019 and high-tech devices are still plagued by text encoding bugs.  I recently bought the new 4K Amazon Fire Stick. It&#039;s a little Android dongle which plays videos. It&#039;s neat - but quite often displays weird text errors.  Take the kids&#039; TV show House of Anubis, the Fire displays the description like this:   Looking at the source code for the description:   That&#039;s the character &#34;private use…]]></description>
										<content:encoded><![CDATA[<p>It's 2019 and high-tech devices are still plagued by text encoding bugs.</p>

<p>I recently bought the new 4K Amazon Fire Stick. It's a little Android dongle which plays videos. It's neat - but quite often displays weird text errors.</p>

<p>Take the kids' TV show <a href="https://amzn.to/2W5R7Y7">House of Anubis</a>, the Fire displays the description like this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/House-of-Anubis.jpg" alt="A description of a TV show - there are some weird blank characters on screen." width="1024" height="768" class="aligncenter size-full wp-image-31256"></p>

<p>Looking at the source code for the description:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Source-of-of-Amazon-Prime-page-fs8.png" alt="Welcome to Anubis House. It is at this boarding school that students begin settling in for the academic year only to find one student missing, a secret panel in the houses attic, codes leading to backroom staircases, clandestine rituals, and more!" width="841" height="468" class="aligncenter size-full wp-image-31257"></p>

<p>That's the character "<a href="https://en.wikipedia.org/wiki/Private_Use_Areas">private use</a> two" (U+0092).  What on earth is that doing there?</p>

<p>Well, in the ancient <a href="https://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a> encoding, <code>0x92</code> is <code>’</code> - the curly quote. It looks like someone has tried to write "in the house’s attic" on an old Windows machine, Amazon have ingested the data thinking it was Unicode, and displayed an error!</p>

<p>Here's "<a href="https://amzn.to/4jwNy80">Young Sheldon</a>":</p>

<p><a href="https://amzn.to/4jwNy80"><img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Young-Sheldon.jpeg" alt="Description with an error in it." width="1024" height="447" class="aligncenter size-full wp-image-31258"></a></p>

<p>How does the word "isn't" become "isnâ€™t"?  There's <a href="https://www.justinweiss.com/articles/how-to-get-from-theyre-to-theyre/">a great explanation from Justin Weiss</a>, basically:</p>

<ul>
<li>Unicode <code>’</code> (U+2019) contains 3 bytes - <code>0xE2 0x80 0x99</code></li>
<li>When those three bytes are converted to Windows-1252, they become â € ™</li>
</ul>

<p>The Android version of Prime video goes a step further:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Sheldon-on-Android.png" alt="Screenshot of the same text on Android. An additional error has crept in." width="720" height="565" class="aligncenter size-full wp-image-31282">

<p>The Euro Symbol has been converted into its HTML entity <code>&amp;#x20AC;</code></p>

<p>There are <a href="https://www.google.com/search?q=%C3%A2%E2%82%ACTM+season+video+site%3Awww.amazon.co.uk">hundreds of examples</a> of video descriptions being mangled like this.</p>

<p>And, occasionally, you find this hot mess:
<a href="https://amzn.to/2Dmw1x7"><img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Weird-encoding-fs8.png" alt="" width="973" height="407" class="aligncenter size-full wp-image-31263"></a>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/Samt.jpg" alt="Dozens of weird characters on screen." width="1024" height="696" class="aligncenter size-full wp-image-31265">
What's going on?</p>

<h2 id="two-countries-separated-by-a-common-language"><a href="https://shkspr.mobi/blog/2019/01/amazon-prime-videos-weird-unidcode-problems/#two-countries-separated-by-a-common-language">Two countries separated by a common language</a></h2>

<p>Except, of course, this doesn't happen on the American version of Amazon Prime Video.</p>

<p>Here's the description of <a href="https://www.amazon.com/Gotham-2016-Comic-Con-Panel/dp/B01KU8SJ9A/">Gotham S03</a> from Amazon USA:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/American-Gotham-fs8.png" alt="Screencap from the American version. All the text is pristine." width="966" height="436" class="aligncenter size-full wp-image-31260">

<p>Once the text gets to this side of the pond, it goes horribly wrong.
<a href="https://amzn.to/2T67hi0"><img src="https://shkspr.mobi/blog/wp-content/uploads/2019/01/UK-Gotham-fs8.png" alt="Screencap showing the description text from the UK. It is mangled." width="966" height="436" class="aligncenter size-full wp-image-31259"></a></p>

<p>As well as the <code>â€TM</code> issue, there's another new snag.  The hyphen is actually <code>-</code> hyphen-minus (U+002D). Something in Amazon's conversion process is transforming that to <code>–</code> en dash (U+2013).</p>

<p>That then gets <a href="https://www.i18nqa.com/debug/utf8-debug.html">buggily encoded</a> to â€".</p>

<p>I've reported these errors to my friends at Amazon - they are in the process of correcting them.</p>

<p>You can <a href="https://amzn.to/2S3iO4I">buy the Amazon Fire TV Stick 4K Ultra HD</a> for just Â£50.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31255&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/01/amazon-prime-videos-weird-unidcode-problems/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Virgin Media don't understand Unicode]]></title>
		<link>https://shkspr.mobi/blog/2018/08/virgin-media-dont-understand-unicode/</link>
					<comments>https://shkspr.mobi/blog/2018/08/virgin-media-dont-understand-unicode/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 19 Aug 2018 11:28:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30236</guid>

					<description><![CDATA[More adventures with Unicode.  I logged in to my Virgin Media account to see when my promotional discount would end.  Here&#039;s what their billing PDF said.    Let&#039;S Ignore The Weird Capitalisation Virgin&#039;S System Uses. What&#039;s that Â doing there?  Their website says:    No Â symbol, but also no £ sign.  Ah, but let&#039;s look at the underlying code.    What&#039;s that weird character? It is the control ch…]]></description>
										<content:encoded><![CDATA[<p>More adventures with Unicode.  I logged in to my Virgin Media account to see when my promotional discount would end.  Here's what their billing PDF said.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/08/Virgin-encoding-fs8.png" alt="Promotional offer(s) You'Re Receiving A Â2 Loyalty Discount. If You Change Your Package You May Lose This Discount Which Will End 10-OCT-18." width="978" height="95" class="aligncenter size-full wp-image-30239">

<p>Let'S Ignore The Weird Capitalisation Virgin'S System Uses. What's that <code>Â</code> doing there?</p>

<p>Their website says:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/08/Screenshot_2018-08-18-Your-current-bill-fs8.png" alt=" You'Re Receiving A 2 Loyalty Discount. If You Change Your Package You May Lose This Discount Which Will End 10-OCT-18 " width="533" height="48" class="aligncenter size-full wp-image-30237">

<p>No <code>Â</code> symbol, but also no <code>£</code> sign.  Ah, but let's look at the underlying code.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/08/HTML-code-from-Virgin-fs8.png" alt="HTML code from Virgin." width="386" height="131" class="aligncenter size-full wp-image-30238">

<p>What's that weird character? It is the <a href="http://graphemica.com/%C2%9C">control character <code>string terminator</code></a>, of course...</p>

<p>Well, my discount is nearly finished, so I asked them for a larger discount. "Sure!" they said "How does Ÿ3 sound?"</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/08/Thanks-for-making-those-changes-fs8.png" alt="Promotional Offer(s) 6m œ3.00 RIV Discount (until 17th February 2019)." width="585" height="165" class="aligncenter size-full wp-image-30242">

<p>Amusingly, when I copy the <code>Ÿ</code> from that PDF, it shows up as the character <code>œ</code>!</p>

<h2 id="whats-going-on"><a href="https://shkspr.mobi/blog/2018/08/virgin-media-dont-understand-unicode/#whats-going-on">What's Going On?</a></h2>

<p>I've written extensively about <a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/">how the £ symbol is encoded</a> - but here's a primer.</p>

<ul>
<li><code>£</code> in ISO-8859-1 (Latin-1) is decimal <code>163</code>.</li>
<li><code>£</code> in Unicode is <em>also</em> <code>163</code> - but it gets stored as two UTF-8 bytes - <code>194</code> &amp; <code>163</code>. In hex this is <code>0xC2 0xA3</code>.</li>
<li>In <a href="https://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a> - the legacy encoding for ancient version of Microsoft's software - <code>0xC2</code> <a href="https://www.i18nqa.com/debug/utf8-debug.html">gets rendered as</a> <code>Â</code>.</li>
</ul>

<p>So, at some point, Virgin's billing software is seeing <code>0xC2 0xA3</code>, encoding it as <code>Â£</code>, and then grabbing the first character to print on the bills.</p>

<p>Where do the other characters come from?</p>

<ul>
<li>In <a href="https://en.wikipedia.org/wiki/Code_page_437">Code Page 437</a> - an ancient IBM encoding - the <code>£</code> symbol is <code>0x9C</code>.</li>
<li><code>0x9C</code> in Windows 1252 is <code>œ</code></li>
<li>The String Terminator is <code>0xC2 0x9C</code></li>
</ul>

<p>And the <code>Ÿ</code> character? Not a clue! Inspecting the raw text of the PDF shows the underlying code is:
<code>6m \2343.00 RIV Discount</code>.
PDFs escape <em>octal</em> characters.  Octal <code>234</code> is decimal <code>156</code> - which is hex <code>0x9C</code>.</p>

<p>Nearest I can get is the <a href="https://en.wikipedia.org/wiki/ISO/IEC_8859-15">ISO/IEC 8859-15</a> encoding, where <code>œ</code> is <code>0xBD</code> and <code>Ÿ</code> is <code>0xBE</code>.  Perhaps a font substitution error?</p>

<h2 id="everything-is-awful"><a href="https://shkspr.mobi/blog/2018/08/virgin-media-dont-understand-unicode/#everything-is-awful">Everything is awful</a></h2>

<p>This isn't just ugly. It points to the fact that Virgin don't test their software and don't upgrade their systems. What other horrors lie in their technology stack?</p>

<p>And it isn't just a tech issue. It is bad for screenreaders - meaning visually impaired users get a poor experience.</p>

<p>The year is 2018. And we're still battling text encoding issues due to crappy software.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30236&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/08/virgin-media-dont-understand-unicode/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[A curious way to break Twitter's search results]]></title>
		<link>https://shkspr.mobi/blog/2018/02/a-curious-way-to-break-twitters-search-results/</link>
					<comments>https://shkspr.mobi/blog/2018/02/a-curious-way-to-break-twitters-search-results/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 19 Feb 2018 12:30:16 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=29113</guid>

					<description><![CDATA[(This isn&#039;t really a security issue, although I&#039;ve disclosed it to the Twitter team.)  &#34;Fuzzing&#34; is a computer science term which means &#34;sending weird data into a program and seeing what happens.&#34;  It&#039;s a useful way to see how your code can break in new and unexpected ways.  It&#039;s particularly good at showing what a website&#039;s search engine does when it is confused.  For example, here&#039;s a fairly…]]></description>
										<content:encoded><![CDATA[<p>(This isn't really a security issue, although I've disclosed it to the Twitter team.)</p>

<p>"Fuzzing" is a computer science term which means "sending weird data into a program and seeing what happens."  It's a useful way to see how your code can break in new and unexpected ways.  It's particularly good at showing what a website's search engine does when it is confused.</p>

<p>For example, here's a fairly mundane Tweet.</p>

<blockquote class="social-embed" id="social-embed-964443009050963968" 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/OffshoreAZ" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRtwAAABXRUJQVlA4INAAAAAwBQCdASowADAAPrVKoEmnJCMhMdZqAOAWiWllpn/74DuXb9lswAEXUlVwhZ/E/J1jQAD+7uS31z8StP7/KvrtmA0VKg6CBS3je1CSKeQYk9IuY4mZ0fb2kdqj9Y92gRUyOY87CgJlKnJVOxXtOzjjbB7tl6TcmtVFFcmpcSneY+AJcEy97NU9WtPgF/sbK4RzYmGH2JK83si23OsjVay2B7P8jLS6Py4YFFUc5lhPk/sMMXGsAsYT/qhpNCkrLAu2QYo8b9ZhbxRuuUqHAAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Offshore A-Z</p>@OffshoreAZ</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">🏢 HONOUR INTERNATIONAL LIMITED<br>🇰🇾 Cayman Islands<br><br>🎯 &lt;html&gt;<br>&lt;head&gt;&lt;title&gt;502 Bad Gateway&lt;/title&gt;&lt;/head&gt;<br>&lt;body b…<br><br>📒 <a href="http://offshoreaz.company/0061673">offshoreaz.company/0061673</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/OffshoreAZ/status/964443009050963968"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-02-16T10:15:06.000Z" itemprop="datePublished">10:15 - Fri 16 February 2018</time></a></footer></blockquote>

<p>OK, the bot sending it appears to have had a bit of a meltdown, but that's not the interesting thing. If we <a href="https://twitter.com/search?q=html%20title%20cayman&amp;src=typd">search for some of the HTML elements in it</a>, we get this hot mess:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/02/twitter4-fs8.png" alt="Screenshot of a tweet. The HTML is malformed." width="599" height="156" class="aligncenter size-full wp-image-29114">

<p>WTF?! Let's take a look at what the search engine is doing. Here's some of the HTML for that tweet.</p>

<pre>&amp;amp;&lt;strong&gt;lt;html&lt;/strong&gt;&amp;gt;

&amp;lt;head&amp;amp;g&lt;strong&gt;t;&amp;lt;title&lt;/strong&gt;

&amp;gt;502 Bad Gateway&amp;amp;l&lt;strong&gt;t;/title&lt;/strong&gt;

&amp;gt;&amp;lt;/head&amp;gt;
</pre>

<p>This looks to me like an off-by-one error.  I suspect that the internal parser is highlighting the zeroth character rather than the first. Because the <code>&lt;</code> are stored as their escaped version - <code>&amp;lt</code> - when going backwards by one extra character, the escaped element is bisected.</p>

<p>Or not. I'm not the Twitter Engineering Team. Might be dragons. Who knows?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=29113&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/02/a-curious-way-to-break-twitters-search-results/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[textarea placeholder bug in Firefox]]></title>
		<link>https://shkspr.mobi/blog/2017/11/textarea-placeholder-bug-in-firefox/</link>
					<comments>https://shkspr.mobi/blog/2017/11/textarea-placeholder-bug-in-firefox/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 15 Nov 2017 19:00:55 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=28757</guid>

					<description><![CDATA[The new Firefox is out! Powered by the ludicrous-speed quantum engine - it really is a marvel to behold.  Unfortunately, there&#039;s a rather annoying bug in the way it renders placeholder text.  Consider the following HTML:  &#60;textarea placeholder=&#34;In loving memory of Buffy Anne Summers She saved the world A lot...&#34;&#62;&#60;/textarea&#62;   This should render a textarea (a multi-line input box) pre-filled with…]]></description>
										<content:encoded><![CDATA[<p>The new Firefox is out! Powered by the ludicrous-speed quantum engine - it really is a marvel to behold.</p>

<p>Unfortunately, there's a rather annoying bug in the way it renders placeholder text.  Consider the following HTML:</p>

<pre><code class="language-_">&lt;textarea placeholder="In loving memory of
Buffy Anne Summers
She saved the world
A lot..."&gt;&lt;/textarea&gt;
</code></pre>

<p>This should render a <code>textarea</code> (a multi-line input box) pre-filled with placeholder text. The text should be over multiple lines.  Instead, it renders like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/10/inscription-fs8.png" alt="Screenshot - the text is rendered on a single line" width="574" height="186" class="aligncenter size-full wp-image-28758">

<p>Is that right? No! Let's see what the spec says (disclaimer - I'm an editor on the HTML 5.3 spec).</p>

<blockquote><p>User agents should present this hint to the user when the element’s value is the empty string and the control is not focused (e.g., by displaying it inside a blank unfocused control). All U+000D CARRIAGE RETURN U+000A LINE FEED character pairs (CRLF) in the hint, as well as all other U+000D CARRIAGE RETURN (CR) and U+000A LINE FEED (LF) characters in the hint, must be treated as line breaks when rendering the hint.</p>

<p><a href="https://www.w3.org/TR/html52/sec-forms.html#element-attrdef-textarea-placeholder">HTML 5.2 - 4.10.11. The textarea element</a></p></blockquote>

<p>Amusingly, Mozilla's <em>own</em> documentation corroborates this:</p>

<blockquote><p>placeholder</p>

<p>A hint to the user of what can be entered in the control. Carriage returns or line-feeds within the placeholder text must be treated as line breaks when rendering the hint.</p>

<p><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#attr-placeholder">MDN <code>&lt;textarea&gt;</code></a></p></blockquote>

<p>I've <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1391044">raised this as a bug with Mozilla</a> - sadly, my C++ is too rusty to contribute a patch!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=28757&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/11/textarea-placeholder-bug-in-firefox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Bug with Google Pay and Amex]]></title>
		<link>https://shkspr.mobi/blog/2017/08/bug-with-google-pay-and-amex/</link>
					<comments>https://shkspr.mobi/blog/2017/08/bug-with-google-pay-and-amex/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 15 Aug 2017 11:16:14 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[amex]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[credit card]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=25503</guid>

					<description><![CDATA[It is impossible to contact large companies to report a bug in their software. So I&#039;m reduced to writing snarky blog posts about it in the vague hope that a Social Media Manager will see the issue and raise it with the appropriate team. Welcome to 2017!  Google Pay now supports American Express cards in the UK. Hurrah!  But if you try to ring Amex from within the app - a problem occurs. Can you…]]></description>
										<content:encoded><![CDATA[<p>It is impossible to contact large companies to report a bug in their software. So I'm reduced to writing snarky blog posts about it in the vague hope that a Social Media Manager will see the issue and raise it with the appropriate team. Welcome to 2017!</p>

<p>Google Pay now supports American Express cards in the UK. Hurrah!  But if you try to ring Amex from within the app - a problem occurs. Can you spot what it is?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/08/Amex-phone-number.png" alt="Screenshot of the Android Pay app - the American Express phone number is formatted incorrectly. " width="800" height="945" class="aligncenter size-full wp-image-25505">

<p>The country code <em>should</em> be <code>+44</code>.  For some reason, it's missing the <code>+</code>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/08/Amex-phone-dialer.png" alt="The Android phone dialer screen - the telephone number is pre-filled" width="720" height="464" class="aligncenter size-full wp-image-25504">

<p>It passes to the dialler correctly, but the call then fails because the number isn't recognised.</p>

<p>GSM requires an <a href="https://en.wikipedia.org/wiki/List_of_international_call_prefixes">international call prefix</a> when using country codes.  If Amex wants customers to be able to call, it needs to change how it presents numbers to Google Pay.</p>

<p>Other providers get around this by using country specific dialling.  The Halifax credit card uses an <code>0345</code> number which works perfectly.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/08/Halifax-phone-number.png" alt="Screenshot of the Android Pay app - the Halifax credit card is showing the correctly formatted phone number" width="800" height="919" class="aligncenter size-full wp-image-25506">

<p>Unless you're abroad. In which case, it will fail.</p>

<p>I know Google doesn't like testing things before they're released - but insisting that providers use properly formatted international dialling numbers seems like a sensible precaution.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=25503&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/08/bug-with-google-pay-and-amex/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Google's AMP is a gilded cage]]></title>
		<link>https://shkspr.mobi/blog/2016/11/removing-your-site-from-amp/</link>
					<comments>https://shkspr.mobi/blog/2016/11/removing-your-site-from-amp/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 27 Nov 2016 12:34:04 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[amp]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=23724</guid>

					<description><![CDATA[AMP is Google&#039;s attempt to re-fight the transcoding wars of the early 2000s.  It is actively dangerous to the web ecosystem, helps disseminate propaganda,  and is disliked by many users.  If, like me, you made the mistake of trying out AMP on your website - you&#039;re in a tricky position if you try to remove it.  Google doesn&#039;t like anything leaving its clutches.  After a few weeks of AMP, I decided …]]></description>
										<content:encoded><![CDATA[<p>AMP is Google's attempt to re-fight the <a href="https://shkspr.mobi/blog/2008/05/transcoding-personal-thoughts/">transcoding wars of the early 2000s</a>.</p>

<p>It is actively dangerous to the web ecosystem, helps <a href="https://github.com/ampproject/amphtml/issues/6210">disseminate propaganda</a>,  and is <a href="https://productforums.google.com/forum/#!topic/webmasters/8ogdv04Cm-k/discussion">disliked by many users</a>.</p>

<p>If, like me, you made the mistake of trying out AMP on your website - you're in a tricky position if you try to remove it.  Google doesn't like <em>anything</em> leaving its clutches.</p>

<p>After a few weeks of AMP, I decided that it wasn't suitable for me. So I uninstalled the WordPress plugin.  That's when the problems started.</p>

<p>When someone searches for my site on mobile, they <em>still</em> get presented with an AMP link:</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2016/11/AMP-page-search-results.png" alt="AMP pages showing in search results" width="720" height="540" class="aligncenter size-full wp-image-23727">
Which leads to an error page:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/11/An-AMP-error-page.jpg" alt="An AMP error page" width="720" height="634" class="aligncenter size-full wp-image-23726">

<p>No matter, they can click through to the real page, right?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/11/A-404-error-page.jpg" alt="A 404 error page" width="720" height="684" class="aligncenter size-full wp-image-23725">

<p>No.  The <code>/amp</code> page doesn't exist and causes a 404 error.  Google <em>could</em> use the <a href="https://github.com/ampproject/amphtml/blob/master/spec/amp-html-format.md"><code>canonical</code> URl</a> to serve the original page - but that's too much like hard work for them.</p>

<p>So, how do you fix this?  Thanks to <a href="https://shkspr.mobi/blog/2013/02/googles-customer-contempt-conundrum/">Google's legendary lack of support</a> and pathological aversion to writing clear, updated documentation - it's <em>really</em> hard to find a straight answer.</p>

<p>You would have thought that after a few days of getting AMP errors, Google would take the hint and stop serving the content, right?  <a href="https://productforums.google.com/forum/#!topic/webmasters/3KWkfkyWcDU;context-place=topicsearchin/webmasters/category$3Aaccelerated-mobile-pages-amp%7Csort:relevance%7Cspell:false">Sadly no</a>.</p>

<p>There is one scrap of information which <em>might</em> give you some hope:</p>

<blockquote><p>Use the "update-ping" mechanism to permanently remove content from the Google AMP Cache after the content has been removed from its origin. For example, to purge content formerly served at <code>https://cdn.ampproject.org/i/s/example.com/favicon.ico</code>, send an update ping request to:
</p><p><code>https://cdn.ampproject.org/update-ping/i/s/example.com/favicon.ico</code>.
</p><p>Cached content that no longer exists will eventually get removed from the cache; it's just faster to use "update-ping".
</p><p><cite>Google's <a href="https://developers.google.com/amp/cache/update-ping#remove-amp-content">Remove AMP content</a> "documentation"</cite>
</p></blockquote>

<p>If I'm reading this right, I have to send a ping for <em>every</em> page on my site.</p>

<p>Something like</p>

<pre><code>https://cdn.ampproject.org/update-ping/c/s/shkspr.mobi/blog/2015/09/i3-electric-car-review/amp
</code></pre>

<p>For a few thousand pages.  That's... bonkers!  And, best of all, it <strong>doesn't work</strong>.</p>

<p>I chose a page, sent the ping, waited a few hours and... nothing! The AMP links still showed up in Google's results.</p>

<p>What's the solution?  At this point you only have two options:</p>

<ol>
<li>Accept Google's benevolent intentions and reinstall AMP.</li>
<li><a href="https://productforums.google.com/forum/#!topic/webmasters/U30TmVq1Db4;context-place=topicsearchin/webmasters/category$3A(accelerated-mobile-pages-amp)$20is$3Afirstpost%7Csort:relevance">Wait and hope</a>.</li>
</ol>

<p>I should have learned my lessons from <a href="https://shkspr.mobi/blog/2015/11/the-day-google-deleted-me/">my last interaction with Google</a>. Oh well, fool me once...</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=23724&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2016/11/removing-your-site-from-amp/feed/</wfw:commentRss>
			<slash:comments>47</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Full Disclosure - This Bluetooth tag is leaking your personal data]]></title>
		<link>https://shkspr.mobi/blog/2016/11/full-disclosure-tintag/</link>
					<comments>https://shkspr.mobi/blog/2016/11/full-disclosure-tintag/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 17 Nov 2016 12:05:28 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[privacy]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[tintag]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=23575</guid>

					<description><![CDATA[If you have a TingTag, your location is being broadcast without encryption!  Earlier this year I purchased and reviewed the TinTag.  I&#039;ve spent the last month trying to get hold of the company to report a serious privacy problem with their Android app.  I&#039;ve not received an adequate response, so I&#039;m publishing this post to let affected users know about the issue.  The TinTag is a BLE tracker. …]]></description>
										<content:encoded><![CDATA[<p>If you have a TingTag, your location is being broadcast <em>without</em> encryption!</p>

<p>Earlier this year I <a href="https://shkspr.mobi/blog/2016/06/tintag-unboxing-and-review/">purchased and reviewed the TinTag</a>.  I've spent the last month trying to get hold of the company to report a <em>serious</em> privacy problem with their Android app.  I've not received an adequate response, so I'm publishing this post to let affected users know about the issue.</p>

<p>The TinTag is a BLE tracker.  It's designed to attach to your keys or bag.  An app on your phone can send a message to the tag, which causes it to light up and make a noise.  Handy if you've lost your keys and you're within Bluetooth range.</p>

<p>But what if you drop your keys while out jogging - how will you find them again?  These tags are too small and under-powered to run a GPS chip.  Instead, the app does the heavy lifting.  Every time the app detects the beacon, it records <em>the phone's</em> location and uses that as the "last known location".</p>

<p>And if you've lost your phone as well? No worries! The TinTag app uploads your precise location to its web server.</p>

<p>Completely unencrypted!</p>

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

<p>Let's fire up our trusty MITM app and see what the Android TinTag app is broadcasting to the world.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/10/TinTag-Unencrypted-Communications-fs8.png" alt="tintag unencrypted communications" width="1440" height="891" class="aligncenter size-full wp-image-23576">

<p>First off, all data is sent in the clear to Heroku.</p>

<p>TinTag are sending...</p>

<ul>
<li>The street address of the user.</li>
<li>The MAC address of the TinTag.</li>
<li>The precise latitude and longitude of the user.</li>
<li>The tag's ID.</li>
<li>A unique user ID.</li>
</ul>

<p>Of these, the most obvious concern is the exact location of the user.  They aren't encrypted in transit - what's the betting that they're encrypted on the server?</p>

<p>Given that <a href="https://play.google.com/store/apps/details?id=com.tin.tag">TinTag haven't updated their Android app</a> since the beginning of the year, do you think they've updated their server's software recently?</p>

<p><strong>If TinTag's servers are attacked - someone could get your <em>entire</em> location history.</strong></p>

<p>In part, I must say that I blame Heroku for some of these problems.  They could make their domains SSL enabled by default - but they don't.  Unfortunately, even if Heroku switched on SSL for all their users - that wouldn't help TinTag.  Digging into the app's code, this is what we find...</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/11/TinTag-Trust-Everyone-fs8.png" alt="Decompiled code showing TinTag trusting all HTTPS connections" width="834" height="434" class="aligncenter size-full wp-image-23579">

<p>My Java is a little rusty - but I'm reasonably sure that code is a "<a href="http://stackoverflow.com/a/5297100/1127699">radically insecure</a>" way to accept all HTTPS connections <strong>even if they are not valid!</strong></p>

<p>The sad thing is, the TinTag is a great piece of hardware. It has a nifty wireless recharger, has brigher lights and a louder speaker than any other BLE token I've found.  The software is so desperately insecure with <em>your</em> privacy that owners should stop using it immediately.</p>

<hr>

<p>Timeline</p>

<ul>
<li>17 October - repeated attempts to contact the company via their website.</li>
<li>26 October - contacted the CEO via LinkedIn.</li>
<li>01 November - response from CEO promising to look in to it.</li>
<li>No further contact from TingTag despite trying to contact them.</li>
<li>17 November - publication.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=23575&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2016/11/full-disclosure-tintag/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Disclosed - Lifx Security Issue]]></title>
		<link>https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/</link>
					<comments>https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 12 May 2016 11:33:42 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[lifx]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=22800</guid>

					<description><![CDATA[I love my Lifx Bulbs.  They&#039;re a quick and easy way to retrofit Internet connected goodies into a smart-home.  One of the best things about them is their open API.  Sure, you can use IFTTT if you want something easy - but us 1337 hax0rs want an API and Lifx provides it.  The API is pretty secure - good use of OAuth and tokens to make sure whatever you&#039;re building is resistant to infiltration.  I…]]></description>
										<content:encoded><![CDATA[<p>I love my Lifx Bulbs.  They're a quick and easy way to retrofit Internet connected goodies into a smart-home.</p>

<p>One of the best things about them is their open API.  Sure, you can use IFTTT if you want something easy - but us 1337 hax0rs want an API and Lifx provides it.</p>

<p>The API is pretty secure - good use of OAuth and tokens to make sure whatever you're building is resistant to infiltration.  I mean, imagine if someone hacked your lightbulbs and ... err... switched off the light while you were reading. That'd be <em>dreadful!</em></p>

<p>As I was wandering through <a href="https://api.developer.lifx.com/docs/authentication">the developer documentation</a>, I noticed that there was a prominent login form.  The pages were <strong>not</strong> served over HTTPS, and the form was similarly submitting to an insecure page.  Typing in "https" before the URL showed a mismatched certificate error.</p>

<p>Not a great user experience - and a good way for customers to have their passwords intercepted.</p>

<h3 id="24th-april-2016"><a href="https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/#24th-april-2016">24th April 2016</a></h3>

<p>I took a quick note of my findings and used Lifx's contact form to alert them.</p>

<blockquote><p>The URLs http://api.developer.lifx.com/ and http://lan.developer.lifx.com/ ask developers for their email address and password.</p><br>

<p>The site is NOT served over httpS. If a user tries to manually force it to https, they get a mismatched certificate error.</p><br>

<p>If a developer is on an insecure connection, this could cause their credentials to leak.</p><br>

<p>Can I strongly urge you to fix the certificates on the site and to reset the passwords of any user who has been affected.</p></blockquote>

<h3 id="27th-april"><a href="https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/#27th-april">27th April</a></h3>

<p>I received this very positive note back from one of their engineers.</p>

<blockquote><p>Thank you for reporting this issue to us. At LIFX we take our users and developers security extremely seriously. Here we clearly dropped the ball, and we need to be better.</p><br>

<p>Today I obtained certificates, sent them to our provider and set the documentation sites to enforce SSL. Finally I also changed most links to link to the SSL version of the site by default. We will be internally discussing how to best inform anyone affected.</p><br>

<p>Again thank you for your time finding and reporting this vulnerability to us. Your efforts have made us all more secure.</p></blockquote>

<p>That's a pretty good response time for a company - especially given the timezone differences.</p>

<h3 id="conclusions"><a href="https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/#conclusions">Conclusions</a></h3>

<p>I checked, and the sites are now securely behind https.</p>

<p>It appears that the "log in" form is actually to log in to the <a href="http://readme.io/">ReadMe.IO</a> documentation service.  I would expect that most developers would see "Log In" and use their Lifx credentials.  This means that ReadMe.IO (who I'm sure are honourable people) may inadvertently be receiving usernames and passwords for an entirely different service.</p>

<p>If you've previously clicked that Log In button, it would be sensible to reset your password and revoke and OAuth tokens you may have generated.</p>

<p>If you run a website, think hard about which login prompts you display - and whether tired developers are likely to make mistakes.</p>

<h3 id="bounty"><a href="https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/#bounty">Bounty!</a></h3>

<p>I obviously wasn't expecting a million dollar payout - but was pleasantly surprised to receive a clutch of new bulbs as a thank you gift.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2016/04/Lifx-Bug-Bounty.jpg" alt="Lifx Bug Bounty - 6 brand new bulbs" width="768" height="539" class="aligncenter size-full wp-image-22832">
Anyway, here's me casting a spell on one of my bulbs.</p>

<blockquote class="social-embed" id="social-embed-638785670002163712" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-638643392935763968" 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">That think where you have a kickarse idea only to find some beat you to it by FOUR DAYS! <a href="https://twitter.com/KelvZhan/status/637221730336002048">x.com/kelvzhan/statu…</a><blockquote class="social-embed" id="social-embed-637221730336002048" 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/KelvZhan" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRtwCAABXRUJQVlA4INACAADwDACdASowADAAPrVMn0unJCKhpy2w4BaJZgCxHrzPivM9OgOTyf1T3l+IzMFlQONnKavdvn9X/m40hmEM933K4Ydo94gBV5D3nz0FY0ivQiW8Proe53vD7AV0wpu39HexzHgn/v1SMEveTHOn2zHgAP78Dj4fGGSX6/tJP68aRNQ/CURKDMkkxhbyl26/zon96fuNapphE/toQeIKFcy4l6wIR+gC1uhMuK9ZR92ATrnllySaqSH6a9epmRq6KKgaVgGTyVI46wLL/SmVVzu0gkOjc2ywPMMeUr3uFGd7VfCjCRCO6hyWlD3Arcc30sLA9lvtSS/9sezscXd8JYBd4t/HFhC/pI56NEAr4UFAr52hdKyycSwFGboDHkdi9twuanC9gOHXxKHLTGmPcSKwetaEq5V4ftLJcd6aFZUldExnB0sSXyChPnp7vUyoySua2PxoLOcx74ejcb0LM5orqkSd1figtYOWS1Px6oH3VV1Vj+tcyCzXkribN0DFJzmWH4K/wPe52UQJIdABD8o7AaMrtfzP3MMP+vaTbNrWxTBKztjijxeephaz9GTYIoe0zNYQkHFyBYbvdXKYmL2q1K3ffYs5fJVI7+/8/0xZYJKUtU73S0wHpyRxX17nEON+gICinmMPJIrV2UdGf9KUucoKuQYIfJ2LynwWpoFAHCP02Ii3RhuOktrVhVv9eb/3COlk4zUSBd4o+H/c80dHbwTyU0bU+W5xxw2KyfpqFpLJJ1i2iKGbGy9LzCWt79SdgdqSQ2SewuZLYn5LhZp0MUx7+GDMUUTvxsTVpoUKCqV2w27ZlVyttw2BU2fpjoSwYSj78jfuL1J1tQSsmp54Lg847WQZA3Q0L+hQXdPGRouYbFxRryrplnqGHqZch7+7moltXT5gb47N1huXwsdwCt7CdP2cMj0acfb8djiS2wNva0UVflexVO4GOm/BoAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Kelvin Zhang</p>@KelvZhan</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">First working implementation of voice controlled <a href="https://twitter.com/LIFX">@LIFX</a> lights using Python Jasper + lifx-cli <a href="https://twitter.com/smarthall">@smarthall</a> <a href="https://twitter.com/KelvZhan/status/637221730336002048/video/1">pic.x.com/lkfpjo7onz</a><div class="social-embed-media-grid"><video class="social-embed-video" controls="" src="https://video.twimg.com/ext_tw_video/637221621577740288/pu/vid/1280x720/miNZGi0Pwz3nAoso.mp4" poster="data:image/webp;base64,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" width="550"></video></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/KelvZhan/status/637221730336002048"><span aria-label="6 likes" class="social-embed-meta">❤️ 6</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="3 reposts" class="social-embed-meta">🔁 3</span><time datetime="2015-08-28T11:14:34.000Z" itemprop="datePublished">11:14 - Fri 28 August 2015</time></a></footer></blockquote></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/638643392935763968"><span aria-label="0 likes" class="social-embed-meta">❤️ 0</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2015-09-01T09:23:44.000Z" itemprop="datePublished">09:23 - Tue 01 September 2015</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/638643392935763968">Replying to @edent</a></small>Woo! Using the WebKit Speech Recognition API I can now control my Lifx bulbs like Harry Potter :-) <a href="https://twitter.com/edent/status/638785670002163712/video/1">pic.x.com/ykphwepthy</a><div class="social-embed-media-grid"><video class="social-embed-video" controls="" src="https://video.twimg.com/ext_tw_video/638785659675770881/pu/vid/360x640/1rW7rfim87-cbKeD.mp4" poster="data:image/webp;base64,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" width="550"></video></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/638785670002163712"><span aria-label="8 likes" class="social-embed-meta">❤️ 8</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="2015-09-01T18:49:06.000Z" itemprop="datePublished">18:49 - Tue 01 September 2015</time></a></footer></blockquote>

<p><a href="https://github.com/edent/Harry-Potter-Lifx">Read more on my GitHub repo</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=22800&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2016/05/disclosed-lifx-security-issue/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://video.twimg.com/ext_tw_video/637221621577740288/pu/vid/1280x720/miNZGi0Pwz3nAoso.mp4" length="5592985" type="video/mp4" />
<enclosure url="https://video.twimg.com/ext_tw_video/638785659675770881/pu/vid/360x640/1rW7rfim87-cbKeD.mp4" length="544647" type="video/mp4" />

			</item>
	</channel>
</rss>
