Playing Characters You Hate

When you play a role-playing game, you adopt the persona of someone other than you. In American RPGs, this often just means that you’re running a fictional version of yourself with a different race and a lot of swords, spells, or guns.

But what if the character you play is intentionally your anathema?

For example, what if you personally believe wholeheartedly in giving others second chances, but your character believes that if someone fails, they are irredeemably flawed?

For your next character, instead of reaching for your comfort zone, try out
something brand new. Imagine the group of people you most hate in the real world. Take the second worst after that, and build your character’s defining traits based on them.

This is not new advice. But here’s where it gets interesting:

Figure out why your character genuinely believes they have the best possible outlook. Play them that way. Their defining traits that you hate so much may change in subtle ways. Or they might not. Either way, you might gain an interesting insight into the “other side.”

Project Status, August 2018

Previously, I was spending most of my attention on the Uncharted Worlds projects that I’ve been working on. The random character generator and the “Character Creator” in particular were focuses. I was also spending time thinking about the next two projects in that vein, especially the star system generator.

However, that’s changed. With my renewed interest in Silver Gryphon Games and its wellbeing as a company, I’ve shifted my focus almost entirely from coding projects for other peoples’ games to writing and business projects for my own company.

This is probably too long in coming.

I’ve moved away from the “eh, Kevin will deal with it” mindset and towards a “if I don’t do it, it won’t happen” mindset. This is not to say I don’t delegate some things (my fiancée Sarah is a wonderful editor). However, the health of the company is in jeopardy unless I step in and take the helm.

Here are some specific actions I’ve taken or plan on taking to bring SGG back on track:

  • Get atomic units of work onto our Trello kanban board
  • Reignite efforts to have frequent, meaningful updates on our blog
  • Review DriveThruRPG sales figures to plan marketing promotions and product schedules
  • Get all of our files into one central place so everyone in the company has access to them
  • Review the legal documents for the company to refresh my memory of the structure and obligations
  • Review the company’s financials to see if a cash injection is needed
  • Plan out product schedules for the next 18 months
  • Look at better, less generic WordPress themes for the SGG website

The above is not an exhaustive list, but it’s a start.

My Politics, 2018 Edition

I’ve been looking at what’s coming up on the ballot for this midterm election. I decided it might be interesting to blog about where I’m at right now with my political views, since they’re always in flux.

Before I get to my positions, indulge me in a few considerations.

First, I have been called a liberal, a conservative, a progressive, a fascist, and a socialist. None of these is true, but all of them have a grain of truth.

Second, I’m an American by birth, but have spent a few years living abroad. Specifically, four years in New Zealand. This colors my views a bit.

Third, I’m contemptuous of the prevailing American culture of Left versus Right, liberal versus conservative. It’s overly reductive and harmful to a broader dialogue about our society. If you don’t think enough about your own identity to consider this, then you need to start.

Fourth, while I apply labels just as much as the next person, I try to remain cognisant of this fact and avoid dismissing “outsider” views out of hand.

Alright, with those things out of the way, let me get into the meat of it.

