0

Erlang Einführung – Teil 2 – Funs / Higher Order Functions

Posted by admin on Jan 31, 2009 in Coding, Erlang, Standard, Tutorials

Leider habe ich viel zu lange auf den zweiten Teil der Einführung in Erlang warten lassen. Und bevor ich überhaupt mit Ausreden anfange, fange ich lieber mit ganz konkreten Beispielen an.

Gegeben ist folgender Quellcode, welcher ein Programm zum Berechnen des Quadrats einer beliebigen Zahl bildet:

Das Programm besteht aus zwei Teilen, den Modulattributen und Funktionen.
Modulattribute sind in diesem Falle -module(func1) und -export([double/1]).

Modulattributen können sowohl vom Entwickler selbst definiert, wie auch aus einem Satz von Standardvorgaben eingesetzt werden.
Die Attribute -module und -export gehören zum Erlang-Standard, wobei -module zwingend ist, während -export nur dann eingesetzt werden sollte, wenn man bestimmte Funktionen für den Zugriff von Außen freigeben möchte. In diesem Falle ist es die Funktion double, die z.B. von der Erlang-Shell aus aufgerufen werden soll. Jede Erlang-Quelldatei muss eine Angabe über den aktuellen Modulnamen tragen und zwar innerhalb der Klammern des Attributen -module. Somit ist der Name der *.erl-Datei gleichzeitig auch der Name des Moduls. Nachdem dieses beispielsweise über den Aufruf c(MODULNAME). in der Shell kompiliert worden ist, wird eine neue Bytecode-Datei namens MODULNAME.beam angelegt. Und genau diese ist für die eigentliche Ausführung in der Erlang Virtual Machine gedacht. Dies ist mit Java *.class-Dateien vergleichbar, die aus gewöhnlichen *.java-Dateien gebildet werden, um dann in der JVM als Bytecode ausgeführt zu werden. Und wie bei sonstigen Erlang-Anweisungen auch, müssen diese beiden Attribute mit einem Punkt abgeschlossen werden.

Jedoch sollte noch geklärt werden, was die Angabe [double/1] zu bedeuten hat. Nun, da Funktionen mehrere Argumente akzeptieren können und in mehrfacher Ausführung vorhanden sein dürfen (d.h. mit gleichem Funktionsnamen, jedoch unterschiedlicher Anzahl von erwarteten Argumenten), ist die Angabe des Funktionsnames zusammen mit Slash + Zahl für die Anzeige der “Stelligkeit” (engl. “Arity”) einer Funktion notwendig. Mit “Stelligkeit” ist hier die Anzahl der “erwarteten Argumenten-Stellen” gemeint. Da unsere double-Funktion nur ein Argument erwartet, nämlich X, ist ihre Stelligkeit “eins” (1). Hätten wir z.B. weitere double-Funktionen, so müssten sich diese in der Stelligkeit voneinander unterscheiden, um von Erlang akzeptiert zu werden.

Nachdem wir mit Attributen dem Compiler die Umgebung vorgestellt haben, widmen wir uns der Funktion double. Sie besteht, nach Erlang-Terminologie, aus einem Headund einem Body. Zwischen diesen befindet sich ein stilisierter Pfeil, der vom Head auf den Body zeigt. Der Head ist dabei immer mit einem Funktionsnamen gefolgt von einem Klammerpaar und (optional) mit einer Argumentenliste innerhalb dieser versehen. Dabei werden mehrere Argumente durch Kommata voeinander getrennt. Als Argumente können sowohl Variablen wie auch Atome eingesetzt werden. Mit “Atome” sind konstante, nicht-numerische Werte gemeint, welche immer mit einem Kleinbuchstaben beginnen (im Gegensatz zu Variablen, welche immer mit einem Großbuchstaben anfangen). In unserem Falle kann double einen beliebigen Wert annehmen, welcher dann im Body mit sich selbst multipliziert wird. Und auch hier ist am Ende ein Punkt zu setzen.

Die Kompilierung des Programms ist denkbar einfach: Erlang-Shell starten und mit c(func1). die func1.erl-Datei kompilieren. Als Ergebnis erhält man ein sog. Tupel, welches aus dem Namen des Moduls und einem Atom “ok” besteht. Somit hat uns Erlang-Umgebung die Info geliefert, dass die Kompilierung erfolgreich verlaufen ist.

