Blogverzeichnis - Blog Verzeichnis bloggerei.de Bloggeramt.de
Blog Top Liste - by TopBlogs.de
Facebook Profil

Archiv für die Kategorie „Development“

Omen

Was muss ich heute als neues Mitglied in der Doctrine-Group bei Google sehen? Das:

image

Ein böses böses Omen. :) :) :)

Nebenbei: Doctrine ist ein OR-Mapper (abstrakt gesagt, ein Weg zur Datenbankanbindung) für PHP. Kein eben schlechter, wie ich zugeben muss.

  • Share/Bookmark

REST, WCF (Windows) und PHP (Linux/Apache2) mit JSON Kodierung – Teil 1

Ich habe einige Zeit gesucht, bis ich die richtigen Antworten hatte. Aber auf welche Frage? Nun, wie lasse ich eine in C#/.NET3.5 entwickelte Anwendung mit einem Webserver kommunizieren, ohne die ganze Kommunikationsschicht selber bauen zu müssen? Die kurze Antwort darauf lautet: WCF, REST und JSON. Die lange Antwort möchte ich hier nun auch in Form eines Tutorials geben.

Im ersten Teil dieses Tutorials werde ich die Erstellung eines REST Services unter PHP erklären. Der zweite Teil folgt später und wird die Erstellung eines Clients in C# beinhalten.

Kurzer Exkurs zu REST (vereinfacht)

Was ist denn REST überhaupt? REST ist die Abkürzung für Representational State Transfer. Es ist eine Spezifikation für die Kommunikation mit Diensten in sogenannten Hypermedia-Informationssystemen wie das World Wide Web. Die Kommunikation findet dabei über HTTP statt. Aufrufe von Funktionen REST implementierter Dienste werden dabei in der aufgerufenen URL kodiert. Beispielsweise sieht die URL für den Aufruf einer Funktion namens “foo” möglicherweise folgendermaßen aus: http://www.meinserver.de/rest/foo

Aufrufparameter, sofern erforderlich, werden dabei im Inhalt des HTTP Requests übermittelt. Aus diesem Grund sollten serverseitig Funktionen, die Argumente erfordern, so implementiert sein, dass sie über die HTTP Methode “POST” (statt standardmäßig “GET”) erreicht werden. Näheres dazu weiter unten. Man kann Aufrufparameter auch über die HTTP Methode “GET” übermitteln, sie landen dann in der URL in der Form

<url>?parameter1=wert1&parameter2=wert2

und so weiter. Ist im Endeffekt Geschmackssache, wirkt sich aber auf die Implementierung sowohl der Funktion serverseitig als auch des Interfaces clientseitig aus. Ich beschreibe in diesem Blogpost nur die Vorgehensweise bei der Implementierung mit HTTP Methode POST für Funktionen mit Parametern (ohne Parameter ist eigentlich immer GET).

Wer ist dieser JSON?

JSON (JavaScript Object Notation) ist eine Syntax, mit der Daten, Objekte, Variablen in Textform über beispielsweise das Web übermittelt werden können. Näheres dazu findet man bei Wikipedia. Das Format selber ist für dieses Tutorial nicht wichtig, da WCF und PHP so gut wie alles selber machen und hier auch mal sehr kompatibel erscheinen.

Den Apache vorbereiten

Damit wir überhaupt mit REST arbeiten können, müssen wir dem Apache noch sagen, dass er alle Anfragen, die auf nicht existierende Dokumente führen, auf eine PHP Datei umlenken soll. Standardmäßig wird das die index.php sein. Um ihm dies zu sagen, benötigen wir im Document Root der Webanwendung eine Datei namens “.htaccess”. Diese muss folgendes beinhalten:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule .* index.php [L]

Außerdem muss das Modul mod_rewrite aktiviert sein. Näheres dazu kann man aber auch ergooglen. Was macht nun diese Datei? Sie sagt dem Apache, dass alles (“.*”), was nicht (“!”)

  • eine existierende Date (“-f”)
  • ein existierendes Verzeichnis (“-d”)
  • ein existierender Symlink (“-l”)

ist, auf die index.php umgelenkt werden soll. Außerdem aktiviert es in der ersten Zeile die Rewrite Engine natürlich.

