Canonical Voices

Posts tagged with 'desktop'


When I started out on my Open Source adventure, my desktop looked like this:

Today, it looks like this:


That is all.

Read more

Just a quick note: the PyJunior code is up on Launchpad. Please remember: I wrote this in about two hours and haven’t had any time to clean it up. So, expect warts and all. :-)

The Open Sourcerer pointed me at Snake Wrangling for Kids as a great kid-friendly guide for learning Python. My dream now is that when a kid clicks the big Help button in PyJunior, that the book pops up in native GNOME help format. Problem is: I have absolutely no idea how to convert Snake Wrangling for Kids (which is available in LaTeX and PDF format) into this help format, and don’t really have any time to contribute to this either.

So, I am looking for help. PyJunior provides a simple and effective of way of playing with Python for kids, but we really need the documentation to make this story rock. Is there anyone out there who would like to work on this and make clicking that Help button a fantastic experience for kids interested in learning programming? I really hope so: this could be a wonderful learning tool for ankle-biters everywhere. :-)

If you are interested in helping, do let me know in the comments on this blog entry and we can talk more. If you just want to crack on and make the docs love happen, do feel free to go ahead and submit a merge proposal when you have something.

To do those who help, thanks so much in advance! :-)

Read more

Yesterday I started using Evolution instead of Thunderbird 3 in Lucid, and I justed wanted to tell the Evo team that they have done a wonderful job. I stopped using Evo due to performance problems, but many of those issues seem to have gone. I am really enjoying my use of it. I don’t think the Evo team get enough credit for their incredible and hard work on it, so I just wanted to share some public kudos. Thanks, folks!

Read more

Yesterday, Pete Graner, leader of the Ubuntu Kernel Team asked me a question:

Is it possible to route audio from one application into another as an input. As an example, if on a video or audio chat in Empathy, is it possible to route the output of Rhythmbox or Totem into the input for Empathy so the person you are talking to can hear the music?

I had no idea, but I said I would blog it on Planet GNOME to see if this exists. And so, here is my blog. Thoughts?

Read more

Recently I blogged about how we are keen to improve patch review in Ubuntu in the 10.10 cycle. Today we are in a position where we have a large collection of fantastic contributions that need reviewing, even if that review feedback is that the patch no longer applies and needs work.

I believe part of the problem here is that reviewing patches is just too hard. At the Ubuntu Global Jam on Friday I was talking this through with a few people and I started drilling on the idea of a desktop tool that improves viability on patch contributions and automates much of the work involved. I believe this tool could greatly open up the world of patch review to more people.

This morning I decided to formulate my thoughts a little better and draw up some mock-ups of a the app which I am nicknaming Mergimus. Unfortunately, I don’t have the time to commit to writing this app, so I wanted to blog the design as an opportunity to kick off some discussion and to maybe inspire some of you good folks to pick up the design and start building it. Let me explain my thinking…

The basic idea with Mergimus is that you are often interested in and have a core competency and awareness of specific projects and you want viability on the patches and merge proposals that are part of those projects. When you fire up Mergimus you would see the patch view screen:

In the left box is a treeview with a list of projects that you are interested in: each of these are source packages in Ubuntu. You can add a new project to the list by clicking the button underneath the tree view and a dialog box will pop up where you can enter a project name, and a list of matching projects will appear, and when you double click one it will add it to the main treeview.

When you click on a project, the box to the right displays a list of the patches and merge proposals available for that project. This immediately provides a TODO list of things that the user can work on, solving the first problem many prospective contributors have – “what can I work on?“. If the user wants to see all patches and merge proposals for all the projects they are interested in, they can click the All option at the top of the tree view.

When the user decides that they want to work on a given patch or merge proposal, they double click it and the view changes to the Review View:

This view has a series of key components. First, at the top of the view we see the Currently Reviewing label and a breadcrumb trail – clicking each item in the trail will open the relevant Launchpad project page in your web browser.

On the bottom-right of the view you can see a treeview with a list of changed files that are part of the patch or merge proposal. Clicking on a file will load it into the top part of the main body of the view which is a text editor. Inside the text editor a diff will be shown with the differences between the patch and the source package’s file. Each diffed file loads in a different tab.

