Pacing and development in DC comics

I recently picked up a copy of the first few volumes of Supergirl (2011) and Blackest Night. They’ve all got the same problem: they’re outrageously rushed.

The amount of dialogue and the number of scenes in two hundred pages of comic (which is about average for Supergirl) is roughly even with 1-2 hours of a television show. A volume is expected to comprise one story arc. It introduces new characters, creates a conflict, and then resolves the conflict.

In a television show, a season might comprise one story arc and several filler episodes. This lets you tell a more involved story. It lets you cover more plot and show characters in more depth. This is a good thing in general. If you don’t have that much space to tell more story, you can work with it — you introduce fewer characters, make the conflicts more immediate, and tell smaller stories. But you have to work with it.

In both Supergirl and Blackest Night, the authors didn’t. They made no concessions to the medium. It’s a problem. I think they were trying to map one issue to a television episode, roughly, but they only have time for three to four scenes per issue, while even a half hour television show can cover a lot more ground.

Take Supergirl. Kara Zor’El finds a human who can speak Kryptonian: Siobhan. Instant trust. They’ll risk their lives for each other immediately. On television, we’d see several scenes of them interacting and building a friendship first. Later, Kara finds a character named H’El, whom she trusts deeply and implicitly after exchanging a few words. In a television series, there would be at least a little interaction between them, giving time for that trust to build.

This is bad. It’s unrealistic and paints characters as hopelessly naive and idealistic. At best, readers will assume that the character building and essential interaction is happening in some other series featuring the same characters. Is it? I doubt it, and I’d have to consult several wikis and spend $50 to check.

Blackest Night, on the other hand, relies on several years’ worth of comics to set the stage. It’s clear that a large number of heroes died, but if this were the opening to a television season, we’d have something to remind us how they died. (It’s perhaps unfair to compare New 52 titles to previous works, granted.) It introduces its antagonists as a primal force rather than characters and does nothing to show their motivations. Their origins are given very little time; you might as well describe Alan Scott’s origin story by saying that, in the beginning of the universe, the white light of life separated into the emotional spectrum, and Scott received an artifact that allowed him to use the green light of will.

Actually, that’s a more adequate and thorough origin story than we’re given for the antagonists in Blackest Night.

The result is a lot of confusion. In this case, since we’re starting with characters with a lot of history behind them, we don’t have the same problem with a lack of characterization — except for one Heel Face Turn and the primary antagonist — but we do have a horribly rushed main conflict.

This is bad storytelling.

It’s two types of bad storytelling in two different series, but it’s motivated by the same thing: reducing the number of pages to explore a given conflict. Because artwork is expensive to produce and expensive to print. And that is simply unfortunate.

Police, huh! What are they good for?

If we just disbanded the NSA on the grounds that it’s overstepped its bounds and isn’t providing sufficient value, I doubt we’d notice. But the police are more integrated with society. They handle issues that are more likely to affect us.

Police in the US have started killing people for their skin color. They rape sex workers as if it’s their job — and according to their police chiefs, it is. They are explicitly told to make drug arrests in predominantly POC neighborhoods — primarily black, also Hispanic. They’re subject to no effective oversight. The public in the US has the patience and attention to see one or two officers tarred and feathered per year, but the primary effect is to force the officer in question to move to another county and get another job on another police force.

To be clear, not every officer is killing black people. Not every officer is raping sex workers. Not every officer is targeting black kids for drug arrests. But it’s easy to find a department to support you after you’ve murdered an unarmed black man. Every officer who is assigned to vice is raping sex workers or actively assisting with the process. Police departments are assigning cops quotas and patrols specifically to ensure that it’s mainly black kids being arrested for recreational drug possession.

The problems are too widespread, and many of them are baked into the political structures of policing. At this point, it would be a herculean task (or possibly sisyphean) to root out the corruption and outright evil in police departments. It’s much more efficient, much cleaner, to tear them to the ground and replace them with something else. Something designed to protect people from itself above all.

So what are police good for, and what should they be good for, that we want a replacement to handle?

Help people obey the law

