26 Jan 2015

feedPlanet Arch Linux

Transition of KDE software to the KDE Framework and Qt 5

The KDE Software Collection has been updated to KDE Applications 14.12.

The KDE developers have started porting their software to KDE Frameworks and Qt 5. For a list of the software that has been ported see the announcement.

When a KDE Frameworks port of a KDE application is considered stable, it is released with KDE Applications and development and bug fixes are no longer applied to the Qt4/KDE4 version. This means that as ported versions of applications are released, we will switch to the newer version. At the same time, we are getting rid of KDE module prefixes (e.g. kdebase-konsole -> konsole).

The result of this transition is that some packages will be using Qt5 and some will be using Qt4. We are working hard to make the transition smooth for KDE4 users, but things might look different depending on your configuration. Please adjust themes and colors as necessary for the two toolkits. See the wiki for help. We also recommend switching to Plasma 5.2 which will be released this week.

Please report upstream bugs to the KDE bugzilla. Feel free to CC me.

26 Jan 2015 10:20am GMT

20 Jan 2015

feedPlanet Arch Linux

Packaging changes in lirc 0.9.2

For consistency with upstream naming, the lirc-utils package was renamed to lirc. The wpc8769l kernel drivers were dropped and can be obtained by installing lirc-wpc8769l from the AUR.

Note that 0.9.2 is a major release and comes along with several upstream and packaging changes. In particular, the irexec.service systemd unit was removed. Please edit and copy the template /usr/share/lirc/contrib/irexec.service if you want to keep using that service.

20 Jan 2015 5:36pm GMT

19 Jan 2015

feedPlanet Arch Linux

Replacing “makepkg –asroot”

An alarming number of people have noticed, the pacman-4.2 release removed the --asroot option from makepkg. This means that you can no longer build packages as the root user. There are good reasons for this and the option was only Continue reading

19 Jan 2015 1:42pm GMT

18 Jan 2015

feedPlanet Arch Linux

Playing with overlayfs

Around this time last year, I posted about setting up a udev rule to run a script when I plugged my USB drive containing all of my music into one of my laptops; the script, a couple of lines of bash, removes all pre-existing symlinks to $HOME/Music and repopulates the directory with an updated set. Almost. The one flaw that has been an irritant of variable intensity, depending on what I felt like listening at any given time, is that the symlinks aren't written for directories that already exist on the target filesystem.

In order that I am able to play some music if I forget the USB drive, each of the laptops has a subset of albums on it, depending on the size of their respective hard drives. If I add a new album to the USB drive, then that change won't get written to either of the laptops when the drive is plugged in. Not entirely satisfactory. I had tinkered around with globbing, or with having find(1) scan deeper into the tree, or even a loop to check for the presence of directories in an array…

It just got too hard. My rudimentary scripting skills and the spectre of recursion, I am sorry to admit, conspired to undermine my resolve. So, rather than concede unconditional surrender, I asked for help. As is almost always the case in these situations, this proved to be a particularly wise move; the response I received was neither what I expected, nor was it anything I was even remotely familiar with: so in addition to an excellent solution (one far better suited to what I was trying to achieve), I learned something new.

The first comment on my question proved singularly insightful.

Care to use union mounts, for example via overlayfs?

muru on U&L unix.stackexchange.com/179397/…

A union mount, something until now I was blissfully unaware of, is according to Wikipedia,

a mount that allows several filesystems to be mounted at one time, appearing to be one filesystem.

Union mounting has a long and storied history on Unix, beginning in 1993 with the Inheriting File System (IFS). The genealogy of these mounts has been well covered in this 2010 LWN article by Valerie Aurora. However, it is only in the current kernel, 3.18, that a union mount has been accepted into the kernel tree.

After reading the documentation for overlayfs, it seemed this was exactly what I was looking for. Essentially, an overlay mount would allow me to "merge" the underlying tree (the Music directory on the USB drive) with an "upper" one, $HOME/Music on the laptop, completely seamlessly.

Then whenever a lookup is requested in such a merged directory, the lookup is performed in each actual directory and the combined result is cached in the dentry belonging to the overlay filesystem.

