29 Jul 2016

feedPlanet Ubuntu

Canonical Design Team: Developing for Vanilla v1

As Inayaili recently blogged, we are now working towards a goal of releasing Version one (v1) of Vanilla for early September.


Vanilla was created just over a year ago and in that time has been used to build a wide range of sites across Canonical and beyond. It currently averages around 1,500 downloads a month on NPM. We've been delighted to see it grow in popularity and see the myriad of different experiences people have been building using Vanilla.

A big advantage of this wide adoption is the feedback we've received from developers on the front line, including within our own teams at Canonical. This feedback has enabled us to identify growing pains and mark out clear areas for improvement.

The overarching themes for v1 are maturity and stability - ensuring the framework is a cohesive set of building blocks and also making sure those building blocks are stress tested and robust.

Practical steps

The first step we will be taking is to audit the codebase and ensure it adheres to our coding standards. This will include encapsulating all components with the BEM methodology which we have introduced to our coding standards within the last year.

We will also be working to improve accessibility and responsiveness of each component while making some aspects of the codebase less opinionated to help increase its applicability to a broad range of use cases.

Another big area earmarked for love is the documentation provided for Vanilla. Given that the framework is now used by a wide and diverse set of people, we can make no assumptions about what they may know. So we need to provide comprehensive documentation that not only details how to implement each component but that also explains where each component should or should not be used.

It's also important that everything in Vanilla is visible. Over time, code has slipped into Vanilla that is not documented on the demo. This can cause page elements to display in ways a developer might not expect. We will be addressing this by building a comprehensive documentation site at a dedicated URL. This will be the one-stop-shop for all things Vanilla and will replace the current Vanilla demo page and Sass docs.

We will also be restructuring Vanilla so it is in a better place for scalability and extensibility going forward. Vanilla currently employs a flat structure for simplicity but we've come to realise that it can be confusing to mix components with utilities and presentation with configuration.

We recently had a team discussion on possible ways to structure the code within Vanilla and settled on an approach minted by Harry Roberts - Inverted Triangle CSS or ITCSS. Structuring Vanilla in this way will not only improve the quality of the resulting CSS but make it much easier to initiate new developers to building with Vanilla.


Layers of ITCSS - courtesy of Harry Roberts

Exciting times

I'm very excited about this project and think it has huge potential to help shape how we in Canonical approach building experiences on the web, not to mention how the wider community will benefit from these changes.

If you have any feedback or ideas on the future direction of Vanilla from a development point of view, please do comment below - we'd love to hear from you.

29 Jul 2016 11:34am GMT

Dirk Deimeke: Linkdump 30/2016 ...

Aktueller Stand: 227 Artikel in der Leseliste ...

Letzte Woche war ich mit der Suche nach einem neuen Mobiltelefon beschäftigt, daher sind dieses Mal im Linkdump nur ein paar kurze Artikel.

Sehr schönes Editorial über den neuen Hype, Sammelwut.

Introducing Stack Overflow Documentation Beta ist eine logische Konsequenz und Weiterentwicklung der Antwortenplattform.

Work/Life-balance? blog/sysadmin/UniversitySysadminEmailMistake.

Nextcloud is replacing ownCloud and we will see what the difference will be.

Was beeinflusst meine Lebensplanung und warum? Danach lässt sich vermutlich mehr herausfinden. Ich will mein Ding machen! Aber was ist das?.

Wie es mir erging, nachdem ich einen Programmier-Kurs begann - für das Lernen von etwas Neuem ist es nie zu spät. Mit zunehmendem Alter dauert es vielleicht länger.

Einer der Gründe, warum ich mich im Open-Source-Umfeld engagiere, ist das Thema "Freier Zugang zum Wissen". Warum wir unser Wissen aber auch weitergeben müssen.

Wir sollten alle halbtags arbeiten! Das gilt nicht nur für Agenturen, aber da ist es besonders schlimm.

29 Jul 2016 4:58am GMT

28 Jul 2016

feedPlanet Ubuntu

The Fridge: Ubuntu 15.10 (Wily Werewolf) End of Life reached on July 28 2016

This is a follow-up to the End of Life warning sent earlier this month to confirm that as of today (July 28, 2016), Ubuntu 15.10 is no longer supported. No more package updates will be accepted to 15.10, and it will be archived to old-releases.ubuntu.com in the coming weeks.

The original End of Life warning follows, with upgrade instructions:

Ubuntu announced its 15.10 (Wily Werewolf) release almost 9 months ago, on October 22, 2015. As a non-LTS release, 15.10 has a 9-month month support cycle and, as such, the support period is now nearing its end and Ubuntu 15.10 will reach end of life on Thursday, July 28th. At that time, Ubuntu Security Notices will no longer include information or updated packages for Ubuntu 15.10.

The supported upgrade path from Ubuntu 15.10 is via Ubuntu 16.04. Instructions and caveats for the upgrade may be found at:


Ubuntu 16.04 continues to be actively supported with security updates and select high-impact bug fixes. Announcements of security updates for Ubuntu releases are sent to the ubuntu-security-announce mailing list, information about which may be found at:


Since its launch in October 2004 Ubuntu has become one of the most highly regarded Linux distributions with millions of users in homes, schools, businesses and governments around the world. Ubuntu is Open Source software, costs nothing to download, and users are free to customise or alter their software in order to meet their needs.

Originally posted to the ubuntu-security-announce mailing list on Thu Jul 28 23:32:17 UTC 2016 by Adam Conrad, on behalf of the Ubuntu Release Team

28 Jul 2016 11:58pm GMT

Lubuntu Blog: Lubuntu Yakkety Yak Alpha 2 has been released!

Lubuntu Yakkety Yak Alpha 2 (soon to be 16.10) has been released! We have a couple papercuts listed in the release notes, so please take a look. A big thanks to Brendan Perrine and Nio Wiklund for helping us test this release. You can grab the images from here: http://cdimage.ubuntu.com/lubuntu/releases/yakkety/alpha-2/

28 Jul 2016 5:10pm GMT

