Jon Thysell

Father. Engineer. Retro games. Ukuleles. Nerd.

Introducing the HawKeys utility

Last year I started learning Hawaiian in an effort to improve my understanding of the music that I love. I found that I wasn’t satisfied with the available tools for typing the ʻokina and kahakōs used in the Hawaiian language.

At first I wrote a little AutoHotKey script to make it easier, and it works, but AutoHotKey is kind of a heavy tool for so simple a use case.

This year I set about writing a simple Windows app that gave the same result: global hotkeys to quickly type ʻokinas and kahakōs. It mean learning some old-school Windows coding around creating hot keys and simulating the keyboard, but the result is a simple .NET 2.0 WinForms app called HawKeys. It works great, and even better, HawKeys is my first app published on the Microsoft Store!

So if you’re on Windows 10, get HawKeys on the Microsoft Store. Otherwise. if you’re on Windows XP SP3 or greater, go to Latest HawKeys Release, download the zip file and run HawKeys.exe.

You can follow the development at HawKeys on GitHub.

Enjoy!

/jon

State of Mzinga, November 2018

Mzinga is my open-source AI for the board game, Hive, and I last posted about it back in February 2018.

So what’s changed in the last nine months?

From an end user standpoint, the high-level highlights are:

  • The official expansion pieces (Mosquito, Ladybug, Pillbug) are now fully supported
  • Lots of Viewer updates, including:
    • Graphical bug pieces, rather than just the text names
    • Sound effects
    • Progress bars while the AI is thinking
    • Improved layout to maximize the playing area
    • Ability to “lift” pieces that are stacked to see underneath them
    • “BoardSpace” notation (the defacto way to record Hive games)
  • The Viewer now includes an “Internal” implementation of the Mzinga Engine, in case no engine executable is available
  • Engines can now expose their options to be set by the Viewer
  • There is now a “portable” release, ie. a simple zip file for users who can’t/won’t install
  • The “updater” now only checks for updates but doesn’t offer to download and install them (security issue)

From an engine / AI standpoint, the highlights are:

  • Switched to a Principal Variation Search, ie., assume that the best move from a previous, shallow search, is the best place to when starting a deeper search
  • Pre-sort moves to try moves with the most potential to upset the game first (ie moves that affect how surrounded the queens are)
  • Switched to tapered evaluation, ie. how you should play near the start of the game can be different than how you should play near the end of the game, so evaluate the board with different metric weights as the game progresses
  • Different metrics for different game types: one general set of metric weights for all game types (all the combinations of with/without expansions pieces) just isn’t effective, so the AI now has different specialized metric weights for each game type
  • Better usage of multi-threaded searches
  • Various perf improvements

I think the biggest upgrades for users are the inclusion of the expansion pieces, the much friendlier Viewer, and the fact that it’s now portable. Technically all you need to play Hive is the single Mzinga.Viewer.exe from the portable release. You can throw it on a flash drive and play Hive on any Windows (Vista or higher) computer.

On the research front, the biggest discovery for me was of the TreeStrap self-training algorithm. I won’t go into details here, (I talk about it a little in this BoardGameGeek post), but suffice it to say that it provided a more targeted way to improve Mzinga’s AI. Rather than rely solely on my evolution-based model (which, due to the limitations of my population sizes and my “rough” implementation of genetics, produced an often homogeneous pool of AIs) TreeStrap let me force an individual AI to self-train by playing games against itself and intelligently updating its own metric weights.

It was through using TreeStrap that I created a decent AI for playing games with both the Mosquito and Ladybug expansion pieces. However, it was only in testing that AI against my existing pool of evolved AIs that I learned that it only excelled in that game type. In fact that AI did horribly in other game types, which lead me to believe that it might not be possible to create one set of weights that works in all game types. This propelled me to finally expand Mzinga to support specialized weights for each game type.

But now I have a pretty robust “pipeline” for improving Mzinga’s AI. First, I have eight special AIs, each self-training against for one particular game type. Then I push those AIs into my pool of other AIs and have them all fight each other (no more evolution, just the fighting) to evaluate their strength. Then I take the top AIs for each game type (usually, but not always, the self-trained AIs) and inject their weights into Mzinga’s Engine.

In theory, if I keep repeating that loop then Mzinga’s AI should get stronger and stronger. Also I can keep “snapshot” the AI every time I release a new version and keep it in the AI pool, so I can track that the newer AIs are objectively stronger than the older ones.

As this self-improvement loop is already starting to pan out, I’ve begun spreading the load across multiple computers. I can now have one set of computers that continuously run the self-training algorithm on the special AIs and push the results to OneDrive, while another computer regularly grabs those AIs and tests them in combat.

/jon

 

September in the Rain on Ukulele

While at the Port Townsend Ukulele Festival last weekend, I took a wonderful class by Danielle Ate The Sandwich on tips for recording for YouTube.

All of her advice was good and straight-forward and just what I needed. The process I’d developed for recording myself was certainly quite an affair and at sometimes a slog that would leave me exhausted and frustrated at the end. Seeing how easy it was to make decent video with even just a phone inspired me to find an open spot on the Fort Worden campus and make a video.

It’s the first piece I ever learned, over a decade ago. I’m pretty pleased with the result, and I look forward to making some more impromptu videos.

/jon

For those who’ve asked for it, here’s the tab: September in the Rain (Ukulele Tab). It’s not my arrangement – it’s based on the intro to the full song that I played in a group a long time ago that I reconstructed from memory.

RetroLove v1.0.0 now available on Windows and Android!

Last year I was in the mood to write a game, and in exploring the LÖVE game framework, I wrote a few old-school retro games under a project I named RetroLove.

Recently I picked up the project again and consolidated the three games I’d written (Pong, Breakout, and Asteroids), into a single game with a selection menu. I also started exploring how to release the game, even going so far as to figuring out how to get the Android port of LÖVE building on Windows.

Today I’m announcing the v1.0.0 release of RetroLove for both Windows and Android.

Both the Windows zip release and the side-loadable Android apk can be downloaded from RetroLove Releases on GitHub.

Additionally, you can get RetroLove for Android on Google Play. This marks the first time I’ve released an app on a mobile platform!

Check it out and tell me what you think,

/jon

P.S. While RetroLove itself is not the most mind-blowing game, the exercise has gotten me both my first mobile app (only 8 years in the making!) and gotten me well set up to building and releasing more games with LÖVE.

Introducing the RomSort utility

 

About a year ago I wrote a little command-line tool for sorting ROM files into alphabetical sub-directories. The main feature was it could intelligently combine the smaller sub-directories, which is useful when you’re browsing on low-resolution screens. However after I got the code working I never got around to sharing it.

So I took some time to re-package the code into a small .NET 2.0 WinForms app. It is pretty straightforward to use, and even gives you a live preview of what the end result will be before you use it. Note that filename collisions will be marked in red and it won’t let you perform the sort if there are any.

Source and binaries (under releases) @ RomSort on GitHub.

Enjoy!

/jon