Das Skript PHPSecInfo vom PHP Security Consortium prüft die PHP Installation auf bekannte Schwächen und gibt hierzu Informationen aus. Die Ausgabe erinnert an die bekannt phpinfo() Ausgabe.
Author Archives: Christian Asche
Datensicherung eines sehr großen Verzeichnisses auf mehrere Datenträger
Wie sichert man ein sehr großes Verzeichnis auf mehrere DVDs? Mit der guten alten Shell. :)
Unter Windows besorgt man sich zuerst die GNU Tools. Das wbin Verzeichnis sollte man zu der PATH Umgebungsvariable hinzufügen. Unter Linux stehen die notwendigen Tools bereits zur Verfügung.
Folgender Befehl sichert das Verzeichnis C:\foo\bar als gzip komprimiert (tarball), aufgeteilt in 100 MB große Dateien:
tar c C:\foo\bar | gzip | split -b100m - backup.tgz.split.
Die Dateien haben eine Bezeichnung nach dem Schema backup.tgz.split.aa, backup.tgz.split.ab, …
Die Wiederherstellung ist genauso einfach:
cat backup.tgz.split.* | gzip -d | tar -x
Das Packen und Entpacken geht erstaunlich schnell und stabil (getestet mit 30 GB). Die Programme sind kostenlos. Was will man mehr?
PHP – Schnell oder wartbar?
Den richtigen Weg zwischen “Schnell” und “Wartbar” zu finden ist nicht einfach. Wie wichtig Code-Optimierung ist, sieht man an vielen Beispielen. Während „High End“-Root Server oft schon mit einem einzelnem Forum ausgelastet sind, pflegen wir wesentlich schwächere/ältere Systeme, die eine deutlich höhere Anzahl Anfragen verarbeiten.
Hierzu wieder zwei interessante Links:
Gerade die Datenbank ist ein beliebter Engpass. Deshalb sollte man, wann immer möglich, af den unnötigen Overhead verzichten.
- Viele Anforderungen lassen sich mit einfachen Dateien lösen. Der direkte Zugriff ist schneller, als die Abfrage einer Datenbank. (Die muss schliesslich auch Dateien öffnen …)
- Eine RAM Disk beschleunigt den Zugriff auf Dateien enorm.
- Auch Datenbanken lassen sich komplett in den RAM legen. In mySQL nennt sich das MEMORY Storage Engine.
- mySQL Tabellen lassen sich Partitionieren. Das beschleunigt den Zugriff auf die Daten mitunter enorm. (Date Tutorial, Range Tutorial)
Gerade die Leistung eines Datenbankservers lässt erheblich nach, sobald die abzufragende Tabelle nicht mehr in den Arbeitsspeicher passt. Da zeigt sich dann auch sehr schnell der Unterschied zwischen einem Join und einem WHERE foo.id=bar.id.
Nützliche Firefox Extensions für Web Entwickler
- Aardvark (Elemente aus einer Seite löschen – z.B. fürs drucken)
- Bookmark Duplicate Detector
- Autohide (echter Fullscreen Modus)
- ColorZilla (Colorpicker)
- Colour Contrast Analyser (*hüstel*)
- CSSViewer (Sehr genial)
- CookieCuller
- DownThemAll (Download Manager)
- Firebug
- FXIF (Exif Daten werden im Fenster Eigenschaften angezeigt)
- Google Pagerank Status
- Html Validator (Sollte jeder haben)
- IE Tab (Öffnet Seiten mit der IE Engine)
- LinkChecker
- Live HTTP Headers (Auch sehr wichtig)
- lori (Life-of-request info) (Wie lange benötigt die Seite? 0s 46ms 0s 156ms 1.43KB 4req)
- MeasureIt (Lineal)
- MultiSidebar (Endlich kann man die Selenium IDE und HTTP header in zusätzlichen Sidebars unterbringen)
- Pearl Crescent Page Saver Basic (Sehr wichtiges Tool, da meine Drucktaste nicht mehr funktioniert)
- Regular Expressions Tester
- Resizeable Textarea [de] (Gold Wert. Warum werden Textarea Felder eigentlich immer(!) so klein gemacht?)
- Selenium IDE (Zeichnet Selenium Tests auf!)
- ScrapBook
- Screen grab! (Alternative zu Pearl Crescent Page Saver. Benötigt die Java VM, kann dafür aber die gesamte Seite – über den Viewport hinaus – in ein png wandeln)
- Server Spy
- Table2Clipboard [de] (Gold Wert)
- TestGen4Web
- Web Developer (Sollte eigenlich direkt im FF integriert sein …)
Trigger in mySQL
Folgendes (mySQL 5) Skript legt eine Tabelle an. Alle Daten die im Feld passwd gespeichert werden, wandelt mySQL in einen md5 String um. Ein bereits gewandelter String wird nicht neu gewandelt.
CREATE TABLE `foo` (
  `id` int(11) NOT NULL,
  `passwd` varchar(255) collate latin1_general_ci NOT NULL,
  `name` varchar(255) collate latin1_general_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
DELIMITER $$
CREATE TRIGGER md5ize_on_insert
BEFORE INSERT ON foo FOR EACH ROW
    BEGIN
      SET NEW.passwd = md5( NEW.passwd ) ;
    END$$
CREATE TRIGGER md5ize_on_update
  BEFORE UPDATE ON foo FOR EACH ROW
    BEGIN
      IF NEW.passwd NOT REGEXP '^[0-9A-Za-z]{32}$' THEN
        SET NEW.passwd = md5(NEW.passwd);
      END IF;
    END $$
DELIMITER ;
Selbsterklärend und erhebt keinen Anspruch auf Vollständigkeit.
30° im Büro, 38° vor der Tür
Zumindest war es gestern so – und die zwei Wochen davor. Im Auto hatte ich die Klimaanlage auf 30° stehen. :( Völlig verrückt!
Gestern kam dann endlich der Regen. Innerhalb weniger Minuten kühlte es auf „nur“ 26 Grad ab. Jetzt sind es im Büro immernoch 25 Grad.
In hr1 hörte ich ein Interview mit einer „Expertin“. Demnach nimmt ab 22° die Leistungsfähigkeit eines Menschen pro Grad Erwärmung um 5% ab.
Ich glaube bei mir sind es ein paar Prozent mehr :|
Eine Partition formatiert = 4 Partitionen weg
Ich wollte noch schnell abends einen Versuch mit tar und split unter Windows machen. Eine Partition war noch unformatiert. Schliesslich wollte ich dort das Kubuntu von der Froscon ausprobieren. Die Formatierung quitierte Windows XP mit einem “Fehler bei der Formatierung.”. Danach waren vier Partitionen weg. :(
In so einem Fall hofft man, daß man seine Datensicherung nicht ausprobieren muss :D
Durch google fand ich Testdisk. Ein sehr geniales Programm. Testdisk erkannt sofort alle verlorene Partitionen und konnte die wichtigsten wiederherstellen. Für die leere Partition und die Windows Vista Partition kam jedoch jede Hilfe zu spät. Die 8GB (Vista) und 7GB (leer) Partition wurden als eine 15GB Partition wiederhergestellt. Diese Partition ist komplett mit Datenmüll gefüllt. (Erinnert mich ein bisschen an StarTrek …)
Bambalam PHP 2 EXE Compiler/Embedder
Bambalam ist ein kostenloser PHP2EXE Kompiler/Embedder. Das Programm packt PHP Code inklusive dem PHP Interpreter und verschiedene PHP Module in eine EXE Datei. Das erste kleine Tool für meine Arbeit war schnell ausgedacht und fast genauso schnell programmiert :).
Bambalam lässt sich natürlich wunderbar mit Winbinder o.ä. kombinieren. Einziger Nachteil: Bambalam kann bisher „nur“ mit PHP4 umgehen.
SELECT FOUND_ROWS();
Als mir jemand von SQL_CALC_FOUND_ROWS erzählte – ich glaube es war Darren -, dachte ich, ein SELECT COUNT(*) wäre kein Unterschied. Heute habe ich einen Verwendungszweck gefunden.
Ich arbeite zur Zeit an einer möglichst generischen Grundlage – ich möchte es nicht Framework nennen – für weitere Entwicklungen. In den ORM Objekten, die den Zugriff auf Tabellen ermöglichen, erzeuge ich dynamisch einen Join, um verschachtelte Objekte mit möglichst wenig “Kosten” zu erzeugen. Für die Spaltenbezeichnung benötige ich Aliase.
Die Funktion, die eine ganze Liste dieser Objekte erzeugt, kann natürlich gefiltert werden. Sobald ich nach einem Alias filtere, kann ich WHERE nicht verwenden und muss das kostenintensivere HAVING verwenden.
Mit SQL_CALC_FOUND_ROWS veranlasse ich mySQL dazu, die Gesamtanzahl der Treffer – ohne LIMIT – zu ermitteln. Die Anzahl der Treffer kann im Anschluss mit SELECT FOUND_ROWS(); ausgelesen werden.
mysql> SELECT SQL_CALC_FOUND_ROWS col1, col2, col3 AS foo FROM table HAVING foo = 'bar';
+------+------+-----+
| col1 | col2 | foo |
+------+------+-----+
| ...  | ...  | ... |
mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|Â Â Â Â Â Â Â Â 28123 |
+--------------+
1 row in set (0.00 sec)
Wesentlich einfacher, als dynamisch Queries mit Aliasen und Joins umzuschreiben.
Danke für den Tipp :)
Froscon 2006 Review
Die Froscon war wirklich einen Besuch wert. Vielen Dank an die Organisatoren.
Die Konferenz war wirklich gut organisiert. Überall auf dem Gelände hatte man einen sehr schnellen W-Lan Zugang (Eclipse mit 130Mb in 3 Minuten), die Uni ist wirklich vorbildlich und sogar das Spiel am Samstag wurde im großen Hörsaal übertragen.
Ich war konsequent in sovielen Vorträgen wie möglich. Hier ein kurzer Auszug der Vorträge, die mir besonders in Erinnerung bleiben:
- Webservices Toolkit für PHP5
Ein sehr interessantes Projekt, das mit Hilfe der PHP 5 Reflection API z.B. einen WSDL Generator ermöglicht. Infos finden sich bei der PHPUGDO. - MySQL Cluster (Geert Vanderkelen)
Sehr insteressanter Vortrag über die neuen Möglichkeiten eines mySQL Clusters. - Pivot Tables in mySQL 5 (Guiseppe Maxia)
Der Vortrag war unterhaltsam und sehr gut nachvollziehbar. Guiseppe Maxia zeigt eine Möglichkeit, wie man mit mySQL Procedures und Functions automatisiert den SQL Query für eine Pivot Tabelle erzeugt. Wie oft hätte ich dieses Skript schon gebrauchen können! Danke :) - PHP best practice (Tobias Schlitt und Kore Nordmann)
Alle Infos aus diesem Vortrag habe ich schon mindestens 100 mal gehört/gelesen. Für mich war leider nichts Neues dabei. Die Reaktionen und Fragen aus dem Publikum zeigen aber, wie wichtig solche Vorträge sind. :)
Leider habe ich es nicht geschafft, mir die PostgreSQL Vorträge anzusehen. Aber vielleicht kann ich die PostgreSQL Usergroup zu einem Vortrag in unserer PHPUGFFM einladen?