Terraria 1.4

The final patch for Terraria, 1.4, came out last month. Thought I’d record my progress after a couple of weeks.

I’ve just playing on classic this time round. Think Empress and the Frost moon event is all that’s left.

Turns out I still cannot build anything that looks good.

But at least I’ve explored a bit on this large world

Posted on

More ADS-B Random Stuff

Made some changes in the last couple of days. I setup a new antenna outside and switched to different software running on a Pi that automatically feeds ADS-B Exchange). Was really painless using their Pi image, just flashing a SD card and editing some text files.

The only problem I had was related to my router/internet connections constantly making requests from different IPs. But that was a simple fix on my router (once I understood the problem anyway).

I cannot directly compare stats with my old setup, but I have received around 2,000,000 messages in the last 24 hours and furthest contact was 360Km which is quite the improvement.

I’m still not 100% happy with the results, I would love to see more activity near Tullamarine and Avalon. I don’t think there is anything in the way, so it might just be a case of needing a bigger mast.

24hr Map

Some stats

If any of this is interesting, it’s really easy to get into. There are a variety of cheap dongles, windows/linux software, and pre-setup Pi distributions. There’s also plenty of information about building your antennas like this and this

Posted on

Mucking around ADS-B

Been playing around with SDR using a RTLSDR dongle, and right now I’m receiving ADS-B from nearby aircraft.

Was shockingly easy to setup using ModeSDeco2 which even provides a local web interface (you would normally feed a site like ADS-B Exchange that combines the results from thousands of receivers around the world).

I’m using a simple dipole antenna stuck to a window with poor LOS to the sky (amazing planning), but I’d like to setup something a little better in the future and maybe feed too. So I thought I’d save some images of my current results to compare with later.


Breakdown of contacts by distance

Coverage pattern

Summary over 24 hours

(Blue are messages, red are positions. It’s very quiet now as you’d expect)

Posted on

3D Printed Stencil

In an attempt to keep my rubbish bin from being (accidentally) taken by my neighbors, I tried to make a 3D printed stencil to make my unit number a little more obvious.

The first version was just a simple stencil. This probably worked the best, but required you to be careful of over-spray.

Then I tried to be clever and make a two tone number and add a shield to make it easier to apply. The idea was you did the background using the new stencil, and then drop in the original stencil and do the foreground. This actually fixed the problem of over-spray nicely. But the result didn’t look very good.

The main problem is that you aren’t going to get crisp lines as the 3D print is never going to be flush with the surface (enough that spray paint wont get under). I suspect the best way going forward would be to cut it out by hand on vinyl (Or make a vinyl cutter holder for my printer).

Overall, at least it’s pretty obvious which bin in mine now :-)

(Note: No STL as it barely works and I’m not happy with it).

Posted on

Quick Tar Backup

I can never remember tar command line arguments to do a simple backup of the filesystem, so this time I’ll write it down.

mkdir -p /backups
cd /backups
tar -zcvpf /backups/img.tar.gz --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups .
python -m SimpleHTTPServer

# wget http://$SERVER_IP:8000/img.tar.gz

Stolen from: https://old.reddit.com/r/webhosting/comments/475a9b/is_there_a_way_to_download_digital_ocean_server/

Posted on

Intel NUC Spreadsheet

Trying to get my head around all the different NUCs and their performance/price.

Price was taken from Amazon (in USD) and performance from PassMark. Neither are very accurate, but should be adequate for an overview.