The police as is don’t help people to obey the law. They will inform you that you are violating the law and process you so your punishment can be assigned. In routine cases, this means they will enact a fine. In less routine cases, they will transport you to a jail to be reviewed by a judge, possibly with jury involvement.

Ideally, we will provide people to help you obey the law.

Traffic safety provides a lot of tickets. Part of that is vehicle maintenance. If you have a busted tail light, a police officer will pull you over and talk to you about it, tell you to get it fixed, maybe issue a fine. How about hiring traveling auto mechanics instead? You drive around and see someone has a broken tail light, so you pull them over and ask if you can fix it for them. You see that someone has an expired inspection sticker, so you schedule an inspection for them — and you can even offer to drive the vehicle over if they’re having trouble getting to the shop.

You need licenses to do a variety of things. Selling certain items, for instance. A police officer would close down your store, issue a citation, maybe arrest you, depending. We want people who will instead walk you through the process of getting that license. We want roving ombudspeople.

Resolving disputes

Police are sometimes called in, in places where they’re still respected (or at least feared less than someone who’s presenting a more immediate threat), to resolve disputes between people. The median required training duration for conflict resolution among police schools that require it is eight hours. One in six schools don’t even require it.

We need mediators.

We need neutral mediators who are not going to threaten to send you to jail for calling them to help you get away from an abuser. (It’s becoming increasingly common for police responding to domestic violence calls to simply throw all adult parties in jail.) The mediators need to be able to bring abuse victims to shelters and remove abusers from homes. For situations that aren’t cut and dried, they need conflict resolution training, and probably more than a one-day seminar packed in the middle of combat training.

Since these cases can turn violent, these mediators have to be able to avoid injury. They might need defense training beyond avoiding injury. I don’t know. It’s a bad sign if that sort of training is often called for; it means the mediation portion of the training isn’t sufficient or isn’t right. Maybe we can start out with people working in pairs: a mediator who goes in first and a bouncer as backup who stays outside unless called for.

Investigating crime

Crime will still happen. We need people with the necessary training and equipment to track down criminals in cases where tracking them down is important. Beat cops don’t help much here. It’s detectives and crime scene analysis people and the FBI. We could incorporate it all into the FBI. However, that might simply turn the FBI into today’s cops.

This is a hard problem. I’m still looking for options.

Stopping crimes in progress

Police attempt to stop crimes as they happen. In the case of violent crime from a determined perpetrator, that requires equipment and training to enact violence on people. Insofar as such people are needed, we should not conflate their roles with the other roles that cops are or should be fulfilling today.

Preventing crime

Preventing crime is not a goal for police.

Crime prevention is difficult to attribute to individual officers. If a district patrolled by twenty cops sees a 5% reduction in crime year-over-year, that might net a bonus to the officers who patrol there. But nobody gets to police chief by seeing a reduction in crime. They get promotions for more measurable and attributable actions.

They get rewarded for sending people to prison.

That’s the opposite of what we want. We want fewer criminals. We should rejoice if the NYPD didn’t find anyone to arrest for a week. But our incentives are perverse.

Crime prevention in general is a multifaceted thing, and a police force or the equivalent isn’t going to stop all crime. But there are some obvious things we can do to reduce violence.

Ban automatic and semiautomatic firearms, institute a buyback program, and we would likely see a strong reduction in firearm-related suicide and homicide. (Australia saw a 70% reduction in firearm-related suicides following their buyback program. Their homicide rate was insufficient to see statistically significant reductions, even with a 50% drop, because they just don’t have that much murder.)

Improve education. There’s correlation between dropping out of high school and committing crime. The Alliance for Education estimates that a 5% improvement in education rates would drop felonies by over a hundred thousand per year, at an overall savings to states on the order of $18 billion.

Reduce poverty. There’s a strong link between poverty and likelihood to commit crime. Education helps somewhat, but as we move to more automation (which is good!) and as our outsourcing trends continue, we will see more widespread poverty as jobs disappear. In January, for instance, there were 160,000 Uber drivers. In ten years, when driverless cars become widespread, Uber’s employment rates will plummet, their operating overhead will drop, and we’ll see more concentration of wealth. This doesn’t help to reduce poverty. There are 3.5 million truck drivers. Highway driving is a simpler problem to solve than city driving, so in ten years we’ll start seeing a lot of automated long-haul trucks. That will drop decent wage jobs that tend to support small towns throughout the country.

