
[{"content":"","date":"15 August 2024","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"First have a quick look at the in game manual. You can find this by going into a character screen, (e.g. go to the \u0026laquo; near the bottom right hand side of the screen, then Astroforce, then any character, and finally the manual icon at the bottom left). Next you will want to capture some territory. The higher the level the better; however, the higher the level the harder to capture so don\u0026rsquo;t set your sights too high to begin with. To capture better hexes you will need better ships.\nPick a good fleet combination. I find Ketzi and Camoul in a Dragoon work well. Flaherty is a good commander as well, and the Catalyst, Scythe, Griffen and Stormbringer seem to perform well. You will want to match your commanders with your appropriate ships. Once I choose a ship I remember which battle formations the ships supports; I go to commanders and sort by faction; then look for a commander (later pair of commanders) that all support the same battle formation. I also check if the commanders get friendship bonuses. For example, Ameline\u0026amp;Karin in a Scythe is a decent combo because they get a friendship bonus, giving them +10 Commander\u0026amp;Ship data rate. Remember to level up Karin\u0026rsquo;s \u0026ldquo;Talk the the Manager\u0026rdquo; skill :P. At this point avoid the Siege battle formation as it loses to every other formation (I am sure your Corp will tell you what it is good for later).\nOnce you have some fleets you will want to train them up. You can do this by conquering hexes and fighting pirates. This can be the best way because this gives you resources and rewards. However, it can be hard to use up all your stamina this way. Once you join a corp you can use (\u0026laquo; -\u0026gt; Corp -\u0026gt; ) Training Room. This will allow you to quickly turn ships and stamina into XP.\nOnce you have done some PVE, you may want to (or have to) deal with PVP. As a new player you will probably want to avoid a direct confrontation with enemy fleets. First don\u0026rsquo;t feed the enemy: if they capture your base they can use your hexes to jump past your factions defenses. So it may be wise to avoid moving your base too close to enemy territory. You can build outposts etc. to keep an eye on your enemies instead.\nEven as a newbie you can be useful in PVP. Check the influence of the enemy players, if their influence is similar or lower than yours they are probably a newbie too and you might have a chance of winning. However, usually you will find that their influence is much greater, and you will want to push for territory without directly engaging. It takes 15 stamina for them to issue an order to their death legions and still just 15 (or 8 if you still have starter bonus) for you to issue an order to your mousy newbie fleet. So, even if you see them moving to engage your fleet and you have to beat a retreat you are wearing out their commanders as quickly as they are wearing out yours. Not bad for a newbie.\nIn the long term you will want to build up Nova Credits, Inventory and Commander/Ship Cards. Pretty much everything else gets wiped after the end of the season. To get the juicy end of season rewards join a big corp that can capture many citadels.\n","date":"15 August 2024","externalUrl":null,"permalink":"/posts/2024-08-15-eve-galaxy-conquest-tips/","section":"Posts","summary":"","title":"EVE Galaxy Conquest Tips","type":"posts"},{"content":"","date":"15 August 2024","externalUrl":null,"permalink":"/tags/game/","section":"Tags","summary":"","title":"Game","type":"tags"},{"content":"","date":"15 August 2024","externalUrl":null,"permalink":"/categories/games/","section":"Categories","summary":"","title":"Games","type":"categories"},{"content":"","date":"15 August 2024","externalUrl":null,"permalink":"/tags/guide/","section":"Tags","summary":"","title":"Guide","type":"tags"},{"content":" About Me # Howdy there folks! This is my new home page, built with the modern Blowfish theme for Hugo. This should be more reliable than my old WordPress-based page.\nI am primarily involved with:\nAI Training Data - Creating high-quality datasets for machine learning Formal Mathematical Logic in Computer Science - Applying rigorous mathematical methods to software engineering Mathematical Studies of Voting - Researching fair and efficient voting systems Quick Links # Check out my old WP pages from 2022, 2023 and 2024 Visit my GitHub page for code and projects Play MatchGame if you get bored! Recent Work # This site is built using the Blowfish theme for Hugo, which provides a modern, responsive design with excellent typography and user experience.\nResearch Areas # AI Training Data # Creating high-quality, ethically sourced datasets for machine learning applications.\nFormal Logic # Applying rigorous mathematical methods to software engineering problems.\nVoting Theory # Researching fair and efficient voting systems using mathematical analysis.\nDark Mode Test # The dark mode should now be working properly! Try clicking the theme switcher in the top navigation to see the background effects change between light and dark modes.\nLight Mode: Subtle background with lighter overlays Dark Mode: Reduced opacity and darker overlays for better contrast The background effects now properly respect the theme switching and won\u0026rsquo;t interfere with the site\u0026rsquo;s dark mode functionality.\n","date":"15 August 2024","externalUrl":null,"permalink":"/","section":"John C. McCabe-Dansted","summary":"","title":"John C. McCabe-Dansted","type":"page"},{"content":"Welcome to my blog! Here I share insights, research updates, and thoughts on topics related to AI training data, formal mathematical logic, and voting theory.\n","date":"15 August 2024","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"15 August 2024","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"22 July 2024","externalUrl":null,"permalink":"/tags/compression/","section":"Tags","summary":"","title":"Compression","type":"tags"},{"content":"","date":"22 July 2024","externalUrl":null,"permalink":"/tags/howto/","section":"Tags","summary":"","title":"Howto","type":"tags"},{"content":"","date":"22 July 2024","externalUrl":null,"permalink":"/tags/jpg/","section":"Tags","summary":"","title":"Jpg","type":"tags"},{"content":"I was quite impressed with Mozillas new jpegtran in mozjpeg. It crushed a 2.2GB photo shoot down to 1.4GB, a bit smaller than the 1.5GB achieved by jpegoptim. So I thought I\u0026rsquo;d try to make it drop-dead simple to play with.\nMy Online Demo # [Note: The original post included an online demo form for uploading JPEG files. This would need to be recreated as a separate web application or removed for the static Hugo site]\nIf you wanted to losslessly recompress an entire directory you could do something like:\nmkdir -p crush; for F in *.jpg; do curl -F \u0026#34;file=@$F\u0026#34; https://us.dansted.org/cgi-bin/jpegtran.cgi \u0026gt; \u0026#34;crush/$F\u0026#34;; done on Linux/Mac, or on the Windows Command Prompt:\nMKDIR crush \u0026amp; FOR %F IN (*.jpg) DO ( CURL -F \u0026#34;file=@%F\u0026#34; \u0026#34;https://us.dansted.org/cgi-bin/jpegtran.cgi\u0026#34; \u0026gt; \u0026#34;crush\\%F\u0026#34; ) But you might want to install mozjpeg locally instead. I won\u0026rsquo;t try to do anything evil with your photos, but my server is not exactly secured with CrowdStrike :P.\nDownloads # 64bit Windows Binaries: These were created on Windows 11 using:\ngit clone https://github.com/Microsoft/vcpkg.git cd vcpkg bootstrap-vcpkg.bat vcpkg install mozjpeg REM Wait 1.5 minutes... and DONE! The rest of this article will focus on Linux. Windows users probably wouldn\u0026rsquo;t that excited until there is a GUI anyway. I was thinking of making one, but that is a whole new kettle of fish.\nCGI Wrapper and 64bit Linux Binaries: If you are going to grab random binaries off the web and run them, I suggest you at least use firejail. Something like:\nfirejail --quiet --net=none --blacklist=/boot --blacklist=/chroot --blacklist=/chroot24.04 --blacklist=/dev --blacklist=/etc --blacklist=/home --blacklist=/install --blacklist=/lost+found --blacklist=/media --blacklist=/mnt --blacklist=/opt --blacklist=/proc --blacklist=/root --blacklist=/run --blacklist=/sbin --blacklist=/snap --blacklist=/srv --blacklist=/sys --blacklist=/tmp --blacklist=/var jpegtran -progressive \u0026lt; in.jpg \u0026gt; out.jpg This should block everything except /bin, /lib, /lib64 and /usr, the only directories jpegtran needs. It would be nice if the –whitelist option of firejail worked, but hey. In general, you can test what directories an executable needs with a script such as testfirejail.sh.\nThe binaries were created on Oracle Linux 7.9 with:\nsudo yum install git cmake make nasm gcc wget https://download.sourceforge.net/libpng/libpng-1.6.43.tar.xz wget https://www.zlib.net/zlib-1.3.1.tar.gz git clone https://github.com/mozilla/mozjpeg.git tar -xf libpng-1.6.43.tar.xz tar -xf zlib-1.3.1.tar.gz ( cd zlib-1.3.1; ./configure; make -j4; sudo make install ) ( cd libpng-1.6.43; ./configure; make -j4; sudo make install ) ( cd mozjpeg ; cmake . ; make -j4 ; sudo make install) This can also be installed on Ubuntu 16.04 with:\nsudo apt install git cmake make nasm gcc wget https://download.sourceforge.net/libpng/libpng-1.6.43.tar.xz git clone https://github.com/mozilla/mozjpeg.git tar -xf libpng-1.6.43.tar.xz ( cd libpng-1.6.43; ./configure; make -j4; sudo make install ) ( cd mozjpeg ; cmake . ; make -j4 ; sudo make install) Note that with supported Ubuntu versions (i.e. 20.04 or newer) the included libpng is 1.6+ so the following will work:\nsudo apt install git cmake make nasm gcc libpng-dev git clone https://github.com/mozilla/mozjpeg.git ( cd mozjpeg ; cmake . ; make -j4 ; sudo make install) ","date":"22 July 2024","externalUrl":null,"permalink":"/posts/2024-07-22-mozillas-new-lossless-jpeg-compression/","section":"Posts","summary":"","title":"Mozilla's new lossless JPEG compression","type":"posts"},{"content":"","date":"22 July 2024","externalUrl":null,"permalink":"/tags/photo/","section":"Tags","summary":"","title":"Photo","type":"tags"},{"content":"","date":"22 July 2024","externalUrl":null,"permalink":"/categories/uncategorised/","section":"Categories","summary":"","title":"Uncategorised","type":"categories"},{"content":" Research Interests # I am a researcher focused on the intersection of computer science, mathematics, and social choice theory. My work spans several key areas:\nFormal Mathematical Logic in Computer Science # Applying rigorous mathematical methods to software engineering problems. This includes formal verification, type theory, and the mathematical foundations of programming languages.\nMathematical Studies of Voting # Researching fair and efficient voting systems using mathematical analysis. This includes studying voting paradoxes, designing new voting methods, and analyzing the mathematical properties of different electoral systems.\nBackground # This website serves as a central hub for my research, publications, and projects. It\u0026rsquo;s built using the modern Blowfish theme for Hugo, which provides excellent typography and user experience.\nContact # GitHub: gmatht Email: Contact me Old Content # You can still access my previous WordPress-based content:\n2022 Archive 2023 Archive 2024 Archive ","date":"1 January 2024","externalUrl":null,"permalink":"/about/","section":"John C. McCabe-Dansted","summary":"","title":"About John C. McCabe-Dansted","type":"page"},{"content":"","date":"1 January 2024","externalUrl":null,"permalink":"/categories/announcements/","section":"Categories","summary":"","title":"Announcements","type":"categories"},{"content":"","date":"1 January 2024","externalUrl":null,"permalink":"/tags/blowfish/","section":"Tags","summary":"","title":"Blowfish","type":"tags"},{"content":"","date":"1 January 2024","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"1 January 2024","externalUrl":null,"permalink":"/tags/website/","section":"Tags","summary":"","title":"Website","type":"tags"},{"content":" A Fresh Start # Welcome to the new and improved dansted.org! This site has been completely redesigned using the Blowfish theme for Hugo.\n","date":"1 January 2024","externalUrl":null,"permalink":"/posts/welcome-to-blowfish/","section":"Posts","summary":"","title":"Welcome to the New Site","type":"posts"},{"content":"","date":"2 December 2023","externalUrl":null,"permalink":"/tags/viking-rise/","section":"Tags","summary":"","title":"Viking Rise","type":"tags"},{"content":"There was a discussion in my tribe as to the effectiveness of Haulers in PvE. It was suggested that I not take Haulers on tribe rallies. I noted that Viking Rise seems to automatically pick higher level haulers over lower level combat troops for combat missions. I didn\u0026rsquo;t find this conclusive however, so I investigated further.\nDiscussions With Heros # I decided to discuss the effectiveness of porters with two Heros. First, Ivor because he is popular with the ladies… and men… and pretty much anyone who plays Viking Rise. Furthermore, as a polymath, he makes a good \u0026ldquo;average\u0026rdquo; hero. Secondly, Michaella who was noteworthy for her bold claim that she could make porters more effective in battle than actual combat troops. This was a claim I later made her put to the test.\nThese discussions are summarised in the following table in terms of the number of Troops each hero thinks they would need to have a chance of defeating level 10 Niflungs.\nHero Troop Type Level #Defeat #Tough Avg Troops Rel Strength Ivor Inf 5 1213 1249 1231 5.200649878 Ivor Inf 3 2051 2217 2134 3 Ivor Hauler 3 2065 2157 2111 3.032685931 Ivor Inf 2 3645 3658 3651.5 1.753252088 Ivor Hauler 1.5 4873 4957 4915 1.302543235 Michaela Hauler 2 3810 3693 3751.5 1.706517393 Michaela Axe Fighter 2 4057 4064 4060.5 1.576653122 Ivor\u0026rsquo;s Musings on Level 3 # [Note: This section contained multiple images showing game screenshots that would need to be preserved in the Hugo site\u0026rsquo;s static directory]\nIvor\u0026rsquo;s Musings on Level 2 # [Note: This section contained multiple images showing game screenshots that would need to be preserved in the Hugo site\u0026rsquo;s static directory]\nMichaela\u0026rsquo;s Musings # I found Michaela\u0026rsquo;s claims that they could make haulers better in combat than actual combat troops to be rather bold. I challenged her to prove her claims under the watchful eye of Tyr himself.\nMichaela Goes To War # Despite Michaela\u0026rsquo;s claims, haulers seemed to suffer more light injuries than combat troops when fighting level 10 Niflungs. They usually also suffered more heavy injuries.\n[Note: This section contained multiple images showing battle results that would need to be preserved in the Hugo site\u0026rsquo;s static directory]\nFinances and Logistics. # It is cheaper and faster to heal lower level troops. As they do not seem to be heavily injured more in easy fights, it may actually be better to send low level troops than high level troops. It seems that any number of level 1 troops can heal within 2 seconds.\n[Note: This section contained multiple images showing healing costs and times that would need to be preserved in the Hugo site\u0026rsquo;s static directory]\nConclusion # While combat troops seem to outperform haulers, even with a hauler hero, they outperform combat troops of a lower level. This is because higher level troops suffer less light injuries, allowing them to stay in battle longer. However higher level troops do not seem to suffer less heavy injuries. Since higher level troops are harder to heal, it may make sense to send lower level troops on easy missions where cost of healing the troops after is the only concern.\n","date":"2 December 2023","externalUrl":null,"permalink":"/posts/2023-12-02-viking-rise-hauler-and-troop-effectiveness/","section":"Posts","summary":"","title":"Viking Rise Hauler and Troop Effectiveness","type":"posts"},{"content":"When discussing client needs on Discord, you may want to set up a private channel for each client, so they can discuss their needs with staff without other clients snooping on them. Towards this end, I wrote a bot that adds a consultation room when anyone joins the server.\nconst { Client, Intents } = require(\u0026#34;discord.js\u0026#34;); const client = new Client({ intents: [\u0026#39;GUILD_PRESENCES\u0026#39;, \u0026#39;GUILD_MEMBERS\u0026#39;, \u0026#34;GUILDS\u0026#34;, \u0026#34;GUILD_MESSAGES\u0026#34;], partials: [\u0026#39;CHANNEL\u0026#39;, \u0026#39;MESSAGE\u0026#39;] }); var nStore = require(\u0026#39;nstore\u0026#39;); var lasttag=\u0026#34;\u0026#34;; const token = process.env.DISCORD_BOT_SECRET; client.on(\u0026#39;ready\u0026#39;, () =\u0026gt; { console.log(\u0026#34;I\u0026#39;m in\u0026#34;); console.log(client.user.username); }); function setPerm(room, member) { room.permissionOverwrites.edit(member, { VIEW_CHANNEL: true, SEND_MESSAGES: true, READ_MESSAGE_HISTORY: true, }); } client.on(\u0026#39;guildMemberAdd\u0026#39;, member =\u0026gt; { let tag=member.user.tag; console.log(\u0026#39;User @\u0026#39; + tag + \u0026#39; has joined the server!\u0026#39;); if ( tag === lasttag ) { //Stop discord spamming the same event twice. return; } lasttag=tag; let category = member.guild.channels.cache.find(c =\u0026gt; c.type === \u0026#34;GUILD_CATEGORY\u0026#34; \u0026amp;\u0026amp; c.name.toUpperCase().includes(\u0026#34;CONSULTATION ROOMS\u0026#34;)); let reception = member.guild.channels.cache.find(c =\u0026gt; c.name.toUpperCase() === \u0026#34;RECEPTION\u0026#34;); let shortname=tag.replace(/#.*/g, \u0026#39;\u0026#39;); let shortnamelc=shortname.toLowerCase(); tag = tag.replace(/#/g, \u0026#39;\u0026#39;).toLowerCase(); users.get(shortnamelc, function (err, doc, key) { try { let room = \u0026#34;\u0026#34;; if (err) { users.save(shortnamelc, tag, function (err) { if (err) { throw err; } // The save is finished and written to disk safely // Maybe should rewrite so the rest of the code goes in here. }); tag=shortnamelc; } else { if (tag===doc) { tag=shortnamelc; } room = member.guild.channels.cache.find(c =\u0026gt; c.name === tag); } if (room) { setPerm(room, member); room.send(`\u0026lt;@${member.id}\u0026gt;`+\u0026#34; Welcome Back!\u0026#34;); } else { member.guild.channels.create(tag, { type: \u0026#34;GUILD_TEXT\u0026#34;, parent: category, }).then(room =\u0026gt; { setPerm(room, member); room.send(`\u0026lt;@${member.id}\u0026gt;`+\u0026#34;Welcome to USIA! \\n\\nThis is your private channel where you can discuss your needs with our staff. They should be along shortly. While you wait, our bots can provide information! \\n\\nType the following commands into chat and press enter (! followed by a word). Choose whichever looks closest to what you are seeking. \\n\\n !process - The bot will explain how our service works, and the steps involved. \\n !skillboard - The bot will explain how to share your skillboard with us, a vital step in us raising any standings. \\n !broker - The bot will explain more about broker fees and reducing them. \\n !agents - The bot will explain about raising corporation standing, or unlocking agents (for example, Level 4 Security Missions for Caldari Navy) \\n !faction: - The bot will explain more about how you can, or how we can, raise your faction standings.\\n !jobs - If you are interested in working for USIA.\\n\\nIf none of these look helpful to you, please just @ Imiarr. They will respond as soon as they are available.\u0026#34;); reception.send(\u0026#34;Hi \u0026#34;+ shortname + \u0026#34;. I have created a private Consultation Room for you.\u0026#34;); }); } } catch(error) { console.log(\u0026#34;Could not create channel:\u0026#34; + error); reception.send(\u0026#34;I failed to create a consultation room for \u0026#34; + member.user.tag + \u0026#34;! Halp! Halp!\u0026#34;).catch(error =\u0026gt; { console.log(\u0026#34;Could not post to reception:\u0026#34; + error); }); } }); }); console.log(\u0026#34;Starting...\u0026#34;); var users = nStore.new(\u0026#39;users.db\u0026#39;, function () { client.login(token); }); Because the client now has a private room, you can get them chatting with another bot, like Dyno. You can try out this bot at https://discord.gg/vhCDd9kj. Here is the package.json file you will need.\n{ \u0026#34;name\u0026#34;: \u0026#34;nodejs\u0026#34;, \u0026#34;version\u0026#34;: \u0026#34;1.0.0\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;main\u0026#34;: \u0026#34;index.js\u0026#34;, \u0026#34;scripts\u0026#34;: { \u0026#34;test\u0026#34;: \u0026#34;echo \\\u0026#34;Error: no test specified\\\u0026#34; \u0026amp;\u0026amp; exit 1\u0026#34; }, \u0026#34;keywords\u0026#34;: [], \u0026#34;author\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;license\u0026#34;: \u0026#34;ISC\u0026#34;, \u0026#34;dependencies\u0026#34;: { \u0026#34;@types/node\u0026#34;: \u0026#34;^18.0.6\u0026#34;, \u0026#34;discord.js\u0026#34;: \u0026#34;^13.9\u0026#34;, \u0026#34;node-fetch\u0026#34;: \u0026#34;^3.2.6\u0026#34;, \u0026#34;nstore\u0026#34;: \u0026#34;^0.5.2\u0026#34; } } ","date":"28 August 2022","externalUrl":null,"permalink":"/posts/2022-08-28-discord-greeter-bot/","section":"Posts","summary":"","title":"Discord Greeter Bot","type":"posts"},{"content":"Facebook won\u0026rsquo;t let me link to this site. I am not sure what they think is so scary. I have noticed that the Facebook AI is very trigger-happy.\n","date":"29 July 2022","externalUrl":null,"permalink":"/posts/2022-07-29-facebook-woes/","section":"Posts","summary":"","title":"Facebook Woes","type":"posts"},{"content":"I am treasurer of GenghisCon again. This non-profit convention is designed to be affordable, both in the sense of low ticket prices, and the activities are mostly free (buying stuff from one of the traders tables costs money, but that isn\u0026rsquo;t the focus of the convention).\nWe are pleased to announce that GenghisCon 2023 will be held on 20-22 January 2023 at Telethon Speech and Hearing in Wembley. This venue is picturesque, looking out upon Lake Monger Reserve. Doors will open at 5pm on Friday 20th January (or as early as 3pm if we have minions to help set up), and we\u0026rsquo;ll be running up until 10pm on Sunday 22nd January.\nTickets are now available at https://genghiscon.org/\nAs our costs have risen a lot recently, our ticket prices will need to go up this year. However we still aim to be as affordable as possible, and will have Early Bird Tickets available at the same prices as last year, except for our supportive Guardian of Genghis Membership. Early Bird Tickets will be available up until 30 September 2022.\nFrom 1 October 2022, our prices will be:\nConcession Friday – $9, up from $5 Early Bird Standard Friday – $12, up from $10 Early Bird Concession Day – $18, up from $15 Early Bird Standard Day – $24, up from $20 Early Bird Concession Weekend – $30, up from $25 Early Bird Standard Weekend – $42, up from $35 Early Bird Guardian of Genghis – $60 If you don\u0026rsquo;t think you can attend the con in person, we\u0026rsquo;ve also introduced a $15 Supporting Membership which gives you access to any content we\u0026rsquo;re able to stream online. All membership types can be upgraded later as well so don\u0026rsquo;t delay. If you know someone who can\u0026rsquo;t afford to come this year, we also have our Fans Funding Fans program. Simply fill in this form to nominate them https://forms.gle/BV3C6dbuHMjRcE156\n","date":"23 July 2022","externalUrl":null,"permalink":"/posts/2022-07-23-announcing-genghiscon-2023-tickets-now-available/","section":"Posts","summary":"","title":"Announcing GenghisCon 2023 – Tickets Now Available!","type":"posts"},{"content":"As you may have noticed, I have installed Word Press. This was harder than I was expecting. Most software on Ubuntu can be installed with a quick apt install wordpress. However, this did not get word press running, and I had to run several pages of commands: How To Install WordPress with LAMP on Ubuntu 16.04 | DigitalOcean\nI think next time I would try this script: Useful-Scripts/wordpress.sh at master · sm0k3net/Useful-Scripts · GitHub\nEDIT: I have now switched to Hugo.\n","date":"16 July 2022","externalUrl":null,"permalink":"/posts/2022-07-16-installed-wordpress/","section":"Posts","summary":"","title":"Installed WordPress","type":"posts"},{"content":" Homepage # John C. McCabe-Dansted # Howdy there folks. This is my new home page. This should be more reliable than my old Word-Press based page.\nI am primarily involved with creating AI Training Data, Formal Mathematical Logic in Computer Science and Software Engineering and Mathematical Studies of Voting.\nThere isn\u0026rsquo;t much here yet, but you could check out my old WP pages from 2022, 2023 and 2024. My GitHub page may be of greater interest.\nIf you get bored you can choose your own images and play MatchGame\n","externalUrl":null,"permalink":"/main/","section":"John C. McCabe-Dansted","summary":"","title":"","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]