Der REST Server

Als REST Server verwende ich eine PHP Anwendung auf einem Apache/Linux System. Ein REST Server ist relativ schnell implementiert. Wir brauchen eine Weichen-Funktion, die bei jedem Aufruf des PHP Dokuments (ich verwende hier ausschließlich die index.php; andere Namen sind natürlich möglich, dann muss aber der Eintrag in der .htaccess Datei entsprechend angepasst werden) ausgeführt wird:

<?php	function RESTServer()
	{
		$callback = NULL;

		if(preg_match('/rest\/([^\/]+)/', $_SERVER['REQUEST_URI'], $m))
		{
			if(isset($GLOBALS['RESTmap'][$_SERVER['REQUEST_METHOD']][$m[1]]))
			{
				$callback = $GLOBALS['RESTmap'][$_SERVER['REQUEST_METHOD']][$m[1]];
			}
		}
		else
		{
			return FALSE;
		}

		if(is_callable($callback))
		{
			$data = NULL;

			if($_SERVER['REQUEST_METHOD'] == 'GET')
			{
				$data = $_GET;
			}
			else if ($tmp = file_get_contents('php://input'))
			{
				$data = json_decode($tmp);
			}

			header("{$_SERVER['SERVER_PROTOCOL']} 200 OK");
			header('Content-Type: application/json');

			print json_encode(call_user_func($callback, $data));
		}
		else
		{
			header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found");
		}
		return TRUE;
	}

?>

Diese Funktion wird bei jedem Aufruf des Dokuments ausgeführt. Sie holt sich die aufrufende URL (wie oben erwähnt: aufgrund der Umleitung in der .htaccess Datei landet jeder Aufruf, der nicht direkt ein existierendes Dokument anspricht, auf der index.php) und extrahiert daraus, sofern in URL und auch in der Function-Map (siehe weiter unten) vorhanden, die aufgerufene REST Funktion. Stimmt die URL nicht mit der Konvention “<url>/rest/function” überein, so kehrt die Weichen-Funktion mit einem FALSE zurück. Hat die URL jedoch das entsprechende Format, so schaut die Funktion in die Function-Map, ob sie zur HTTP Methode und zum Funktionsnamen einen Eintrag findet. Konnte in der Function-Map kein entsprechender Eintrag gefunden werden, so sendet die Weichen-Funktion ein HTTP 404 (nicht vorhanden) an den Client, der entsprechend reagiert.

Die Function-Map

Was aber ist nun diese ominöse Function-Map? Im Grunde ist es nichts anderes als ein mehrdimensionales Array, das folgendermaßen aussieht:

<?php	/********************************************************************************
		REST function mappings for access via HTTP GET method
	*********************************************************************************/
	$GLOBALS['RESTmap'] = array();

	$GLOBALS['RESTmap']['GET'] =
		array(
		);

	$GLOBALS['RESTmap']['POST'] =
		array(
		);

	$GLOBALS['RESTmap']['PUT'] =
		array(
		);

	$GLOBALS['RESTmap']['DELETE'] =
		array(
		);
?>

Wir legen also eine globale Variable mit dem Namen RESTmap als Array an. Sie erhält vier Einträge, jeweils einen für die entsprechende HTTP Aufrufmethode GET, POST, PUT und DELETE. PUT und DELETE lasse ich außen vor, beziehe mich in diesem Text nur auf GET und POST.

Jeder Eintrag des Arrays ist wiederum selbst ein assoziatives Array (d.h. mit Namen als Index, statt Nummern). Um nun eine PHP-Funktion beispielsweise mit dem Namen “get_Foo” über REST erreichbar zu machen, muss man sie folgendermaßen in diese Map eintragen:

<?php
	$GLOBALS['RESTmap']['GET'] =
		array(
			'foo' => 'get_Foo',
		);
?>

Ein Aufruf der URL “http://blahblubb/rest/foo” führt also nun dazu, dass eine PHP-Funktion namens get_Foo aufgerufen wird. Ihr Rückgabewert wird in JSON kodiert an den Aufrufer zurückgegeben. Man muss also dafür sorgen, dass die Daten, die man gerne clientseitig verarbeiten würde, in Form eines Objektes oder eines Arrays oder einer Variablen per return zurückgegeben werden. Die Kodierung übernimmt unsere oben beschriebene Weichen-Funktion. Eine beispielhafte Implementierung der foo-Funktion:

