What is the shortest Star Trek episode title?

Oliver Brown
— This upcoming video may not be available to view yet.

After starting my previous post with this question but not answering it, I’ll get straight to the point. There is a tie for first place, with two episode titles that are two characters long:

Shortest episode titles

Title Length Series Episode
Q2 2 letters Voyager 7x19
2 letters Enterprise 3x21

The shortest title per series is:

Title Length Series Episode
Miri 4 letters The Original Series 1x11
Bem 3 letters The Animated Series 2x02
Qpid 4 letters The Next Generation 4x20
Dax 3 letters Deep Space Nine 1x08
Q2 2 letters Voyager 7x19
2 letters Enterprise 3x21

Every series has several single word episode titles.

See them all
Title Length Series Episode
Miri 4 letters TOS 1x11
Arena 5 letters TOS 1x19
Catspaw 7 letters TOS 1x01
Metamorphosis 13 letters TOS 1x02
Obsession 9 letters TOS 2x18
Yesteryear 10 letters TAS 1x02
Bem 3 letters TAS 2x02
Albatross 9 letters TAS 2x04
Haven 5 letters TNG 1x05
Justice 7 letters TNG 1x09
Battle 6 letters TNG 1x10
Datalore 8 letters TNG 1x14
11001001 8 letters TNG 1x16
Symbiosis 9 letters TNG 1x22
Conspiracy 10 letters TNG 1x25
Contagion 9 letters TNG 2x11
Manhunt 7 letters TNG 2x19
Evolution 9 letters TNG 3x01
Allegiance 10 letters TNG 3x18
Sarek 5 letters TNG 3x23
Transfigurations 16 letters TNG 3x25
Family 6 letters TNG 4x02
Brothers 8 letters TNG 4x03
Legacy 6 letters TNG 4x06
Reunion 7 letters TNG 4x07
Clues 5 letters TNG 4x14
Qpid 4 letters TNG 4x20
Redemption 10 letters TNG 4x26
Darmok 6 letters TNG 5x02
Disaster 8 letters TNG 5x05
Unification 11 letters TNG 5x07
Violations 10 letters TNG 5x12
Conundrum 9 letters TNG 5x14
Ethics 6 letters TNG 5x16
Relics 6 letters TNG 6x04
Schisms 7 letters TNG 6x05
Rascals 7 letters TNG 6x07
Aquiel 6 letters TNG 6x13
Tapestry 8 letters TNG 6x15
Birthright 10 letters TNG 6x16
Lessons 7 letters TNG 6x19
Suspicions 10 letters TNG 6x22
Timescape 9 letters TNG 6x25
Descent 7 letters TNG 6x26
Liaisons 8 letters TNG 7x02
Interface 9 letters TNG 7x03
Gambit 6 letters TNG 7x04
Phantasms 9 letters TNG 7x06
Attached 8 letters TNG 7x08
Inheritance 11 letters TNG 7x10
Parallels 9 letters TNG 7x11
Homeward 8 letters TNG 7x13
Masks 5 letters TNG 7x17
Genesis 7 letters TNG 7x19
Firstborn 9 letters TNG 7x21
Bloodlines 10 letters TNG 7x22
Emergence 9 letters TNG 7x23
Emissary 8 letters DS9 1x01
Babel 5 letters DS9 1x05
Q-Less 6 letters DS9 1x07
Dax 3 letters DS9 1x08
Vortex 6 letters DS9 1x12
Storyteller 11 letters DS9 1x14
Progress 8 letters DS9 1x15
Forsaken 8 letters DS9 1x17
Duet 4 letters DS9 1x19
Cardassians 11 letters DS9 2x05
Melora 6 letters DS9 2x06
Sanctuary 9 letters DS9 2x10
Rivals 6 letters DS9 2x11
Whispers 8 letters DS9 2x13
Paradise 8 letters DS9 2x14
Shadowplay 10 letters DS9 2x15
Crossover 9 letters DS9 2x23
Tribunal 8 letters DS9 2x25
Equilibrium 11 letters DS9 3x04
Meridian 8 letters DS9 3x08
Defiant 7 letters DS9 3x09
Fascination 11 letters DS9 3x10
Destiny 7 letters DS9 3x15
Visionary 9 letters DS9 3x17
Explorers 9 letters DS9 3x22
Shakaar 7 letters DS9 3x24
Facets 6 letters DS9 3x25
Indiscretion 12 letters DS9 4x05
Rejoined 8 letters DS9 4x06
Homefront 9 letters DS9 4x11
Crossfire 9 letters DS9 4x13
Accession 9 letters DS9 4x17
Rapture 7 letters DS9 5x10
Resurrection 12 letters DS9 6x08
Waltz 5 letters DS9 6x11
Inquisition 11 letters DS9 6x18
Valiant 7 letters DS9 6x22
Afterimage 10 letters DS9 7x03
Chrysalis 9 letters DS9 7x05
Covenant 8 letters DS9 7x09
Chimera 7 letters DS9 7x14
Penumbra 8 letters DS9 7x17
Caretaker 9 letters VOY 1x01
Parallax 8 letters VOY 1x03
Phage 5 letters VOY 1x05
Emanations 10 letters VOY 1x09
Cathexis 8 letters VOY 1x13
Faces 5 letters VOY 1x14
Jetrel 6 letters VOY 1x15
Initiations 11 letters VOY 2x02
Projections 11 letters VOY 2x03
Elogium 7 letters VOY 2x04
Twisted 7 letters VOY 2x06
Parturition 11 letters VOY 2x07
Tattoo 6 letters VOY 2x09
Maneuvers 9 letters VOY 2x11
Resistance 10 letters VOY 2x12
Prototype 9 letters VOY 2x13
Alliances 9 letters VOY 2x14
Threshold 9 letters VOY 2x15
Meld 4 letters VOY 2x16
Dreadnought 11 letters VOY 2x17
Lifesigns 9 letters VOY 2x19
Investigations 14 letters VOY 2x20
Deadlock 8 letters VOY 2x21
Innocence 9 letters VOY 2x22
Tuvix 5 letters VOY 2x24
Resolutions 11 letters VOY 2x25
Basics 6 letters VOY 2x26
Flashback 9 letters VOY 3x02
Remember 8 letters VOY 3x06
Warlord 7 letters VOY 3x10
Macrocosm 9 letters VOY 3x12
Coda 4 letters VOY 3x15
Unity 5 letters VOY 3x17
Darkling 8 letters VOY 3x18
Rise 4 letters VOY 3x19
Displaced 9 letters VOY 3x24
Scorpion 8 letters VOY 3x26
Nemesis 7 letters VOY 4x04
Revulsion 9 letters VOY 4x05
Hunters 7 letters VOY 4x15
Prey 4 letters VOY 4x16
Retrospect 10 letters VOY 4x17
Unforgettable 13 letters VOY 4x22
Demon 5 letters VOY 4x24
One 3 letters VOY 4x25
Night 5 letters VOY 5x01
Drone 5 letters VOY 5x02
Timeless 8 letters VOY 5x06
Counterpoint 12 letters VOY 5x10
Gravity 7 letters VOY 5x13
Bliss 5 letters VOY 5x14
Juggernaut 10 letters VOY 5x21
11:59 5 letters VOY 5x23
Relativity 10 letters VOY 5x24
Warhead 7 letters VOY 5x25
Equinox 7 letters VOY 5x26
Alice 5 letters VOY 6x05
Riddles 7 letters VOY 6x06
Pathfinder 10 letters VOY 6x10
Virtuoso 8 letters VOY 6x13
Memorial 8 letters VOY 6x14
Tsunkatse 9 letters VOY 6x15
Collective 10 letters VOY 6x16
Muse 4 letters VOY 6x22
Fury 4 letters VOY 6x23
Imperfection 12 letters VOY 7x02
Drive 5 letters VOY 7x03
Repression 10 letters VOY 7x04
Nightingale 11 letters VOY 7x08
Shattered 9 letters VOY 7x11
Lineage 7 letters VOY 7x12
Repentance 10 letters VOY 7x13
Prophecy 8 letters VOY 7x14
Workforce 9 letters VOY 7x16
Q2 2 letters VOY 7x19
Homestead 9 letters VOY 7x23
Endgame 7 letters VOY 7x25
Unexpected 10 letters ENT 1x05
Civilization 12 letters ENT 1x09
Fusion 6 letters ENT 1x17
Acquisition 11 letters ENT 1x19
Oasis 5 letters ENT 1x20
Detained 8 letters ENT 1x21
Shockwave 9 letters ENT 1x26
Minefield 9 letters ENT 2x03
Marauders 9 letters ENT 2x06
Singularity 11 letters ENT 2x09
Dawn 4 letters ENT 2x13
Stigma 6 letters ENT 2x14
Canamar 7 letters ENT 2x17
Judgment 8 letters ENT 2x19
Horizon 7 letters ENT 2x20
Cogenitor 9 letters ENT 2x22
Regeneration 12 letters ENT 2x23
Bounty 6 letters ENT 2x25
Anomaly 7 letters ENT 3x02
Extinction 10 letters ENT 3x03
Rajiin 6 letters ENT 3x04
Impulse 7 letters ENT 3x05
Exile 5 letters ENT 3x06
Twilight 8 letters ENT 3x08
Similitude 10 letters ENT 3x10
Stratagem 9 letters ENT 3x14
Harbinger 9 letters ENT 3x15
Hatchery 8 letters ENT 3x17
Damage 6 letters ENT 3x19
2 letters ENT 3x21
Countdown 9 letters ENT 3x23
Home 4 letters ENT 4x03
Borderland 10 letters ENT 4x04
Forge 5 letters ENT 4x07
Awakening 9 letters ENT 4x08
Kir’Shara 9 letters ENT 4x09
Daedalus 8 letters ENT 4x10
United 6 letters ENT 4x13
Affliction 10 letters ENT 4x15
Divergence 10 letters ENT 4x16
Bound 5 letters ENT 4x17
Demons 6 letters ENT 4x20

