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 | 4 Comments

But does it crawl?

Roguestar is officially a dungeon crawl now, as it actually has dungeons:

An Androsynth visits the dungeon.

An Androsynth visits the dungeon.

For the moment I’m ok with the empty black pits, but I want to do something with the skylights.  Maybe slant them at an angle?  I’ll probably also change the dungeon lighting to some kind of red-orange shining up with the camera light at half-brightness.

I have a lot less free time now than I used to, so I’m trying to focus on specific game features and spend less time fiddling with stuff (like FRP semantics) under the hood.

Posted in Roguestar | Leave a comment

Memoized Dataflow Streams

In reactive programming we can choose between two models: “pull,” in which we run a computation each time output is required, and “push,” in which we run the computation each time input arrives.

Which model we use depends on whether we are working with high-frequency or low-frequency data.  If we are writing a piece of avionics software that measures pitch, yaw, and roll, then we need to constantly adjust the plane’s aerodynamic surfaces based on those variables.  We don’t need a notification when these variables change, because they change constantly.  The pull model would be perfect in this case.

On the other hand, engine temperature is every bit as critical to the health of the vehicle, but presumably that variable remains in equilibrium for long stretches of time, and small variations aren’t important.  We don’t want to waste CPU time monitoring temperature 100 cycles per second.  We might simply want to receive a notification whenever the engine temperature changes by 1 degree or more.  The push model works better here.

The problem:  How do I efficiently embed a low-frequency signal in a high-frequency channel?  If I pass the low-frequency signal naively, it will work, but entail much redundant computation.

When we want to avoid recomputing a value, we often use a memoization strategy.  However, in this case we need to memoize a data stream, not a function.

In the engine temperature example, it would be easy to memoize a function of type Int -> a.  But we want to compose this function as part of a signal.  After all, if the engine temperature is low frequency, then so is any signal derived from the engine temperature.  The chain of transformations should be memoized along its entire length.  Further, this function risks artificially escalating a meaningless low-amplitude high-frequency component of an otherwise low frequency signal by imposing an arbitrary boundary: suppose that some engine vibration causes the temperature to oscillate rapidly between 198.9 and 199.05 degrees, which would truncate to 198 and 199?  This does not yield the notification heuristic we are looking for.

The solution:  Tag information with a unique signature at its point of departure and then memoize it at the point of arrival. Transformations of the data stream also need to be tagged.  A source signature is either a unique integer, or an annotation of applying one signature to another. There is some overhead associated with comparing signatures, but this overhead can not be greater than the cost of performing the underlying operations.

Memoizable messages are very similar to applicative functors.  They can not, however, implement the Control.Applicative interface, because any pure constructor would be unsigned and therefore destroy memoization.

This memoization scheme requires three operations:

  • Transmit: Sign a message with a unique signature, indicating its source.  If a subsequent signal is sufficiently similar, reuse the same signature.
  • Receive: Unpack a signal, memoizing against the signature of the previous input.
  • Apply: Combine two signals with their signatures.
Diagram demonstrating memoized message passing semantics.

Memoized Message Passing Semantics

My implementation is in a module of rsagl-frp called Message.hs.

Posted in Haskell | 1 Comment

ANN: Roguestar-0.4.0.1

Roguestar is a science fiction roguelike game written using Haskell and OpenGL.  It is in the early stages of development.  At this time, it is not a winnable game.

$ cabal install roguestar-engine
$ cabal install roguestar-gl
$ ~/.cabal/bin/roguestar

- or -

$ git clone http://www.downstairspeople.org/git/roguestar.git
$ cd roguestar
$ git checkout 0.4.0.1
$ make install

New gameplay features:

  • Melee combat, sundering and disarming attacks
  • Weapons can sometimes overheat or explode
  • Gateway teleportation between planets
  • Use material-spheres to craft new tools
  • Use material-spheres to heal
  • Tab-completion of typed commands
  • Compass directions to significant artifacts
  • “Jump” short distances by teleporting

New objects:

  • Chromalite material spheres
  • Metallic material spheres
  • Gaseous material spheres
  • Energy sabres and fleurets
  • Gateways
  • Monoliths

New graphics features:

  • Randomly generated sky spheres and landscapes
  • Unique fractal trees
  • Zoom-in/zoom-out

Changes under the hood:

  • Major re-write of the RSAGL FRP architecture
  • Multi-threaded 3D scene assembly and rendering
  • Multi-threaded, anticipatory engine
  • Various OpenGL performance improvements

For more information, links to the manual and git repository, visit http://roguestar.downstairspeople.org.

Check it out!

Posted in Roguestar | Leave a comment