wget aufbohren: dotfiles per –mirror mitkopieren

Ich benutze GNU wget gerne um verschiedene Websites per FTP mit dem Parameter --mirror zu spiegeln. Leider werden dabei versteckte Dateien (so genannte dotfiles) wie etwa .htaccess nicht berücksichtigt. Nach eingehendem Studium der manpage stellte ich enttäuscht fest, dass wget tatsächlich keine Option zur Lösung des Problem vorsieht.

Aber zum Glück lässt sich GNU wget als Open-Source-Software an die eigenen Bedürfnisse anpassen, so dass ich folgenden q&d Patch "entwickelte".

CODE:
  1. --- wget-1.10.2_orig/src/ftp-basic.c     2005-06-19 15:47:10.000000000 +0200
  2. +++ wget-1.10.2/src/ftp-basic.c 2007-04-21 14:17:33.000000000 +0200
  3. @@ -977,7 +977,7 @@
  4.    uerr_t err;
  5.  
  6.    /* Send LIST request.  */
  7. -  request = ftp_request ("LIST", file);
  8. +  request = ftp_request ("LIST -a", file);
  9.    nwritten = fd_write (csock, request, strlen (request), -1.0);
  10.    if (nwritten <0)
  11.      {


wget ftp://ftp.gnu.org/pub/gnu/wget/wget-1.10.2.tar.gz
tar -xzf wget-1.10.2.tar.gz
patch -p0 < wget-1.10.2_dotfiles
./configure
make
make install

Es genügt also LIST -a anstatt LIST an den FTP-Server zu senden, um wget zu überreden auch dotfiles rekursiv zu kopieren.
Der Patch ist - wie gesagt - ein übler Hack, der mir zur schnellen Lösung eines Problems dienen solle. Für mich funktioniert er gut. Perspektivisch wäre es jedoch wünschenswert durch einen Parameter zwischen LIST und LIST -a wählen zu können. Nach meiner mündlichen Diplomprüfung werde ich das sauber implementieren und als Feature vorschlagen.

EDIT 16:40: Hier gibt es einen sauberen Patch, allerdings nur für Version 1.9.1. Doch es sollte nicht allzu schwer fallen ihn auf die aktuelle Version zu portieren.

Professionell personalisierte Bulkmails

JoWood UCE

Das Beste daran ist, dass ich mich gar nicht erinnern kann JoWood um Werbemails gebeten zu haben.

IP verloren? ARP hilft!

Beim Konfigurieren einer LaCie Ethernet Disk lief irgendwas schief und das Gerät war über die konfigurierte IP nicht mehr ansprechbar. Für solche Fälle sieht LaCie eine Option vor das Gerät mittels Restore-CD auf Werkseinstellungen zurückzusetzen. Diese Lösung ist jedoch in zweierlei Hinsicht problematisch: Zum einem werden dabei nicht nur alle Einstellungen zurückgesetzt, sondern auch alle Daten gelöscht! Zum anderen wird dazu ein externes USB-CD-Laufwerk von Nöten, dass auch nicht immer vorhanden ist.
Für den stattlichen Preis jenseits 1000 Euro für die 2TB-Variante, darf man Komfort erwarten. Ganz abgesehen davon, dass ein Konfigurationsutility offensichtlich zu Abstürzen neigt, die gleich die gesamte Konfiguration des Netzwerkinterface zerschießen.

Doch zum Glück lässt mit ein wenig KnowHow die IP-Adresse wiederherstellen, ohne Konfiguration und Daten zu löschen:

Zuerst die LaCie über Crossoverkabel direkt an einen Rechner anschließen, dann mit arp -s IP_ADDR MAC_ADDR einen statischen ARP-Eintrag zu erzeugen. Wobei IP_ADDR eine freie IP-Adresse im Subnetz des Rechners ist und MAC_ADDR die MAC-Adresse der LaCie (findet sich auf dem Typenschild).

Nun ist es wieder möglich über die gewählte IP auf das Webinterface zuzugreifen und dauerhaft eine IP zu konfigurieren.
Prinzipiell funktioniert das mit jedem TCP/IP-Gerät, das über eine MAC-Adresse verfügt.

Allerdings verwundere ich mich darüber, dass LaCie den Aufwand betreibt die Network Disk mit PS/2-Anschlüssen und einen VGA-Ausgang zu versehen, aber über die so erreichbare Konsole keine Option vorsieht das Netzwerkinterface zu konfigurieren.

Google Analytics mit Privoxy filtern

Meine Meinung über Google Analytics ist ambivalent: Einerseits ist Google Analytics ein hervorragendes Analysetool, das Möglichkeiten bietet, die kostenlos sonst nirgends zu finden sind. Andererseits beunruhigt mich, dass die von Google Analytics gesammelten Daten von Google beliebig verwendet werden können. Schon alleine die Daten, die Google für Webmaster aufbereitet, zeichnen das Bild vom gläsernen Surfer - und es darf davon ausgegangen werden, dass Google durch Kombination verschiedener Analyticsdaten noch weitaus mehr über die Besucher einer Website in Erfahrung bringen kann, als sich dem Webmaster offenbart. Derzeit überwiegen meine Bedenken gegenüber Google Analytics. Darum arbeitet meine Privoxyinstallation seit heute mit folgendem Filter:

CODE:
  1. FILTER: google-analytics Zapp Google Analytics Tracking
  2. s@<script \s[^>]*google-analytics\.com/urchin\.js[^>]*>[\s.]*</script>@>@Uig                 
  3. s@urchinTracker\(\);@@Uig
  4. s@]*;@@Uig

