Author Archive

4. Januar 2017


In: Allgemein, Tech

No comments

One of the core principles of modern Object-oriented programming (OOP) says „Once and Only Once“. Having several places in a system where the same or similar code performs the same or similar tasks is usually bad. It makes code longer than necessary, it allows bugs to remain in one place that have already been solved in another and it increases cost of optimization, feature development, adjusting code to new versions of frameworks and dependencies.

But what’s worse, it is a lazy, half-hearted approach to programming. We can do better. Imagine a cook book of 200 pages which explains making fresh pasta. 200 Pages, the ultimate book, containing everything you ever wanted to know about pasta, right? Wrong. The first twenty pages describe making dough. Then we have a page on how to form the first noodle out of the dough. Then we have a page on how to form the second noodle out of the dough. Several pages later, we have a chapter which goes into explaining short thick noodles. It begins with twenty pages on making dough. Then we have a page on how to form the first short thick noodle, the second short thick noodle. The next chapter is about long thin noodles. It begins with 20 pages on making dough…

You wouldn’t buy that, right? Why should a customer accept such a product?

Good software is created by refactoring. First, you want to write the first thing that works. You might even copy-paste and adapt from something similar you wrote somewhere else.
Or somebody else, respecting license and naming the original author. You finish the day, a few hours late and glad you arrived at a point where your program somehow, for some reason, does the right thing, at least in your defined test case. You want to go to sleep.

But if you don’t get back at that code, look into this, reorganize the parts, remove things you don’t need or already have somewhere else, you get software like this pasta book.

Recently, I was working on a component which implements multiple types of fields to hold and display data. Among those fields were an enumeration (choose one out of several predefined options), a relation (choose one out of a list of things stored somewhere else), a multienum (choose none, one or many out of several predefined options) and a multirelation (You can imagine, right?). They were somehow related, that’s obvious. It took a little time to figure out which way the code needed to be structured to reduce the amount of duplication in the different classes. I ended up with the following:

  • A single-select enumeration is a special case of a multi-select enumeration, as the latter can do all the first needs to do – it must only be restricted.

Now for purely technical reasons an important question was if the different types of relation were more similar to each other than they were to single and multiple enumeration respectively. It turned our they were. So the complete set of inheritance was like this:

  • A single-select enumeration is a special case of a multi-select enumeration, as the latter can do all the first needs to do – it must only be restricted.
  • A multi-select relation is a special case of a multi-select enumeration.
  • A single-select relation is a special case of a multi-select relation, as the latter can do all the first needs to do – it must only be restricted.

The „it must only be restricted“ part was still annoying duplication but I needed to move on and implement other field types. A little bit later I decided once and for all that all those validations should be reusable parts which should be independent from the fields. Don’t repeat the same validation for similar fields but let the fields each use the validation items like „mandatory“ (choose at least one value), „singleOption“ (Don’t allow multiple options), „existingValue“ (value must be from option list). In the old Form class I wanted to replace, all was organized a little different.

It also coupled the presentation to the field type. I did not do this. I separated presentation type from field type just like I separated validation from storage.

The reason is simple. A list of radio buttons represents a single-choice enumeration just like a dropdown box or a clickable selection list. The data type cannot know which presentation fits best. For yes/no questions, even a checkbox might be an option. Or a multiselect could be served by a list of options with checkboxes. But if we have really huge lists of hundreds or ten thousands of elements, a searchable box with auto completion might be the best presentation. Maybe combined with a short selection of recently used or frequently used items. How could a data type know that? On the other hand, different presentations might mean the same thing and should not be different data types.

Most expert find it important to strictly separate the process of feature development from the process of refactoring existing code. Otherwise you can end up in a complete mess. Or never finish. In different software projects, I have seen both. Some people have a talent to limit themselves, to make minor improvements on the fly while moving around bits and pieces. I think this is fine, you just need to know when to stop messing around and get one thing done and leave the other for later.

Before I published this article, I already had it written for some time. I decided to move some things around, to amend some parts, to delete what was said twice. At some point it was important to stop fiddling around. I thought „stop messing around, get the pasta done and leave the text for later“. Life is not so different from programming, after all.

16. Dezember 2015


In: Allgemein

Kommentare deaktiviert für Boneyard – a barebone horde „dynamic view“ app based on „skeleton“.

Boneyard – a barebone horde „dynamic view“ app based on „skeleton“.

In this article, I will show you some minimal setup for a „horde5 dynamic view“ application as demonstrated by hermes time tracking and kronolith calendar

We have a working git checkout of a 5.2 or master installation of horde with some authentication and prefs backend working and the migrations inplace.
If your setup did not involve editing install_dev.conf, you probably have something else and I cannot guarantee this walkthrough will work for you without adopting some parts.

Let’s generate a fresh application called boneyard

maintaina:/srv/git/horde5-webmail/horde # php framework/bin/horde-generate-module boneyard "Ralf Lang "
Started new Module in /srv/git/horde5-webmail/horde/boneyard!
Register the new Module with a file in the config/registry.d directory:

$this->applications['boneyard'] = array('name' => _("Boneyard"));

We put a file with this oneliner into the directory as advised

maintaina:/srv/git/horde5-webmail/horde # vim horde/config/registry.d/boneyard.php

Now let’s re-run the script generating the links for the git checkout installation

maintaina:/srv/git/horde5-webmail/horde # php framework/bin/install_dev
EMPTYING old web directory /srv/www/vhosts.d/