It was the just a matter of adapting my script to use overlayfs, which was trivial:

</p>

<h1>!/usr/bin/env bash</h1>

<h1>union mount Music when Apollo plugged in</h1>

<p>low=/media/Apollo/Music
upp=/home/jason/Music
wod=/home/jason/.local/tmp
export DISPLAY=:0
export XAUTHORITY=/home/jason/.Xauthority</p>

<h1>overlayfs mount</h1>

<p>mount -t overlay -o lowerdir="$low",upperdir="$upp",workdir="$wod" overlay "$upp"
status1=$?</p>

<p>mpc update &amp;>/dev/null
status2=$?</p>

<p>if [[ "$status1" -eq 0 &amp;&amp; "$status2" -eq 0 ]]; then</p>

<pre><code>printf "^fg(#BF85CC)%s\n" "Music directory updated" | dzen2 -p 3
</code></pre>

<p>fi

And now, when I plug in the USB drive, the contents of the drive are merged with my local music directory, and I can access whichever album I feel inclined to listen to. I can also copy files across to the local machines, knowing if I update the portable drive, it will no longer mean I have to forego listening to any newer additions by that artist in the future (without manually intervening, anyway).

Overall, this is a lightweight union mount. There is neither a lot of functionality, nor complexity. As the commit note makes clear, this "simplifies the implementation and allows native performance in these cases." Just note the warning about attempting to write to a mounted underlying filesystem, where the behaviour is described as "undefined".

Notes

Creative Commons image, mulitlayered jello by Frank Farm.

18 Jan 2015 7:20pm GMT

11 Jan 2015

feedPlanet Arch Linux

Opterator 0.5 Supports Function Annotations

Opterator is a decorator to make quick and clean command line interfaces for scripts. It's not designed to compete with argparse or click. Instead it supports that common usecase where you're writing a reusable script and don't want to write all the bits required for argument parsing, but also don't want to use the maligned […]

11 Jan 2015 11:26pm GMT

WebApp plugin development introduction

This is a short tutorial on how to write a simple WebApp plugin, the plugin will add a widget to the WebApp's mail settings tab. The widget will allow a user to remove email addresses and domains from the safesenders list in the users WebApp settings.

manifest.xml

We start of looking at the manifest.xml file, the file contains the following information for your plugin:

<?xml version="1.0"?>
<!DOCTYPE plugin SYSTEM "manifest.dtd">
<plugin version="2">
        <info>
                <version>1.1</version>
                <name>myplugin</name>
                <title>My plugins title</title>
                <author>Jelle van der Waa</author>
                <authorURL>http://www.vdwaa.nl</authorURL>
                <description>What this plugin does!</description>
        </info>

Apart from this information it also tells the WebApp which JavaScript and CSS files it should load. We start looking at the defining which JavaScript files to load, the JavaScript files can be loaded in three different modes, source, debug, release. Source is used when you develop the plugin, release is the file which is loaded when you have issued an ant deploy and ant deploy-plugins. Usually these deploy commands are run when building an webapp package for your distro.

<components>
        <component>
                <files>
                        <client>
                                <clientfile load="release">js/safesenders.js</clientfile>
                                <clientfile load="debug">js/safesenders-debug.js</clientfile>
                                <clientfile load="source">js/SafeSenders.js</clientfile>
                        </client>
                </files>
        </component>
</components>

CSS files are defined as following.

<components>
        <component>
                <files>
                        <client>
                        </client>
                        <resources>
                                <resourcefile load="release">resources/css/myplugin.css</resourcefile>
                                <resourcefile load="source">resources/css/myplugin-styles.css</resourcefile>
                        </resources>
                </files>
        </component>
</components>

We will not discuss loading PHP files, since this plugin only requires JavaScript functionality.

build.xml

The build.xml file should be copied from another plugin directory. This file is required by ant to build and deploy the plugin.

JavaScript files

Now that we discussed the manifest and build file we need to create a js directory and create the file js/SafeSenders.js, since the other files are generated by ant. In the js/SafeSenders.js file we will copy paste the following code.

