All User Interfaces Should Be Designed for Albert Einstein

Think about it.

  1. Professor Einstein is the ultimate non-technical user. He’s never seen a personal computer before. He doesn’t understand any computing metaphor or jargon. The application must teach him everything he needs to know, and he should get the greatest possible value out of everything he is forced to learn.
  2. Professor Einstein has enormous demands on his time, especially with the war heating up. The software must not pester the Professor for attention, require him to memorize or research trivial data, and it must not malfunction if left unsupervised.
  3. Professor Einstein is intensely curious about the world, including your newfangled software. The software must not condescend to the Professor by making decisions on his behalf, nor can it be allowed to keep secrets or play tricks on him. Don’t anger the Professor by creating an inscrutable black box.
  4. Only Professor Einstein understands the value of his data — literally. Ask him before you do anything that might compromise his security. For example, uploading the Professor’s passwords to a remote server where Nazi spies might find them would be evil, even if it is really convenient to have a backup.

Of course, these recommendations can conflict with each other, but you can balance conflicting concerns if you practice a little creativity, maturity, and empathy.

Posted in Software Engineering | Leave a comment

Did willfully create a disturbance . . .

Last week I was arrested and charged with 2nd degree trespassing, failing to disperse on command, and “creating a disturbance in the North Carolina State Legislative Building with loud singing and yelling and/or displaying unauthorized signs.”

I didn’t go to the general assembly to “get arrested.” I went there because my government is hurting people and I want them to stop.

I did not consent to be handcuffed, locked up, paraded in chains, or any of that. I anticipated that these things would happen, and I did not resist or disrespect the officers. I believe that police officers deserve a workplace where they are safe and free from harassment and fairly compensated, just like everyone else who works. But my view is that when they arrested me, that was a wrongdoing on their part.

My state representatives are doing sad and hurtful things to my fellow citizens. Among these are: interfering with people’s ability to vote, sabotaging our public schools, and cruelly denying health care to women.

This comes one year after the constitutional amendment to ban gay marriage in our state, even though gay marriage is already illegal. Nevermind the nonsense about banning Sharia law (really, what is the state constitution even for?) but explicitly allowing an official religion (presumably not Islam) in our state.

I love my state and I hurt for what my representatives are doing in my name. I don’t feel that I trespassed last week. It was my government that was trespassing on human dignity.

Posted in Social Justice | Leave a comment

Liberty vs. Safety

Since the recent wiretapping scandal I have been reminded a few times by a few different people of this adage: They who can give up essential liberty to obtain a little temporary safety, deserve neither liberty nor safety.

I would like to put forward a new adage that goes like this: Everyone deserves both liberty and safety.

It’s that easy.

Posted in Uncategorized | Tagged | Leave a comment

Cats are Parasites

Cats are parasites.

Dogs, by comparison, enjoy a mutually beneficial symbiosis with humans. The dog benefits from the human’s technology and problem solving skills while the human benefits from the dog’s keen instincts and senses.

Cats use their cuteness and meows to mimic helpless human newborns, tricking their humans into giving them food and affection. In exchange the human gets false sense of reproductive success. They are brood parasites, no different from a baby Cuckoo bird.

I write these things as an enthusiastic cat owner. I love my cats and lavish them with lots of treats and petting. They are my babies and I can’t imagine life without them.

Posted in cats | 1 Comment

Not a Voice for Me

A couple of weeks ago while searching for information on an unrelated issue, I came across an article, titled “Herding Porcupines in the MRM,” linking the Men’s Right Movement to Quakerism on the site, A Voice for Men.  Please be aware that the above link is to a site identified by the SPLC as having at least some of the characteristics of a hate group.  While I don’t care to evaluate the site in its entirety and don’t know all of the nuance of identifying what is and is not a hate group, at the time of this writing the site seems to feature an “enemies list” with names, dossiers and photographs, an advertisement (for an affiliated site) depicting blood dripping from a knife, as well as imagery and text which seem to serve no function other than to dehumanize activists from other communities.

If you’ve never encountered the men’s rights movement before, it can puzzling to newcomers.  Most people are correctly under the impression that men have rights, and many MRM groups know how to artfully incorporate legitimate concerns alongside their reactionary politics in a way that can confound outsiders.  That said, I find the movement as it is actually, widely practiced to be a manifestation of modern misogyny belonging in the same category as white supremacist and other hate-based movements.

