Benchmark Apache 2.2 & nginx 0.5.3 (statische Inhalte)

Posted by Poddn on Jun 29th, 2008

Dass es nicht immer Apache sein muss, stellt nginx eindrucksvoll unter Beweis. Seit mittlerweile 3 Jahren befindet sich der schlanke russische Webserver im produktiven Einsatz, und die Fanbase wächst: Im Netcraft Web Server Survey vom Juni 2008 ist der nginx mit über 2 Millionen Domains auf Platz 5 gelistet, und lässt damit seinen ärgsten Konkurrenten lighttpd hinter sich.

Grund genug, mal einen Benchmark zu machen.

Setup
Als Server dient ein AMD Opteron 148 mit 1GB Ram, Client ist ein Core 2 Duo mit 3GHz und 4GB Ram. Auf beiden Systemen kommt Ubuntu 8.04 zum Einsatz. Verbunden sind die beiden Rechner direkt über einen 100MBit Switch.

Um ein wenig Druck auf den Kessel zu bekommen, verwende ich das Apache Benchmark Tool. Pro Durchlauf feuere ich 400.000 Requests ab, jeweils 500 auf einmal:

ab -n 400000 -c 500 -g http://192.168.1.28/static_short.html

Die statische html-Datei die ich abrufe, ist 100 Byte lang. Ziemlich wenig, aber mir stehen ja auch “nur” 100MBit Bandbreite zur Verfügung.

Eine kurze Zusammenfassung in Graphen:

Die Zahlen sprechen für sich: nginx lässt den Apachen einfach stehen. Interessant waren die Beobachtungen auf der Konsole des Servers: Während im Apache-Durchlauf die Load teilweise bis auf 60(!) nach oben ging, stieg die Load beim nginx kaum über 1. Ein Grund dafür mag sein, dass der Apache mehrere Threads startet, während der nginx in der Standardkonfiguration mit nur einem Thread läuft.

Die Zahlen sind allerdings mit Vorsicht zu genießen: Bei dem Benchmark ging es lediglich um statische Inhalte. Wie die beiden Webserver sich in Verbindung mit php schlagen, werde ich demnächst ergründen.

Ubuntu: Schneller Rechner, langsame Spiele

Posted by Poddn on Jun 13th, 2008

Mit einem Rechner der aktuellen Generation sollten sich alte Games eigentlich vortrefflich spielen lassen.

Denkste.

Es kann nämlich bei aktivierter Stromsparfunktion (”Cool & Quiet”) vorkommen, dass die CPU von dem Spiel derart unterfordert ist, dass sie einfach mal so runtertaktet. Und dann ruckelts.

Um das runtertakten zu verhindern, kann man mit “cpufreq-selector” das Stromsparprofil - also ob und wie die CPU runtergetaktet werden soll - verändern. Kennt ihr vieleicht vom Notebook.

Also vor dem Start eine Konsole auf und eingetippt:
sudo cpufreq-selector -c 0 -g performance
sudo cpufreq-selector -c 1 -g performance

Rückgängig macht man das Ganze mit:
sudo cpufreq-selector -c 0 -g ondemand
sudo cpufreq-selector -c 1 -g ondemand

Spam Poem

Posted by Poddn on Jun 6th, 2008

Not harbour? be you. Which transatlantic by exhibition.
Are rambling you bowed. by it casting.

Be on fragrance. Is no crave highlight modernity.
detector a cinema. his shaky by supposed.

That assume? That to urine viking.

A regularly No astrophysics. For holly. Be he heath.
her go return incorporate turnpike. agency a crotch.

the deter, victorious a impose.

Ubuntu smbmount & Plaintext Passwörter

Posted by Poddn on May 26th, 2008

Möchte man mit Ubuntu 8.04 auf ein Windows Netzwerkshare zugreifen, das lediglich Plaintext Passwörter unterstützt, so ist das standardmäßig nicht mehr möglich.

Damit man wieder auf seine Shares zugreifen kann, muss man in der smb.conf folgende Zeilen im global-Abschnitt einfügen:

client plaintext auth = yes
client lanman auth = yes

Dadurch wird eine Plaintext Authentifizierung wieder möglich.

Pizza - the other white meat

Posted by Poddn on Apr 12th, 2008

Und das am Samstag um 9:48 im Büro.

Esoterische Scriptsprachen

Posted by Poddn on Nov 21st, 2007
1
2
3
4
5
6
7
8
HAI
CAN HAS STDIO?
PLZ OPEN FILE "LOLCATS.TXT"?
    AWSUM THX
        VISIBLE FILE
    O NOES
        INVISIBLE "ERROR!"
KTHXBYE

Das Beispiel oben wurde in LOLCODE geschrieben, einer esoterischen Scriptsprache.

Andere - vieleicht bekanntere - esoterische Scriptsprachen sind Brainfuck und Whitespace.

Eclipse PDT auf einem 64bit-Linux installieren

Posted by Poddn on Nov 11th, 2007

