14.03.2013

Aktuelles Flash für Windows herunterladen

Das gestern veröffentliche Mini-Skript zum Download und Installation von Flash kann man noch etwas mehr verfeinern. Die gestrige Fassung hatte ich auf Kürze getrimmt zum Weitergeben an Kollegen. Die hier vorgestellte Version verwende ich in meiner privaten Umgebung mit doch einigen PCs, so dass sich der Aufwand lohnen kann.

Genauso wie bei Java gibt es in letzter Zeit eine wahre Inflation an Flash-Updates aufgrund von Sicherheitslücken.
Wer davon genervt ist, auf der Adobe-Downloadseite immer wieder das Häkchen bei irgendwelchen Zusatzprodukten wie McAfee zu entfernen, kann sich den "nackten" Flash-Installer auch viel bequemer mit einem kleinen Skript herunterladen.

Dazu wird das Kommandozeilenprogramm "wget" benötigt. Das ist bei Linux normalerweise gleich mit dabei, für Windows kann man es von Sourceforge.net kostenlos herunterladen. Danach informiert man sich auf einer üblicherweise gut informierten Newsseite wie dem heise Newsticker über die Versionsnummer des Tages und trägt diese Nummer in das Skript in der Zeile "set V=..." ein. (Wer einen Proxy-Server verwendet, sollte das "REM" in der Zeile vorher entfernen und seine eigene Proxy-Adresse eintragen. Wer selbst einen Proxy betreibt, versteht aber auch den Sinn der "REM"-Zeile von allein ;) )

Nach dem Aufruf des Skripts hat man zwei ausführbare Dateien, die man beide installieren muss (ich gehe davon aus, dass niemand freiwillig mit dem Internet Explorer surft, aber sicher ist sicher). Die .exe-Datei mit "np" im Namen ist das sogenannte "Netscape Plugin", die andere .exe-Datei mit "ax" steht für "ActiveX"-basiertes Plugin.
@echo off
rem set http_proxy=http://192.168.100.100:3128/
set V=11.6.602.171
set H=fpdownload.macromedia.com
set P=/get/flashplayer/current/licensing/win
set AX=install_flash_player_11_active_x.exe
set NP=install_flash_player_11_plugin.exe
wget http://%H%%P%/%AX% -O flash-%V%_ax.exe
wget http://%H%%P%/%NP% -O flash-%V%_np.exe
Besonders cool ist dann, wenn man auch die Installation vollautomatisiert durchführen lässt. Dazu ruft man jede der .exe-Dateien mit dem Befehl "-install" hintendran auf. Der jeweilige Browser sollte währenddessen nicht laufen.

Hier ist als Bonbon auch noch ein Skript, das den betreffenden Browser stoppt (taskkill.exe ist seit Windows XP an Bord) und die Installation mit dem neuesten gefundenen Flashplayer-Installer durchführt. Der Befehl "DIR /ON" sortiert die Ausgabe des DIR-Befehls nach dem Namen, so dass die Datei mit der alphabetisch höchsten Nummerierung zuletzt aufgeführt ist. Diese wird dann installiert.

@echo off

taskkill /IM iexplore.exe
set D=%~dp0
for /F %%i in ('dir /B /ON %D%flash-*_ax.exe') do set INST=%%i
%D%\%INST% -install
ping -n 5 -w 1000 localhost > nul

taskkill /IM firefox.exe
for /F %%i in ('dir /B /ON %D%flash-*_np.exe') do set INST=%%i
%D%\%INST% -install

ping -n 15 -w 1000 localhost > nul

Danach sollte man unbedingt die Versionsnummer des installierten Flash-Players im Browser prüfen, z.B. indem man auf diese Seite geht und unter dem Punkt "2." abfragt, was installiert ist, und ggfs. unter "3." prüft, ob Adobe diese Seite schon aktualisiert hat. Leider zeigt nämlich der Punkt "3." häufig noch eine ältere Version an.
Alternativ kann man das kleine Flash-Progrämmchen von dort auch einmalig runterladen und sich zuhause abspeichern zum regelmäßígen Prüfen.

