Wieder mal ist der erste April rum und so einige sind auf die diversen Scherze reingefallen.
Ed hat in
ihrem Blog ein paar witzige Gadgets verlinkt die jedem Informatiker Spaß machen würden
Nicht zu vergessen sei auch die
Kühlung von CPUs durch "Gegenwärme" bei Heise. Bei manchem Beitrag wie
"Windows Server 2008: Server Core per Maus konfigurieren" musste man schon genauer hinsehen
Aber die Fachschaft Informatik bei uns an der Hochschule Darmstadt musste dieses Jahr auch was machen. Vor ein paar Monaten bin ich auf den
Aprilscherz der "Forschungsgemeinschaft elektronische Medien e.V." (FEM) der TU Ilmenau angestossen. Da wir sowieso in unserem Netzwerk einen transparenten Proxy per Squid fahren war das natürlich ideal.
Ab ca. 8 Uhr morgens wurden alle Bilder in Graustufen ausgeliefert. Offzielle Begründung aus dem Fachschaftsforum:
Durch einen immer weiteren Anstieg des Traffics, der durch die Fachschaft Informatik verursacht wurde, wurde die Fachschaft vom Rechenzentrum durch eine neue Maßnahme eingeschränkt.
Durch eine Reduzierung sämtlicher Bilddateien im Webtraffic auf Grausstufen wird somit eine Trafficeinsparung von ca. 53% gewährleistet. Diese Maßnahme ist ein Pilotprojekt und wird einige Tage in einem Testbetrieb durchgeführt.
Fragen und Anregungen können gerne die Fachschaft gestellt/geschickt werden.
Hier ein paar Bilder:
Allerdings war noch ein wenig Arbeit fällig. Immerhin arbeitet bei uns noch ein betagter Celeron mit 1 Ghz als Proxy. Der ist schon im Normalbetrieb recht gut unter Last.
Also wurden alle Bilder-Anfragen auf einen weiteren Server umgeleitet, der die Bilder dann runterlud und konvertierte.
Die Last wurde so gut verteilt:
Das Squid-Redirector-Skript:
use CGI;
use URI::Escape;
use Digest
::MD5 qw(md5_hex
); $|=1;
#print while (<>);
while(<>) {
$url = $request[0];
# Testen ob es ein Bild ist (mehr als die Endung haben wir hier nicht) und sicherstellen, dass wir nicht im Kreis laufen
# Das CSS-Skript funktioniert leider nicht so toll..
# if ($url =~ /(.*\.(css|bmp|jpg|png|gif|jpeg))/i && !($url =~ /users\.fbihome\.de\/~weibler/) ) {
if ($url =~ /(.*\.(bmp|jpg|png|gif|jpeg))/i && !($url =~ /users\.fbihome\.de\/~weibler/) ) {
$url = uri_escape($url);
my $ending = $2;
my $md5sum = md5_hex($url);
if( $ending eq 'css' ) {
print "http://users.fbihome.de/~weibler/aprilscherz_css/$md5sum.$ending?url=$url&ending=$ending&digest=$md5sum\n"; }
else {
print "http://users.fbihome.de/~weibler/aprilscherz/$md5sum.$ending?url=$url&ending=$ending&digest=$md5sum\n"; }
}
else {
}
}
Um die Last zu reduzieren wurden die Bilder nur einmal runtergeladen und danach normal vom Apache ausgeliefert. Das ganze wurde mit einer mod_rewrite Regel umgesetzt:
CODE:
ExpiresActive On
ExpiresDefault "access plus 6 hours"
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) /~weibler/aprilscherz.cgi?%{QUERY_STRING} [T=application/x-httpd-cgi,L,QSA]
aprilscherz.cgi war dann wieder ein Perl-Skript (man sieht eindeutig, dass ich nicht der Perl-Held bin):
#!/usr/bin/perl
use LWP::Simple;
use LWP::UserAgent;
use Image::Magick;
use CGI;
use strict;
#use warnings;
my $OUT_PATH = "/home/weibler/public_html/aprilscherz";
my $cgi = new CGI;
my $format = $cgi->param("ending");
my $filename = $cgi->param("digest");
my $url = $cgi->param("url");
unless( $filename =~ /^[a-f0-9]{32}$/i ) {
}
unless( $format =~ /^(jpg|png|gif|jpeg|bmp)$/i ) {
}
#my $error = $cgi->cgi_error;
#warn $error if $error;
unless( -f "$OUT_PATH/$filename.$format" ) {
my $ua = LWP::UserAgent->new;
$ua->agent('Mozilla/5.0');
my $status = $ua->mirror($url, "$OUT_PATH/$filename.$format");
my $image = Image::Magick->new;
my $x = $image->Read("$OUT_PATH/$filename.$format");
# warn $x if $x;
$image->Quantize(colorspace=>'gray'); # in schwarz/weiss weiterreichen
# $image->Flip();
$x = $image->Write("$OUT_PATH/$filename.$format");
# warn $x if $x;
}
print $cgi->redirect("http://users.fbihome.de/~weibler/aprilscherz/$filename.$format?url=$url&ending=$format&digest=$filename");
Das Skript ist ein wenig besser als das vom FeM. Zum einen kommt es mit URLs in der Art bild.jpg?param=foobar klar. Diese URLs treten z.B. bei der Verwendung mancher Addons in Typo3 auf. Weiterhin liefert es absichtlich die Bilder nicht selber aus, so dass die korrekten Header etc nicht von Hand im Skript ausgegeben werden müssen. Apache kann das sowieso viel besser