Institute consent education in all schools, from preschool to grad school.

Traffic safety

Cops enforce traffic laws. Or rather, they turn breaking traffic laws into a lottery.

Driverless cars will follow traffic laws. Everyone tends to follow a compromise between safety, speed, and obeying laws. The people who tend to speed a lot also tend to buy cop detecting devices.

Regardless, traffic violations are a short-to-medium term consideration. In fifty years, driving might be illegal — or merely accompanied by so large an insurance premium as to make it unjustifiable for most people. And even today, traffic safety isn’t a police objective; traffic patrols are primarily a revenue source. Perverse incentives again. We can probably just eliminate this function entirely.

Medical first response

Police get a modicum of medical training — the median is about three days’ worth. It’s valuable to have more people in a community who have medical training and can be called on quickly to deal with medical emergencies.

I have wilderness first responder training. Everyone should have wilderness first responder training. It should be a required part of high school. We should encourage more people to become EMTs. We should have a Medical National Reserve like the Army Reserve. People who get EMT training and equipment, and they’ll occasionally be called on to handle medical emergencies nearby, but they can have other jobs.

Or we just hire more EMTs.

We could even have a draft, if necessary. I’d be much happier about drafting people as EMTs than as soldiers. It’s a high-stress job and physically demanding, so shorter terms would be better.

Enabling more complex laws

With a dedicated law enforcement staff that punishes people for violating laws, you can have more laws and more complex laws.

Ordinary citizens must be able to understand the law. They should be able to predict as much as possible and easily memorize the rest. It is a bad thing to have complex laws. But insofar as complex laws are necessary, we will employ specialist ombudspeople.

Ingesting people into prisons for cheap labor

In the United States, slavery is legal as a punishment for crimes. This is mediated through prisons, many of which are for-profit companies. Most prisoners do get paid for their work, but the rates are usurious — it’s unheard of to make even half of minimum wage as a prisoner.

The police serve as a means to induct people into prisons, largely via the “war on drugs”. They choose people who are unlikely to have resources — or relatives with resources — to object or fight back. People with zero political clout.

Prisons should not be slave barracks. Some few people need to be kept apart from the rest of the population; prisons should hold them securely and humanely. Some people commit crimes and need to be taught so they will not do so again.

Slavery could be used as a deterrent, and we could debate the effectiveness. But we’re hiding the fact that we’re using slavery, so we’re not even doing that.

We will not continue to use slavery. We will instead halt the war on drugs and try to decriminalize the nonviolent activities that are used to promote slavery.

How do we get there?

This is, unfortunately, a radical undertaking. We need it, but it’s a collection of sweeping changes, it requires us to allocate a ton of money, train a bunch of people — even getting qualified teachers will be difficult — and then we end up with a lot of former police officers who are disgruntled, probably have firearms, and probably want to prove to America that traditional policing is necessary and we’ll have anarchy without it.

One early step is a firearm buyback program and firearm restrictions. Then we need to reduce the police force’s armaments. We also need to reduce poverty in a significant way — a basic income would reduce crime and, with it, the need for police. We also need to end the war on drugs as soon as possible, forbidding for-profit prisons at the same time.

Unfortunately, legal simplifications will be outrageously difficult to enact. Laws aren’t passed just to make lives difficult; they each have their own reasons and histories. And the transition from a paid lawyer model to a public ombuds model will not be particularly well received.

We can make large inroads on the number of police and police power. It’s within our reach. It just won’t be easy.

Gendered language in examples

Language is often gendered. It’s absurdly gendered. We’re eroding that a little in some places, but that’s incredibly slow.

One suggestion I’ve heard regarding gender neutral language is that authors (for instance, of philosophical articles) use their own pronouns and gender when referring to hypothetical people. This seems fair on the face of it, yes? It’s a simple rule, too.

Problem. Many fields are male-dominated. If we add that rule for fairness, then the literature will feel just as male dominated as the collection of authors. It explicitly extends the unfairness in the field to the literature under the guise of fairness.

