Einstieg in WebServices

Da ich bis nächste Woche Freitag (dann beginnt “endlich” das 7. Semester) neben meinem Praxisbericht zum Thema UML auch noch eine Hausarbeit zum Thema Webservices beenden muss, habe ich mich heute eingehend mit diesem Thema befasst. Habe auch einige hilfreiche Links zum Thema UDDI, WSDL und SOAP gefunden und abgelegt (FHWT → WebServices). Äußerst interessant was man mit ein wenig XML so alles machen kann…

Eine Seite, die recht einfach die Implementierung eines Webservices in PHP beschreibt, habe ich schon entdeckt, und wie ich dann mit C# darauf zugreifen kann, werde ich auch wohl noch herausbekommen. Ich freue mich auf jeden Fall schon auf die Implementierung, nachdem ich die ganze Theorie abgedeckt habe. Endlich mal wieder was in PHP programmieren! Eine gute Vorbereitung auf die Überarbeitung unseres Intranets. Das wird ne Riesenbaustelle… Aber die passende IDE habe ich bereits gefunden: EaysEclipse for PHP. Ein sehr gutes Programmpaket und, wie ich finde, auch bedeutend schneller als das damals von mir umständlich zusammengebastelte PHPEclipse.

Und mit LaTeX macht das Schreiben der Arbeit auch gleich doppelt Spaß: Die Grafiken verrutschen nicht, Quelltexte sind leicht erstellt (inkl. Zeilennummerierung) und die automatischen Verzeichnisse für Inhalt, Tabellen etc. werden wie von Zauberhand von selbst erstellt. Wie konnte ich nur fast 3 Jahre lang mit Word arbeiten? 😉

Abschied nehmen

…musste ich gestern von meinem ersten eigenen Auto. Nachdem es mir drei Jahre lang treu gedient hat, war nun der Zeitpunkt gekommen, an dem der Leasingvertrag auslief 😉 Aber mein neuer fahrbarer Untersatz ist schon bestellt und kommt hoffentlich diese Woche noch an…

Als Andenken an eine schöne Zeit gibt es hier mein kleines Wägelchen noch einmal in seiner vollsten Pracht zu sehen.

Mein erstes Auto: Ein Ford Fiesta Ghia in Mango Orange

Webseiten unter PHP in UTF-8 codiert ausgeben

Webseiten unter PHP als UTF-8 codiert auszugeben ist gar nicht so einfach, wie es vielleicht scheint. Nachdem ich mit dem Apache-Parameter AddDefaultCharset UTF-8 und der PHP-Einstellung default_charset = "utf-8" nicht zum gewünschten Ergebnis gekommen bin (Umlaute werden weiterhin als Fragezeichen (?) dargestellt), habe ich eine etwas umständliche aber praktikable Lösung gefunden.

Am Anfang jeder PHP-Datei habe ich zunächst den Output-Buffer aktiviert (ob_start();) um die Ausgaben von PHP nicht direkt als HTML auszugeben, sondern erst einmal zwischenzuspeichern. Dadurch kann ich vor der letztendlichen Ausgabe noch die Funktion utf8_encode() auf diese anwenden und alles als UTF-8 codiert ausgeben.

Damit ich nicht in jede einzelne Datei die nötigen Zeilen einfügen muss, arbeite ich mit zwei Includes, die als Kopf und Fuß jeder Seite inkludiert werden. Die Inhalte dieser Dateien sehen wie folgt aus (ich habe nur die für die UTF-8-Codierung relevanten Teile dargestellt):

header.inc.php

ob_start();

footer.inc.php

$content = utf8_encode(ob_get_contents()); ob_end_clean(); echo $content;

RSS-Feed für multiguestbook.com

Ich habe mal (aus Langeweile und weil ich schon immer mal einen eigenen RSS-Feed erstellen wollte) ein kleines Script geschrieben, dass es möglich macht, ein Gästebuch, wie es MultiGuestbook.com anbietet, in einen RSS-Feed umzuwandeln.

Das war eigentlich nicht sehr schwer. Die Gästebücher von MultiGuestbook werden als (zugegebenermaßen nicht gerade sauberes) HTML ausgegeben, und jeder Eintrag steht in einer eigenen Tabelle (die aus nur zwei Zellen besteht, von denen eine ausschließlich den Trennbalken enthält). Mit ein wenig RegEx-Zauberei, war es mir daher möglich, diese Einträge auszulesen und als RSS auszugeben.