Setting static directory permissions...
LINKING applications to web directory /srv/www/vhosts.d/
[.. snip ..]
LINKING pastie
LINKING boneyard
LINKING hvview
LINKING passwd
LINKING operator
LINKING gollem
LINKING sueporter
LINKING ulaform

LINKING framework
[ INFO ] Source directory: /srv/git/horde5-webmail/horde/framework
[ INFO ] Framework destination directory:
[ INFO ] Horde directory: /srv/www/vhosts.d/
[ INFO ] Create symbolic links: Yes

[ INFO ] Package(s) to install: ALL (129 packages)
[ INFO ] Installing package ActiveSync
[.. snip ..]
[ INFO ] Installing package xxhash

Now boneyard is set up in your web-accessible dir.
Let’s make the config dir web-writeable

chown wwwrun:www /srv/www/vhosts.d/

This is for SUSE – debian or redhat may have different user/group for the web server.

Next go to $yourdomain/admin/config/ the admin panel and generate the conf.php file by clicking on the „boneyard“ entry and then the „create boneyard config“ button.
At this point, we do not care about the actual contents of this config – the defaults are just fine.

If you only see „horde“ and some library names, you most probably have not edited registry.local.php to contain something like:

// By default, applications are assumed to live within the base Horde
// directory (e.g. their fileroot/webroot will be automatically determined
// by appending the application name to Horde's 'fileroot'/'webroot' setting.
// If your applications live in a different base directory, defining these
// variables will change the default directory without the need to change
// every application's 'fileroot'/'webroot' settings.
$app_fileroot = '/srv/www/vhosts.d/';

Now „Boneyard“ should appear in your horde topbar with some bogus buttons and content

Let’s create the structure of a „dynamic“ application

* lib/Ajax.php – The Boneyard Ajax base class to load locale- and setting-dependent content into the browser’s javascript
* lib/Ajax/Application/Handler/Example.php – A handler for Ajax requests to load data from the server — we skip that for now
* lib/View/Sidebar.php – Boneyard_View_Sidebar – a sidebar for the dynamic view
* template/dynamic/sidebar.html.php – The template used by the sidebar view
* template/dynamic/ – The main template of the dynamic view
* template/dynamic/ – One of our two example views in this demo
* template/dynamic/ – One of our two example views in this demo
* js/boneyard.js – The BoneyardCore object which contains the main click handler etc

We also need to touch the index.php file to enable the dynamic view and the lib/Application.php file to advertise that dynamic view exists.

See to view the code in detail.

7. Dezember 2015


In: horde

Kommentare deaktiviert für Horde_Rdo Many to Many relations and Horde DB Migrator

Many to Many relations btween to object types or table rows are usually saved to a database using a third table.

For example, if every server can have multiple services and each service can run on multiple computers, we need a third table to store the relations:

server table:
server_id | server_name
        1 |
        2 |
service table:
service_id | service_name
         1 | tomcat
         2 | dovecot
relation table:
service_id | server_id
         1 | 1
         2 | 2
         2 | 1

Horde’s ORM Layer Horde_Rdo supports creating, checking and changing such relations but it’s not very prominently documented.

Let’s look at an example.

First, we need to create the database schema. Note that the relations table has no autoincrement key, only the two columns used for lookup