Longest episode titles

Unlike with the shortest episode title, I had a good idea what the longest one was. At least, I had two candidates, but without sitting down and counting, picking one would have been a guess. I can confirm they are the longest two, and I present them both since they are such outliers compared to the rest.

Title Length Series Episode
For the World is Hollow and I Have Touched the Sky 50 letters The Original Series 3x10
Looking for par’Mach in All the Wrong Places 44 letters Deep Space Nine 5x03

And the longest per series:

Title Length Series Episode
For the World is Hollow and I Have Touched the Sky 50 letters The Original Series 3x10
How Sharper Than a Serpent’s Tooth 34 letters The Animated Series 2x05
Where No One Has Gone Before 28 letters The Next Generation 1x06
Looking for par’Mach in All the Wrong Places 44 letters Deep Space Nine 5x03
The Haunting of Deck Twelve 27 letters Voyager 6x25
Two Days and Two Nights 23 letters Enterprise 1x25

This brings us our first controversial result. I decided that ellipses should be treated as a single letter (if only for a sense of typographical superiority). In this case, treating it as three letters would produce a different result:

Title Length Series Episode
These Are the Voyages… 24 letters Enterprise 4x22

The titles so far have been longest by letter-count. Longest by word-count can also be determined. This gives identical results, except Voyager and the Animated Series now have ties:

