Planet Banshee: from the great minds of our community

July 02, 2009

See you in Gran Canaria!

Pounding a bowl of cereal. Almost time to leave for my flight!

On Sunday I'll be giving a talk about the UI Automation spec, and the work of the Mono Accessibility team. If you're an a11y nerd, or your day job is Winforms or Silverlight app development and you want to automate that shit on Windows and Linux, or you just don't believe that I am currently bearded and want to confirm for yourself, please check it out.

I'd also love to talk to people about Snowy, Free web services, GNOME's online desktop strategy, Batman, and the future of Tomboy.

Dark Victory is really good so far. Doesn't stand on its own...you need to read The Long Halloween first (and therefore should read Year One before that).

A few weeks ago I drafted a blog with updates on Snowy, and just ran out of time to finish it up and post it. But there is some basic info I want to share, so here's an updated excerpt:

We are really excited about all of the positive feedback we're hearing about Snowy, and the upcoming Tomboy Online service. We were reluctant to announce the project before we could confidently host it, but based on the excellent feedback and participation we've received so far, it's clear that we did the right thing by announcing early.

The day I blogged about Snowy, I left for San Diego to participate in my friends' wedding. When I returned on Monday, I had a lot of catching up to do! Here are some of the recent happenings:
  • Brad set up a Snowy mailing list, and a Snowy product in GNOME bugzilla.
  • Og Maciel has begun work on a virtual appliance for Snowy, and in the process of doing so has helped to unearth some bugs (our first mailing list activity). Thanks Og!
  • Ryan Paul of Ars Technica fame as written a great article about the current state of Snowy.
  • Rodrigo Moya and Stuart Langridge have continued to help us refine our REST API, as they work on implementing it for Ubuntu One. Stuart contributed patches to upgrade our authentication from HTTP basic to OAuth, and I finally pushed it upstream, along with corresponding support in Tomboy (based on some handy dandy code from Bojan Rajkovic). I am really grateful for their help!
  • We have our first localization! Thanks to Viatcheslav Ivanov for diving in.
  • The Midgard project has implemented our REST API as well, and intends to add support to Conboy (Tomboy ported to C on Maemo) as well.
This is all after less than a week of Snowy "going public"! This is an encouraging sign that we are on the right track with API design and modularity of implementation.

So that is my updated paste from the draft. The rest was all technical details on the design of the API, and how much Rodrigo, Stuart, and Brad all rock, etc etc. I'll post about that soon...for now I'm going to focus on getting a demo server up for you all to play with!

For those to whom I owe a drink, your day of reckoning approaches!

I should be packing

Tomorrow night at this time, thanks to the generosity of the GNOME Foundation which is sponsoring my travel, I will be on a flight (hopefully asleep) crossing the Atlantic. I’m heading to Europe for the first time to attend the Gran Canaria Desktop Summit. (My wife is fairly annoyed my first trip to Europe does not include her, but that’s another story).

A few of us from the GNOME Journal team will be there - if you have an idea for an article, interview, or a cool app to show off, please look me up. I’m very excited to meet face to face, and very thankful for the opportunity.

And now I need to go finish packing for my flight tomorrow afternoon.

Sponsored by the GNOME Foundation

July 01, 2009

GNOME Journal Issue 15 Released!

The GNOME Journal team is excited to announce the second release of 2009 of the GNOME Journal, Issue 15. Featuring six new articles, including three from first time GNOME Journal contributors, in this edition you will find:

Thank you to all of our authors for their articles in this issue, and to Stef and Lucas for their help editing.

Variance, Thy Name is Ambiguity

Previously
On This Blog...

"I love you, Generic Variance, and I want your babies RIGHT NOW!"

"I think there's something you should know about Generic Variance..."

"I can change him!"


And now, the thrilling continuation...

I've just sent my recommendation to the ECMA 335 committee regarding the generic variance problem. I present it here for your reading pleasure:


Quick Recap


The following is an example of an ambiguous circumstance involving generic variance, the very sort over which we have all lost so much sleep:

.class interface abstract I<+T> {
    .method public abstract virtual instance !T Foo ()
}

.class A {}
.class B extends A {}
.class C extends A {}