Instead, let authors write about people of a gender that is not their own. It’s not nearly as useful to have good representation in a field’s literature than to have good representation in the authorship in that field, of course. However, it will at least get men used to hearing about women and thinking of them. It would be a tiny thing to help reduce the amount of sexism in the field. Hopefully.

In reality, this would rather easily identify an author’s gender, which is undesirable in a number of situations. A reasonably anonymous policy would use something unrelated — for instance, the entire field might rotate between masculine, feminine, and agender / genderqueer examples on an annual basis.

Anyway, this is a tiny proposal that has no way of getting any traction, but whatevs.

Connecting to OpenVPN with ChromeOS

Chromebooks are awesome, right? A limited computer managed by a mostly-trusted company with the option of turning into a full-fledged poweruser’s laptop. Light on the specs, usually, but almost always cheap. The “cheap” and “limited” aspects mean that businesses love putting them into users’ hands — the inevitable spilt coffee matters less, and there’s far less of a chance that someone will get malware on them and into the internal network.

Business laptops mean VPNs. VPNs mean distributing ovpn client configuration files. Let’s look at how to set up a Chromebook to use a VPN, shall we?

To start off, we’ll pop up to the network settings and hit “add connection”.

The ChromeOS network settings page, showing my current connection and an 'add connection' option.

Oh hey, there’s an option for OpenVPN — looks promising, but half your users haven’t even gotten this far. And now —

The ChromeOS VPN setup page. It's a form with ten entries: server hostname, service name, provider type, pre-shared key...

Sweet baby Maeve, what the hell is this?! On Linux I can just type “openvpn client.ovpn” and I’m done. On my Windows laptop I could just double-click the ovpn file. What the hell am I supposed to do with this? You’ve lost 90% of your remaining users.

Like the remaining 5%, I look it up on Google. Apparently I’m supposed to copy the <ca> tag’s contents into another file, same with the <cert> tag, and import them into the certificate store. These aren’t HTTPS certificates, and the only thing I see to install them says “HTTPS certificates”, but maybe it’ll work. So I try it and see:

Please enter the password that was used to encrypt this certificate file.

Yeah. Chrome? I didn’t encrypt the file. I don’t have the key, and I don’t think you need one. You’re being stupid now.

But fine. We’ve failed in the GUI; it’s on to the command line. I hold down the Escape and Refresh keys, void my warranty, delete all my local files, wait ten minutes, and fire up the command line. Corporate customers don’t have this option, remember, and most people don’t even know about developer mode. We’re down another 95%. And success! Openvpn is installed!

chronos@localhost / $ sudo openvpn client.ovpn ~/Downloads/client.ovpn
Enter Auth Username:dhasenan
Enter Auth Password:
CHALLENGE: Enter One-Time Password
50 lines of logging
/bin/ifconfig tun0 ...
SIOCSIFADDR: No such device
SIOCSIFMTU: No such device
SIOCSIFBRDADDR: No such device
tun0: ERROR while getting interface flags: No such device
Exiting due to fatal error

At this point, you’ve lost another 90% of the people who made it this far. If you started with ten thousand, you’re left with maybe two people willing to soldier on. I’m one of them.

Now. Openvpn is starting, and it’s connecting. If you know some stuff about networking on Linux (and probably half the people who haven’t been scared off yet probably do), you know that tun0 is a network device. Some digging online shows that ChromeOS networking is managed by a service named shill, it kills any network device it doesn’t think should exist. That includes /dev/net/tun0. So I hop back in the terminal, do a quick sudo killall shill, and — nothing.

Shill is being run by upstart. Upstart is the init system that ChromeOS uses. (It took some time and effort to discover this.) On a standard Linux system using upstart, you can type service shill stop to manually stop a service. So we do that here and… command not found.

At this point, I’m pretty much ready to give up. But I soldier on out of pure cussedness. I look through /sbin and see some symlinks named “start”, “stop”, etc. They’re linked to /sbin/initctl. Turns out I didn’t realize that “service” is effectively an alias to “initctl”. So I just run sudo stop shill and —

Oh hey, I’m not online anymore.