The List

  • Freedom from involuntary harm is the most sacred right we have. Exceptions must be very carefully considered.
  • Freedom of expression is the second most sacred right we have. Exceptions must be very carefully considered.
  • Charity is not a substitute for social welfare. Charity is based on arbitrary desires, but social welfare is based only on economic means.
  • Religion should never influence public policy. Public policy should not interfere with religion, except where religion interferes with the physical, mental, or emotional well-being of people.
  • The military is an unfortunate necessity and not something to idolize. Military service is akin to moral slavery.
  • Recreational usage of drugs should not be a crime. However, recreational drugs should be regulated just as strictly as alcohol.
  • No one has a right to wealth or power.
  • Sex and gender are two different things. One is biological, and the other is societal. We have the technology to change one. We should have the maturity to let people change or reinterpret the other.
  • There are limits even to freedom. Nothing is inviolate.
  • Cultures other than your own are different, but not automatically wrong.
  • As we age, the more set our beliefs become. Political leadership should come from experience, but not too much experience.
  • No group is uniform. Judging an entire group by the actions of even a simple majority of its members is dangerous at best.
  • No race is inherently better than another.
  • No sex is inherently better than another.
  • Empirical evaluation is far superior to logical evaluation.
  • If you’re not questioning your core beliefs occasionally and sincerely, you are not growing as a person.
  • Consenting adults can do whatever the **** they want in private.
  • Business interests by definition must have a narrow scope of interest. They cannot be allowed to set policy for any larger society.
  • Experts in a particular field are always the best people to suggest policy for a given thing. Their advice should not be ignored.
  • The field of politics requires expertise in management of large groups of people. Experience in this regard should not be discarded out of hand.
  • Business should not be dictated solely by politics.
  • Equality at birth is a nice ideal, but a false reality. Social circumstances always skew the scale.
  • Do unto others as you would have done to you.
  • Thoughtful investigation that is broadly distributed should not be considered wholly false because it contradicts the opinions of people in authority.
  • Sometimes, it’s necessary to discard something and start from scratch with a new perspective.
  • Money can’t buy happiness, but it can buy freedom, which can help build happiness up to a point.
  • You are ultimately responsible for your own actions.
  • Rewarding desired behavior is almost always preferable to punishing unwanted behavior.
  • Those who have lived among a higher diversity of people for a longer period of time are more likely to make leadership decisions that benefit a society.
  • Becoming fluent in more than one language is one of the most important things a person can do in terms of expanding their understanding of humanity.
  • There is no such thing as truth. There is only fact, interpretation of fact, and blatant disregard for the same.
  • Disregarding popular opinion is dangerous.
  • Corrective action is sometimes more important than equal treatment.
  • The ability to adapt quickly is superior to all other abilities.
  • No one has an unbiased, complete view of history. However, sovereign-mandated versions of history should be accorded more suspicion than those of independent people whose lives have been dedicated to the study of history.
  • The study of history is one of the most important aspects of ongoing education. People who stopped studying history after it was no longer a required course in school have stunted their ability to judge long-term consequences.
  • Music is both pointless and vitally important. I don’t know why yet.
  • Regulation of weapons in and of itself is of limited value, but it’s a conversation worth having often.
  • Putting one’s nation over the interests of all other nations is dangerously narrow-minded. Any leader that does this is suspect.
  • Cooperate with others when possible. Listen always. Stand up for yourself always, but don’t sacrifice the majority for your benefit.
  • You can be responsible for an area. You can respect the responsibility of others for an area. But if an area is not being used for the longterm benefit of humanity, you have the responsibility to speak up about it.
  • All things are decided by groups, not by individuals.

Heraldry Generation Pt. 3: Animal Charges and Windows Builds

Since the last entry, I’ve made several changes to both the program logic and its features.

The main change to the logic is in how charges are rendered. Instead of all of the SVG rendering code being in one file, now the more complex charges each have their own file. This was necessary, since the lines of text required for each complex charge (e.g., animals) is enormous. SVG files lay out pathways as a series of points, and with the large number of points involved in these shapes, the line count gets huge.

The main feature update is that now I’ve added a handful of animal charges. I got the first four (dragon passant, fox passant, gryphon passant, and eagle displayed) from an open source repository by Victor Westmann. The fifth, the lion rampant, is from a vector stock set that I purchased from VectorStock and converted to SVG myself. This last one was an experiment to see if I could do translations myself. Future images will likely come from public domain images, since I don’t fully trust the wording of the license VectorStock granted me.

Here are some examples of the new charges:

Per bend sable and vert, a fox passant Or
Per bend sinister purpure and sable, a eagle displayed argent
Per bend sinister argent and Or, a gryphon passant azure
Per pale purpure and vert, a dragon passant argent
Per bend sinister gules and sable, a lion rampant Or

Finally, the last update is that I’m now building macOS and Windows executables for the heraldry generator. You can find them here:

Heraldry Releases

The Nature of DevOps

The topic of what “DevOps” is has been a source of contention since the term first arose. This post is my take on what it means, based on about five years of experience in the field at this point.

DevOps, literally speaking, is development operations. In the broadest of terms, it means “operations in support of development.” This is in contrast to the popular technical meaning of DevOps, which is “a culture of breaking down silos, especially between development and operations.”

Recruiters would have you believe that DevOps is a kind of glorified system administrator who also can write application code. This is both true and false. True, in the sense that “DevOps engineers” have both an understanding of how to write application code and also their relationship to the systems they run in. False, in the sense that the code that DevOps folk write is not exactly application code, but rather system logic geared towards a few key concepts that have more to do with systems than with isolated programs.

It would be more accurate to say that modern DevOps engineers are an evolution of systems engineers. Even that, though, is doing both professional disciplines an injustice.

As I see it, you are a “DevOps engineer” if your focus is on improving the developer experience of creating software and having that software operate predictably at scale. Automating manual processes, drawing attention to performance gain opportunities, and securing systems against malicious actors are all core practices of this discipline.

If I were to describe the various related disciplines, I would do it like this:

  • System Administrator: Infrastructure architect and maintainer. Ensures consistency of systems.
  • Automation Engineer: Infrastructure streamliner. Automates frequently reproducible manual processes.
  • Site Reliability Engineer: Application availability maintainer. Ensures availability of applications.
  • DevOps Engineer: Developer user experience designer, application availability maintainer, and infrastructure architect. Does the job of system administrators, automation engineers, and site reliability engineers.

