git-mirrror - making it suck less

August 22nd, 2008 by John Carr

Federico notes of a change that every single git-mirror user needs to make to every one of their clones to have its tags stay up to date properly. So, dear lazyweb, my question is simply this: How can I (as git-mirror guy) make this annoying git-foo go away? I hate stupid crazy repetitive manual crap that every one of my users has to put up with !

You can see how the mirrors are currently created and updated in the vcs-mirror repository. To share in my vodka and whisky spoils for setting up git-mirror (which, despite idle threats to the contrary, i’m still waiting for) your solution should not disturb existing clones….

(And yes, that is a hg script you see).

A Revelation

August 19th, 2008 by John Carr

After a long talk with a friend, I felt the need to dig out an old quote that I’m particularly fond of. For my own future reference:

“I’d like to share a revelation that I’ve had during my time here. It came to me when I tried to classify your species. I realized that you’re not actually mammals. Every mammal on this planet instinctively develops a natural equilibrium with the surrounding environment, but you humans do not. You move to an area, and you multiply, and multiply, until every natural resource is consumed. The only way you can survive is to spread to another area. There is another organism on this planet that follows the same pattern. A virus. Human beings are a disease, a cancer of this planet, you are a plague, and we are the cure.” — Agent Smith

Thank you :-)

August 14th, 2008 by John Carr

Yesterday I received some post. How is this blog worthy? Well after LRL, I was approached by people offering me test devices for adding Conduit support. Gareth Qually has donated a Handspring Treo 90 and John Connelly has loaned a Tungsten T3 and a Treo 650. All of the devices arrived yesterday and are now sat on my desk. How awesome are these guys! *Happy Dance*

A little closer to home (well, office), Rob Taylor got a new phone and donated his old M600i.

At the moment this means my pile of dedicated test devices looks like this:

  • Sony Ericsson P900
  • Sony Ericsson M600i
  • Dell Axim X5
  • Orange SPV C500
  • Palm Tungsten T3
  • Handspring Treo 90
  • Treo 650

I also have a Nokia 3310, but i’m not sure I can even connect it to my PC…

I also have ad-hoc access to Rob’s new phone, as well as my own SPV E650, Nokia N810 and iPod video. These are in regular use so won’t find themselves strapped to the Conduit test suite any time soon (but it does mean that some of this stuff will get tested by ‘users’ too :-))

Fun times ahead getting all this stuff to work :-)

Conduit and Accessibility

August 4th, 2008 by John Carr

This blog post is a friendly note to application maintainers out there to think carefully about how accessible your software is, especially when using non-standard widgets or canvases. Accessibility is important and it can also be hard. So think about it early and think about it often. Below are some notes from in the trenches, and if you think about a11y from the beginning things won’t end up this way for you.

One issue to rise out of the current module proposal discussion is Conduit and its accessibility. In order to be a good GNOME application, Conduit needs to be accessible. The use of a canvas to render shiny goodness manually means that we sacrifice lots of ready made accessibility.

Conduit has two major issues on the accessibility front. Can I control it without using a mouse? And can I tell what is happening when i’m using a screen reader? Sadly, the current answer is no and no. Having decided to change this, I’ve spent the weekend looking at how to pass more useful information to the accessibility infrastructure.

We use GooCanvas, which is actually already accessible. Each item that is added to the canvas is available to accessibility tools, be it a raw canvas item or a gtk widget. Basic information such as its size and position is exposed without any effort on the part of the application author. Whilst experimenting, I have hit the following limitations:

1. Without implementing more ATK interfaces, the only Conduit relevant information I can expose is a name and a description for each object. Its not easy to implement new interfaces without throwing away the existing interface. This is really quite limiting, and I don’t think it will make for a good enough user experience. (I don’t consider this a GooCanvas bug, but instead something that Conduit needs to fix on its own).

2. GooCanvas doesn’t seem to implement the children-changed signal. In testing this has meant that accerciser is unaware of changes on the canvas, and i’ve needed to keep restarting accerciser.

So GooCanvas needs a patch to fix children-changed. Lets defer that to later, i’ll look at it early in the next cycle. For now I need to work on fixing Conduit. Hopefully I can derive from the existing Goocanvas ATK objects and extend, as opposed to rewriting it all. Sadly not, the GooCanvas accessibility code isn’t available from python, so I need to re-implement everything. Again, potential patch to pygoocanvas deferred to early next cycle.

From reading the Devhelp for ATK, it seems that I just need to implement an atk.Object (and assorted interfaces) and an atk.ObjectFactory for each accessible GObject I want to have. So how do I implement an interface in python? My initial thought was that I would just have to derive from them:

>>> import gobject
>>> import atk
>>> class Foo(atk.Object, atk.Component):
...    def some_method(self, param):
...        pass
...

Is it enough?

>>> gobject.type_interfaces(Foo)
[]

GObject doesn’t seem to know that I want to implement an interface. So my code is not enough. After poking this for some time it turns out there are two fundamental pieces of fail with my first attempt.

At some point, pygtk claimed to automatically register things for me. In this case, maybe more generally, this is not the case. I need to register my class with the GObject type system:

>>> gobject.type_register(Foo)
>>> gobject.type_interfaces(Foo)
[<GType AtkComponent (136469760)>]