Above the file listing tree view are three buttons:

  • Test Patch – (this will say Test Merge Proposal if a merge proposal). When you click this button, the project’s code will be downloaded and the patch/merge proposal will be automatically applied. When you have clicked this button, you can then use the embedded terminal at the bottom of the main view to go and run and test the patch. This makes applying patches incredible simple: you just click a button. If for some reason the patch or merge proposal has conflicts, a dialog box will appear providing details and possibly a button you can click which re-directs you to the bug in Launchpad to provide feedback that the patch did not apply.
  • View Bug – (if applicable) if you want to view the bug that this patch/merge proposal fixes, click this button and it loads into your web browser.
  • Leave Feedback – when you click this button you can go and provide input on the patch in Launchpad.

This is very much a first cut of the design, and is entirely open to discussion and improvement. The core idea is that we provide a TODO list of interesting patches/merge proposals to review based upon what the user is interested in, make testing them a single click, and make providing feedback a single click.

Writing this application would not be particularly complex from what I can tell. It is clearly a good candidate for a Quickly app, could use launchpad lib, and can use existing patch/diff/bzr tools. If one of you is interested in making Mergimus a reality, I recommend you just start writing some code, pop it in Launchpad and focus on a simple first cut and we can continue the discussion.


Read more

Today Andy Breiner submitted a new Python snippet that demonstrates the use of the os module and Regular Expressions and looks at all the snippets in the Python Snippets library and counts how many people have submitted snippets. This is a great way of seeing how many people are contributing to the project. Well, I wanted to share the date with you folks:

  • Jim Bublitz: 15 snippets
  • Andy Breiner: 11 snippets
  • Jono Bacon: 10 snippets
  • Darren Worrall: 7 snippets
  • Simon Vermeersch: 6 snippets
  • Scott Ferguson: 4 snippets
  • Jurjen Stellingwerff: 4 snippets
  • Tim Voet: 3 snippets
  • Markus Korn: 3 snippets
  • Siegfried-Angel Gevatter Pujals: 3 snippets
  • Huntly Cameron: 3 snippets
  • Tiago Boldt Sousa: 2 snippets
  • Simon Edwards: 1 snippet
  • Scott James Remnant: 1 snippet
  • Benjamin Klueglein: 1 snippet
  • Rich Jones: 1 snippet
  • Oliver Marks: 1 snippet
  • John Turek: 1 snippet
  • Jonathan Riddell: 1 snippet
  • Josh Holland: 1 snippet
  • João Pinto: 1 snippet
  • Gonzalo Núñez: 1 snippet
  • Nick Veitch: 1 snippet
  • Evan Briones: 1 snippet
  • David D. Lowe: 1 snippet
  • Bruno Girin: 1 snippet
  • David Futcher: 1 snippet
  • Bastian Kennel: 1 snippet
  • Andre “Osku” Schmidt: 1 snippet

What a fantastic collection of top-tier rock stars! These people have come together to contribute to a total of 173 snippets as it stands today! The other snippets in the library don’t have a specific author attached (they came from documentation).

I am not only pleased with how some of these folks have really gone to town in creating snippets, but also just how many different people have contributed. That is fantastic.

Of course, you can be one of these people too! Go and find out how to contribute your Python snippets today!

Read more

I am proud to announce the release of Acire 0.4!

This release includes the following new features

  • Documentation Links – many snippets now include links to relavent documentation links, and these are shown right within the Acire interface and just a click away.
  • Alphabetized Lists – the list of categories in Acire and the list of snippets in each category has now been alphabetized which makes navigating available snippets much easier.
  • HIG improvements – thanks to Matthew Pirocchi fo contributing a branch for helping Acire to fit in with the GNOME HIG better. The changes are subtle but really sleek. :-)
  • Number of snippets – the number of snippets that are currently available are now shown on the status bar.
  • Link to how to add snippets – Acire is nothing without python-snippets, so I added a link in the Help menu to this page which explains how people can contribute snippets.

These features are in addition these features which already exist:

  • Diverse Library Of Examples – via the Python Snippets library, Acire provides you with access to hundreds of available snippets spanning a wide variety of Python modules.
  • New Snippets, Daily – for Ubuntu users, our library of Python Snippets is available in a package that is updated daily. We are always adding snippets, and they will be delivered to your system effortlessly.
  • Browse Snippets Easily – snippets are organized into a series of categories which neatly map to Python modules. When you select a category you will see a list of available snippets.
  • View Code – code for snippets is just a click away, using full syntax highlighting and respecting your Monospace font settings on your desktop.
  • Test and Run Snippets – snippets can be run right from Acire with a single click. See a snippet running, browse the code and understand how it works.
  • Play With Snippets Your Way – looking at a snippet’s code and want to change something to see what happens? No problem, edit the code, run it and have fun. When you are done you can even save your snippet to a file on your computer.
  • Available In Your LanguageAcire is available in multiple languages, with many more with each release.