Da ich lokal das Ganze über Emacs laufen lasse, schaut bei mir die Ausgabe vielleicht etwas komplexer aus, als sie vielleicht sein sollte. Dennoch ist die Vorgehensweise dieselbe.

Jetzt können wir die exportierte Funktion double aufrufen. Dabei übergeben wir ihr den erwarteten Zahlenwert.

Als Ergebnis erhalten wir 144, was dem Quadrat von 12 entspricht. Der Aufruf selber ist recht einfach und erinnert entfernt an das Programmieren in C++, wenn es darum geht, die einzelnen Methoden den passenden Klassen/Namespaces zuzuordnen. In C++ wird die Zuordnung über sog. “Bereichsauflösungsoperatoren” erledigt (d.h. mit KLASSE::METHODE). Ähnlich wird auch bei Erlang verfahren, z.B. wenn es darum geht, die passende Funktion eines Moduls aufzurufen. Da es wohl recht viele “double”-Funktionen geben darf, muss sichergestellt werden, dass sowohl die richtige aufgerufen, wie auch die passende “Stelligkeit” befolgt wird. Es sind also zwei Sachen zu beachten: die passende Funktion über (optional viele) Module hinweg und dann noch die Funktion mit der gewünschten Stelligkeit (“Arity”) innerhalb eines Moduls. Hier ein leicht erweitertes Beispiel mit unserem bisherigen Modul.

Jetzt beinhaltet unser Modul eine weitere Version der double-Funktion. Diesmal ohne Argumente, d.h. mit Stelligkeit Null (0). Über diese Änderung muss auch der Compiler informiert werden, sofern wir vor haben, eine weitere Funktion zu exportieren. Daher wird die Liste in -export um einen Eintrag mehr erweitert. Die Listen werden in Erlang übrigens immer mit eckigen Klammern angegeben und ihre Elemente durch Kommata voneinander getrennt. In diesem Falle wäre es [double/0,double/1]. Nachdem wir die neue Modulversion kompiliert haben (in der unteren Fensterhälfte zu sehen), wird die neue double-Funktion aufgerufen (diesmal mit leeren Klammern, aber immer zusammen mit dem Modulnamen). Als Ergebnis erhält man 4, was genau den Vorgaben im Funktions-Body entspricht. So einfach kann Erlang sein. :)

Das ist aber nicht alles, denn in Erlang können Funktionen mehr als nur Werte zurückgeben und in mehrfacher Ausführung gleichzeitig vorhanden sein. In Erlang können Funktionen auch neue Funktionen als Ergebnis zurückgeben.

Noch einmal, zur Wiederholung: Funktionen können in Erlang neue Funktionen als Ergebnis zurückgeben. Oder Erlang-like ausgedrückt: wir können “higher-order-functions” basteln.

Hier ein kleines Beispiel:

Wir haben eine Variable Multiply, welche keinen direkten Wert zugewiesen bekommt, sondern vielmehr ein zunächst sonderbares Konstrukt:

fun(X,Y) -> 3 * (X + Y) end.

Was meint man damit?

Nun, die Bezeichnung fun habe ich mir, schon mal im Voraus, nicht ausgedacht, denn diese gehört zum Sprachumfang von Erlang. Dabei meinen wir mit dem Einsatz von fun, dass hier eine neue Funktion mit 3 * (X + Y) end. aufgebaut werden sollte. Dies bedeutet, dass wir in fun(X,Y) die Elemente eingesetzt haben wollen, welche später (im Funktions-Body) an die Stellen zum Einsatz kommen werden, wo jetzt 3 * (X + Y) end. steht, um einen neuen Wert zu berechnen. Somit steht Multiply stellvertretend für eine dahinter “eingebettete” Funktion, welche eben zwei Werte erwartet und nach einem bestimmten Algorithmus (hier: 3 * (X + Y)) rechnet. Diese “innere” Funktion wird auch durch das spezielle Schlüsselword end. auch explizit beendet. Ein fun wird immer mit einem end. abgeschlossen, damit Erlang diese richtig zuordnen und bei Bedarf auch “als Rückgabe-Wert” liefern kann.

