Laravel 4: Installation ein neuen Projekts

Im ersten Teil des Laravel 4 – Tutorials soll es um das Aufsetzen eines neuen Projekts gehen. Ich gehe einfach mal davon aus, daß Ihr keine PHP-Neulinge seid und Euch die entsprechende LAMP-, WAMP oder sonstige Umgebung einrichten könnt.

Systemvoraussetzungen

Laravel 4 hat einige wenige Voraussetzungen an Euer System. Benötigt werden

  • PHP in der Version 5.3.7 oder höher,
  • die MCrypt PHP Extension sowie
  • die Versionsverwaltung Git.

Sind diese Voraussetzungen erfüllt, kann es auch schon losgehen.

Laravel installieren

Ladet Euch zuerst die aktuelle Version von Laravel 4 herunter! Den Inhalt dieses ZIP-Archivs entpackt ihr nun in ein Verzeichnis auf Euren Server. DocumentRoot muß dabei das Verzeichnis public sein.

Sollten Ihr auf Euren System noch keinen Composer installiert und systemweit zur Verfügung haben, ist jetzt der Zeitpunkt, dieses nachzuholen. Die Datei composer.phar packt Ihr am besten in das Wurzelverzeichnis Eures Projekts. Jetzt fehlt nur noch ein Aufruf:

php composer.phar install

 
Hat der Composer sein Werk vollendet, habt Ihr fast eine lauffähige Laravel 4 – Applikation. Ihr müßt nur noch dafür sorgen, daß der Webserver auf die Verzeichnisse unterhalb von app/storage schreibend zugreifen darf.

Im nächsten Artikel besprechen wir dann den Aufbau eines Laravel 4 – Projekts.

Write Your Own Auth-Driver for Laravel 4

Because of some requests I translated my post Ein eigener Auth-Driver in Laravel 4. Enjoy it!

Laravel 4 comes along with two authentication drivers: Database und Eloquent. It is perfect for databases with PDO-drivers. But if you want to authenticate a user against other databases like MongoDB or web services etc., you have to do some work. Implementing an own auth-drive in Laravel 4 is a little bit different than in Laravel 3, so I want to tell you how it works.

Configuration

At first we have to tell Laravel which auth-driver we want to use. We will do it in app/config/auth.php. There we will find a line

'driver' => 'eloquent',

Here we will declare our own auth-driver. In this post the driver is named example. Therefore, we modify the line as follows:

'driver' => 'example',

That is not enough. Laravel will comlain that is does not know an auth-driver called example. We have to declare how to use the driver example. We will do it app/start/global.php. Just add the following block:

Auth::extend('example', function($app) {
    $provider =  new \Example\Auth\ExampleUserProvider();

    return new \Illuminate\Auth\Guard($provider, $app['session']);
});

The UserProvider

Now we get to the core of the matter: We have to implement the class ExampleUserProvider. This is a possible implementation:

<?php

namespace Example\Auth;

use Illuminate\Auth\UserProviderInterface,
    Illuminate\Auth\GenericUser,
    Example\Domain\User\Service\UserService,
    Example\Domain\User\Entity\User;

class ExampleUserProvider
    implements UserProviderInterface
{
    /**
    * @var UserService
    */
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    } 

    /**
     * Retrieve a user by their unique identifier.
     *
     * @param  mixed  $identifier
     *
     * @return \Illuminate\Auth\UserInterface|null
     */
    public function retrieveByID($identifier)
    {
        /** @var User $user  */
        $user = $this->userService->findUserByUserIdentifier($identifier);

        if (!$user instanceof User) {
            return false;
        }

        return new GenericUser([
            'id'       => $user->getUserIdentifier(),
            'username' => $user->getUserName()
        ]);
    }

    /**
     * Retrieve a user by the given credentials.
     *
     * @param  array  $credentials
     *
     * @return \Illuminate\Auth\UserInterface|null
     */
    public function retrieveByCredentials(array $credentials)
    {
        /** @var User $user  */
        $user = $this->userService->findUserByUserName($credentials['username']);

        if (!$user instanceof User) {
            return false;
        }

        return new GenericUser([
            'id'       => $user->getUserIdentifier(),
            'username' => $user->getUserName()
        ]);
    }

    /**
     * Validate a user against the given credentials.
     *
     * @param \Illuminate\Auth\UserInterface $user
     * @param  array  $credentials
     *
     * @return bool
     */
     public function validateCredentials(\Illuminate\Auth\UserInterface $user, array $credentials)
     {
         $validated = $this->userService->validateUserCredentials(
             $credentials['username'],
             $credentials['password']
         );

         $validated = $validated && $user->userName = $credentials['username'];

         return $validated;
     }
}