Download

Das kurze Script gibt es hier zum Download: multiguestbook_rss.php

In dieses muss nur noch die Adresse des auszulesenden Gästebuchs (und optional Name und Beschreibung des Feeds) eingetragen werden und fertig ist das RSS-Feed. Im Moment funktioniert das Script leider nur für ein bestimmtes Layout (siehe hier). Aber es dürfte recht einfach an die übrigen Designs anpassbar sein, indem die RegExes ein wenig abgeändert werden.

C#: Gleitkommapräzision und Rundung

Was für ein Titel! 😀

Aber es ist durchaus einen Beitrag wert, sich mit der Präzision und Rundung von Gleitkommazahlen in C# auseinanderzusetzen. Gerade, wenn man (wie ich) an einem finanzmathematischen Programm schreibt, kann es sonst sehr schnell zu Problemen bzw. seltsamen Ergebnissen kommen. Da ich diese Erfahrung heute machen durfte (und ca. 50 Variablen von double auf decimal umstellen musste), dachte ich mir: Erleuchte die Nachwelt! 😉

Nun denn, ein Beispiel zum Einstieg. Man könnte meinen, 1000 * 0,3 seien 300, was auch richtig wäre. Aber C# behauptet, das Ergebnis sei ein klein wenig anders. Das folgende kurze Programm gibt den Wert in nachstehendem Screenshot aus.
static void Main(string[] args) { double x = 0; for (int i = 1; i <= 1000; i++) { x += 0.3; } Console.WriteLine(x.ToString()); Console.ReadLine(); }
Screenshot: Rechnen mit Gleitkommazahlen in C#

Bevor ich mich an einer Erklärung versuche, verlinke ich lieber auf eine sehr gute vorhandene: Fließkommadarstellung und Problembehandlung.

Nachdem ich das verdaut hatte, durfte ich also wie erwähnt meine gesamten Variablen auf decimal umstellen. Aber dafür lieferte mein Progrämmchen nun auch das richtige Ergebnis… nun, nicht ganz.

Leider gab es bei der Addition von 1400 (Test-)Werten genau 1 Cent Differenz. Nach einer (zugegeben aufwändigen und langwierigen Suche) konnte ich den Datensatz ausmachen, der den Fehler verursachte. Nur leider war der “Fehler” eine Eigenschaft der Methode Math.Round(), die ich zum Berechnen des Wertes eingesetzt habe. Diese rundet nämlich bei .5 nicht (kaufmännisch) auf, sondern ab (Eigentlich rundet sie noch ein wenig anders: immer zur nächsten geraden Zahl). Der nachfolgende Screenshot zeigt die seltsame Ausgabe dieses kleinen Programms:
static void Main(string[] args) { for (int i = 1; i <= 10; i++) { double x = 0.505 + i * 0.01; Console.WriteLine(x + " gerundet: " + Math.Round(x, 2)); } Console.ReadLine(); }
Screenshot: Rundung in C#

Nun denn. Den “Fehler” konnte ich recht einfach beheben, indem ich Math.Round() noch einen dritten Parameter mitgegeben habe: MidpointRounding.AwayFromZero. Danach, wird aus Math.Round(0.5, 2, MidpointRounding.AwayFromZero) auch tatsächlich 1.

Rise Against in Hamburg

Habe ich eigentlich schon erwähnt, dass ich zum Rise Against-Konzert nach Hamburg fahre? Die Karte habe ich von meiner Schwester zum Geburtstag bekommen, und werde somit meine (derzeitige) Lieblingsband zum ersten Mal live sehen. Das wird ein Spaß 😀

Rise Against

Habe leider bislang nur die Videos eines ihrer Auftritte in Italien sehen können, aber da ging’s schon tierisch ab. War eine sehr kleine Location… In Hamburg spielen Rise Against in der Markthalle mit A Wilhelm Scream und BERRI TXARRAK. Von den beiden Supportern habe ich noch nichts gehört, das sollte ich wohl mal schleunigst ändern. Als Belvedere damals bei Pulley als Vorband spielten, kannte ich die nämlich noch nicht, und habe mich somit um die Chance gebracht, ein super Konzert durch das Mitsingen der Texte noch zu verbessern 😉 Aber wie ich gerade sehe, bieten beide Bands MP3-Downloads auf ihren Seiten an…