Ubuntu Insights: Bubblegum-96 boards powered by Ubuntu Core

Action SoC powered Bubblegum-96 We are pleased to announce that an image of Ubuntu Core is officially available for uCRobotics' Bubblegum-96 board. The board includes an optimised Actions' s900 Quad-core ARM 64-bit Cortex-A53 processor running at 1.8GHz and 600MHz PowerVR G6230 high-quality graphics with 2GB of DRAM and USB 3.0 support. This makes it one of the most powerful commercial edition Linaro 96Boards and the third Linaro board enabled on Ubuntu Core.

Canonical along with Actions and uCRobotics have been working together and created the first beta image of Ubuntu Core for Bubblegum-96. This offers device manufacturers a great open platform for their application and Internet of Things (IoT) devices. The beta developer image is now available for download.

With support for Ubuntu Core, a stripped down version of Ubuntu designed for autonomous machines, devices and other internet-connected digital things, Bubblegum now offers device makers one of the most popular open platforms for IoT. Open source and secure by design, with transactional updates for fast, reliable updates, and small footprint, Ubuntu Core is also the ideal platform to deploy large fleet of IOT devices.

Ubuntu Core also enables developers to publish apps that have been created for a whole host of different purposes and devices. For example, an app developed on Ubuntu Core and packaged as a snap is - a 3D Printer Cluster Management System developed for Bubblegum-96 boards called uC3DP (Your Cloud 3D Printing) - helped designers operate 20 individual 3D printers more efficiently. Without the need for human intervention, designers could send their work for printing. The app would in turn analyse the file and allocate it to a printer that was not in use. This allowed the designer to get on with focussing and creating new designs and not have to worry about how to operate a 3D printer, saving valuable time and money in the process.


During the recent Computex Taipei, Bubblegum-96 board powered by Ubuntu Core was presented on Actions' booth. A video from our live demo is now available online and can be viewed here.

To find the ideal app for you, visit the Ubuntu app store. And to develop your own set of apps, or snaps, visit the newly created snapcraft.io webpage.

28 Jul 2016 2:59pm GMT

Ubuntu Podcast from the UK LoCo: S09E22 – Guide to the Galaxy - Ubuntu Podcast

It's Episode Twenty-Two of Season Nine of the Ubuntu Podcast! Mark Johnson, Alan Pope, Laura Cowen, and Martin Wimpress are here again.

We're here - all of us!

In this week's show:

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

28 Jul 2016 2:00pm GMT

Ubuntu Insights: Ubuntu version 16.04 point 1 is out!

Today we have enabled upgrade notifications from 14.04 LTS to the first point-release for Ubuntu 16.04 LTS, versioned 16.04.1. The first point release for an LTS comes out 3 months after the initial release and then every 6 months until the next LTS is released. Upgrade notifications happen a short while later after some more QA testing.

A point release is an opportunity for us to roll up all the fixes and improvements which have been pushed out via the normal update mechanisms into a new ISO image. When you install from the updated ISO there will be fewer updates to download once you're up and running. LTS point releases also include support for selected new hardware.

Some desktop highlights for this point release include:

Numerous improvements and bug fixes to the Ubuntu Software store front

The Ubuntu Software store is directly based on GNOME Software which is a new flexible software storefront. We have been working on including support for Snaps as well as upstreaming more general bug fixes. The stability and features are significantly improved since the initial 16.04 release and we will continue to add new features to keep inline with what's new in the Snap world and making sure send as many fixes and improvements upstream as we can.

Improved printer driver support
Linux Standard Base or LSB is intended to provide a stable base onto which developers can build with a degree of confidence that it will run on compliant Linux distributions. Debian took the decision to drop LSB support around September 2015 and Ubuntu naturally followed suit in November 2015. However, in order to continue to support certain printer drivers which are distributed in LSB format (perhaps the only good example of an LSB package in wide use) and the automatic downloading of printer drivers from the OpenPrinting site we have reintroduced the LSB compatibility packages.

For more information see this bug: https://bugs.launchpad.net/ubuntu/+source/lsb/+bug/1536353

Low graphics mode
An interesting improvement for users of older hardware, those who might access their machines over a remote-desktop connection or users of virtual machines. We have been working on improving the optimisations for lower powered graphics hardware or software backed rendering. The Unity 7 desktop makes use of modern graphics hardware to display desktop components such as the dash and to provide visual enhancements to the daily operation of the desktop. In order to speed up the rendering of the desktop on less powerful machines we have reduced or removed a lot of the animations and blur effects. Low graphics mode has always been included in Unity 7 but we are now a being a bit more aggressive when it comes to disabling some of these effects. Unity 7 will automatically detect if your hardware is supported for the full experience and if not it will enable low graphics mode. Users can also manually enable low graphics mode but those instructions are beyond the scope of this post and will be followed up in a separate post. Keep an eye on the usual social media channels for more information.

How to upgrade
If you are already running 16.04 LTS you will have been receiving updates incrementally and there is nothing more for you to do. If you're installing afresh then you should download the 16.04.1 ISO image from the Ubuntu website, the web team will be updating the default download links as soon as the images are published.

If you are upgrading from a previous LTS release then the first point release of the new LTS is the point at which time the upgrade manager will start telling you that there is a new version of Ubuntu available and will handle the upgrade for you by downloading the correct packages. Thanks to the Ubuntu QA team and community support, we extensively test LTS to LTS upgrades to make sure that this process works properly.

Download 16.04.1 here >

28 Jul 2016 12:48pm GMT

The Fridge: Yakkety Yak Alpha 2 Released

"My clarinet sounded like an apoplectic yak. For the brief days I blew the trumpet, a hostile-sounding pig snorted along in jerky fits and starts with the rest of the irritated band."

― Karen Marie Moning

The second alpha of the Yakkety Yak (to become 16.10) has now been released!

This milestone features images for Lubuntu, Ubuntu MATE and Ubuntu Kylin.

Pre-releases of the Yakkety Yak are *not* encouraged for anyone needing a stable system or anyone who is not comfortable running into occasional, even frequent breakage. They are, however, recommended for Ubuntu flavor developers and those who want to help in testing, reporting and fixing bugs as we work towards getting this release ready.