Victory! At this point I was hoping my code would spring to life, but it didn’t. Poke, poke, poke. When overriding a GObject method from python or implementing an interface you need a do_ prefix. Presumably this is to make the introspection foo a little less scary. So I needed:

>>> class Foo(atk.Object, atk.Component):
>>>    def do_some_method(self, param):
>>>       pass

Once you have implemented your accessible object, you need an accessible object factory, and you need to register it with the default ATK registry. I’m leaving some bits out here, but basically:

>>> class FooFactory(atk.ObjectFactory):
...     def do_create_accessible(self, obj):
...         return Foo(obj)
...
>>> gobject.type_register(FooFactory)
>>> atk.get_default_registry().set_factory_type(GooFoo, FooFactory)

Now when ATK encounters a GooFoo object it should ask FooFactory for an accessible version of it. It will get a new Foo object.

Unfortunately this is not what happens. !”£$. A new FooFactory is instanced, and then a GCritical fires, because create_accessible isn’t happening and something is then trying to ref a null. Sigh. Epic Fail. After examining pygtk, it turns out that the create_accessible method of atk is blacklisted when bindings are generated. I unblacklisted it and encountered a nice compile error. If you poke around (or ask Rob), you’ll see that create_accessible is defined without a self, its essentially a @staticmethod. This is an edge case that the code generator doesn’t currently handle, and the wrapper ends up trying to pass too many arguments. So now I need to figure out a suitable patch for pyatk (or the code generator) before I can continue…

Big thanks to Rob for helping me with this so far, your big chunk of clue has been most welcome. You can has beer.

The blinding past

July 25th, 2008 by John Carr

I lolled so hard. Thanks Rob.

Syncing my phone, its actually easy

July 25th, 2008 by John Carr

A few days ago, I saw a blog post highlighting how difficult it can be to sync a phone on the free desktop. For a battle hardened command line user, the steps aren’t that troubling (although that example looks easy compared to some of the setups i’ve seen). Regardless, I certainly wouldn’t want to put my parents through this experience.

In contrast, after a recent mishap with my phone, restoring its address book from Evolution was trivial with the copy of Conduit SVN I had kicking around.
Conduit and WM6

I started Conduit and plugged in my phone. It appeared on the left hand side of the screen, so I dragged it and the Evolution endpoints to the canvas, and I did a sync. My address book is back.

There is more UI love to go of course. SynCE automagicness is getting there, but we can make it even better. Plus, we love HAL, and the next step is to respond to new devices and say “Hey, I know how to deal with that thingy you just plugged in” and offer to sync to some sensible defaults (Evolution for PIM stuff, Tomboy for Notes, F-Spot for Photos, Banshee/Rhythmbox for Music). And of course, the next time I plug it in.. Just sync it. Never make me press the sync button again.

The blinding future is to use PackageKit to download extra support packages like SynCE and libgpod as needed, when you plug in the device.

Awesome Closing Party

July 13th, 2008 by John Carr

I still have Google Beer tokens (8 or so) lying around. And to my wrist are fastened 2 Electronica festival istanbul 2008 tags. Win.

Now to pack for home…

GUADEC Boat Party

July 11th, 2008 by John Carr

I cannot remember after a certain hour. If you can help fill in my memory, please say hi.

83% of statistics are made up on the spot

July 7th, 2008 by John Carr

Got up early for some healthy debate on the differences between Bazaar and Git at the DVCS Bof. Maybe the slot was changed when I wasn’t looking, but it turned into a “introduction to Git and Gitorious” presentation, with a packed audience. For a session meant to focus on DVCS in general, and how GNOME can move from SVN to $DVCS, it was a bit of a shame. BUT THEN…

There was a second smaller talk on DVCS that was slightly more productive. Neither side has managed to provide an action plan so far. When the Bazaar and the Git advocates can come to GNOME and say “we have a plan, this is how we are migrating and this is how we are going to fix all the systems that depend on GNOME”.. then we can talk. This whole issue needs some JFDI - we can’t cry/shout until our DVCS is picked, and then expect the sysadmins to take care of it.

On a lighter note, got some swag. Quite happy with the laptop bag, and the T-shirt is quite nice. Doesn’t match the codethink t-shirts though ;)

Now back to cleaning up the Git code so Rob doesn’t harm me.

Off To GUADEC

July 5th, 2008 by John Carr

Setting off for the airport soon. I arrive with codethink somewhere around 2AM local time on Sunday.

Looking forward to seeing John Stowers and maybe getting some Conduit hacking done. It would be cool to see some of the build brigade people and see if we can get build.gnome.org running the newest buildbot code, with a single master (instead of one per project). Theres a chance i’ll have to talk about libgitcore, and the joys horrors of Git coding. Oh and the scary DVCS discussion. It will be interesting to see who wears both a “I use Bazaar lots” *and* a “I use Git lots” badge.

And I heard something about whisky…

If there are any veggies or vegans coming, be sure to poke me and say hi, we can go track down some carrots together :-) Jc2k on IRC, or comment here. Failing that, look out for codethink t-shirts - I won’t be far away.


Bad Behavior has blocked 84 access attempts in the last 7 days.