<?php
	function foo()
	{
		return "Hallo Welt!";
	}
?>

PHP kodiert den Rückgabewert dann am Ende der Weichen-Funktion in einen JSON Term und sendet ihn an den Client zurück (ein Browser würde ihn also anzeigen oder eventuell, aufgrund des Content-Types, auch als Download anbieten; jedenfalls reagiert mein FireFox mit einem Downloadfenster auf solch eine Antwort).

Soweit zum serverseitigen Teil der Verbindung.

Die Implementierung des Clients folgt in Teil 2

  • Share/Bookmark

Namespacing bei E-Mail Adressen

Fefe brachte mich darauf, dass man bei sendmail Namensräume für E-Mail Adressen verwenden kann. Das sieht dann so aus:

blahblubb+hallowelt@meinsendmailserver.de

Eine Mail an diese Adresse würde bei einem solchen Server an blahblubb@meinsendmailserver.de weitergegeben. Das hat den Vorteil, dass man damit quasi “markieren” kann, wofür man eine solche Mail-Adresse verwendet hat. Man kann damit leicht ermitteln, wer die verwendete E-Mail-Adresse weitergegeben hat, wenn man darauf auf einmal Spam empfängt (man sieht’s dann ja im “To:”-Header). Voraussetzung dafür ist natürlich, dass

1. der Betreiber der Webseite, bei der man sich damit registriert hat, den Namensraum bei der Weitergabe drin behält, respektive der Bot, der die Adressen ab sammelt, diesen nicht automatisch entfernt und

2. das Registrierungsformular der jeweiligen Webseite solche Mail-Adressen akzeptiert

Letzteres ist leider oft nicht der Fall, wie ich leidlich feststellen musste. Darum mein Aufruf an alle Webseitenbetreiber und Entwickler von Content Management Systemen und anderen Frameworks, wo man sich registrieren kann: lasst in euren Registrierungsformularen Namensräume zu, um zur Eindämmung von Spam beizutragen!

  • Share/Bookmark

bahn.de – was ich mir wünschen würd

Eine Schnittstelle, sei es als XML-RPC oder so wie die Google-API das macht oder halt sonst wie standardisiert, mit der ich schlicht und einfach Fahrplan-Daten aus einem eigenen Programm heraus abfragen kann. Völlig banal, im Grunde.

Gibt’s das? Nö! Aber was erwarte ich auch von der Bahn?!

Ich bastel nämlich gerade an ‘nem Tool, das mir meinen aktuellen Vorlesungsplan vernünftig aufgeschlüsselt darstellen kann. Da würde ich gern eine Funktion einbauen, mit der ich mir, nach Eingabe meines Wohnortes, die beste Bahnverbindung für den entsprechenden Tag automatisiert ausgeben lassen kann.

Aber neeeee, geht nicht. Selbst die Idee, die Abfrage über das HTML Formular der Website zu simulieren hab ich ad acta gelegt. Ist mir zu aufwändig, mich dort durch den Source Code zu wühlen.

Die Bahn kommt… *hust* nicht in die Hufe. *kopfschüttel*

  • Share/Bookmark

CitiesXL Demo – Method verify Access failed – Workaround

Bei vielen Spielern der Demo von CitiesXL tritt statt eines normalen Starts die Fehlermeldung “Method verify Access failed” auf. Dieses Problem scheint mit Windows Vista zusammen zu hängen. Es gibt nun zwei Methoden, das Problem zu beheben. Die 1. ist, das Spiel im Windows 98 Kompatibilitätsmodus zu starten. Dies soll aber bei einigen zu Problemen mit der Performance geführt haben. Die 2. Methode ist eine Änderung an der CitiesXL_Game.exe. Dazu nun im Folgenden eine…

Anleitung zum Modifizieren der CitiesXL_Game.exe

