A mysterious email problem - solved

Two years ago I heard from a friend that they wanted to send an email to my wife, but the email never went through. Instead the friend received an automated message from their email provider (Gmail) informing them that the email delivery had permanently failed. The automated message contained this error information:

TLS Negotiation failed: FAILED_PRECONDITION: starttls error (71):
6945907163592:error:10000417:SSL routines:
OPENSSL_internal:SSLV3_ALERT_ILLEGAL_PARAMETER:
third_party/openssl/boringssl/src/ssl/tls_record.cc:594:SSL alert number 47

I had never seen something like that before, also none of the contacts that are sending us private or business messages on a regular basis had ever reported any problems with sending us emails. I did some tests, such as checking the certificates being used by the Exim MTA on my dedicated Linux server (they were in order), but also sending myself an email from my own Gmail account (the email arrived). So nothing seemed amiss.

I then tried to find out more about the root cause by searching the net for keywords from the error message above, but was ultimately unsuccessful. As a side effect I found out the following about BoringSSL from their website:

BoringSSL is a fork of OpenSSL that is designed to meet Google’s needs.

So at this point it looked like this was a) a Gmail-specific issue that b) mysteriously affected only our friend (remember: I had been able to send myself emails from my own Gmail account). Lacking the time for further investigation, I dropped the case for the moment, after which it lay dormant for the next two years - until I was jolted by its reoccurrence a few days ago!

Little Go statistics update

It’s been over 3 years since I published the previous update of Little Go’s App Store statistics. In the meantime two feature releases 1.7.0 and 2.0.0 have been published, both followed by their respective bugfix release 1.7.1 and 2.0.1 after only a few days.

As usual I did not promote the app in any way, so let’s see what changed since 2021.

Little Go 2.0.0 released

Little Go 2.0.0 has been published on 10 May 2024 on the App Store, 18 months after the previous release 1.7.1. The release notes are available in the App Store update notes or on the GitHub release page.

The main user-facing changes in version 2.0.0 are two things:

  1. The app now supports game variations.
  2. An overhaul of the in-game user manual, plus the publication of an online version of the manual.

While these changes do not sound like much, they are effectively a huge step forward for the project, and accordingly I decided to increase the major version to indicate this milestone.

The remainder of this post are some of my memories of how v2 came to be and why I think a major version update was in order, so it’s perfectly safe to stop reading now 🙂.

Little Go 1.7.0 released

Little Go 1.7.0 has been published on September 18 2022 on the App Store. Another 1½ years have passed since the last release, which again is longer than I would have wished, but such is life… The new version continues the work started in 1.6.0, which has as its final goal the support of as many features of the SGF file format as possible. The release notes are available in the App Store update notes or on the GitHub release page.

Added software projects libsgfc++ and SgfcKit

With a delay of two months after their first official release I have now added my newest projects, libsgfc++ and SgfcKit, to the list of software projects.

libsgfc++ (GitHub project page) is a cross-platform C++ wrapper library around SGFC, the SGF Syntax Checker & Converter. SGFC is a command line utility written in C that reads and writes SGF (Smart Game Format) files. By wrapping SGFC’s functionality, libsgfc++ transforms the command line utility into a reusable software library that makes the functionality available in the form of an object-oriented API.

SgfcKit (GitHub project page) is an Objective-C wrapper library around libsgfc++, making the combined libsgfc++ / SGFC functionality available to Objective-C clients.

Amazing substring behaviour

In a recent code review at my workplace I found a piece of C# code that contained something along this line:

string foo = "bar";
string substring = foo.Substring(3);

Clearly index position 3 is beyond the end of the string, so I thought I had found a bug and was about to flag the code. Then it occurred to me: Why had the unit tests not failed during the gated checkin build?

Little Go statistics update

I took the opportunity of the 1.6.0 release to have another look at Little Go’s App Store statistics. The last time I published these statistics was in September 2013, for version 0.12.0. In the 7½ years since then I have done nothing to promote the app, except listing it on Sensei’s Library. I’m therefore quite pleased to see that the app’s reach has increased substantially.