You can now start translating Ubuntu Saucy on Launchpad.
Read moreA few years ago I wrote a contrib script for Launchpad’s launchpadlib called ‘close-my-bugs.py’ which attempted to close (aka mark them ‘fix released’) all of your bugs in a project that were targeted to a particular milestone.
For various reasons it grew out of date and when I needed to use it recently, it didn’t work! Long story short, I just fixed it up and added a couple of new features:
You can grab the code here:
bzr branch lp:launchpadlib contrib/close-my-bugs.py
There’s been a debate raging in some corners of the internet lately about how superior Go‘s error handling is to other languages. I am going to address some of the points made, here:
This is patently false. Take this example:
fmt.Println("Hello world")
Pretty innocuous wouldn’t you say? Well let’s take a look at the language documentation for fmt.Println:
// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...interface{}) (n int, err error)
So Println can return an error! Where did we check it? Well, we didn’t. Any other claims that it’s OK to ignore it in this case further strengthen my argument.
Some will say that it’s a deliberate choice to ignore the error and I deserve all I get. Well, was it? I didn’t even know that Println returned an error until I looked at the documentation (and who is going to do that for Println?). And that’s the point, if I need to look at the documentation to see that it can return an error, then if I am using a language that raises exceptions I will have also seen its documentation about how it deals with errors.
You could even argue that an exception is superior in this case. With Go, the code will march on regardless, oblivious to the fact that Println failed. With exceptions, it’ll fail and show you exactly where it failed.
The language will error at compile time if you try to ignore an error returned as a second value and you only take the first. But this is trivially bypassed by assigning it to _, which when reading code is easily missed compared to the exception style of “catching then dropping”, because Go itself encourages this style of assigning to _ with its own range statement as a deliberate way of ignoring things that the language is trying to force you to see.
So really in both cases, ignoring the error doesn’t really stand out as wrong.
Here’s a concrete example in Go I was recently shown:
w := bufio.NewWriter(os.Stdout)
for _, name := range ListAll(conf) {
fmt.Fprintln(w, name)
}
w.Flush()
return
As you can see, the caller completely forgot to check the error returned from Fprintln and Flush and there would be no compiler warning about it.
Citing an example where someone didn’t catch an exception and the code consequently blew up is really not a good example of this claim. It’s a bug, for sure and you get a full traceback of your error in the resulting exception, which is handy. You go away and fix it quickly based on that info.
If I am in the same situation with Go and I ignore a returned error from a function, at some point (which is likely to be nowhere near the place where the error occurred) my code will blow up. I’ll have to run up the debugger to try and find out where it really occurred though.
Because unused variables in Go are a compile-time error, it’s actively discouraging you from assigning the result of the function to a variable (or you can deal with it, of course). For anyone who’s not read the full documentation for a function call or missed its return value (we’re all human) as I said above – you’re not even going to notice that you missed it.
Based on this, I can see no difference at all that suggests one way or the other teaches developers to not care about errors. Developers do care about errors, really, but bugs creep in however careful you are. And when they do, I’d rather have a decent indication of where the bug is.
When you look at the average Go program, you will see a lot of this:
if err != nil {
return nil, err
}
This is the recommended way of error handling in in Go. But this is not error handling, it’s error propagation. In nearly all languages there will arise situations where in well-factored code you have a low-level error that you need to pass right back up to the entry point for the caller. That means you need this error propagation code in every single place where you check for errors. There’s no syntactic sugar, just the same three lines everywhere.
For me, this vastly decreases the readability of the code. This is where exceptions excel because inside my own library I can factor the bejeesus out of it into many small functions and if I need to return an error, I just catch a lower-level exception in the top-level function and return something else. You can do this in Go with a panic(), but it seems to be discouraged. Panic() feels almost exactly like using exceptions, only the syntax is worse. If Go’s style is to encourage people to handle errors like this, it needs the sugar.
Many people might think that I completely hate Go’s error handling from this post. That’s not strictly true – I don’t hate it, I just think it can be improved. I challenge assumptions that I see which state that Go’s error handling is superior in some way, when as far as I can see it’s not that different from other languages in terms of usefulness.
Go is clearly in its infancy. Most languages will have started out with youthful enthusiasm and realised that some change was needed. These languages are the successful ones where developers enjoy coding in it and feel productive. I hope that Go embraces change as it matures and attracts more developers.
I welcome comments on this post – unlike some people I won’t censor them or delete ones I can’t argue with (unless they are outright abusive and use foul language, this is a family blog!).
Welcome back! We've been away working in secret for awhile. Our work is open now, so our retrospective notes are too. Our current project is a web-based GUI for Juju. Juju lets you deploy connected services to the cloud in a convenient, vendor-neutral, and powerful way. The GUI lets you visualize and manage your work (see also another blog; a demo of our trunk, which is reset every 15 minutes
Read moreI am pleased to announce that our current development release, Ubuntu Precise, is now open for translation:
Translate Ubuntu!Some additional information that will be useful for translators:
Ubuntu 12.04 will be a Long Term Support release, so let’s rally around translations to provide the best translated OS around and go over the mark of nearly 40 languages in which Ubuntu is fully translated!
open image by loop_oh – License: CC by-nd 2.0
Read moreLaunchpad has been a key tool used in developing Novacut. I use Launchpad for code hosting, bug tracking, daily builds, and more. For almost two years I’ve been doing monthly stable releases on Launchpad, and Novacut now spans six separate Launchpad projects. To say the least, I’ve learned a lot about Launchpad in the process.
I don’t think Novacut could be where it is today without Launchpad, so I want to pass on some of what I’ve learned the past two years. Here are my five essential Launchpad best practices:
1. Daily Builds
I’m always very thankful that early on Paul Hummer took the time to school me on using Source Package Recipes to do daily builds. This Launchpad service gives you automated package builds across multiple architectures, and multiple Ubuntu releases.
I don’t know how to emphasize this enough, but seriously, you need daily builds. As a point of reference, daily builds are the 3rd item in the famed Joel Test.
These builds are triggered simply by making commits to the appropriate bzr branch on Launchpad (usually your trunk branch). You’ll automatically get up to one build per 24-hour period, and you can manually trigger additional builds when needed.
You can include your debian/ packaging directory in your project source tree, or you can keep debian/ in a separate bzr branch. For the Novacut components, I’ve found it most helpful to keep debian/ in the source trees because it’s handy to be able to land a code change and its corresponding packaging change in a single merge. This works for us because we currently can use the exact same debian/ for all the Ubuntu versions we support. If that’s not true for your project, you’ll need multiple debian/ branches.
For reference, here’s the Novacut Source Package Recipe.
2. Unit Tests
You should run your unit tests during your package builds, and you should fail the build when any unit test fails. This is particularly important for daily builds, because this will prevent a package with broken unit tests from reaching your daily PPA.
The Launchpad build servers are strict and unforgiving environments, which is a good thing when it comes to unit tests. The build servers are also probably quite different from your local development environment. On countless occasions our daily builds have caught failures that only occur on i386 (my workstation is amd64), or only occur on an Ubuntu release other than the one I’m running, etc.
To run your unit tests during the package build, you’ll need to modify your debian/rules file as appropriate. If you’re using debhelper, add an override_dh_auto_test target.
You might also need to add additional packages to the Build-Depends section of your debian/control file, packages that are needed by the unit tests but are otherwise not needed by the build itself.
For reference, here’s the debian/rules file used to run the Dmedia unit tests (which is also a handy Python3 example).
3. Track Ubuntu+1
When a new Ubuntu version opens up for development, I immediately start doing daily builds on the development version, even though I don’t typically upgrade my own computers till around 4 months into the cycle.
I use daily builds on the development release as an early warning system. With no extra effort on my part, these builds give me a heads-up about code or packaging changes that might be needed to make Novacut work well on the next Ubuntu release.
To enable daily builds on the next Ubuntu version, just go to your Source Package Recipe, click on “Distribution series”, and check the box for the newest series. Now you’ll have daily builds on the newest Ubuntu version, in addition to all the versions you were already building for.
For example, I’m currently in the process of enabling daily builds for Raring, as you can see in the Microfiber Source Package Recipe. And I did indeed encounter a build failure on Raring, seemingly caused by a debhelper issue.
For the first month or so in a cycle, I don’t tend to worry much about build failures on the development version. But after the dust has settled a bit, I make sure to keep the builds in working order, and I even do monthly stable releases for the Ubuntu development version. Again, I do all this pro-actively even before I personally start running the newest Ubuntu version.
4. PPAs & Users
Whenever someone asks me why I use Launchpad instead of github, my short answer is always, “PPAs and users”.
Source Package Recipes give you much more than just a build, they give you daily packages that are easily consumable by your testing community and early adopters. This tight feedback loop prevents you from running too far ahead without getting a good reality check from your target users.
Keep in mind that for some products, the early adopters willing to install from a PPA might not be all that representative of your target user. So when it comes to making design decisions, you might need to politely ignore certain feedback from some of these early adopters. In my experience, this wont cause any hard feelings as long as you have clearly communicated who your target user is, and why.
For reference, you might look at the way we’ve defined the Novacut target user.
I recommend creating PPA names that are well-branded and easy to remember. First, create a Launchpad team with the same name as your product. In our case, we have a ~novacut team. Second, I recommend creating a daily and a stable PPA owned by the same team. In our case, that gives us two easy to remember PPAs:
Although none of our target users (professional video editors) currently use Ubuntu to do their job, I’ve been surprised by how many follow Novacut’s development via our stable PPA, and even our daily PPA. This has helped keep us on track, and has helped us build customer loyalty even before we have a finished product.
For me personally, this daily user engagement also makes the design and development process more enjoyable. It’s hard to empathize with an abstract persona; it’s easier to solve specific problems for specific people.
5. Use Apport
Till recently I didn’t realize that you can use Apport for automated crash reporting in unofficial packages delivered through a PPA.
We haven’t had Apport integration for that long, but it’s already provided us with dozens of highly valuable crash reports. Almost immediately some hardware specific issues came to light and were fixed, convincing me that a key benefit of Apport is knowing how your app might misbehave on a larger, more variable pool of hardware.
Apport also helped some rare bugs come to light. I thought Dmedia was basically crash-free, but those one-in-a-thousand bugs pop out quickly when thousands of people are running it. Most of these bugs would have eventually been found by one of our core devs, but the quicker a bug is discovered, the quicker and easier the bug is to fix.
For more info, check out this blog post and this screencast, where I covered our Apport integration in detail.
And for reference, see the merge proposal that added Apport integration in Novacut.
A big thank you to Jason DeRose for sharing how his project uses Launchpad on a daily basis.
Read more
I have been analysing Launchpad’s critical bugs to track the Purple squad’s progress while on Launchpad maintenance duty. In January of 2011, the Cloud Engineering team né Launchpad Engineering team was reorganised into squads, where one or more squads would maintain Launchpad while other squads work on features. This change also aligned with a new found effort to enforce the zero-oops policy. The two maintenance squads had more than 332 critical bugs to close before we could consider adding features that the stakeholders and community wanted. By July 2011, the count dropped to its lowest point, 250 known critical bugs. Why did the count stop falling for fifteen months? Why is the count falling again?

