Sunday 24 December 2023

FreeBSD commands

Find the date of modified files

find . -type f -exec stat -t "%Y-%m" -f "%Sm %N" {} \;

Saturday 23 December 2023

Setting the DHCP domain name on a Draytek router

To set the domain that all DHCP clients become connected to; read the article:

It is performed by issuing a command on the telnet interface:

sys domainname wan1 .local

Sunday 17 December 2023

Emulator Summary

Z80 Spectrum

Zesarux - a good Windows (and Linux) Z80 emulator with a wealth of command-line options. Good for testing Z80 Assembler.

Zero Emulator - a good Z80 Spectrum emulator, written in C#, that runs on Windows.


Qemu -  a good emulator that runs on Linux. Good for x86 assembly.

Friday 15 December 2023

The role of launch.json and tasks.json in VSCode

Launch.json describes the activity that takes place when the debugger is launched or the program is started.

It can rely upon a task defined in tasks.json - see "preLaunchTask".

You can reference variables defined in settings.json.

You can build up a dependency tree of tasks using "dependsOn".

If you want to launch an application such as an emulator as part of the debugger - and leave it running - then you define it as a background task. But it is necessary to set a problem watcher for it to work.

You will need to manually close the task in VSCode when you are done debugging.

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 and emulator tools


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
To launch zesarux automatically, see this article.

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

Or start it with the following command-line parameters:
"C:\Program Files\ZEsarUX_win-X\zesarux.exe" --disablefooter --zoomx 2 --zoomy 2 --disable-all-first-aid --quickexit --advancedmenus --enable-remoteprotocol --nosplash --nowelcomemessage

(the command-line parameters can be found here).

Select the .z80 file

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

Another way to do this is to start ZESarUX using build tasks in VSCode.

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