Claude, 28. Juni 2016, 13:09 Uhr
Warning: Use of undefined constant ri_rand_compare - assumed 'ri_rand_compare' (this will throw an Error in a future version of PHP) in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/random-image-widget/random_image.php on line 129 Warning: Use of undefined constant ri_rand_compare - assumed 'ri_rand_compare' (this will throw an Error in a future version of PHP) in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/random-image-widget/random_image.php on line 130 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384 Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700 Warning: Invalid argument supplied for foreach() in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707 Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700 Warning: Invalid argument supplied for foreach() in /home/httpd/vhosts/scratchbook.ch/httpdocs/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707
Die meisten Programmiersprachen sind total mit Funktionalität überladen. Zu viele Features, die man kennen muss, mehrere arkane Wege, ein Problem zu lösen, was andere Entwickler verwirrt, die genau diese Eigenheit der Sprache nicht kennen. Ändert sich eine Anforderung, muss man im schlimmsten Fall die ganze hierarchische Klassenstruktur wegwerfen und von vorne anfangen. Enterprise-Softwarepäpste haben immer-wiederkehrende Muster in dieser Komplexität erkannt und ihnen Namen gegeben: Patterns. Entwurfsmuster. So denkt jeder gleich über ein Problem nach, alle haben ein Fachsprech, das Uneingeweihte nicht verstehen.
Bis auf Prahlerei, die die Bachelorstudis ablassen, wenn sie diese Patterns runterbeten können, hat das wenig dazu beigetragen, dass ein Programm simpel und verständlich ist.
Den ganzen OOP-Ranz habe ich schon mal bemängelt. Und jetzt kommt ein Googler, der das genau so sieht:
It has become clear that OO zealots are afraid of data. They prefer statements or constructors to initialized tables. They won’t write table-driven tests. Why is this? What mindset makes a multilevel type hierarchy with layered abstractions better than searching a three-line table? I once heard someone say he felt his job was to remove all while loops from everyone’s code, replacing them with object stuff. Wat?
Da habt ihr’s. AbstractSingletonProxyMementoFactoryBean am Arsch.
Und jetzt Go
Mit Go habe ich schon immer liebgeäugelt, hatte aber keinen konkreten Anwendungsfall und es dann sein lassen. Bis jetzt. Die Vorträge von Rob Pike, dem mit-Erfinder von Go, sind da nicht ganz unschuldig. Wenn der Querulant im Hawaiihemd mit seinem frischen Geist, seiner Erfahrung und seiner Klarheit über Java-Programmierer rantet und dafür simple Zeilen in Go präsentiert -- es macht einfach Spass, ihm zuzuhören.
Ok Go. Du bist die konstruktive Antwort auf den unwartbaren Enterprise-Java-Grümpel? Sehr gut, ich bin dabei! Das will ich lernen.
Go in 24h
Ein Googler, der Go noch nicht kannte, hat innert 24h ein interaktives Doodle programmiert.
From zero to Go: launching on the Google homepage in 24 hours
Ein Truthahn soll anhand von Ziffern der URL aus verschiedenen Bildern zusammengesetzt werden. Auf der Google Startseite. Millionen von Kombinationsmöglichkeiten, Millionen von Benutzern. Ein Vorberechnen wäre zu aufwändig. Go macht das in Echtzeit. Nimmt mich wunder. Wie schnell ist das wirklich? Der Code ist Open Source, ich versuche es bei mir zu installieren. Mist, es läuft nur auf Google’s Appengine. Und ein paar Bibliotheksaufrufe sind jetzt anders.
Ein zwei Stunden später habe ich den Code lauffähig gebracht. Was, so einfach war das?
Und oh: 300 Anfragen pro Sekunde. Auf meinem Budget-Occasion Notebook. Alle vier Kerne werden ausgelastet. So muss das sein!
Und auf dem Raspberry Pi:
GOARCH=arm GOARM=7 go build turkey.go
So einfach ist cross-compiling. 30 Anfragen pro Sekunde. Der Raspi könnte in Echtzeit Bilder zusammensetzen und Filme mit 30 FPS darstellen!
Ich bin beeindruckt.
Warum Go?
Es ist statisch kompiliert. Am Schluss fällt eine ausführbare Datei heraus, mit allen Abhängigkeiten drin. Ich brauche keinen Webserver. Keine Python-Umgebung. Keine zusätzlichen Pakete. Ich kopiere genau eine Datei auf meine Zielplattform und führe sie aus. Sie startet ohne Verzögerung und läuft blitzschnell.
Go ist einfach zu lernen. Zugegeben: Am Anfang weiss man nicht so recht, wo und wie anfangen. Die tour.golang.org ist vollständig, aber für Neueinsteiger zu umfangreich. Ich empfehle den exzellenten Onlinekurs: Learn How To Code: Google’s Go (golang) Programming Language. Der Typ hält sein Versprechen, dass man nach dem Kurs Go gut kennt. Er lässt nichts aus, startet von Null und nimmt immer wieder Bezug auf die Dokumentationen von Go. Man verpasst nichts.
Go ist simpel. Die vollständige Spezifikation passt ausgedruckt auf 71 A4-Seiten. Statt Arrays, Listen, Vektoren und Stacks gibt es Arrays mit einer fixen Grösse und Slices für dynamische Datenreihen. Statt einer for-, while und do-Schleife gibt es nur noch eine for-Schleife, die die anderen Fälle abdeckt. Das erhöht die Lesbarkeit drastisch, wenn man sich nicht mehr an verschiedene Programmierstile gewöhnen muss. Ich kann Go-Code überfliegen und verstehe ihn auf Anhieb (!!) (das ist mir noch nie passiert, wenn ich einer neuen Sprache begegne!).
Go hat einen Codeformatter integriert. gofmt -- Diskussionen und der ewige Streit zwischen „Leerzeichen oder Tabs“ oder ob die geschweifte Klammer auf die nächste Zeile soll sind Vergangenheit. Zitat Rob Pike: „Niemand mag den Codestyle von Go, aber alle lieben den Codeformatter.“
Nebenläufigkeit fest in der Sprache mit drin. Ich tippe ‚g‘ ‚o‘ ‚Leertaste‘, und meine Funktion läuft nebenläufig. Für die Kommunikation unter nebenläufigen Prozessen gibt es Konstrukte und Hilfsmittel wie Channels.
func() {
//läuft synchron
}()
go func() {
//läuft nebenläufig im Hintergrund
}() |
func() {
//läuft synchron
}() go func() {
//läuft nebenläufig im Hintergrund
}()
Btw, erinnert das an JavaScript? Gell! Vertrautheit für Programmierer aus anderen Sprachen war ein wichtiges Kriterium.
Anders als bei JavaScript hat man hier die Kontrolle darüber, was asynchron läuft und was nicht. Bei JavaScript liegt alles immer asynchron auf Glatteis und man ist dort gezwungen, sein Ausrutschen mit Callbacks zu verhindern.
Defer. Kleines, aber feines Konstrukt. „Führe diese Funktion aus, sobald die (umgebende) Funktion beendet ist.“ So hat jemand ein Datenrennen mit einem Zweizeiler behoben.
m.lock.Lock()
defer m.lock.Unlock()
//[heikler Datenzugriff] |
m.lock.Lock()
defer m.lock.Unlock() //[heikler Datenzugriff]
Sperre den Zugriff (Lock), und nach dem Beenden gib ihn wieder frei (Unlock). Funktioniert auch, wenn die Funktion Panik kriegt und unvorhergesehen abbricht.
Interfaces. Definieren die Funktionen und Schnittstellen, die ein Datentyp erfüllen muss. Beispiel: Ein Text ist lesbar wenn ich die Funktion lesen() darauf ausführen kann. Der Text erfüllt das lesbar-Interface (in Go leider nicht Readable, sondern Reader genannt. Etwas schad und verwirrend.)
Ob jetzt ein Netzwerkstrom vom lesbaren Datentyp liest, oder ein Terminal, oder ein Kompressionsalgorithmus, das braucht das Datum nicht zu kümmern. Solange es die Schnittstelle lesen() bereitstellt, ist es lesbar, erfüllt dieses Interface und kann somit wie ein Legosteinchen mit anderen Funktionen zusammengesteckt werden.
type Circle struct {
radius float64
}
type Square struct {
side float64
}
type Shape interface {
area() float64
}
func (c Circle) area() float64 {
return math.Pi * c.radius * c.radius
}
func (s Square) area() float64 {
return s.side * s.side
}
func measure(s Shape) {
fmt.Println(s)
fmt.Println(s.area())
}
func main() {
circ := Circle{5}
sqr := Square{10}
measure(circ)
measure(sqr)
} |
type Circle struct {
radius float64
} type Square struct {
side float64
} type Shape interface {
area() float64
} func (c Circle) area() float64 {
return math.Pi * c.radius * c.radius
} func (s Square) area() float64 {
return s.side * s.side
} func measure(s Shape) {
fmt.Println(s)
fmt.Println(s.area())
} func main() {
circ := Circle{5}
sqr := Square{10}
measure(circ)
measure(sqr)
}
Die Fläche für einen Kreis misst sich anders als für ein Quadrat. Das braucht die Funktion measure() aber nicht zu interessieren; die Flächenfunktion area() auf dem jeweiligen Datentyp kümmert sich darum.
Software konstruieren fühlt sich so an wie ein Legospiel. Ich erweitere nach und nach Strukturen und Funktionen, statt einer Klassenhierarchie habe ich eine Kompositionsanarchie.
Eine Systemprogrammiersprache
Mit Go fühle ich mich zum ersten mal wie ein richtiger Programmierer. So einer, der wirklich etwas kompiliert, und es fällt eine echte, maschinenausführbare Datei heraus. Wie wenn ich 1970 in einem Mainframeraum an einem verteilten Cluster mit weissen Haaren und einem langen Bart auf einer vergilbten IBM-Klicktastatur Unix-Routinen programmiere, während im Hintergrund dicke Handbücher über Programmiersprachen und Betriebssysteme im Regal stauben. Es tönt geil, und Go gibt mir etwas von diesem Gefühl. Ganz anders als die interpretierten Sprachen, die ich bisher genutzt habe, die nur so tun als ob. Bei Go rechnet der Computer direkt, ich kann die Leiterbahnen förmlich spüren, stelle mir vor, wie der Assemblercode blitzschnell und nah an der Hardware Sachen steuert und Ereignisse auslöst, wie eine Kugel, die durch eine Pinballmaschine flitzt. Das ist der Charme, das ist die Faszination!
Benchmarks und Vergleiche
Zu guter Letzt noch ein bisschen Schwanzvergleich mit anderen Sprachen.
Das bringt uns zu:
Rust
Ich war lange unschlüssig. Rust oder Go? Go oder Rust?
Nach dem Go-Kurs sah ich zwei Vorträge zu Rust am Cosin.
Rust wird von der Mozilla-Foundation gestützt und von der Community weiterentwickelt. Schon mal zwei Warnlampen, die bei mir angehen. Erstens: Die Mozilla-Foundation hat schon mal Projekte gekillt (siehe Thunderbird). Firefox ist bloat. Thunderbird ist bloat. Zweitens: Von der Community weiterentwickelt. Der Sprache werden mehr und mehr Features hinzugefügt. „Ah ja, Rust kann jetzt das und jenes seit Version XY.“ Super. Da noch Klassen, da noch Vererbung. Sind wir wieder genau gleich weit.
Was mich aber am meisten stört, ist, wie alle auf dieses Rust abgeifern. Als ob Go nicht existieren würde. „Rust kann das, Rust kann säb, Rust ist so toll!!1!“. Die Philosophie von Go war von Anfang an: Simpel, wartbar, lesbar. So wenig Features wie möglich. Welche Programmiersprache kann das von sich behaupten? Feature für Feature gleichen sich alle immer mehr an. Rust wird immer mehr können, immer unüberschaubarer. Jetzt schon bemängeln einige Stimmen im Netz dessen Lesbarkeit:
You know, to be honest impl<‚a> Foo for &’a [u8] is nuff said already. Each time I look at such a crazy piece of “code”, all I want is to find great man Rob Pike and shake his manly hand! Honestly, thanks for not putting this sort of unmaintainable rubbish into the language. We may love or hate Go, but everyone must be grateful to Go team for not making the language this bad. Just to clarify things out, by this bad I mean that Rust bad. If I’m not mistaken, Rust was supposed to become something like a modern alternative to C++. I’m not sure if it’s true though, but apart from everything else, Rust has definitely inherited the worst feature of C++ language—crazy unreadable stuff lying all around.
Tja.
Ich habe dann selber noch Tests gemacht. Der Go compiler kompiliert sich selber in zwei Minuten. Rust kompiliert fröhlich zwei Stunden lang.
Möchte ich 1’000’000 nebenläufige Prozesse starten, klappt das mit Go problemlos, während Rust schon bei 100’000 Panik kriegt. Oh, Rust erstellt echte Threads? Keine leichtgewichtigen Coroutines wie in Go? Und die Multiprozessorwerkzeuge muss man sich selber in fremden Libraries suchen, in der Hoffnung, dass es (Zitat Mozilla) „irgend jemand Begabtes gibt, der was Tolles auf die Beine stellt“? Fail.
Rust ist Rost.
Go gewinnt.
https://golang.org/
***
Rob Pike: Simplicity is Complicated