Eclipse PDT hat mich auf meinem 64bit-Debian fast in den Wahnsinn getrieben. Ich habe die 32bit PDT-All-In-One Version probiert, die wollte sich jedoch nicht updaten lassen. Damit fiel die Installation des Subversion-Plugins flach.

Ich habs dann mal mit einem apt-get install eclipse probiert. Funktionierte ganz gut, installiert aber Eclipse 3.2. Für PDT 1.0 braucht man jedoch Eclipse 3.3 - war also auch nix.

Dann halt alles von Hand:

64bit-Eclipse herunterladen
Download: eclipse-SDK-3.3.1.1-linux-gtk-x86_64.tar.gz
Falls der Link nicht mehr funktioniert: Auf http://www.eclipse.org/downloads/ gehen und im Einleitungstext auf “Downloads for your platform may be available here.” klicken.

64bit JavaVM installieren
Damit Eclipse 3.3 läuft, benötigt es mindestens die Sun JavaVM 5.0. Unter Debian Lenny müssen zur Installation - falls noch nicht geschehen - diese beiden Zeilen in die /etc/apt/sources.lst aufgenommen werden:
deb http://security.debian.org/ lenny/updates main contrib non-free
deb-src http://security.debian.org/ lenny/updates main contrib non-free


Installiert wird die JavaVM wie gewohnt:
apt-get install sun-java5-jre

Anschließend sollte sichergestellt werden, dass diese Javaversion vom System auch benutzt wird:
update-alternatives --config java


Eclipse entpacken und starten
Das sollte nicht zu schwer sein. Ich habe mein Eclipse nach /home/pg/eclipse/ geworfen. Um Eclipse zu starten, muss die Datei “eclipse” ausgeführt werden. Unter KDE reicht es aus, diese Datei im Konqueror doppelt anzuklicken. Ihr könnt euch auch einen Eintrag im Menu basteln - whatever ;)

Eclipse konfigurieren
Als erstes muss die PDT Update-Site zum Eclipse Updater hinzugefügt werden. Dafür nach Help -> Software Updates -> Find and Install gehen, Search for new Features to install wählen und folgende Site per New Remote Site hinzufügen: http://download.eclipse.org/tools/pdt/updates/site.xml.

Bevor ihr auf Finish klickt, solltet ihr sichergehen, dass sowohl der Eintrag Europa Discovery Site als auch euer neuer PDT Eintrag markiert sind.

Im Search Results-Fenster solltet ihr nun folgende Sachen ankreuzen:

  • Europa Discovery Site -> Graphical Editors and Frameworks -> Graphical Editing Framework SDK
  • Europa Discovery Site -> Models and Model Development -> Eclipse Modeling Framework (EMF)
  • Europa Discovery Site -> Models and Model Development -> XML Schema Infoset Model (XSD)
  • Europa Discovery Site -> Web and JEE Development -> Web Standard Tools (WST)
  • PDT - > PDT Features
  • PDT -> PDT Features SDK

Wenn im oberen Bereich des Fensters kein Fehler angezeigt wird, habt ihr alles notwendige ausgewählt und es kann mit einem Klick auf Next weitergehen.

Nach dem Abnicken der Lizenzbestimmungen für die einzelnen Plugins und dem Bestätigen der Installationsverzeichnisse solltet ihr eigentlich ein frisch installiertes Eclipse PDT 64bit haben. Glückwunsch!

PNGs mit Alphakanal im IE6 nutzen

Posted by Poddn on Nov 5th, 2007

PNGs bieten den ungeheuren Vorteil, richtige Alphakanäle auf Websites nutzen zu können. Mozilla/Firefox und der IE7 unterstützen Transparenz bei PNGs nativ, der IE6 lässt sich mit Hilfe des AlphaImageLoader-Filters von Microsoft dazu bringen, Transparenz entsprechend darzustellen.

Aber der IE6 wäre nicht der IE6, wenn es da nicht irgendeinen Haken gäbe, richtig?

Genauer gesagt gibt es sogar mehrere Haken:

  1. AlphaImageLoader funktioniert nur im IE5.5 und IE6 auf Windows-Plattformen. Je nach Browser muss eine Fallunterscheidung getroffen werden
  2. Transparente PNGs können nicht gekachelt werden. Ein Einsatz als Hintergrundmuster fällt also aus.
  3. Der Filter behandelt PNGs nicht als Hintergrundbilder - selbst wenn man sich das eigentlich so vorstellt. Dieser Umstand macht das Positionieren von interaktiven Objekten - zum Beispiel Links - etwas schwierig.

Trotz dieser Einschränkungen lässt sich mit transparenten PNGs im IE6 doch noch einiges zaubern. Man muss nur wissen wie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Look Ma, Transparency!</title>
 
<style type="text/css">
body {
	background-image:url('holes.gif');
	margin:0px;
	padding:0px;
}
#mybox {
	position: absolute;
	left: 50px;
	top: 50px;
	width: 376px;
	height: 376px;
	background-image: url('box.png');
	background-repeat: no-repeat;
	padding: 20px;
}
</style>
 
<!--[if lt IE 7]>