Installing Acire 0.4 is a doddle if you are running Ubuntu (Lucid and Karmic) or Debian, just follow the instructions. Right now Acire is not packaged for other distributions, but I would love it to be: drop me a line if it is and I will update the website with installation details.

At the heart of the Acire and Python Snippets project are Python snippets that are contibuted by the community. We need YOUR help to produce more snippets to help opportunistic developers really harness our wonderful platform. To contribute a snippet follow the guidelines here.

Read more

I just wanted to share something I am rather proud of. Python Snippets, the project I put together to gather an archive of simple Python examples that can be viewed with Acire on your desktop.

Well, today I merged in our 150th snippet, contributed by Andy Breiner. For the curious, the record-breaking snippet demonstrates how to delete a record from a CouchDB database with DesktopCouch.

We now have 150 simple Python examples that span 20 different areas:

  • Application Indicator – application indicator examples.
  • Apport – the apport crash handling framework.
  • bzrlib – bazaar source control system Python module.
  • Clutter – clutter toolkit examples.
  • dbus – dbus messaging system
  • DesktopCouch – desktopcouch examples.
  • feedparser – parsing RSS feeds.
  • Gstreamer – python-gstreamer examples.
  • Gwibber – gwibber microblogging tool
  • Notify OSD – notify OSD examples.
  • PyGTK – pygtk widget and framework examples.
  • PyGTKSourceView – pygtksourceview widget and framework examples.
  • Python Core – examples that demonstrate core features in the Python language.
  • Python VTE – snippets using the VTE widget for GTK.
  • PyKDE4 – KDE Python bindings.
  • PyQt4 – Qt widget examples
  • Patterns – design pattern examples.
  • launchpadlib – examples using launchpadlib.
  • WebKit examples uing the webkit browser widget.
  • Zeitgeist – examples on how to use Zeitgeist.

I am really pleased how Acire and Python Snippets are becoming a constantly growing resource that is actively helping developers get to grips with different modules. Thanks to everyone who has contributed snippets to the library!

Of course, we want more snippets, so if you want to add some, go and read this guide to explain how!

Read more

Today someone asked me how to run Acire and Python Snippets from source and contribute more snippets. I just wanted to pop up the instructions quickly here so I can point folks at them. These should work on Lucid and Karmic for sure, and very possibly older versions.

First grab the tools you need to run Acire:

sudo apt-get update
sudo apt-get install quickly bzr python-mechanize python-gtksourceview2

First grab the python-snippets:

bzr branch lp:python-snippets

Now grab Acire:

bzr branch lp:acire

Now set an environmental variable to point to your snippets:

export SNIPPETS_DIR=/place/where/you/checked/out/the/snippets

Now go to the directory where you checked out Acire and run it:

quickly run

Job done! You can now contribute snippets by reading this guide. I look forward to seeing your snippets, folks!

Read more

Nigel Babu has been working to spread the word about gathering some community steam around patches in Ubuntu. We have an incredibly fortunate situation in Ubuntu where lots of people spend their time and effort producing patches which fix bugs, and they share their gifts with the project to help make Ubuntu better. With so many awesome people sharing patches, we have got behind in reviewing and merging these contributions.

Recently we have spent some time trying to get better visibility on patches in Ubuntu, and you can read all about it here. We now have an awesome patch view so we can see these contributions easier, we now just need to get these wonderful gifts reviewed and merged.

This leads me on to Nigel’s efforts in raising awareness around this effort. He writes:

As of writing this post, there are 1801 bugs with patches attached in Launchpad that are not Fix Released or Fix Committed and do not have branches linked. This tells me 2 things: (1) There are some amazing contributors out there coming up with patches. (2) We have not been clearing up the backlog of bugs with patches attached.

For the past few weeks, I’ve been trying to change this situation by reviewing some of the bugs with patches attached. Well, we need help and everyone are welcome, especially people working towards being an Ubuntu Developer (like me). Patch review needs your help. Right now, we’re focussing on all the bugs that have ubuntu-reviewers team subscribed. This helps us get any potential patch in Lucid.