.class X implements I<class B>, I<class C> {
    .method virtual instance class B I[B].Foo () { .override I<class B>::Foo }
    .method virtual instance class C I[C].Foo () { .override I<class C>::Foo }
}

// Meanwhile, in some unsuspecting method...
I<A> i = new X ();
A a = i.Foo (); // AMBIGUITY!


Give a Runtime A Bone


To disambiguate such situations, we introduce a new custom attribute in the BCL. For the sake of example, let's call it System.PreferredImplementationAttribute. The PreferredImplementationAttribute is applied to a type and indicates which implementation should be selected by the runtime to resolve variance ambiguities. Our above definition of the type X would now look like this:

.class X implements I<class B>, I<class C> {
    .custom instance void System.PreferredImplementationAttribute::.ctor (class System.Type) = { type(I<class C>) }
    .method virtual instance class B I[B].Foo () { .override I<class B>::Foo }
    .method virtual instance class C I[C].Foo () { .override I<class C>::Foo }
}


New Rules


With the addition of this attribute, the runtime requires that any type defined in an assembly targeting the 335 5th edition runtime which implements multiple interfaces that are variants of a common generic interface MUST specify ONE AND ONLY ONE PerferredImplementationAttribute for EACH of the potentially ambiguous common interfaces, and that each such specification of a PerferredImplementationAttribute must reference an interface implemented by the type that is a legal variant of the ambiguous common interface. In other words, all possible ambiguities MUST be disambiguated by the use of PreferredImplementationAttribute custom attributes. If a type does not satisfy these rules, the runtime MUST throw a System.TypeLoadException.

As this rule only applies to assemblies targeting the new version of the runtime, old images will continue to execute without issue. If the committee prefers, the resolution of ambiguities in old types may remain unspecified, or alphabetical priority could be codified in the spec to standardize such behavior. I would be fine leaving it unspecified.


Custom Attributes vs. Metadata