13.03.2013

Skript für Flash-Download und -Update

Hier ist ein kleines Windows-Skript zum Downloaden und vollautomatischen Installieren des Flash-Plugins.
Nach den letzten Notfall-Updates hier endlich mal wieder ein reguläres Update.
Ich gehe zwar davon aus, dass niemand freiwillig den Internet Explorer verwendet (ActiveX-Plugin), aber vorsichtshalber sollte man das auch immer gleich mit bearbeiten und beide Versionen des Plugins installieren ;)

Das Skript lädt beide Plugins herunter, speichert sie unter Einbeziehung der Versionsnummer ab und installiert auch gleich.

@echo off
rem set http_proxy=http://192.168.100.100:3128/
 
set V=11.6.602.180
set H=fpdownload.macromedia.com
set P=/get/flashplayer/current/licensing/win
set AX=install_flash_player_11_active_x.exe
 
set NP=install_flash_player_11_plugin.exe 
wget http://%H%%P%/%AX% -O flash-%V%_ax.exe
.\flash-%V%_ax -install
wget http://%H%%P%/%NP% -O flash-%V%_np.exe
.\flash-%V%_np -install
Wer zuhause einen WWW-Proxy verwendet (Squid o.ä.), ist bestimmt in der Lage, zu erkennen, was er an dem Skript verändern muss.
Alle anderen Benutzer können das so übernehmen, wie es oben steht.
Einfach markieren, in die Zwischenablage kopieren, als Textdatei abspeichern und ausführen.

01.03.2013

perl erzeugt einen Graphen aus Messdaten

Mal ein schönes Beispiel dafür, wie man mit wenig Aufwand und den richtigen perl-Modulen eine hübsche Grafik zaubern kann ...

Als Beispiel dient hier meine Logdatei mit den "load average"-Werten. Die Daten lasse ich minütlich mit einem cron-Job speichern, und wenn ich mit einem Browser das CGI-Skript aufrufe, bekomme ich als Ergebnis ein hübsches PNG oder JPG.


Zur Erinnerung: die "load average" gibt an, wieviele Prozesse durchschnittlich während der Probezeit auf die Zuteilung von CPU-Zeit warten mussten. Werte für den Zeitraum "1 min", "5 min" und "15 min" werden erfasst. Diese Angaben erhält man auf der Kommandozeile am bequemsten mit dem Befehl "uptime" (so gut wie alle Unixe, AIX, Solaris, BSD etc.) oder mit dem /proc-Pseudo-Filesystem (nur Linux).

So funktioniert der Aufruf des CGI-Skripts im Browser:


Der Parameter "what" gibt an, welche "load average" gemeint ist (1, 5, 15), "xmax" und "ymax" überschreiben die Defaultwerte im Skript mit anderen Größenangaben. Weiterhin sind noch "hours" (anderer Zeitraum als 24h) und "single" möglich. Im Normalfall werden in einen Graphen alle drei Kurven gemalt; wenn "what" und "single" verwendet werden, ist in der Grafik nur diese eine Kurve enthalten.

http://meinserver.domain/cgi-bin/loadavg.pl?what=1&xmax=550&ymax=150

Hier ist der cron-Job:

# load avg
* * * * * /usr/local/bin/loadavg.pl -d 7 >/dev/null 2>&1

... und das Skript, das aufgerufen wird:

Das Skript speichert in der Datendatei maximal soviele Tage, wie im Parameter -d angegeben sind (default 1 Tag). Auf diese Weise hat das Skript seinen eigenen logrotate.
#!/usr/bin/perl -w
use Getopt::Std;
use strict 'vars';
use strict 'refs';
use vars qw( $opt_d );
$opt_d=1;
getopts("d:");
my $loadavg="/proc/loadavg";
my $outfile="/var/spool/loadavg";
sub out {
  my ($what,$val)=@_;
  my @val=();
  if (open(IN,"<","$outfile.$what")) {
    @val=<IN>;
    close(IN);
  }
  splice(@val,0,-1440*$opt_d);
  push(@val,$val);
  if (open(OUT,">","$outfile.$what")) {
    print OUT @val,"\n";
    close(OUT);
  }
}
if (open(F,"<",$loadavg)) {
  my ($l1,$l5,$l15)=(split(/\s+/,<F>))[0..2];
  out("1",$l1);
  out("5",$l5);
  out("15",$l15);
  close(F);
}

 ... und das hier ist das CGI-Skript, das die Grafik erzeugt: 