In Laravel 4 a UserProvider has to implement the UserProviderInterface and with it the methods

  • retrieveByID($id),
  • retrieveByCredentials($credentials) und
  • validateCredentials($user, $credentials).

The User-Object

Auth::user() allows to access the logged in user. But int the session Laravel only stores the ID. If we want to access the other data of the logged in user, we have to retrieve it from the database or another source. This is the job of the method retrieveById($id).

retrieveById($id)

You have to pass an ID as parameter. This can be an integer, a string or any other type.

The method has to return an object implementing the interface UserInterface. In the simple case – like in this example – it is the GenericUser that comes along with Laravel. The returned object has to have the property id, because it is stored in the session.

Authentication

Auth::attempt($credentials) kicks off the authentication. In Laravel 4 the authentication is done in two steps. At first retrieveByCredentials($credentials) finds a user satisfying the credentials. In the second step validateCredentials($user, $credentials) checks whether the return object fits to the credentials.

It seems that there is Dwork done twice, but it makes sense. It is not always possible to find a user by username and password. In the example above we can only find a user by its username. In the DatabaseUserProvider, that comes along with Laravel 4, the user is found by its password. In both cases you have to check, whether the credentials fits to the user object. Furthermore it makes testing easier.

retrieveByCredentials($credentials)

You have to pass an array $credentials as parameter. Typically it contains the keys username und password. Basically it is the developers choice, which data are passed. It is just important that you get the object you want.

The method has to return an object implementing the interface UserInterface too. In the simplest case it is the GenericUser.

validateCredentials($user, $credentials)

You have to pass an object $user implementing UserInterface and an array $credentials as parameters.

True will be returned if $user and $credentials matches, otherweise false will be returned.

Conclusion

Implementing an own Auth-Drivers in Laravel 4 is no rocket science. Just implement a UserProvider with these three methods, declare it to thes ssystem and tell the system that you want to use it.

Laravel 4 Tutorial

Laravel ist cool. Die Version 4 befindet sich in der Beta-Phase und so wird es nur noch eine Frage der Zeit sein, bis wir uns an Laravel 4 erfreuen können. Das ist Grund genug, sich näher damit zu beschäftigen. Deswegen plane ich dieses Tutorial.

Welche Themen werden behandelt werden?

  • Installation
  • Aufbau eines Laravel 4 – Projekts
  • Konfiguration
  • Routing
  • Controller
  • Views & Responses
  • Requests & Input
  • Datenbankzugriff
  • Eloquent ORM
  • Query Builder
  • Schema Builder
  • Redis
  • Templates
  • Pagination
  • Cache
  • Events
  • IoC Container
  • Lokalisierung
  • Mails
  • Queues
  • Sessions
  • Sicherheit
  • Validierung
  • Unit Tests

Ob es in genau dieser Reihenfolge abgehandelt wird, kann ich noch nicht sagen. Solltet Ihr Wünsche bezüglich weiterer Themen oder der Themenreihenfolge haben, so nutzt die Kommentarfunktion teilt sie mir bitte mit!

Die einzelnen Teile des Tutorials werde ich in diesem Artikel verlinken.

 

Ein eigener Auth-Driver in Laravel 4