Ideally, I feel disambiguation information belongs in the type metadata structure rather than a custom attribute. If the committee feels that amending the metadata specification is tenable, I would recommend doing so (though I don't have any thoughts at this time on the exact logical or physical nature of such an amendment). If, on the other hand, changing the metadata spec at this point in the game is not feasible, then a custom attribute will just have to do. I see the addition of one custom attribute type to the Base Class Library as entirely justified.


An Aside to Our Friends on the 334 Committee


As a note to language designers targeting the runtime, I personally would consider it obnoxious if developers where burdened with the manual application of such a custom attribute. C# and other languages would do well to prohibit the direct use of the custom attribute, favoring instead a special syntax to denote the preferred implementation (the "default" keyword comes to mind in the case of C#). If this committee changes the type metadata spec to include preferred implementation information (and does not introduce a custom attribute type for that purpose), then special language syntaxes will be necessary.


An Alternative


In the interest of completeness, I will describe an alternate (if similar) approach to the ambiguity resolution problem. Rather than annotate types to indicate which of their interface implementations will satisfy ambiguous calls, the preferred implementation could be denoted on a per-member basis. Referring again to our original type X, this solution would modify that type thusly:

.class X implements I<class B>, I<class C> {
    .method virtual instance class B I[B].Foo () { .override I<class B>::Foo }
    .method virtual instance class C I[C].Foo () {
        .override I<class C>::Foo
        .custom instance void System.PreferredImplementationAttribute::.ctor ()
    }
}

The member I[C].Foo is annotated with the System.PreferredImplementationAttribute, indicating that it will be selected by the runtime to fulfill otherwise ambiguous calls to I<T>.Foo. Note that in this solution the constructor to the PerferredImplementationAttribute type is parameterless. The runtime ensures that for EACH of the members of an interface which is the common variant of two or more of the interfaces implemented by a type, ONE AND ONLY ONE of the implementations for that member is flagged as "preferred."

Per-member preference definition affords developers more control but costs runtime implementers time, effort, and simplicity. I also don't envision many scenarios when developers would desire per-member control over implementation preference. I personally find this approach less tasteful than the per-interface solution but I mention it here, as I said, for completeness.


One More Thing...


There remains a situation on which there are varied opinions:

.class interface abstract I<+T> {
    .method public abstract virtual instance !T Foo ()
}

.class A {}
.class B extends A {}

.class X implements I<class A> {
    .method virtual instance class A I[A].Foo () { .override I<class A>::Foo }
}

.class Y extends X implements I<class B> {
    .method virtual instance class B I[B].Foo () { .override I<class B>::Foo }
}

// Meanwhile, in some unsuspecting method...
I<A> i = new Y ();
A a = i.Foo ();

In this situation I<A>::Foo is called on an object of type Y. There is an implementation of I<A>::Foo in Y's type hierarchy (X::I[A].Foo), but there is also an available implementation which is a legal variant of I<A> in Y itself (Y:I[B].Foo). Does the runtime favor the exact implementation, or the more derived variant implementation? I don't have strong feelings on the matter, but my slight preference is for favoring the exact implementation.

The runtime is deciding on behalf of the developer which implementation is most appropriate. It could be argued that an exact implementation, wherever it is to be found the type hierarchy, is more appropriate than a variant implementation.

Also - and this is an implementation detail which should not outweigh other considerations but may be useful to keep in mind if all other things are equal - Mono stores a type's implemented interfaces in a binary tree, meaning that finding an exact implementation is an O(log n) worst-case operation, whereas finding a legal variant interface among a type's implemented interfaces is an O(n) worst-case operation (all interfaces must be examined to see if a legal variant exists among them). I haven't heard of any way to do O(log n) (or better) lookup of variants. With such popular types as IEnumerable`1 becoming variant, the superior time complexity could make a difference.

June 29, 2009

Mono.Nat 1.0.2

I just tagged and released Mono.Nat 1.0.2 . It's a fairly minor bugfix release which addresses a number of minor issues:
  • Added workaround for certain versions of miniupnpd which incorrectly advertise their available services (bug has been reported upstream)
  • Fixed some other minor issues with routers reporting incorrect services.
  • Added extra API to make it easy to log the full handshake/request process to help diagnose issues
  • Stopping and Starting discovery will rediscover all available devices correctly
  • Full support for computers with multiple network cards on multiple subnets
  • Rewrote the internals to ensure that the asynchronous API is 100% asychronous - prevents calls to BeginXXX blocking on some slower routers.
Precompiled binaries and sourcecode can be downloaded here and packages will soon be winding their way to a repository near you.

If you want to forward ports automagically on a upnp empowered router near you, this is the library for you!

Office fail

One of the better fails I’ve seen from MS Office:

June 28, 2009

The Pledge

I believe Free Software developers should be free to work without their work being compared to terminal illness [0][1]

I believe Free Software developers should be free to pick and choose their development tools [2][3]

I believe Free Software developers should be free to contribute without being threatened with eviction from a community [4][5]

I believe Free Software thrives on diversity, and that there should always be a choice [6][7]

I believe we should welcome ALL developers, from any community, in helping to contribute towards Free Software [8][9]

I believe Free Software is about freedom – for both users and developers [10][11]

I believe that our priorities are our users and Free Software – meaning we should always strive to present our users with the very best Free Software has to offer [12][13]

Do you?

June 27, 2009

June 26, 2009

Join the GNOME Marketing Team!

The American Marketing Association defines marketing as:

Marketing is the activity, set of institutions, and processes for creating, communicating, delivering, and exchanging offerings that have value for customers, clients, partners, and society at large.

I don’t think there is a question that GNOME has value for customers, clients, partners and society at large.

It’s our job to shout about that value from the rooftops, far and wide.

Right now though, we need to focus on the first part of that sentence:

Marketing is the activity, set of institutions, and processes…

Now is a great time to join the GNOME Marketing team. We’re getting organized, including organizing sub-teams, revamping our team member page (add your name!), updating the tasks we want to accomplish (don’t click that yet, we are still migrating our content!), and beginning to define the messages we want to communicate, and how we will communicate them.

I strongly believe that GNOME 3.0 offers us a unique opportunity for marketing GNOME, first to our current users about the changes coming, and to even more audiences about the benefits of GNOME, including developers, GNOME Mobile, and non-GNOME users.

We need volunteers who are passionate about communicating the benefits of GNOME. We need writers, editors, art designers, researchers, speakers, event organizers, project managers and more.

We need you. Join the mailing list or sign up on our wiki. Let’s tell the world about GNOME.

June 24, 2009

Jolicloud + Do bring the awesome

I’ve yet to really blog about what I’ve been doing this summer, not because it’s been top secret, mostly because I’m lazy and have been incredibly busy. I started off at UDS in Barcelona, thanks to Canonical. UDS was a blast, we got a lot done, and I can’t wait to see how Karmic turns out.

So what have I been up to since UDS? Well, I got stuck in Barcelona for a few days more than I had expected, which although expensive, was a lot of fun. I met a bunch of cool dudes from Canada (If you read this get in touch! Haven’t been able to find you guys on facebook!), and some other sweet people. Good stuff. Since then I’ve been in Paris, where I’m working for Jolicloud, where I’m putting my self-described usability expertise to good use. I’ve learned a bit of ruby, done some C, some Python, but mostly I’ve been working on making Do kick absolute ass on JoliCloud. Want to see what I’ve been up to? Check out this short screencast I made demonstrating the awesome. This stuff is a work in progress, and although I’m moving quickly some of this is brand new so expect to see some changes before the final release.


Or, if you’re getting this via a feed reader, here’s the link to YouTube.

Docs Team Meetings

The Docs team is having two meetings in the next week - a community Q&A session tomorrow, and a project meeting this Sunday. More details on our shiny new blog at http://blogs.gnome.org/docs/2009/06/24/upcoming-documentation-june-meetings/ (Thanks Olav for adding us to news.gnome.org!)

Speaking of our shiny new blog, does anyone know how to add additional authors to a blog on blogs.gnome.org? I haven’t been able to figure it out and I’d like to add Shaun. Is it a setting that’s right under my nose and I just don’t see it? Thanks!

June 23, 2009

GNOME Docs Hackfest Part II

Day three of the Writing Open Source conference was our hackfest. I previously showed off Milo’s work in Part I, but it’s probably best to start at the beginning.

We started day three by applying some of what we had learned over the first two days. When writing, especially documentation, it is best to plan your work. This includes knowing your audience, their personas, and understanding their needs.

Lynda Chiotti, with help from Janet Swisher, led us through a brainstorming exercise. Using a mind mapping tool, we brainstormed what users want to do (and might need help with) when using their computer.

This was important for a few different reasons. For GNOME 3.0, we want to re-write the GNOME User Guide as topic based help using Mallard. Re-creating might be a better word, as we are going to switch licenses from the GFDL to CC-SA 3.0, and it’s probably easier to re-write it from scratch than to contact all the previous authors over the years to get permission. More importantly, we need to think like our users. How many times do we, as GNOME power users and developers, talk to ourselves, and not think like the average computer user? If this user needs help, does our documentation help them? Do they get frustrated and stop using GNOME or GNOME applications? We have a unique opportunity to use both our tools and the launch of GNOME 3.0 to radically improve our documentation and help our users.

After that, Phil, Milo, Shaun and I spent some time talking about how we could improve the GNOME Documentation Project. There were no sacred cows, and we’ve launched an effort to overhaul the docs team, including:

  • Adding simple tasks that new contributors can do and then build on (thanks Emma!)
  • Focusing the docs team on writers, editors, and translators. Each perform different, but similar roles, including crossover. We need to improve our tools for each team, and communication.
  • Holding more regular meetings, including a monthly project meeting, and weekly community sessions to encourage participation
  • Developing a roadmap of tasks we want to accomplish, including both the documentation itself and the tools
  • Understanding Shaun’s role as our fearless documentation project leader, and how we can help him to free him up and not having the team be blocked on any one person.
  • Make a significant effort to coordinate with downstream distributions, including meetings and communication, introducing Mallard, and better comments within documentation.

And that’s just the recap! Our wiki space is going through a revamp as we bring this to life, and there is a lot more to come.

Lastly, while Phil and Milo started hacking on Empathy docs using Mallard, I jumped into Bugzilla. Almost half of our open bugs in gnome-user-docs were touched (36 of 80), and of those 36, 23 were closed. Finally, 16 commits were made to update the current User Guide, including reviewing and patches from contributors. Fun fact (or embarrassing) - the oldest bug fixed was from July, 2006.

Overall, woscon was an amazing experience, and we all learned a lot. A few years from now, we’ll be able to look back and say: “We were there when this began”.

I think I speak for all of the GNOME Docs team members who were there, including Phil, Milo, and Shaun when I say we are sincerely thankful for the GNOME Foundation’s sponsorship of our travel to the Writing Open Source conference. This conference was the brain child of Emma Jane Hogbin, and we are very grateful for all the time and effort she put in to organizing and hosting woscon.

June 22, 2009

GSoC Week 4: The Tubes are Alive!

Awesome week! Just yesterday, my mentor and I opened up a transatlantic tube and exchanged our Banshee music libraries! Very cool seeing it in action over the Internet. So, I accompished what I wanted to this week and got the data delivering asynchronously without blocking either the producer or consumer's UI. Banshee will display tracks to the user as the download progresses. I've also got playlists coming across too. Screencast:






Other happenings:
Found a bug, confirmed the bug in #telepathy, and reported it.

Also, I found out that Empathy is soon to be ported to Misson Control 5 (MC5). Maybe around GUADEC time. So, this brings a dilemma to my project. See below for a Q and A style explanation.

Q: Why is MC5 important to my SoC project?

A: Because the next release of Empathy is going to depend on it, and MC4 is basically being thrown out. No backwards compatibility.

Q: What is the minimum amount of work required to get this project working with MC5?

A:
1) Port connection detection (ie. ConnectionLocator class) from MC4 API to MC5.