Nachteil ist natürlich die fehlende Erkennung von Endlosschleifen. Für einen Tag aber kein Problem, da Browser sowieso die Anfragen irgendwann abbrechen...
Der zweite Schritt wurde leider nicht online geschaltet weil die Zeit zur Implementierung nicht reichte. Ich dachte mir, dass nur Bilder in Graustufen rendern langweilig sein sollte und programmierte einen Converter für css-Dateien. Leider war meine Regexp nicht besonders, so dass auch normale css-Selektoren umgewandelt wurden und somit manch Webseitenlayout kaputt ging. Weiterhin akzeptiert der Internet Explorer (getestet mit Version 7) kein zweimaliges Redirect bei CSS-Dateien. Wenn man allerdings auf die lokale URL umleitet, dann stimmen alle relativen Pfade in der CSS-Datei nicht mehr
Aber ich will möglichen Nachahmern ja die Chance lassen das nachzubessern:
<?php
require_once('Image/Color2.php');
require_once('HTTP.php');
require_once('HTTP/Client.php');
$OUT_PATH = "/home/weibler/public_html/aprilscherz_css";
$url = filter_input(INPUT_GET, "url", FILTER_SANITIZE_URL);
$ending = filter_input(INPUT_GET, "ending", FILTER_SANITIZE_SPECIAL_CHARS);
$digest_filter = array('regexp' => "/[a-fA-F0-9]{32}/"); $digest = filter_input
(INPUT_GET
, "digest", FILTER_VALIDATE_REGEXP
, array('options' => $digest_filter));
// Pattern
// 1.:
// #RRGGBB
// 2.: color: #RRGGBB
// 3.: color: #RGB
// 4.:
// #RGB
// 5.:
// color: red
$pattern = '/\{.*(#[a-fA-F0-9]{6})|(color|background)\:\s*(#[a-fA-F0-9]{6})|(color|background)\:\s*(#[a-fA-F0-9]{3})|\{.*(#[a-fA-F0-9]{3})|color:\s*([a-zA-Z]+)/m';
function replaceColor($matches)
{
$parsedcolor = $matches[count($matches)-1];
if( $parsedcolor !== '' && $parsedcolor !== 'inherit' && $parsedcolor !== 'transparent' &&
$parsedcolor !== 'rgb' )
{
$color = new Image_Color2($parsedcolor);
$graycolor = $color->convertTo('Grayscale');
$grayHexCode = $graycolor->getHex();
}
else
{
// Problem? Alte Farbe nehmen
$grayHexCode = $parsedcolor;
}
$returnVal = str_replace($parsedcolor, $grayHexCode, $matches[0]); return $returnVal;
}
$request =& new HTTP_Client();
if( !PEAR::isError($request->get($url)) )
{
$resp = $request->currentResponse();
$body = $resp['body'];
// dem Regexp ein wenig helfen
$path = $OUT_PATH . "/" . $digest . "." . $ending;
file_put_contents($path, $newbody, LOCK_EX);
}
//HTTP::redirect("http://users.fbihome.de/~weibler/aprilscherz_css/$digest.$endingurl=$url&ending=$ending&digest=$digest");
HTTP::redirect("$url");
?>
Vielleicht ist das ja jetzt ein Anreiz für jemanden sich mal genauer das Flash-Format anzuschauen und auch Videos in Graustufen oder so auszuliefern
btw: die Skripte auf dem Server sind nicht von außen erreichbar und werden am Ende des 1. Aprils gelöscht