Title Length Series Episode
For the World is Hollow and I Have Touched the Sky 11 words The Original Series 3x10
One of Our Planets is Missing 6 words The Animated Series 1x03
How Sharper Than a Serpent’s Tooth 6 words The Animated Series 2x05
Where No One Has Gone Before 6 words The Next Generation 1x06
Looking for par’Mach in All the Wrong Places 8 words Deep Space Nine 5x03
The Q and the Grey 5 words Voyager 3x11
Someone to Watch Over Me 5 words Voyager 6x25
The Haunting of Deck Twelve 5 words Voyager 5x22
Two Days and Two Nights 5 words Enterprise 1x25

Current time abstraction coming to .NET

Oliver Brown
— This upcoming video may not be available to view yet.

It is often necessary in computer systems to get the current date and time. .NET has had a straightforward way to do that since its inception. What it hasn’t had is a built-in way to customize the behavior, particularly for mocking during automated tests.

Quite why this situation has persisted for so long is a bit of mystery. The importance of automated tests has only risen over time and questions about how to deal with this crop up quite frequently. The general solution is to provide an abstraction that you can inject and mock easily.

The popular date and time library Noda Time includes IClock, and any developers are often directed to use Noda Time for anything making use of anything but the simplest of time-based logic. But it is still odd there is nothing built-in, especially considering there is an existing private implementation in .NET, as well as several in ASP.NET.