Deshalb ist die Shell-Info beim ersten, oben abgebildeten Aufruf eben kein berechneter Wert, sondern vielmehr eine Erlang-Info die mit #Fun<erl_eval anfängt. Diese recht kryptische Ausgabe sollte aber niemanden verwirren, denn es handelt sich nur um Erlang-Internals, die für die Entwicklung selbst unerheblich sind. Wichtig ist nur zu wissen, dass damit Erlang zu verstehen gibt, dass es die Vorgaben evaluiert hat und in Zukunft überall dort wo Multiply steht eben diesen Algorithmus aktivieren wird. Ein simples Aufrufen von Multiply(3,3) gibt 18 aus und somit ist die Abarbeitung erfolgreich verlaufen. Für alle Entwickler die schon mal mit anonymen Funktionen zu tun hatten: “ja, dies sind anonyme Funktionen in Erlang“, was an sich kein Wunder ist, da anonyme Funktionen aus der funktionalen Programmierung kommen und Erlang eben “so ziemlich” funktional ist. ;)

Dies ist aber auch nicht alles, denn mit funs kann man noch viel mehr machen, wie in diesem Beispiel hier:

Hier haben wir einen weiteren Level-Of-Indirection eingebaut und eine fun deklariert, die wiederum eine weitere fun beinhaltet. Um die Verwirrung aber schon zu Anfang zu ersticken, fangen wir ganz langsam an und schauen uns die einzelnen Bestandteile genauer an:

MoreMultiply bekommt Folgendes zugewiesen: fun(HowMuch) -> (EINE WEITERE FUN EINGEBETTET)

Wie wir schon im ersten Beispiel erfahren haben, können Variablen eingebettete funs beinhalten. Hier aber befindet sich aber in der ersten fun fun(HowMuch) eine weitere fun, welche wir aus Gründen der Übersichtlichkeit nicht aufgeschrieben haben.

Was hat dies zu bedeuten?

Ganz einfach: die erste fun (nennen wir diese “die äußere”) erwartet ein Argument, welcher dann in der zweiten (der “inneren”) fun eingebettet wird. Die innere fun beinhaltet aber mehr als nur die Variable HowMuch, nämlich Value * HowMuch. Dies bedeutet, dass die innere fun erst gar nicht rechnen könnte, wenn die äußere fun keinen Wert an sie liefern würde. Und genau hier liegt die Bedeutung in dieser scheinbar unnötig komplexen Verzahnung. Die innere fun ist nämlich eine VERALLGEMEINERTE Ausführung eines einfachen Multiplikators, welcher aber eben nicht selber vorgibt, wie eines seiner Elemente multipliziert wird. Die SPEZIALISIERUNG also, in diesem Falle die Angabe HowMuch kommt aus der äußeren fun. Somit ist die Arbeitsteilung klar: die äußere fun sagt, wer der Multiplikator ist und die innere benutzt diesen dann, um kommende Werte (d.h. Value) mit ihm zu multiplizieren. Deshalb ist der Rückgabewert von MoreMultiply eben nicht ein berechnter Wert, sondern vielmehr eine der vielen möglichen Spezialisierungen der inneren fun. Und erst mit dieser zurückgegebenen Spezialisierung können Berechnungen durchgeführt werden. So wie im Beispiel oben. Und auch hier meldet sich zuerst die Erlang-Shell und gibt die Erfolgsmeldung aus, dass die Evaluierung OK sei. Danach weisen wir einer neuen Variable die von uns gewünschte Spezialisierung zu (der Name der Variable sollte sinnvollerweise die Spezialisierung dokumentieren). In diesem Falle haben wir uns entschieden, dass die innere fun alle zukünftigen Werte mal 2 nehmen soll. Daher auch die Angabe MoreMultiply(2). Jetzt können wir die in MakeDouble abgelegte (innere) fun anwenden und geben eine 5 ein. Das Ergebnis ist erst jetzt mathematischer Natur und heißt 10.

Eigentlich einfach, nur es braucht Zeit, bis man sich vom alltäglichen Schema WERTEINGABE -> BERECHNUNG -> AUSGABE befreit hat. Hier wird eben ALGORITHMUSAUFBAU -> WERTEINGABE -> BERECHNUNG -> AUSGABE angewandt. Wir basteln uns zuerst den Algorithmus zusammen und setzen ihn erst später ein. Fast so wie mit Möbeln bei Ikea ;)

So, das war’s für heute. Viel Spaß mit Erlang.


Tags: , , , ,

 
0

Kochbuch-Abmahner abgewatscht…