Redesign der FHWT 2003 Seite

Ich hatte spontan den Einfall, meine FHWT 2003-Seite zu überarbeiten und suchmaschinenfreundlicher zu gestalten. Das hat nicht allzu lange gedauert, aber ich habe auch längst nicht alles verbessert, was ich vor knapp 3 Jahren als unwissender PHP- und HTML-Anfänger an Fehlern da reingebaut habe. Aber die gröbsten Schnitzer sind wohl raus:

  • DOCTYPE und META-Angaben sind korrigiert und optimiert.
  • Das Menü ist nun eine Liste und verlinkt Text und nicht mehr komische Dreamweaver-Austauschgrafiken.
  • Suchmachinenfreundliche URLs werden dank mod_rewrite verwendet. Keine GET-Parameter mehr in den URLs, sondern nur noch “statische” .html-Seiten.
  • Alle Seiten sind XHTML-konform.
  • Und naja, das Design ist natürlich auch erneuert…

Mal sehen, wie lange es dauert, bis wir bei Google wieder auf Platz 1 der Liste sind. Das war vor einiger Zeit ja schonmal der Fall. Und da die FHWT-Seite nicht XHTML-konform (53 Warnungen auf der Startseite, siehe Grafik), geschweige denn optimiert (z.B. Einatz von Layout-Tabellen) ist, kann das eigentlich nicht allzu lange dauern 😀

Ergebnis des HTML-Validators für www.fhwt.de

Da scheint Contenido (das bei der FHWT eingesetzt wird) wohl einige Probleme mit barrierearmen Seiten zu haben. Wie gut, dass ich mit Typo3 arbeite 😉

Kleiner Fehler im XBEL-Plugin

Mir ist da leider ein kleiner Fehler beim Anpassen des wp-xbel-Plugins unterlaufen. Anstatt die URLs der Links mittels htmlspecialchars() zu “entschärfen”, habe ich urlencode() verwendet. Dadurch werden z.B. auch die Doppelpunkte durch ihre hexadezimalen Entsprechungen ersetzt. Diese Adressen werden dann nicht als eigenständige URLs erkannt, sondern einfach an die Adresse der Bookmark-Seite angehängt und funktionieren somit leider gar nicht… wie gut, dass ich das Problem inzwischen behoben habe 🙂

Den besten Filmen aller Zeiten…

…wird auf Kabel 1 die Spannung genommen, bevor man sie gesehen hat.

Was bekommt man nicht alles mit, wenn man neben der ganzen Surferei den Fernseher laufen lässt und sich (weil nichts besseres kommt) in “Die besten Thriller aller Zeiten” einklinkt. Da lassen die doch tatsächlich die mehr oder weniger Prominenten “Kommentatoren” erzählen, wie die gerade noch als super spannend betitelten Filme ausgehen. Ähh… Danke schön!

Nicht dass ich “Schatten der Wahrheit” noch nicht gesehen hätte, aber vielleicht gibt es unter den anderen Zuschauern doch den ein oder anderen, der sich diesen (zugegebener Maßen wirklich äußerst spannenden) Film noch nicht angeschaut hat. Nun ja. Das kann man sich dann jetzt auch sparen 🙂

Danke Kabel 1!


UPDATE
: WOW! Auch “The Game” (immerhin verdient auf Platz 4) kann man kaputt machen. Wer sich den Film anschaut, und das Ende schon kennt, hat wirklich einen Fehler gemacht. Gut, dass das Ende bei Kabel 1 zu sehen war! Noch ein UPDATE: Vorsicht beim Wikipedia-Eintrag zu “The Game”. Da steht doch tatsächlich auch die Auflösung des Films… da sollte mal jemand ein “Spoiler-Plugin” entwickeln…
Letztes Update: Wohl sinnlos, sich darüber aufzuregen, dass auch vom 3. (Basic Instinct) und 2. (Das Schweigen der Lämmer) Platz das Ende verraten wird. “Sieben” ist auf Platz 1. Absolut verdient, wie ich finde. Oh, man kennt jetzt auch schon den Mörder… und das Ende! Yippieh. Damit hat uns Kabel 1 jetzt wohl die besten Thriller aller Zeiten… versaut!