Well .NET 8 will finally be getting System.TimeProvider:

namespace System
{
    /// <summary>Provides an abstraction for time. </summary>
    public abstract class TimeProvider
    {
        protected TimeProvider();
        public static TimeProvider System { get; }
        public static TimeProvider FromLocalTimeZone(TimeZoneInfo timeZone);
        public abstract DateTimeOffset UtcNow { get; }
        public DateTimeOffset LocalNow { get; }
        public abstract TimeZoneInfo LocalTimeZone { get; }
        public abstract long GetTimestamp();
        public abstract long TimestampFrequency { get; }
        public TimeSpan GetElapsedTime(long startingTimestamp, long endingTimestamp);
        public abstract ITimer CreateTimer(TimerCallback callback, object? state, TimeSpan dueTime, TimeSpan period);
    }
}

Here is the original GitHub issue and the pull request implementing it.

As well as providing a mockable abstraction to get the current time (including a default implementation providing the system time), it also adds supports to a bunch of other APIs to use a specified instance instead including Task and Timer.

And, best of all, despite my earlier claim that this is a .NET 8 feature, this will also be made available as a package targeting .NET Standard 2.0, so it can be used on .NET Framework and other targets.

Analyzing Star Trek episode titles

Oliver Brown
— This upcoming video may not be available to view yet.
Gorn from Star Trek episode Arena

I recently found myself idly wondering what the shortest Star Trek episode title was. The first to come to mind was the Original Series episode “Arena” (the one which Captain Kirk fights a humanoid lizard in one of the most striking examples of 1960 “makeup”).

I guessed there were probably shorter ones, but was rather disappointed I didn’t know the answer for sure. So I decided to find out.

While investigating, I also started wondering other things, like: what is the longest episode title? Which series has the shortest or longest titles on average? How many episodes begin with “the”?

I have decided to gather the answers to these questions and more together into a series of blog posts.

Some ground rules

I quickly realised even for “shortest episode title” there were some decisions I would have to make about what would count.

What counts as a letter?
Any character is a letter. So including (but not necessarily limited to):
  • The letters A-Z (regardless of case or accents).
  • The digits 0-9.
  • Any punctuation symbol.
  • A space.
  • An ellipsis (so three dots … is a single character).
What counts as a word?
Spaces separate words, nothing else does. 37's is one word, as is 11001001.
Which series/episodes are included?
I decided to include all episodes from The Original Series (including “The Cage”), The Animated Series, The Next Generation, Deep Space Nine, Voyager and Enterprise. This is for the simple practical reason that no more episodes are being produced for these (with the recent annocunement that season 5 of Discovery will be its last, I may redo this including Discovery in the near future).
What about two-part episodes?
For two part episodes (that don’t have completely different titles), I’m just using the “base name”.

About those two-part episodes

The first two-part episode of Star Trek was called “The Menagerie”. In the episode title sequence it is styled as "THE MENAGERIE" PART I and "THE MENAGERIE" PART II, with the part information clearly outside the quotation marks used to identify the title. This suggests the title is in fact “The Menagerie”.

“The Menagerie” (as far as I am aware) was never produced as a single feature length episode. Many other two-part episodes were either broadcast originally as a single episode, or later made available as one (often with additional footage included). This means an episode could potentially have three different names (one for each part individually and one for the whole) and using the “base name” seems most sensible in this case.

It should also be noted, there is little consistency in how the two-part episode titles are handled. Some of them give the first part the “base name” and add “Part II” after whereas others include the part information in both titles. Whether the part information is inside the quotes varies, and even whether the word “part” is included.

So overall, I feel justified in in using the “base name”, just as a way of establishing some kind of order. Although I can already tell I’m going to have to write a detailed blog post covering all of this (especially if I get to including Discovery, since that messes everything up by having an episode titled as if it is the third part of a three-part episode, the first two parts of which are from another series).

Image copyright © Paramount Global and used under fair use.

Updated Discworld audiobook release dates

Oliver Brown
— This upcoming video may not be available to view yet.
As an Amazon Associate I earn from qualifying purchases. See here for more information.

New audio versions of all* of the Discworld books are being produced. They aren’t being released in order though and as far as I can tell there is no convenient page listing all the release dates.

So here are the release dates currently listed on Audible as of 15th March, 2023. There are a few different ways Discworld books get grouped. “Series” below is how Audible have grouped them (and I assume matches the narrator).