Posted by admin on Jan 21, 2009 in Abmahnwahn, Alltäglicher Schwachsinn, IT-Shit of the Week, Standard

Ich glaube nicht, dass die im Volksmund als “Kochbuch-Abmahner” bekannten Herrschaften Marion und Folkert Knieper so bekannt sind, wie so manch anderer Ab(W)mahnsinnige, dennoch lauert eine ziemlich große Gefahr auf jeden Internet-User, der sich wagen sollte z.B. per Google-Bildersuche ihre Fotos auf seine/ihre Webseite anzubringen.

Die berühmt-berüchtigte Webseite namens “Marions Kochbuch” (!!!absichtlich nicht verlinkt!!!) ist äußerlichem Anschein nach eine Kochbuch-Seite, zielt jedoch auf ein ganz anderes Klientel, um nicht zu sagen Opfer. Die gesamte Site ist so aufgebaut, dass sie leicht von Google und anderen Suchmaschinen indiziert wird, wobei sämtliche Bilder ohne einen klaren Copyright-Vermerkt angeboten werden. Hautpsache, dass sie gut platziert sind, sich leicht in Google finden lassen und natürlich auch “leicht integrieren lassen”. Zum Beispiel in irgendwelchen Foren oder privaten Webseiten.

Und schon flattern Mahnungen mit saftigen (oft mehrere Tausend Euro schweren) Forderungen ins Haus rein.

Ich möchte erst gar nicht auf den Inhalt diese vermeintlichen Koch-Site eingehen, denn so mache Information entputt sich als völlig falsch oder gar als schamlos abgeschriebene Passage aus beliebigen Lexikas.

Wie dem auch sei, dieses Abmahn-Pärchen hat jetzt vom OLG Hamburg einen Riegel vorgeschoben bekommen und dürfte es in Zukunft recht schwer haben, Ahnungslose abzumahnen.

Und Allen, die doch gerne gefahrlos ein paar nette Bildchen aus dem Themebereich Nahrung/Nahrungsmittel benutzen möchten, empfehle ich diese Webseite: www.lebensmittelfotos.com

Lebensmittelfotos.com

Garantiert abmahnfrei, wie es im Untertitel diese Site geschrieben steht.

Ach jeeee, Sachen gibt’s….Kochbücher die Abmahnen, vermeintliche Gangsta-Rapper die bei ihrer Mutti wohnen und Kids abmahnen für Songs, die sich selbst nicht geschrieben haben, Bundensministerinnen die gerne Kinderpornografie (d.h. das Internet selbst) zensieren lassen würden, aber dann unfreiwillig über veröffentlichte KInderporno-Sperrlisten die Verbreitung derselben indirekt unterstützen….

Ich brauch’ ‘n Bier….

Tags: , ,

 
0

Science vs. Faith

Posted by admin on Jan 21, 2009 in Atheism, Standard

Tags: , , , , , ,

 
0

Who killed the electric car?

Posted by admin on Nov 15, 2008 in Standard

Google Video

Writer/Director Chris Paine’s documentary feature film Who Killed the Electric Car? premiered at the Sundance Film Festival in 2006 before its release by Sony Pictures to critical acclaim in 100 U.S. markets. The film was the third highest-grossing theatrical documentary of 2006 and screened with An Inconvenient Truth in many markets.

Who Killed the Electric Car? and Chris Paine were nominated by the Writer’s Guild for Best Documentary of 2006. The film also received nominations from The Broadcast Critics Awards and The Environmental Media Awards for Best Documentary of 2006. The film won the audience award at the Canberra International Film Festival and won a special jury prize at the Mountain Film Festival.

Tags: , , , , , , , , , ,

 
0

Atheist

Posted by admin on Nov 7, 2008 in Atheism, Standard


It is far better to grasp the universe as it really is than to persist in delusion, however satisfying and reassuring.

–Carl Sagan

I am an Atheist – For a freethinking world

Tags: , , , , , , , , , , , , , , ,

 
0

Richard Dawkins on Bill Maher 11 April 2008

Posted by admin on Oct 21, 2008 in Atheism, Must See, Standard

Tags: , , , , , , ,

 
0

Erlang – The Movie

Posted by admin on Oct 18, 2008 in Coding, Erlang, Standard

Tags: , , , , , , ,

 
0

Unser täglich Spam gib uns heute…