Ausführung der folgenden Schritte auf eigenen Gefahr! Ich übernehme keine Haftung für irgendwelche Effekte, die die Änderung haben könnte. Man sollte diese Änderungen nur dann ausführen, wenn man weiß, was man da tut.

  1. Backup der original CitiesXL_Game.exe anfertigen!
  2. öffnen der CitiesXL_Game.exe aus dem CitiesXL Demo Ordner in einem Hex-Editor (beispielsweise UltraEdit)
  3. an Position 0x000012C3 muss der Hex-Wert 84 stehen. Diesen in 85 ändern. Falls dort nicht 84 steht, lasst es lieber bleiben!
  4. abspeichern und Hex-Editor schließen
  5. Spiel normal starten

Damit sollte (!) es auch ohne Kompatibilitätsmodus funktionieren. Tut es jedenfalls bei mir.

 

Hier nochmal ein Screenshot von der Änderung:

CitiesXL_Game.exe_modification

  • Share/Bookmark

TrueCrypt Automounter in der Mache…

Ich arbeite zur Zeit an einem kleinen Programm, das es mir ermöglicht, meine Laufwerke unabhängig von der Zuteilung der IDs in Vista automatisch zu mounten. TrueCrypt selbst ist dazu nicht in der Lage, weil es die Favoriten nur vom Index und vom DiskIndex der jeweiligen Partition abhängig mountet, die Vista gern mal beim Booten verbiegt.

Es gibt da ein paar gute Programme, die mir allerdings alle nicht 100% zusagen. Darum bau ich mir so’n Ding nun selber. Ein Screenshot von einer sehr frühen Version des Tools:

image

Mal sehen, wie weit ich mit dem Projekt komme, bevor es mir wieder einschläft. :)

  • Share/Bookmark

Gemütliche Eisblöcke vs. Leucht-Obst

OLED gibt’s schon lange. Organic Light Emitting Diode – eine organische LED, die unseren Beleuchtungsmarkt revolutionieren soll. Energiesparend, modern, preiswert, flexibel. Besser also als die im Volksmund liebevoll als Glühbirne bezeichnete betagte und bald verbotene Glühlampe. So heißt es jedenfalls werbend aus der Richtung der Hersteller dieser Leuchtmittel.

Doch wie schaut nun eine Lampe mit einer OLED überhaupt aus? Dazu hier ein kleines Video (Quelle: Golem):

Praktisch mögen sie sein, die Lampen der Zukunft. Energiesparend sehr wahrscheinlich auch. Doch frage ich mich eines: wie passt eine solche Lampe in das Wohnzimmer einer durchschnittlichen Familie, möglicherweise sogar vom Lande? Junge Leute, die sich gerade ihr eigene Wohnung einrichten, Singles, junge Pärchen, zu ihnen und auch zum restlichen Equipment im jugendlich modern eingerichteten Wohnzimmer kann dieses und ähnliche Designs passen. Doch in ein gemütliches Kamin-Zimmer mit antiken Sesseln, Stuck-Decken, Fresken, Parkett-Fußboden mit Flokati mag das kalte moderne Design nicht so recht passen.

Es muss also eine Form her, die zum Ambiente passt. Schwierig wird es sein, die alte Birne mit ihrem jahrhunderte alten Charme durch OLEDs oder Leuchtstofflampen zu ersetzen. Sie ähneln der Glühlampe zwar inzwischen in ihrer Form, möglicherweise senden sie auch ein ähnliches Licht aus, doch ist sie unter einem Glas-Schirm nicht zu übersehen, denn transparent gibt es sie noch nicht.

Hat man eine Lampe, die den Blick auf den Leuchtkörper ungehindert durchlässt, so muss man sich fragen: will man die Lichtquelle zu jeder Tageszeit unübersehbar im Raum schweben haben? Macht man sich lieber auf die Suche nach einem neuen Lampenschirm, der die hässliche neue weiße Birne gekonnt versteckt? Oder schließt man sich den vielen Menschen an, die sich nun aufgemacht haben, die letzten Vorräte der noch verfügbaren guten alten Glühbirne aufzukaufen und das Unvermeidliche damit ein Stück hinaus zu schieben?

Ich bin der Meinung, der Hersteller, der dieses Leuchtmittel zu 100% am Markt etablieren will, muss dafür sorgen, dass es auch zu 100% optisch mit der Glühbirne und den zugehörigen Lampen vereinbar ist. Es darf auf den ersten Blick kein Unterschied zu erkennen sein.

  • Share/Bookmark

