why we need anti-harassment policies

Yesterday Michael Meeks expressed his distaste at GUADEC’s Attendee’s policy.

I have personally advocated for conferences to adopt anti-harassment guidelines. I am also an advisor to The Ada Initiative, which is involved with this work.

Michael writes:

Fair enough getting aggressive against stalking, groping and such horrors; but encouraging censorship of “offensive” verbal comments related to sexual orientation, religion etc. looks like a persecutors charter in the making. What is offensive ? and to whom ? the fear being that -very- quickly such good aspirations slide from “applied common sense” into a militant denial of a basic right to reasonably critique others’ world-views. Put another way I’m really happy for people to tell me how wrong-headed I am on any number of engaging topics, and to discuss them in an animated and friendly fashion. I loathe a framework that will discourage people from coming and saying: “your Christian faith seems incomprehensibly stupid to me” (for example), or “the crazy English always fall down the stairs”, or whatever.

Here is the relevant section of the attendee’s policy:

Harassment includes offensive verbal comments related to gender, sexual orientation, disability, physical appearance, body size, race, religion, sexual images in public spaces, deliberate intimidation, stalking, following, unauthorized or inappropriate photography or recording, sustained disruption of talks or other events, inappropriate physical contact, and unwelcome sexual attention.

Firstly, if you can’t understand the point of an anti-harassment policy, or you think what’s written is obvious, then the policy probably isn’t there to protect you. Typically, when you are a member of the dominant demographic group in a space, you do not need to be protected in this way. On the other hand, I’ve heard women be told you don’t belong here, that they’re unfuckable or a dyke. I’ve been followed, I’ve had my picture taken repeatedly without my consent, one time including a sleazy remark. My friends have been stalked, photographed discreetly, inappropriately touched and sexually assaulted.

More often than not the attempted defence against this sort of behaviour is I didn’t know. Experience shows that some people do need acceptable and unacceptable behavior spelled out precisely.

Offence is in the ear of the listener (who is not always the recipient of the comment). It’s also important to distinguish the ability to critique from being offensive. Dialogue is negotiated. You can willingly consent to discuss your religion, but you don’t have to accept being verbally abused because of it. The list here indicates the common problem areas across the broad technical community (GUADEC/Desktop Summit is better than most, but not immune). Most of these are also present in various jurisdictions’ anti-discrimination law.

The goal of these policies is to make sure that everyone at the event has a good time. That no one feels like less of a person or has their day ruined because someone else was nasty to them because they’re Muslim, gay, African, obese, partially-deaf or so forth. That no one should ever feel unsafe. The goal is not to stifle discussion or censor fun (if you think hurting people is fun, consider therapy). There are many ways of being funny without putting your audience down.

People should feel comfortable and safe in our community. An anti-harassment policy is a statement that our community makes an effort to be inclusive, friendly and safe for everyone.

For more information, see Conference anti-harassment policy resources on the Geek Feminism wiki.

Posted in Uncategorized | 47 Comments

now everyone should use their hackergotchi as their avatar

I was doing the work to close #645921, so we can finally remove the legacy theme code from Empathy. This required rewriting the legacy themes as Adium themes, which once I came to understand how Adium themes work, was really not that difficult.

Then I started thinking what else could I do… so I decided to do this:

Planet GNOME Empathy Theme

It could stand for a little bit of tweaking, but that should be easy for someone to do. I realised what’s especially nice about using WebKit is that we’ve opened ourselves up to the whole world of HTML5 and CSS3 in our themes. Chat themes animated by CSS transitions anyone?