Laravel 4 bringt von Haus aus zwei Auth-Driver mit: Database und Eloquent. Damit sind die Datenbanken, für die es PDO-Treiber gibt, gut abgedeckt. Möchte man einen User jedoch gegen andere Datenbanken, z.B. MongoDB, oder vielleicht gegen einen Webservice etc. authentifizieren, muß man selbst Hand anlegen. Da sich die Verwendung eines eigenen Auth-Drivers in Laravel 4 gegenüber Laravel 3 geändert hat, möchte ich die Funktionsweise vorstellen.

Konfiguration

Zuerst muß man Laravel mitteilen, welche Treiber man verwenden möchte. Dies passiert in der Datei app/config/auth.php. Dort finden wir die Zeile

'driver' => 'eloquent',

 
Diese müssen wir ändern und unseren eigenen Treiber angeben. In diesem Artikel soll der Name des Treibers example sein. Daher ändern wir die Zeile wie folgt:

'driver' => 'example',

 
Das ist natürlich noch lange nicht hinreichend. Laravel wird sich – völlig zu Recht – beschweren, daß es damit nichts anfangen kann. Wir müssen natürlich auch noch bekannt geben, wie man an den Treiber example herankommt. Dies passiert in der Datei app/start/global.php. Dort wird einfach folgender Block eingefügt:

Auth::extend('example', function($app) {
    $provider =  new \Example\Auth\ExampleUserProvider();

    return new \Illuminate\Auth\Guard($provider, $app['session']);
});

Der UserProvider

Die Klasse ExampleUserProvider müssen wir natürlich auch implementieren und damit kommen wir zum eigentlichen Kern des eigenen Auth-Drivers. Eine mögliche Implementierung sieht so aus:

<?php

namespace Example\Auth;

use Illuminate\Auth\UserProviderInterface,
    Illuminate\Auth\GenericUser,
    Example\Domain\User\Service\UserService,
    Example\Domain\User\Entity\User;

class ExampleUserProvider
    implements UserProviderInterface
{
    /**
    * @var UserService
    */
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    } 

    /**
     * Retrieve a user by their unique identifier.
     *
     * @param  mixed  $identifier
     *
     * @return \Illuminate\Auth\UserInterface|null
     */
    public function retrieveByID($identifier)
    {
        /** @var User $user  */
        $user = $this->userService->findUserByUserIdentifier($identifier);

        if (!$user instanceof User) {
            return false;
        }

        return new GenericUser([
            'id'       => $user->getUserIdentifier(),
            'username' => $user->getUserName()
        ]);
    }

    /**
     * Retrieve a user by the given credentials.
     *
     * @param  array  $credentials
     *
     * @return \Illuminate\Auth\UserInterface|null
     */
    public function retrieveByCredentials(array $credentials)
    {
        /** @var User $user  */
        $user = $this->userService->findUserByUserName($credentials['username']);

        if (!$user instanceof User) {
            return false;
        }

        return new GenericUser([
            'id'       => $user->getUserIdentifier(),
            'username' => $user->getUserName()
        ]);
    }

    /**
     * Validate a user against the given credentials.
     *
     * @param \Illuminate\Auth\UserInterface $user
     * @param  array  $credentials
     *
     * @return bool
     */
     public function validateCredentials(\Illuminate\Auth\UserInterface $user, array $credentials)
     {
         $validated = $this->userService->validateUserCredentials(
             $credentials['username'],
             $credentials['password']
         );

         $validated = $validated && $user->userName = $credentials['username'];

         return $validated;
     }
}

 
In Laravel 4 muß ein UserProvider das UserProviderInterface und damit die Methoden

  • retrieveByID($id),
  • retrieveByCredentials($credentials) und
  • validateCredentials($user, $credentials)

implementieren.

Das User-Objekt

Mit Auth::user() kann man auf die Daten des eingeloggten Users zugreifen. Laravel speichert in der Session jedoch nur die ID. Wollen wir auf die anderen Daten des eingeloggten Users zugreifen, müssen diese erst von der Datenbank oder einer anderen Quelle bezogen werden. Die Aufgabe übernimmt die Methode retrieveById($id).