(Meine Erklärungen zu einzelnen Funktionen sind in blauer Schrift dazwischen)

Die Grafik wird eigentlich nur mit einem einzigen Befehl erzeugt, nämlich dem
print $graph->plot(\@data)->$format();
ganz am Ende. Der ganze Krams vorher dient dazu, eine schöne Beschriftung herzustellen und eine Skalierung zu berechnen, damit das hübsch aussieht. Und natürlich der CGI-Kram, um den Parameter aus der "Kommandozeile" auszuwerten.

#!/usr/bin/perl -w

use strict 'vars';
use strict 'refs';

use GD::Graph;
use GD::Graph::lines;
use GD::Graph::linespoints;
use GD::Graph::points;
use GD::Graph::bars;
use CGI qw(:standard);

my @data;
my $graph;
my $format;
my $maxscale;
# zeitabstand in sek.
my $index=60;
my ($xmax,$ymax)=(600,400); # die gewünschte Größe der Grafikdatei
my $hours=1;
my $dir="/var/spool";
my $file1 ="$dir/loadavg.1";
my $file5 ="$dir/loadavg.5";
my $file15="$dir/loadavg.15";
my $query;
# default 5 min.
my $req=5;
my $file;
my $single=0;

# X-Beschriftung
# werte1
# werte2
# ...
@data = (
[""],
[],
[],
[],
);
# loadread lädt aus der Datendatei $file die neuesten $min Einträge
sub loadread {
  my ($file,$min)=@_;
  my @val=();

  if (open(IN,"<","$file")) {
    @val=<IN>;
    chomp(@val);
    close(IN);
    if (scalar(@val)>$min) {
      splice(@val,0,-$min);
    }
  }
  return \@val;
}
# arraymax sucht aus einer Liste von Arrayrefs das maximale Element
sub arraymax {
  my $m=0;

  foreach my $a (@_) {
    foreach my $i (@{$a}) {
      $m=$i if ($i>$m);
    }
  }
  return $m;
}
# xtext erzeugt die Beschriftung der X-Achse
sub xtext {
  my ($ref,$start,$diff,$gap)=@_;
  my $cnt=scalar(@$ref);
  my $s=$diff/$gap;
  my $i;
  my $time;
  my @t;

  $start-=($cnt*$diff);
  for ($i=0; $i<$cnt; ++$i) {
    @t=(localtime($start+$i*$diff))[1..2];
    $time=sprintf("%02d:%02d",$t[1],$t[0]);
    if ($i % $s) {
      $data[0]->[$i]="";
    }
    else {
      $data[0]->[$i]=$time;
    }
  }
}

$query=new CGI();
$req=$query->param( 'what' ) || 1;
$xmax=$query->param( 'xmax' ) || 800;
$ymax=$query->param( 'ymax' ) || 600;
$hours=$query->param( 'hours' ) || 24;
$single=$query->param( 'single' ) || 0;
$single=0;

$graph = GD::Graph::lines->new($xmax, $ymax);
$format = $graph->export_format;

# calc minutes
$data[1]=loadread($file1, $hours*60);
$data[2]=loadread($file5, $hours*60);
$data[3]=loadread($file15,$hours*60);
$file=$file1;

$maxscale=arraymax($data[1],$data[2],$data[3]);
$maxscale=int($maxscale*100)/100;
xtext($data[1],(stat($file))[9],$index,$req);

unless ($single) {
  $data[1]=$data[2] if ($req==5);
  $data[1]=$data[3] if ($req==15);
  delete $data[2];
  delete $data[3];
}