Release date

2021 December 21st

Title Series
Hogfather Death 20

2022 April 28th

Title Series
Equal Rites Witches 3
Wyrd Sisters Witches 6
Witches Abroad Witches 12
Lords and Ladies Witches 14
Maskerade Witches 18
Carpe Jugulum Witches 23
Small Gods Standalone 13

2022 July 7th

Title Series
The Colour of Magic Rincewind 1
The Light Fantastic Rincewind 2
Sourcery Rincewind 5
Eric Rincewind 9
Interesting Times Rincewind 17
The Lat Continent Rincewind 22
Unseen Academicals Rincewind 37

2022 October 6th

Title Series
The Amazing Maurice and His Educated Rodents Standalone 28

2022 October 27th

Title Series
Mort Death 4
Reaper Man Death 11
Soul Music Death 16
Thief of Time Death 26

2023 February 23rd

Title Series
The Truth Industrial Revolution 25
Monstrous Regiment Industrial Revolution 31
Going Postal Industrial Revolution 33
Making Money Industrial Revolution 36
Raising Steam Industrial Revolution 40

2023 March 30th

Title Series
Pyramids Standalone 7

2023 May 18th

Title Series
Moving Pictures Industrial Revolution 10

2023 May 25th

Title Series
Guards! Guards! Ankh-Morpork City Watch 8
Men at Arms Ankh-Morpork City Watch 15
Feet of Clay Ankh-Morpork City Watch 19
Jingo Ankh-Morpork City Watch 21
The Fifth Elephant Ankh-Morpork City Watch 24
Night Watch Ankh-Morpork City Watch 29
Thud! Ankh-Morpork City Watch 34
Snuff Ankh-Morpork City Watch 39

2023 June 15th

Title Series
The Wee Free Men Tiffany Aching 30
A Hat Full of Sky Tiffany Aching 32
Wintersmith Tiffany Aching 35
I Shall Wear Midnight Tiffany Aching 38
The Sheperd's Crown Tiffany Aching 41

Reading order

Title Series Release date
The Colour of Magic Rincewind 1 2022 July 7th
The Light Fantastic Rincewind 2 2022 July 7th
Equal Rites Witches 3 2022 April 28th
Mort Death 4 2022 October 27th
Sourcery Rincewind 5 2022 July 7th
Wyrd Sisters Witches 6 2022 April 28th
Pyramids Standalone 7 2023 March 30th
Guards! Guards! Ankh-Morpork City Watch 8 2023 May 25th
Eric Rincewind 9 2022 July 7th
Moving Pictures Industrial Revolution 10 2023 May 18th
Reaper Man Death 11 2022 October 27th
Witches Abroad Witches 12 2022 April 28th
Small Gods Standalone 13 2022 April 28th
Lords and Ladies Witches 14 2022 April 28th
Men at Arms Ankh-Morpork City Watch 15 2023 May 25th
Soul Music Death 16 2022 October 27th
Maskerade Witches 18 2022 April 28th
Interesting Times Rincewind 17 2022 July 7th
Feet of Clay Ankh-Morpork City Watch 19 2023 May 25th
Hogfather Death 20 2021 December 21st
Jingo Ankh-Morpork City Watch 21 2023 May 25th
The Lat Continent Rincewind 22 2022 July 7th
Carpe Jugulum Witches 23 2022 April 28th
The Fifth Elephant Ankh-Morpork City Watch 24 2023 May 25th
The Truth Industrial Revolution 25 2023 February 23rd
Thief of Time Death 26 2022 October 27th
The Amazing Maurice and His Educated Rodents Standalone 28 2022 October 6th
Night Watch Ankh-Morpork City Watch 29 2023 May 25th
The Wee Free Men Tiffany Aching 30 2023 June 15th
Monstrous Regiment Industrial Revolution 31 2023 February 23rd
A Hat Full of Sky Tiffany Aching 32 2023 June 15th
Going Postal Industrial Revolution 33 2023 February 23rd
Thud! Ankh-Morpork City Watch 34 2023 May 25th
Wintersmith Tiffany Aching 35 2023 June 15th
Making Money Industrial Revolution 36 2023 February 23rd
Unseen Academicals Rincewind 37 2022 July 7th
I Shall Wear Midnight Tiffany Aching 38 2023 June 15th
Snuff Ankh-Morpork City Watch 39 2023 May 25th
Raising Steam Industrial Revolution 40 2023 February 23rd
The Sheperd's Crown Tiffany Aching 41 2023 June 15th