Alpha 2 includes a number of software updates that are ready for wider testing. This is still an early set of images, so you should expect some bugs.

While these Alpha 2 images have been tested and work, except as noted in the release notes, Ubuntu developers are continuing to improve the Yakkety Yak. In particular, once newer daily images are available, system installation bugs identified in the Alpha 2 installer should be verified against the current daily image before being reported in Launchpad. Using an obsolete image to re-report bugs that have already been fixed wastes your time and the time of developers who are busy trying to make 16.10 the best Ubuntu release yet. Always ensure your system is up to date before reporting bugs.


Lubuntu is a flavor of Ubuntu based on LXDE and focused on providing a very lightweight distribution.

The Lubuntu 16.10 Alpha 2 images can be downloaded from:

More information about Lubuntu 16.10 Alpha 2 can be found here:

Ubuntu MATE

Ubuntu MATE is a flavor of Ubuntu featuring the MATE desktop environment for people who just want to get stuff done.

The Ubuntu MATE 16.10 Alpha 2 images can be downloaded from:

More information about Ubuntu MATE 16.10 Alpha 2 can be found here:

Ubuntu Kylin

Ubuntu Kylin is a flavor of Ubuntu that is more suitable for Chinese users.

The Ubuntu Kylin 16.10 Alpha 2 images can be downloaded from:

More information about Ubuntu Kylin 16.10 Alpha 2 can be found here:

If you're interested in following the changes as we further develop the Yakkety Yak, we suggest that you subscribe to the ubuntu-devel-announce list. This is a low-traffic list (a few posts a week or less) carrying announcements of approved specifications, policy changes, alpha releases and other interesting events.

A big thank you to the developers and testers for their efforts to pull together this Alpha release!

Originally posted to the ubuntu-devel-announce mailing list on Thu Jul 28 11:53:46 UTC 2016 by Simon Quigley on behalf of the Ubuntu Release Team

28 Jul 2016 12:15pm GMT

Ricardo Salveti: Netgear R7000, DD-WRT, IPv6 and the lack of a stable gateway

After playing with a few IoT related devices and scenarios, I wanted to finally enable IPv6 in my home network. After looking if my ISP (NET Virtua) was already supporting IPv6, I was happy to find out that they were already claiming that my city (Florianópolis) was covered, so I decided to give that a try (and post my setup/experience).

I'm using Netgear R7000 as my main router, simply because it's known to be well supported by DD-WRT.

Installing DD-WRT on Netgear R7000 is quite an easy job, and there is also an huge list of links covering several useful tips at http://www.dd-wrt.com/phpBB2/viewtopic.php?t=264152, which is quite handy (overclocking, QoS, installing Tor, etc).

After updating DD-WRT to the latest stable build from Kong (v3.0-r29300M kongac) and enabling bridge mode on my cable modem (from Arris), it was finally time to start playing with IPv6:-)

I first configured my IPv4 network to use DNSMasq for both DHCP and DNS. Being able to use DNSMasq is great because it is quite easy to configure, besides supporting the IPv6 Router Advertisement feature, which is quite handy for my own IPv6 network (no need for radvd).

DD-WRT IPv4 Setup

Then I just enabled IPv6 by going to the Setup->IPv6 tab. I'm using DHCPv6 with prefix delegation since that is supported by my ISP, making it even easier to configure my own network. Since I'm using DNSMasq for DHCP, I can safely disable radvd, but an additional step is required (custom DNSMasq config).

DD-WRT IPv6 Setup

To configure DNSMasq just go to the Services->Services tab, and you will find a field that can be used to store your custom config entries. For a complete overview and description of the supported options, please check http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html. In my case, all I needed was to define define the dhcp-range, dhcp-option, ra-param and enable-ra options.

DNSMasq Configs

Time to reboot and check if everything would indeed work as expected. Once booted, I decided to check the setup over telnet, since it's easier to debug and understand what is going on:-)

Using telnet is quite easy, and enabled by default in DD-WRT (internal network only):

rsalveti@evapro:~$ telnet
Connected to
Escape character is '^]'.

DD-WRT v3.0-r29300M kongac (c) 2016 NewMedia-NET GmbH
Release: 04/14/16

domosys login: root
     ___  ___     _      _____  ______       ____  ___ 
    / _ \/ _ \___| | /| / / _ \/_  __/ _  __|_  / / _ \
   / // / // /___/ |/ |/ / , _/ / /   | |/ //_ <_/ // /
  /____/____/    |__/|__/_/|_| /_/    |___/____(_)___/ 
                       DD-WRT v3.0

BusyBox v1.24.1 (2016-04-14 23:48:45 CEST) built-in shell (ash)


Great, I'm in:-) Time to check if the interfaces were configured correctly:

root@domosys:~# ip -6 addr show
1: lo:  mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
3: eth0:  mtu 1500 qlen 1000
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
4: vlan1@eth0:  mtu 1500 
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
5: vlan2@eth0:  mtu 1500 
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
6: eth1:  mtu 1500 qlen 1000
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
7: eth2:  mtu 1500 qlen 1000
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever
10: br0:  mtu 1500 
    inet6 2804:14d:badb:XXXX:XXXX:ff:fe00:0/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever

Everything is looking good, br0 got a valid IPv6 address, now to check the default route:

root@domosys:~# ip -6 route
2804:14d:badb:XXXX::/64 dev vlan2  proto kernel  metric 256 
2804:14d:badb:XXXX::/64 dev vlan2  proto kernel  metric 256 
2804:14d:badb:XXXX::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev vlan1  proto kernel  metric 256 
fe80::/64 dev eth1  proto kernel  metric 256 
fe80::/64 dev eth2  proto kernel  metric 256 
fe80::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev vlan2  proto kernel  metric 256 
default via fe80::217:10ff:fe8b:a78b dev vlan2  proto ra  metric 1024  expires 1783sec hoplimit 64
unreachable default dev lo  proto kernel  metric -1  error -101
ff00::/8 dev eth0  metric 256 
ff00::/8 dev vlan1  metric 256 
ff00::/8 dev eth1  metric 256 
ff00::/8 dev eth2  metric 256 
ff00::/8 dev br0  metric 256 
ff00::/8 dev vlan2  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101

