Sunday 12 November 2023

Docker cheatsheet

Attach to a running container:
docker exec -i -t <container> /bin/bash

Run networking tools:
docker run -d praqma/network-multitool --name netshoot
docker exec -it netshoot /bin/bash

Thursday 9 November 2023

Git cheatsheet


Create a taggit tag -a 1.0.0 -m "First release"
Delete a remote taggit push --delete main 1.0.0


Remove all commit history and set the code as the only commit
git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

Thursday 2 November 2023

Durable Functions vs Bespoke Event Sourcing

 You can write an application that uses Event Sourcing using code like the asos-eventsourcing and SimpleEventStore.

However, you can take advantage of the built-in event sourcing capabilities of Durable Functions.

Wednesday 2 August 2023

Open TTD settings


Settings > Interface > General > Close window on right-click: on

Settings > Disasters/Accidents > Vehicle breakdowns: none

Settings > Localisation > Speed units: Imperial (mpg)

Settings > World Generation > Road vehicles: Drive on left

Settings > Limitations > Vehicles never expire: on

Settings > Environment > Authorities > Allow buying exclusive transport rights: off


BRTrains v2

British Town Names

Get an app to open this 'ms-gamingoverlay' link error

Whenever I loaded OpenTTD on a locked-down machine it raised the error 

"Get an app to open this 'ms-gamingoverlay' link"

This was because Windows had detected a game had been loaded and started to invoke XBox Game features - such as the Game Bar and the ability to record video. However the PC was locked down through policy and these features were unavailable. Clicking on the "Browse Microsoft Store" link wouldn't work because the Windows Store was removed by policy.

This article helped.

Creating the DWORD registry key


and setting the value to 0 fixed it.

Thursday 22 June 2023

Removing X-Frame-Options in ASP.NET MVC Core 7

I had an ASP.NET Core 7 App that used forms.

And I actually WANTED it to be used within an iFrame.

As soon as you add a form to a Web App, the server immediately starts returning X-Frame-Options: SameOrigin in all requests.

I tried a variety of means to remove this, including:


            app.Use(async (context, next) =>
                context.Response.Headers.Add("Bob", "Hello");
                await next.Invoke();


The Bob header was being added, but X-Frame-Options stubbonly remained.
In the end I found the solution was to use:

// Remove X-Frame-Options, allowing Framing
            builder.Services.AddAntiforgery(options =>
                options.SuppressXFrameOptionsHeader = true;

Saturday 17 June 2023

Transferring domains to Google

I decided to leave 123-reg after they chose to upgrade their email services and removed catch-all email forwarding. I found a slight issue when transferring Nominet (.uk) domains to Google. The transfer process requires Google to send a handshake email to the registrant's email address, requesting them to approve the transfer. However, if you don't have a gmail address registered, you don't seem to get an email. So it is important to set the registrant's contact email to a Gmail address first, before setting the IPS tag.

Saturday 25 February 2023

FreeBSD discretionary ACLs

 As well as the normal user,group,all file permissions, my FreeBSD server had additional ACLs that were preventing the NFS client from accessing files.

To solve this, use setfacl:

setfacl -bn *

Friday 24 February 2023

Docker bind mount assumes ownership of container user

I had a mosquitto image running in Docker, with a bind mount:

docker run -it --name mosquitto -p 1883:1883  -v /home/pi/mosquitto/mosquitto:/mosquitto/ -v ~/mosquitto/mosquitto/log:/mosquitto/log -v ~/mosquitto/mosquitto/data:/mosquitto/data  eclipse-mosquitto

Before I ran the container: I created the source folder and set the owner to pi:

sudo chown -R pi /home/pi/mosquitto/

Yielding the following permissions

drwxr-xr-x  5 pi 1883 4096 Feb 19 20:14 mosquitto

On running the container the folder changes permissions:

drwxr-xr-x  5 1883 1883 4096 Feb 19 20:14 mosquitto

Debugging the container:

docker exec -it mosquitto /bin/sh

and checking the users:

sudo nano /etc/passwd

It can be seen that UID 1883 is the mosquitto user:


Linux utilities

The strace program prints all the system calls made by a program.

strace ls -lhn $(which sleep) 2>&1 | grep passwd

What you are trying to see is whether ls command is trying to read the /etc/passwd file or not.

Networking tools:

Performance tools:


Sunday 5 February 2023

Fine Offset WH1080 Weather Station and a Raspberry Pi

To receive the weather readings from a WH1080 by radio, you can use a SDR USB with a Raspberry Pi 3/4, however it will not work with a Raspberry Pi as it is's power requirements are too high. The SDR USBs draw considerable current from the USB port as they are powering the amplifier.

The appeal of using a Pi Zero is it's low power usage - it is approximately 0.7W (120mA) compare to a Pi 4's 5.1W (1010mA).

So we need another radio receiver. The RFM01 and RFM12b are candidates, and this article describes using them with a Raspberry Pi.

My weather station transmits data on 868Mhz, using Frequency Shift Keying (FSK). This is where a digital '1' is transmitted at one frequency and the '0' at another.

Video: 433Mhz with the Pi

Code for controlling the RFM01 with SPI on the Pi.

Wednesday 11 January 2023

z80 ZX Spectrum assembler


Download tools

  • Visual Studio Code – Editor, with the following extensions:
    • Z80 Assembly 0.0.3 by Imanolea
    • DeZog 2.2.3 by Maziac (this is a renamed update to Z80 Debugger 0.9.1, also by Maziac)
  • ZEsarUX 10.1 – Emulator
  • sjasmplus 1.18,2 – Z80 compiler
A comparison of the debugger compatibilities are here.

Add launch.json to your workspace's .vscode folder:
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit:
    "version": "0.2.0",
    "configurations": [
            "type": "dezog",
            "request": "launch",
            "name": "Z80 Debugger",
            "remoteType": "zrcp",
            "zrcp": {
                "hostname": "localhost",
                "port": 10000,
                "skipInterrupt": false
//          "topOfStack": "Stack_Top",
            "rootFolder": "${fileDirname}",
            "sjasmplus": [
                  "path": "${fileDirname}/${fileBasenameNoExtension}.sld",
                  "useFiles": true,
                  "asm": "sjasmplus",
                  "mainFile": "${fileDirname}/${fileBasenameNoExtension}.z80"
            "disassemblerArgs": {
                "esxdosRst": true
            "load": "${fileDirname}/${fileBasenameNoExtension}.sna",
            "startAutomatically": false,
            "preLaunchTask": "sjasmplus"
Add tasks.json to the same folder:
    // See
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
            "label": "sjasmplus",
            "type": "shell",
            "command": "sjasmplus", 
            "args": [
            "group": {
                "kind": "build",
                "isDefault": true

Download zesarux for Windows (or it's Linux alternative - remember to include lib-spectrum). The source code is here.

Start zesarux 
Set up zesarux remote debugging

Select the .z80 file

Compile and Debug
Terminal > Run Task > sjasmplus
Run > Start Debugging

Wednesday 4 January 2023

FreeBSD find files commands

Recursively find files in folder

find .//. ! -name . -print | grep -c //

Count of directories

find . -type d | wc -l

Count of directories (depth 1)

find . -maxdepth 1 -type d | wc -l

Count of files (depth 1)

find . -maxdepth 1 -type f | wc -l

Delete files that are called Zone.Identifier

find . -name "*:Zone.Identifier" -type f -delete