* There are 41 Discworld books. The website says “40 magnificent new recordings”. The one that seems to be missing is “The Last Hero”.

Blazor Numbers Game

Oliver Brown
— This upcoming video may not be available to view yet.

Over the weekend I was playing around with Blazor and created a little number game based on part of a popular British TV show.

In the future this may expand in functionality as part of my exploration into Blazor.

You can try the number game full screen.

Mettle is probably not suitable for tech businesses

Oliver Brown
— This upcoming video may not be available to view yet.

Just to avoid any confusion, everything in this post is based on how things work in the UK and is for things available in the UK.

So far I have operated various business ventures off my personal bank account. Since I’ve been doing this as a sole trader, this is allowed. It does however make tax returns take more effort than necessary.

FreeAgent

I recently had reason to interact with FreeAgent, which is some pretty cool accounting software that makes a lot of things simpler. Unfortunately to really use it to its potential, you need to link it to a bank account used solely for your business.

Conveniently, they offer a free account to anyone who has a Mettle account. I had seen Mettle before, and it is described as “the free mobile business account with no hidden fees or charges”, and is operated by NatWest, one of the big UK high street banks.

E-money accounts

After a quick investigation, it seems one of the reasons it is free (which is the norm for personal accounts in the UK but not business accounts) is that it is not actually a bank account, but an “e-money account”. You get an account number as well as a debit card, but it is not subject to the Financial Services Compensation Scheme (a scheme in the UK in which the government guarantees bank balances up to a certain amount if a bank goes under).

That limitation seemed fine to me since I did not intend to keep a large balance, so I created an account. Sadly, I found out there are other limitations which basically rendered it useless to me.

Prepaid cards

Firstly, it does not come with an IBAN (international bank account number). This means I cannot receive payments from Apple. Secondly, the card is a prepaid card. Since it is tied to the e-money account they give you, it feels like a debit card to use, except some things just don’t accept payments using them. Crucially for me, Microsoft Azure and Google Ads.

Conclusion

In the end, I opened a business account with Royal Bank of Scotland. RBS and NatWest business accounts also get free FreeAgent accounts. The application was more involved (for Mettle, besides verifying your ID you just have to declare you aren’t in one of their list of prohibited business) but in the end was fine.

New Discworld audiobooks

Oliver Brown
— This upcoming video may not be available to view yet.
As an Amazon Associate I earn from qualifying purchases. See here for more information.

New audio versions of all* of the Discworld books are being produced. They aren’t being released in order though and as far as I can tell there is no convenient page listing all the release dates.

So here are the release dates currently listed on Audible. There are a few different ways Discworld books get grouped. “Series” below is how Audible have grouped them (and I assume matches the narrator).

Release date

2021 December 21st

Title Series
Hogfather Death 20

2022 April 28th

Title Series
Equal Rites Witches 3
Wyrd Sisters Witches 6
Witches Abroad Witches 12
Lords and Ladies Witches 14
Maskerade Witches 18
Carpe Jugulum Witches 23
Small Gods Standalone 13

2022 July 7th

Title Series
The Colour of Magic Rincewind 1
The Light Fantastic Rincewind 2
Sourcery Rincewind 5
Eric Rincewind 9
Interesting Times Rincewind 17
The Last Continent Rincewind 22
Unseen Academicals Rincewind 37

2022 October 10th

Title Series
The Amazing Maurice and His Educated Rodents Standalone 28

2022 October 27th

Title Series
Mort Death 4
Reaper Man Death 11
Soul Music Death 16
Thief of Time Death 26

2023 February 23rd

Title Series
Moving Pictures Industrial Revolution 10
The Truth Industrial Revolution 25
Monstrous Regiment Industrial Revolution 31
Going Postal Industrial Revolution 33
Making Money Industrial Revolution 36
Raising Steam Industrial Revolution 40
Pyramids Standalone 7

Release date - To be released

2023 April 27th