Firefox-Bookmarks mit WordPress anzeigen

Seit geraumer Zeit nutze ich die Firefox Extension Bookmark Synchronizer SE, um meine Lesezeichen zwischen den verschiedenen PCs zu synchronisieren. Heute bin ich dann zunächst einmal auf Bookmark Sync and Sort umgestiegen, da bei dieser Erweiterung sogar das automatische Up- und Downloaden der Bookmarks beim Beenden bzw. Starten des Browsers funktioniert (und außerdem werden die Bookmarks auch noch schön sortiert).

Nun hätte ich aber auch gerne die Möglichkeit, diese Bookmarks in meinem Blog anzuzeigen, damit ich auch ohne meinen Browser von jedem beliebigen Ort darauf zugreifen kann. Das dürfte eigentlich kein Problem sein, denn die Extension speichert die Bookmarks im XBEL-Format auf meinem Server, sodass ich die Datei nur noch mit einem WordPress-Plugin auslesen muss.

Diese Idee hatte vor mir wohl schon jemand anderes: XBEL WP Plugin Aber leider gibt es zu diesem Plugin keine Download-Seite mehr… Nach einer kurzen Suche bin ich dann aber auf diese Seite gestoßen: crea-doo.at. Das dortige Plugin enthält zwar keinerlei Beschreibung, ist aber genau das, was ich gesucht habe. Zunächst einmal der Link zur endgültigen Seite: Meine Bookmarks.

Und jetzt die Erklärung, wie ich es gemacht habe 🙂

  1. Alle Dateien unter crea-doo.at herunterladen und im Plugin-Verzeichnis von WordPress speichern. Dazu muss das Verzeichnis wp-xbel angelegt werden, in dem die Dateien abgelegt werden.
  2. In der Datei wp-xbel.php können nun einige Einstellungen vorgenommen werden (z.B. ob die Ordner geschlossen oder geöffnet sein sollen etc.)
  3. Nun gilt es noch, das Plugin im Admin-Bereich zu aktivieren.
  4. Sooo… und wie bekommen wir die Bookmarks nun ausgegeben? Über den Aufruf der Funktion wp_xbel(). Ich habe das so gelöst, dass ich die Funktion einfach in mein Template für die Links-Seite eingebaut habe (links.php im Theme-Verzeichnis von WordPress). Das ganze sieht bei mir dann so aus: <div id="content"> <h1 class="pagetitle">Links</h1> <?php wp_xbel(); ?> </div>
    Jetzt muss nur noch eine Seite angelegt werden, die das Template verwendet, und fertig ist die Liste. Alternativ dürfte die Funktion auch aus einem Beitrag heraus mittels runPHP aufgerufen werden können.

Abschließend habe ich aber noch einige Verbesserungen an dem Plugin vorgenommen.

  • Die Überschrift “Lesezeichen” habe ich entfernt.
  • Den erzeugten Quelltext habe ich mit Zeilenumbrüchen und Tabstops verschönert.
  • Die Ausgaben habe ich mittels htmlentities(), htmlspecialchars() und urlencode() entschärft, um valides XHTML zu erzeugen.
  • Für die IDs der Ordner werden valide Namen verwendet.
  • Und als besonderes Schmankerl habe ich noch eine Funktion integriert, um einzelne Ordner aus der Liste auszuschließen (nützlich z.B. für die Toolbar oder private Lesezeichen). Hierzu sind einfach die Namen der Ordner an der richtigen Stelle in die Datei wp-xbel.php einzutragen (letzter Options-Punkt).

Download der modifizierten Version

Nach den Anpassungen gibt die Erweiterung nun valides XHTML aus und meine privaten Bookmarks bleiben privat. Damit habe ich das erreicht, was ich wollte 🙂

Wer es mir gleichtun will, kann meine Version hier herunterladen. Einfach die Dateiendung in php ändern und in das wp-xbel-Verzeichnis kopieren (alte Datei überschreiben).