Ext.namespace('Zarafa.plugins.safesenders');

/**
 * @class Zarafa.plugins.safesenders.SafeSenders
 * @extends Zarafa.core.Plugin
 *
 * Plugin makes it possible to remove recipients and domains from your safesender list
 */
Zarafa.plugins.safesenders.SafeSenders = Ext.extend(Zarafa.core.Plugin, {

        /**
   * @protected
   */
        initPlugin : function()
        {
                Zarafa.plugins.safesenders.SafeSenders.superclass.initPlugin.apply(this, arguments);
        }
});

Zarafa.onReady(function() {
        container.registerPlugin(new Zarafa.core.PluginMetaData({
                name : 'safesenders',
                displayName : _('Safesender settingswidget Plugin'),
                pluginConstructor : Zarafa.plugins.safesenders.SafeSenders
        }));
});

The code above, does the following things. It declares a namespace for the plugin, creates the plugin class (SafeSenders) and when the WebApp "is ready" it registers the plugin so that it appears in Settings -> Plugins. According to the documentation Zarafa.onReady() is described as: Adds a listener to be notified when Zarafa is ready. This will be somewhere during Ext.onReady, when Zarafa has initialized the bare essentials. When the event is fired, the Zarafa.core.Container will be available, and plugins are allowed to register.

Now that the plugin is registered, we can make use of insertion points in the WebApp to extend the WebApp's functionality. Insertion points are described in the WebApp Developers Manual, basically you can insert your own functionalitiy, buttons, widgets in the WebApp. Note that you can enable the 'developer plugin' to view all the insertion points in the WebApp.

For this plugin we want to add a widget to the mail settings tab. There is an insertion point called 'context.settings.category.mail' which allows us to add a widget. If we take a look at the class Zarafa.mail.settings.SettingsMailCategory, it allows us to add a new widget. The widget should extend the same class as for example Zarafa.mail.settings.SettingsComposeWidget.

Ext.applyIf(config, {
                        title : _('Mail'),
                        categoryIndex : 1,
                        iconCls : 'zarafa-settings-category-mail',
                        items : [{
                                xtype : 'zarafa.settingsmailwidget'
                        },{
                                xtype : 'zarafa.settingscomposewidget'
                        },{
                                xtype : 'zarafa.settingsincomingmailwidget'
                        },{
                                xtype : 'zarafa.settingssignatureswidget'
                        },
                        container.populateInsertionPoint('context.settings.category.mail', this)
                        ]
                });

We now create the directory js/settings and create the file js/settings/SettingsSafeSendersWidget.js.

Ext.namespace('Zarafa.plugins.safesenders');
/**
 * @class Zarafa.plugins.safesenders.SettingsSafeSendersWidget
 * @extends Zarafa.settings.ui.SettingsWidget
 * @xtype safesenders.settingssafesenderswidget
 *
 * The {@link Zarafa.settings.ui.SettingsWidget widget} for configuring
 * safesenders in the {@link Zarafa.mail.settings.SettingsMailCategory mail category}
 */
Zarafa.plugins.safesenders.SettingsSafesendersWidget = Ext.extend(Zarafa.settings.ui.SettingsWidget, {

        /**
   * @constructor
   * @param {Object} config Configuration object
   */
        constructor : function(config)
        {
                config = config || {};

                Ext.applyIf(config, {
                        height : 400,
                        title : _('Safe senders'),
                        xtype : 'safesenders.settingssafesenderswidget',
                        layout : 'column',
                        items : []
                });

                Zarafa.plugins.safesenders.SettingsSafesendersWidget.superclass.constructor.call(this, config);
        },

        /**
   * Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
   * it has been called with {@link zarafa.settings.ui.SettingsCategory#update}.
   * This is used to load the latest version of the settings from the
   * {@link Zarafa.settings.SettingsModel} into the UI of this category.
   * @param {Zarafa.settings.SettingsModel} settingsModel The settings to load
   */
        update : function(settingsModel)
        {
                this.model = settingsModel;
        },

        /**
   * Called by the {@link Zarafa.settings.ui.SettingsCategory Category} when
   * it has been called with {@link zarafa.settings.ui.SettingsCategory#updateSettings}.
   * This is used to update the settings from the UI into the {@link Zarafa.settings.SettingsModel settings model}.
   * @param {Zarafa.settings.SettingsModel} settingsModel The settings to update
   */
        updateSettings : function(settingsModel)
        {
                settingsModel.beginEdit();
                settingsModel.endEdit();
        }
});
Ext.reg('safesenders.settingssafesenderswidget', Zarafa.plugins.safesenders.SettingsSafesendersWidget);