Title Series
Guards! Guards! Ankh-Morpork City Watch 8
Men at Arms Ankh-Morpork City Watch 15
Feet of Clay Ankh-Morpork City Watch 19
Jingo Ankh-Morpork City Watch 21
The Fifth Elephant Ankh-Morpork City Watch 24
Night Watch Ankh-Morpork City Watch 29
Thud! Ankh-Morpork City Watch 34
Snuff Ankh-Morpork City Watch 39
The Wee Free Men Tiffany Aching 30
A Hat Full of Sky Tiffany Aching 32
Wintersmith Tiffany Aching 35
I Shall Wear Midnight Tiffany Aching 38
The Sheperd's Crown Tiffany Aching 41

Unknown

Title Series
The Last Hero Rincewind 27

Reading order

Title Series Release date
The Colour of Magic Rincewind 1 2022 July 7th
The Light Fantastic Rincewind 2 2022 July 7th
Equal Rites Witches 3 2022 April 28th
Mort Death 4 2022 October 27th
Sourcery Rincewind 5 2022 July 7th
Wyrd Sisters Witches 6 2022 April 28th
Pyramids Standalone 7 2023 February 23rd
Guards! Guards! Ankh-Morpork City Watch 8 2023 April 27th
Eric Rincewind 9 2022 July 7th
Moving Pictures Industrial Revolution 10 2023 February 23rd
Reaper Man Death 11 2022 October 27th
Witches Abroad Witches 12 2022 April 28th
Small Gods Standalone 13 2022 April 28th
Lords and Ladies Witches 14 2022 April 28th
Men at Arms Ankh-Morpork City Watch 15 2023 April 27th
Soul Music Death 16 2022 October 27th
Maskerade Witches 18 2022 April 28th
Interesting Times Rincewind 17 2022 July 7th
Feet of Clay Ankh-Morpork City Watch 19 2023 April 27th
Hogfather Death 20 2021 December 21st
Jingo Ankh-Morpork City Watch 21 2023 April 27th
The Last Continent Rincewind 22 2022 July 7th
Carpe Jugulum Witches 23 2022 April 28th
The Fifth Elephant Ankh-Morpork City Watch 24 2023 April 27th
The Truth Industrial Revolution 25 2023 February 23rd
Thief of Time Death 26 2022 October 27th
The Last Hero Rincewind 27 Unknown
The Amazing Maurice and His Educated Rodents Standalone 28 2022 October 10th
Night Watch Ankh-Morpork City Watch 29 2023 April 27th
The Wee Free Men Tiffany Aching 30 2023 April 27th
Monstrous Regiment Industrial Revolution 31 2023 February 23rd
A Hat Full of Sky Tiffany Aching 32 2023 April 27th
Going Postal Industrial Revolution 33 2023 February 23rd
Thud! Ankh-Morpork City Watch 34 2023 April 27th
Wintersmith Tiffany Aching 35 2023 April 27th
Making Money Industrial Revolution 36 2023 February 23rd
Unseen Academicals Rincewind 37 2022 July 7th
I Shall Wear Midnight Tiffany Aching 38 2023 April 27th
Snuff Ankh-Morpork City Watch 39 2023 April 27th
Raising Steam Industrial Revolution 40 2023 February 23rd
The Sheperd's Crown Tiffany Aching 41 2023 April 27th

* There are 41 Discworld books. The website says “40 magnificent new recordings”. The one that seems to be missing is “The Last Hero”.

Interacting with this video is done so under the Terms of Service of YouTube
View this video directly on YouTube

IAB Transparency & Consent Framework does not meet GDRP requirements for transparency or consent

Oliver Brown
— This upcoming video may not be available to view yet.

I posted a while ago about a technical standard that was being used for consent gathering on websites and in apps known as the “Transparency & Consent Framework” by IAB Europe.

Well, the Belgian Data Protection Agency (the Belgian organization responsible for enforcing the GDPR) has fined IAB Europe €250,000 because the TCF “fails to comply with a number of provisions of the GDPR”.

I don’t know whether fining IAB Europe is the correct choice, as they themselves claim they aren’t a data controller and only provide guidance (and a spec) for other companies to use. But the fine itself is not really what is going to be turn out important. The judgement requires:

all recipients of the personal data processed in the TCF . . . to permanently delete all TC Strings and other personal data already processed in the TCF from all IT systems, files and data carriers.

One piece of irony - if you search for articles about this you will find they are nearly all protected by consent dialogs based on TCF.