But I run sudo shill --help, which shows me I can just run sudo shill --device-black-list=tun0. That gives me networking again but hides tun0 (and therefore our VPN connection) from shill’s wrath.

Of course, this doesn’t fix everything! The openvpn command line client doesn’t set up DNS for you. So you need to find your DNS server’s IP address and manually edit /etc/resolv.conf to search it first. (This is a failing of Linux, not specifically ChromeOS. But it’s still another hurdle.)

Putting it all together:

  1. Turn on developer mode (hold down Esc + F3, restart, hit Control+D).
  2. Open a terminal (Ctrl+Alt+T, type ‘shell’, hit enter).
  3. sudo nano /etc/resolv.conf; add “nameserver” (replacing “” with the right IP) at the top
  4. sudo stop shill
  5. sudo shill --device-black-list=tun0
  6. sudo openvpn ~/Downloads/client.ovpn
  7. Enter username, password, OTP.
  8. Leave this tab in the background.
  9. When you’re done with the VPN, switch back to this tab and hit Ctrl+C.

And you’re done!

Now. If this set of instructions were made obvious to everyone, 99% of people wouldn’t want to void their warranty, another 80% would get lost, and out of that initial ten thousand, we’d have a full twenty who managed to get their VPN configured. As is, we probably get under 0.2% of a person for every ten thousand.

This situation is simply shameful.

If Google wanted to make this work as it should, it would be simple: maybe two days of UI work, a smidgeon of effort to copy your client file somewhere, and just shell out to the the openvpn command line client. Getting proper error messages would take some work; handling multifactor authentication would take some work; but still, assuming I was familiar with that part of ChromeOS, I could have it working in a week.

Will it ever happen?

Probably not.

An aside: there’s a ton of stuff in my ovpn file that has no place in the current ChromeOS VPN setup interface. I’m wondering, if I managed to plug in all the certificates and get ChromeOS to submit the right stuff, would it do the right thing? How would it know, for instance, to route to the VPN instead of the local network? That information is in the ovpn file, but there’s no place in the UI to put it.

Diversity and the Hugos

Background: the 2015 Hugos were the most contentious ever, largely thanks to two groups working in concert: the Sad Puppies and the Rabid Puppies. They both oppose what they see as Social Justice Warriors interfering with their awards. Notably, the ringleaders tend to be people who were nominated for a Hugo but failed to achieve one — an honor in itself.

From Amy Wallace’s article on the 2015 Hugos:

On the phone from the Middle East, where he is currently deployed, Torgersen lamented what he called “the cognitive dissonance of people saying, ‘No, the Hugos are about quality,’ and then at the same time they’re like: ‘Ooh, we can vote for this author because they’re gay, or for this story because it’s got gay characters,’ or, ‘Ooh, we’re going to vote for this author because they’re not white.’ As soon as that becomes the criteria, well, quality goes out the window.”

There are many aspects to how good a work is. In large part, it’s determined by what your audience wants. Your work is better when you avoid tropes that have been overused too much recently. It’s improved, often, by novelty, which depends mostly on what other people have been writing in the past few decades. Another thing that determines whether someone thinks your work is good is whether they personally can relate to any characters in it. That’s a lot more subjective a measure, but it’s still there.

Authors from marginalized groups offer different perspectives. This allows them to gain points on the novelty front more easily. Some tropes actively harm people from marginalized groups, and those people are generally aware of that fact and more likely to avoid those tropes — or engage with them directly, which can also be quite interesting. They are more likely to include people from their own groups in representation. And since the more commonly represented groups are so well represented, these authors have a plethora of examples to draw from when portraying characters not from their group.

For example: sci-fi books are skewed toward having male protagonists. A simple way to be slightly fresher is to have a female protagonist. A female author can do a better job of this than a male author, on average. Her male characters may be slightly less satisfying than a male author’s, but they’ll be pretty good because she has tons of excellent examples to imitate. Her personal experiences of being a woman will make her female characters much better.

But we should value the quality of the portrayals instead of the marginalization of the author! you may cry. Let me tell you a parable.