Posted by admin on Dec 19, 2007 in Standard

Seit einigen Tagen habe ich, welch ein Wunder in heutiger Zeit, mit Spams in Blog-Kommentaren zu tun. An sich eine (leider) typische und zu erwartende Tatsache. Nicht, dass dies ein Indikator dafür wäre, dass mein Blog bekannt ist und die Anzahl der Spams damit zu tun hat. Damit hat es bestimmt nicht zu tun und es ist eine Seltenheit heutzutage geworden, trotz Internet (oder vielleicht gerade deswegen?), dass wir überhaupt wahr genommen werden. Wir sind anonym! Nicht anonym im Sinne des unbekannt-seins, sondern eher als unerkannt-sein, ungelesen-sein und letztendlich nicht-wahr-genommen werden. Also eher passiv anonymisiert, denn durch eine aktive Tat, wie z.B. durch falsche Informationsangaben, Avatare und diffuse Worte.

Das Internet macht die Verknüpfung von Informationen leichter, die zwischen den Menschen nicht unbedingt.

Egal, Schwamm drüber, denn auch heutzutage ist es keine Schande zu heiraten oder zumindest einen (Lebensabschnitts)partner zu haben. Dafür braucht man ja auch kein Internet, nicht einmal ein Handy. ;)

Jedoch, wer braucht Spam, frage ich mich?

Umsonst werden diese lästigen Bytes nicht verschickt, denn es ist mittlerweile in vielen Ländern eine Straftat, Spams zu versenden. Und dennoch werden sie so oft in den digitalen Äther abgesandt, dass mittlerweile über 90% der E-Mails Spam sind.

Qui bono?

Wem nützt es, wenn solche “Nachrichten” unsere Mailboxen mit unerwünschten Lipiden vollpumpen und dadurch die (nie da gewesene) “heile Welt des Internets” immer ähnlicher der Welt wird, in der wir uns immer noch befinden, auch wenn manche von uns sogar in Internet-Cafes schlafen (in Japan gibt es solche Kreaturen z.B.).

Selbst wenn ich zwanzig Spams in der Mailbox vorfinde, werden sie schon auf Grund der irrationalen Betreff-Zeilen gelöscht. Oder gibt es jemanden, den ein solcher E-Mail-Betreff zum Weiterlesen animiert:

“Improve your XXX”, “Make her happy with your new dick”, “Pump it up, baby! Viagra makes it possible!”

Also, gehe ich einfach davon aus, dass auch bei uns Menschen die Evolution (immer noch) voranschreitet und nur die wenigsten unter den intelligenten, nackten Zweibeinern solche “Nachrichten” gänzlich durchlesen würden.

Wem nützt es also, um die Frage zu vervollständigen, wenn sie in den Mailboxen landen, auch wenn die meisten von ihnen nicht gelesen werden?

Mail-Spammer werden nach Menge abgesandten Spams bezahlt, soviel steht fest, denn die Drahtzieher sind irgendwelche Internet-Casinos, obskuren Anabolika-Drogerien, Briefkastenfirmen, Sex-Shops, dubiose Finanzhaie etc.

Irgendwie macht es keinen Sinn, denn ich kann mich wirklich nicht (mehr) beklagen, dass ich ein Spam-Problem habe. Beziehungsweise, muss ich mich fragen, ob die Schmerzschwelle etwas höher bei uns geworden ist, da wir die täglichen 20 Spams nicht mehr als störend empfinden?

Verstumpfen wir, angesichts des eigentlich verlorenen Kampfes gegen Spammer? Über 90% aller Mails sind Spam, also ist das Spiel (der Kampf?, der Krieg?) verloren.

Gab es überhaupt einen Kampf gegen Spam?

Nicht einmal die grundlegendsten Sicherheitsfunktionalitäten hatte das ursprüngliche (und immer noch vorhandene) Internet und mit dem IPv6 wird es noch mindestens ein-zwei Jahrzehnte dauern, also warum sich wegen Spam Fragen stellen?

Nicht einmal die Grundlagen des TCP/IP-Protokollstacks wurden mit entsprechenden Sicherheitsfeatures ausgestattet, also warum sollten sich die höheren Schichten des Stacks in Sachen Sicherheit grundlegend in deren Bauweise unterscheiden.

