Medieval Moulins

Moulins is the administrative centre of our region. The city is home to the Préfecture de l’Allier and thus a city we have had to visit a few times.

It is a pretty city, with plenty of history on show. An easy place to take beautiful photographs.

Moulins Cathedral
Moulins Cathedral
Rooftops in Moulins
Rooftops in Moulins
Colourful enduit in Moulins
Colourful enduit in Moulins
Medieval street in Moulins
Medieval street in Moulins

The post Medieval Moulins appeared first on Graham Miln.

Creating the Signpost Application and Subscriptions

Miln Signpost is the strangest macOS application I have written. Strange because it provides something I find magical and because it seems unlikely to find a waiting audience.

I explain what Signpost does on but the short answer is:

Signpost provides local domain names without a DNS server

For many, probably most, this description is cryptic and too technical to be useful. Explaining what Signpost does is a problem I have not found a good solution to. I can not justify making the time to market this oddball product; for now it will sit quietly waiting to delight those who stumble upon it.

Miln Signpost – mDNS for macOS
Miln Signpost – mDNS for macOS

Signpost was written as an experiment. I wanted to know what writing a modern Mac application would entail. How much legacy code could I avoid? What new techniques or frameworks have appeared since I last started a brand new Mac application.

Typically I develop Mac applications with a view to supporting as many versions of macOS as possible. The larger the number of supported versions, the larger the audience.

Signpost supports only the latest version of the Mac operating system, macOS 10.13.

I discovered there have been very few major changes I needed to care about. The recent macOS versions have been reasonably stable for core application frameworks. I could add support for older versions of macOS without too much additional work but the true cost will be in testing and maintaining that test environment.

There have been improvements that I have appreciated: the shift away from paths and file specs to using URLs almost everywhere, a better table view model, and code blocks in-place of callback function pointers were all welcome.

Not every change is an improvement. I morn for CoreFoundation’s hundreds of deprecated functions. Many other Core* frameworks are also littered with deprecated pragmas. Pragmas too often without hint of a replacement. In these situations a knowledge of the underpinning unix layer continues to be valuable. Over the years, I have often had to drop down a layer of abstraction. It seems Apple is lessening its desire to hide those lower layers.


Signpost was also an experiment in in-app purchases and subscriptions.

For this application, I wanted to offer a subscription for payment. One time purchases of software do not provide enough stable income to cover the costs of niche products. Subscriptions, even inexpensive annual ones, might be more sustainable. I wanted to use Signpost to see what would be involved in a new payment model.

For Signpost to support subscriptions, I needed to create a surprising amount of subscription specific functionality. Functionality like an in-app store, legal confirmation dialogs, and a server side receipt handling system.

Miln Signpost - supported by subscriptions
Miln Signpost – supported by subscriptions

I had presumed Apple, who accept and manage the subscriptions, would handle most of this but they do not. Every application needs to replicate the same functionality over and over. Remember Apple own the customer and the transaction. If you pay for Signpost, you are not paying me. You are paying Apple.

So now, thanks to Signpost, I have a good chunk of the infrastructure to handle subscriptions with – or without – the Mac App Store.

Will subscriptions help? It is difficult to believe they will for Signpost. But maybe for future products. After all, I have been through the process once and I have learnt what is entailed.

You can get Signpost now from the

The post Creating the Signpost Application and Subscriptions appeared first on Graham Miln.

Change in Domain Registrars

I manage a handful of domain names. Regrettably I had to move them to a new domain registrar. My former registrar had succumbed to temptation and had begun messing around.

A domain registrar is a company that manages the record of your domain names. Customers pay for annual renews of the domain. In return, the registrar is responsible for maintaining and pointing the domain record to a set of domain name servers. Once set up, there is little need to interact with or think about your domain registrar.

Like web hosting, domain registrars are subject to a cut throat market and little incentive to remain lean and transparent. Over time adds-on, up-sells, and eventually snake oil side offerings start making their way into these business’ practices.


I chose Hover because the company supports podcasts I enjoy, such as Hello Internet and Accidental Tech Podcast.

The move to Hover is ongoing and has not been smooth. Below are a few grumbles of my experience.

Better International Domain Support

Among the domains I transfered were .uk and .eu domains. These required interacting with a member of Hover staff to transfer. I am not sure why; the process can clearly be automated from the customer’s side.

I want to avoid having to contact you during your working hours. Our time zones do not align well.

Please Hover, let me transfer .eu and .uk domains via a web form.

Hide the Expiry Date

While the .com domains were being transfered, they appeared as pending in my account. This is reassuring. Less reassuring was the incorrect expiry date shown. The date was one year from the date of requested transfer. I understand why this date was shown but it is always incorrect from the customer’s perspective.

Please Hover, hide the expiry dates of pending domains until known.

null in Billing Address

Within my Hover account, the card billing address shown contains the word null. It appears either the optional Address 2 or State/Province field is being incorrectly handled. These small errors undermine confidence in your systems.

Please Hover, fix the card billing address.