retrieveById($id)

Als Parameter wird eine ID übergeben. Dies kann ein Integer, ein String oder aber auch ein anderer Datentyp sein.

Als Rückgabe wird ein Objekt erwartet, welches das Interface UserInterface implementiert. Im einfachsten Fall ist dies, wie im Beispiel, der mitgelieferte GenericUser. Das zurückgegebene Objekt muß unbedingt die Property id haben, denn diese wird in der Session gespeichert.

Die Authentifizierung

In Laravel 4 erfolgt die Authentifizierung, die mit Auth::attempt($credentials) angestoßen wird, in zwei Schritten. Im ersten Schritt wird mit retrieveByCredentials($credentials) ein User gesucht, welcher die Credentials erfüllt. Im zweiten Schritt wird mit validateCredentials($user, $credentials) geprüft, ob das im ersten Schritt zurückgegebene Objekt zu den Credentials paßt.

Das mag auf den ersten Blick doppelt gemoppelt erscheinen, ergibt aber durchaus Sinn. Nicht immer besteht die Möglichkeit, nach Username und Passwort zu suchen. Im obigen Beispiel steht nur die Suche anhand des Nutzernamens zur Verfügung. Im mitgelieferten DatabaseUserProvider wird der entsprechende Nutzer nur anhand des Passworts gesucht. In beiden Fällen besteht also die Notwendigkeit zu prüfen, ob die andere Angabe auch zu dem Nutzer paßt. Außerdem ist so einfacher zu testen.

retrieveByCredentials($credentials)

Als Parameter wird ein Array $credentials übergeben. Typischerweise sind hier die Schlüssel username und password enthalten. Im Prinzip ist es aber dem Entwickler überlassen, welche Daten hier übergeben werden. Wichtig ist nur, daß man damit an die gewünschten Daten kommt.

Zurückgegeben wird auch hier ein Objekt, welches das Interface UserInterface implementiert. Das ist im einfachsten Fall der GenericUser.

validateCredentials($user, $credentials)

Als Parameter werden hier ein Objekt $user, welches das Interface UserInterface implementiert, sowie ein Array $credentials übergeben.

Als Rückgabe wird true oder false erwartet, je nachdem, ob $user und $credentials zusammenpassen oder nicht.

Zusammenfassung

Das Implementieren eines eigenen Auth-Drivers in Laravel 4 ist kein Hexenwerk. Es muß ein UserProvider mit drei Methoden implementiert werden, dieser muß dem System bekannt gemacht werden und schlußendlich muß man festlegen, daß man diesen Treiber verwenden will.

Der Geist der Weihnacht

„Weihnachtsmann!“ wurde der Rauschebart aus seinen Gedanken gerissen. Der sah verträumt aus dem Fenster, den Schneeflocken beim Tanzen zu. Und er schaute auch auf die Schneeflocken, die sich auf den Dächern, den Fenstersimsen, den Bäumen sowie der restlichen Landschaft zur Ruhe gelegt hatten. Auf dem Hof blinkten bunte Lichter. Wichtel sausten emsig umher. Der Becher war gefüllt mit köstlichem Glühwein. Das Pfeifchen dampfte. Alles wirkte so idyllisch. Aber es war Dienstbesprechung.

„Weihnachtsmann, könntest Du bitte den Zeitplan absegnen?“ nervte der versammlungsleitende Wichtel erneut. „Bitte entschuldigt! Ich war eben abwesend. Wie lautet denn der Zeitplan noch mal?“ „Heute back ich, morgen brau ich und übermorgen hole ich der Königin ihr Kind. Hihihi.“ kicherte Küchenwichtel Kasimir aus der hinteren Ecke des Zimmers. Die anderen Wichtel drehten sich um und schauten den Schelm finster an. „Ich geh dann mal Glühwein kochen.“ sprach der Kochwichtel und verzog sich, bevor einer der Blicke ihn töten konnte.