For whatever reason the author of this particular article has chosen to identify as both a quaker, a woman, and a men’s rights activist.

That women sometimes choose to associate with the men’s rights movement is unsettling but not surprising — sexism is unique among all forms of prejudice in that it can never rely on people’s unfamiliarity with each other to perpetuate it’s vicious misconceptions.  Men and women who are exposed to misogynistic media and lack the insight to resist its influence are likely be indoctrinated with very similar ideas regardless of their gender.

I do identify as a quaker.  Although I am not a member of my meeting, I attend frequently and share many of their values.  These values, as I understand them, include taking time to listen and form consensus with every stakeholder as part of the decision-making process, opposition to all forms of violence regardless of the context in which the violence may take place, the will to defy injustice wherever it occurs, and the frequent practice of silent worship without defining the object of that worship.  I understand these values to be entirely in opposition to the values I see espoused in the men’s rights movement.

In spite of those values, it does not surprise me that a quaker somewhere in the world would identify with the men’s rights movement.  Quakers are a diverse group.  I’ve been told that some quaker meetings are almost indistinguishable from a modern conservative christian church, while others more closely resemble Occupy Wall Street organizing committees filled with youngsters eager to get themselves arrested.  The meeting I attend tends to be reserved, having taken some modest actions to contribute aid for the homeless and to agitate in favor of gay marriage.

The article itself contains little that I find objectionable because it amounts to little more than a dry review of quaker organizational structures.  I have no rebuttal to its content, but I feel that if I remain silent about this article, reasonable people might take away the idea that there exists some widespread sympathies between quakerism and the men’s rights movement.  I find this possibility utterly horrifying.  A Voice for Men and sites like it do not speak for me or my meeting.  I have no doubt that the ideas advocated by the men’s rights movement would be greeted by strenuous protest among the overwhelming majority of friends at my meeting, several of whom are feminists.

My only real goal in posting this is to provide some guidance to anyone who may have come across this article and be curious as to whether it represents a presence of men’s rights sentiments in modern quakerism.  I believe that it does not.

Posted in Social Justice | Leave a comment

ANN: Roguestar 0.6.0.0

Roguestar 0.6.0.0 is now up on hackage.  You can install and run with:

$ cabal install roguestar roguestar-glut roguestar-engine
& ~/.cabal/bin/roguestar

The latest version brings:

  • New monsters: Hellions and Dust Vortexes
  • Underground dungeons
  • Power-ups (hidden in the aforementioned dungeons) that serve to level-up the player’s character.
  • Improved walking animation.
  • It’s no longer possible to spawn with zero sight range.
  • Fixed some of the worst of the user interface glitches.

Under the hood, I’ve also split RSAGL into a few topic-specific libraries and implemented value recursion in rsagl-frp.  There is an experimental GTK-based client, but I don’t recommend it just yet, which is why it isn’t on hackage.

I’ve also migrated the project to github, which includes source code, the manual, and the issue tracker.

Posted in Uncategorized | Leave a comment

The One Function per Typeclass Rule

After about five years programming in Haskell, I think we need a rule:  Only put one function in a typeclass.

Why?  Because inevitably someone comes along with a data type for which one or the other function of a typeclass is perfectly suited, and yet another function of the same typeclass is not implementable.

Here are some examples of consequences of breaking the rule:

  1. The Infamous Set Monad, which requires splitting Monad in half. (Monad)
  2. All of the abstract ways to construct Nothing: fail (Monad), mempty (Monoid), mzero (MonadPlus), empty (Alternative).  Not surprisingly, all of these typeclasses are subtly related.
  3. The natural numbers, which have a minBound, but not a maxBound (Bounded) . . .
  4. . . . and which support addition and multiplication, but aren’t closed under subtraction and for which the concept of a sign does not exist (Num).
  5. My own memoizable message type, which would like to implement Applicative, but needs a monadic computation to implement pure. (Applicative)

It’s a little extra typing to write multiple “class . . . where” clauses for each type that needs to implement a large number of type-indexed functions, but it’s quite easy to combine related typeclasses when appropriate, as follows:

class Foo a where
    foo :: a -> b

class Bar a where
    bar :: a -> b

class (Foo a,Bar a) => FooBar a where
    {this space intentionally left blank}

In conclusion, you should definitely follow this rule if I have convinced you that it is a good idea to follow it.

Posted in Haskell | 5 Comments