Archive for the ‘Uncategorized’ Category
Owen just announced the formation of formal sysadmin team which I will be coordinating on an interim basis.
Want to join the team? Want to get your pet peeve fixed? Everything will unfold on the gnome-infrastructure mailing list, so sign up there if you want to get involved!
Tomorrow we move to Git! If I could offer you one piece of advice, git config would be it. Just a simple:
git config --global user.name "Your Name Comes Here" git config --global user.email firstname.lastname@example.org
on every new machine you use Git on. Otherwise the history is going to look like crap (look at the email address).
commit 9dea54aab2c97181f8d8c67a8cdce956baa30d05 Author: Gnome User <gnome@ubuntu-desktop.(none)> Date: Tue Apr 7 10:17:13 2009 +1200
That is all.
A few days ago I ran into the old shooting yourself in the foot with a programming language jokes. And then again a day later, it appeared in #vala. At some point today or yesterday I had a mishap with git history editing and have, umm, shot myself in the foot.
In your hands you hold a powerful sniper rifle. Those familiar with it consider it the most impressive and technologically advanced sniper rifle in the world. It is the quickest way to shoot, with bullets travelling at up to Mach 3. Multiple enemies are dead before a single shot is heard.
Impressed at your choice of sniper rifle, you reach to turn off the safety and realise that it doesn’t have one. You reach for the trigger, only to find it is not where you normally expect to find a trigger.
After seeking advice, you are advised to read about the internals of the sniper rifle (its manufacturers say that understanding how the sniper rifle is built is the only way to get the most out of a sniper rifle) you are ready. You start to shoot enemies and find yourself somewhat joyful at the amount of power you are wielding. You feel in control. You feel liberated. Pow pow pow. How did I get anything done before I had this beast?
All your friends, feeling left behind, get one too.
At some point you look down and you realise you shot your foot, a large chunk of it is now missing. Oh well, the pieces are still around if you look hard enough. Here’s a sewing kit.
Luckily I only lost 2 files, which were pretty much unchanged from master. The rest I think I can still get to just by splitting surviving commits. And just when I thought I was about to level up my git abilities too.
(Disclaimer: This is not a cry for help, nor is it a call for flaming, just an unfunny “OMG I SHOT MYSELF IN THE FOOT”).
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).
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
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):
Is it enough?
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:
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):
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)
>>> 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.
I lolled so hard. Thanks Rob.
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.
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.
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…