Default route in place, looking correct, so let's try pinging devices over IPv6, to see if it is indeed functional:

root@domosys:~# ping6 2001:4860:4860::8844
PING 2001:4860:4860::8844 (2001:4860:4860::8844): 56 data bytes
64 bytes from 2001:4860:4860::8844: seq=0 ttl=42 time=80.255 ms
64 bytes from 2001:4860:4860::8844: seq=1 ttl=42 time=135.638 ms
64 bytes from 2001:4860:4860::8844: seq=2 ttl=42 time=93.105 ms
--- 2001:4860:4860::8844 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 80.255/102.999/135.638 ms
root@domosys:~# ping6 google.com
PING google.com (2800:3f0:4004:804::200e): 56 data bytes
64 bytes from 2800:3f0:4004:804::200e: seq=0 ttl=52 time=43.273 ms
64 bytes from 2800:3f0:4004:804::200e: seq=1 ttl=52 time=52.316 ms
64 bytes from 2800:3f0:4004:804::200e: seq=2 ttl=52 time=77.638 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 43.273/57.742/77.638 ms

Awesome, it seems everything is going as planned, time to connect from my notebook and test my IPv6 connection:

rsalveti@evapro:~$ ip -6 addr show wlp3s0
2: wlp3s0:  mtu 1500 state UP qlen 1000
    inet6 2804:14d:badb:XXXX:XXXX:d259:65cf:a8f1/64 scope global temporary dynamic 
       valid_lft 43057sec preferred_lft 43057sec
    inet6 2804:14d:badb:XXXX:XXXX:2de6:6164:8e93/64 scope global mngtmpaddr noprefixroute dynamic 
       valid_lft 43057sec preferred_lft 43057sec
    inet6 fe80::a65e:60ff:fee4:XXXX/64 scope link 
       valid_lft forever preferred_lft forever

rsalveti@evapro:~$ ping6 google.com
PING google.com(2800:3f0:4004:806::200e) 56 data bytes
64 bytes from 2800:3f0:4004:806::200e: icmp_seq=1 ttl=52 time=30.4 ms
64 bytes from 2800:3f0:4004:806::200e: icmp_seq=2 ttl=52 time=35.7 ms
64 bytes from 2800:3f0:4004:806::200e: icmp_seq=3 ttl=52 time=45.8 ms
--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 30.414/37.353/45.860/6.404 ms

Looking great. Now before we celebrate, time to check the results from http://test-ipv6.com


and http://ipv6-test.com


Nice, easy and working as expected!

Unfortunately life it's not always that easy and simple, something wrong was happening that made my IPv6 network to die completely after a few minutes, but it was always functional after rebooting my router. Tried the same ping6 commands from both my notebook and router, but all I got was that my IPv6 network was down. Time to get my hands dirty and debug!

root@domosys:~# ip -6 addr show br0
10: br0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 
    inet6 2804:14d:badb:XXXX:XXXX:ff:fe00:0/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::e6f4:c6ff:XXXX:XXXX/64 scope link 
       valid_lft forever preferred_lft forever

root@domosys:~# ip -6 route
2804:14d:badb:XXXX::/64 dev vlan2  proto kernel  metric 256 
2804:14d:badb:XXXX::/64 dev vlan2  proto kernel  metric 256 
2804:14d:badb:XXXX::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev vlan1  proto kernel  metric 256 
fe80::/64 dev eth1  proto kernel  metric 256 
fe80::/64 dev eth2  proto kernel  metric 256 
fe80::/64 dev br0  proto kernel  metric 256 
fe80::/64 dev vlan2  proto kernel  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101
ff00::/8 dev eth0  metric 256 
ff00::/8 dev vlan1  metric 256 
ff00::/8 dev eth1  metric 256 
ff00::/8 dev eth2  metric 256 
ff00::/8 dev br0  metric 256 
ff00::/8 dev vlan2  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101

IPv6 address looks correct (same as before), but there is no default route for IPv6! Let's try to manually add the route and check the network again:

root@domosys:~# ip -6 route add default via fe80::217:10ff:fe8b:a78b dev vlan2 proto ra metric 1024 hoplimit 64

root@domosys:~# ping6 google.com
PING google.com (2800:3f0:4004:804::200e): 56 data bytes
64 bytes from 2800:3f0:4004:804::200e: seq=0 ttl=52 time=35.507 ms
64 bytes from 2800:3f0:4004:804::200e: seq=1 ttl=52 time=40.768 ms
64 bytes from 2800:3f0:4004:804::200e: seq=2 ttl=52 time=30.964 ms
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 30.964/35.746/40.768 ms

Good, that was it, now to understand why my default route disappeared.

IPv6 uses the ICMPv6 Router Solicitation (RS) and Router Advertisement (RA) messages in order to request and announce the default gateway on a network. To investigate if my ISP router is periodically sending the unsolicited RA messages (Cisco routers with ipv6 nd ra suppress?) all we need is some help from tcpdump, which is also available in DD-WRT. To make it easier, let's check just for the RS and RA messages:

root@domosys:~# tcpdump -vvvv -ttt -i vlan2 icmp6 and 'ip6[40] >= 133 && ip6[40] <= 134'
tcpdump: listening on vlan2, link-type EN10MB (Ethernet), capture size 65535 bytes

Waited several minutes and nothing, looks like we're heading to the right direction. As a test, let's play with the vlan2 interface a bit:

root@domosys:~# ifconfig vlan2 down; ifconfig vlan2 up; tcpdump -vv -ttt -i vlan2 icmp6 and 'ip6[40] >= 133 && ip6[40] <= 134'
tcpdump: listening on vlan2, link-type EN10MB (Ethernet), capture size 65535 bytes
00:00:00.000000 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 16) fe80::e6f4:c6ff:XXXX:XXXX > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 16
          source link-address option (1), length 8 (1): e4:f4:c6:XX:XX:XX
            0x0000:  e4f4 c6XX XXXX