Die regulären Ausdrücke lassen sich gewiss noch verfeinern, aber für mich arbeitet der Filter momentan zufriedenstellend. Verbesserungsvorschläge sind aber natürlich immer willkommen. :)

Neben dem wiedergewonnenen Stückchen Anonymität ergibt sich ein erfreulicher Nebeneffekt: Die Ladezeit vieler Websites, die Google Analytics verwenden, verkürzt sich wesentlich.

Ich will einen neuen Mac

1 GB RAM sind anscheinend zu wenig für mein kleines MacBook. Nach drei Stunden Arbeit (nichts außergewöhnliches: TextMate, CyberDuck, Terminal, iPhoto, iTunes, Mail und Safari) hat Darwin 370688 Speicherseiten ausgelagert. Das dürfte bei 1024 MB RAM eigentlich nicht sein. Kann es denn sein, dass OS X so verschwenderisch mit Speicher umgeht?

370688 Seitenauslagerungen

Da Arbeitsspeicher auch nicht mehr die Welt kostet, könnte ich auch auf 2 GB aufrüsten. Doch so richtig zufrieden bin ich mit meinem MacBook ohnehin nicht mehr: Der Spannungswandler pfeift, die Backspace-Taste ist klapprig, das Gehäuses nicht richtig verschraubt, der Displaydeckel knackt beim Öffnen und das Gerät wird einfach viel zu heiß. Der pfeifende Spannungswandler und die klapprige Tastatur sind allgemeine Mängel der ersten Revision des MacBooks, die zwar enttäuschend sind, aber wahrscheinlich keine Reklamation rechtfertigen würden. Die übrigen Mängel ließen sich zwar auch als Kleinigkeit verbuchen, könnten aber in ihrer Summe genügen um das MacBook auszutauschen.
Mich ärgert ohnehin, dass gut einem Monat nach dem Kauf die Revision 2 des MacBooks mit schnelleren Prozessor, verdoppelten Arbeitsspeicher und größere Festplatte zum gleichen Preis zu haben war. Ob es möglich ist das MacBook gegen eines der zweiten Revision auszutauschen und in diesem Zuge auf 2 GB aufzustocken? Wir werden sehen.

Quote of the day

Ich würde gern die Welt verbessern, doch Gott gibt mir den Quellcode nicht!

Unable to create temporary directory

Wenn Windowsuser PHP lernen und dafür gleich einen Rootserver anmieten, muss das in einer Katastrophe enden.

Mit Google durch den Atlantik schwimmen

Wie komme ich von Dortmund nach New York? Ich fahre bis zu französischen Atlantikküste und schwimme dann 5.572 km durch den Atlantik.

Screenshot aus Google-Maps.

So will es zumindest Google-Maps. Ist eben noch Beta. ;)

MyISAM Tabellen reparieren

