24 hours a day, 7 days a week, 365 days per year...

August 23, 2016

Learning Python!

Here are my first few basic Python programs (before my first Python assignment consuming and processing perf samples). :)

i = raw_input()
print i

T = int(raw_input())
print "Range of t is", range(T)
for i in range(T):
    print i
    ans = 42
    print "Case #%d: %d" % (i+1, ans)
T = int(raw_input())
for i in range(T):
    line = raw_input()
    N, J = line.split()
    N, J = int(N), int(J)
    print "N = %d, J = %d" % (N, J)   

T = int(raw_input())
i = 1
while i<=T:
    tmp = raw_input()
    N = int (tmp.split()[0])
    J = int (tmp.split()[1])
    print N, J
    print 2**N
    print 2**N-1
    print bin(2**N-1)
    i +=1   

#program 5
T = int(raw_input())
i = 1
while i<=T:
    tmp = raw_input()
    N = int (tmp.split()[0])
    J = int (tmp.split()[1])
    print N, J
    print 2**N
    print 2**N-1
    print bin(2**N-1)
    s = bin(2**N-1)[2:]
    print int(s, 2)
    print int(s, 3)
    print int(s, 4)
    print int(s, 10)

#program 6
#defining functions
def factorial(n):
    ret = 1
    for i in range(n):
        ret *= i+1
    return ret
print factorial(5)
print factorial(4), factorial(3)

Sysprof + Builder

After the GNOME 3.20 cycle completed I started revamping Sysprof. More here, here, and here. The development went so smoothly that I did a 3.20 release a couple of weeks later.

A primary motivation of that work was rebuilding Sysprof into a set of libraries for building new tools. In particular, I wanted to integrate Sysprof with Builder as our profiler of choice.

On my flight back from GUADEC I laid the groundwork to integrate these two projects. As of Builder 3.21.90 (released yesterday) you can now profile your project quite easily. There are  more corner cases we need to handle but I consider those incremental bugs now.

Some of our upcoming work will be to integrate the Sysprof data collectors with Python and Gjs. The Gjs implementation is written, it just needs polish and integration with upstream. I think it will be fantastic once we have a compelling profiling story weather you are writing C, C++, Vala, Python, or Gjs.

We’ve also expanded the architectures supported by Sysprof. So I expect by time 3.22 is released, Sysprof will support POWER8, ARM, ARM64, mips, and various others as long as you have an up to date Linux kernel. That is an important part of our future plans to support remote profiling (possibly over USB or TCP). If you’re interested in working on this, contact me! The plumbing is there, we just need someone with time and ambition to lead the charge.

Selecting the Profiler

Builder's Callgraph View

(Re)mastering a custom Ubuntu auto-install ISO

Recently, I had to install GNU/Linux on a dozen or so machines. I didn’t want to install manually, mainly because I was too lazy, but also because the AC in the data centre is quite strong and I didn’t want to catch a cold… So I looked for some lightweight way of automatically installing an Ubuntu or so. Fortunately, I don’t seem to be the first person to be looking for a solution, although, retrospectively, I think the tooling is still poor.

I would describe my requirements as being relatively simple. I want to turn one of the to be provisioned machines on, wait, and then be able to log in via SSH. Ideally, most of the software that I want to run would already be installed. I’m fine with software the distribution ships. The installation must not require the Internet and should just work™, i.e. it should wipe the disk and not require anything special from the network which I have only little control over.

I looked at tools like Foreman, Cobbler, and Ubuntu’s MAAS. But I decided against them because it doesn’t necessarily feel lightweight. Actually, Cobbler doesn’t seem to work well when run on Ubuntu. It also fails (at least for me) when being behind an evil corporate proxy. Same for MAAS. Foreman seems to be more of a machine management framework rather than a hit and run style of tool.

So I went for an automated install using the official CD-ROMs. This is sub-optimal as I need to be physically present at the machines and I would have preferred a non-touch solution. Fortunately, the method can be upgrade to delivering the installation medium via TFTP/PXE. But most of the documents describing the process insist on Bind which I dislike. Also, producing an ISO is less error-prone so making that work first should be easier; so I thought.

Building an ISO

The first step is to mount to ISO and copy everything into a working directory. You could probably use something like isomaster, too.