If you want to help, check out the Code Reviews wiki. When stuck, pop by on #ubuntu-motu channel and mention you’re working on patch review and are stuck, I’m sure someone would be around to help you out.

PS: Hello Planet Ubuntu, my first post after being an Ubuntu Member.

Thanks to Nigel (nigelb on freenode) for being so awesome in focusing on this, and I would love to encourage everyone to get involved. I am sure that if you are stuck where to start, Nigel would be happy to help. This is a great thing to spend the Ubuntu Global Jam doing next week too!

If in doubt, just head in #ubuntu-reviews on freenode IRC and ask there. Also feel free to ask questions in the blog comments here. Let’s rock this thing! :-)

Read more

Recently I asked for some help on how to download a file without blocking the GUI. Thanks to everyone who contributed their expertise in the post comments: I now have my program working great.

I wanted to now share my conclusions so that others can benefit from them too. To do this I am going to first explain how this works, and secondly I have created a Python Snippet and added it to the Python Snippets library so there is a great working example you folks can play with. You can use Acire to load the snippet and play with it. This is the first gio snippet, and I hope there will be many more. :-)

The goal I set out with was to download a file without freezing the GUI. This was somewhat inspired from a recent Shot Of Jaq shot that we did on async programming, and I used this app as a good example to play with. Typically I had downloaded files the manual way and this had blocked my GUI hard, but I was aware that this is exactly what gio, part of the GNOME platform is here to solve.

The way async basically works is that you kick off an operation and then you wait for confirmation of the result before you proceed. It is the opposite of procedural programming: you don’t kick off an operation and in the next line process it. When you do things the async way, you start an operation and then tell it what callback should be called when it is complete. It feels very event-driven: kind of how you connect a handler to a signal in a widget so that when that signal is generated, the handler is called.

When I started playing with this the docs insinuated that read_async() and read_finish() were what I needed to use. I started off with code that looked a little like this:

def download_latest_shot(self):
    audiourl = "http://....the url to the Ogg file...."

    self.shot_stream = gio.File(audiourl)

It then calls this callback:

def download_latest_shot_complete(self, gdaemonfile, result):
    f = self.shot_stream.read_finish(result).read()

    outputfile = open("/home/jono/Desktop/shot.ogg","w")

After some helpful notes from the GNOME community, it turned out that what I really needed to use was load_contents_async() to download the full content of the file (read_async() merely kicks off a read operation) and load_contents_finish() as the callback that is called when it is complete. This worked great for me.

As such, here is the snippet which I have added to the Python Snippets library which downloads the Ubuntu HTML index page, shows it in a GUI without blocking it and writes it to the disk:

#!/usr/bin/env python
# [SNIPPET_NAME: Download a file asynchronously]
# [SNIPPET_DESCRIPTION: Download a file async (useful for not blocking the GUI)]
# [SNIPPET_AUTHOR: Jono Bacon <>]

import gio, gtk, os

# Downloading a file in an async way is a great way of not blocking a GUI. This snippet will show a simple GUI and
# download the main HTML file from without blocking the GUI. You will see the dialog appear with no content
# and when the content has downloaded, the GUI will be refreshed. This snippet also writes the content to the home
# directory as pythonsnippetexample-ubuntuwebsite.html.

# To download in an async way you kick off the download and when it is complete, another callback is called to process
# it (namely, display it in the window and write it to the disk). This separation means you can download large files and
# not block the GUI if needed. 

class Example(object):
    def download_file(self, data, url):
        """Download the file using gio"""

        # create a gio stream and download the URL passed to the method = gio.File(url)

        # there are two methods of downloading content: load_contents_async and read_async. Here we use load_contents_async as it
        # downloads the full contents of the file, which is what we want. We pass it a method to be called when the download has
        # complete: in this case, self.download_file_complete

    def download_file_complete(self, gdaemonfile, result):
        """Method called after the file has downloaded"""

        # the result from the download is actually a tuple with three elements. The first element is the actual content
        # so let's grab that
        content =[0]

        # update the label with the content

        # let's now save the content to the user's home directory
        outputfile = open(os.path.expanduser('~') + "/pythonsnippetexample-ubuntuwebsite.html","w")

ex = Example()

dial = gtk.Dialog()
label = gtk.Label()
label.connect('realize', ex.download_file, "")