/usr/share/php5/PEAR/www/horde/hvview/migration # cat 1_hvview_base_tables.php
* Create Hvview base tables.
* Copyright 2015-2015 B1 Systems GmbH (
* See the enclosed file COPYING for license information (GPL). If you
* did not receive this file, see
* @author Ralf Lang
* @package Hvview
class HvviewBaseTables extends Horde_Db_Migration_Base
* Upgrade
public function up()

$t = $this->createTable('hvview_technical_landscapes', array('autoincrementKey' => 'landscape_id'));
$t->column('landscape_name', 'string', array('limit' => 255, 'null' => false));
$t->column('period_id', 'integer', array('limit' => 11, 'null' => false));

$t = $this->createTable('hvview_resource_pools', array('autoincrementKey' => 'resource_pool_id'));
$t->column('pool_name', 'string', array('limit' => 255, 'null' => false));
$t->column('landscape_id', 'integer', array('limit' => 11, 'null' => false));
$t->column('period_id', 'integer', array('limit' => 11, 'null' => false));

$t = $this->createTable('hvview_hardware_pools', array('autoincrementKey' => 'hardware_pool_id'));
$t->column('pool_name', 'string', array('limit' => 255, 'null' => false));
$t->column('landscape_id', 'integer', array('limit' => 11, 'null' => false)); /* possibly redundant, but may speed up things */
$t->column('period_id', 'integer', array('limit' => 11, 'null' => false));

/*Relations table*/
$t = $this->createTable('hvview_rp_hwps', array('autoincrementKey' => false));
$t->column('resource_pool_id', 'integer', array('limit' => 11, 'null' => false));
$t->column('hardware_pool_id', 'integer', array('limit' => 11, 'null' => false));

$t = $this->createTable('hvview_periods', array('autoincrementKey' => 'period_id'));
$t->column('period_ts', 'integer', array('limit' => 11, 'null' => false));

/* We collapse hypervisor and blade server objects into one for now - let`s see if this scales well */
$t = $this->createTable('hvview_servers', array('autoincrementKey' => 'server_id'));
$t->column('period_id', 'integer', array('limit' => 11, 'null' => false));
$t->column('hardware_pool_id', 'integer', array('limit' => 11, 'null' => false));
$t->column('hostname', 'string', array('limit' => 100, 'null' => false));
$t->column('state', 'string', array('limit' => 20, 'null' => true));
$t->column('os_release', 'string', array('limit' => 20, 'null' => true));
$t->column('comment', 'string', array('limit' => 255, 'null' => true));
$t->column('hv_free_vcpu', 'integer', array('limit' => 11, 'null' => true));
$t->column('hv_free_memory', 'integer', array('limit' => 11, 'null' => true));
$t->column('hv_free_disk', 'integer', array('limit' => 11, 'null' => true));
$t->column('hv_total_vcpu', 'integer', array('limit' => 11, 'null' => true));
$t->column('hv_total_memory', 'integer', array('limit' => 11, 'null' => true));
$t->column('hv_excluded', 'integer', array('limit' => 1, 'null' => true));
$t->column('hv_vm_count', 'integer', array('limit' => 3, 'null' => true));

// Indices not before we have an idea which of them we need most
// $this->addIndex('hvview_items', array('item_owner'));


* Downgrade
public function down()

The relations are defined in a Horde_Rdo_Mapper class which also knows how to spawn objects from the rows.

The Objects

/usr/share/php5/PEAR/www/horde/hvview/lib/Entity # cat ResourcePool.php 

The Mappers:

/usr/share/php5/PEAR/www/horde/hvview/lib/Entity # cat ResourcePoolMapper.php 
 array('type' => Horde_Rdo::MANY_TO_MANY,
                          'through' => 'hvview_rp_hwps',
                          'mapper' => 'Hvview_Entity_HardwarePoolMapper')


/usr/share/php5/PEAR/www/horde/hvview/lib/Entity # cat HardwarePoolMapper.php 
 array('type' => Horde_Rdo::MANY_TO_MANY,
                          'through' => 'hvview_rp_hwps',
                          'mapper' => 'Hvview_Entity_ResourcePoolMapper')


The relation is defined in both direction and only loaded on-demand ("lazy") as opposed to upfront when the item is created from the database rows.
Now let's fetch two items and link them:

You can do this through the mapper or through one of the two partners

Adding a relation to an object using the object

// $rm is a ResourcePoolMapper instance
// $hm is a HardwarePoolMapper instance
$rp = $rm->findOne(); // In reality, you would not pick a random item but add some criteria
$hwp = $hm->findOne();
$rp->addRelation('hwps', $hwp);

Adding a relation to an object using the mapper

// $rm is a ResourcePoolMapper instance
// $hm is a HardwarePoolMapper instance
$rp = $rm->findOne(); // In reality, you would not pick a random item but add some criteria
$hwp = $hm->findOne();
$rm->addRelation('hwps', $rp, $hwp);

31. Dezember 2014


In: Allgemein

Kommentare deaktiviert für Thimbleweed Park angekündigt

Ron Gilbert, der Mann, der uns Maniac Mansion, Monkey Island (1+2) und Total Annihilation brachte, hat zusammen mit Gary Winnick die Entwicklung eines klassischen Point&Click-Adventures begonnen. Thimbleweed Park wird für PC, Android und iOS erscheinen und (optionale) Sprachausgabe sowie Übersetzung von Boris Schneider-Johne, der schon Monkey Island übersetzte. Mitte Juni 2016 soll das Spiel im Handel erscheinen, so der erste Zeitplan. Ich bin gespannt.

Vorbestellungen sind zu 25 US-$ möglich über Amazon und Paypal.

23. Juli 2014


In: Allgemein, OpenSUSE, Tech


For more than 10 years, PHP core developers repeatedly raised the topic of providing a formal language specification for PHP. Now a team of facebook employees has written such a specification. The spec document is currently only available as a preview chapter a preview chapter . PHP veteran Sara Golemon announced on the „PHP internals“ list that the full document will be ready for O’Reilly’s OSCON 2014. Sara Golemon published the standard book on „Extending and Embedding PHP“ some years ago and now works for Facebook’s own PHP implementation HHVM. The PHP spec defines PHP version 5.6 in about 200 pages and contains all the odd and obscure quirks of the language core. Facebook’s own HHVM aims to be as close to the spec as possible. Currently, PHP developers discuss how amending the spec can become a mandatory part of the language development process. Though some are sceptic that all developers will embrace the change in the process, everybody on the list was happy to have the new document.

Software Architect Stas Malyshev:

Thank you Sara and Facebook team for doing something we’ve been talking
about for more than a decade and before that nobody actually attempting
to do. I think it is a great development and I hope to see the first
version soon.

23. Juli 2014


In: Tech

Kommentare deaktiviert für Sara Golemon (Facebook) kündigt PHP Language Specification auf OSCON 2014 an

Seit über 10 Jahren bringen immer wieder einige der PHP-Sprachentwickler den Plan an, eine formale Spezifikation für den Sprachkern bereitzustellen. Ein Team bei Facebook hat das nun getan. Die Spezifikation, die bisher nur als Vorschau vorliegt, wurde von Sara Golemon auf der Entwickler-Liste angekündigt und soll auf der OSCON 2014 vorgestellt werden. Sara Golemon veröffentlichte schon vor einigen Jahren ein Standardwerk über die Entwicklung von PHP-Erweiterungsmodulen und arbeitet mittlerweile an Facebooks eigener PHP-Version HHVM.

Das rund 200 Seiten starke Dokument orientiert sich an der PHP-Version 5.6 und enthält auch obskure Verhaltensweisen des PHP-Sprachkerns in seltenen Randfällen. Die Facebook-eigene PHP-Version HHVM soll sich möglichst eng an diese Vorgaben halten.

Die PHP-Community berät derzeit, wie sie die Fortschreibung der Spezifikation in den Entwicklungsprozess einbinden kann. Die Ankündigung wurde mit viel Begeisterung aufgenommen.

Software-Architekt Stas Malyshev:

Thank you Sara and Facebook team for doing something we’ve been talking
about for more than a decade and before that nobody actually attempting
to do. I think it is a great development and I hope to see the first
version soon.

17. Juli 2014


In: Tech

Kommentare deaktiviert für Perl: Semantic Version Sorting via callback puts betas before releases (empty string after text)

Semantic Versioning

Semantic program versions are a great help in administration life: When done right, they help you identify if only bugs have been resolved (2.11.z) or features added (2.y.0) or the program has undergone big changes with chances that an upgrade needs a lot of admin intervention (x.0.0). For developers and early testers, additional suffixes identify alpha (early testing), beta (testing) and Release Candidate (pre-release polishing) versions which are not intended for production use.

The Problem

Sorting program versions is not exactly trivial. You cannot sort them as strings, otherwise you would put 2.2.2 after 2.12.1. You cannot sort them as numbers either, because they contain multiple dots and possibly alpha characters.


a) Fixed-Length Score string