00:00:00.014184 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 96) fe80::217:10ff:fe8b:a78b > fe80::e6f4:c6ff:XXXX:XXXX: [icmp6 sum ok] ICMP6, router advertisement, length 96
        hop limit 64, Flags [managed, other stateful], pref medium, router lifetime 1800s, reachable time 0s, retrans time 0s
          source link-address option (1), length 8 (1): 00:17:10:8b:a7:8b
            0x0000:  0017 108b a78b
          mtu option (5), length 8 (1):  1500
            0x0000:  0000 0000 05dc

So the ISP router is sending the required RA message, but only after the initial RS message that is sent by my router when establishing the connection (simulated by bringing the interface down and up). The lifetime interval also gives a hint to why my IPv6 network is only working for a few minutes after booting my router (30 minutes in this case).

Unfortunately there is really not much that can be done from the client side, as my ISP's router is really not helping much here. One possible workaround could be forcing a default gateway after booting my router, but that is not really a good solution as the address might change after a while.

After investigating a bit more, I decided to try to periodically send RS messages by hand (even if not really recommended by the spec), so I could get the desired RA messages that would be used to update my default gateway route.

Luckily there is already a tool called rdisc6 (from http://www.remlab.net/ndisc6) that can be used to send RS messages from the command line, but unfortunately that is not available by default in the DD-WRT build I used, so time to install the tool by hand.

Once nice thing about using Kong's DD-WRT builds is that you can use the bootstrap command to enable additional OPKG repositories, allowing the user to extend the image with custom packages. After checking Kong's OPKG repo, I was able to confirm that the rdisc6 was already available as package, so all I needed to do was to install the extra package, which is great!

Since there is really not much disk space in flash, to install additional packages it's recommended to first install a USB disk (I used an old 4GB pendrive I had). First clean the disk and create a single ext3 partition, then just plug it in the Netgear N7000 router and reboot. To configure the USB disk just go to the Services->USB tab:


Make sure to mount the disk into /opt, otherwise the bootstrap script will fail to run (first enable core USB and USB storage support, reboot, add the partition UUID and reboot again).

With the disk in place and mounted at the right path, just open a telnet connection and run the bootstrap command (which is available in the DD-WRT image):

root@domosys:~# bootstrap
Bootstrap is checking prerequisites...

USB automounter is enabled.
Found a valid partition: /opt.

Proceed with download and install of opkg? (y/n) [default=n]:
Connecting to www.desipro.de (
opkg.ipk             100% |******| 60071   0:00:00 ETA
Connecting to www.desipro.de (
opkg.ipk.sig         100% |******|   256   0:00:00 ETA
Connecting to www.desipro.de (
functions.sh         100% |******|  7269   0:00:00 ETA
Bootstrap complete. You can now use opkg to install additional packages.

Now install the rdisc6 package by using the opkg tool:

root@domosys:~# opkg install rdisc6

And now to finally test my theory let's open tcpdump while we manually send the RS message, to check if the default route gets updated once it gets the RA message from my ISP's router.

Terminal 1:

root@domosys:~# tcpdump -vvvv -ttt -i vlan2 icmp6 and 'ip6[40] >= 133 && ip6[40] <= 134'
tcpdump: listening on vlan2, link-type EN10MB (Ethernet), capture size 65535 bytes

Terminal 2:

root@domosys:~# ip -6 route
fe80::/64 dev vlan2  proto kernel  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101
ff00::/8 dev eth0  metric 256 
ff00::/8 dev vlan1  metric 256 
ff00::/8 dev eth1  metric 256 
ff00::/8 dev eth2  metric 256 
ff00::/8 dev br0  metric 256 
ff00::/8 dev vlan2  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101

root@domosys:~# /opt/usr/bin/rdisc6 -1 -q vlan2

root@domosys:~# ip -6 route
fe80::/64 dev vlan2  proto kernel  metric 256 
default via fe80::217:10ff:fe8b:a78b dev vlan2  proto ra  metric 1024  expires 1796sec hoplimit 64
unreachable default dev lo  proto kernel  metric -1  error -101
ff00::/8 dev eth0  metric 256 
ff00::/8 dev vlan1  metric 256 
ff00::/8 dev eth1  metric 256 
ff00::/8 dev eth2  metric 256 
ff00::/8 dev br0  metric 256 
ff00::/8 dev vlan2  metric 256 
unreachable default dev lo  proto kernel  metric -1  error -101

Great, default route added again, now back to Terminal 1 to check the output from tcpdump:

00:00:00.000000 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 8) fe80::e6f4:c6ff:XXXX:XXXX > ff02::2: [icmp6 sum ok] ICMP6, router solicitation, length 8
00:00:00.011702 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 96) fe80::217:10ff:fe8b:a78b > fe80::e6f4:c6ff:XXXX:XXXX: [icmp6 sum ok] ICMP6, router advertisement, length 96
        hop limit 64, Flags [managed, other stateful], pref medium, router lifetime 1800s, reachable time 0s, retrans time 0s
          source link-address option (1), length 8 (1): 00:17:10:8b:a7:8b
            0x0000:  0017 108b a78b
          mtu option (5), length 8 (1):  1500
            0x0000:  0000 0000 05dc

Lovely, RS message sent with help from rdisc6, RA message replied back from the ISP router and default route updated.

Now all that remains is to add the rdisc6 command as a cron job, making sure it gets executed often (e.g. every minute). To add custom cron jobs just go to Administration->Management tab:

DD-WRT Cron Job

With that in place I can safely reboot my router and get a stable IPv6 network setup (until my ISP improves/fixes their infrastructure).

That's it, now to start doing some real IoT IPv6-based deployments in my local network:-)

28 Jul 2016 2:51am GMT

27 Jul 2016

feedPlanet Ubuntu

Jono Bacon: Bacon Roundup

In my work I tend to create a lot of material both on my website here as well as on other websites (for example, my opensource.com column and my Forbes column. I also participate in interviews and other pieces.

I couldn't think of an efficient way to pull these together for you folks to check out. So, I figured I will periodically share these goings on in a post. Let's get this first Bacon Roundup rolling…

How hackers are making products safer (cio.com)
An interview about the work I am doing at HackerOne in building a global community of hackers that are incentivized to find security issues, build their expertise/skills, and earn some money.

8 ways to get your swag on (opensource.com)
A column about the challenges that face shipping swag out to community members. Here are 8 things I have learned to make this easier covering production, shipping, and more.

10 tips for new GitHub projects (opensource.com)
Kicking off a new GitHub project can be tough for new communities. I wrote this piece to provide 10 simple tips and tricks to ensure your new GitHub project is setting off on the right path.

The Risks of Over-Rewarding Communities (jonobacon.org)
A piece about some interesting research into the risks of over-rewarding people to the point of it impacting their performance. This covers the research, the implications for communities, and some practical ways to harness this in your community/organization.

GC On-Demand Podcast Interview (http://podcast.discoposse.com/)
I had a blast chatting to Eric Wright about community management, career development, traversing challenges, and constantly evolving and improving your craft. A fun discussion and I think a fun listen too.

Taking your GitHub issues from good to great (zenhub.com)
I was invited by my friends at ZenHub to participate in a piece about doing GitHub issues right. They wrote the lions-share of this piece but I contributed some material.

Finally, if you want to get my blog posts directly to your inbox, simple put your email address into the box to the right of this post. This will ensure you never miss a beat.

27 Jul 2016 3:00pm GMT

Jonathan Riddell: Neon Updates – KDE Network, KDE Applications

Not a great week for Neon last week. I server we used for building packages on filled up limiting the work we could do and then a patch from Plasma broke some people's startup and they were faced with a dreaded black screen. Apologies folks.

But then magically we got an upgrade to the server with lots of nice new disk space and the problem patch was reverted so hopefully any affected was able to upgrade again and recover.

So I added some KDE Network bits and rebuilt the live/installable ISO images so they're all updated to Applications 16.04.3 in User Edition. And Applications forked so now Dev Edition Stable Branches uses the 16.08 Beta branches and you can try out lots of updated apps. And because the developer made a special release just for us and wears cute bunny ears I added in Konversation to our builds for good old fashioned IRC chit chat (none of your modern Slacky/Telegram/Web2.0 protocols here).

Facebooktwittergoogle_pluslinkedinby feather

27 Jul 2016 10:37am GMT

26 Jul 2016

feedPlanet Ubuntu

Jono Bacon: The Risks of Over-Rewarding Communities

Incentive plays an important role in communities. We see it everywhere: community members are rewarded with extrinsic rewards such as t-shirts, stickers, gadgets, or other material, or intrinsic rewards such as increased responsibilities, kudos, reputation, or other benefits.


The logic seems seems sound: if someone is the bees knees and doing a great job, they deserve to be rewarded. People like rewards, and rewards make people want to stick around and contribute more. What's not to love?

There is though some interesting evidence to suggest that over-rewarding your communities, either internal to an organization or external, has some potent risks. Let's explore the evidence and then see how we can harness it.

The Research

Back in 1908, Yerkes-Dodson, psychologists (and potential prog rock band) developed the Yerkes-Dodson Law. It suggests performance in a task increases with arousal, but only to a point. Now, before you get too hot under the collar, this study refers to mental or physiological arousal such as motivation. The study highlights a "peak arousal" time which is the ideal mix of the right amount of arousal to hit maximal performance.

Dan Ariely in The Upside of Irrationality took this research and built on it to test the effect of extrinsic rewards on performance. He asked a series of people in India to perform tasks with varying levels of financial reward (very small up to very high). His results were interesting:

Relative to those in the low- or medium-bonus conditions, they achieved good or very good performance less than a third of the time. The experience was so stressful to those in the very-large-bonus condition that they choked under the pressure.

I found this choke point insight interesting. We often see an inverse choke point when the stress of joining a community is too high (e.g. submitting a first code pull request to your peers). Do we see choke points for communities members with a high level of pressure to perform though?

Community Strategy Implications

I am not so sure. Many communities have high performing community members with high levels of responsibility (e.g. release managers, security teams, and core maintainers) who perform with predictably high quality results.

Where we often see the ugly head of community is with entitlement; that is, when some community members expect to be treated differently to others.

When I think back to the cases where I have seen examples of this entitlement (which shall remain anonymous to protect the innocent) it has invariably been due to an imbalance of expectations and rewards. In other words, when their expectations don't match their level of influence on a community and/or they feel rewarded beyond that suitable level of influence, entitlement tends to brew.

As as such, my graph looks a little like this:

Screen Shot 2016-07-26 at 8.42.49 AM

This shows the Yerkes-Dodson curve but subdivides the timeline into three distinctive areas. The first area is used for growth and we use rewards as a means to encourage participation. The middle area is for maintenance and ensuring regular contribution over an extended period of time. The final area is the danger zone - this is where entitlement can set in, so we want to ensure that manage expectations and rewards carefully. In this end zone we want to reward great work, but ultimately cap the size of the reward - lavish gifts and experiences are probably not going to have as much impact and may even risk the dreaded entitlement phenomena.

This narrative matches a hunch I have had for a while that rewards have a direct line to expectations. If we can map our rewards to effectively mitigate the inverse choke point for new members (thus make it easier to get involved) and reduce the latter choke point (thus reduce entitlement), we will have a balanced community.

Things You Can Do

So, dear reader, this is where I give you some homework you can do to harness this research:

  1. Design what a 'good' contribution is - before you can reward people well you need to decide what a good contribution is. As an example, is a good code contribution a well formed, submitted, reviewed, and merged pull request? Decide what it is and write it down.
  2. Create a platform for effectively tracking capabilities - while you can always throw out rewards willy-nilly based on observations of performance, this risks accusations of rewarding some but not others. As such, implement an independent way of mapping this good contribution to some kind of automatically generated numeric representation (e.g. reputation/karma).
  3. Front-load intrinsic rewards - for new contributors in the growth stage, intrinsic rewards (such as respect, support, and mentoring) are more meaningful as these new members are often nervous about getting started. You want these intrinsic rewards primarily at the beginning of a new contributor on-ramp - it will build a personal sense of community with them.
  4. Carefully distribute extrinsic rewards - extrinsic rewards such as clothing, gadgets, and money should be carefully distributed along the curve in the graph above. In other words, give out great material, but don't make it too opulent otherwise you may face the latter choke point.
  5. Create a distribution curve of expectations - in the same way we are mapping rewards to the above graph, we should do the same with expectations. At different points in the community lifecycle we need to provide different levels of expectations and information (e.g. limited scope for new contributions, much wider for regular participants). Map this out and design systems for delivering it.

If we can be mindful of the Yerkes-Dodson curve and balance expectations and rewards well, we have the ability to build truly engaging and incentivized communities and organizations.

I would love to have a discussion about this in the comments. Do you think this makes sense? What am I missing in my thinking here? What are great examples of effective rewards? How have you reduced entitlement? Share your thoughts…

26 Jul 2016 4:04pm GMT

Rhonda D'Vine: Debian LGBTIQA+

I have a long overdue blog entry about what happened in recent times. People that follow my tweets did catch some things. Most noteworthy there was the Trans*Inter*Congress in Munich at the start of May. It was an absolute blast. I met so many nice and great people, talked and experienced so many great things there that I'm still having a great motivational push from it every time I think back. It was also the time when I realized that I in fact do have body dysphoria even though I thought I'm fine with my body in general: Being tall is a huge issue for me. Realizing that I have a huge issue (yes, pun intended) with my length was quite relieving, even though it doesn't make it go away. It's something that makes passing and transitioning for me harder. I'm well aware that there are tall women, and that there are dedicated shops for lengthy women, but that's not the only thing that I have trouble with. What bothers me most is what people read into tall people: that they are always someone they can lean on for comfort, that tall people are always considered to be self confident and standing up for themselves (another pun, I know ... my bad).

And while I'm fine with people coming to me for leaning on to, I rarely get the chance to do so myself. And people don't even consider it. When I was there in Munich, talking with another great (... pun?) trans woman who was as tall as me I finally had the possibility to just rest my head on her shoulder and finally feel the comfort I need just as much as everyone else out there, too. Probably that's also the reason why I'm so touchy and do go Free Hugging as often as possible. But being tall also means that you are usually only the big spoon when cuddling up. Having a small mental breakdown because of realizing that didn't change the feeling directly but definitely helped with looking for what I could change to fix that for myself.

Then, at the end of may, the movie FtWTF - female to what the fuck came to cinema. It's a documentary about six people who got assigned female at birth. And it's absolutely charming, and has great food for thoughts in it. If you ever get the chance to watch it you definitely should.

And then came debconf16 in Capetown. The flight to there was canceled and we had to get rebooked. The first offer was to go through Dubai, and gladly a colleague did point out to the person behind the desk that that wouldn't be safe for myself and thus out of scope. In the end we managed to get to Capetown quite nice, and even though it was winter when the sun was shining it was quite nice. Besides the cold nights that is. Or being stuck on the way up to table mountain because a colleague had cramps in his lags and we had to call mountain rescue. Gladly the night was clear, and when the mountain rescue finally got us to top and it was night already we had one of the nicest views from up there most people probably never will experience.

And then ... I got invited to a trans meetup in Capetown. I was both excited and nervous about it, what to expect there. But it was simply great. The group there was simply outstandingly great. The host gave update information on progress on clinical support within south Africa, from what I took with me is that there is only one clinic there for SRS which manages only two people a year which is simply ... yuck. Guess you can guess how many years (yes, decades) the waiting line is ... I was blown away though by the diversity of the group, on so many levels, most notably on the age spectrum. It was a charm to meet you all there! If you ever stop by in Capetown and you are part of the LGBTIQ community, make sure you get in contact with the Triangle Project.

But, about the real reason to write this entry: I was approached at Debconf by at least two people who asked me what I thought about creating an LGBTIQA+ group within Debian, and if I'd like to push for that. Actually I think it would be a good idea to have some sort of exchange between people on the queer spectrum (and I hope I don't offend anyone with just saying queer for LGBTIQA+ people). Given that I'm quite outspoken people approach me every now and then so I'm aware that there is a fair amount of people that would fall into that category. On the other hand some of them wouldn't want to have it publicly known because it shouldn't matter and isn't really the business of others.

So I'm uncertain. If we follow that path I guess something that is closed or at least offers the possibility to have a closed communication would be needed to not out someone by just joining in the discussion. It's was easier with Debian Women where it was (somewhat) clear that male participants are allies supporting the cause and not considered being women themselves, but often enough (mostly cis hetero male) people are afraid to join a dedicated LGBTIQA+ group because they have the fear of having their identity judged. These things should be considered before creating such a place so that people can feel comfortable when joining and know what to expect beforehand.

For the time being I created #debian-diversity on irc.debian.org to discuss how to move forward. Please bear in mind that even the channel name is up for discussion. Acronyms might not be the way to go in my opinion, just read back up the discussion that lead to the Diversity Statement of Debian where the original approach was to start listing groups for inclusiveness but it was quickly clear that it can get outdated too easily.

I am willing to be part of that effort, but right now I have some personal things to deal which eat up a fair amount of my time. My kid starts school in September (yes, it's that long already, time flies ...). And it looks like I'll have to move a second time in the near future: I'll have to leave my current flat by the end of the year and the Que[e]rbau I'm moving into won't be ready by that time to host me yet ... F*ck. :(

/personal | permanent link | Comments: 1 | Flattr this

26 Jul 2016 11:49am GMT

Canonical Design Team: New starter Raul (UX designer) – “I want to challenge myself to do the most difficult things”

Meet the newest member of the design team, UX designer Raul Alvarez, who will be working on the Ubuntu convergence story. Raul will be bringing new ideas to improve our apps to allow for a seamless experience across all devices. We caught up with him to tell us more about his background and what attracted him to the open source world of Ubuntu.


You can find Raul's blog here and reach out to him on Twitter using his handle @raulalgo.

Tell me about your background

If we go all the way back to university, I started as a computer engineer student, but after a while I got to a point where I was rather burnt out by it. Then almost by chance, I ended up studying another degree in Advertising and PR. When studying my second degree I gained a fresh perspective. I was coming from studying maths and physics to then finding myself in classes for Spanish, history, law, and eventually design, which is where I got hooked.

I turned 30 and decided to move to London, as everyone in the small town of Salamanca (West Spain) was either getting married or bored; I was the latter. I wanted to challenge myself to do the most difficult things and push a bit more. I moved into designing Forex trading apps, which was a great experience with very smart people. I got to work very close with the developers too.

I then went into e-commerce as a designer, which was another diverse industry I wanted to learn from. Getting into something I know nothing about is key for me. It's tricky, as people want experience, but once I'm there and I learn, I feel that I have the ability to take a fresh look at things. From studying advertising and knowing how apps are build I could bring those disciplines together to work on different platforms.

Canonical was a company I wanted to be part of. Just so happens they were looking for a designer, and now here I am!

Do you have any projects you're working / or have worked on?

In the late days of my computer engineering degree, me and some fellow students started our own business. It was when the Social Network movie was out and everyone wanted to be Mark Zuckerberg; and so did we. We created a photography social network that was like a Flickr wannabe, or closer to what 500px is now. We had good intentions and we worked very hard on it. However, we lacked the business vision and strategy to push it forward. We had two choices: we close it off and do something else, or we find a better way to make money.

Salamanca is a small town and has little going on, but it just so happened that a company was doing mobile apps on demand for clients. Instead of hiring more people when they had large spikes of work, they would reached out to other companies. My three partners were playing the role of developers and I was the designer. We spent four years designing mobile apps for various clients specific needs, most came from the advertising industry. We had some startups come to us who didn't have much money and we would help them advertise and prototype their apps. It was always a rather constrained working environment with a low budget and working with trial and error.

What attracted you to the open source world of Ubuntu?

For me, being here is amazing because I had been using a laptop that ran Ubuntu in my uni days. I've always known open source and the ideas around it. I remember playing with Linux when I was at high school too.

What does UX mean to you?

User Experience (laughs). But seriously, I think the term 'UX' is thrown back and forth a lot and people forget what it means. It's a lot of ideas that could or could not be UX.

People might think that UX is just associated with apps and web design. But it's not. If you think about user experience, it's in everything. You can use user experience to build your hotel for instance. I could say how is the lobby going to be decorated, what is the uniform going to be like, do I want the guests to find a little chocolate under their pillow? THAT is defining the user experience. You don't need to do a lot of research. Well, you can research user experience in other hotels, that would be one approach. Or you can say I have this vision I want to make my approach work. For this you need good judgement and to think about people, but also be prepared to take risks.

One of the parts I enjoy most about designing is whenever I don't know what I'm going to do. That is the fun bit.

What have you learned in your first week at Canonical?

I came here thinking I knew how complex an operating system was. I wasn't even close. I realised the complexity was way down below, every single little thing is taken into account, which amazes me. Then I realised the scale of the task. It's amazing how much work is going on here. I have a lot of respect for it.

What is your proudest achievement?

Making a decision like: I'm stuck and I need a change. I made the effort to move to a different country and to change my degree. It has always been very natural for me to take risks, but I didn't realize how scary it actually is until I stop and think about it.

26 Jul 2016 10:43am GMT

Dirk Deimeke: Timewarrior 1.0.0beta1 ...

Jetzt ist es endlich soweit, die erste beta-Version von Timewarrior wurde veröffentlicht. Timewarrior ist eine Kommandozeilenanwendung zur Zeiterfassung, sie lässt sich über Hooks in Taskwarrior einbinden.

Wenn Ihr Verwendung dafür habt, ist jetzt der richtige Zeitpunkt einzusteigen und uns mit Euren Tests und Bugreports zu unterstützen.

26 Jul 2016 5:57am GMT

25 Jul 2016

feedPlanet Ubuntu

Elizabeth K. Joseph: The Official Ubuntu Book, 9th Edition released!

Back in 2014 I had the opportunity to lend my expertise to the 8th edition of The Official Ubuntu Book and began my path into authorship. Since then, I've completed the first edition of Common OpenStack Deployments, coming out in September. I was thrilled this year when Matthew Helmke invited me back to work on the 9th edition of The Official Ubuntu Book. We also had José Antonio Rey joining us for this edition as a third co-author.

One of the things we focused on with the 8th edition was, knowing that it would have a shelf life of 2 years, future-proofing. With the 9th edition we continued this focus, but also wanted to add a whole new chapter: Ubuntu, Convergence, and Devices of the Future

Taking a snippet from the book's sample content, the chapter gives a whirlwind tour of where Ubuntu on desktops, servers and devices is going:

Chapter 10: Ubuntu, Convergence, and Devices of the Future 261

The Convergence Vision 262
Unity 263
Ubuntu Devices 264
The Internet of Things and Beyond 268
The Future of the Ubuntu Desktop 272
Summary 273

The biggest challenge with this chapter was the future-proofing. We're in an exciting point in the world of Ubuntu and how it's moved far beyond "Linux for Human Beings" on the desktop and into powering servers, tablets, robots and even refrigerators. With the Snappy and Ubuntu Core technologies both powering much of this progress and changing rapidly, we had to be cautious about how in depth we covered this tooling. With the help of Michael Hall, Nathan Haines and Sergio Schvezov I believe we've succeeded in presenting a chapter that gives the reader a firm overview of these new technologies, while being general enough to last us until the 10th edition of this book.

Also thanks to Thomas Mashos of the Mythbuntu team and Paul Mellors who also pitched in with this edition. Finally, as with the last edition, it was a pleasure to work with Matthew and José on this book. I hope you enjoy it!

25 Jul 2016 8:27pm GMT