I am still pretty new to this, and I am sure there is plenty that can be improved in the snippet, so feel free submit a merge request if you would like to improve it. Hope this helps!

Read more

Slightly technical question for my friends on Planet GNOME. I have been hunting around for some help online with no luck, so I figured I would post here and hopefully this blog entry can be a solution for those who have similar questions.

I am in the process of porting App Of Jaq to to async. To do this I am using gio and have the code that downloads XML feeds up and running pretty well, and the app feels much more responsive. Now I need to have the application download an Ogg asynchronously without freezing the GUI.

My code currently looks like this:

def download_latest_shot(self):
    audiourl = "http://....the url to the Ogg file...."

    self.shot_stream = gio.File(audiourl)

It then calls this callback:

def download_latest_shot_complete(self, gdaemonfile, result):
    f = self.shot_stream.read_finish(result).read()

    outputfile = open("/home/jono/Desktop/shot.ogg","w")

Now, I am still pretty new to this, and while this code does work, it freezes the GUI pretty hard. Can anyone recommend some next steps for how I can download the file without it freezing? Some example code would be great. :-)

Thanks in advance for anyone who can help. :-)

Read more

Ubuntu Opportunistic Developer Week day 4 kicks off and we have some incredible events today:

  • 5pm UTC – Hot rodding your app for translations support – David Planella
  • 6pm UTC – Learning through examples with Acire and Python-Snippets – Jono Bacon
  • 7pm UTC – Write Beautiful Code (and Maintain it Beautifully) – rockstar
  • 8pm UTC – Speed your development with quickly.widgets – Rick Spencer
  • 9pm UTC onwards – Snippets Party – Join us in #ubuntu-app-devel and create Python snippets to share with other people – see this page for details of how to get involved!

It is recommended that you enjoy the week in Lernid. You can find out more details of how to install Lernid right here. Don’t want to use Lernid? No worries, just pop over to #ubuntu-classroom and #ubuntu-classroom-chat to join in the fun. Don’t forget that #ubuntu-app-devel is the place to ask questions about general development on Ubuntu. :-)

Join the snippets party!

Today is a special day this week: in addition to providing some great content to help people get started writing apps on Ubuntu, we are also keen to continue growing our wonderful library of python-snippets which is viewed with a program I wrote called Acire. This library of snippets provides a range of examples that you can run, play with, modify and merge into your programs. So many of us learn by doing, and the more snippets we have the easier it is the learn from a diverse range of topics!

We have two events today I am keen to encourage you to join. First I will be delivering a session on the python snippets project:

  • 6pm UTC – Learning through examples with Acire and Python-Snippets – Jono Bacon

In the session I will explain how the project came about, it’s current progress and where we are going. We will then have a fun snippets party a little later:

  • 9pm UTC onwards – Snippets Party – Join us in #ubuntu-app-devel and create Python snippets to share with other people – see this page for details of how to get involved!

The snippets party is simple: just join #ubuntu-app-devel on freenode and join us to write a bunch of snippets and contribute them to python-snippets. Today we have 104 snippets already in the library: I would love to see us get that to over 150 today. Come and join us!

Contributing snippets is simple: just click here to find out more!

Read more

The new style of Ubuntu is driven by the theme “Light”. We’ve developed a comprehensive set of visual guidelines and treatments that reflect that style, and are updating key assets like the logo accordingly. The new theme takes effect in 10.04 LTS and will define our look and feel for several years.

Ubuntu has seen a tremendous amount of growth and change since it was conceived in 2004. Back then it was a small project with strong ambitions and a handful of developers passionate about delivering a world class Linux Operating System that can compete on every level with Microsoft and Apple. We adopted a style based on the tagline “Linux for Human Beings”, and called it “Human”. Six years on we have made incredible progress. Ubuntu is a global phenomenon: we have carved out a pervasive culture of quality and design, thoughtful usability and great technology all fused together in a project that maintains the same commitment to community and collaborative development that we embraced back in 2004.

In 2009, a small team lead by Mark Shuttleworth, conducted a review of our key brand values and identity. Based on that work, a set of visual treatments were produced, and shared with key members of the Ubuntu Art community, spanning the core distributions, derivatives, and aligned efforts like the Forums. Representatives from Ubuntu, Kubuntu, Edubuntu, Xubuntu, Mythbuntu, SpreadUbuntu and more came to London and worked with the Canonical design team to refine the designs and work together. The results of that work are presented here.