mkdir iso.vanilla
sudo mount -oloop ubuntu.iso ./iso.vanilla
sudo cp -ar ./iso.vanilla/* ./iso.vanilla/.*

After you have made changes to your image, you probably want to generate a new ISO image that you can burn to CD later.

sudo mkisofs -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -z -iso-level 4 -c isolinux/ -o /tmp/ubuntu-16.04-myowninstall-amd64.iso -joliet-long

You’d expect that image to work If you now dd it onto a pendrive, but of course it does not… At least it didn’t for me. After trying many USB creators, I eventually found that you need to call isohybrid.

sudo isohybrid /tmp/ubuntu-16.04-myowninstall-amd64.iso

Now you can test whether it boots with qemu:

qemu-img create -f qcow2 /tmp/ubuntu.qcow2 10G
qemu-system-x86_64 -m 1G -cdrom ubuntu-16.04-server-amd64.iso -hda /tmp/ubuntu-nonet.qcow2

If you want to test whether a USB image would boot, try with -usb -usbdevice disk:/tmp/ubuntu-16.04-myowninstall-amd64.iso. If it doesn’t, then you might want to check whether you have assigned enough memory to the virtual machine. I needed to give -m 1G, because the default didn’t work with the following mysterious error.

Error when running with too little memory

It should also be possible to create a pendrive with FAT32 and to boot it on EFI machines. But my success was limited…

Making Changes

Now what changes do you want to make to the image to get an automated installation?
First of all you want to get rid of the language selection. Rumor has it that

echo en | tee isolinux/lang

is sufficient, but that did not work for me. Replacing timeout values in files in the isolinux to something strictly positive worked much better for me. So edit isolinux/isolinux.cfg.

If the image boots now, you don’t want the installer to ask you questions. Unfortunately, there doesn’t seem to be “fire and forget” mode which tries to install as aggressively as possible. But there are at least two mechanisms: kickstart and preseed. Ubuntu comes with a kickstart compatibility layer (kickseed).

Because I didn’t know whether I’ll stick with Ubuntu, I opted for kickstart which would, at least theoretically, allow me for using Fedora later. I installed system-config-kickstart which provides a GUI for creating a kickstart file. You can then place the file in, e.g. /preseed/ks-custom.cfg next to the other preseed files. To make the installer load that file, reference it in the kernel command line in isolinux/txt.cfg, e.g.

default install
label install
menu label ^Install Custom Ubuntu Server
kernel /install/vmlinuz
append file=/cdrom/preseed/ubuntu-server.seed vga=788 initrd=/install/initrd.gz ks=cdrom:/preseed/ks-custom.cfg DEBCONF_DEBUG=5 cdrom-detect/try-usb=false usb_storage.blacklist=yes --

Ignore the last three options for now and remember them later when we talk about issues installing from a pen drive.

When you boot now, you’d expect it to “just work”. But if you are me then you’ll run into the installer asking you questions. Let’s discuss these.

Multiple Network Interfaces

When you have multiple NICs, the installer apparently asks you for which interface to use. That is, of course, not desirable when wanting to install without interruption. The documentation suggest to use

d-i netcfg/choose_interface select auto

That, however, seemed to crash the installer when I configured QEMU to use four NICs… I guess it’s this bug which, at least on my end, had been cause by my accidentally putting “eth0” instead of “auto”. It’s weird, because it worked fine with the single NIC setup. The problem, it seems, is that eth0 does not exist! It’s 2016 and we have “predictable device names” now. Except that we still have /dev/sda for the first harddisk. I wonder whether there is a name for the first NIC. Anyway, if you do want to have the eth0 scheme back, it seems to be possible by setting biosdevname=0 as kernel parameter when booting.


You can test with multiple NICs and QEMU like this:

sudo qemu-system-x86_64 -m 1G -boot menu=on -hda /tmp/ubuntu-nonet.qcow2 -runas $USER -usb -usbdevice disk:/tmp/ubuntu-16.04-myowninstall-amd64.iso -netdev user,id=network0 -device e1000,netdev=network0 -netdev user,id=network1 -device e1000,netdev=network1 -netdev user,id=network2 -device e1000,netdev=network2 -netdev user,id=network3 -device e1000,netdev=network3 -cdrom /tmp/ubuntu-16.04-myowninstall-amd64.iso

No Internet Access

When testing this with the real servers, I realised that my qemu testbed was still too ideal. The real machines can resolve names, but cannot connect to the Internet. I couldn’t build that scenario with qemu, but the following gets close:

sudo qemu-system-x86_64 -m 1G -boot menu=on -hda /tmp/ubuntu-nonet.qcow2 -runas $USER -usb -usbdevice disk:/tmp/ubuntu-16.04-myowninstall-amd64.iso -netdev user,id=network0,restrict=y -device e1000,netdev=network0 -netdev user,id=network1,restrict=y -device e1000,netdev=network1 -netdev user,id=network2,restrict=y -device e1000,netdev=network2 -netdev user,id=network3,restrict=y -device e1000,netdev=network3 -cdrom /tmp/ubuntu-16.04-myowninstall-amd64.iso

That, however, fails:


The qemu options seem to make the built-in DHCP server to not hand out a default gateway via DHCP. The installer seems to expect that, though, and thus stalls and waits for user input. According to the documentation a netcfg/get_gateway value of "none" could be used to make it proceed. It’s not clear to me whether it’s a special none type, the string literal “none”, or the empty string. Another uncertainty is how to actually make it work from within the kickstart file, because using this debconf syntax is for preseeding, not kickstarting. I tried several things,

preseed netcfg/get_gateway none
preseed netcfg/get_gateway string
preseed netcfg/get_gateway string
preseed netcfg/get_gateway string none
preseed netcfg/no_default_route boolean true

The latter two seemed to worked better. You may wonder how I found that magic configuration variable. I searched for the string being displayed when it stalled and found an anonymous pastebin which carries all the configurable items.

After getting over the gateway, it complained about missing nameservers. By putting

preseed netcfg/get_nameservers string

I could make it proceed automatically.


Overwriting existing partitions

When playing around you eventually get to the point where you need to retry, because something just doesn’t work. Then you change your kickseed file and try again. On the same machine you’ve just left half-installed with existing partitions and all. For a weird reason the installer mounts the partition(s), but cannot unmount them


The documentation suggest that a line like

preseed partman/unmount_active boolean true

would be sufficient, but not so for me. And it seems to be an issue since 2014 at least. The workarounds in the bug do not work. Other sources suggested to use partman/early_command string umount -l /media || true, partman/filter_mounted boolean false, or partman/unmount_active seen true. Because it’s not entirely clear to me, who the “owner” , in terms of preseed, is. I’ve also experimented with setting, e.g. preseed --owner partman-base partman/unmount_active boolean true. It started to work when I set preseed partman/unmount_active DISKS /dev/sda and preseed --owner partman-base partman/unmount_active DISKS /dev/sda. I didn’t really believe my success and reordered the statements a bit to better understand what I was doing. I then removed the newly added statements and expected it to not work. However, it did. So I was confused. But I didn’t have the time nor the energy to follow what really was going on. I think part of the problem is also that it sometimes tries to mount the pendrive itself! Sometimes I’ve noticed how it actually installed the system onto the pendrive *sigh*. So I tried hard to make it not mount USB drives. The statements that seem to work for me are the above mentioned boot parameters (i.e. cdrom-detect/try-usb=false usb_storage.blacklist=yes) in combination with:

preseed partman/unmount_active boolean true
preseed --owner partman-base partman/unmount_active boolean true
preseed partman/unmount_active seen true
preseed --owner partman-base partman/unmount_active seen true

#preseed partman/unmount_active DISKS /dev/sda
#preseed --owner partman-base partman/unmount_active DISKS /dev/sda

preseed partman/early_command string "umount -l /media || true"
preseed --owner partman-base partman/early_command string "umount -l /media ||$

How I found that, you may ask? Enter the joy of debugging.

Debugging debconf

When booting with DEBCONF_DEBUG=5, you can see a lot of information in /var/log/syslog. You can see what items are queried and what it thinks the answer is. It looks somewhat like this:


You can query yourself with the debconf-get tool, e.g.

# debconf-get partman/unmount_active

The file /var/lib/cdebconf/questions.dat seems to hold all the possible items. In the templates.dat you can see the types and the defaults. That, however, did not really enlighten me, but only wasted my time. Without knowing much about debconf, I’ve noticed that you seem to be able to not only store true and false, but also flags like “seen”. By looking at the screenshot above I’ve noticed that it forcefully sets partman/unmount_active seen false. According to the documentation mentioned above, some code really wants this flag to be reset. So that way was not going to be successful. I noticed that the installer somehow sets the DISKS attribute to the partman/unmount_active, so I tried to put the disk in question (/dev/sda) and it seemed to work.

Shipping More Software

I eventually wanted to install some packages along with the system, but not through the Internet. I thought that putting some more .debs in the ISO would be as easy as copying the file into a directory. But it’s not just that easy. You also need to create the index structure Debian requires. The following worked well enough for me:

cd pool/extras
apt-get download squid-deb-proxy-client
cd ../..
sudo apt-ftparchive packages ./pool/extras/ | sudo tee dists/stable/extras/binary-i386/Packages

I was surprised by the i386 suffix. Although I can get over the additional apt-ftparchive, I wish it wouldn’t be necessary. Another source of annoyance is the dependencies. I couldn’t find a way to conveniently download all the dependencies of a given package.

These packages can then be installed with the %packages directive:

@ ubuntu-server

Or via a post-install script:


apt-get install -y squid-deb-proxy-client
apt-get update
apt-get install -y htop
apt-get install -y glusterfs-client glusterfs-server
apt-get install -y screen
apt-get install -y qemu-kvm libvirt-bin

Unfortunately, I can’t run squid-deb-proxy-client in the installer itself. Not only because I don’t know how to properly install the udeb, but also because it requires the dbus daemon to be run inside the to-be-installed system which proves to be difficult. I tried the following without success:

preseed anna/choose_modules string squid-deb-proxy-client-udeb

preseed preseed/early_command string apt-install /cdrom/pool/extras/squid-deb-proxy-client_0.8.14_all.deb

anna-install /cdrom/pool/extras/squid-deb-proxy-client-udeb_0.8.14_all.udeb

If you happen to know how to make it work, I’d be glad to know about it.

Final Thoughts

Having my machines installed automatically cost me much more time than installing them manually. I expected to have tangible results much quicker than I actually did. However, now I can re-install any machine within a few minutes which may eventually amortise the investment.

I’m still surprised by the fact that there is no “install it, dammit!” option for people who don’t really care about the details and just want to get something up and running.

Unfortunately, it seems to be non-trivial to just save the diff of the vanilla and the new ISO :-( The next Ubuntu release will then require me to redo the modifications. Next time, however, I will probably not use the kickseed compatibility layer and stick to the pure method.

GUADEC… Its been fun.

I’m not really much of a traveler or outgoing in any way. So when I was invited to GUADEC, I wasn’t very sure about it. It took some encouragement from my mentor and a fellow GSoC mate to convince me. And… I’m glad I went!

It was one of those things that I could not have experienced from my comfy chair to which I reserve myself for the greater part of my day. In fact this trip makes me feel I might be wrong about social interactions not being time well spent for me (but then again I don’t exactly buckle down into ambitious projects, so you’re free to call me ignorant).

This wasn’t a conference of geeky people talking geeky stuff (was it?) but a reflection of the GNOME community as a whole. Discussions involved both experienced as well as young members or interns like myself; and the place was full of developers, designers, translators and not to mention the organizers/volunteers who made sure throughout the conference that we didn’t have to worry about logistics and stuff. Oh and big thanks to you guys for the food and the vouchers. I made sure they were put to use. 😀

So in short this is how I’d summarize my experience:

  • Going to new places and meeting people was fun.
  • Some of the conference talks were really got me thinking.
  • Open source is more than just making your code being open for others to see.
  • Productivity and interest in a BoF session is directly proportional to your contribution and how much you learn.
  • Travelling together or sharing a dinner table can spark interesting conversations.
  • I had a peek into the vision that the members have for GNOME.
  • I had some great time with my mentor.
  • I don’t actually suck on the stage (I gave a lightning talk!).

I’m sorry if using a list is a crappy way of documenting one’s travels. But overall I’d say this visit has given me a different outlook and confidence towards being a contributor to GNOME and the open source community in general. Thank you GNOME for sponsoring me.


And another big thanks to the organizers for arranging the picnic and other lovely excursions! I’ll make sure to provide a helping hand next time.

By the way… I used to think the ‘G’ was silent. 😛

gnome-boxes: GSoC Evaluation

This post is meant to be a final self-evaluation and self-analysis of my work for gnome-boxes during the summer. The initial project idea was about implementing/fixing a bunch of SPICE-based features/bugs to/in Boxes. The list of bugs of the SPICE component has since changed, as some new bugs have been discovered and some old ones have been closed, so I made a summary of my involvement:

Tasks completed:

Some of these. although have been completed from my point of view, still need my mentor’s final approval. I have published demo video screen captures of all the implemented features in my previous posts.

  • I added a bunch of useful new help group options.
  • I created a way for the user to be informed that a guest machine with SPICE display doesn’t have the SPICE agent installed. This was a problem before, because you had a hard time figuring if the SPICE agent is properly working in the guest or not.
  • I made the USB redirection also available for inactive SPICE displays.
  • I fixed a bug that was preventing GNOME-Boxes to close the windows of remote machines that were powered off from inside the guest.  (initial bug was about SPICE, but it also happened to remote machines with VNC display ).
  • I reported and fixed a major bug, that was causing GNOME-Boxes to close entirely when powering off/pausing a live libvirt machine that had its separate window. Although the patches haven’t been accepted yet because they need more testing, my mentor told that the fix looks really good.
  • I implemented  a better way of sending files to guests with SPICE display, alongside more visual feedback regarding the transfers. I have created loading bars which users will be able to see during one/multiple transfer and they will also have the ability to cancel transfers. In addition, an extra screen will also appear above the SPICE display which will inform the users that they are about to initiate a transfer.
  • I made use of the already existent spice-gtk API and implemented folder sharing between the host and a guest with SPICE display. I also created patches for making it as much out-of-the-box as possible (the WebDAV channel is automatically added to local displays and spice-webdavd is automatically installed in windows/fedora). Stuff still needs to be done, which I will cover in the next section of this post.
  • I managed to expose SPICE/VNC connections on the network. Through the help of some libvirt-gconfig API I added, the user will be able to expose connections of local displays on the network at choice.
  • I made GNOME-Boxes able to create remote machines out of SPICE/VNC connections exposed on the network by other GNOME-Boxes clients.
  • I added two new phases to the remote machines wizard, setup and preparation, which now test the connection and check that the user has the right credentials to access the remote machine.



Future goals:

  • Multiple shared folders:

So far I have created the UI for multiple shared folders in Boxes and  got to know a lot about how things work by implementing multiple shared folders in phodav. Marc-Andre Lureau suggested a better way of implementing multiple shared folders, by creating links to all the folders in a GNOME-Boxes private folder, which requires work only on the client part of SPICE layers. Considering that phodav will be reimplemented soon, this is definitely the best solution.

  • Connect to remote libvirt machines using SSH

So far I have done some research and came up with a solution to the problem in libvirt, by creating a SSH tunnel and providing using a method call a fd through which the connection will be possible, although I didn’t found the time to actually implement it.


  • spice-webdavd needs to be included and mantained in Debian/Ubuntu as a package, a task which I learned that is a lot more difficult than it appears to be . I will try to involve as much as possible to help this.

I have also made a spreadsheet with links to all the patches:



A shout out to my mentors: Zeeshan Ali, Victor Toso, Pavel Grunt and Fabiano Fidencio for the much needed help and advices:)




GNOME Usability Test Results (Part 1)

This is the first part of analysis for the usability test I recently conducted, with the purpose to uncover usability flaws of two GNOME applications: Photos and Calendar.
For this part I am focusing on visualizing the results, demographics and talk more about the methodology I used for testing. We will take a closer look on how testers performed on every task given, using a heat map. Hopefully this will create a clear picture of the testing process and help to “get to know” the participants and understand them better!

Ten volunteers participated in the usability test, representing a mix of genders (slightly more men than women) and an age ranges (mostly at age 15 to 25).



All participants were asked about computer usage frequency and the majority said that they use it on daily basis.


Participants identified their computer expertise by choosing a level between 2-5.

1-I don’t know anything, I never use the computer

2- I don’t know a lot, I am not a frequent user

3- I know some things

4- I am pretty average

5- I am better than most



Most of the participants were not familiar with GNOME. Some of them had heard about it in the past but this was the first time using it, three of them use GNOME daily.GNOME Usage

Testers were provided a  laptop running GNOME 3.20 on Fedora 24 operating system, without any modifications that could possibly affect the participants overall experience during the test. They executed the test separately, using identical settings. I used Gnome Continuous image running on GNOME Boxes, to test with Calendar. Each participant used a separate guest  account that had been pre-loaded with the example files needed to complete the tasks.

Each usability test session started with an introduction:
Thank you for coming today!

Just like Windows is a desktop system and MacOS is a desktop system, GNOME is a free software desktop system. And you’ll be doing a few tasks using GNOME and a few GNOME applications. I’ll give you the tasks one at a time. We aren’t “testing” you. The test is all about the software. If you have problems with part of the test, that’s okay; that’s exactly what we are trying to find. So don’t feel embarrassed if you have problems doing something and please do not feel pressured by time or anything else. If you can’t figure something out, that is perfectly okay and will still provide us with useful information for the test.  If you have any questions about the tasks I will try to answer them, but the answers and feedback should come directly from you as much as possible so I will avoid anything that would lead you to a specific choice.  Also, I’m going to take notes while you’re doing these tasks. It will help me if you talk out loud when you are doing something, so I can take notes. So if you’re looking for a Print button, just say “I’m looking for a Print button.” And move the mouse to wherever you are looking on the screen, so I can see where you’re looking. It would also be very helpful for me to do a screen-record of the testing process, so that I can go back to that later during my analysis.


After that, participants were presented with 16 scenario tasks which they were expected to complete in 40-50 minutes. All the participants managed to complete the tasks in less than 50 minutes.


1. You just got back from your trip to Thailand. You want to show your friends all the pictures that you captured there but you notice that they are all mixed with the other pictures that were previously there. To avoid the confusion you decide to create an album that contains only pictures from your trip and name it “Thailand trip”.

2. As you are showing the pictures of the album you just created, you notice a picture that you’d like to share on your social media accounts. You “favorite” that picture, in order to access it more easily later on.

3.While looking trough all the photos, you notice that two of the photos look very similar, so you decide to delete one of them.

4.After showing your friends all the pictures of the “Thailand trip” album, you revisit your “favorite” picture since you want to edit it before sharing on social media.

5.You start by cropping the picture to make it look smaller.
6.Than you want to play with colors a little bit. You want to make the picture brighter and lower its saturation but leave the contrast as it is.

7.Now you want to enhance your photo. You sharpen it a little bit and leave the denoise as it is.

8.And finally, you choose a filter named “Calistoga” as a final touch.

9.You want to apply these changes, so the photo remains as it is.

10.You really like the way that the picture turned out and you decide to set it as a “Background picture”.



1.You want to have all your work related activities in your calendar but you don’t want them to be mixed with other activities, since you have a lot going on lately. In order to keep your events organized you decide to create a calendar only for work related activities. Name the calendar simply “Work” and make the activities appear in purple color.

2.You have a meeting with your boss today. You want to create an event named “Meeting for work”, the meeting starts at 2:00pm until 4:00pm. Make sure to put it in the “Work” calendar that you created earlier.

3.Set a reminder 10 minutes before the meeting starts, just in case you forget that you have a meeting.

4.You plan to throw a big celebration party for your birthday next year. You want to check what day of the week will your birthday be, while wishing for Friday so everyone can show up! Check the calendar and tell me what day of the week your birthday will be in 2017.

5.You have already created an event named “GUADEC” for the GUADEC 

conference you are attending next month but you forgot the exact date. Can you please search for it and then tell me the date.

6.You don’t want to move across different calendars, creating same events multiple times. So, you try to connect this calendar with google calendar (or any other online account you use).


I used Jim Hall’s heat map technique, to summarize my usability test results. I find this to be a great way to see how the users performed on each task. The heat map clarifies how easy or difficult it was for the participant to accomplish a certain task.

  1. Scenario tasks (from the usability test) are arranged in rows.
  2. Test participants (for each tester) are arranged in columns.
  3. The colored blocks represent each tester’s difficulty with each scenario task.

Green blocks represent the ability of the participant to accomplish the tasks with little or no difficulty.

Yellow blocks indicate the tasks that the tester had significant difficulties in accomplishing.

Red blocks indicate that testers experienced extreme difficulty or where testers completed the tasks incorrectly.

Black blocks indicate tasks the tester was unable to complete.

Heatmap(Click for a better view)

Generally speaking, participants accomplished most of the tasks without difficulties.

Tasks like edit a picture, change the color, enhance, apply a filter on Photos and set an alarm, search for an event on Calendar, seemed to perform really well.

Participants encountered the most difficulties in creating an album in Photos and adding a new calendar, adding a new online account in Calendar. There are two tasks(marked in black) that participants were not able to accomplish, which is a small number considering the number of tasks that were completed successfully.

I ordered the columns starting from beginners(left), to experienced users(right). We can notice the “Cool” rows with lots of green and yellow are dominating the right side of the heat map. This indicates the impact of the previous experience in accomplishing the tasks. Areas that describe the experienced users tasks are more likely to be areas with good usability.
This is a wrap for part 1 of usability test analysis. Next up, I am coming with more details “pulled” from the heat map. What was common between the “cool” rows and why did users find these easy to do? What was common between the “hot” rows? What where the challenges and what went well?

More to come soon!


GSoC with Pitivi

Customisable keyboard shortcuts for Pitivi
Google Summer of Code 2016 Summary

Over the summer I have been working on customisable keyboard shortcuts for Pitivi. Below, I am including an easy-to-read and concise summary of every bit of work I have done over the last three months.

The summary of all the code I have written can be found at:

The work above contains these key elements:
  • Refactor the code to use Gtk.Application.set_accels_for_action() in order to create the base for customisation.
  • Use the Gtk.ShortcutsWindow widget to allow the user to preview the keyboard shortcuts.
  • Refactor Pitivi’s Preferences dialog to use Gtk.StackSidebar.
  • Add keyboard shortcuts section to the Preferences dialog with a selectable list of all the shortcuts in the application to allow customisation.
  • Implement saving of shortcuts to an external configuration file for the case when a user changes the default shortcut settings.
  • Implement loading of saved accelerators from the configuration file and ignore the default accelerators when this happens.
  • Create a ShortcutsManager class dedicated to storing and handling of the accelerators. It is used for registering keyboard shortcuts in appropriate categories and their consequent management.
  • Fully support the ShortcutsManager class with tests, mostly using the Mock library.
  • Implement the customisation of accelerators via a separate dialog window opened after user's selection in preferences.

Blog posts describing all of the aforementioned work can be found at:

At the very end, I would like to specifically thank Alexandru Bălut for his great mentorship, valuable pieces of advice, willing approach towards answering my questions and, most importantly, for making me a better software developer.

August 22, 2016


I arrived at GUADEC a few days early to participate in the Board and AdBoard meetings.
Incoming and outgoing board members
Incoming and Outgoing Board Members
On my first full day in Karlsruhe the board met to slog through a long list of agenda items. We started the meeting with some team-building exercises. In general I hate team building, but Nuritzi's exercises weren't too bad. As part of one of them I told a story about a carved table a sculptor friend recently gave me:
Table with Carving of Coelacanth by Christopher Tucker
After the ice breakers were done, we sat down and went through outstanding tasks on the Board's to-do list. Some of the outstanding items were re-assigned to new board members, some were closed, and some were discussed. Cosimo took the task of asking the community how we should use the Privacy funds. It's a priority for us to put the funds to use, so tomorrow during the weekly board meeting we are going to review the community's feedback and decide on next steps. Another item we discussed during the meeting was how to create a standard code of conduct for GNOME events, so we don't have to re-invent the wheel every time. Allan, Nuritzi, and I worked on first steps towards that during the second day of the Diversity BoF.

On the main conference days I attended talks and a few unconferences, and met with some of the other members of the LAS GNOME team to work out the conference schedule. The local team did a fantastic job organizing the conference, and there were a lot of nice touches (like ice cream and the pool). Many of the talks were interesting, and it was nice to catch up a bit on what is happening in GNOME, and where people are interested in taking it in the future. Kudos to the GUADEC team for getting the talks uploaded so quickly. Some of my favorite talks from the conference were:
Light show at the Karlsruhe Palace
After the main conference I attended the Diversity BoF. On the first day we formed a diversity working group and defined a mission statement. We spent the remaining time brainstorming around the first point of the mission statement, which is to attract newcomers from underrepresented and marginalized groups. Here is an etherpad with notes from the first day (thanks to Philip Chimento for taking notes and emailing them to participants). The second day of the BoF we focused on forming a working group for the code of conduct. Allan, Rosanna, Nuritzi, Marina, and I signed up as core members of the group, and Cosimo, Benjamin Berg, and Federico signed up as supporting members. As our first action we sent an email to the board outlining the process we want use to put together the code of conduct, including how we will solicit feedback and ideas from the community, review resources, and present drafts of the CoC to the board and to GNOME foundation members. If things go as planned, we will send an email soon to the foundation list, asking for more volunteers as well as feedback and resources from the community.

As always, it was great to see everyone! Hope to see you all next GUADEC.

GUADEC Experience

In this blog post, I will be sharing my GUADEC experience which recently held from 11-Aug-2015 to 17-Aug-2016 in Karlsruhe, Germany. I actually got to see the faces behind IRC nicks, met most of developers and people from GNOME community and also most importantly, GUADEC helped me to meet my Google Summer of Code mentor Debarshi Ray in person which was just great.

Core conference 12-14 August

I attended most of the talks held during the core conference days. Some of which were too advanced to understand at this level. Hopefully down the line in future I would re-watch them (yes! talks are recorded here) and will be able to understand. But I could feel the energy in the room with the speaker presentating and answering audience questions. All in all, those were “legendary” :P

BoF days:

There were BoF sessions held after the core conference days. As I had already my GSoC’s project on hand, I just attended some BoF session for sometime. Rest of the time, I was focusing on my project.

I would like to mention, I did attended GStreamer workshop held on 11-August-2016, given by Olivier Crête. I was able to understand fundamental concepts in GStreamer including GstElements, Object’s Factory, pipelines, bins etc. At the end, we also built a small audio-video player capable of playing any media file. The workshop was sponsored by Collabora.

Olivier Crête prepared hands-on exercises which was a very effective method of learning quickly. The workshop was well-paced and I thank him for arranging the workshop. Looking forward to contribute to GStreamer. :)

I met couple of “legends” of GNOME community including my mentor, Christian Hergert, Sri Ramkrishna, Carlos Soriano and many others. I went up to them and discussed various aspects of how the community works, understanding roles of Board of Members. They were happy to answer all my questions and the discussions were quite productive as I aim to continue to contribute to this wonderful community.

Made couple of interesting friends I met at GUADEC, Gaurav, Amisha, Parth and Atul. We got to know about each one’s project on which they were working. We also presented our projects during intern’s lightening talk.

Lastly, I would like to thank GNOME Foundation and travel-committee for helping out with my travel and accomodation expenses. It would not have been possible without them.

Markdowm Image

Markdowm Image

Markdowm Image

Maps is fast again!

I just released a bunch of Maps releases.
  • 3.21.90
  • 3.20.3
  • 3.18.4
  • 3.16.4
  • 3.14.4
  • 3.12.4
  • 3.10.4

All of them speeding up the fetching of tiles in two ways.
  1. By downloading a service file telling us where third-party tile servers are instead of using redirect by proxy
  2. Allowing for more consecutive HTTP requests
Number 2 is only available by using the (as of now unreleased) version 0.12.4 of libchamplain.

Once your distro of choice picks up one of these stable releases you should be back to at least the old Mapquest speed of Maps. And if your distro upgrades to latest libchamplain when it arrives you will see even greater speeds.

And as a bonus, the latest libchamplain release will bring horizontal map wrapping, courtesy of excellent GSoC student Marius Stanciu!

Mozilla's new logo ideas

The folks over at Mozilla (makers of Firefox) are redesigning their logo—because apparently just having a wordmark isn't good enough. That said, maybe it's time to retire the dinosaur head.

In the spirit of openness, Mozilla has posted a series of logo concepts to their blog and invited the public to review and share their opinions. I am doing so here.

Choosing a logo is tricky business. When you ask business owners to talk about their logo, they want their logo to be the next Nike swoosh or the next Apple apple. Everyone recognizes the Nike swoosh:

But the truth is that not every organization needs a logo. And in Mozilla's case, my opinion is that maybe they don't need to update their logo.

Mozilla wants to tell a story with their updated logo. From the Mozilla home page, Mozilla highlights their impact and innovations:
Our impact

Working at the grassroots and policy levels, we teach web literacy, provide tools and advocate on behalf of every individual who values an internet built on fairness, inclusion and respect.

  • Stand Up For Encryption
  • Teach The Web
  • Try the Lean Data Toolkit

Our innovations

Using the web as the platform, we build open, innovative technologies that allow developers to work free of closed, corporate ecosystems and create faster, safer web experiences for us all.

  • Gaming on the Web
  • Virtual Reality Platform
  • Servo
  • Rust
That's a lot to encapsulate in a logo, if Mozilla wants to embody these principles in their new logo. But they gave it a good try.

I'll leave it to you to review the candidates. For myself, I think the best option is their "Protocol" logo:
That's a simple logo that represents both the "Mozilla" wordmark and reminds users that they are about the Internet.

And the new logo has something else going for it: colors. I once wrote in my other blog "Coaching Buttons" about color choice. For example, your tie color says a lot about you. This "Protocol" logo is in blue, which reminds people of harmony and working together. From my other post:

If you want to reassure others in a meeting, wear a blue tie. From the article: "Blue ties are a good investment because the colour reminds people of the sky and ocean, which has a calming effect, said Lindsay. … Patterned blue ties tend to give off a classic professional feel and can be worn in a global business environment without sending the wrong message. A subtle blue can be “soft and introspective” while a cobalt or royal blue can help you stand out just the right amount, she said. “Dark blues are often reminiscent of well-respected pilot uniforms. Navy blue is a trusted colour and gives us confidence."

So that's my recommendation to Mozilla: if you're really going to update the logo, this one seems best to me. But whatever logo you choose, I encourage you to use pleasant shades of blue.
Nike swoosh: Wikimedia (public domain)
Mozilla logo: Mozilla blog ("Protocol" logo)

2016 SFD Registration is on!

web-banner-chat-registerThe Digital Freedom Foundation is very happy to announce that registration of its thirteenth edition of Software Freedom Day has just opened. While the wiki has been back online for about a week we were still lagging on the registration. Fear no more, it is now fixed and you can all register your events!

On the bright side we have a newly configured server and brand new websites for SFD and DFF. Other sites and efforts are on the way.

On the sponsorship side we are keeping the same organizations for SFD, Google being our major sponsor, Linode and Canonical helping us on the infrastructure sides. Full details are available on this page.

We would like to point out a new additional sponsor for DFD in the name of Freiheit this year (from our perspective).

So as usual registration happens after you have created your event page on the wiki. We have an exhaustive guide here at for newcomers and for the others who need help, the SFD-Discuss mailing list is probably the best place to get prompt support.

So get ready to celebrate and happy preparations to all!

Celebrate SFD with us on September 17, 2016!

GSoC Summary

This post is meant to serve as a summary of work I did during GSoC. You may directly wish to skip to the links section

The Goal

The goal to be achieved was to be able to play both single player and multiplayer emulated games using a gamepad in GNOME Games

Where are we right now

  • Plug-n-play gamepad support: We use the SDL mappings format and thus reuse a huge community DB of mappings to provide this.
  • Monitor plugin and unplugging of gamepads and react to it without user interaction: The user should not be forced to take unnecessary steps to use the gamepads.
  • Multiplayer games/multiple gamepads support: While there is no GUI for this the current way is intuitive and easy to use. In fact, normally you won’t have the need to use the GUI at all. More about this here
  • Separate codebase that can be reused (not a library yet): The codebase leaves under a separate directory and has no dependencies on the main codebase. In fact, initially it was developed under a different namespace. Also in the process a library - libgamepad had been created. But I couldnt find the time to keep it up-to-date. Nevertheless it is functional currently also.

What is left to be done

  • Intuitive GUI to remap gamepads when multiple gamepads are plugged in. Mockups had been created and discussed ad the final design is ready (more about this in a future blog post)! You can check the current progress here.

Stretch Goals

I hope that I would be able to complete these during my winter vacation:

  • Create a gamepad mapping creator UI (currently either Steam or SDL’s controller map tool can be used for this)
  • Update libgamepad to match the current codebase of Games.


  • Evdev and the Joystick API: Initially WIP code had already been written by my mentor for the Joystick API and my project was to finish and polish that code. But later I came to know that the evdev API is the better API and that is what is used by all current libraries/programs (SDL/RetroArch). So I had to dig into the evdev API and start afresh.
  • VAPI for libevdev: Vala requires us to create VAPIs for using C libraries (and you have to do it manually for non-Glib based ones). While creating the VAPI for libevdev I encountered a lot of challenges and got to know the Vala language much better.
  • Understanding the SDL codebase and the mappings format: Now we needed a good mappings database. So we thought that it would be better if we could reuse some already existing database. So we decided to adopt the SDL mappings format, but I had some difficulty initially understanding their format (especially the GUID). Also I took inspiration from the SDL code and adopted it but I faced some difficulty understanding their C code.
  • Multiplayer support: We needed an intuitive way which does not interfere with the user, i.e. we wanted a way to implement this so that the user will not have to do anything to play multiplayer games by default but if he wants he can configure the default assignment. After some brainstorming we decided on this

Some technical details


GSoC: final evaluation

This blog-post contains the final evaluation of my Google summer of Code 2016 project for the GNOME organization. More precisely, I’ve been working in the Games application under the mentorship of Adrien Plazas implementing multi-source/multi-disc games and offer support to the PlayStation platform. If you want to skip to the links section click here.

This task involved contributing to various repositories and perform a set of different tasks.


In the following list there’s a summary about the steps I’ve followed in order to implement the features listed above.


  • Add pcsx_reARMed emulator to retro-plugins as the PlayStation plugin


  • Split the result handling from the game creation
  • Add PlayStationPlugin to gnome-games
  • Add GameFactory interface and a generic implementation
  • Instead of using plain URIs, use Media wrapper class
  • Implement MediaSet class, allowing more than one URI per game
  • Implement the UI that allows the user changing media/discs in the middle of a game
  • Add PlayStationGameFactory for the PlayStation plugin

Links with the commits to each repository:


PSX game in fullscreen, showing the multi-source menu on the right

Another PSX game, showing the multi-source menu

In case of wanting to see the contribution live, please go to the gnome-games repository to install the latest version of the app.

August 21, 2016

Do you want to test GNOME Photos?

If you are interested in testing the latest version of GNOME Photos, now it will be easier than before!

Recently we made Photos available as a Flatpak application. This means that you can now run the latest, unstable version and help us to find regressions or general bugs. At this time to install the application you still need to use the command line.

See here for installing the Flatpak package, after that you just need follow the few steps described below.

Add the nightly platform and application repositories:

flatpak remote-add --gpg-import=nightly.gpg gnome-nightly
flatpak remote-add --gpg-import=nightly.gpg gnome-nightly-apps

Install the nightly GNOME platform:

flatpak install gnome-nightly org.gnome.Platform master

Install the nightly GNOME Photos:

flatpak install gnome-nightly-apps org.gnome.Photos master

And when you want to update, just run:

flatpak update

Bug reports are appreciated! You can report them here (a registration is needed).

GUADEC: what a week!

So, another GUADEC is over. As I said in the previous post, this was my second time at the event. This time I’ve tried to be more involved: I applied for the volunteer team by helping with the catering which gave me the opportunity to meet the organizers (by the way, they are amazing!). Volunteering is a great experience, you have the opportunity to see some parts of the hard work that is behind the scene in a conference like GUADEC. I would recommend it to everyone!

Volunteering didn’t take away the time to attend to the talks that I was interested in. Just for mention a few:

If you want to see all the talks you can find them here or here, You should thank the CCC Video Operation Center for them!

But GUADEC isn’t all about talks, there were a lot of chatting, programming and being together. For each evening of the conference there were programmed events: a nice picnic with games, a pub night and a dinner.

Personally, I really enjoyed this GUADEC. It was really well organized and like the previous one, meeting the people you talk to for a year without seeing them helps a lot to discuss about the project. So I would like to thank again the GNOME Foundation for sponsoring me.

Next GUADEC will be in Manchester! So if you missed this, be prepared for the next! And if you are unsure about it, don’t be shy come to GUADEC: it’s full of lovely people.


Paper Prototype Test Analysis

Ciarrai isn't on Planet GNOME, so I wanted to highlight their recent post about the Paper Prototype Test Analysis.

This usability test was a paper prototype usability test of the updated GNOME Settings application. Ciarrai included ten testers between twenty and forty years old, with good gender distribution (male, female, nonbinary) and pretty equal preferred OS platform (Mac, Windows, Linux) with slightly more non-technology professionals than technology professionals. Every participant claimed to use the internet daily. Only three of the participants had ever seen GNOME before.

Ciarrai presented testers with a typical scenario most users would likely encounter, and asked them to select the menu item in Settings they would try first. Ciarrai used twenty-three of these scenario tasks:
1. You set an alarm on your laptop. Now you want to make sure that it will be loud enough to hear from across the room. Where would you look in the settings app to change the volume of the alarm?

2. You want to simultaneously be to able to view your web browser and a text editor where you are working on a document. You have two monitors and want to spread your work space across them. Which setting would you use to enable this function?

3. You want to have your Thunderbird account to be the email that opens whenever GNOME is asked to open an e-mail client. Which setting would you try to make Thunderbird your official email?

4. You would like to know which version of GNOME you are running so that you can see if you are up to date. Which setting would you try to find out this information?

5. You are about to watch a movie on your computer. The internal sound is too low so you get out a Bluetooth speaker. Where in the settings app would you go to connect the speaker to your computer?

6. You are working on a few design projects and want to adjust the way your monitor handles colors so that none of the image quality is lost. Which setting would you try first to change the default colors?

7. You would like to be able to access photos from GNOME shell search. Which setting would you try first to see if photos can be indexed in a search?

8. You are a very skilled typist. You notice that a lag on your keyboard and want to speed up the computers’ response to your key strokes. Where would you look in the settings app for a way to change the keyboard speed?

9. You are going out of town for a week and having a friend housesit for you. She wants to use your desktop computer while you are gone and you are happy to oblige. Your friend’s native language is Spanish while yours is English. You think it would be nice to set your computer to Spanish for her so that she can use it more efficiently. Where would you look to switch the language to Spanish?

10. You prefer watching movies with the video player VLC. You would like to set VLC as the video player that GNOME connects to automatically. Which setting would you try first to make the change?

11. In a few minutes you are expected to be in a two hour long lecture. You want to take notes on your laptop during the talk. Where in settings would you look to see how much battery charge you have left in order to know whether you have to run to your car and get the charger before the lecture starts?

12. You’re at the office and you want to show a work presentation with a projector. Which Setting would you try first to connect your laptop to the projector?

13. You’re preparing for a remote work meeting. You wish to set a password that you will give to your coworkers so they can see and control your screen during the meeting. With which setting would you first attempt to do this task?

14. You find that you don’t like only having 5 minutes of idleness before your screen locks on your system. Where in the settings would you go first to adjust the wait time from 5 to 10 minutes.

15. You just bought a new printer. Which setting would you choose first to connect the new printer to your computer over WiFi?

16. You are living abroad for several months in a country with a time zone 6 hours ahead of yours. Where in setting would you go to adjust the time zone to reflect your new location?

17. You are listening to music on your computer. At the same time, you are torrenting a number of files. You don’t want the notification sound to disrupt your music each time a file successfully downloads. Which setting would you try first to mute the volume of the notification?

18. You don’t want to have alert messages come up when your screen is locked. Which setting would you try first to turn off these messages?

19. You are tired of looking at the default lock screen image on your computer. Where would you look first in the settings application in order to replace the lock screen image with a picture of your family that you have saved on your computer?

20. You want to be able to scroll with two fingers on your touchpad. Which setting would you try first to enable this scrolling on your touchpad?

21. You have the WiFi password for your favorite local coffee shop saved on your computer. While you are there one day working on your laptop the person next to you asks if you know the WiFi password. Where in settings would you look to locate the saved password in order to share it?

22. You’re at the office trying to get work done. The WiFi has gone down three times already today and you are frustrated with waiting. You have an Ethernet cable plugged in and set up already, which panel would you try first in the Network settings to switch over from WiFi to Ethernet?

23. You’re not getting a great signal to the internet. Where in the Network settings app would you go to change which WiFi network you are connected to?
The last three questions focused on the WiFi panel.

Ciarrai started their analysis using a heat map, which I have reproduced here (original was html; I copied/pasted that into LibreOffice to update the formatting). Each tester is a separate column (labelled 1–10) and each scenario task is a separate row. A brief recap of each scenario task is on the left side, and the corresponding correct selection is on the right side. In Ciarrai's heat map, green represents a correct response, red an incorrect response, and orange a correct selection of Devices or Details but an incorrect sub-menu selection:

click to view larger version

With this heat map, Ciarrai performs a breakdown of observed themes: Which tasks were easy for everyone? Which tasks were hard for everyone? Which tasks were somewhat difficult? Read Ciarrai's post for the full analysis.
image: Outreachy

GUADEC 2016, laptops and tablets made to run GNOME, surprise Pitivi meeting

I went there for the 2016 edition of GUADEC:


I arrived a couple of days early to attend my last GNOME Foundation board meeting, in one of the KIT’s libraries. The building’s uncanny brutalist architecture only added to the nostalgia of a two years adventure coming to an end:



And so I made a new talk proposal at the last minute, which was upvoted fairly quickly by attendees:


The conference organizers counter-trolled me by inscribing it exactly like this onto the giant public schedule in the venue’s lobby:


The result was this talk: Laptops & Tablets Manufactured to Run a Pure GNOME. Go watch it now if you missed it. Note: during the talk’s Q&A session, I mistakenly thought that Purism‘s tablets were using an ARM architecture; they’re actually planned to be Intel-based. And to make things clear, for laptop keyboard layouts, Purism is currently offering US/UK, which are different physical layouts (different cutting etc.).

Also relevant to your interests if you’re into that whole privacy thing:

In my luggage, I carried ~20 kilograms of the Foundation’s annual reports. Some folks were skeptical and thought I should “only bring a few of them, people aren’t usually interested in the annual report.” Well, they were dead wrong: within one afternoon, the annual reports “sold out” like hotcakes. See also my tandem lightning talk (at the 29mins mark) to get a glimpse of how much work we put into designing the new annual report this year. Also, if you took one of them at the conference, remember: they’re precious little works of art and a powerful tool to convince people to become contributors or sponsors to support GNOME, so make sure to use them towards that goal!

I was very happy to see Mathieu and Alexandru from the Pitivi team deciding to attend at the last minute, even if it was just for one day. We spent time with Jakub Steiner discussing his workflow and wishlist for a “perfect” video editor:


Pitivi makes people smile!
Left to right: Alexandru Băluț, Jakub “Skywalker” Steiner, Mathieu Duponchelle.

I took a handful of photos of the BoFs and uploaded them to my gallery for GUADEC 2016. Licensed under the Creative Commons “by attribution” 4.0 as usual, so that the GNOME Engagement team can use them for GNOME promotional materials if needed. Make sure you do the same and list yours in here.

The Flatpak BoF session

The Flatpak BoF session

Overall, this GUADEC was one of the most well-organized ones I’ve seen in years. I was floored by the amount of efforts and planning the local team put into this. They really deserve some kudos! Everything ran smoothly on the surface (I know that in such events there will always be odd situations happening here and there, but they dealt with them so efficiently that they were invisible). The team had a professional-grade two-way radio system to coordinate, a car and trailer to carry stuff around every day, made and reused food (pro-grade cafeteria counter metal containers = genius), a lifetime supply of IKEA mugs that got washed and reused frequently, tons of snacks, managed to pull in great sponsors even at the last minute, put signage in various parts of the city to guide people to the venue, had huge quantities of tasty dead animals (and plants) to eat at a very successful barbecue event, got an icecream vendor to come to the venue, and even filled up a pool and beanbags, for pete’s sake!

Thanks to the the Chaos Computer Club for providing a flawless live video streaming, recording and publishing service. Very rarely did we have GUADEC videos published in a timely fashion in the past, let alone streamed live and with proper laptop video output capture as well as proper sound mixing. This is fantastic.

I should mention the closing night’s event in the biergarten, with sponsored drinks and food by our friendly GStreamer experts Centricular, a very nice gesture that was well appreciated by everyone.


Survivors at rest in the snacks bunker on the last day of the BoFs

Thanks to everybody involved to make this event a success, and thanks to the GNOME Foundation for making it possible for me to attend.

gnome sponsored badge shadow

August 20, 2016

GUADEC 2016: BoFs

The Birds of a feather sessions at GUADEC was a great opportunity to sit down and get work done. I participated in the engagement team’s BoF which involved lots of brainstorming for GNOME’s 20th birthday. Over the two days we delegated all the different tasks to do and planned what should be done up to and doing the event. Together with Sri I’ll be working on merchandise for the event which among other things could involve beer mugs.

28795698090_35a9a8ea74_kThe engagement team brainstorm in the form of sticky notes and whiteboard doodles. Picture by Jakub Steiner (CC-BY 2.0).

The BoF days were also spent on Polari work. Florian has had lots of code restructuring patches waiting for review. Hopefully they will enable us to land exciting features such as automatic nickserv authentication support soon. A couple of fixes has also landed which might make bouncer users happy.

I spoke with Philip Chimento about GJS and what could be interesting stuff to work on there. There are patches for having GJS snippets in Builder. I’m also hoping to someday see GJS documentation integrated with I couldn’t attend the GJS BoF itself but heard there was lots of interest in it so I’m looking forward to follow any developments here!

On the last BoF day there was an Ambassadors BoF. We are a lot of open source groups around the world and several also have people from the GNOME community involved in them. We discussed how we could distribute marketing materials and how the engagement team could help the GNOME groups around the world. Personally I’d love to see free and open source groups connect more and share their experiences and knowledge. Another suggestion which came up was to make easily transportable newcomer packages which could contain things like stickers, pin buttons and balloons.

I met both old and new faces and GUADEC this year. Now I’m home, batteries once again loaded over the top with energy. Thanks to GNOME Foundation for sponsoring my travel and stay!

My GUADEC experience

It’s been three days since I got back home and I have to say that I already miss being there with all the GNOME community:).

I actually didn’t know how this experience would be. I had never actually been to a GNOME meeting before and all my interaction with the community was purely online.

But man, the whole trip was great. I met really awesome, fun and amazing people that I would enjoy working with. And we actually did that, as some of the time was actually spent rebasing and rewriting the git history of my GSoC project😀.

I was amazed by how friendly everybody was and how quickly I integrated myself into the community. They made it so much easier. It didn’t take more than a few minutes until we started having beer together and cracking jokes. And this was just the first night when I had just arrived there.

The core days involved attending talks throughout the day (with a lunch break and several smaller ones in between the talks). I even volunteered to film two of the presentations and it was fun. I even had my own lightning talk, during which I presented my GSoC work.

The next three days had a schedule that was a bit more relaxed, the BOFs were quite interesting and I learnt quite e few interesting things during them.

I would really like to thank the GNOME foundation for sponsoring me on this trip and for giving me this awesome opportunity!



August 19, 2016

Contributors to Nautilus

At GUADEC Andre Klaper made a report of top most contributors to GNOME in the last year, and to my surprise I saw my name in the top 5 of patch reviewers. Did I really review so many patches?

If you remember I did a blog post stating how healthy Nautilus development is being lately. However I didn’t know it was at this level. And now I also understand why I spend less time coding these days.

To summarize, the first year as maintainer of Nautilus I reviewed around 100 patches in total.

And this is how it looks this year


567 patches reviewed! Almost 6 times more than one year ago. Those patches come mostly from the 5 contributors I mention in the previous blog post. I’m glad they keep contributing to Nautilus, and doesn’t look like they want to go away.

Some of those contributors gained enough experience to help me with the project as a whole, discussing with other contributors improvements on the code, triaging in Bugzilla and reviewing patches. In this a big thanks goes to Ernestas Kulik, who is doing an amazing job and a great help to me in the parts I most need. And of course my GSOC minions Alex and Razvan who I had an amazing time at GUADEC with:) .

Related to this, I asked on the Nautilus BOF at GUADEC what makes contributing to Nautilus interesting for people, and why they keep doing it. I was surprised to know that all of them agreed that most part of it is not the actual code, but our relationship in the channel and the small community we created inside the Nautilus project. Being responsive to the patches contributed and being present on the IRC channel for questions and random small talk makes the whole experience much more enjoyable. Chatting in the channel while coding to Nautilus became a “one beer with friends” time.

I feel the project is indeed moving in the right direction.

Thanks all!


Suffix Tree, Ukkonen, C++

I’ve been playing with suffix trees recently, in particular trying to get my head around Ukkonen’s algorithm for suffix tree construction. I’ve got the hang of it now after trying out some code and checking it against this excellent video walk through of Ukkonen’s algorithm by Tushar Roy.

Tries, Radix Trees, Suffix Trees

A suffix tree stores every suffix of a string, or of several strings, and makes it easy to find prefixes of those suffixes, in linear O(m) time, where m is the length of the substring. So it lets you find substrings in O(m) time. So it can be used for full text search, and it’s often used for DNA comparison.

A suffix tree is actually a radix tree (also known as a radix trie), with suffixes inserted instead of just the whole string. A radix tree  is itself a compacted trie (also known as a prefix tree).

A trie (pronounced try) is a tree with characters on the edges, letting you discover the whole string as you traverse the edges, staring with the edge from the root for the first character of the string. For instance, this lets you offer text completion if the user gives you the first few correct characters of a word.

A radix tree compacts the Trie by letting each edge have several characters, splitting the edge only when necessary to distinguish different strings. So, while a Trie containing “abc” would have a chain of root->a->b->c, a Radix Tree would have just root->abc. Adding “abd” would change that to root->ab->c, with another for root->ab->d.

A suffix tree, or radix tree, can save space by storing just the start and end indices of its strings instead of the strings themselves. Then each edge has constant size, and the space for the tree is linear O(m), where m is the length of one inserted string. Or maybe you could say its linear O(nk), for n strings of length k, where k is m considered effectively constant.

For the string “banana” a suffix tree would look like this, with both leaf nodes and intermediate end markers marked with *.


We can add a second string in the same suffix tree, associating values with the leaf at the end of each path, letting us know which items have a particular substring. For instance, if I add “banana” (value 0) and “bandana” (value 1) to a suffix tree, I can ask about “ana” and discover that it identifies both items (value 0 and value 1), via the a->n->a path. The tree looks like this:

   ana (0)
   dana (1)
a (0, 1)
  a (0, 1)
   na (0)
  dana (1)
 a (0, 1)
  na (0)
 dana (1)
dana (1)

Suffix Tree Construction

The hard part is constructing the suffix tree. When we insert one string of length m, we actually insert m suffixes. If each suffix insertion takes O(m) time, then the whole construction time is at least O(m^2).

Ukkonen’s algorithm reduces this to O(m) by iterating through the string just once from start to end and using the ideas of an implicit “global end”, the “active point” and “suffix links” to jump to wherever the rest of a smaller suffix should be inserted.

Each “phase” deals with one character from the string, in sequence, performing “extensions” within that “phase” to add suffixes that start with that character. This is useful because of the repeating sub-structure of suffix trees – each sub-tree can appear again as part of a smaller suffix.

Global End

Whenever the algorithm adds a node, that’s going to be a leaf node, meaning the edge to the leaf node will have the actual end of the inserted string. So the algorithm assigns a global end to the edge. We increment that end index each time we process the next character, so these edges get longer automatically.

Active point

The active point identifies a point on an edge in the tree by specifying a node, an edge from that node (by specifying a first character), and a length along that edge. Within every “extension”, the algorithm starts looking for the next character at the active point. Sometimes it will find the next character only because an edge got longer automatically when we incremented our global end.

Whenever it finds the next character from that active point, maybe even after stepping across an intermediate node,  it sets that newly-found position as the active point. This is called Rule 3.

Whenever it doesn’t find the next character from that active point, it adds a node, splitting the edge if necessary. This is called Rule 2. Whenever it splits an edge and creates an internal node, it changes the active point to the same character in a smaller edge, and looks again for the same next character. This lets it do the same split in the smaller suffix. It keeps doing this until all the smaller suffixes have been split in the same way.

This example, with the string “banana”, shows the use of the global end and of Rule 3 and Rule 2. It doesn’t show the use of suffix links yet, because it always splits edges from the root. Note that Ukkonen’s algorithm typically appends a special out-of-alphabet “$” character to the string so it can insert leaf nodes.

b: Look from root. Add to root.


a: Look from root. Add to root.

ba (because we incremented the global end).

n: Look from root. Add to root.

ban (because we incremented the global end).
an (because we incremented the global end).

a: Look from root. Find it (“ana”). Set it as the active point.

bana (because we incremented the global end).
ana (because we incremented the global end).

n: Look from previously-found “a”, in “_a_na”. Find it. Set it as the active point.

banan (because we incremented the global end).
anan (because we incremented the global end).

a: Look from previously-found “n” in “a_n_an”. Find it. Set it as the active point.

banana (because we incremented the global end).
anana (because we incremented the global end).

$: Look from previously-found “a” in “an_a_na”. Not found, so add an internal node and add the $. Change the active point to same character in a smaller (suffix) edge: “a” in “n_ana”.

banana$ (because we incremented the global end).
   na$ (because we incremented the global end).

$: Look from “a” in “n_a_na$”. Not found, so add an internal node and the $.
Change the active point to same character in a smaller (suffix) edge: “a” in “_a_na$”.


$: Look from “a” in “_a_na$”. Not found, so add an internal node and the $. Change the active point to root.


$: Look from root.  Add to root.


Suffix Links

In Rule 2, when the algorithm splits an edge, adding an internal node, if sets a suffix link for that internal node, pointing to root. If it has previously set a suffix link for any other internal node, while looking for the same character (in the same “phase”), it updates the link for that previously-created internal node to point to the new node.

If the active node is not root after adding the internal node, it also changes the active node via the active node’s suffix link, taking us to a previously-created internal node. As before, this lets us jump to the smaller suffix of the same substring, to make the same split there, but suffix links let us do it even when we are not on an edge from root.

We can see this when using “banbadbans” as an example. We reach this point:

a: Look from “n” in “ba->_n_badban$”. Not found, so add an internal node and add the $. Follow the suffix link from the “n” to the “n” in “a->_n_badban$”.


a: Look from “n” in “a->_n_badban$”. Not found, so add an internal node and add the $. Follow the suffix link from the “n” to the “n” in “_n_badban$”.


a: Look from “n” in “_n_badban$”. Not found, so add an internal node and add the $. Follow the suffix link from the “n” to root.


a: Look from root. Not found. Add to root.


Example Code

Here is some example C++ code. It’s also in github, with far more comments.

const auto key_start = key.start_;
const auto key_end = str_end(key);

ActivePoint active;
active.node = &root_;
active.edge_valid = false; // Instead of -1.
active.length = 0;

std::size_t remaining = 0;
auto end_ptr = std::make_shared<KeyIterator>(key_start);
KeyIterator& end = *end_ptr;

// The "phases"
for (auto i = key_start; i != key_end; ++i) {

  Node* prev_created_internal_node = nullptr;

  // The "extensions".
  while(remaining) {
    const auto edge_match = (active.edge_valid && active.length) ?
      find_partial_edge(active, i) :
      find_partial_edge(active.node, i);
    const auto edge = edge_match.edge_;
    const auto part_len_used = edge_match.edge_part_used_;

    if (!edge_match.char_found_) {
      KeyInternal prefix(i, end_ptr);

      // Rule 2 extension: There is no match:
      if (part_len_used == 0) {
        active.node->append_node(prefix, value);
      } else {
        auto extra_node = edge->split(part_len_used);
        extra_node->append_node(prefix, value);
        extra_node->suffix_link_ = &root_;

        if (prev_created_internal_node) {
          prev_created_internal_node->suffix_link_ = extra_node;
        prev_created_internal_node = extra_node;

        if (active.node != &root_) {
          active.node = active.node->suffix_link_;
        } else {


    // Rule 3 extension:
    active.node = edge_match.parent_node_;
    active.edge = edge->part_.start_;
    active.edge_valid = true;
    active.length = part_len_used;


Generic Suffix Tree in C++

However, the basic Ukkonen’s algorithm just stores one string. Before trying Ukkonen’s algorithm, I wrote a templated C++ suffix tree that can contain multiple strings (see the test code), with a simple O(m^2), or possibly O(m^3) construction time.

I created a version that uses Ukkonen’s algorithm, reducing construction to O(m) time, but it doesn’t support multiple inserts. In this implementation, I’ve avoided the need for extra “$” leaf nodes. I’ve also stored the suffix links in a hash table, to avoid wasting space per node even after construction, though that replaces a true constant-time read/write with an amortized constant time hash table insert/lookup.

I’m trying to adapt the Ukkonen-based suffix tree to support multiple inserts. Usually, to create such a “generalized” suffix tree with Ukkonen’s algorithm, you concatenate the strings together, separated by unique out-of-alphabet characters (“$”, “#”, etc), insert the whole thing, then prune the paths you don’t need, but I’d like to avoid that.

I’m not suggesting that anyone use this code for serious work. For now, it’s littered with asserts() and debug output and it’s in need of optimization because it’s generalized for any standard C++ container, such as std::string. For instance, it doesn’t seem wise to store std::string::iterators, instead of pointers, for the start/end ranges on edges. I’m also bothered by the use of std::shared_pointer<>s to share the “global end”, which still take space per edge even after construction.

Alternative Algorithms

Update: I’ve just watched Erik Demaine’s 2012 MIT “Strings” lecture about suffix trees (I needed to watch his previous “Static Strings” lecture first). He doesn’t mention Ukkonen’s algorithm, but does mention a “DC3 (Difference Cover 3)” algorithm by Kärkkäinen-Sanders-Burkhardt (at least the lecture’s student notes call it that) for building suffix arrays in linear time. He shows that a suffix tree can then be constructed from a  suffix array by using the LCP (Longest Common Prefix) of the suffix array to build a cartesian tree, again in linear time. So the whole suffix array construction would be linear time. Suffix arrays themselves anyway offer better data locality than suffix trees and this DC3 algorithm apparently allows parallelization. I hope I find time to explore all that sometime in code.

He also mentions the use of a “suffix tray” to store the edges in each node, to get  O(P  + lg(Σ))) query time, much the same as the O(P) time you’d get with an array, while reducing the overall space complexity to O(T) instead of O(TΣ ). Here P is the size of the query string, T is the size of the text being searched, and Σ is the size of the alphabet. He also mentioned instead using a combination of hash tables and van Emde Boas trees to get O(P + lglg(Σ)) query time. Those parts of the lecture felt quite rushed to me, so I’d like to investigate that sometime too if I find time.

Unit Testing GTK+ libraries: has_default GtkWidget property

For my GTK+ based library, I use Vala and Glade to create templates for custom widgets with Unit Testing. For some reason I set can_default and has_default to true, this throws a warning message:

Gtk-WARNING **: /build/gtk+3.0-z20Lwo/gtk+3.0-3.20.7/./gtk/gtkwidget.c:8550: widget not within a GtkWindow

That 8550 line is related to method gtk_widget_grab_default, when you create your new custom Gtk.Grid derived widget, before to add it to a Gtk.Window, it calls this method before it has a top level window, sending this warning.

Now, for general GTK+ applications this is not a problem; but for GTK+ libraries trying to add a kind of Unit Testing. GTest will fail your test case, when any warning is raised, then you can’t continue until you fix it.

This is to help any one with same issue and for me for future developments.

Hope to share some of my work to create a custom GTK+ Window widget for custom widget testing using  GTest; stay tuned.


Autotools Templates for GNOME Builder for GTK+ Vala applications

I’ve recently finished a makefile to make easy to create GTK+ applications as well as GTK+ libraries using Vala programing language.

While Vala allows you to use UI files generated by Glade as templates to create custom widgets, is recommended you add these ui files as resources to your application or library’s binaries, in order to build your User Interface. While Vala custom widgets are out of scope of this post, we will talk about how I’ve created a makefile to be imported into your for GTK+ resources embedding., is a file to be included in your, after you include or, depending on your project. Use the first for  GKT+ applications; the last when creating UI libraries.

Once this pre-requisites are met, you are ready to set up a GTK+ application, because, adds to your VALAFLAGS the gtk+-3.0 package, but the most important, it adds a reference to the XML file with all your resources to be embedded into your application or library binaries. This is required in order to Vala’s compiler to find all your UI files for widgets templates or simple build using GtkBuilder; also images, and any other kind of file can be added as resource, like licenses, texts, and others.

glib-compile-resources is used to generate a C source code file and its header, for all resources, to compiled with your project’s target. Once it is compiled this way, all your resources will be available using GResource or any other function using GLib resources.

For GNOME Builder, I’ll send a patch for it to add an Autotools template to create both applications and libraries for GTK+ written in Vala with resource compilation support.

May be in the near feature, this file could be splitted to include just resource generation as, in order to use it when GTK+ is not used at all, but this is another history and a good reason to write some thing about.




CONEISC2016 was held in Pucallpa, Peru and it was an event that gathered more than 1200 people. Students and professionals in the field related to the System Engineering, shared experiences and knowledge about their communities and expertises.


In the middle of the Peruvian jungle, I gave two workshops regarding GNU/Linux during six hours. The first workshop started with the History of Linux, then the introduction to the FEDORA and GNOME projects and how I was involved since 2010 and my experience through all these years. I showed them in links the GNOME and FEDORA communities.


We also celebrated the installation of FEDORA in the Lab of the University for the very first time. Now UNU has its first Lab with Linux(FEDORA). At the end, the GNOME+FEDORA party with the cake and globes were there!


The second day the students browse the usability of FEDORA+GNOME and they use the terminal to write some programs with Python. I taught the vi commands, the applications of GNOME, how to contribute and how to participated to the projects through the OPW and GSoC programs.


The online presence of Athos from FEDORA Brasil for a few minutes was so important to support me. I also invited people to go to FUDCON Puno in October 2016.


I want to thank to HackSpace for the fusion we did during the HACK CAMP 2016 to promote the FEDORA + GNOME use, so now we are able to reach more provinces to evangelize. Hope our friendship will continue as we grow up. Long life for the both projects!❤DSC03006

Thank you so much CONEISC2016 #ViveLaExperiencia

Filed under: GNOME, τεχνολογια :: Technology Tagged: CONEISC, CONEISC Pucallpa, CONEISC2016, GNOME, Julita Inca, Julita Inca Chiroque, ViveLaExperiencia

SFD Countdown Ready!

Celebrate SFD with us on September 17, 2016!The Software Freedom Day countdown is ready for usage in English. We are therefore informing translators and also people willing to add a new language that translation can start right now. All the instructions are available on the wiki at this page.

For those who already want to add the countdown on their page/blog/website the code is the same as last year and has the same support for time zones. So if for example you’re living in Paris (GMT+2/UTC+2 that would be) then the code to add is:

<a href=""><img src="" alt="Celebrate SFD with us on September 17, 2016!" width="160" height="90" border="0" /></a>

The new svg file in English is here.

Should you want to run the script from your website and customize it to your liking you can find the source code here and you’ll need to add a cron job to run it every 15 minutes if you want to support all time zones. Else every day at 1am is probably fine. Full support available from our mailing list!

If you are preparing for your Software Freedom Day events, please create your team page here and registration will be opened shortly, stayed tuned!

Happy Software Freedom Day Preparation!

First impressions of GNOME usability testing

I am delighted to have completed usability testing on 10 participants!

Generally speaking, the testing process went really well. There are of course some downsides to it. I’ll go ahead and share an unordered list of some things that went right and some that went wrong:

  • Covering a wide range of users

I’ve had people of different professions, age and computer expertise taking the test. This led me to really interesting and surprising findings which I will share in a future post, explaining in details using heat maps and charts. It was really interesting seeing different people taking different paths to accomplish the same tasks.

  • The right number of testers

Looking back at one of my previous posts where I talked about “Deciding the number of testers”  I explained a chart which assumes that 5+ testers are enough to uncover most of usability issues. I found this to be correct, during the testing sessions. As the number of participants kept growing I encountered less and less surprising results. Their difficulties on certain tasks became almost “predictable”. So 5+ testers it’s really enough, if you don’t want to get into details.

  • The right number of tasks

Just before starting the tests I regretted the fact I had only written 16 tasks, thinking that I could include more, therefore cover more features. After the first test I changed my mind. Considering the fact that I spent some time before the test talking about GNOME and explaining the testing process, also answering some questions and including the follow-up questions, 16 tasks were just enough. It would be very hard to keep the participants concentrated for a longer period of time.

  • Blame it on usability

Even though in my pre-test script I explained to each participant that the tests purpose it is not testing their knowledge but it is testing GNOME’s usability instead, I could see they still felt uncomfortable when they weren’t able to accomplish a certain task immediately. So I had to repeat again that it is okay to not be able to accomplish the task, just blame it on usability😉

  • Thinking out loud and recording

Another point where participants felt uncomfortable was communicating their thoughts. Most of them did it only during the first tasks and then stopped. So I sometimes had to ask questions like “Could you please tell me what are you thinking this moment?”. Other times when I did not want to interrupt the participants, I asked them in the follow-up questions like”What were you thinking during this task?”, “Why did you make that choice?”…

Participants also felt uncomfortable to record their faces or voices during the test, so I only recorded the screen and wrote some notes during each test, so I can refer to them during the analysis.

  • Struggling with the tasks

I am really happy with the fact that the participants found the tasks clear and straightforward and accomplished most of them successfully, but there were some tasks that they all struggled to accomplish. Even though I mentioned in the beginning of the test that I can not help with the tasks, I am here just to observe. Yet they constantly asked for help. I noticed that this is a challenge for others who do usability testing too. In this case I was not an exception. It was really hard not to give hints, specially when they were so close to finish the task.

  • Yes to GNOME!

Except the tasks every participant had to accomplish on Photos and Calendar, I also let them explore GNOME a little bit. For example I let them relaunch the applications when they accidentally closed them, let them search for files(of course I offered help in case they needed, since this Is not part of the test). In the end I asked them about their overall impression of GNOME and if they would use it daily, and they all answered positively. They also asked a lot of open source related questions and some where interested to start contributing to open source projects.


So this was just a short first impression of the usability testing I conducted. There is a lot more to cover. I am planning to write more posts, that way I can get into details of the test.

See you soon!

August 18, 2016

Updating Firmware on 8Bitdo Game Controllers

I’ve spent a few days adding support for upgrading the firmware of the various wireless 8Bitdo controllers into fwupd. In my opinion, the 8Bitdo hardware is very well made and reasonably priced, and also really good retro fun.

Although they use a custom file format for firmware, and also use a custom flashing protocol (seriously hardware people, just use DFU!) it was quite straightforward to integrate into fwupd. I’ve created a few things to make this all work:

  • a small libebitdo library in fwupd
  • a small ebitdo-tool binary that talks to the device and can flash a vendor supplied .dat file
  • a ebitdo fwupd provider that uses libebitdo to flash the device
  • a firmware repo that contains all the extra metadata for the LVFS

I guess I need to thank the guys at 8Bitdo; after asking a huge number of questions they open sourced their OS-X and Windows flashing tools, and also allowed me to distribute the firmware binary on the LVFS. Doing both of those things made it easy to support the hardware.

Screenshot from 2016-08-18 10-36-56

The result of all this is that you can now do fwupd update when the game-pad is plugged in using the USB cable (not just connected via bluetooth) and the firmware will be updated to the latest version. Updates will show in GNOME Software, and the world is one step being closer to being awesome.


Writing this from my home office, while drinking the first coffee of the day.

Once again, GUADEC has come and gone.

Once again, it was impeccably organized by so many wonderful volunteers.

Once again, I feel my batteries recharged.

Once again, I’ve had so many productive conversations.

Once again, I’ve had many chances to laugh.

Once again, I’ve met both new and long since friends.

Once again, I’ve visited a new city, with interesting life, food, drinks, and locations.

Once again, thanks to everybody who worked very hard to make this GUADEC happen and be the success it was.

Once again, we return.

August 17, 2016

A quick look at using JSX in GNOME

This is a guest post by Lars Karlitski (larsu).

Thanks to a travel sponsorship from the GNOME foundation, I was able to attend the GTK+ hackfest in Toronto recently. The discussions and energy there inspired me to work on a prototype of something I had been thinking about for a while: using JSX to create GtkWidgets.

JSX is a JavaScript extensions that adds XML literals to the language. It can turn code like this:

var win = new Gtk.Window({
    title: "hi",
    default_width: 300,
    default_height: 150

var button = new Gtk.Button({
    label: "click me"

button.connect('clicked', function () {


win.connect('destroy', Gtk.mainQuit);

into this:

function buttonClicked() {

var win = <Gtk.Window title="Hello, World" defaultWidth="300" defaultHeight="150" onDestroy={Gtk.mainQuit}>
            <Gtk.Button label="click me" onClicked={buttonClicked} />


I find that in addition to being more concise, it also makes the hierarchy of widgets much easier to understand when reading code later on.

It’s only a proof of concept right now, building on Andrea Giammarchi‘s great but not-quite-ready node bindings to GObject introspection. My fork is available at:

If you want to try it out, clone the repository and build it with:

$ npm install

Then, compile the simple example from above from JSX to plain JavaScript and run it:

$ $(npm bin)/babel examples/hello-world.jsx -o examples/hello-world.js
$ node examples/hello-world.js

Please let me know if you’re interested in this and whether it’s worth spending more time on it.

Sponsored by the GNOME foundation

Sponsored by the GNOME foundation

The Meson build system at GUADEC 2016

centricular-logoFor the third year in a row, Centricular was at GUADEC, and this year we sponsored the evening party on the final day at Hoepfner’s Burghof! Hopefully everyone enjoyed it as much as we hoped. :)

The focus for me this year was to try and tell people about the work we've been doing on porting GStreamer to Meson and to that end, I gave a talk on the second day about how to build your GNOME app ~2x faster than before.

The talk title itself was a bit of a lie, since most of the talk was about how Autotools is a mess and how Meson has excellent features (better syntax!) and in-built support for most of the GNOME infrastructure to make it easy for people to use it. But for some people the attraction is also that Meson provides better support on platforms such as Windows, and improves build times on all platforms massively; ranging from 2x on Linux to 10-15x on Windows.

Thanks to the excellent people at, the talks were all live-streamed, and you can see my talk at their relive website for GUADEC 2016.

It was heartening to see that over the past year people have warmed up to the idea of using Meson as a replacement for Autotools. Several people said kind and encouraging words to me and Jussi over the course of the conference (it helps that GNOME is filled with a friendly community!). We will continue to improve Meson and with luck we can get rid of Autotools over time.

The best approach, as always, is to start with the simple projects, get familiar with the syntax, and report any bugs you find! We look forward to your bugs and pull requests. ;)

Using the GtkSourceView API to write scripts that manipulate text

In the gnome-c-utils repository, I wrote some scripts that use the GtkSourceView library.

When a script needs to read some text, search something in it, and possibly edit the content, then having a GtkTextBuffer is really convenient.

GtkTextBuffer is good at navigating through text, with all the GtkTextIter functions. The content can be edited easily. And the GtkSourceView library adds interesting features like regex search & replace and file loading and saving with character encoding handling (GtkTextBuffer accepts only valid UTF-8).

So, that’s it. I just wanted to share that I find it convenient to write scripts with GtkSourceView (but maybe because I speak the GtkTextView/GtkSourceView API fluently).

GSoC: final week and results

Hello everyone, I’m very glad to announce that my GSoC project about implementing games with multiple medias is being finished this very week. Although the code is still being tested, it won’t have big changes. With that said, I’ll show and explain the results.

My project is split into four major patches (although it’s likely there will be more than three commits):

  • Support PlayStation games through retro-plugins
  • Decouple the URI handling and game creation from mime-type-tracker
  • Abstracting game creating in mime-type-tracker into game-uri-factory
  • Support multi-source games

Here are a couple of pictures, showing the final results (open them for a bigger resolution):

PSX game in fullscreen, showing the multi-source menu on the right

Another PSX game, showing the multi-source menu on the right

I will post one final post with the final evaluation and more results. Stay tunned! :)

August 16, 2016

Preliminary systemd.conf 2016 Schedule

A Preliminary systemd.conf 2016 Schedule is Now Available!

We have just published a first, preliminary version of the systemd.conf 2016 schedule. There is a small number of white slots in the schedule still, because we're missing confirmation from a small number of presenters. The missing talks will be added in as soon as they are confirmed.

The schedule consists of 5 workshops by high-profile speakers during the workshop day, 22 exciting talks during the main conference days, followed by one full day of hackfests.

Please sign up for the conference soon! Only a limited number of tickets are available, hence make sure to secure yours quickly before they run out! (Last year we sold out.) Please sign up here for the conference!

My Keynote at GUADEC 2016

Last Friday, I gave the first keynote at GUADEC 2016. I was delighted for the invitation from the GNOME Foundation to deliver this talk, which I entitled Confessions of a command line geek: why I don’t use GNOME but everyone else should.

The Chaos Computer Club assisted the GUADEC organizers in recording the talks, so you can see here a great recording of my talk here (and also, the slides). Whether the talk itself is great — that's for you to watch and judge, of course.

The focus of this talk is why the GNOME desktop is such a central component for the future of software freedom. Too often, we assume that the advent of tablets and other mobile computing platforms means the laptop and desktop will disappear. And, maybe the desktop will disappear, but the laptop is going nowhere. And we need a good interface that gives software freedom to the people who use those laptops. GNOME is undoubtedly the best system we have for that task.

There is competition. The competition is now, undeniably, Apple. Unlike Microsoft, who hitherto dominated desktops, Apple truly wants to make beautifully designed, and carefully crafted products that people will not just live with, but actually love. It's certainly possible to love something that harms you, and Apple is so carefully adept creating products that not only refuse to give you software freedom, but Apple goes a step further to regularly invent new ways to gain lock-down control and thwarting modification by their customers.

GUADEC 2016 trip sponsored by the GNOME Foundation!

We have a great challenge before us, and my goal in the keynote was to express that the GNOME developers are best poised to fight that battle and that they should continue in earnest in their efforts, and to offer my help — in whatever way they need it — to make it happen. And, I offer this help even though I readily admit that I don't need GNOME for myself, but we as a community need it to advance software freedom.

I hope you all enjoy the talk, and also check out Werner Koch's keynote, We want more centralization, do we?, which was also about a very important issue. And, finally, I thank the GNOME Foundation for covering my travel expenses for this trip.

GUADEC 2016: Core Days

I’m having the opportunity to once again go to GUADEC. I’ve had many great discussions, There’s so many great people to meet here.

Core Day 1: Friday
On the first core day I held a talk with Carlos about the newcomer initiative. Carlos has been involved for three years while I myself have been involved since around fall last year. Newcomers is a rebrand of GNOME Love and aims to be a clear step-by-step guide aiming to get developers introduced to GNOME development. Currently building relies on Jhbuild but im hoping for an even brighter future. Flatpak and GNOME Nightly SDK have the potential to make building gnome applications completely distribution agnostic. Should Nightly not build one day, we can also in large amount of cases fall back to an older version of nightly from a day or two before without this being a problem for the newcomer. If I made you curious you can watch the talk here.

28342074124_2bab4cfd9d_o-binliMe and Carlos giving the newcomers talk. Picture by Bin Li (CC-NC-SA 2.0)

During the evening there was a nice picnic in the evening with GNOME Games, good watermelon and great fun.

Core Day 2 Saturday
Saturday went with attending talks. To mention a few I attended there is Emmanuelle’s GTK: Are we in the future yet? and GNOME Music: State of the union. In the afternoon I also participated in the AGM where me and Carlos gave a brief review of the year working on the newcomer intiative.

Core Day 3 Sunday
On the third day I held a lighting talk about GUADEC’s streaming artwork. I spoke about the difference between SVG and HTML coordinate systems when applying transformations and how you can script and animate transformations using python and CCC’s intro-outro generator.

During the conference I had the opportunity to talk with many contributors. One of the items which I had on my list of interst was the GNOME developer center and what is going to happen there. I was also approached on the topic of which applications could be suitable for the newcomer guide once they get a nice wiki page and newcomer bugs filed against them.

As volunteer for GUADEC I had the chance to work on a lot of artwork. I made streaming artwork for the talk recordings. I also got requested to make artwork for the unconference slots.


For this year’s GUADEC T-shirts I created a conference-specific design and a generic design like last year. The conference-specific design was opted for and can be seen below:

28331201703_5188f8b064_zThe red edition of the GUADEC 2016 T-shirt worn by one Benjamin Berg from the local GUADEC team. Picture by Bin Li (CC-NC-SA 2.0)

Big hugs to GNOME Foundation for sponsoring my travel and accomodation. This thanks also goes out to all you donors who enable GNOME Foundation to sponsor contributors like me and events like GUADEC. Stay tuned for a blog post on the BoF days.

Report of GUADEC 2016

Hi all!

So this year was our first GUADEC, for both Aryeom (have a look at Aryeom’s report, in Korean) and I. GUADEC stands for “GNOME Users And Developers European Conference”, so as expected we met a lot of both users and developers of GNOME, the Desktop Environment we have been happily using lately (for a little more than a year now). It took place at the Karlsruhe Institute of Technology in Germany.

Apart from some people we knew from Libre Graphics Meeting events over the years, we met a lot of new faces, and that’s very cool. We have to spread ZeMarmot love, right?! 🙂


My first impression is the remarkable organization of GUADEC. They planned social events every day (barbecue, picnic with football, beer nights, dinners… even an ice cream truck at free price!), very well planned schedules, efficient sponsorship, workshops and hackfests, a cake for the 19th birthday… They know their geeks and we nearly never ran out of coffee (well, excepted during the hackfests ;-()!

GUADEC opens with a huge barbecue!

GUADEC opens with a huge barbecue!

GUADEC picnic

GUADEC picnic

Of course, we were not here just for the beer, there were a lot of very cool talks. I was quite interested into Endless and their OS based on GNOME. It was interesting to see the design experiment around GNOME maps too. There were also a bunch of discussion relative to security, and definitely the project on everyone’s mouth was Flatpak. This is clearly a technology that a lot of people have been waiting for, and the center of many discussions.

But also the small feedback that we got on how the GNOME Foundation works was quite insightful. Obviously this is only a small piece of it, but being able to participate and view some of the decision process, discuss about the money that the foundation had been able to raise, how it should be used, about new events around GNOME (like LAS GNOME). This all felt like an exciting time and a cool community to be part of.


Another of my activities was trying to get designers interested into GIMP. For people who have followed my work a little, you know I have been really involved into getting GIMP a design revival (taking over the GUI wiki, creating an official GIMP GUI mailing list, trying to make other developers interested into this topic again and proposing some ideas here and there…), yet with very limited success so far (well I had some, but would really love if things could go forward at a better pace). I think GIMP is clearly a great software, both historically and technically. Historically because it is the root of several awesome technologies, like GTK+ (no GNOME without, right?) or lately GEGL, and because many people would call it a “flagship” for Free Software. But great technically as well: I am very amazed how good the code is. It has its zones of darkness (every software has, especially after more than 20 years of existence), because it is still well organized, clean, following clear coding standards with quality code. There is obviously a good technical maintainership. Now the GUI is less than perfect. Not because it is flawed, but because it follows here too 20-year-old design standards. Any software this age has this kind of problem, especially with design paradigms evolving faster and faster. Yet I believe a software that great deserves a chance to get a new face. So what’s the link to GUADEC? Well I have tried to approach various GNOME designers and getting them interested to GIMP again. If you are one of these designers I approached, hopefully I convinced you to give it a try. If I didn’t approach you, I may just not have known who you are, and do not hesitate to come to me. I am not saying that any complete huge redesign will happen overnight. But you definitely have open ears and we, at GIMP, are willing to discuss how to make a better user experience! We can start small.

Another reason for our presence was obviously to present our project: ZeMarmot. We were quite pleased to discover that some people knew about us. I was clearly going there thinking we would be like total strangers. But not only did some people recognize us, but we even had someone telling us his daughter was a huge fan. What? We got our first fan girl?

By the way, they had this badge machine, so while we were there, we printed and created our first hand-made badges of ZeMarmot. About 3 dozens of them. They are therefore quite exclusive so if you got some of them while being there, don’t throw them away!
Oh and by the way, that’s Creative Commons by-sa badges, like our movie! 😉





For people interested into our talk, here it is! You’ll see some quite exclusive contents with a few seconds of some cuts of the pilote. Enjoy!

And so here we are, ready to leave Germany. This was a very interesting event. We may come back next year, who knows? Only regret I have is that I was really hoping to participate to a workshop, but since our hotel was already booked, it was not made possible. Well next year maybe…


So thank you GNOME for the event and also for sponsoring our travel there! 🙂

ZeMarmot sponsored by GNOME

August 14, 2016

GUADEC 2016 — Day 2

A dinner tradition in our house is to share three great things from our day.  Being at GUADEC is making it hard to remember to do this, so I thought I would list them here.

Jonathan’s talk

Jonathan presenting on asynchronous internetJonathan attempting to come up with a name for spotty/asynchronous/fluctuating internet

Not surprisingly, the kids loved Jonathan’s talk the most. It was a fascinating look into asynchronous internet and how much of the world do not live in areas with the infrastructure necessary to have a constant and fast internet connection.

Annual General Meeting

Board of Directors: Jim Hall (missing), Shaun McCance, Allan Day, Alexandre Franke, Cosimo Cecchi, Nuritzi Sanchez, and Meg FordThe new GNOME Foundation Board of Directors

The Board met for lunch to make sure we were all on the same page with regards to how the AGM would go. The kässespaetzle was just a bonus.

I love the AGM. It’s always great to see the presentations showing off how much has been done in the past year. The official presentation of the new Board of Directors and their offices lets the general membership the ability to match faces to the names they see and humanizes them.

At the end of the question and answer section, the Board proudly presented the annual Thank You Pants to Alex Larsson. (For those following along, purchasing these pants was my super secret mission from Day 1.) Although only the Board knew who the recipient was ahead of time, it was obvious through the prolonged standing ovation that the general membership approved of the choice.

Women’s Dinner

The annual GNOME Women’s Dinner took place tonight and was planned by Marina and Moira Schuler.  Much thanks to both of them! There were twelve women plus one youngster at dinner and we enjoyed wonderful food and conversation. It is always such an encouraging and supportive atmosphere. My daughter basked in it and came out of the evening convinced she can give a lightning talk herself. As her mom, I find this terrifying and yet am so proud of her for wanting to put herself out there. Maybe my referring to her as part of the far future yesterday was a bit premature!


GUADEC 2016 – Day 1

After spending Day -1 and Day 0 with the GNOME Board of Directors for the annual in-person meetings, GUADEC proper officially began today. With much excitement in the air, people were lined up out the door for registration.

Remembering the past

Shaun Opening up the 2016 GUADEC conference“Goooood morning, GUADEC!” -Shaun McCance

For us who have been around for a bit, it is always nice to be reminded of prior GUADECs. Shaun McCance evoked happy memories with his cheerful good morning to open up the conference. Bradley Kuhn’s keynote referred to past GUADECs he has attended. Coming up on GNOME’s 19th birthday, it is good to remember how we got here.

Celebrating the now

From the first talk (Alex Larsson’s talk on Flatpak), the first day of GUADEC moved at a quick clip. There were great technical talks that gave us insight into the goings on of multiple projects. However, I did end up missing some of the afternoon talks as I went out on a secret mission to acquire a specific garment for the AGM on Day 2.

Heading towards the future

GNOME 2016 internsOur interns and mentors right after the lightning talks.

The intern lightning talks are one of my favorite parts of GUADEC. It was exciting to see what they have been working on and welcome them into the community.

Carlos Soriano and Bastian Ilso gave a wonderful talk on the GNOME Newcomers initiative and gave ideas on how we can improve our ability to retain their interest. It is so wonderful that we as a community embrace our newcomers!

…and even further in the future

We knew this would be the case before we even arrived. The GUADEC wiki contains a wonderful page full of ideas for what might interest kids in the city. When we arrived at the venue, we saw the corner of the foyer area stocked full of colorful toys and colored pencils to occupy the children. The picnic along with the games were fun for all and it was a great way to introduce the next generation to how awesome our community can be.

August 13, 2016

Last phase of project

It’s been too long i have written a blog about my progress on ongoing pkcs11 certificate chooser. so here is the progress


Above image is basically dialog box which a user will see when the dialog box start, left hand side is a progress bar stating whether a certificate or key has been selected or not. beside that there are several pkcs11 token and file system option to chooser certificate from. when a user select one of the place for certificate selection right hand side dialog will turn into something as follow(as user select System trust token)

rsz_screenshot_from_2016-08-13_10-45-23 The content of the system trust token will turn up. when one of the certificate from the list is chosen the left hand side progress bar will show the detail of the selected certificate as shown below.


and also the next button for moving in forward will become sensitive. when one click on the next button the similar page for selecting a key will turn up.

Beside that suppose  a token is locked then the upper part of content area of  certificate has a button that will give a Entry box to login into the token to see more object in that token.rsz_screenshot_from_2016-08-13_10-54-14

when a user click’s on “Click Here To See More” then  a entry box for typing password will turn up to login into the token.


At last when user select certificate and corresponding key, then the output of dialog box is:

certificate URI

certificate pin/key required

key  URI

key pin required