Tom goes C#
Geschrieben von Thomas Falkner - 23.09.07 um 07:09Ich arbeite mich momentan in C# ein und bin von der Sprache begeistert. Sie bietet alle Merkmale, die ich mir von einer modernen, objektorientierten Programmiersprache wünsche und bringt in der .NET-Umgebung Standardbibliotheken für nahezu alle Probleme mit, die sich im Alltag eines Programmierers stellen.
Da ich – vor allem bedingt durch mein Studium – geübt im Umgang mit Java bin, brauchte ich nicht mehr als dieses Wochenende, um mich mit Syntax und Konzepten von C# vertraut zu machen.
wget aufbohren: dotfiles per –mirror mitkopieren
Geschrieben von Thomas Falkner - 21.04.07 um 03:04Ich 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".
-
--- wget-1.10.2_orig/src/ftp-basic.c 2005-06-19 15:47:10.000000000 +0200
-
+++ wget-1.10.2/src/ftp-basic.c 2007-04-21 14:17:33.000000000 +0200
-
@@ -977,7 +977,7 @@
-
uerr_t err;
-
-
/* Send LIST request. */
-
- request = ftp_request ("LIST", file);
-
+ request = ftp_request ("LIST -a", file);
-
nwritten = fd_write (csock, request, strlen (request), -1.0);
-
if (nwritten <0)
-
{
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.
Ultimate Tag Warrior: URL-Rewriting
Geschrieben von Thomas Falkner - 08.04.07 um 01:04UTW 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):
-
RewriteEngine On
-
RewriteBase /
-
RewriteCond %{REQUEST_FILENAME} !-f
-
RewriteCond %{REQUEST_FILENAME} !-d
-
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.
-
$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
-
// without trailing slash
-
$rules += $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%");
-
// with trailing slash
-
$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.
-
$wp_rewrite->add_rewrite_tag('%tag%', '([^/]+)', 'tag=');
-
// without trailing slash
-
$rules = $wp_rewrite->generate_rewrite_rules($baseurl . "%tag%") + $rules;
-
// with trailing slash
-
$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.
iPhoto Plugins programmieren
Geschrieben von Thomas Falkner - 15.03.07 um 01:03Hier und dort gibt es die passenden Anleitungen - und ich stehe jetzt in Zugzwang mit meinem Flickrplugin.
Allerdings bin ich mir noch unsicher, inwieweit die Anweisungen noch kompatibel zu iPhoto 6 sind. Jedenfalls wäre es wünschenswert, wenn Apple iPhoto 7 zum Anlass nehmen würde, endlich die API zu dokumentieren. Damit würden sich Apple vor allem selbst einen Gefallen tun: Denn letztlich wird die Anbindung an beliebige Fotodienste entscheidend für die Akzeptanz von iPhoto sein. Eine Software, die von Haus aus nur für die Dienste und in die Formate des Herstellers exportiert, sollte zumindest die Möglichkeit bieten mit geringen Aufwand eigene Exportfilter zu entwickeln.
Rubybuch für lau
Geschrieben von Thomas Falkner - 06.03.07 um 11:03Ruby ist eine sehr mächtige objektorientierte Programmiersprache, die aufgrund des ihr innewohnenden Prinzips der geringsten Überraschung im direkten Vergleich mit ähnlich leistungsfähigen Sprachen leicht erlernbar ist. Wem dazu die exzellente Dokumentation nicht genügt, erhält mit Mr. Neighborly’s Humble Little Ruby Book gegen eine kostenlose Registrierung ein didaktisch gut aufgebautes Lehrbuch.
Wer lieber auf toten Bäume liest, kann das Buch übrigens auch kaufen.
Das PHP-Manual lügt
Geschrieben von Thomas Falkner - 06.03.07 um 12:03Gehen wir von folgendem Codeschnippsel aus:
Wer vermag ohne Ausprobieren zu sagen, welchen Wert $a und welchen Wert $b hat?
Wäre PHP eine konsistente Programmiersprache, sollten $a und $b den gleiche Wert haben. Gemäß der Logik von PHP ist jedoch a == 'b' und b == 1.
Eine Sprache, die zu solchen Überraschungen führt, wird tatsächlich als besonders einsteigerfreundlich gehandelt. Als Argument für PHP wird neben der flachen Lernkurve immer wieder auf die hervorragende Dokumentation verwiesen. Wie gut kann wohl ein Manual sein, dass zu oben genannten Phänomen folgendes verklärt?
PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. For example, in Perl 'Z'+1 turns into 'AA', while in C 'Z'+1 turns into '[' ( ord('Z') == 90, ord('[') == 91 ). Note that character variables can be incremented but not decremented and even so only plain ASCII characters (a-z and A-Z) are supported.
Dass 'Z'+1 'AA' ergeben soll, halte ich für eine Lüge.