2) Port presence setting code (ie. Announcer class) from MC4 API to MC5.

3) Use the Empathy TubeHandler hack (register an object by dbus name org.gnome.Empathy.DTubeHandler.myservice) to tell MC5 that Empathy is handling the tube.

Q: What about the rest of the project's code?

A:
1) Leave the rest of the code as is (with minor tweaks, I'm sure), as I'm pretty sure it will still work.

2) Port the code to use the org.freedesktop.Telepathy.Client interface MC5 provides.

Q: If we have option 1), then why port anything?

A: I am using a bit of a hack, at the moment, for advertising the Banshee music sharing tube service.

The Telepathy API provides a method called SetSelfCapabilities on the ContactCapabilities interface which is kind of weird to work with without MC5. For example, to add a new tube service, the existing services have to be queried, saved, merged with the new service, and then sent to the SetSelfCapabilities method. To remove the new service, the existing services must be queried, saved, our service must be removed from the existing services, and then sent to the method. So, in other words, the method does a replace and not an add/remove operation. MC5 provides a higher level layer that does all this extra work. However, it is quite a bit of work to use that "extra layer." ie. port project code to use the org.freedesktop.Telepathy.Client interface. On the other hand, my hack introduces a race condition where the capabilities could change during the process.

I've posted on the telepathy mailing list about this MC5 stuff and have already received some helpful replies.