MyISAM Tabellen arbeiten nicht transaktionsorientiert und können beschädigt werden, zum Beispiel wenn mysqld während eines Schreibzugriffs gewaltsam beendet wurde, ein Hardwarefehler vorliegt und ähnliche Katastrophen. Aufmerksam auf ein solches Problem macht neben unvollständigen oder fehlerhaften Ergebnissen einer Datenbankabfrage die Fehlermeldung:

Incorrect key file for table: '...'. Try to repair it

In der Regel lassen sich die beschädigten Tabellen mit repair table your_table; wieder in einen definierten Zustand versetzen. Wenn es schlecht läuft, können aber auch einzelne Datensätze dabei zerstört werden. Kluge Menschen halten darum ein tägliches Backup ihrer Datenbank vor. :)

Wenn Datenbanktabellen ohne erkennbaren Grund (zum Beispiel Strom- oder Hardwareausfall) öfters beschädigt werden, ist gut beraten die Serverkonfiguration genauer zu untersuchen oder den Hoster zu wechseln.

Ultimate Tag Warrior: URL-Rewriting

UTW ist ein tolles Plugin für WordPress, um Postings mit Tags zu versehen und Tagclouds als Navigationsmittel zu erzeugen. Dabei ist sogar eine Option vorgesehen, mit der sich schöne URL in Form von BASEURL/tag/tag erzeugen lassen. Bislang blieb diese Funktionalität meiner WordPress Installation jedoch versagt. Zwar konnte ich die Option aktivieren, die Tag Links verweisen auch auf URLs wie BASEURL/tag/linux, aber WordPress vermochte sie nicht auf den eigentliche URL BASEURL/index.php?tag=linux umzuschreiben.
Des Rätsels Lösung fand ich während ich mich in das Rewriting von WordPress einarbeitete.
Wenn Permalinks (so der von WordPress gewählte Name für scheinbar statische, saubere URLs) aktiviert werden, schreibt WordPress eine .htaccess mit folgendem Inhalt (gekürzt):

CODE:
  1. RewriteEngine On
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule . /index.php [L]

Sofern es sich bei der angeforderten Ressource nicht um ein tatsächlich auf dem Webspace vorhandenes Verzeichnis oder File handelt, wird die Anfrage auf die index.php umgeschrieben.
Hier übernimmt dann die Klasse WP_Rewrite, die mit eigenen Regelwerk die sonst an mod_rewrite delegierte Aufgabe übernimmt statische URLs in dynamische umzusetzen. Geparster PHP-Code ist zwar nicht ansatzweise so effizient wie das in C implementiere und bewährte mod_rewrite, bringt aber den entscheidenden Vorteil einer durch Plugins nutzbaren API mit sich. Von der macht der Entwickler des Ultimate Tag Warrior auch Gebrauch, indem er in der Funktion ultimate_rewrite_rules (zu finden in der Datei ultimate-tag-warrior-actions.php) ein neues Rewrite-Tag registriert und zwei neue Rewrite-Regeln hinzufügt.

PHP:
  1. $wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
  2. // without trailing slash
  3. $rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%");
  4. // with trailing slash
  5. $rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/");

Soweit so gut, funktioniert nur leider nicht. Ich vermutete, dass die von UTW registrierte Rewrite-Regel mit anderen, zuvor hinterlegten, kollidierte. Darum passte ich versuchsweise den Code dahingehend an, dass die UTW-Rewrite-Regeln vor allen anderen abgearbeitete würden.

PHP:
  1. $wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
  2. // without trailing slash
  3. $rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%") + $rules;
  4. // with trailing slash
  5. $rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%/") + $rules;

Und tatsächlich: Nun sind auch saubere URLs mit dem Ultimate Tag Warrior möglich. Alles andere scheint auch zu funktionieren. Jedoch ist das weder eine saubere noch befriedigende Lösung. Ich wüsste gerne, warum und mit welchen Regeln die von UTW registrierten zusammenstoßen. Mir fehlt es momentan allerdings an Zeit und Lust den Code zu debuggen - zumal ich mir nicht sicher bin, ob UTW kaputt ist, WP_Rewrite oder mir nur ein anderes Plugin in die Quere kommt.