Wenn es möglich ist ein “ping of death” auszuführen, d.h. eine auf tiefen Schichten des TCP/IP-Protokolls basierenden Schaden zu provozieren, warum sollte es da nicht möglich sein, unaufgefordert, millionenfach auf ein kleines Subnetz mit Spams zuzuschlagen.

Ich denke, mit dem Internet ist es wie mit den meisten Erfindungen der Menschheit. Zuerst wird sie nicht beachtet und die Entwickler werden als Spinner abgetan (was im Falle des Internets nicht auftrat, aber meistens passiert). Und irgendwann mal “entdeckt” man, dass die Erfindung auch “etwas anderes” möglich machen kann (z.B. WWW, SMTP etc.) und stürtzt sich auf die Realisierung. Mit der Zeit wird aus der ursprünglichen Idee eine Neukombination verschiedener “Module” und das Ursprungskonzept mutiert zu einem hippen, neumodischen Kunststück, welches alle “unbedingt haben wollen”, ja haben müssen.

So entstehen kritische Nutzermassen, d.h. irgendwann mal wird der Zeitpunkt erreicht, wo jede(r) es haben muss. Wo man einfach ohne nicht mehr kann.

Jedoch sind kritische Nutzermassen nur in ihrer Anzahl kritisch, nicht in ihrem Urteilsvermögen. Und so endet man ja schließlich: in der Masse kann einem nur ein Teller zum Auslöffeln vorgesetzt werden, Menükarten gibt’s nicht.

Friss oder stirb!

Ertrage Spam, oder kein SMTP für dich, ertrage Browser-Hijacking oder kein WWW für dich, ertrage DDoS-Attacken oder kein Internet im Allgemeinen für dich.

Und genau das bildet den idealen Nährboden für die verschiedensten Kreaturen, die sich der mittlerweile zahlreich vorhandenen Masse und deren Unwissenheit bedienen, um ihre mehr oder minder freundlichen Absichten in die Tat umzusetzen.

Es lebe der freie Informationsaustausch, denn auch Spams sind Informationen. ;)

Aber kein Wissen. Und genau das macht, bzw. sollte den Unterschied ausmachen.

Den Unterschied zwischen einer reinen Informations- und einer Wissensgesellschaft.

In welcher Gesellschaft wollen wir denn leben?

 
0

Web 2.0 bald Blase 2.0

Posted by admin on Nov 21, 2007 in Standard

Ich erinnere mich noch sehr gut an die “guten, alten” Zeiten, wo irgendwelche mehr oder weniger obskuren “Coder” Millionen €/US$ einsackten, ohne irgendetwas dafür zu liefern. Es war wirklich eine Goldgräberstimmung. Jedoch mit dem kleinen, aber sehr wichtigen Unterschied: Goldgräber finden schon Gold….lausige Programmierer kriegen keinen vernünftigen Code hin, egal wieviele Millionen man in diese reinpumpt.

Aber, mal ehrlich…wer ist denn schon so bescheuert, um irgendwelchen halb-Yuppies so viel Knete in die Hand zu drücken, ohne gecheckt zu haben, ob die’s auch halten können, was sie verspechen?

Selber schuld, Pech gehabt…Gier macht nun mal blind, blöd und letztentdlich auch bankrott.

Ich, für meinen Part, habe schon Popcorns und Cola vorbereitet und warte auf das furiose Ende der Nachfolge-Blase für das Nachfolge-Web 2.0.

Lustig, zu sehen, dass Humanoide es trotz aller Erfahrung, aller schlauen Texte, Bücher, Interviews immer noch nicht lernen wollen: Gier zahlt sich nicht aus!

Auch die “New Economy” basiert (bzw. sollte basieren) auf alten Tugenden wie Fleiß, Ehrlichkeit, klare Pläne, wenig Hype und viel Schweißarbeit.

Aber, sagen sie’s doch den Web 2.0 Fanatikern mit ihrer “voll-geilen” Social-Software.

Allen anderen, die doch lieber nachdenken wollen, empfehle ich den Besuch der Nachfolgeseite des legendären dotcomtod’s.

 
0

Die allerersten Bytes…

Posted by admin on Nov 20, 2007 in Standard

Willkommen auf meinem Blog. Noch nicht viel los hier, aber bald soll/wird sich dies ändern….

Copyright © 2012 Reality.SYS All rights reserved. Theme by Laptop Geek.