GenNameModelProcessorSingle/Multi PassMarkTDPPrice USDPrice / PerformanceNotes
1Sandy BridgeDCCP847DYE Celeron 847 17
2Ivy BridgeDC3217IYE Core i3-3217U17
2Ivy BridgeDC3217BY Core i3-3217U 17
2Ivy BridgeDC53427HYE Core i5-3427U 17
3Bay Trail-MDN2820FYKH Celeron N2820 7.5
3Bay Trail-MDN2820FYKH Celeron N2830 7.5
3Bay Trail-IDE3815TYKHE Atom E38155
4HaswellD34010WYKCore i3-4010U9292,44115
4HaswellD34010WYKH Core i3-4010U9292,44115
4HaswellD54250WYKCore i5-4250U 1,4133,37615$3504.09.6
4HaswellD54250WYKHCore i5-4250U 1,4133,37615$5002.86.8
5Broadwell-UNUC5i7RYH i7-5557U 1,8934,95228
5Broadwell-UNUC5i5RYH i5-5250U 1,4243,58815$4403.28.2
5Broadwell-UNUC5i5RYK i5-5250U 1,4243,58815
5Broadwell-UNUC5i3RYH i3-5010U 1,1613,05715$2354.913.0
5Broadwell-UNUC5i3RYK i3-5010U 1,1613,05715
5Broadwell-UNUC5i3MYHE i3-5010U 1,1613,05715
5Broadwell-UNUC5i5MYHE i5-5300U vPro 1,5313,83815$2895.313.3
5BraswellNUC5CPYHCeleron N30504698796$1413.36.2
5BraswellNUC5PPYHPentium N37005481,8366$1902.99.7
5BraswellNUC5PGYHPentium N37005481,8366
6Skylake-UNUC6i3SYKCore i3-6100U1,3023,60715$3803.49.5
6Skylake-UNUC6i3SYHCore i3-6100U1,3023,60715$3803.49.5
6Skylake-UNUC6i5SYKCore i5-6260U1,5924,36015$3904.111.2
6Skylake-UNUC6i5SYHCore i5-6260U1,5924,36015$3504.512.5
6Skylake-UNUC6i7KYKCore i7-6770HQ1,9089,71945$6103.115.9
6Apollo LakeNUC6CAYHCeleron J34557712,11210$2702.97.8
6Apollo LakeNUC6CAYSCeleron J34557712,11210
7Kaby Lake-U (Baby Canyon)NUC7i7BNHi7-7567U2,2616,46428$4954.613.1
7Kaby Lake-U (Baby Canyon)NUC7i7BNHX1i7-7567U2,2616,46428$5803.911.116GB Optane
7Kaby Lake-U (Baby Canyon)NUC7i5BNHi5-7260U1,9395,63815$4204.613.4
7Kaby Lake-U (Baby Canyon)NUC7i5BNHX1i5-7260U1,9395,63815$4804.011.716GB Optane
7Kaby Lake-U (Baby Canyon)NUC7i5BNKi5-7260U1,9395,63815$4304.513.1Short
7Kaby Lake-U (Baby Canyon)NUC7i3BNHi3-7100U1,3593,76615$3404.011.1
7Kaby Lake-U (Baby Canyon)NUC7i3BNHX1i3-7100U1,3593,76615$5002.77.516GB Optane
7Kaby Lake-U (Baby Canyon)NUC7i3BNKi3-7100U1,3593,76615$3503.910.8
7Kaby Lake-U (Dawson Canyon)NUC7i5DNHEi5-7300U1,9575,16115$5003.910.3
7Kaby Lake-U (Dawson Canyon)NUC7i5DNKEi5-7300U1,9575,16115$5003.910.3Short
7Kaby Lake-U (Dawson Canyon)NUC7i3DNHEi3-7100U1,3593,76615$3503.910.8
7Kaby Lake-U (Dawson Canyon)NUC7i3DNKEi3-7100U1,3593,76615$3503.910.8Short
7Kaby Lake-R (Dawson Canyon)NUC7i7DNHEi7-8650U2,2248,70615$6703.313.0
7Kaby Lake-R (Dawson Canyon)NUC7i7DNKEi7-8650U2,2248,70615
7Gemini LakeNUC7PJYHPentium J50051,1932,90110$2155.513.5
7Gemini LakeNUC7CJYHCeleron J40051,1501,54410$1457.910.6
8Kaby Lake-GNUC8i7HNKCore i7‑8705G2,2199,92865$8802.511.3
8Kaby Lake-GNUC8i7HVKCore i7‑8809G2,33510,996100$1,0502.210.5
8Coffee Lake-UNUC8i7BEHi7-8559U2,56812,22428$5604.621.8
8Coffee Lake-UNUC8i5BEHi5-8259U2,22010,99428$5504.020.0
8Coffee Lake-UNUC8i5BEKi5-8259U2,22010,99428$5793.819.0
8Coffee Lake-UNUC8i3BEHi3-8109U2,1486,15428$3027.120.4
8Coffee Lake-UNUC8i3BEKi3-8109U2,1486,15428$3446.217.9
8Cannon Lake-UNUC8i3CYSMi3-8121U1,6544,80215$6002.88.08GB + 1TB
8Cannon Lake-UNUC8i3CYSNi3-8121U1,6544,80215$5503.08.7
8Whiskey Lake-UNUC8i7INHi7-8565U2,3448,92115
8Whiskey Lake-UNUC8i5INHi5-8265U2,1468,02515
8Apollo LakeNUC8CCHKRCeleron N33507631,1116

Posted on

Wallabag + CapRover in 5m

Wallabag “is a self hostable application for saving web pages”