$graph->set(
  x_label => 'Time',
  y_label => 'Load',
  title => 'Load avg '.$req,
  y_max_value => $maxscale,
  y_tick_number => 10,
  y_label_skip => 2,
  x_label_skip => 2*$index,
) or die $graph->error;
$graph->set(
  marker_size => 1,
) or die $graph->error;

print header("image/$format");
binmode STDOUT;
print $graph->plot(\@data)->$format();

Mein Brief an "unseren" Bundestagsabgeordneten

Das Thema Leistungsschutzrecht (#LSR) ist leider ein sehr trockenes Rechtsgebiet, das von interessierten Gruppen sehr unterschiedlich, sehr subjektiv, sehr einseitig, und teilweise sachlich falsch in der Öffentlichkeit behandelt wird.

Dazu schrieb ich vor einiger Zeit einen Brief an den Bundestagsabgeordneten Peter Tauber (peter.tauber@bundestag.de), der nach dem Weggang von Lucia Puttrich die Wetterau kommissarisch mit vertritt (der Abgang von Fr. Puttrich in Richtung hessisches Ministeramt weniger als ein Jahr nach ihrer Wahl in den Bundestag ist ein anderes Thema, zu dem ich auch noch mal schreiben könnte ...).

Leider habe ich bis jetzt noch keine Antwort auf meinen Brief erhalten, nicht mal eine Eingangsbestätigung. So muss Politik!

ich wende mich als Wetterauer mit einer Bitte an Sie als
kommissarischen Vertreter von Lucia Puttrich, wenn ich das richtig
verstanden habe. 
Ich lese in Ihrem Blog, dass Sie dem Leistungsschutzrecht kritisch
gegenüber stehen. Das finde ich als sporadischer Blogger soweit gut
Bitte bewahren Sie Ihre kritische Haltung. Insbesondere halte ich im
Moment die schreckliche Einseitigkeit, mit der die Presse (FAZ, SZ,
Welt, Zeit, ...) arbeitet, für einer Demokratie mit einer "der
Wahrheit verpflichteten" Presse, wie es der BDZV so schön formuliert
hat, nicht angemessen. 
Nicht mal einen Leserbrief wollen manche Zeitungen zum Thema
abdrucken, wenn der in ihren Augen kritisch ist (siehe hier und hier).
Nebenbei würde ich gern wissen, wie Sie auf die beruhigende Formel
"Blogger sind vom LSR ausgenommen" gekommen sind. Ich lese das aus dem
Entwurf nicht heraus. Ein "manueller Aggregator" wie die Rubrik "6 vor
9" des Bild-Blogs kommt da dem Kreis der Betroffenen des LSR schon
ziemlich nah, würde ich denken. 
Schöne Grüße aus dem leicht verschneiten Berstadt... 
Thomas Seeling

Update 01.03.2013:
Peter Tauber hat mit "NEIN" gestimmt. Finde ich gut ;), vielen Dank.

22.02.2013

perl gegen einen Facebook-Hoax

Auf Facebook und sicherlich auch an anderen Stellen kursiert derzeit ein Gerücht, dass angeblich eine bestimmte Konstellation von Wochentagen nur alle 823 Jahre vorkommt und man deshalb irgendetwas Abergläubisches tun müsste.

Genauer gesagt: es geht darum, dass angeblich das Auftreten von fünf kompletten Wochenenden (also Freitag, Samstag, Sonntag) in einem Kalendermonat extrem selten sein soll.

Klingt erstmal plausibel: die Woche hat sieben Tage, der Monat zwischen 28 und 31, wie häufig kann es also sein, dass fünf vollständige Wochenenden in so wenig Zeit passen? Gefühlt also extrem selten, und deshalb sind die meisten Leute gern gutgläubig und nehmen diese Behauptung für bare Münze, ohne selbst darüber nochmal nachzudenken.

Nehmen wir die Behauptung mal auseinander: damit in einen Monat wirklich fünf Wochenenden passen, muss der letzte Sonntag offensichtlich der 31. sein. In kürzeren Monaten mit 30, 29 oder 28 Tagen ist das nicht möglich.

Wenn also Sonntag der 31. ist, ist automatisch der 3. ein Sonntag (minus 28) und der 1. muss ein Freitag sein.