We’re still looking for someone to make a good default Empathy theme for GNOME 3 (#645920). I’m hoping that having ported the default themes to HTML should make it easier for someone to use one of them as a launching point.

For reference, Adium theme documentation:

Posted in Uncategorized | 12 Comments

role models are important

Tammy Butow is putting together a montage of Australian women in tech for the Go Girls event, because role models are important.

If you’re an Australian tech lady, submit your picture (remember to make it landscape, which I forgot the first time).

Here’s my self portrait (hooray for camera remotes):

self portrait II

Posted in Uncategorized | 1 Comment

workaround for gnome-keyring ssh auth bug in Fedora 17

So if you upgraded to Fedora 17 the other day you have probably been hit by #662528, which means gnome-keyring’s SSH agent isn’t exported into the environment, which means no SSH agent, and sadness.

Until the fix is out of updates-pending, you can work around this by adding:

export $(gnome-keyring-daemon -s)

To your .bashrc or similar.

Posted in Uncategorized | 4 Comments

Getting the GLib gdb macros with your own installed GLib

So there are these really cool debugging macros for GLib/GObject that do things like let you iterate GLists and pretty print GObjects and GHashTables and stuff that should nowadays be available in most distros.

Unfortunately when you build your own GLib to develop against, it all breaks.

It turns out, gdb locates when to load these things by looking in $prefix/share/gdb/auto-load/ and matching the sonames, so if you have libraries with a different soname (cause they’re new versions), or in a different prefix, it just doesn’t work.

Damien Lespiau has a workaround for this that adds a command to load them from a path you can control with sys.path; which works. I looked a little for a generic solution to feed the autoloader from my GLib build prefix, but I haven’t found one yet.

Having now looked at this. I’m also excited about possibilities for combining this with GObject-Introspection to potentially do some useful things. I don’t know what the caveats are here yet, what’s safe to call and what’s not.

Posted in Uncategorized | 3 Comments

experimenting with github

Apparently I’ve had a github account for ages, and never used it. Recently I’ve been using github a for some work I’ve been doing with Intel at Collabora.

Anyway, I thought it might be neat to move some of my random personal projects and misc that were stored on git.collabora.co.uk to github.

Posted in Uncategorized | Comments Off

classes, interfaces and properties in Javascript/gjs

Thought I’d share some more Javascript snippets with you zany kids.

Firstly, how to implement an interface (specifically a GInterface), for example an Mx.ItemFactory:

const ButtonFactory = new Lang.Class({
  Name: 'ButtonFactory',
  Extends: GObject.Object,
  Implements: [ Mx.ItemFactory ],
 
  _init : function (callback)
  {
    this.parent();
    this._callback = callback;
  },
 
  vfunc_create : function ()
  {
    let button = new Button();
    button.connect('clicked', Lang.bind(this, function ()
      {
        this._callback(button);
      }));
 
    return button;
  },
});

The important thing to notice is the vfunc_ that gets prepended to any calls you’re overriding from the library. Also be aware of your terminating commas, semicolons and braces.1

Of course, we want to bind extra attributes into the classes built by our factory (I’m not sure why Mx.ItemFactorys don’t just pass a row so that we can do whatever we like in the factory). Anyway, classes are easy in Javascript so we can just extend Mx.Button to include a property we can bind:

const Button = new Lang.Class({
  Name: 'Button',
  Extends: Mx.Button,
  Properties: {
    'id': GObject.ParamSpec.string('id', '', '',
        GObject.ParamFlags.READABLE | GObject.ParamFlags.WRITABLE,
        ''),
  },
 
  _init : function (params)
  {
    this.parent(params);
    this._id = '';
  },
 
  get id ()
  {
    return this._id;
  },
 
  set id (val)
  {
    this._id = val;
  },
});

Again be aware of missing commas.

For more examples take a look at testGObjectClass.js. You should also know that much of this requires a recent gjs, so it’ll be available in GNOME 3.4, but not 3.2.

If you’re interested, here’s the code that uses this factory:

let factory = new ButtonFactory(Lang.bind(this, function (button)
  {
    ...
  }));
 
let view = new Mx.ListView({
    'model': model,
    'factory': factory,
  });
 
view.add_attribute('label', 0);
view.add_attribute('id', 1);

Thanks to Jasper St. Pierre for the help.

  1. Obviously the entire class system here is a hack, which is what makes it so reminiscent of Perl. []
Posted in javascript | 6 Comments

lilypond scales generator

I picked up my saxophone for the first time in a while last night and went along to a big band rehearsal. Very quickly discovered that I’ve forgotten most of my scales and that I need to do some practice.

Realised I didn’t feel like writing eight scales out in nine keys, and there had to be a better way, so I played around for a bit with lilypond and then hacked together a bit of Python to help generate my scales.

Anyway, I thought this was pretty neat, and possibly useful to others, so I’ve shoved it on github.

Posted in Uncategorized | Comments Off

Gtk.ListStores and Clutter.ListModels in Javascript/gjs

It’s surprisingly hard to find this, and the generated documentation is actually misleaingly wrong1, so here’s how to create ListStores and ListModels in Javascript with gjs.

let store = new Gtk.ListStore();
store.set_column_types([GObject.TYPE_STRING, GObject.TYPE_INT]);
store.insert_with_valuesv(-1, [ 0, 1 ], [ "test", 42 ]);
let model = Clutter.ListModel.newv(
    [ GObject.TYPE_STRING, GObject.TYPE_STRING ],
    [ 'Column Name 1', 'Column Name 2' ]);
model.appendv([ 0, 1 ], [ "String 1", "String 2" ]);

The first array is the column numbers you wish to assign, the second array is the values for those columns.

Fundamental GTypes are available as GObject.TYPE_*. You can specify non-basic types using the class, e.g. Clutter.Text.

There are other variations possible, but this should provide the basics required to figure out the rest.2

  1. The n_columns parameter is a lie, and will be inferred by gjs from the array size. []
  2. You’re welcome. []
Posted in clutter, example code, gtk, javascript | 1 Comment

wireless issues with rtl8192ce and Thinkpad X220

I rebooted the other day, which got me a new kernel (3.2.91), and now it seems my wireless (rtl8192ce) has become really flaky and unstable. At first I thought it was the router playing up, but everything else in the house works fine (everything else in the house is made by Apple it seems).

Typically it fails to associate until you reboot the router (which is why I thought it might be the router) or occasionally the laptop. When it is connected performance is occasionally crappy. I’m totally out of my depth debugging this. I poked around a bit but found nothing meaningful.

Help appreciated!

  1. I think I was running 3.2.1 before, which got uninstalled. Fedora helpfully left 3.2.6 and 3.2.7, neither of which I think I ever booted into. []
Posted in Uncategorized | 13 Comments