„Also, noch mal zum Zeitplan. Heute werden noch einmal die Listen durchgegangen und die Geschenke auf Korrektheit überprüft und der Schlitten vorbereitet. Morgen werden die Last-Minute-Geschenke eingepackt und Rudi wird betankt. Dafür brauchen wir jede Menge Glühwein. Und übermorgen werden dann die Geschenke verteilt. Ist das so in Ordnung?“ „Nein.“ sprach der Weihnachtsmann. Die Wichtel schauten ihn entsetzt an. „Am Montag habe ich keine Zeit. Da habe ich meine Skatrunde. Wir verteilen die Geschenke am Dienstag.“ Die Wichtel schauten noch entsetzter.

„Aber, aber, aber…“ japste der Geschenkeverteilungskoordinator Gregor. „Wenn wir die Geschenke nicht Heiligabend verteilen, gerät die ganze Zeit aus den Fugen und dann geht wieder die Welt unter – zumindest für die Kinder.“ „Ach“, winkte der Weihnachtsmann ab, „ob das Spielzeug einen Tag eher oder später langweilig wird, ist doch völlig egal. Montags wird Skat gespielt!“ „So geht es aber nicht!“ sprach Rechtswichtel Randolf. „Wir haben Verträge zu erfüllen. Termingerecht. Sonst gibt es keine Fördermittel von der EU mehr und die Renten sind auch in Gefahr. Du gehst am Montag nicht zum Skat! Punkt!“

„Aber zu zweit kann man doch kein Skat spielen. Wie soll ich das meinen Skatbrüdern erklären?“ erwiderte de Rotkittel. „Ach, Weihnachtsmann! Niemand will Heiligabend Skat spielen. Da wollen alle nur Geschenke auspacken und reichlich essen. Also, ist der Zeitplan abgesegnet?“ „Ja.“ grummelte der Rauschebart. „Wenn es sein muß.“

Irgendwie hatten die Wichtel ja recht. Ohne EU-Fördermittel müßte der Weihnachtsmann seinen Glühwein schließlich selber bezahlen. Die Altersvorsorge war dem Weihnachtsmann im Prinzip egal, da berufsbedingt lebenslänglich arbeiten muß, aber seine Wichtel wollten ja alle irgendwann mal in ihren wohlverdienten Ruhestand gehen. Das hatte er mit der Wichtelgewerkschaft so vereinbaren müssen. Er nahm einen Schluck Glühwein und harrte der nächsten uninteressanten Tagesordnungspunkte.

Nach ein paar Minuten aber döste er – verständlicherweise – weg. So viel Bürokratie! Früher ging die Geschenkeverteilerei doch auch einfach so – ohne Formulare, ohne optimierte Prozeßketten, ohne langweilige Besprechungen, ohne unartige Kinder. Ach, nein, die gab es leider immer. Als der Weihnachtsmann wieder aufwachte, beendete der Posten Wunschzettelannahme seinen Bericht: „Abschließend bleibt festzuhalten, daß das Wunsch- und Wunschzettelaufkommen konstant geblieben ist. Lediglich die Anzahl der Express- und Übernachtbestellungen hat deutlich zugenommen.“ „Expressbestellungen? Übernachtbestellungen?“ staunte der Rotkittel. „Machen wir denn sowas?“ „Nur, wenn der Wunschzettel am 23.12. eingereicht wird.“ erwiderte ein Wichtel und alle brachen in ein schallendes Gelächter aus. Nachdem sich alle wieder beruhigt hatten, meinte er weiter: „Nein, im Ernst, wir liefern nur am 24. Dezember. Deswegen sind wir auch so effizient.“ Die Sitzung war vorüber und alle machten sich wieder an ihre Arbeit. Nachdem alle Geschenke kontrolliert wurden und alle Listen abgearbeitet waren wurde der Tag mit der traditionellen Feuerzangenbowle beendet – so wie jeder andere Tag auch. Man kann ja schließlich nicht nur Glühwein trinken.