Internationally, almost everyone thinks that kiwi birds are fifteen feet tall, weigh several tonnes, and frequently tear apart cars to get at the juicy humans inside. They spray acid from their beaks and can fly. You grew up in New Guinea and have seen kiwis for yourself. They’re birds all right, and they’re called kiwis, but they max out at like a kilo and are fuzzy little harmless things that can’t fly and would run away from you sooner than attack. They don’t eat anything larger than a frog. And there’s nothing around that flies and tears apart cars.

Now you want to write a story about New Guinea. Every story you’ve read about the area features kiwis tearing up cars and flying away. And every story you’ve read about the area is by someone who’s never been there. You write accurately according to your experiences there.

In this scenario, two things are immediately obvious: your personal experiences let you write more accurate portrayals, and it’s unlikely you will be believed. However, I as a reader interested in accurate portrayals of New Guinea will prefer your account because you have appreciable experience with the area.

Similarly, I will prefer to read women’s portrayals of women over men’s portrayals of women. I will trust them more. Similarly with people of color, homosexual / bi / pan people, non-binary and trans people…

In short, we want novelty, one type of which is novel perspectives and characters of types we haven’t experienced very often. We expect the best portrayals to come from people like those characters, and we expect that most authors will be able to do a good job on the more common types of characters. Therefore we tend to promote authors who are members of marginalized groups. It’s not a reflexive “this person’s from a marginalized group, therefore give them awards!” thing. It’s a question of trustworthy quality.

Neurodiversity versus disability

I keep hearing the term “neurodiversity”, and it bothers me. It feels like a way to excuse and eventually glorify disabilities. Let’s look into it a bit more.

The DSM-IV defines a huge range of mental issues. Some of them are debilitating. Some of them require a large amount of effort to control. Some of them are severe or minor quirks. Some of them even have upsides, though accompanied with downsides that mean they are both unsuitable for the general population and troublesome for individuals.

The term “neurodiverse” would seem to encompass all of them. This means promoting diseases that harm people. Paranoid schizophrenia, severe autism, and more. This is stupid. Who would willingly give their child an attribute that would severely impair their life?

Of course, I could say the same about homosexuality or skin color. The difference there is that it is a cultural problem for your kid’s potential success if they are black or aboriginal American or aboriginal Australian or homosexual, while it is an internal, intrinsic issue for people to suffer from severe autism or mental retardation or many of these other issues. That is, it wouldn’t be a problem for someone to be black or homosexual or First Nations, except some bastards decided to make it a problem.

What about mental disabilities? These tend to be problems even in societies that try to make accommodations for them. There are exceptions, and certainly society has made a lot of them worse than they should be even without assistance, but for the most part, we’ve catalogued a series of problems that are decidedly problematic.

I think neurodiversity as a concept is useful. Some people are high functioning and also have some neurological issues that have beneficial side effects. Some people have neurological issues that they find reasonably manageable, and just having an additional perspective is helpful.

Additionally, it is good to encourage people to be compassionate toward humans with neurological disabilities. We have a history of treating people poorly with the slightest excuse for being slightly different, and we should stop that.

This doesn’t mean we should be happy with this second sort of mental issues. It doesn’t license us to stop researching cures and treatments. We’d still be best served by editing debilitating problems out of our genome if the opportunity arises. We should continue to acknowledge this even while trying to treat debilitated humans more gently and accepting people with functional but uncommon mentation.

Corporal punishment

I’ve been reading about corporal punishment (eg spanking) lately. Not explicitly going out and researching it; just some of the people I follow happen to be talking about it. So I finally started thinking about the issue.

I was raised with corporal punishment. What I remember about it is that I always felt the full impact of “I have done something wrong and disappointed my parents” before they spanked me. The spanking was a separate bout of shame and humiliation. It angered me. But I couldn’t express that anger because I had done something wrong. Even if my parents would have listened to me at the best of times, which on this issue they wouldn’t have, they wouldn’t have listened in that minute.

I understand the idea of using pain as a disincentive — you use it for creatures that won’t understand any other way. Like dogs — no, dogs understand human emotions. Or horses — no, if you hit a horse, you get a horse that’s scared of people rather than one who acts as you wish. Like a five-year-old human — no, humans at the age of five can read your emotions better than you think, and disappointment is one that cuts especially deep.