This collection of community representatives worked with the design team and created some great work. Some examples:

In addition to this we also worked with our key governance boards: the Community Council, Technical Board, Forums Council, LoCo Council and others around this work to ensure that our community can use it to it’s best advantage.

Brand Values

The key values we believe are reflected in the Ubuntu project are:

  • Precision. We ship high quality software, and we ship it exactly on schedule. Our Debian heritage means that the individual components of our platform are tightly defined and neatly arranged. There is no excess, no fat, and no waste in Ubuntu. We are a community that thrives on delivery.

  • Reliability. We are building Ubuntu for serious use. Whether it is being deployed on the desktop or in the cloud, we care that Ubuntu is secure, reliable and predictable. We deliver updates to Ubuntu that are rigorously tested. When we make a mistake, we learn from it and put in place good processes to ensure that it does not happen again.

  • Collaboration. Ubuntu is the result of collaborative work between thousands of people, and it is both the beneficiary and the public face of the collaborative work of tens of thousands of free software developers who build individual upstream components, or aggregate them in Debian. We go to great lengths to ensure that anybody, anywhere, who is passionate about Ubuntu and competent to participate, can do so. We enable virtual participation in our physical Ubuntu Developer Summits, we use mailing lists and IRC in preference to over-the-cubicle-wall communications, and we welcome contributions from both companies and individuals. Our governance bodies reflect the diversity of that participation, and leadership or permissions are based on proven merit, not corporate employment.

  • Freedom. We strive to deliver the very best free software platform. Our highest mission is to accelerate the adoption and spread of free software, to make it the de facto standard way that people build and consume software. We celebrate the work of other groups committed to collaborative content development, and open content licensing. While we are pragmatic about this (we ship proprietary drivers when we believe they are a requirement to get free software working well on PC’s) we expressly do not include any proprietary applications in the default installation of Ubuntu. We want people to love and appreciate free software, and even though we work to make sure that Ubuntu is compatible with, certified with and iteroperable with popular proprietary software, we do so to facilitate the adoption of free alternatives to proprietary solutions.

While the branding has changed, the freedoms and rights have not: our global community will still maintain access to the resources needed to construct logos that use the branding. We will be providing the new font, images, colour specs, and a set of recommendations for creating branding for websites, t-shirts and the other needs of our community. As before we will protect the integrity of the Ubuntu brand with the Ubuntu Trademark Policy.

Light: Ubuntu is Lightware

The new style in Ubuntu is inspired by the idea of “Light”.

We’re drawn to Light because it denotes both warmth and clarity, and intrigued by the idea that “light” is a good value in software. Good software is “light” in the sense that it uses your resources efficiently, runs quickly, and can easily be reshaped as needed. Ubuntu represents a break with the bloatware of proprietary operating systems and an opportunity to delight to those who use computers for work and play. More and more of our communications are powered by light, and in future, our processing power will depend on our ability to work with light, too.

Visually, light is beautiful, light is ethereal, light brings clarity and comfort.

Historical perspective: From 2004-2010, the theme in Ubuntu was “Human”. Our tagline was “Linux for Human Beings” and we used a palette reflective of the full range of humanity. Our focus as a project was bringing Linux from the data center into the lives of our friends and global family.

Go and see the full details of the brand refresh here, with more images.

Read more

Just a quick note to let you all know that Ubuntu Opportunistic Developer Week day 3 kicks off in an hour!

Here is the order of events for today:

  • 5pm UTC – Creating stunning interfaces with Cairo – Laszlo Pandy
  • 6pm UTC – What’s new in Quickly 0.4 – Didier Roche
  • 7pm UTC – Create games with PyGame – Rick Spencer
  • 8pm UTC – SHOWCASE: Photobomb – Rick Spencer
  • 9pm UTC onwards – Hacking party in #ubuntu-app-devel on freenode! Come and join us, work on your apps, ask questions and have fun in our community. :-)

It is recommended that you enjoy the week in Lernid. You can find out more details of how to install Lernid right here. Don’t want to use Lernid? No worries, just pop over to #ubuntu-classroom and #ubuntu-classroom-chat to join in the fun. Don’t forget that #ubuntu-app-devel is the place to ask questions about general development on Ubuntu. :-)

Read more