Waffen kotzen (updated)

Ich muss mal eine Lanze brechen für ein Unternehmen, das ich vor einigen Jahren noch genau so verflucht habe, wie so manch anderer: Microsoft. Was habe ich damals zeitweise geflucht. Auf das Betriebssystem aus dem Hause Microsoft, auf deren Verhalten am Markt (Monopolitis), auf deren Support-Politik etc. Was haben die an Schrott produziert, den trotzdem jeder irgendwie haben wollte oder musste?! Tja. Und heute? Heute motzt jeder über Vista. Scheint immer noch in zu sein, Microsoft für seine Produkte zu verdammen. Aber…

Was stört an Vista wirklich? Was ist es, das dieses Produkt so benutzerunfreundlich macht, daß jeder darüber lästert und meckert? Was machen andere Betriebssysteme besser? Linux. Mac. Wobei ich zugeben muss, daß ich bei letzterem nicht mitreden kann. Ich kenne es nicht. Linux hingegen kenne ich durch meinen Arbeitsplatz sehr gut. Ich habe bereits ein Linux From Scratch gebaut (rein aus Sourcen), was nicht viele von sich behaupten können. Ich kenne Linux. Und ich kenne Windows. Und ganz ehrlich: was Microsoft mit Windows Vista abgeliefert hat, übertrifft in Sachen Stabilität und Benutzerfreundlichkeit meiner Meinung nach alle bisher von Microsoft entwickelten Betriebssysteme und bezüglich Benutzerfreundlichkeit auch (noch) Linux.

Ich benutze Vista nun schon eine ganze Weile. Mein Ehrenwort drauf: ich hatte bis jetzt noch keinen einzigen Absturz, der dazu geführt hätte, daß ich den Reset-Knopf betätigen musste. Einige wenige Neuinstallationen waren nötig; das liegt aber an meiner eigenen Unordnung. Ich hab die blöde Angewohnheit, mein System mit der Zeit immer mehr vollmüllen zu lassen mit diversen Anwendungen, Tools, Spielen, etc. Ich deinstalliere selten etwas. Vista verhält sich da jedoch wesentlich dickfelliger, als XP oder 2000 oder gar 95/98/ME. Vista bleibt stabil, wird kaum langsamer. Klar, der Bootvorgang dauert länger, je mehr Autostartprogramme und Dienste man installiert, aber das ist unter XP/2000 und auch unter Linux ebenso der Fall.

Die neue Sicherheitsmaßnahme UAC mag den ein oder anderen stören. Sie lässt sich abschalten. Aero finden die einen schick (ich auch), die anderen nicht. Es lässt sich abschalten. Alles andere ist eine Sache der Gewöhnung; wie überall anders auch. XP war gegenüber 2000 sicher auch eine Umgewöhnung. 2000 gegenüber NT, respektive 95/98/ME (letzteres, das gebe ich zu, war wirklich Schrott) sicherlich auch.

Also frage ich: Was ist an Vista so mies, daß jeder darüber meckert? Wirklich stichhaltige Argumente habe ich bisher keine finden können.

Update: okay… Also DAS finde ich dann auch nicht gut. Benutzer, die bereits ein Vista besitzen, sollen erst im April in den Genuss des neuen Service Pack 1 kommen (per Auto Update). Alle, die sich Vista erst jetzt zusammen mit einem neuen PC zulegen, bekommen das SP1 schon JETZT. Dreck! Sauerei! Gut, da kann Vista nichts für. Das ist Produktpolitik bei Microsoft. Das macht Vista nicht besser oder schlechter, als es ohnehin schon ist.

Ein weiterer Punkt, wo ich Microsoft wirklich loben muss, ist die Entwicklung der Laufzeitumgebung .NET.

Kurz gesagt, .NET ist ein Framework für Windows-Anwendungen. Das beschreibt aber lange nicht einmal nur oberflächlich, was .NET wirklich ist. Ich kann das nur aus Sicht eines Softwareentwicklers sagen: .NET ist für die Windows-Entwicklung eine Offenbarung. Insbesondere C#.NET, allen voran die neue C# Version des .NET Framework 3.5, WPF, WCF etc.