Als der Weihnachtsmann am nächsten Tag erwachte, vernahm er einen eher untypischen Lärm vom Hof. Er blickte auf den Hof und sah viele Wichtel aufgeregt mit Keschern umherspringen. ‚Nanu‘, dachte sich der Rauschebart, ‚es ist doch gar nicht Jahreszeit für Schmetterlinge.‘ Er ging zum Frühstück und wurde dort aufgeklärt. „Es ist eine Katastrophe, lieber Weihnachtsmann. Ein neugieriger Lagerwichtel hat den Kanister mit dem Geist der Weihnacht geöffnet und nun ist dieser entkommen.“ „Ach, herrje!“ stöhnte der Rotkittel und nahm erstmal einen kräftigen Schluck von seinem mehrfach entkoffeinierten Glühwein. „Das ist wahrlich nicht gut. Aber mit Netzen bekommen wir den auch nicht eingefangen. In der Küche sollen sie sofort einen neuen ansetzen. Da müssen wir morgen eben etwas sparsamer sein.“ Zur Erklärung: Beim Geist der Weihnacht handelt es sich um eine psychoaktive Substanz, welche vom Weihnachtsmann während des Fluges großzügig über der Zivilisation verteilt wird. Sie sorgt für eine zwei bis drei Tage anhaltende Euphorie und Glückseligkeit.

Die Küchenwichtel taten, wie ihr Chef ihnen geheißen hatte und am nächsten Morgen war der Kanister wieder gefüllt, zumindest bis zur Hälfte. „Naja“, sprach der Weihnachtsmann, „es ist zwar nicht viel, aber für ein bis zwei Tage wird es wohl halten.“ Er setzte sich auf seinen vollgepackten Schlitten, ein gut angeheiterter Rudi wurde eingespannt und die Wichtel verabschiedeten ihn. „Und trink ja keinen Glühwein von Fremden. Am Ende wachst Du wieder irgendwo in der Wildnis auf und der Schlitten ist weg.“ Die Wichtel kicherten, der Rauschebart verzog das Gesicht. Daß sie ihn aber auch jedes Jahr wieder an diesen peinlichen Vorfall erinnern mußten.

Das Rentier setzte sich in Bewegung, der Schlitten mit ihm und schon bald waren sie in den Lüften verschwunden. Kaum hatten sie ihre Reisehöhe erreicht, löste der Weihnachtsmann seinen Gurt und goß sich einen Becher Glühwein ein. Er nahm einen kräftigen Schluck und vernahm auf einmal ein leises „Hihihihi!“. „Was gibt es denn zu kichern, Rudi?“ „Das war ich nicht.“ erwiderte das Rentier. „Hihihihi!“ machte es da schon wieder. „Aber irgendwer kichert doch! Ich war es nicht und wir sind nur zu zweit.“ „Hihihihi!“ kicherte es schon wieder.

„Ach du heiliges unanständiges Wort!“ rief auf einmal Rudi und wurde bleich im Gesicht, so daß die rote Nase noch viel mehr zur Geltung kam. „Was ist denn los?“ fragte der Rotkittel, doch in dem Moment, wo er die Worte sprach, sah er es selbst: Da vorn, hinter der elften Wolke links, schwebte ein riesiger Geist.

Der Schlitten näherte sich langsam der riesigen Gestalt und der Weihnachtsmann rief ihn an: „Hohoho, Großer Geist! Wer bist Du denn?“ „Hihihihi!“ kicherte das Wesen. „Das weiß ich nicht. Hihihi! Aber wenn ich durch diese kleinen Wesen da unten durchfliegen, dann fangen sie erst an zu grinsen und hüpfen dann völlig lustig umher. Hihihihi!“ ‚Unanständiges Wort nochmal!‘ dachte sich der Rauschebart. ‚Das muß der Geist der Weihnacht sein, der gestern entwichen ist. Und jetzt bringt dieser verrückte Junge mit seinen Späßen harmlose Menschen in die Klapse. Was mache ich nur? Was mache ich nur?‘