CapRover “is an extremely easy to use app/database deployment & web server manager”

This is a quick and dirty setup for testing Wallabag (without full database or redis, or email, etc).

5m setup

  1. Setup new app with persistent data enabled in CapRover
  2. In App Configs add the environmental variable SYMFONY__ENV__DOMAIN_NAME and set it to the full URL of where you want Wallabag. e.g. https://wallabag.rover.example.com
  3. Add two persistent directories ofr /var/www/wallabag/data/ and /var/www/wallabag/web/assets/images/
  4. In the deployment tab scroll down to method 4 and enter: FROM wallabag/wallabag and deploy
  5. In 30s Wallabag should be available at https://wallabag.rover.example.com
  6. Default login is wallabag / wallabag so you probably want to go change that

Example App Configs


  • No CSS or images: Need to make sure SYMFONY__ENV__DOMAIN_NAME points to the full URL including protocol. e.g. https://wallabag.rover.example.com
  • 502 error: Log into to server and check Docket logs. e.g. `
    • docker service logs srv-captain--wallabag --follow or
    • docker service ps srv-captain--wallabag --no-trunc

Posted on

Download steam images

Little Python program to download your images from your Steam gallery.

For each file it just downloads the images by its id and attempts to include some meta data about the image in a separate json file. For example:

{"Id": 1474149818, "Game": "Crypt of the NecroDancer", "Desc": "Bat out of hell", "Url": "https://steamuserimages-a.akamaihd.net/ugc/974353539926239721/3591AA940A42F9217105C02EEA90190796893CED/"}

Code uses requests and has been tested with Python 3.7 on Windows.

import requests
import re
from pathlib import Path
import json
from typing import List

# Because I'm lazy and probably the only person to ever run this
STEAM_ID = 'Ardren'
DOWNLOAD_DIRECTORY = r'c:\Users\Matthewd\Dropbox\Screenshots-Steam'

def scan_gallery(username):
    file_ids = []
    page = 1

    while True:
        url = f"https://steamcommunity.com/id/{username}/screenshots/?p={page}&sort=newestfirst&browsefilter=myfiles&view=grid&privacy=14"
        r = requests.get(url)

        matches = list(re.finditer(r'<a href="https://steamcommunity\.com/sharedfiles/filedetails/\?id=(\d+)"', r.text))

        if len(matches) == 0:
            print(f"No more files found on page {page}")

        print(f"Found {len(matches)} images on page {page}")

        for match in matches:

        page += 1

    return file_ids

def download_file_ids(base_directory: Path, file_ids: List[int]):
    for file_id in file_ids:

        download_filename = base_directory / f"{file_id}.jpeg"
        metadata_filename = base_directory / f"{file_id}.json"

        if download_filename.exists():
            print(f"Already downloaded {download_filename}")

        url = f"https://steamcommunity.com/sharedfiles/filedetails/?id={file_id}"
        r = requests.get(url)

        match = re.search('<a href="(https://steamuserimages-a.akamaihd.net/ugc/[^/]+/[^/]+/)" target=', r.text)
        if match is None:
            print(f"Unable to find image_src for file_id {file_id}")

        create_metadata(metadata_filename, file_id, r.text)

        with download_filename.open('wb+') as f:
            r = requests.get(match.group(1))
            bytes_written = f.write(r.content)
            print(f"Downloaded {bytes_written} bytes to {download_filename}")

def create_metadata(metadata_filename: Path, file_id: int, html_detail_contents: str):
    game_name_match = re.search('<h3 class="ellipsis apphub_responsive_menu_title">([^<]+)</h3>', html_detail_contents)
    game_desc_match = re.search('<textarea class="descField" name="description" id="description" class="dynInput" maxlength="140">([^<]*)</textarea>', html_detail_contents)
    image_url_match = re.search('<a href="(https://steamuserimages-a.akamaihd.net/ugc/[^/]+/[^/]+/)" target="_blank">', html_detail_contents)

    data = {
        'Id': file_id,
        'Game': game_name_match.group(1),
        'Desc': game_desc_match.group(1),
        'Url': image_url_match.group(1)

    with metadata_filename.open('w+') as f:
        json.dump(data, f)

if __name__ == '__main__':
    download_file_ids(Path(DOWNLOAD_DIRECTORY), scan_gallery(STEAM_ID))

Posted on

Website update

Hey look, HTTPS and colors

Edit: and block-quotes, and tables, and responsive images, and page titles

Posted on

Website back up

Website back up today after long period of down time.

I think I would like to go back to recording things I do.

Even if they are small and useless, I think it would be heathy for me.

Posted on