Fix .eu Domain Privacy

Hover’s policy on .eu domain privacy is incorrect. The policy currently reads:

Note: WHOIS Privacy is available for more TLDs, but there are some exceptions. For instance, .CA and *.UK allow WHOIS Privacy for individuals, but not for companies. Some do not allow WHOIS Privacy at all, for example, .SEXY, .DE, .EU, and .US. And then there are others, such as .AT, that allow WHOIS Privacy only in very specific instances.

Page 4 of .eu WHOIS policy reads:

When the Registrant is a natural person (private individual) the Registrant contact information published is restricted to the e-mail address, unless they request otherwise.

According to the same .eu document, privacy is available so long as the Organisation field is left blank.

Sadly Hover’s web site enforces a non-blank Organisation field. This is a serious but hopefully easy to fix bug.

Please Hover, allow blank or empty Organisation fields!

Hover requires an organisation field; it must be optional.
Hover requires an organisation field; it must be optional.

Share Information

Stop sending public forum responses by private e-mail. Too often when researching Hover’s support forums, I found company replies that said “An email is on it’s way to you, keep an eye out for that.”

Often these threads continued with other customers also asking for the same reply. This behaviour quickly reduces the value of the thread to near zero; clearly an answer exists but Hover will not make it public.

Hover support forum.
Hover support forum.

Please Hover, answer as much as possible publicly.

Stop Sharing Information

I run ad-blocking software on my browser. It was annoying to have to turn this off to use the Hover web site.

Hover, why are relying on so many third party injected scripts and widgets? Treat paying customers’ activity and information with care and privacy. Allowing numerous third parties insight into my actions on my account is, at best, unsettling.

Once I login to a pay-for service, I want to see a serious reduction in advertising beacons and injected third party scripts.

Please Hover, reduce your web site dependencies on third party scripts, beacons, tags, and widgets.


I am sure there will be more grumbles later. If so, I will add them here, and if Hover fix any of these – and let me know – I will also update this page.

The post Change in Domain Registrars appeared first on Graham Miln.

Christmas at Home

This will be our first year celebrating Christmas in our new home. The transition from city to country continues to be the most dramatic lifestyle shift I have known.

Happy Christmas.

Our first Christmas tree.
Our first Christmas tree.
Snowflake cookie cutter
Snowflake cookie cutter
Our traditional snowflake gingerbread biscuits
Our traditional snowflake gingerbread biscuits
Christmas decorations in Lyon's Part Dieu commercial centre
Christmas decorations in Lyon‘s Part Dieu commercial centre
Decorations illuminate a square in a French town.
Decorations illuminate a square in a French town.
A street lamp with an illuminated Bonnes Fêtes decoration
A street lamp with an illuminated Bonnes Fêtes decoration

The post Christmas at Home appeared first on Graham Miln.

VoIP with Asterisk on Synology via Docker

Having successfully banished our need for a physical phone from upstairs, everything changed. My Raspberry Pi is being repurposed for a family member and I now have a Synology DiskStation.

Thus I needed to find a way to run Asterisk on my Network Array Storage (NAS) device. Asterisk provides Voice Over IP (VoIP) and it needs an always on computer to work. Previously my Raspberry Pi performed that role, now my DiskStation must take its place.

I knew that Docker would be part of the eventual solution but I was surprised by how long it has taken to find workable images and settings.

What follows are my notes for getting this working.

Docker Image and Synology Settings

Synology provide a Docker package through the Package Center. Using this edition of Docker, I settled upon the following image by Andrius Kairiukstis:

The alpine-asterisk Docker image.
The alpine-asterisk Docker image.

Launch this image with the following settings:

  • Advanced Settings > Enable auto-restart
  • Advanced Settings > Network > Use the same network as Docker Host

The setting Use the same network as Docker Host is important. This allows Asterisk to open ports and communicate without restriction. Ideally it would not be required but Synology’s Docker web interface is limited. The required port range options are not yet exposed.

Host network setting in Launch settings.
Host network setting in Launch settings.

By applying Use the same network as Docker Host there is no need to specify port mapping or exposing ranges. The container is free to open ports and chatter away. This does go against the contained nature of Docker but for this situation it bypasses many problems.

Alpine Linux and Asterisk

Next set up Asterisk. Create a terminal session to the running Docker container. Do this by Secure Shell (ssh) into the Synology and connect to the Asterisk container using:

sudo docker exec -it asterisk-alpine sh

The container is named asterisk-alpine in this example and sh is the command to execute.

Issue these commands to add any desired extras to Asterisk:

apk update
apk search -v 'asterisk*'
apk add asterisk-sounds-en

I did not immediately need any extra files but any use of the talking clock or answer machines will.

Repeat the configuration of the Raspberry Pi to set up lines and connect to the GrandStream HT-503 box.

Once set up, the asterisk-alpine container consumed 24 MB of RAM and less than 1% CPU, and requires 33 MB of storage.

The post VoIP with Asterisk on Synology via Docker appeared first on Graham Miln.