Maybe with especially young infants? Except with puppies, we don’t expect them to make proper decisions on their own. We instead restrict them to situations where their poor judgment will not hurt them and is less likely to inconvenience us.

Somehow, we expect both more and less from children than we do from dogs. We expect better decision making, and at the same time we expect worse emotional understanding. And these foolish expectations result in us treating children worse than we would treat animals.

Nim versus Go: syntactic style and friendliness

A while ago I made a post on Go’s programmer-friendliness. Lately I’ve been using Nim, a language that’s often mentioned in the same contexts as Go. The languages have relatively different aims, albeit with a decent overlap.

Nim’s major strength, I think, is in C/C++ interop. There’s a tool to create Nim declarations corresponding to a header file, and it’s pretty trivial to link to C++ libraries. This is unusual — there are about two languages that allow you to interact with C++ types without wrapping each call and explicit serialization. On the other hand, it doesn’t seem quite as easy to use Nim from C++.

Beyond that, Nim has a relatively straightforward type system with some interesting quirks, and it has a lot of metaprogramming options. You have generics, macros, and templates all available. You can call procedures (aka functions) however you want syntactically; len(foo) is the same as len foo, foo.len(), and foo.len. This is convenient — it’s trivial to add methods to an object.

Between the syntactic and metaprogramming flexibility, Nim avoids many of the problems that Go has. It’s easy to do functional programming, for instance. Errors are propagated via exceptions. The libraries seem mostly sane.

There are some similarities between the two languages. They’re both from the most recent wave of systems-oriented languages, which introduce garbage collection and facilities to avoid using it. (D is one of the forerunners. I would call D a third wave systems language, with C and C++ being the second wave and assembly being the first.) But Go is mostly a C-inspired language, whereas Nim is inspired mostly by object-oriented languages. Go has strict pseudo-concurrency systems emphasizing safety in the face of shared state, while Nim offers real concurrency with thread-local memory with an optional shared memory heap.

Nim is a bit less opinionated and offers better interoperation with existing code. This means it’s a more practical choice in some ways. However, Go is simpler and has better compilation speeds. (Nim has to generate C or C++ code and then compile that, which means that its compilation times are relatively bad.) On the whole, especially since my projects tend to be small, I prefer Nim by a fair margin. I have to think more, but it’s less of the language being useless and more of the compiler not reading my mind.

The State of 3D Linux C# Game Engines

I like using high-level languages with static typing and garbage collection. That leaves a handful of options — C#, D, Go, Java, and maybe a couple others. Of these, C# is my favorite. And again, for a number of reasons, Linux is my standard operating system. And I want to create games for my preferred OS with my preferred programming language.

Current options


This isn’t actually a game engine. It’s a high-level SDL binding, so it handles input and sound and a few other things. A lot of other projects use it, so it’s worthwhile to talk about its foibles.

Right now, the latest release has a cute bug: if you try running it with a debugger and have an XBox 360 controller attached, it crashes. Something about SDL_JoystickGetGUID. Yeah, just comment out calls to it and recompile.


Monogame runs on Linux. It uses OpenTK. It probably does whatever you want except for mouse input. Actually mouse input works well, assuming you’re only supporting full screen mode on single-monitor systems. Otherwise, well, your mouse coordinates are based on the position across the virtual display rather than the window. (It’s a bug that seems to be affecting only me.) And no, there’s no cross-platform way of getting the window position.

So yes, as long as you don’t need to access the mouse position, it’s maybe okay. I moved on once I saw this issue.

Wave Engine

This is actually a promising option, once they get any documentation whatsoever. But it’s closed source, and there are only a half dozen sample applications, and half the documentation is wrong. (The API documentation isn’t wrong per se, but it’s about the same as whatever Monodevelop would autogenerate for you.) So wait a year, see if the documentation improves.

Aside from that, it requires you to know the game resolution and viewport before you start your game. This is highly annoying. Monogame doesn’t do that. Monogame lets me resize my window whenever I want and updates its viewport accordingly.