Just a quick note to let you all know that Ubuntu Opportunistic Developer Week day 2 kicks off in an hour!

Here is the order of events for today:

  • 4pm UTC – Gooey Graphics with GooCanvas – Rick Spencer
  • 5pm UTC – Writing a Rhythmbox plug-in – Stuart Langridge
  • 6pm UTC – Microblog from your app with the Gwibber API – Ken VanDine
  • 7pm UTC – SHOWCASE: Gwibber – Ken Vandine
  • 8pm UTC – Building multimedia into your app with GStreamer – Laszlo Pandy
  • 9pm UTC onwards – Hacking parts in #ubuntu-app-devel on freenode! Come and join us, work on your apps, ask questions and have fun in our community. :-)

It is recommended that you enjoy the week in Lernid. You can find out more details of how to install Lernid right here. Don’t want to use Lernid? No worries, just pop over to #ubuntu-classroom and #ubuntu-classroom-chat to join in the fun. Don’t forget that #ubuntu-app-devel is the place to ask questions about general development on Ubuntu. :-)

Read more

Just a quick note to let you all know that Ubuntu Opportunistic Developer Week kicks off in an hour!

Here is the order of events for today:

  • 4pm UTC – Welcome! Ubuntu For Opportunistic Developers – Jono Bacon
  • 5pm UTC – CouchDB support in your app with DesktopCouch – Stuart Langridge
  • 6pm UTC – Creating an application from scratch with Quickly – Rick Spencer
  • 7pm UTC – Building in Application Indicator support – Sense Hofstede
  • 8pm UTC – Integrated development workflow with Ground Control – Martin Owens
  • 9pm UTC onwards – Hacking parts in #ubuntu-app-devel on freenode! Come and join us, work on your apps, ask questions and have fun in our community. :-)

It is recommended that you enjoy the week in Lernid. You can find out more details of how to install Lernid right here. Don’t want to use Lernid? No worries, just pop over to #ubuntu-classroom and #ubuntu-classroom-chat to join in the fun.

Read more

Well, folks, this week Ubuntu Opportunistic Developer Week kicks off with a fantastic week jammed with great sessions helping to bridge the gap for opportunistic developers who want to write fun, useful applications using Ubuntu as a platform. We have a wonderful week of sessions ahead and as ever, it is recommended that you enjoy the week in Lernid. You can find out more details of how to install Lernid right here. Don’t want to use Lernid? No worries, just pop over to #ubuntu-classroom and #ubuntu-classroom-chat to join in the fun.

I will be kicking off the week at 4pm UTC and talking through the goals for the week and talking through some of the work we are doing to help opportunistic developers enjoy Ubuntu as a platform and write some fun apps.

Friends, also don’t forget about the fun challenge I set last week:

Think of a fun program to write, and see how much you can get completed by the end of the week, Fri 5th March 2010. On Friday I will write a blog entry that showcases screenshots of your progress and (if possible) a PPA where people can download a package to try.

When you have something you would like me to blog, send an email no later than the end of the day Pacific time on Thu 4th March 2010 to me at jono AT ubuntu DOT com and include:

  • The name of your program and a brief description of what it does.
  • A link to a screenshot online that shows your new app running.
  • If available, tell me the name of the Launchpad project where it is hosted and the PPA with the package. This is a great way for people to try your program and possibly join the project and contribute to it!

I will send a t-shirt out to the three app authors who made the most interesting apps with the most progress. :-)

Start your engines folks, let’s see what we can do! I can’t wait to see how you folks get on! :-)

Read more

With the new release of Acire just out I wanted to tell you folks a fun little story of an added benefit to Acire that I never envisaged when I came up with the idea for the app.

Yesterday I got an email from someone (I will keep the identify private) saying:

I’m trying to create an application but I can’t seem to find any way to embed a gnome-terminal into my app. I know you’re not offering support :) but if you have some spare time is there any chance you can point me to the documentation for that?

This happens a lot: someone wants to do something, so they ask for help over email or on another medium such as IRC. Unfortunately, I am usually pretty busy and typically don’t have the time to answer support questions. Before Acire existed I would have at most hunted out some links or possibly just the person to to go and ask on a particular forum or mailing list.

Now Acire exists, I just fired it up, selected Python VTE from the cateogries combo box, clicked on the snippet, and then cut and pasted the code into the email:

#!/usr/bin/env python