„Ich habs!“ rief er auf einmal laut. Offensichtlich hatte er eine Idee. Rudi schaute ihn fragend an, der Geist der Weihnacht ebenso. „Sag mal, Geist, denkst Du, Du kannst durch alle Menschen gleichzeitig durchfliegen?“ „Nein“, erwiderte dieser. „Dafür bin ich bestimmt zu klein.“ Der Geist schaute traurig zu Boden. Nun, durch den Schabernack, den er trieb, hatte er schon einiges an Größe verloren. Das macht aber nichts, denn der Weihnachtsmann hatte ja eine Idee. Er gab dem Geist den Kanister mit dem neu angesetzten Geist der Weihnacht und Rudi bekam eine Thermoskanne voll Glühwein. „Ihr trinkt jetzt um die Wette und dann versucht ihr, alle Menschen gleichzeitig zu erreichen.“ Beide nickten eifrig und stürzten sogleich die Getränke hinunter. „Hihihihi!“ kicherte der Geist der Weihnacht und verteilte sich sofort über die ganze Welt, Rudi verteilte seinen Mageninhalt zum Glück nur auf dem Acker, über den sie gerade flogen.

Weihnachten war wieder einmal gerettet. Die Menschen waren so glücklich, daß er eigentlich keine Geschenke hätte verteilen müssen. „Das spreche ich bei der nächsten Dienstversammlung einmal an.“ sprach er zu sich selbst, nahm noch einen kräftigen Schluck Glühwein und verlor sich wieder in Gedanken.

Verbesserung des MP3-Einkaufserlebnisses?

Hallo Amazon!

Wie Du sicher Deiner Buchhaltung entnehmen kannst, gebe ich bei Dir gern einen dreistelligen Betrag im Monat für Musik aus, zum Teil für CDs, zum Teil für MP3-Downloads.

Für mich als DJ sind MP3-Downloads ungemein praktisch: Ich kann auf viele Wünsche meiner Gäste eingehen, ohne – wie früher – gleich ganze Alben kaufen zu müssen.

Bisher war der MP3-Einkauf bei Dir wunderbar einfach: Ich legte die Songs in den virtuellen Warenkorb, ging damit virtuell zur Kasse und nach dem Bezahlvorgang startete der Amazon-Downloader und legte im Hintergrund auf der Festplatte ab – schön sortiert nach Künstler und Album.

Leider gibt es jetzt den Amazon Cloud Player und der hat mein Einkaufserlebnis massiv verschlechtert. Daß ich jetzt jeden Song einzeln kaufen muß, stört dabei noch am wenigsten. Daß ich statt einer Rechnung gleich fünf Rechnungen erhalte, ist auch kein größeres Problem. Aber ich möchte die Musik nicht nur kaufen und bezahlen, sondern auch auf meiner Festplatte haben. Nur dort nutzt sie mir etwas!

Ich begab mich also auf die Suche nach meiner Musik. Nach etlichen Klicks gelangte ich dann auch zum Amazon Cloud Player. Doch, ach, da war nicht nur mein heutiger Einkauf, nein, da waren alle meine MP3-Einkäufe. Das ist keine so kleine Liste. Und es gibt keine Möglichkeit, nach Kaufdatum zu sortieren. Ich ging also die Liste anhand meiner fünf Bestellbestätigungen durch und markierte meine neu erworbenen Stücke. Das ist eigentlich schon viel mehr Arbeit, als ich mir beim Musikkauf machen möchte.

Aber es wurde noch schlimmer. Ich klickte auf den Button Herunterladen (19) und bekam die Mitteilung, daß mir der Amazon Downloader nicht mehr zur Verfügung stehe und ich bitte die Songs einzeln herunterladen möge. Hallo, Amazon, gehts noch? Da ich mir die Musik nicht (nur) zum Vergnügen gekauft habe, blieb mir leider nichts anderes übrig, als Stück für Stück einzeln herunterzuladen und den passenden Speicherort für jedes Stück selbst auszuwählen.