Was macht ein Informatiker nun? Er hackt sich ein kleines Programm zusammen, um mit brutaler Gewalt (wenn man aus der Fachsprache das "brute force" übersetzt) alle Möglichkeiten durchzuprobieren. Es reicht also, alle Monate mit 31 Tagen zu untersuchen, ob der 1. ein Freitag ist. Falls ja, haben wir einen solchen Treffer gefunden.

Hier ist ein solches Programm in der Skriptsprache perl, mal eben auf die Schnelle zusammen"gekloppt", um zu gegebenem Intervall (Anfangs- und Endejahr) alle Monate zu finden, auf die diese Bedingung zutrifft.

#!/usr/bin/perl -w
use POSIX;
my ($y,$m,$d);
# liste der monate mit 31 tagen
my @monate=(1,3,5,7,8,10,12);
# finde monate mit 5 vollen wochenenden
# das sind alle monate mit freitag als 1. und 31 tage
my ($anfang,$ende)=@ARGV;
$anfang=2000 unless ($anfang);
$ende=2019 unless ($ende);
# schleife fuer jahre
for ($y=$anfang; $y<$ende; ++$y) {
# schleife fuer monate
foreach $m (@monate) {
# unix timestamp fuer den 1. des monats $m im jahr $y mit der POSIX funktion mktime
# jahr 1900 ist 0, 2013 ist 113 fuer POSIX
# monate ab 0 gezaehlt (0=januar)
# tage ab 1 gezaehlt
my $time_t=POSIX::mktime( 0, 0, 0, 1, $m-1, $y-1900 ) || 0;
# den wochentag bestimmen (0=sonntag)
my $wday=(localtime($time_t))[6];
if ($wday==5) {
printf "# %02d.%04d\n",$m,$y;
}
}
}
Und siehe da: das ist gar nicht mal so selten. Man findet zwar in der Liste auch Jahre, in denen kein solches Vorkommnis vorkommt ;) (Sie sehen, dass Sie nichts sehen ...), aber es gibt auch Jahre mit sogar zwei Monaten, in denen der 1. auf einen Freitag fällt.
$ perl test.pl 2000 2019
# 12.2000
# 03.2002
# 08.2003
# 10.2004
# 07.2005
# 12.2006
# 08.2008
# 05.2009
# 01.2010
# 10.2010
# 07.2011
# 03.2013
 Wenn ich mein Skript von 1900 bis 2099 suchen lasse, finde ich insgesamt 198 Treffer.
$ perl test.pl 1900 2099 |wc -l
198

18.02.2013

Mein Leserbrief zur Reform des Abmahngesetzes

Der Kommentator "fer" freut sich in der WZ vom 31.01. auf Seite 2, dass die Gesetzgebung zu den Abmahnungen, hauptsächlich im Bereich des Filesharings, eine Änderung einbringt, und dass dadurch die horrenden Abmahnungen "im Kinderzimmer" aufhören.
Ich teile den Optimismus von "fer" in seinem Kommentar bei weitem nicht. Der neue Gesetzestext ist handwerklich genauso schlecht und schwammig formuliert wie der bisherige. Die Ausnahmen sind nur anders schlecht geschrieben.
Es gibt nämlich schon ein Gesetz, das die Anwaltskosten für Filesharing-Abmahnungen auf 100 Euro begrenzt. Es gilt schon seit Jahren, aber nicht der Sinn des Gesetzes wird angewendet, sondern nur die Ausnahme, die dort formuliert ist. Die Vorschriften knüpfen nämlich nicht an die Frage an, ob ein Internetnutzer Privatperson ist. Vielmehr werden die Abmahnkosten nur auf 100 Euro gedeckelt, wenn der Betroffene nicht in “gewerblichem Ausmaß” gehandelt hat.
Diese Einschränkung griffen die Gerichte, warum auch immer, dankend auf. Sie definierten das gewerbliche Ausmaß kurzerhand so, dass die Deckelung praktisch in keinem Fall greift, und zwar sogar schon bei Tauschvorgängen von weniger als zehn Dateien, z.B. Liedern. Das ist auch das Fazit von Anwalt Christian Solmecke, der tausende Abmahnopfer in Filesharing-Fällen vertritt, gegenüber Spiegel online.
In der neuen Formulierung geht es nicht um das "gewerbliche Ausmaß", sondern die “besonderen Umstände des Einzelfalls” oder die “Anzahl und Schwere der Rechtsverletzungen”. Das ist genauso unbestimmt.
Immerhin gilt jetzt als Inflationsausgleich eine Grenze von 150 Euro für die Deckelung, auch wenn niemand die Absicht hat, so wenig zu verlangen.