A traditional method expands the version string to a fixed-format score integer or string which can be safely compared and sorted by basic sorting algorithms. This is based on the assumption that there are not more than a fixed number of values per field, i.e. not more than 99 patch versions before the next minor, not more than 99 minor versions before the next major. This is safe for most mainstream projects but corner cases may exist. It also doesn’t play well with development releases.

This solution would first split the version string into its components, then merge them to a string and then run an alphabetic sort on it:

my @versions;
foreach my $version_string (@version_strings) {
  my ($major, $minor, $patch) = split /\./, $version_string;
  push(@versions, sprintf(%02d%02d%02d, $major, $minor, $patch));
my @sorted_versions = sort {$a cmp $b} @versions;

This is a simplified example. You need to get back to the original string format, either by a function for reverse conversion or by storing both together in an array of hashref. I also left out handling for alpha, beta, RC versions.

b) Using a sort callback

The sort() routine allows you to specify a callback which decides for any two values $a and $b if they are equal or which is greater. This works by any criteria you can imagine and is also usable for objects and hashes.

This is what we do: We split the version string into a hashref of its components (and a key for the original format, for convenience) and then we define a callback.

sub release_to_version_hash {
  my $release = shift;
  my ($package, $major, $minor, $patch, $dev) = $release =~ /\/(\w+)-(\d+)\.(\d+)\.(\d+)(\w*)/;
  return { 
    major => $major,
    minor => $minor,
    patch => $patch,
    dev => $dev,
    pkg => $package,
    url => $release,
    string => sprintf("%d.%d.%d%s", $major, $minor, $patch, $dev)

We use a regular expression to retrieve the version fields.
Note: This code is taken from an open source project of mine.
The release strings have this format:
If your source string is just a version, your regular expression would look like this:


Now let’s get down to business. The actual sorting routine is not very exciting. It gets an Array Reference of Hash References, the hashes being in the format produced above. It returns an array reference (note the [] brackets). The sort routine gets the list (ref) of releases, dereferenced to an array and invokes the compare_versions routine many times, comparing any two values $a and $b inside the releases list which is the „bigger“ one.

sub sort_releases {
  my $releases = shift;
  return [sort compare_versions @$releases];

Now let’s look at that callback.

## A compare function callback for version hashes, suitable for sort
## returns -1, 0 or 1
sub compare_versions {
    $a->{major} <=> $b->{major} or
    $a->{minor} <=> $b->{minor} or
    $a->{patch} <=> $b->{patch} or
    ## handle development releases
    ( !$a->{dev} && $b->{dev} ? 1 : 0 ) or
    ( !$b->{dev} && $a->{dev} ? -1 : 0 ) or
    lc($a->{dev}) cmp lc($b->{dev})

Now what happens here? This routine returns -1, 0 or 1 depending on which versions is „bigger“. In practice, you should never get 0 because you should never have two identic version strings. After the major versions are compared as a number via the spaceship operator (<=>), perl evaluates the result.
If version $a (major) is smaller (-1) or bigger (1) than version $b (major), then this evaluates to a true (non-zero) value. This fulfills the „or“ condition, so perl immediately stops evaluating and returns the value. If the major versions are equal, the first expression evaluates to false (0) and the next part of the comparison is evaluated. This is sufficient for sorting major, minor, patch version in that order.

If we also want to handle development releases, we also need the last three lines.
The last line sorts development releases alphabetically, sorting all alphas of the same major.minor.patch before all betas. Normally, perl would sort all empty strings before all non-empty strings, which is bad. It would sort a production version 2.0.0 before the alpha releases.

To fix this, we use the upper two lines:
If a string is empty, it evaluates to false.
So if the first string is false (empty, production) and
the second string is true (any characters, development), the first version is the preferable version. In this case the expression evaluates to 1 and returns. Otherwise it evaluates to false (0) and the next or clause is evaluated. This one checks for the opposite case where version b is the better version and returns -1. If both versions contain a dev string, we skip to alphabetic comparison.

This results in a list where the best version is the last hash entry. Getting the best version is as easy as

$version = pop @versions;
## or
$version = $versions[-1];

Bonus: A versatile filter for all sorts of tasks

This filter is best applied before sorting but it also works afterwards. It can filter out all development releases or return only releases within a specific major version etc:

sub filter_releases {
  my $releases = shift;
  my $filter = shift || 
    { stable => 1, 
      rc => 0, 
      beta => 0, 
      alpha => 0, 
      major => 0, 
      minor => 0, 
      patch => 0, 
      pkg => '' };
  my @legit;
  foreach my $pkg (@$releases) {
    ## filters
    next if ($filter->{pkg} && $pkg->{pkg} ne $filter->{pkg});
    next if ($pkg->{dev} =~ /RC/ && $filter->{'rc'} == 0);
    next if ($pkg->{dev} =~ /alpha/ && $filter->{'rc'} == 0);
    next if ($pkg->{dev} =~ /beta/ && $filter->{'rc'} == 0);
    next if ($filter->{major} && $filter->{major} != $pkg->{major});
    next if ($filter->{minor} && $filter->{minor} != $pkg->{minor});
    next if ($filter->{patch} && $filter->{minor} != $pkg->{patch});
    push @legit, $pkg;
  return \@legit;

10. Januar 2014


In: horde

Kommentare deaktiviert für Horde Recipe: Storing the last login language

A simple Horde Hook to store the last chosen login value in a user preference.
You can use this for example to determine in which language automatic messages by cron job or daemon should be sent.

// // APPLICATION AUTHENTICATED HOOK: See above for format.
public function appauthenticated()
global $language;
global $prefs;
if ($language) {
$prefs->setValue('language', $language);


// // Code to run when an application is first authenticated

If you want, you can modify it so it won’t overrule manual settings in the prefs UI:

if ($language && empty($prefs->getValue('language')) {
$prefs->setValue('language', $language);


22. November 2013


In: OpenSUSE, Tech

Kommentare deaktiviert für SLES 11: Upgrading mysql from SP2 to SP3

Under some condition, mysql is not able to restart after an upgrade from SLES11 SP2 to SLES11 SP3. The output messages are a bit misleading

131122 14:41:28 InnoDB: The InnoDB memory heap is disabled
131122 14:41:28 InnoDB: Mutexes and rw_locks use GCC atomic builtins
131122 14:41:28 InnoDB: Compressed tables use zlib 1.2.7
131122 14:41:28 InnoDB: Using Linux native AIO
131122 14:41:28 InnoDB: Initializing buffer pool, size = 128.0M
131122 14:41:28 InnoDB: Completed initialization of buffer pool
131122 14:41:28 InnoDB: highest supported file format is Barracuda.
131122 14:41:28 InnoDB: Waiting for the background threads to start
131122 14:41:29 InnoDB: 5.5.33 started; log sequence number 4796605421
/usr/sbin/mysqld: Out of memory (Needed 64 bytes)
131122 14:41:29 [ERROR] Plugin 'INNODB_CMP' registration as a INFORMATION SCHEMA failed.
131122 14:41:29 InnoDB: Unable to allocate memory of size 8120.
131122 14:41:29 InnoDB: Assertion failure in thread 140387876259584 in file mem0mem.c line 361
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: about forcing recovery.
13:41:29 UTC - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.


In the end it turned out to be a permission problem with /var/run/mysql
To fix this:

chown -R mysql /var/run/mysql
rcmysql restart

This did it for me. I had this problem on several but not all instances of mysql on SLES11SP2 upgrading to SLES11SP3. My wild guess is that it is based upon if this was a fresh SP2 install or upgraded from an earlier service pack.

26. September 2013


In: Allgemein, Non-Tech and German

Kommentare deaktiviert für Die Wahlfälscher-Angst: Warum die Sorgen der AfD unbegründet sind

Am 22. September 2013 wählten die Deutschen den neuen Bundestag mit sensationellem Ergebnis: Erstmals in ihrer Geschichte ist die FDP nicht im deutschen Parlament vertreten und scheiterte knapp mit 4,8% der Stimmen.

Ihr schärfster Konkurrent, die im Frühjahr gegründete Anti-Euro-Partei „Alternative für Deutschland“ (AfD) kam knapp hinter ihr auf 4,7%. Beide sind damit nicht im Parlament vertreten. AfD-Anhänger witterten unmittelbar Wahlbetrug. Aus Sicht der Mitglieder ist das nachvollziehbar: Hatte doch Parteichef Lucke erklärt, die Umfragen seien manipuliert und man stehe bei 8-9% – Eine Aussage, für die er eine Verfügung vom Gericht bekam, sie nicht zu wiederholen. Hatte doch der von der AfD häufig zitierte Internet-Dienst Wahl-Radar 2013 in seiner Meta-Prognose vom 19. September die AfD noch auf 7,3% taxiert. Kritikern fiel schnell auf, dass der Unternehmer hinter diesem Prognosedienst selber AfD-Aktivist war.

Es ist nicht verwunderlich, dass auf der Facebook-Seite von AfD schnell einige User von angeblichen Ungereimtheiten im Wahllokal raunten. So knapp gescheitert, da kommen schnell komische Ideen zustande.

In dieser Situation ist es wichtig, einen kühlen Kopf zu bewahren und das Vertrauen in unsere Demokratie nicht zu beschädigen. Selbst der AfD-Führung ist es mittlerweile peinlich, mit welcher Verve enttäuschte Anhänger unseren Institutionen flächendeckenden Betrug vorwerfen. Daher fordert er die Fans bei Facebook auf:

Der Bundesvorstand hat mögliche Probleme bei der Auszählung der Stimmen zur Kenntnis genommen und wird den Vorwürfen natürlich nachgehen.

und die nötigen Schritte einleiten.

Bis zu diesem Zeitpunkt möchten wir Sie bitten, von Aussagen Abstand zu nehmen, die in der Presse falsch aufgefasst werden könnten

Um deutlicher zu machen, warum viele im Internet und in Leserbriefen kursierende Betrugsszenarien übertriebene Ängste sind, habe ich einige typische Behauptungen herausgesucht und kommentiert.

„Im Wahllokal wurden Stimmzettel radiert“
In den meisten Wahllokalen liegen Kugelschreiber aus. Nur in wenigen Wahllokalen werden Bleistifte verwendet. Jeder Stift ist legal, mit dem deutlich erkennbare Markierungen gemacht werden können. Der Wähler trägt seinen Stimmzettel zur Wahlurne und wirft den Zettel selbst ein. Die Urne ist mit einem Schloß gesichert und mit einem Siegel versehen, das erst nach 18 Uhr im Beisein aller Wahlhelfer und Wahlbeobachter geöffnet und dabei zerstört wird. Zu keinem Zeitpunkt könnte irgendwer außer dem Wähler selbst Radierungen vornehmen.

„Die Wahlhelfer lassen Stimmzettel verschwinden“
Jeder Wähler wird im Wählerverzeichnis markiert, wenn er seinen Stimmzettel einwirft. Die Urne ist mit einem Schloß gesichert und mit einem Siegel versehen, das erst nach 18 Uhr im Beisein aller Wahlhelfer und Wahlbeobachter geöffnet und dabei zerstört wird. Verschwundene Stimmzettel würden auffallen, weil die Zahl der Markierungen im Protokoll nicht zur Zahl der Wahlzettel passen würde.
Vor Beginn der Auszählung werden alle leeren Stimmzettel vom Tisch entfernt und in einem Karton gelagert, sodass nicht versehentlich oder absichtlich weitere Stimmzettel hinzugefügt werden können.

„Die haben meinen Ausweis nicht kontrolliert“
Der Wahlvorstand hat das Recht, aber nicht die Pflicht, den Ausweis des Wählers zur Identifizierung zu verlangen. Normalerweise übergibt der Wähler die Wahlbenachrichtigung (meist eine Postkarte) mit einer Nummer an den Wahlhelfer. Der Wahlhelfer schaut, dass derjenige im Wählerverzeichnis vorhanden ist, dass das Geschlecht stimmt und auch das Alter ungefähr zum Aussehen passt. Bei Zweifeln oder stichprobenartig verlangt er ein Ausweisdokument. Der Wahlvorstand behält die Wahlbenachrichtigung nach der Wahl ein.

„Die Wähler gehen zweimal wählen – einmal mit Ausweis, einmal mit Wahlkarte“
Wähler, die bereits gewählt haben, werden im Wählerverzeichnis markiert. Eine doppelte Stimmabgabe, einmal mit Karte und einmal mit Ausweis, ist ausgeschlossen.

„Einige Wähler machen Briefwahl und gehen dann nochmal wählen“
Briefwähler sind im Wählerverzeichnis vermerkt und können nicht regulär wählen.

„Einige Wähler klauen Wahlkarten und gehen mit diesen mehrmals wählen“.
Um es gleich vorweg zu sagen: Es handelt sich um eine Straftat, die bis zu fünf Jahren Haft bedeuten kann, wenn sie auffliegt. Praktisch wird das so aber nur sehr selten jemand wagen. Versuchen Sie es lieber nicht!

  •  Der Wahlvorstand besteht aus 7-9 Leuten, manchmal in zwei Schichten. Es sind immer mindestens drei Wahlhelfer anwesend, darunter der Wahlvorsteher oder sein Stellvertreter. Der Wahlvorstand könnte den Betrüger oder den Betrogenen persönlich oder namentlich kennen.
  • Das Geschlecht muss passen
  • Das Alter muss passen
  • Es fällt auf, wenn dieselbe Person mehrfach im Wahllokal auftaucht
  • Es fällt auf, wenn der echte Wähler zuvor schon mit Ausweis wählen gegangen ist. Hören Sie schon die Handschellen klicken?
  • Es fällt auf, wenn der echte Wähler nach Erhalt der Wahlbenachrichtigung verstorben oder verzogen ist – die Listen werden vor der Wahl und noch am Wahltag berichtigt.
  • Es fällt auf, wenn der echte Wähler Briefwahl beantragt hat. Das kann er unabhängig vom Versand der Wahlbenachrichtigung tun.
  • Es fällt auf, wenn der echte Wähler später zu wählen versucht. Dann kriegt man den Betrüger vielleicht nicht, aber man bemerkt den Betrug.

Es ist nicht bekannt, dass solche Fälle gehäuft aufgetreten sind. Die Meldung stellt sich bei näherer Betrachtung meist als Hörensagen heraus.

„Die Wahlhelfer erklären unerwünschte Stimmen für ungültig“
Damit ein Stimmzettel als ungültig gilt, muss er laut Gesetz entweder leer, gefälscht oder falsch ausgefüllt sein. Zu viele Kreuze oder irgendwelche Stichwörter und Markierungen auf dem Stimmzettel machen einen Wahlschein ungültig. Die Wahlhelfer werden vor der Wahl geschult, welche Fälle gültig und welche ungültig sind. Mindestens für den Vorsitzenden des Wahllokals und den Schriftführer ist diese Schulung verpflichtend.
Die Auszählung findet öffentlich statt, Sie können also zusehen. Eindeutig ungültige Stimmzettel (alles/nichts angekreuzt usw) werden in einem gesonderten Stapel gezählt und an den Kreiswahlleiter gegeben. Über Zweifelsfälle stimmt der Wahlvorstand gemeinsam ab, das Abstimmungsergebnis und das Urteil werden auf dem Stimmzettel notiert. Diese Streitfälle werden ebenfalls in einem besonderen Umschlag an den Kreiswahlleiter gegeben und können bei begründetem Verdacht nachgeprüft werden.

„Die Wahlhelfer haben sich verzählt“
Die Auszählung findet nach einem festgelegten Verfahren statt, die einzelnen Zählschritte werden protokolliert:

Zunächst werden die Stimmzettel durchgezählt und Abweichungen von der Zahl der Vermerke im Wählerverzeichnis überprüft.
Dann sortieren die Wahlhelfer die Stimmzettel:

  • Stimmzetteln mit Erst- und Zweitstimme auf derselben Höhe (zB Linke-Kandidat und Linke-Liste)
  •  Stimmzettel mit nur Erststimme, nur zweitstimme, Erststimme und Zweitstimme auf derselben Höhe (zB CDU-Direktkandidat, AfD-Listenstimme)
  •  Zweifelsfälle
  •  Eindeutig ungültige und nicht ausgefüllte Zettel


Die verschiedenen Stapel werden im weiteren Verfahren durchgezählt, auf die Details gehe ich hier nicht ein. Da alle Schritte protokolliert sind und die Stimmzettel in sortierten Stapeln abgegeben werden, können Nachzählungen und logische Konsistenzprüfungen leicht erfolgen.

Abschließend muss man sagen: Vorsätzlicher Wahlbetrug ist strafbar, aufdeckungsgefährdet und mit vertretbarem Aufwand nur in so kleinem, wirkungslosen Maß möglich, dass niemand, der bei Verstand ist, sich darauf einlässt. Fehler hingegen sind schon öfter passiert und werden weiter passieren. Das komplizierte Verfahren stellt auf vielfache Weise sicher, dass die ehrenamtlichen Wahlhelfer Irrtümer, Flüchtigkeitsfehler und dergleichen selbst entdecken können und dass unabhängige Prüfungen hinterher leicht möglich sind. Der annehmbare Restfehler, ob nun durch Irrtum oder Betrug, ist dabei so gering, dass er nicht die Sitzverteilung im Bundestag beeinflusst. Knappe Fälle und statistisch arg abweichende Wahllokale werden routinemäßig kontrolliert.

12. August 2013


In: OpenSUSE, Tech

Kommentare deaktiviert für I managed to bring large file uploads into PHP 5.6

A colleague of mine recently faced difficulties to upload large opensource DVD images (>4G) into ownCloud during a demonstration. After some analysis, it turned out that it wasn’t ownCloud’s fault at all: PHP itself simply could not cope with large file uploads due to an overflow in some key variables. Further research showed that this had been known since 2008 under the bug number #44522. There was even a half completed patch available. I decided to pick up the existing patch and comments from developers and critics and port it to recent PHP, also making some changes to data type definitions. After a discussion on the PHP list, it turned out that this patch cannot be shipped for any upstream PHP before the next release (PHP 5.6) due to backwards compatibility. SUSE Enterprise Linux and openSUSE ship a similar patch with their PHP packages though. Finally, Michael Wallner added tests and included the patch into the PHP master branch.

There only has been very basic testing for Windows and other non-linux PHP ports yet but there is still some time to do this before PHP 5.6 gets released.

9. August 2013


In: horde, OpenSUSE, Tech

Kommentare deaktiviert für Horde starts Crowdfunding for IMP Multi-Account feature: Funded after a week

Michael Slusarz of Horde LLC started a crowdfunding experiment: He offered a 3000 $ project at to back up development of the IMP multi-account feature. Multi-Account support allows users to manage multiple mail boxes within one horde account. The feature is meant to replace Horde 3’s fetchmail feature which has not been ported for Horde 4 and 5 because technically, it’s not desirable anymore.

Michael Slusarz: The old fetchmail functionality is not coming back. It simply doesn’t work coherently/properly in a PHP environment with limited process times (and is non-threaded).
The replacement MUST be the ability to access multiple accounts within a single session. But this is not a trivial change

After Slusarz started the fundraising campaign, long-time supporters and users of horde contributed funds.

Currently, after three days, more that 80% of funding have been raised. About 500 US $ are still missing. The change is not trivial and probably going into IMP 6.2 for Horde 5.

As mentioned previously, this is a multi-week project, at least from a project planning perspective. And that doesn’t include the bug-fixing that is likely to be significant, given the fact that this is 1) an invasive UI change and 2) is involving connections to remote servers.

That being said – this is something I personally would *really* like to see in IMP also, so I am willing to provide a discount and prioritize this over some other activities I am currently involved in.
* This won’t be available for IMP 6.1. This will go into 6.2, at the earliest.

The Horde IMP Webmailer is among the most popular webmail applications in the world. It is shipped with most widespread linux distributions like openSUSE and Debian and has been used to drive webmail and groupware applications for large-scale userbases all over the world.

Currently, Horde 5 / IMP 6 is integrated into the cpanel administration product.

Update: After roughly a week, by 2013-08-14 the crowdfunding tilted: 3090 USD had been contributed.
I proudly get to make the announcement that the IMP Multiple Accounts
feature has been fully funded, as we reached the funding goal on
Crowdtilt this afternoon:

I wanted to take the opportunity to thank all of the contributors:

– Simon Wilson
– Luis Felipe Marzagao
– Ralf Lang
– srl
– Elbia Hosting
– Thomas Jarosch
– Andrew Dorman
– Henning Retzgen
– Michael Cramer
– Harvey Braun
– SAPO/Portugal Telecom
– Matthias Bitterlich
– Allan Girvan
– Bill Abrams
– Markus Wolff
– CAIXALMASSORA (Jose Guzman Feliu Vivas)
– Wolf Maschinenbau AG (Samuel Wolf)

It feels good to put a definite milestone into the enhancement ticket:

Should be able to start on this soon… hopefully tomorrow. Still
undecided on which branch I’m going to do development in but I will
post information to the dev@ list once I decide. Those that
contributed may get status updates.

Once again, thanks to everyone for supporting the Horde Project. Not
only was this an interesting experience from my standpoint (hopefully
others as well), but now we will soon get a feature that is obviously
desired by a large portion of the user base.


30. Juli 2013


In: horde, Tech


The passwd app is a password management/changing utility for Horde which normally lives in a menu „my account“ in the toolbar.

While it has been released and is in production use at many sites, it is also under development to expand and improve the module.

Passwd provides fairly complete support for changing passwords via Poppassd, LDAP, Unix expect scripts, SMB/CIFS (under unix), Kolab, ADSI, Pine, Serv-U FTP, VMailMgr, vpopmail, SQL passwords and other more complicated setups.For a certain horde 5 installation, I needed to move the passwd app under the gearwheel/settings menu and out of the toolbar. After setting up passwd to work correctly, I added only one line to the registry.local.php file:

applications['passwd']['menu_parent'] = 'settings';

Everything you put into the menu labelled „settings“ automatically appears in the gearwheel menu.

30. Juli 2013


In: Allgemein, Energie, Jena, Non-Tech and German

Kommentare deaktiviert für Link: Lokal-TV-Beitrag zu BürgerEnergie

Der Lokalsender JenaTV berichtet über die aktuellen Pläne der BürgerEnergie Jena eG.
Im Gespräch: Reinhard Guthke (Vorsitzender der BürgerEnergie Thüringen e.V.), Thomas Winkelmann (Vorstand der BürgerEnergie Saale-Holzland eG) und Ralf Lang (Vorstand der BürgerEnergie Jena eG).

Unter anderem will die Genossenschaft das Thema JenaWohnen stärker in den Vordergrund rücken und in einer öffentlichen Veranstaltung am 12.09.2013 den neuen Ökostrom der Stadtwerke Energie Jena-Pößneck genauer unter die Lupe nehmen. Die Partner im Holzland übernehmen einige Projekte, die ursprünglich von der BürgerEnergie Jena vorbereitet wurden.

Online nachzuschauen ist der Beitrag hier:

JenaTV: Zwischenbilanz: Die Genossenschaft BürgerEnergie Jena hat mehr als 700 Mitglieder

15. April 2013


In: Allgemein, Jena, Non-Tech and German

Kommentare deaktiviert für BürgerEnergie Jena und Saale-Holzland nun eng verbunden: Erste Energieprojekte

Veranstaltungsbericht von Reinhard Guthke zum 8. BürgerEnergieTreff in Jena am 11.04.2013

Herr Thomas Winkelmann, Vorstand der im Februar neu gegründeten BürgerEnergie Saale-Holzland, war zu Gast. Er und die Mitglieder der Jenaer BürgerEnergie-Genossenschaft Josefine Diekhof und Christian Weber stellten neue Projekte zu geplanten Photovoltaik-Anlagen vor, sowohl in Jena-Lobeda-West als auch im Landkreis. Mit bereits genauen Zahlen auf der Einnahmen- und Ausgabenseite wurde für beide Projekte die erwartete Wirtschaftlichkeit bei Zinserlösen von über 3% für Darlehen von Bürgern demonstriert. Darlehen von weniger als 100.000 Euro genügen, um die Projekte in der Regie der BürgerEnergie Saale-Holzland in kommenden Sommer oder Herbst zu realisieren. Frau Diekhof, studierte Betriebswirtin und jetzige Doktorandin im Bereich Innovationsökonomik an der Jenaer Uni, vertritt die Jenaer Energiegenossenschaft im Aufsichtsrat der Energiegenossenschaft des Landkreises. Ferner haben jetzt sowohl Ralf Lang, der Vorstand der Jenaer Genossenschaft, als auch die Jenaer Genossenschaft selbst, Anträge auf Mitgliedschaft in der BürgerEnergie Saale-Holzland gestellt. Damit sind beide Energiegenossenschaften strukturell eng verbunden. Das ist eine ausgezeichnete Voraussetzung für eine gute, arbeitsteilige Zusammenarbeit beider Genossenschaften. Die BürgerEnergie Jena mit derzeit über 700 Mitgliedern setzt weiterhin ihren Schwerpunkt auf die Bürgerbeteiligung an den Stadtwerken, wofür nun dank der Kooperation auch im Landkreis um neue Mitglieder geworben wird.

Die Vortragsfolien von dieser Veranstaltung können Sie hier einsehen: