So, in building out Anaeax, I needed a way to express random quantities for game systems: weapon damage, level-up effects, so on and so forth. Code is one thing, but the game uses SheetParser to maintain tabular lists of weapons, monsters, and so on and so forth—I don’t exactly want to be defining this stuff in a C# file, no matter how easy Exor makes it (and it is pretty easy).
I play tabletop games. Dice make sense to me; I have an OK understanding of the sorts of distributions you can put together from them and they’re at least reasonably intuitive for most people. So my first inclination was to go write a dice parser, something that could turn 3d6+10 into a usable range. But why build when you can steal, etcetera etcetera, and I found an abandoned project on CodePlex (with tests, even!) that I could bend to fit my needs, PCL and MathNet compatibility among them. The resulting fork of DiceNotation is on GitHub and NuGet (with the MathNet integration in a separate package).
While this is going to be used in the game, it’s also going to be used for something else: doing statistical analysis for game balance in Excel. Which means I get to learn how to bridge Excel and C#. Which means I need a lot more liquor.
So in our adventures at Leaf, building out our new environment, Will and I ran into a persistent problem – EC2 doesn’t guarantee that an instance will ever be shut down gracefully. No guarantees for upstart scripts, /etc/init.d, whatever. This is particularly problematic for dealing with Chef, where an instance needs to be deleted from the Chef datastore when it goes away. If you don’t, knife search will happily return tens or hundreds of nodes that no longer exist. Which is great.
No, wait. It’s crap.
Enter asger. Since autoscaling groups can publish notifications to SNS, asger will watch an SQS queue subscribed to SNS and execute arbitrary tasks based on the up/down pattern. Created nodes invoke up functions, terminated nodes invoke down functions, life is good. Currently there’s a task for deregistering Chef nodes, but asger is pretty flexible–Route 53 subscriptions, tie-ins to systems like Consul, that sort of thing. You can get asger via RubyGems with gem install asger or on GitHub; use it in good health.
So, Terraform is a cool infrastructure-as-code system with a boatload of functionality. It makes building out entire clouds on AWS super easy and super fun. I am a fan. I started my new job as Lead Platform Engineer at Leaf this week, and I was really happy to have the chance to use Terraform in a greenfield project where I could play with it.
But I wasn’t happy with it, and so I’ve done a thing. read more
As with my other projects over the last couple weeks, I’ve been on a kick where I pull useful stuff out of old projects and polish them up for an open-source release. Exor is a (somewhat) polished iteration on Anaeax’s mod system. It couples an attribute-based type mapping add-in system with a neat wrapper around CSharpCodeCompiler that allows an add-in (like, say, for a game) to compile and dynamically load .cs files that can provide those types.
Originally I only planned for this project, my MonoGame-based content management gizmo and SheetParser, but Versioner ended up being a useful side effect–it didn’t really make a lot of sense to put all of the versioning and dependency resolution into Exor just to lock it away from other projects that could use it.
While on vacation at my folks’ in Maine, I’ve been plugging away on extracting more common patterns from various old projects. One common issue I regularly run into is the need for maintaining versions of stuff and a dependency graph. There are no easy libraries for this stuff as in Ruby, so I’ve repeatedly reimplemented solutions in multiple projects. Decided to clean up the best of them, write a solid test suite, and open-source it as Versioner.
The source is available on Github and a compiled PCL is available on NuGet.
So I spent a little time pulling useful code out of old projects and threw SheetParser up on Github and NuGet. SheetParser is my simple parsing/deserialization tool for ripping spreadsheets and building C# objects out of them. It’s a niche library, borne out of doing game development; I use this to avoid writing a bunch of really dumb tools and instead using Excel to do my dirty work.
Mostly tested, too, though coverage isn’t complete. MIT licensed – have at it.