Here is the full judgement in English.

Blazor custom elements

Oliver Brown
— This upcoming video may not be available to view yet.

There is now a preview package for Blazor that allows creating custom elements.

Custom elements are part of the Web Components standards and are intended to be a way of defining tags that can be consumed in HTML and interoperate with each other.

The docs mostly focus on using them with Angular or React, but that isn’t why they are interesting to me.

The site for Tic-tac-toe Collection includes pages that show some information about specific game mode (for example four-player Tic-tac-toe misère rumble).

That content is rendered as a custom element (in this case <ttt-settings short-code="T_D4_S6x6_W3_T0_P0_M1_O1_F0"></ttt-settings>). Since the site is statically generated with no frontend framework, I wrote the element in vanilla JavaScript. Blazor support for custom elements means I could rewrite that component in C#.

[SOLVED] Firebase Performance Monitoring in Xamarin Android

Oliver Brown
— This upcoming video may not be available to view yet.

I decided to add Firebase Performance Monitoring to the latest version of Tic-tac-toe Collection.

What is it

This allows you to collect timed traces of things that happen in your app. You can set up custom traces for anything you like, but it also tracks how long HTTP requests take by default. At least it’s supposed to. On iOS it worked well, but Android had nothing.

There is an open issue on the repo with the Xamarin binding that was created in December 2018. It includes suggestions to make sure your app is set to using the native HTTP handlers (which makes sense since whatever Firebase is doing it won’t be expecting a random third party HTTP stack to be used), however it still does not work.

How does it work

So I decided to investigate how the HTTP tracing is actually implemented. How found this Stack Overflow question which lead me to this video. It turns out the implementation works by doing some byte code rewriting that changes any references in your app to the HTTP classes to instead reference Firebase provided wrappers.

Why doesn’t it work for Xamarin Android?

I kind of assumed it was doing something like that, but didn’t really think through the implications. Specifically - it does the byte code rewriting as part of a Gradle plugin that is not executed as part of a Xamarin build.

Solution

It may be possible to get the Gradle plugin to execute it’s transformer, but that seems complicated. Luckily, Firebase does provide support for adding HTTP tracing to other libraries, so I decided to work with that.

I decided to implement my own HttpMessageHandler that sets up the HttpMetric and then delegates to a normal HttpClientHandler. This can be passed into the constructor of HttpClient.

public class FirebaseHttpMessageHandler : DelegatingHandler
{
    public FirebaseHttpMessageHandler() : base(new HttpClientHandler())
    {
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var metric = StartTracking(request);
        var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
        StopTracking(metric, response);
        return response;
    }

    private HttpMetric? StartTracking(HttpRequestMessage request)
    {
        try
        {
            var url = new Java.Net.URL(request.RequestUri.AbsoluteUri);
            var metric = Firebase.Perf.FirebasePerformance.Instance.NewHttpMetric(url, request.Method.Method);
            metric.Start();
            if (request.Content?.Headers?.ContentLength is long length)
            {
                metric.SetRequestPayloadSize(length);
            }

            return metric;
        }
        catch (Exception ex)
        {
            Debug.Fail($"URL performance tracking failed: {request.RequestUri.AbsoluteUri} - {ex.Message}");
            return null;
        }
    }

    private void StopTracking(HttpMetric? metric, HttpResponseMessage response)
    {
        if (metric is null)
        {
            return;
        }
        try
        {
            metric.SetHttpResponseCode((int)response.StatusCode);
            if (response.Content?.Headers?.ContentLength is long length)
            {
                metric.SetResponsePayloadSize(length);
            }
            if (response.Content?.Headers?.ContentType?.MediaType is string mediaType)
            {
                metric.SetResponseContentType(mediaType);
            }
        }
        catch (Exception ex)
        {
            Debug.Fail($"URL performance tracking failed: {response.RequestMessage.RequestUri.AbsoluteUri} - {ex.Message}");
        }
        finally
        {
            metric.Stop();
        }
    }
}

Why does it work for Xamarin iOS?

I don’t know the exact method used on iOS, but I do know that iOS has a feature called NSURLProtocol that lets you intercept all HTTP requests by the app, as well as method swizzling which lets you replace basically any method implementation at runtime.

Either of those could be used, and they would both just work in Xamarin.