<style type="text/css">
#mybox	{
	background-image:none;
	filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
	src='box.png',sizingMethod='crop')
	}
</style>
<![endif]-->
 
</head>
<body>
 
<div id="mybox">
	Look Ma, Transparency!
</div>
</body>
</html>

Der interessante Teil ist der, der in dem Conditional Comment steht:

  • Wir überschreiben die background-image Information mit “none”. Gefilterte PNGs sind für den IE6 keine Hintergrundbilder - er würde also beide PNGs übereinander anzeigen: das gefilterte und das ungefilterte.
  • Wir geben dem DIV die Filtereigenschaft mit. Als Quelle geben wir unser transparentes PNG an. Zusätzlich geben wir dem Filter sizingMethod=’crop’ mit auf den Weg: Sollte das PNG größer als der DIV-Container sein, wird der Rest des Bildes abgeschnitten. Neben ‘crop’ gibt es noch ’scale’, welches das PNG auf die Größe des DIVs skaliert und ‘image’, welches das DIV auf die Größe des PNGs skaliert.

Das sieht doch schonmal ganz gut aus. Aber was passiert, wenn wir einen Link in unsere Box einbauen wollen?

39
40
41
42
43
<div id="mybox">
	Look Ma,
	<a href="http://en.wikipedia.org/wiki/Transparency"
	target="_blank">Transparency!</a>
</div>

Der Link ist im IE6 nicht anklickbar. Schuld ist der Filter. Damit Links über transparenten PNGs funktionieren, gibt es zwei Dinge zu beachten:

  1. Das Element, auf das der AlphaImageLoader-Filter angewendet wird, darf keine “position”-Eigenschaft haben
  2. Die Links hingegen benötigen unbedingt eine “position”-Eigenschaft

Wir können also unser PNG-DIV nicht direkt positionieren, sonst funktionieren die Links nicht. Ist aber halb so wild, denn wir können das DIV in ein anderes DIV werfen, welches wir wiederum problemlos positionieren können. Zu diesem Zweck legen wir uns ein Container-DIV an und entfernen die Positionierungsinformationen aus unserem PNG-DIV:

13
14
15
16
17
18
19
20
21
22
23
24
25
#container {
	position: absolute;
	left:    50px;
	top:    50px;
}
 
#mybox    {
	width:    376px;
	height: 376px;
	background-image: url('box.png');
	background-repeat: no-repeat;
	padding: 20px;
}

Zu guter Letzt positionieren wir den Link relativ:

25
26
27
#mybox a {
	position:relative;
}

Der Aufruf unseres PNG-DIVs sieht dann folgendermaßen aus:

39
40
41
42
43
44
<div id="container">
	<div id="mybox">
		Look Ma, <a href="http://en.wikipedia.org/wiki/Transparency" 
		target="_blank">Transparency!</a>
	</div>
</div>

Fertig sieht das ganze dann so aus: transparency01.html

Python ist toll!

Posted by Poddn on Oct 20th, 2007

Ne jetzt, ehrlich! Ich hatte das Vergnügen, mich in letzter Zeit eingehendst mit Python beschäftigen zu können. Ich hab sogar Geld dafür bekommen ;)

Ein paar Sachen, die mir an Python wirklich gut gefallen:

Codeformatierung
Anstatt der - z.B. bei php üblichen - geschweiften Klammern werden Codeblöcke die in Schleifen, Bedingungen, Funktions- oder Objektdefinitionen stehen einfach eingerückt. Dadurch wird der Code zwangsweise sehr gut lesbar. Natürlich kann man Blöcke auch in anderen Script- oder Progammiersprachen einrücken, man muss es aber nicht. Bei Copy/Paste-Aktionen siegt dann öfter mal der Schweinehund.

Alles ist ein Objekt
Python ist objektorientiert. Aber sowas von. Im Grunde genommen ist alles was man in Python produziert ein Objekt. Um auf Methoden, Eigenschaften oder andere Objekte innerhalb von Objekten zugreifen zu können, klebt man einfach alles mit einem Punkt zusammen. Das kann dann z.B. so aussehen:
value = browser.getform('form1').getfield('field1').getvalue

Dokumentation
Kommentare, die man unter die Definition eines Objekts oder einer Methode des Objekts schreibt, werden automatisch vom Help-Befehl auf der Konsole verwurstet. Und wenn man nicht weiss was ein Objekt alles so kann, kann man sich sämtliche Methoden und Eigenschaften per dir(objektname) anzeigen lassen.

Community
Irgendwie habe ich das Gefühl, als ob Pythonbenutzer reifer sind. So gut wie alle Postings die mir google zu meinen anfänglichen Problemen ausgeworfen hat, waren konstruktiv und flamefrei.

Wer Lust hat sich Python mal etwas genauer anzuschauen dem kann vor allem Dive into Python empfehlen.

Vorher/Nachher

Posted by Poddn on May 11th, 2007

Auf vielfachen Wunsch hier ein paar meiner Bilder zusammen mit dem unbearbeiteten Ausgansmaterial:

vn_fraumithund.jpg

Continue Reading »

Next »