# [SNIPPET_NAME: Embed a VTE terminal]
# [SNIPPET_DESCRIPTION: Embed a VTE terminal in your application]

    import gtk
    print >> sys.stderr, "You need to install the python gtk bindings"

# import vte
    import vte
    error = gtk.MessageDialog (None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK,
        'You need to install python bindings for libvte')
    sys.exit (1)

if __name__ == '__main__':
    # create the terminal
    v = vte.Terminal()
    v.connect ("child-exited", lambda term: gtk.main_quit())

    # fork_command() will run a command, in this case it shows a prompt

    # create a window and add the VTE
    window = gtk.Window()
    window.connect('delete-event', lambda window, event: gtk.main_quit())

    # you need to show the VTE

    # Finally, run the application

Job done. What made me smile about this was that Acire not only helps me, but it helped me help someone else too. Rocking. :-)

Read more

Everyone’s favorite tool to browse Python snippets, run them, learn from them and incorporate them into your programs has been released! This new release has the following new features:

  • Translated – Acire has now got support for multiple languages, but this is very new so it needs your translations! Want to help make Acire rocking in your language? Easy. Go and contribute here!
  • Edit Snippets – Acire now allows you to edit the code inside a snippet and execute it within Acire itself.
  • Save Snippets – You can now save the snippets, even if they have been edited, into a specific file on your system.
  • Look and Feel Polish – a little bit of spit and shine has been applied to respect your chosen monospace font, use a scalable icon for docky and a few other little changes.

As I have mentioned before, I the snippets that Acire shows and the Acire itself are in two separate packages (this means that others can write viewers to view the snippets on other environments).

Installing Acire and it’s snippets is simple. First install the daily snippets PPA (this will deliver new snippets to your system on a daily bases):

sudo add-apt-repository ppa:python-snippets-drivers/python-snippets-daily
sudo apt-get update
sudo apt-get install python-snippets

Now install the Acire PPA:

sudo add-apt-repository ppa:acire-team/acire-releases
sudo apt-get update
sudo apt-get install acire

Right now packages are available for Ubuntu 10.04 Lucid Lynx and Ubuntu 9.10 Karmic Koala packages should be available soon.

We need your snippets!

The fuel that makes Acire rock is the library of snippets. To really get the most out of Acire and it’s library of snippets, we need you to contribute snippets that demonstrate something in Python. These snippets are really helpful in showing us all how a given Python modules works, and really helpful in lowering the bar to development. Here is how you can contribute a snippet!

Step 1: Grab the library

Just run:

bzr branch lp:python-snippets

Step 2: Create your snippet

A snippet should demonstrate a specific feature in a given module or in the Python language. This could include showing how to use a specific widget, a feature of that widget, or another function.

python-snippets is divided into sub-directories which outlines the theme of the snippets. You should pick the most appropriate directory to put your snippet it, and add it there. If a suitable directory does not exist already, create it and add it there.

Step 3: Add metadata

The way Acire pulls out the snippets is by detecting some specific metadata additions to comments at the top of the file You should now add the following meta data as comments to the top of the file:

# [SNIPPET_NAME: A Short Name For The Snippet]
# [SNIPPET_CATEGORIES: Category]  <-- see CATEGORIES file for existing categories
# [SNIPPET_DESCRIPTION: A single line description of the snippet]
# [SNIPPET_AUTHOR: Your Name <>]
# [SNIPPET_LICENSE: An Open Source license (from the LICENSES file)]

Here is an example:

# [SNIPPET_NAME: Playing a Pipeline]
# [SNIPPET_DESCRIPTION: Construct and play a pipeline]
# [SNIPPET_AUTHOR: Jono Bacon <>]

You now need to add your file to your branch with:

bzr add

Step 4: Propose it for merging

With your new snippet ready, it is time to propose it for inclusion in the main python-snippets library.

First, commit your changes to your local branch with:

bzr commit

Now push it to your own branch on Launchpad:

bzr push lp:~<your launchpad username>/python-snippets/<name of your branch>

As an example:

bzr push lp:~jonobacon/python-snippets/gstreamer-snippets

Now go to and you should see your branch listed there. Click on it and when the branch page information page loads click on the Propose for merging link. Add a short description of what you examples do in the Initial Comment box and then click the Propose Merge button.

We will then review the merge and if it looks good, add it to python-snippets and it will be delivered to Acire users in the next daily package upload. :-)

Read more