Archive for Juli, 2006

MySQL: Datenbank zu UTF8 Kollation konventieren

Juli 26, 2006  |  Allgemein  |  No Comments

Beim Ex- und Import von der MySql Datenbank im Büro auf den Laptop kam es in letzter Zeit immer wieder zu Problemen mit den Umlauten. Bei Präsentationen natürlich alles andere als gut deswegen musste ich mich nach einer Lösung umsehen.
Das Problem ist die Mysql Standard Collation ‘latin1′ und nicht ‘utf8′ (utf8_general_ci ist wohl für die meisten Sprachen die beste Wahl).
Um dies zu verändern, entweder den MySql-Server immer mit

shell>mysqld --default-character-set=utf8 --default-collation=utf8_general_ci

starten, oder MySql gleich mit den ‘richtigem’ Charset und Collation kompilieren:

shell>./configure --with-charset=utf8 --with-collation=utf8_general_ci

Alternativ und für Windows die beste Lösung, kann auch die my.cnf wie folgt angepasst werden:

default-character-set=utf8
default-collation=utf8_general_ci

Um bereits existierende Tabellen mit PHP nach UTF8 zu konventieren, hilft dieser kleine Code-Snippet

$dbname = 'my_databaseName';
mysql_connect('127.0.0.1', 'root', '');
mysql_query("ALTER DATABASE `$dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci");
$res = mysql_query("SHOW TABLES FROM `$dbname`");
while($row = mysql_fetch_row($res)) {
   $query = "ALTER TABLE {$dbname}.`{$row[0]}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
   mysql_query($query);
   $query = "ALTER TABLE {$dbname}.`{$row[0]}` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
   mysql_query($query);
}
echo 'all tables converted';

Um in Zukunft sicher zu gehen, dass Inhalte die in die Datenbank geschrieben werden auch Zeichenkonform konventiert werden, ist es ratsam nach dem connect bzw. select_db den richtigen Zeichensatz zu setzen:

mysql_query("SET NAMES 'utf8'");

IE Freeze Bug

Juli 14, 2006  |  Allgemein  |  No Comments

Dass der IE 6 wohl nicht zu den besten Produkten aus Dem Hause Microsoft zu zählen ist, ist ja durchaus bekannt. Heute eher zufällig einen Absturz provoziert und nach ein paar ‘Investigations’ den Schadcode gefunden.
Bisherigen Erfahrungen nach crasht der IE bis Version 6 (getestet 5.1, 5.5 und 6.0 auf einer XP SP2 und IE 6 auf XPx64 Maschine), der IE7 Beta 2 (und 3) bleiben davon verschont.
Es handelt sich hierbei um eine DOS-Freeze Attacke die den Browser zum ‘einfrieren’ bringt und keine weiteren Interaktionen zulässt.

<style type="text/css">
input
{
   width:35px;
   float:left;
}
</style>

<div style="width:50px;">
   <span></span>
   <span style="position:relative;">
      <input />
   </span>
   <input />
   <input />
</div>

Hierbei ist nur zu beachten dass die Breite des div-Elements größer als die des Input Feldes sein muss, der absolute Wert jedoch keine Rolle spielt (z.B. div-width: 200px und input-width: 199px)

Bilder Fremdverlinkung verhindern

Juli 10, 2006  |  Allgemein  |  No Comments

Um zu verhindern, dass Bilder eigene direkt von anderen eingebunden werden , gibt es zwei Möglichkeiten:
Die erste ist ein PHP-Script welches das Bild lädt, den REFRER überprüft und ggf. noch ein Wasserzeichen zu dem Bild hinzufügtden und wieder ausgibt ausgibt.
Der Code kann etwa so aussehen:

function href_ok() {
   $domain_array = Array();
   $domain_array[] = 'meinedomain.de';
   return in_array($_SERVER['HTTP_REFERER'], $domain_array[]);
}
header('Content-Type: image/jpeg');
$uri = getenv('REQUEST_URI');
$urix = explode('/', $uri);
$img_path = "images/{$_GET['fname']}.jpg";
$imagesrc = imagecreatefromjpeg($img_path);
if(!href_ok()) {
   $water_mark = ImageCreateFromPNG('images/photos/wasserzeichen.png');
   ImageCopy($imagesrc, $water_mark, imagesx($imagesrc) - imagesx($water_mark), imagesy($imagesrc) - imagesy($water_mark), 0, 0, imagesx($water_mark), imagesy($water_mark));
}
imagejpeg($imagesrc);
imagedestroy($imagesrc);