So macht das Einkaufen keinen Spaß. Ich bin mächtig sauer. Daher auch meine klare Ansage: Wenn das Kaufen von MP3s nicht wieder so einfach wird, wie es das bis vor Kurzem war, gebe ich mein Geld demnächst woanders aus.

Suchbegriffe Oktober 2011

Über folgende Suchbegriffe sind im Oktober 2011 Besucher auf meiner Seite gelandet:

  • karl valentin
    Das bin ich.
  • karl valentin weihnachten
    Wird gefeiert. Ich freue mich auf viele Geschenke.
  • karl valentin herbst
    Vor dem kann und will ich nicht fliehen. Schließlich habe ich im Herbst Geburtstag.
  • karl valentin der herbst
  • knopfmuseum schmölln
    Ein Besuch lohnt sich.
  • einkaufszettel php
    Dazu habe ich hier, hier und hier etwas geschrieben.
  • kadawi
    Ein leckerer Cocktail.
  • karl valentin danksagung
  • karl valentin essen
    Ich möchte bitte nicht gegessen werden.
  • offlinesucht
  • widerwärtige menschen mit widerwärtigen motiven
  • www.karl valentin.de
  • „offline-sucht“
  • als junger mann im swingerclub
  • array sortieren php mehrdimensional erhalten
  • ausgefallene sexspiele
    Der Geschlechtsverkehr fand nicht statt?
  • bier lützen
    Was mag lützen wohl für eine Tätigkeit sein?
  • der kommunionanzug karl vanlentin
  • djungelorm ikea
  • ein blatt fiel ab
    Sowas kann im Herbst schon einmal vorkommen.
  • einkaufszettel gratis
  • ficken im bfw oberhausen
  • freude karl valentin
  • funktionsweise array_multisort
  • gebärmutterschnitzel
  • gedicht karl valentin
  • gespräch mit ki
  • gespräch online „ki“
  • herbst karl valentin
  • heroes del silencio konzert zurich
  • hohes alter karl valentin über das altern
  • jörg richter musikschule leipzig
  • karl valentin „herbst“
  • karl valentin – herbst
  • karl valentin: ein lebenslauf
  • karl valentin andere straßenseite
  • karl valentin ehrlichkeit
  • karl valentin fliegen
  • karl valentin freundschaft
  • karl valentin gedenkstein
    Ich finde auch, daß mir endlich mal einer gesetzt werden sollte.
  • karl valentin jahreswechsel
    Bisher ist nichts geplant.
  • karl valentin nachfahren
  • karl valentin polizisten
  • karl valentin reichtum
    Ich hätte nichts dagegen.
  • karl valentin sehr geehrte versicherung
  • karl valentin spruch über grammatik
  • karl valentin t shirt
  • karl valentin und trinken
  • karl valentin vergangenheit
  • karl valentin wein
  • karl valentin zugfahren
  • karl valentin über liebe
  • ki programm
  • ki programme
  • kvalentin
  • mahlzeit karl valentin spruch
  • mit einem halben engel zu tun
  • mixxx 1.8.0 suse
  • mixxx ubuntustudio
  • offline sucht
  • person: wie geht es dir? programm: gut
  • rolf im schafspelz
  • schafspelze waren aus
    Das wird einige Wölfe traurig stimmen.
  • schmölln knopfmuseum
  • schweingram
  • seit wann gibt es swingerclubs
  • swingerclub schloss mer
  • tugenden „karl valentin“
  • valentin karl
  • wahrheit karl valentin
  • weihnachten karl valentin
  • weihnachten karl valentin“
  • weihnachten mit karl valentin
  • weihnachtsmann limerick
  • weihnachtsmärchen wichtel
  • wein karl valentin
  • werrolf
  • widerwärtige menschen mit widerwärtigen motiven
  • wunderbare wunder
  • wunder karl valentin
  • zitatesammlung karl valentin 2011