Axiom3D does not support any working input system on Linux. You can choose between SharpInputSystem, which is a dead project that never passed alpha and never worked on Linux, and OpenTK. OpenTK would work, but somehow Axiom3D messed up the OpenTK initialization or window creation, and you get bogus values from it. It might again be fine if you’re always doing full screen, but in windowed mode, you get the origin point changing whenever you resize the window.

It also has terrible documentation.

Delta Engine

Delta Engine is open source and has some level of documentation. (Yay!) It’s available via nuget, but don’t let that fool you — the nuget binaries don’t work on Linux. But it’s open source, and you can build it on Linux with a few tweaks. Annoyingly, you can’t just cd into the directory and run xbuild, but you can open it in monodevelop, fetch the nuget packages, add autofac to the two or three projects they forgot, add in a cast or two, comment out one or two lines of code, and get everything to build with only about ten minutes of effort.

So, yay!

Unfortunately, it looks like the Linux support is a dream at the moment. They hope to add it, but (for instance) their input solutions are full of abstract classes with only Windows implementations and not even a start at a Linux implementation. There is a MonoGame edition, though, and an OpenTK edition. Similarly to the main distribution, the OpenTK release has numerous build errors, so it’s a matter of ten or fifteen minutes to compile it.

Also note that the OpenTK release depends on OpenTK, which has potential issues with gamepads. Hopefully you’ve already patched and built your own copy. Handily (and I say that with the utmost sarcasm), they didn’t see fit to provide their own binaries, so instead of replacing some files in a Lib directory, you’re going to be adding the references by hand wherever you find build errors.

Once you’ve gone through this fifteen minutes of work, you find that the result won’t even run its samples. It’s convinced that it needs to copy OpenAL libraries to its build directory. Once you clear that out, you quickly find that they didn’t test their own OpenTK support at all, and they’re trying to use OpenGL on a window that wasn’t created with OpenGL enabled.

So yeah, if you want to use this engine on Linux, get ready for some intensive debugging. Of their code, not yours. I don’t have the patience to get it working.


You must be a WINE god.

Unreal 4

Unreal Editor apparently runs on Linux, and thanks to Xamarin, you can use C# for scripting. But it’s a far cry from implementing a game in C#, and scripting is an area where I’d rather use Boo or something else that’s designed to be interpreted.

So, the overall state is pretty terrible. Good luck!

Far Cry 4’s women

I’ve been watching Hannah from the Yogscast playing through Far Cry 4. I quite enjoy watching Hannah’s channel aside from how frequently she uses the word “bitch”.

Far Cry 4 has approximately three named female characters that we’ve seen: Amita, Noore, and Bhadra. Bhadra’s a normal teenager, or at least she’s trying to be. But Amita and Noore are in much different situations, and they’re treated inappropriately. Additionally, the fact that all Golden Path NPCs that aren’t named are male is unrealistic — guerrilla organizations tend to be approximately one third female.

Amita is one of the two leaders of the Golden Path. She is positioned as a ruthless hardass optimizing for victory more than individual lives. Sabal, her co-leader, is more concerned with individual survival and the number of lives saved. Yet Amita is frequently emotional, on the verge of tears, while Sabal is only a bit moody. This is counterintuitive. Moreover, Amita’s a warrior, but she has nice clothing, a hairstyle that takes effort to maintain, and an astounding lack of scars. This is unexpected. I’m not saying leaders can’t cry; rather, it’s hard to gain respect from men if you’re seen crying often.

Bhadra, in contrast, looks like she spends less time on her appearance — but we’re fine with that. She’s a teenager trying to live like imported media tells her she should live; she’s not fighting for her life and the lives of others.

Noore is another story. She’s a doctor rather than a fighter, and her family’s being held hostage. It’s perfectly reasonable for her to seem less of a hardass. But. When we’re introduced to her, she’s overseeing a death arena. She must be relatively inured to death by now. Later, we see her stabbing a man to death and telling her underlings to throw the body to the animals. So we’ve good reason to think she’s a hardass, too. But a moment later, she’s back to tears and weakness and being unable to do things on her own. At least her public persona gives her a reason to be dressed up with plucked eyebrows.

On the whole, I’m not impressed. In almost every particular, I’m not impressed. It’s nice that there’s a woman in a position of command, but she’s not at all active in her position, which makes the title rather worthless.