Um das Script wirklich produktiv einsetzen zu können, sind aber noch ein paar Anpassungen nötig.
Im Beispiel müsste u.a. die imagecreatefromjpeg und imagejpeg je nach Bildformat angepasst werden (imagecreatefromgif, imagecreatefrompng…).
Außerdem sollte der Bilder Pfad nicht allzu leicht zu erraten sein (z.B. nicht /images) oder am besten in einem Verzeichnis außerhalb des Webservers liegen.

Alternativ kann man auch mod_rewrite einsetzen, sollte zumindest Performance technisch schneller unterwegs sein.
Vorraussetzung für die Funktion ist ein Apache Webserver mit mod_rewrite aktiviert (leider bieten diesen Service nicht allzu viele Webhoster).
Um bei einer Fremdverlinkung ein anderes Bild anzuzeigen, ist die .htaccess Datei wie folgt zu ändern:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?domain.de(/.*)?$ [NC]
RewriteRule .(gif|jpg|png|jpeg|GIF|JPG|PNG|JPEG)$ http://www.example.org/ersatzbild.jpg [R,L]

Die dritte Zeile muss natürlich auf die eigene Domain angepasst werden.
Das ersatzbild.jpg kann auch wiederrum ein einfaches PHP-Script sein, welches das Bild lädt, ein Wasserzeichen hinzufügt und wieder ausgibt.
Um gar kein Bild anzuzeigen (spart Traffic), ist die letzte Zeile durch

RewriteRule .(gif|jpg|png|jpeg|GIF|JPG|PNG|JPEG)$ - [F]

zu ersetzen.

Raid 5 unter WinXP freischalten

Juli 4, 2006  |  Allgemein  |  No Comments

Heute gibts mal wieder einen weiteren Teil zur Optimierung für Windows XP als Server.
Auch wenn Software-RAID oftmals in der Kritik steht und nicht als optimale Lösung angesehen wird, kann ich zum einen sagen dass es mit heutigen Prozessoren jenseits der 1-GHZ-Grenze Performance Engpässe gegen null gehen, zum anderen billige Hardware RAID-Controller (z.B. Onboard-Controller bei einigen Mainboards und PCI-Karten bis ~100 Euro) im Prinzip nicht anderes machen als ein abgespecktes Linux-Embed-Software RAID zu nutzen und so gesehen auch nicht wirklich eine optimale Lösung sind.
Wer also nicht hunderte von Euro in teure Controller ausgeben will, fährt mit einem Software Raid ganz gut.
Manko hierbei (war) jedoch dass nur RAID-0 (Stripe) oder RAID-1 (Mirror) funktionieren. Dem kann aber zmb bei Windows XP Pro entgegen kommen und durch Modifizierung kleinerer Dateien RAID-5 aktivieren.

Bei diesem Tutorial müssen die Dateien dmboot.sys, dmconfig.dll und dmadmin.exe mit Hilfe eines Hex-Editors angepasst werden.
Damit nicht die WFP (Windows File Protection) die Veränderung der Dateien selbstständig zurücksetzt, sollten diese aus den Ordnern %windir%\ServicePackFiles\i386 und %windir%\system32\dllcache gelöscht werden.
Nun müssen die Dateien in einen neu angelegten Ordner kopiert (dmboot.sys ist unter system32/drivers zu finden, die anderen beiden Dateien unter system32) und wie folgt im Hexeditor geändert werden:

Nachdem Speichern der Änderungen die Dateien kopieren und ggf. noch eine Sicherung vor dem Ersetzen machen.
Bei den WFP Dialogen jeweils im ersten ‘Abbrechen’, im zweiten ‘Ja’ klicken.
Raid 5 anlegen:
Jetzt die Datenträgerverwaltung (Diskmgmt.msc) starten und die gewünschten Datenträger (zb Datenträger 1)rechts anklicken und “In dynamischen Datenträger konventieren” wählen. Nach der Umwandlung auf den ersten der dynamischen Datenträger rechts klicken und “Neues Volumen” wählen. Im anschließenden Assistent-Dialog kann nun RAID-5 markiert werden.