08.02.2013

Java JDK/JRE silent install Änderung mit 7u13

Kleine Überraschung mit Sun JDK 7u13.

Silent install funktioniert plötzlich nicht mehr wie bisher.

Mein Skript fliegt auf die Nase, und stattdessen kommt der Hilfebildschirm von msiexec ;(


Kommandozeile bislang:
jdk-bla.exe /S /V"InstallDir=bla usw."

Lösung: /V" ... " weglassen und den ganzen Schwanz von Parametern direkt in die Kommandozeile schreiben. Also:

jdk-bla.exe /S
InstallDir=bla ... usw.

So steht's geschrieben bei http://goo.gl/PaMz4

01.02.2013

Leserbrief zum Leserbrief über "Augstein in den Top Ten der Antisemiten"

Mal wieder ein Leserbrief an die WZ (abgedruckt am 29.01., leider wurde der Verweis auf das Bildblog gekürzt, so dass im folgenden Satz "... an dieser Analyse ..." etwas leer dasteht) ... als Reaktion auf einen Leserbrief, in dem über die Verwendung des Begriffs "Antisemitismus" reflektiert wird. Der Schreiber kritisiert die inflationäre Verwendung des Begriffs, so dass dadurch eine Verharmlosung erreicht wird, statt dass es wirklich nur streng für Neo-Nazis und ihre Umtriebe gilt.
Hr. S. macht in seinem Leserbrief denselben Fehler wie die meisten anderen Journalisten in ihren Artikeln auch: er kennt offensichtlich die Quelle nicht, aus der alle anderen FALSCH zitieren.

Das Wiesenthal-Center hat nicht Augstein auf eine "Top Ten" der schlimmsten Antisemiten gesetzt, sondern seine Äußerungen, die er letztes Jahr getätigt hat. Das ist ein durchaus differenzierender Unterschied.

Es gibt vom Wiesenthal-Center keine "Liste der schlimmsten Antisemiten".
Diese Organisation veröffentlicht jedes Jahr eine Liste der schlimmsten antisemitischen Sprüche, die irgendjemand von sich gegeben hat. Von daher finde ich auch die Bemerkung von Harald Martenstein ziemlich schlimm, dass er als Deutscher zufrieden ist, wenn er sich in Gesellschaft von Augstein befindet, der wäre ja erwiesenermaßen harmlos und "nur" auf Platz 9 der Liste.

Nachzulesen in einer kurzen Analyse im bildblog.
Besonders entlarvend an dieser Analyse ist, dass die Presse, allen voran die Bild-Zeitung, zunächst intensiv gegen das Wiesenthal-Center gehetzt hat, und nun zurückrudert, indem sie die zweite Pressemitteilung der Organisation jetzt als "Richtigstellung" verkaufen statt zuzugeben, dass ihre eigene Berichterstattung an erster Stelle falsch war und erst diese "Korrektur" nötig gemacht hat.

Andererseits stimme ich der Aussage voll und ganz zu, dass der Begriff "Antisemitismus" durch solche sinnlosen journalistischen Eskalationen und verfälschenden Zitate schleichend entwertet wird. Es bleibt weiterhin nötig, sich gesellschaftlich eindeutig gegen Neo-Nazis zu positionieren und aufzustehen, wenn es nötig ist. Andererseits darf und muss es auch erlaubt sein, die israelische Politik zu kritisieren, ohne dass man gleich als Antisemit gezeiht wird.