The chart above needs some explanation to understand what is happening in Launchpad’s critical bugs over time. (You may want to open the image in a separate window to see everything in detail.) Each iteration is one week. The backlog represent the open critical bugs in launchpad at the start of the iteration. The future bugs are either bugs that are not discovered, not introduced, or reported and fixed within the iteration. The last group is crucial to understand the lines plotting the number of bugs fixed and added during the iteration. We strive to close critical bugs immediately. Most critical bugs are reported and fixed in a few days, so most bugs were not open long enough to be show up in the backlog. The number of bugs fixed must exceed the number added to make the backlog count fall. You can see that the maintenance squads have always been burning down the critical bugs, but if you are just watching the number of open bugs in Launchpad, you get the sense that the squads are running to just stand still.
I use the lp-milestone YUI widget to chart the bugs and analyse the our progress through the critical bugs. It allows me to summarise a set of bugs, or analyse a subset by bug tag.
Though 22 bugs were fixed this past week, 14 were added, thus the critical count dropped by 8. The last eight iterations are used to calculate the average bugs closed and open per iteration. The relative velocity (velocity – flux) is used to estimate the remaining number of days to drive the count to zero. When the Purple squad started maintenance on September 10th of 2012, the estimated days of effort was more than 1,200. In just three weeks, the number has fallen dramatically. The principle reason the backlog of critical bugs has fallen is that the Purple squad is now giving those bugs their full attention, but that generalisation is unsatisfactory.
I do not know the answer to my question. The critical backlog reached its all-time low of 250 bugs with the release of the Purple squad’s maintenance work in July 2011. There was supposition that Purple fixed the easy bugs, or that the fixes did not address the root cause, so another critical bug was opened. I disagree. The squad had no trouble finding easy bugs, and it too would have been fixing secondary bugs if the first fix was incomplete. I can tell you how the squad works on critical bugs, but not why it is successful.
I was surprised to see the Purple squad were still the top critical bug closers when it returned to maintenance after 15 months of feature work. How could that be? The squad fixed a lot of old timeout and JavaScript bugs in the last few months through systemic changes — enough to significantly affect the statistics. About 600 critical bugs were closed while Purple squad were on feature work. The squad closed 210 of those bugs. 60 were regressions that were fixed within the iteration, so they never showed up in the backlog. 70 critical bugs were fixed because they blocked the feature, and 80 critical bugs were because Purple was the only squad awake when the issue was reported. The 4 other squads fixed an average of 98 bugs each when they were on maintenance. The Purple squad fixed more bugs then maintenance squads on average even when they were not officially doing maintenance work. The data, charts, and analysis always includes the Purple squad.
I suspect the Purple squad has more familiarity with bugs in the critical backlog. They never stopped reading the critical bugs when they were on feature work. They saw opportunities to fix critical bugs while solving feature problems. I know some of the squad members are subscribed to all critical bugs and re-read them often. They triage and re-triage Launchpad bugs. This familiarity means that many bugs are ready to code — they know where the problem is and how to fix it before the work is assigned to them. They fixed many bugs in less than a day, often doing exactly what was suggested in the bug comments.
During the first week of their return to maintenance, about 30 critical bugs were discovered to be dupes of other bugs. Though this change does make the backlog count fall, it also revised all the data, so the chart is not showing these 30 bugs as at all now. The decline of backlog bugs does not include dupes. While the squad was familiar enough to find many bugs that they close in a single day, they were not so familiar as to have known that there were 30 duplicate bugs in the backlog when they started.
Most squad have only one person with DB access, but the Purple squad is blessed with 3 people who can test queries against production-level data. This could be a significant factor. It is nigh impossible to fix a timeout bug without proper database testing. Only 13 of the recent bugs closed were timeouts though. The access also helps plan proper fixes for other bugs as well, so maybe 20% of the fixed bugs can be attributed to database access.
Maybe the Purple squad are better maintenance engineers than other squads who work on maintenance. For 28 months, I was the leading bug closer working on Launchpad. I closed 3 times more bugs than the average Launchpad engineer. I am not a great engineer though. My “winning” streak came to a closed shortly after William Grant started working on Launchpad full time; he soundly trounced me over several months. Then he and I were put on the same squad and asked to fix critical bugs. Purple also had Jon Sackett, who was closing almost 2 times the number bugs than the other engineers. I don’t think I need to be humble on this matter. To use the vulgar, we rocked! Ian was the odd man on the Purple squad. He was the slowest bug closer, often going beyond our intended scope to fix an issue. Then Purple switched to feature work…Ian lept to the first rank while the rest of the squad struggled. Ian fixed almost double the number of Disclosure bugs than other squad members. The leading critical bug closer on the squad at the moment though is Steve Kowalik. This is his first time working on maintenance. His productivity has jumped since transitioning to maintenance.
I can only speculate as to why some engineers are better at maintenance, or can just close more bugs than others. A maintenance engineer must be familiar with the code and the rules that guide it. Feature engineers need to analyse issues and create new rules to guide code. I did not gradually become a leading bug closer, it happen in a single day when I realised while solving one issue that the code I was looking at was flawed, it certainly was causing a bug, I knew how to fix it, and with a few extra hours of extra effort, I could close two bugs in a single day. Closing bugs has always been easy since that moment.
I believe the Purple squad values certainty over severity and small scope over large scope when choosing which critical backlog bugs to fix. I created several charts that break the critical bugs into smaller categories. I suggested the squad burn down sub-categories of bugs like regressions, or 404s. The squad members are instead fixing bugs from the entire backlog. They are choosing bugs that they are certain they can fix in a few hours. I think the squad has tacitly agreed to fix bugs that are less than a day of effort. When this group is exhausted, they will fix issues that require days of effort, but also fix as many bugs. The last bugs to be fixed will be those that require many days to fix a single bug. Fixing the bugs with the highest certainty reduced our churn through the critical bugs, there are fewer to triage, to dupe, to get ready to code.
The Purple squad avoids doing feature-level design and effort to fix critical bugs. Feature-level efforts entail more risk, more planning, and much more time. There is often no guarantee, low certainty, that a feature will fix the issue. A faster change with higher certainty can fix the issue, but leaves cruft in the code that the engineers do not like. Choosing to do feature-level fixes when a more certain fix is available indicates there is tension between the Launchpad users who have a “critical” issue that stops them from using Launchpad, and the engineers who have a “high” issue maintaining mediocre code. I contend it is easier to do feature-level work when you are not interrupted with maintenance issues. When the Purple squad does choose to do feature-level work to fix a critical, they have a list of the bugs they expect to fix, and they cut scope when fixing a single bug delays the fix of the others. The Launchpad Answers email subsystem was re-written when other options were not viable, there we about 20 leading timeouts represented by 5 specific bugs to justify 10 days of effort to fix them.
Nothing that I have written explains why the Purple squad are better are closing critical bugs. All squads have roughly the same skills and make decisions like Purple. Maybe the issue is just a matter of degree. If the maintenance squad is not closing enough bugs to burn down the backlog, their time is consumed by triaging and duping new critical bug reports. Familiarity with Launchpad’s 1000′s of bugs is an advantage when triaging bugs and getting a bug ready to code. Being able to test queries yourself on a production-level database takes hours or days off the time needed to fix an issue. Familiarity with the code and the reasoning that guided it increases the certainty of success. The only domain that Purple is not comfortable working with is lp.translations; the squad is comfortable changing 90% of Launchpad’s code. There may be correlation between familiarity with code, and the facts that the squad members participated in the apocalypse that re-organised the code base, and that some have a LoC credit count in the 1000′s.
Read moreSummary: We're still hiring for openings in a very cool Python & cloud position, so please apply soon if you are interested! frankban landed a gigantic lpsetup branch to simplify code flow per discussions we've had lately in the squad (see last week's "topics" discussion about OO vs. functions, etc.). benji and gary_poster interviewed a lot. bac identified and worked on final changes before we
Read moreSummary: bac/gary_poster: re-reconsidering required pre-implementation calls gary_poster: postpone reviewing the collaboration feedback experiment? [introduction] [project report] (no tricks this week) [topics]Attendance: bac, benji, gary_poster. Apologies: frankban. bac/gary_poster: re-reconsidering required pre-implementation callsWe had a kanban card take more that 24 hours in an active lane,
Read moreSummary: gary_poster: reconciling staff unavailability with kanban work-in-progress (WIP) limits gary_poster: OO versus functions, inversion of control, and how much agreement is important gary_poster: More incremental success with our integration tests [introduction] [project report] (no tricks this week) [topics]gary_poster: reconciling staff unavailability with kanban work-in-progress (WIP)
Read moreSummary: A vacation kept one weekly report from being written, and another weekly meeting from happening. Welcome back! We're still hiring for openings in a very cool Python & cloud position, so please apply soon if you are interested! We are progressing pretty far along the process, though we have many more interviews to make. Interviews consumed gary_poster completely, and affected all of us
Read moreSummary: This was gmb's last week with us. Farewell from Yellow squad, and best wishes for leading Green squad! We're still hiring for five openings in a very cool Python & cloud position, so please apply soon! The interview process largely consumed 3/5 of the squad; next week it will affect 3/4 of us. We've had some good interviewees, and we hope to have more. We did not have as many test runs
Read moreSummary: bac: Don't use seteuid with bzr frankban: Using deb package recipes with Distribute-based Python packages frankban: os.path.expanduser uses $HOME to expand '~' frankban: In tests, use a temporary home plus a bzr whoami before bzr commit [introduction] [project report] [tricks] (no topics this week) This week the meeting was very short because we had an interview with a job candidate
Read moreSummary: benji/gary_poster: Different ways to keep Juju from forcing you to repeatedly accept SSH keys [introduction] [project report] [tricks] [topics]benji/gary_poster: Different ways to keep Juju from forcing you to repeatedly accept SSH keysJuju is a great tool, and this week we used it to develop some integration tests.We focused on external back ends (like EC2 and local OpenStack) rather
Read moreSummary: Parallel tests are running very well this week, with 37 successful runs in a row so far...even though we haven't changed anything. The parallel testing machines in the data center will reportedly be ready for us next week. The lpsetup code's refactoring is again at a usable milestone, and we are ready to test a new package of the code. The lpsetup code has its first integration test,
Read moreSummary: benji: Juju-based integration tests are a success for incremental value bac/gary_poster: Is it ever OK to knowingly check in broken code? gary_poster: Not meeting our weekly goals [introduction] [project report] [tricks] [topics]benji: Juju-based integration tests are a success for bringing value incrementallyWe chose to pursue integration tests of the lpsetup project as a timeboxed,
Read moreSummary: gary_poster/benji: Personal feedback loops bac/benji/gary_poster: Poorly specified tasks [introduction] [project report] [tricks] [topics] gary_poster/benji: Personal feedback loops We already have team feedback loops, in the form of weekly internal retrospectives and weekly external goals, deliveries, and reports. They help us identify when we need to evaluate and improve our
Read moreSummary: bac: manage your services together with their supporting infrastructure gmb: beware: Launchpad's ec2 command will sometimes silently break if your download cache doesn't have what you need. gary_poster/gmb: if you get a weird ec2 result, don't forget about ec2's postmortem option. [introduction] [project report] [tricks] [topics] bac: manage your services together with their
Read moreSummary: We made some good progress, but this week was not as successful as we had hoped. [introduction] [project report] [tricks] [topics] Weekly Goal Progress Continue running parallel tests on the EC2 32 core machine and aggregating results.COMPLETED. Our tests continued to be triggered only by three known bugs (974617/1011847, 1002820 and, apparently, a return of 1014916), though for some
Read moreWe’re offering a unique opportunity to take part in one of the most exciting changes to affect the technology industry: the move to the cloud.
As Technical Writer in Canonical’s Launchpad team you’ll find the best way to ensure that users and developers of our software understand its benefits and how to use it. Whether it’s traditional documentation, screen casts or blog posts, you’ll find it easy to choose the right medium and you’ll have all the skills necessary to produce compelling, involving and effective content.
You’ll thrive in a rapidly changing environment where you’ll be expected to grasp new concepts quickly, develop an intimate understanding of three or four products simultaneously and determine the day to day shape of your own work.
A skilled writer, you’ll excel at finding the right information from your research and then communicating it with a casual confidence that puts people at ease and, most importantly, leaves them with the understanding they need to be effective.
Reporting to the team’s Product Manager, you’ll work as part of a fun-loving, highly skilled, global development team who produce tools including Launchpad, MAAS and Bazaar. You’ll share our love of hard work and our passion for free software, Ubuntu and the cloud.
Key responsibilities and accountabilities
Desirable skills and experience
Apply online, if you have any questions drop by #launchpad
Read more
Latest Official Posts
Featured Blogs
People
You can't take the sky from me
Alex Chiang
allenap
allenap/maas
Amit Kucheria
Andres Rodriguez
Andrew Glen-Young
Ara Pulido
Barry Warsaw
Bazaar team
Bitácora de Vuelo
Bjoern Michaelsen
Björn Tillenius
Blogging in the Wind
Bofu Chen
Brad Figg
Brad Marshall
Brian Fromme
Canonical Blog
Canonical Design Blog
Canonical ISD
Canonical Marketing Team Blog
cat /dev/ursula
cat /dev/ursula
Certifiably (Brendan Donegan's Ubuntu Blog)
Chad Miller
Chris Halse Rogers
Chris Johnston
Christian Reis
Code Singer: Gary Poster's blog
Corey Goldberg
Daniel Holbach's blog
Danilo Segan
Darryl Weaver
David Henningsson
David Murphy
David Murphy
David Owen
David Planella
Distributed Teams
Gavin Panella
Graham Binns
Guilherme Salgado
Gustavo Niemeyer
How Bazaar
Iain Lane
Illruminations
Inert Ramblings
James Tait
James Westby
Jamie Strandboge
jedimike's adventures in typing
Jeremy Kerr
Joey Stanford
John Pugh
Jono Bacon
Jorge Castro
Julian Edwards
Julien Funk
JussiP
Ken VanDine
Keng-Yu Lin
kevin gunn
KyleN Ubuntu
KyleN Ubuntu
Landscape Blog
Launchpad Blog
Launchpad Blog
Lee Jones
Louis Bouchard
Manuel de la Pena
Marcin Juszkiewicz
Mark Shuttleworth
Martin Albisetti's blog
Martin Pitt
Matt Fischer
Michael Hall's Blog
Michael Hudson
Michael Terry
Multi-touch on Ubuntu
Not Lucky All The Time, But Smart Everyday…
Olli's random thoughts and impressions
person@CANONICAL-DESK
person@CANONICAL-DESK
Pixoul Photography
Prakash Advani
racarr's blog
racarrs blog!
RedVoodoo.org
Ricardo Salveti
Rick Harding
Robert Ancell
Robert Ayres
Ryan Finnie
S3hh
Scott Sweeny
Sean Feole
Shang Wu
Shuduo
Sidnei da Silva
sil2100//vx web-page
Smackerel of Opinion
Something driven development
Stéphane Graber
Steve George
Steve Langasek
Stuart Bishop
Stuart Metcalfe
Subcritical
Ted Gould
The Dowdberrys
The Orange Notebook
The Quality Hour
The Raving Rick
Timo Jyrinki
tvoss@work
Ubuntu App Developer Blog
Ubuntu Kernel Team Blog
Ubuntu One Blog
Ubuntu Server Team
Ubuntu Server Team
Ubuntu Server Team Blog
utlemming
utlemming's blog
Victor Palau's Blog
Wanderings of a Kernel Engineer
ZhengPeng Hou
~apw
Canonical Voices© 2010 Canonical Ltd. Ubuntu and Canonical are registered trademarks of Canonical Ltd.