To put it another way: DevOps engineers are either high-demand generalists with a lot of experience, or miscategorized practitioners of one of the other three roles. There is some crossover between all four regardless, but the focus differs.

Heraldry Generation Pt. 2: Go, Divisions, and Charges

This iteration had some dramatic changes. Specifically, I rewrote the entire program in Go. That part actually didn’t take as much time as I’d thought. The resulting program is a bit messy, though, and I’ll talk about that in a minute. First, let me tell you about the heraldry changes.

After having just the fess and pale divisions in the last iteration, I added the remainder of the basic ones: bend, bend sinister, saltire, quarterly, and chevron.

I also added the most basic of charges – those geometric shapes called “ordinaries.” Not all of the common ordinaries are in there yet, and some of them look a little askew. Since I manually created them through trial and error rather than through calculation, there are a number of problems that I’ll need to sort out.

For example, here’re a couple charges from the current iteration. Notice how they’re a little off?

This saltire’s a little askew
This pall is definitely not right

The other issue is that many of the designs that pop out of the generator don’t look very visually appealing. A possible future iteration will be to add some kind of logic to fix that.

With all of that said, it produces some pretty decent results. Here are some of them:

This chevron is energetic
A bordure to approve of
The contrast here is interesting

OK, so now, let’s talk about Go.

I had always intended to rewrite the program in Go; I was using PHP as a rapid prototyping language. However, I hit a wall not too far into development. The SVG library I was using ended up not supporting a number of features of SVG that I needed. I was able to work around it by stripping out that library and dealing with the raw XML of SVG, but this was somewhat cumbersome.

Then I discovered the excellent SVG Go package called, appropriately enough, SVGo. It had several of the things I needed. So, I just pulled the trigger and spent a morning rewriting the entire codebase.

The result is a much faster program that’s easy to write code for.

It’s not without its problems, though.

All of the code is in one giant file. Visualization definitions are inline and contained in large switch or if blocks. There are no unit tests (which has bit me a couple times already).

Now that I’m going to be adding more complex charges (like animals), I can’t keep putting all of that in the same file. That’s something I hope to address in the next iteration.

Heraldry Generation Pt. 1: Basics

Awhile back I noted that I was beginning to work on a random fantasy setting generation project. This is the first piece of that.

It represents part of the design philosophy of the setting generator: each piece does one thing, it does it well, and it does it in a way that can be shared amongst the ecosystem.

The heraldry generator starts out life, then, with this guiding principle: output an image in a common format that can be programmatically modified, along with the necessary metadata to describe what’s in the image for both humans and machines.

For the image format, I chose SVG. It’s basically just XML, which makes it easy to modify, and it’s relatively small. Also, it’s a vector format, which makes it trivial to scale without degradation.

For rapidity of development, I chose to code the generator in PHP. I may rewrite it in a more performant language later if necessary. For now though, this serves my purposes.

Initially, I used a pre-existing library that handles SVG. However, after I got the initial plain-field version working, I discovered that the library doesn’t support <mask> elements yet, which meant I wouldn’t be able to easily generate field divisions and clip them.

The second iteration, then, stripped out that library and went straight for raw XML manipulation. This ended up working much better for several other things, including arbitrary attribute manipulation.

Heraldry adheres to certain rules. Coats of arms are basically like modern-day road signs; they exist to communicate clearly at a distance. So here are the rules I’m assuming for the generator:

  1. If a charge is a metal, its field may not be primarily a metal, and likewise with colors.
  2. Only fields and charges common to Continental heraldry in the era between the 10th and 16th centuries will be considered.
  3. Tinctures will include colors, metals, and furs common for the era. English “stains” like sanguine will not be included.

I may modify this list later, but it’s my guiding set right now.

At the moment, the generator only creates coats of arms with basic fields. It’s either a single color, or includes per fess or per pale divisions, also in colors. Metals are being reserved for charges at the moment, which are not included yet.

Here’s a simple example of a plain field:

Basic Field

The tincture generation is being done at a higher level so that the program is aware of which tinctures are used in the entire design. This is so it can avoid violating the first rule.

However, sometimes the divisions are generated in the same color (e.g., azure next to azure). I’ll need to fix this in the next iteration.

The below image may look identical to the first one, but it’s actually divided, just with both halves being vert.

Duplicate Colors in a Division

Still, the basic design looks reasonable thus far. Here’s a simple per fess example:

Basic Division

The source code for the generator is available on GitHub.