This file will implement the widget which will remove an "email address or domain" from the safe senders list, which we will not handle in this post. The last thing we will add is registering the SettingsSafesendersWidget in the insertion point in js/SafeSenders.js by adding the following code in initPlugin after the Zarafa.plugins.safesenders.SafeSenders.superclass.initPlugin.apply.

this.registerInsertionPoint('context.settings.category.mail', this.safeSendersWidget, this);

And adding the function safeSendersWidget in js/SafeSenders.js:

/**
 * Insert safesenders widget into the mail category
 * @return {settingssafesenderswidget} 
 */
safeSendersWidget: function() 
{
        return [{
                xtype : 'safesenders.settingssafesenderswidget'
        }];
}

We have now implemented a bare widget in the WebApp's mail settings, which doesn't do anything yet. I won't discuss the rest of the implementation, but you can find the full source here.

More advanced information can be found in the Webapp Developer manual and WebApp API Overview.

WebApp plugin development introduction was originally published by Jelle van der Waa at Jelly's Blog on January 11, 2015.

11 Jan 2015 12:37pm GMT

10 Jan 2015

feedPlanet Arch Linux

Firefox KDE Wallet for KF5

Hi there,

I have a good news for Firefox and Plasma 5 users: I ported KDE Wallet password integration extension to KDE Frameworks 5!

It seems to me that this plugin is unmaintained because both the released version and the SVN one do not support Firefox 33 or newer. So, as first step I took Guillermo's code and bumped the Firefox version.

After that I did work on the KF5 version: I updated the CMakeLists file, replaced some kDebug() usage and fixed the QString initializations. The plugin built at first shot!

And then the first issue.

There's a C test file which failed to find the exported symbols from the C++ library, therefore the extension would not work in Firefox. Turns out Q_DECL_EXPORT macro was needed. I guess with Qt 5 you need to explicity define which symbols to export?

Rebuilt, the plugin runs and... segfaults.
After some debugging it turns out KWallet::openWallet() invokes KWindowSystem that needs a QCoreApplication instance otherwise it segfaults.

Fixed that one, I rebuilt the plugin and... it works!

The code is here, and here you can download an XPI for x86_64. Try it!

In the meantime, I'm going to clean it a bit.

10 Jan 2015 10:40am GMT

09 Jan 2015

feedPlanet Arch Linux

First TalkingArch release of 2015

It's a new year with a new TalkingArch! As usual, we have kept the iso synchronized as closely as possible with the standard Arch Linux iso. This includes all the latest base packages as of the 4th of January, including Linux kernel 3.17.6. As always, the download page has been updated to reflect the latest [...]

09 Jan 2015 9:25pm GMT

03 Jan 2015

feedPlanet Arch Linux

Two PGP Keyrings for Package Management in Arch Linux

Both the pacman package manager and the makepkg tool for building packages verify files using PGP signatures. However, these two pieces of software do it using different keyrings. There seems to be a lot of confusion about this and misinformation Continue reading

03 Jan 2015 2:02am GMT

01 Jan 2015

feedPlanet Arch Linux

urlwatch github urls

I've talked about an urlwatch systemd timer setup, but monitoring github pages is troublesome since the HTML data changes per visit. Luckily urlwatch has support for hooks, which triggers after the data has been retrieved and before the data is compared with the previous retrieved data. Hooks can be created by creating a file in ~/.urlwatch/libs/hooks.py with the following content.