So, I'll have to discuss all this with my mentor and decide on our course of action. To add to the TODO list, I may still tweak my playlist provider, I've got some GUI bits to work on and after that I'll probably start playing with file transfers.

June 19, 2009

GNOME Docs Hackfest (Part I)

dsc02277.jpg

(A duck at Inglis Falls, in Owen Sound, Ontario, home of woscon09. If only it had been a mallard…)

Milo Casagrande, who attended woscon09 with the GNOME Docs team last week, has written an introduction to Mallard.

Milo and Phil spent Sunday’s hackfest creating the first Mallard document for use as a help file within an application. We chose Empathy, for a few different reasons, including: it will be in GNOME in 2.28; the current documentation is not completed; we want to re-license it from GFDL to CC BY-SA 3.0 and Milo and one other collaborator were the only ones who had worked on it previously (though we fulfill our obligations in re-licensing by the exercise below).

Using the information we learned Friday and Saturday, we spent time planning the document and brainstorming what users want a messaging application to do, and what questions they might have: “How do I….?”.

From there, and with great gusto, Phil and Milo spent the sprint creating a proof of concept help file for Empathy. Not only is it written in Mallard, which can dynamically link the pages, we are focusing on creating topic based help, rather than tasks that take a user step by step in performing an action. Phil and Milo will probably have words with me, but you can follow along on the empathy-mallard branch in Gitorious.