Beispiel: die Entwicklung von Datenbank-Anwendungen hat damit eine Einfachheit erlangt, wie nie zuvor. Man hat eine Liste von Objekten (oder anderen Daten, völlig egal aus welcher Quelle), man möchte diese auf der Oberfläche darstellen und auch verändern können. In Windows Forms war es damals noch nötig, die Verbindung zwischen Oberfläche und Datenbasis auszuprogrammieren. In WPF gibt es nun das DataBinding (gab’s auch schon in früheren Versionen, aber nicht derart komfortabel). Man sagt dem Programm in der Beschreibungssprache XAML lediglich, wie die Daten dargestellt werden sollen, bindet die Liste an ein Oberflächen-Objekt (beispielsweise eine ListBox) und WPF erledigt den Rest. Bearbeiten von Werten inklusive.

LINQ ist ein weiterer Edelstein Microsoft’scher Technologie. Language INtegrated Query bietet einem die Möglichkeit, in C# mit einer an SQL angelehnten Abfragesyntax Listen von Objekten zu filtern, zu sortieren und zu modifizieren, bevor diese Listen beispielsweise mit foreach weiterverarbeitet oder über DataBinding einem GUI Control zugewiesen werden. Früher musste man, um eine Liste in foreach nach einem Wert zu filtern, innerhalb der Schleife abfragen, ob dieser Wert zutrifft oder nicht und entsprechend mit continue reagieren. Mit LINQ ist dies nicht mehr nötig. Eine where-Klausel in der LINQ Query und schon arbeitet die foreach-Schleife nur noch mit den ausgesuchten Objekten. Eine order by-Klausel in die Query und schon ist die Liste auch noch sortiert. Einfacher geht es kaum.

Das ist nur ein kleines Beispiel dessen, was Microsoft hier abgeliefert hat. Es fehlt noch ein bisschen was, aber alles in allem hat das, womit Microsoft uns seit spätestens 2007 versorgt, wahrlich Hand und Fuß.

Gegenargumente, Kritik und weitere Beispiele für die vorzügliche Arbeit der MS-Entwickler sind natürlich gern gesehen!

  • Share/Bookmark

eBay Extension für TYPO3

Ich hab mir mal die Mühe gemacht, eine TYPO3 Extension zu entwickeln, die einem die Artikel eines bestimmten Verkäufers anzeigt. Sie befindet sich noch im Anfangsstadium, kann aber unter http://www.buechner-grimm.de/ebay.html (bitte JavaScript aktivieren) schon mal begutachtet werden.

Ich habe sie auch soeben im TER zur Verfügung gestellt. Version 0.0.1 Experimental, wie immer, wenn ich was neu reinpacke. Ext.Key lautet svq_ebay. Sie benötigt die t3mootools Extension.

Ach ja, just for Info: man braucht auch ‘nen eBay API Key, der frei erhältlich ist, muss sich also als Developer registrieren, wenn man die Extension einsetzen will.

  • Share/Bookmark

Bastelwastel

Hab gebastelt… mir war langweilig, und mich nervte das ständige manuelle Umformatieren der Chatlogs für German-Bash.org. Da hab ich mir gedacht, ich bau mal ‘n Programm, das das macht.

And here it comes…

Bedienungsanleitung

Einfach Chatlog einfügen, Nicknames einzeln markieren und über den Button “Add selected text as nickname” als solche der Liste hinzufügen und dann auf “Format it!” klicken. Alles, was vor den Nicknames bis zum Anfang der Zeile kommt, wird entfernt, die Nicknames mit <> umschlossen und Doppelpunkte nach den Nicks entfernt. Der Rest bleibt wie er ist.

Was sagt ihr dazu? Ein essenzielles Must Have und völlig sinnbefreit oder?! :D

Update: So, nachdem ich da nochma drübergeschaut hab, heißt das Programm jetz im Setup auch nicht mehr “Setuo”, sondern korrekterweise “GBO Formatt0r”. Außerdem funktioniert es jetzt auch. :)

  • Share/Bookmark
 

You need to log in to vote

The blog owner requires users to be logged in to be able to vote for this post.

Alternatively, if you do not have an account yet you can create one here.

Powered by Vote It Up

SEO Powered by Platinum SEO from Techblissonline