end of holidays, now for something new

Just got back from a pretty amazing two week holiday visiting my best friend Steph in Beijing (read about it here).

Tomorrow I start my new job as a Senior IT Officer at the Bureau of Meteorology. I will be working on a foreign aid project to produce climate forecasting software for pacific nations. This should be exciting work with lots of Linux and open source.

I’m a little bit nervous, I haven’t worked in an office for almost four years. Spent some time this weekend shopping for new work clothes and appropriate shoes. Apparently civil servants don’t wear jeans and kicks to work.

danni in situ

the end of something

This is my last day at Collabora.

It’s more than a little sad. I’ve been at Collabora now since the start of 2009. I’ve watched the company grow from something small into something impressive. Collabora is the company for open source consultancy. I’ve been to some great events and met some great people. Some of whom are now good friends. I am going to miss visiting Cambridge.

Leaving was a personal decision. I am a social person, and working from home for so many years has left me craving an office environment again. It’s weird to leave somewhere when you work from home. There’s no cake, you don’t pack up your desk.

I want to thank Collabora for all the conferences it has let me attend, and all the open source work it has let me do just because it was cool.

There is a next. First I am taking two weeks holiday in Beijing, where I will be visiting my bestie and helping her celebrate her birthday. After that I will be starting work on a foreign aid project with the Australian federal government.

I am planning on staying involved with GNOME, although I’m not sure in what capacity. Unfortunately I won’t make it to GUADEC this year. I’m doing so much other flying in July and August that the idea of a 30h flight to Spain makes me feel a little ill. I will be at Pycon AU and almost definitely at linux.conf.au, hopefully at GUADEC next year (I know, I said that last year).

I leave you with this photo of Kings College, taken out of the window of the old Collabora offices:

kings college

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.

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:

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.

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.

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._callback = callback;
  vfunc_create : function ()
    let button = new Button();
    button.connect('clicked', Lang.bind(this, function ()
    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._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. []

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.