You will need Yelp 2.27.1 and gnome-doc-utils 0.17.1 to see a Mallard doc in Yelp. And now I have to go figure out why Yelp isn’t cooperating with me.

June 18, 2009

The Twitpocolypse! Do plugin updated

The other day Twitter status IDs overflowed, and as such the GNOME Do plugin was broken. Maybe this kind of thing is why people should use identi.ca? I know I’m a hypocrite and use Twitter, but maybe I’ll switch someday, now that most of my friends have stopped using it in general. Anyway, I just wanted to let everyone know that this is fixed in bzr, and we’ve pushed an update to jaunty proposed. If you’re getting annoyed at Do telling you that your post failed when really it didn’t, please enable the proposed repository and comment on this bug saying that it works for you. https://bugs.launchpad.net/do-plugins/+bug/387525. Instructions for testing are in the bug report. Thanks!

Banshee Documentation

One of the things I learned last weekend at woscon09, was the importance of planning when beginning to write documentation.

With that in mind, and the GNOME Documentation Project’s focus on moving to topic based documentation, the goal of writing docs for Banshee is to answer the question “How do I…?” for users.

So let’s kick off writing the first ever integrated help file for Banshee!

Knowing that, have you come across any forum posts, blog posts, information on a wiki, or howto’s about Banshee? Do you know a trick or tip about Banshee most people might not know? You needn’t have written it, I’m just looking for links. If you have some to share, please leave a comment on my blog. (I have an over-aggressive spam filter, but I’ll be actively monitoring it).

I’ve brainstormed my own topics for user help, and have the start of a table of contents, but I’d love this to be a community effort. As I see good information out in the community, my goal is to contact the author and see if they’re willing to help with Banshee docs. The Banshee documentation will be one of the first help documents in GNOME to move to a CC-SA 3.0 license, and if the authors want to help, that’s the only requirement. CC-SA 3.0 automatically gives attribution as well.

My last goal is to write the Banshee docs in Mallard, now that support support for Mallard is in GNOME 2.27. And if you want to help, don’t be intimated by that! We’ll do the markup for you if you’re new to GNOME docs and have good information to share!

I’ve started a docs branch on the Banshee repository on Gitorious which is where active development will take place.

And speaking of attribution, I can’t take credit for this idea. A big thank you to Emma at woscon09 last weekend for encouraging me to get the community involved.

So what topics do you think should be in the Banshee help file? What information about Banshee have you come across on the internet that should be shared with other users?

June 17, 2009

Docs Team & Community

dsc02267.jpg

(The Ginger Press Cafe where the work, talk and laughter happened at woscon09)

One of the most important take-aways for me personally from woscon09 were the talks on community. This included Addy’s keynote Friday on herding cats, the challenges that spanned all of our groups, discussion around upstream to downstream and back again, and encouraging new volunteers.

With that in mind, we’re making some changes to the Docs team to improve our community involvement.

Last night, Shaun sent an email to the list detailing some of the changes, including:

  • Community Management
  • Editorial assistance
  • Reviews
  • Upstreaming downstream

And, of course, we are all responsible for writing.

With that said, I’ve spent some time over the last day or two re-organizing our wiki, and have put together a stub of a page around Community.

We will be having our first Q&A session this week, starting tomorrow night at 9 p.m. CST (2:00 a.m. UTC). We are committed to having these meetings, and moving the day and times around to get as much representation worldwide as we can.

The theme of tomorrow’s meeting is a recap of what we learned at woscon09. However, please bring any questions. Want to know how to get involved? What to write? How to use bugzilla? This is an open session, and more than anything, it’s to let folks know that we will be in IRC at a given time to answer any question (within reason). Stop by #docs on GIMPnet IRC tomorrow night!

We’ve also started a Docs Team blog where we will be posting meeting announcements, recaps, and other important information that we wish to share with the community.

Have you ever wanted to help out? Feel you can write technical documentation? Have above average grammar and spelling and want to edit? Translate our docs? Now is the time to get involved. We have lots of exciting things planned for this year, and this is just the tip of the iceberg.