from BeautifulSoup import BeautifulSoup

def filter(url, data):
        if 'github' in url:
                soup = BeautifulSoup(data)

                if soup.find('span', {'class': 'tag-name'}):
                        return str(soup.find('span', {'class': 'tag-name'}))
                elif soup.find('h1', {'class': 'release-title'}):
                        return str(soup.find('h1', {'class': 'release-title'}))
                else:
                        return data
        else:
                return data

This filter is targeted at Github release and tags pages like for example: https://github.com/scipy/scipy/releases.

urlwatch github urls was originally published by Jelle van der Waa at Jelly's Blog on January 01, 2015.

01 Jan 2015 7:00pm GMT

23 Dec 2014

feedPlanet Arch Linux

Take It Or Leave It

A Most Unusual Holiday

23 Dec 2014 9:07pm GMT

21 Dec 2014

feedPlanet Arch Linux

Pacman-4.2 Released

I released pacman-4.2 on the 19th of December - which is only marginally after the end of August as originally planned… We had 52 contributors provide patches to this release. Andrew takes the prize for most commits. Here are the Continue reading

21 Dec 2014 8:37am GMT

11 Dec 2014

feedPlanet Arch Linux

ca-certificates update

The way local CA certificates are handled has changed. If you have added any locally trusted certificates:

  1. Move /usr/local/share/ca-certificates/*.crt to /etc/ca-certificates/trust-source/anchors/
  2. Do the same with all manually-added /etc/ssl/certs/*.pem files and rename them to *.crt
  3. Instead of update-ca-certificates, run trust extract-compat

Also see man 8 update-ca-trust and trust --help.

11 Dec 2014 12:05pm GMT

10 Dec 2014

feedPlanet Arch Linux

The ultimate 2014 release of TalkingArch is now live

It took some time to get this one out the door, but here it is, TalkingArch for December 2014, the last of the year. Notable changes include Linux kernel 3.17.4, as well as changes in the boot loader that cause the intel-ucode package to load properly at boot time. This snapshot also includes the latest [...]

10 Dec 2014 12:37am GMT

08 Dec 2014

feedPlanet Arch Linux

GnuPG-2.1 and the pacman keyring

The upgrade to gnupg-2.1 ported the pacman keyring to a new upstream format but in the process rendered the local master key unable to sign other keys. This is only an issue if you ever intend to customize your pacman keyring. We nevertheless recommend all users fix this by generating a fresh keyring.

In addition, we recommend installing haveged, a daemon that generates system entropy; this speeds up critical operations in cryptographic programs such as gnupg (including the generation of new keyrings).

To do all the above, run as root:

pacman -Syu haveged
systemctl start haveged
systemctl enable haveged

rm -fr /etc/pacman.d/gnupg
pacman-key --init
pacman-key --populate archlinux

08 Dec 2014 2:13am GMT

06 Dec 2014

feedPlanet Arch Linux

IT-Telemetry Google group. Trying to foster more collaboration around operational insights.

The discipline of collecting infrastructure & application performance metrics, aggregation, storage, visualizations and alerting has many terms associated with it... Telemetry. Insights engineering. Operational visibility. I've seen a bunch of people present their work in advancing the state of the art in this domain:
from Anton Lebedevich's statistics for monitoring series, Toufic Boubez' talks on anomaly detection and Twitter's work on detecting mean shifts to projects such as flapjack (which aims to offload the alerting responsibility from your monitoring apps), the metrics 2.0 standardization effort or Etsy's Kale stack which tries to bring interesting changes in timeseries to your attention with minimal configuration.

Much of this work is being shared via conference talks and blog posts, especially around anomaly and fault detection, and I couldn't find a location for collaboration, quicker feedback and discussions on more abstract (algorithmic/mathematical) topics or those that cross project boundaries. So I created the IT-telemetry Google group. If I missed something existing, let me know. I can shut this down and point to whatever already exists. Either way I hope this kind of avenue proves useful to people working on these kinds of problems.

06 Dec 2014 9:01pm GMT