Die Drive-Now API und was macht der Ford Transit da eigentlich?

Im Gegensatz zu car2go bietet drive-now momentan leider (und unverständlicherweise) keine offene API für seine Fahrzeugdaten an. Nach meinem ersten Wurf für eine car2go Java Library wollte ich mich davon aber nicht stoppen lassen und habe mir einmal genauer angesehen, woher denn die Webseite ihre Daten bezieht. Erfreulicherweise findet sich dort recht schöne JSON-API, so dass dem Datenabruf (für mich war ohnehin nur der lesende Zugriff interessant) kein Problem zu sein schien.

Die Städte-Liste lädt die Webseite z.b. über https://api2.drive-now.com/cities?expand=cities – Doch ein GET auf diesen URI bringt erstmal Ernüchterung:

{"code":403,"message":"Permission denied."}

Doch nach etwas scharfem Hinsehen wird schnell klar was die Website anders macht. Das Javascript dort sendet zusätzlich einen „X-Api-Key“-Header im Request. Schickt man diesen mit, dann sieht das Ergebnis schon anders aus:

{
 "count": 8,
 "items": [
 {
 "businessAreaUrl": "https:\/\/api2.drive-now.com\/geodata\/6099\/6099.kml",
 "callCenterPhoneNumber": "+49 \/ 800 \/ 7234070",
 "carTypes": {
 "count": 0,
 "items": []
 },
 "cars": {
 "count": 0,
 "items": []
 },
 "chargingStations": {
 "count": 0,
 "items": []
 },
 "cityImageBaseUrl": "https:\/\/prod.drive-now-content.com\/fileadmin\/user_upload_global\/assets\/city\/{city}\/{color}\/{density}\/city.png",
 "countryLabel": "Germany",
 "fuelTypes": {
 "count": 0,
 "items": []
 },
 "id": "6099",
 "isoCountryCode": "DE",
 "latitude": 52.506629,
 "longitude": 13.381492,
 "mobileBusinessAreaUrl": "https:\/\/api2.drive-now.com\/geodata\/6099\/6099_mobile.kml",
 "name": "Berlin",
 "parkingSpaces": {
 "count": 0,
 "items": []
 },
 "petrolStations": {
 "count": 0,
 "items": []
 },
 "prolongAvailable": true,
 "registrationStations": {
 "count": 0,
 "items": []
 },
 "routingCityName": "berlin",
 "routingCountryName": "germany",
 "showBusinessAreaByDefault": false,
 "showChargingStationVisible": true,
 "showPetrolStationVisible": true,
 "showRegistrationStationVisible": true,
 "transmissionTypes": {
 "count": 0,
 "items": []
 }
 },
...
}

Die Struktur sieht auf den ersten Blick etwas merkwürdig aus, aber auf jeden Fall erhält man Infos über alle aktiven Städte. Die Attribute sind dabei recht selbsterklärend, so dass nicht im Detail darauf eingehen werde. Lediglich die numerische „id“ (= CityId) ist von hervorgehobener Bedeutung, die wird später nämlich noch benötigt. Auffällig sind auch die diversen leeren Arrays „mit“ fehlenden Infos: „carTypes“, „cars“, „fuelTypes“, „parkingSpaces“, …

Also die URL nochmal genauer betrachtet und am „expand=cities“ hängen geblieben. Was wenn ich „carTypes“ sehen möchte?

https://api2.drive-now.com/cities?expand=carTypes liefert die Antwort:

{
 "count": 8,
 "items": [
 {
 "businessAreaUrl": "https:\/\/dev.service.drive-now.com\/geodata\/6099\/6099.kml",
 "callCenterPhoneNumber": "+49 \/ 800 \/ 7234070",
 "carTypes": {
 "count": 6,
 "items": [
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/mini.png",
 "group": "MINI",
 "make": "BMW",
 "modelIdentifier": "mini",
 "modelName": "MINI",
 "series": "MINI",
 "variant": ""
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/mini_clubman.png",
 "group": "MINI",
 "make": "BMW",
 "modelIdentifier": "mini_clubman",
 "modelName": "MINI Clubman",
 "series": "MINI",
 "variant": "Clubman"
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/mini_countryman.png",
 "group": "MINI",
 "make": "BMW",
 "modelIdentifier": "mini_countryman",
 "modelName": "MINI Countryman",
 "series": "MINI",
 "variant": "Countryman"
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/bmw_1er.png",
 "group": "BMW",
 "make": "BMW",
 "modelIdentifier": "bmw_1er",
 "modelName": "BMW 1er",
 "series": "1er",
 "variant": ""
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/bmw_activee.png",
 "group": "BMW",
 "make": "BMW",
 "modelIdentifier": "bmw_activee",
 "modelName": "BMW ActiveE",
 "series": "ActiveE",
 "variant": ""
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/bmw_active_e.png",
 "group": "BMW",
 "make": "BMW",
 "modelIdentifier": "bmw_active_e",
 "modelName": "BMW ACTIVE E",
 "series": "ACTIVE E",
 "variant": ""
 }
 ]
 },
 "cars": {
 "count": 0,
 "items": []
 },
 "chargingStations": {
 "count": 0,
 "items": []
 },
...

Siehe da: Fahrzeugtypen! Und auch für die anderen Arrays funktioniert das wunderbar. Auch ein „expand=full“ ist verfügbar und liefert die Inhalte aller Arrays, wobei die Ladezeiten hier vermuten lassen, dass man sich damit bei den Sys-Admins von Drive-Now keine Freunde macht.

Etwas fokussierter wird das ganze aber mit folgender URI: https://api2.drive-now.com/cities/4604?expand=full Das Ergebnis sind alle Daten für die CityId 4604 (München). Auch die anderen expand-Werte funktionieren hier wieder.

Aber es geht noch spezifischer: https://api2.drive-now.com/cities/4604/cars liefert ausschließlich die Autos für München, ohne die City Informationen als Wrapper-Objekt.

Im Ergebnis des „expand=cities“-Aufrufes kann man außerdem sehen, dass unter https://api2.drive-now.com/geodata/4604/4604.kml bzw. https://api2.drive-now.com/geodata/4604/4604_mobile.kml ein KML des jeweiligen Geschäftsgebietes zu finden ist (wobei ich noch keine Muse hatte den Unterschied der _mobile Version näher zu betrachten. Infos dazu gerne in die Kommentare). Im Gegensatz zu den anderen URIs, ist für die KMLs kein API-Key notwendig.

Wirklich erheiternd wird das ganze allerdings, wenn man sich das Javascript der Webseite etwas genauer ansieht, weil man z.B. auf der Suche nach einem funktionierenden API-Key zum testen ist. Dort finden sich nämlich solche Schmankerl (URLs leicht verfremdet):

 getNApiUrl: function() {
 return this.napiUrl = "entw" === this.getEnv() || "dev" === this.getEnv() ? "https://xxx.service.drive-now.com/" : "stage" === this.getEnv() ? "https://other-xxx.service.drive-now.com/" : "https://api2.drive-now.com/", this.napiUrl

Nicht weiter schlimm, schließlich fehlt der API-Key? Nunja:

 return r.getEnv() === "entw" || r.getEnv() === "dev" ? t = "ichBinDerDevAPIKey" : r.getEnv() === "stage" ? t = "ichBinDerStageAPIKey" : t = "ichBinDerDevAPIKey", $("html").hasClass("phmode") ? $.extend(e, {

Aber Entwicklungssystem sind doch bestimmt nicht von extern erreichbar! Nunja²:

{
 "businessAreaUrl": "https:\/\/dev.service.drive-now.com\/geodata\/1774\/1774.kml",
 "callCenterPhoneNumber": "+49 \/ 800 \/ 7234070",
 "carTypes": {
 "count": 4,
 "items": [
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/mini.png",
 "group": "MINI",
 "make": "BMW",
 "modelIdentifier": "mini",
 "modelName": "MINI",
 "series": "MINI",
 "variant": ""
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/bmw_1er.png",
 "group": "BMW",
 "make": "BMW",
 "modelIdentifier": "bmw_1er",
 "modelName": "BMW 1er",
 "series": "1er",
 "variant": ""
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/for_transit_100_d.png",
 "group": "FOR",
 "make": "FOR",
 "modelIdentifier": "for_transit_100_d",
 "modelName": "FOR TRANSIT 100 D",
 "series": "TRANSIT 100",
 "variant": "D"
 },
 {
 "carImageUrl": "https:\/\/de.drive-now.com\/static\/drivenow\/img\/cars\/for_transit_80_d.png",
 "group": "FOR",
 "make": "FOR",
 "modelIdentifier": "for_transit_80_d",
 "modelName": "FOR TRANSIT 80 D",
 "series": "TRANSIT 80",
 "variant": "D"
...

Doch, ist es! Und es ist spannend, denn die letzten beiden Fahrzeugtypen kommen doch eher überraschend. Ob das als Ankündigung zu verstehen ist oder die Entwickler eine merkwürdige Auswahl an Test-Daten getroffen haben bleibt aber natürlich offen.

Der Fairness halber habe ich Drive-Now vor > 2 Wochen auf ihr eigenes „Überangebot“ an APIs hingewiesen. Trotz Versprechen das an die Technik weiterzuleiten, ist (trotz zwischenzeitlichem Javascript-Code-Update auf der Seite) aber bisher alles weiterhin frei zugänglich.

Meine Anfrage nach einem eigenen API-Key wurde außerdem leider ohne weitere Begründung abgelehnt.

Client/Server Validierung

In den letzten Monaten und Jahren habe ich mich bei diversen Gelegenheiten mit RESTful APIs und der Entwicklung von Clients für selbige beschäftigt. Die Frameworks dafür sind zahllos und für jeden Geschmack ist schnell etwas passendes gefunden. Mit wenigen Zeilen Code steht ein einfacher Server und auch ein hübscher Client ist schnell gehackt. Die Konzepte dahinter sind genau so vielfältig, wie clever.

Einen Aspekt habe bisher aber noch nirgendwo zufriedenstellend gelöst gesehen: Validierung. Als Benutzer möchte man das Feedback möglichst früh und vollständig. Client-Validierung ist also ein muss. Andererseits traut der geneigte Entwickler niemals einem Client. Validierung auf dem Server ist also nicht nur ebenfalls ein muss – und sollte dann auch noch mit der Client-Validierung zusammen passen. Was passiert also momentan? Die Validierung wird doppelt (oder gar noch öfter, wenn man es mit mehreren Clients zu tun hat) und – damit es richtig Spaß macht – auch noch in verschiedenen Sprachen (wenn man nicht gerade auf dem Server auch mit Javascript arbeitet) implementiert. Bleibt die Frage: Warum?!

Die Lösung, die ich mir vorstelle, sieht ungefähr so aus (Beispielhaft für meinen Technologie Stack, aber sicher auch auf andere Technologien übertragbar):

Validierungsregeln auf Server-Seite über Bean Validation (Das funktioniert bereits wunderbar):

public class User implements Serializable {
 @NotEmpty
 @Email
 private String email;

 @Size(min=5)
 @Pattern(regexp = "[a-zA-Z]*")
 private String username;

 @Size(min=8)
 private String password;
}

Validierung dann durchgeführt durch den Spring MVC Controller. (Das „schema“-Attribut der @Controller Annotation ist Wunschdenken, der Rest funktioniert ebenfalls schon)

@Controller(schema=SchemaProvider.AUTO)
public class UserController {

 @RequestMapping(value = "/user", method = RequestMethod.POST)
 public String saveUser(@Valid User user, BindingResult bindingResult) {
  /* ... */
 }

}

Dank des „SchemaProvider.AUTO“ veröffentlicht der Controller die Meta(/Validierungs)-Daten unter /user?schema als JSON Schema. Eine Grundlage dafür liefert evtl. dieser Pull Request für das Jackson JSON Schema Module. Das Ergebnis sähe dann vielleicht so aus:

{
 "title": "User Schema",
 "type": "object",
 "properties": {
  "email": {
   "type": "string",
   "pattern": "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
  },
  "username": {
   "type": "string",
   "pattern": "[a-zA-Z]*",
   "minimum": 5
  },
  "password": {
   "type": "string",
   "minimum": 8
  }
 },
 "additionalProperties": false,
 "required": ["email", "username", "password"]
}

Das wiederum kann Angular Schema Form benutzen, um mit minimalem Code ein hübsches Formular zu zaubern und live zu validieren (siehe die Beispiele):

[
 "email",
 "username",
 "password",
 {
  "type": "submit",
  "style": "btn-info",
  "title": "OK"
 }
]

IMHO wäre das eine sehr elegante Lösung, die mit minimalem Code-Aufwand auskommt und die Validierungsregeln relativ einfach synchronisiert. Denkbar wäre z.B. auch die Regeln aus dem JSON Schema für die Validierung in Mobile Apps zu verwenden.

Nachteile? Man benötigt bereits bei der Anzeige des Formulars einen zusätzlichen Server-Aufruf, was in manchen Situationen schmerzen kann. Außerdem funktioniert das natürlich nur für ein Set an Standardvalidierungen. Will man z.B. sicherstellen, dass die E-Mail-Adresse auch unique ist, dann wird die Sache schon etwas komplizierter – Aber nicht unlösbar!

Mein neues Bastelprojekt für die Winterzeit ist jedenfalls gefunden – Ich will das haben!

car2go Hamburg Flotte

Mobilität

Bis vor ca. 2 Jahren war ich noch stolzer Autobesitzer, was sich dann (nicht ganz freiwillig) geändert. Wie gut ich inzwischen ohne ein eigenes Auto auskomme ist mir in den letzten Tagen wieder besonders aufgefallen:

Letzten Donnerstag um 17.15 Uhr aus dem Büro, car2go geschnappt und heim gefahren. Dort schnell fertig gemacht und um 17.45 schon wieder mit dem Bus auf den Eselsberg gedüst.

car2go Hamburg Flotte

Hamburger car2go Flotte zum Start

Pünktlich 18 Uhr beim Vorglühen gewesen. Anschließend zu Fuß zur SoNaFe. Nach erfolgreicher Partyaction zufällig zwei Bekannte getroffen und ein Taxi für den Heimweg geteilt.

Am nächsten morgen kurz ins Büro – leider kein car2go in der Nähe. Macht nichts: Zwei Buslinien, die jeweils im 10-Minuten-Takt praktisch vor der Haustüre fahren. Also kurz nach 10 aus dem Haus und pünktlich um 10.30 im Büro angekommen. Anschließend weiter zu den Eltern: 11.45 Uhr in wieder in ein car2go gehüpft ab zum Bahnhof. Dort Glück gehabt und direkt vor der Tür parken können (car2go-Parkplatz sei Dank). Kurz Geld geholt und mich über die dämlichen Fahrkartenautomaten geärgert, dann entspannt in den Zug gesetzt und unterwegs an meiner Todo-Verwaltung gearbeitet. Pünktlich (ja, pünktlich mit der Bahn!) kurz vor 13 Uhr von den Eltern am Bahnhof abgeholt worden. Ein paar Stunden wieder zurück, diesmal im leicht überfüllten Zug, aber das iPad funktioniert auch im Stehen. Wieder in Ulm angekommen gehts mit dem Bus wieder zurück nach Hause.

Brauche ich also momentan ein eigenes Auto? Nein! Hätte ich gerne eines? Ja!

Rechne ich Jahreskarte für den Nahverkehr, car2go Gebühren und gelegentliche Bahntickets zusammen, dann kostet mich meine Mobilität monatlich um die 60 Euro. Die Ersparnis gegenüber einem eigenen Auto ist also immens. Aber es gibt eben auch die Situationen, in denen ich dafür dann auf andere Leute (und deren Autos) angewiesen bin: Die Hinfahrt zum wöchentlichen Sneak-Besuch wäre z.B. kein Problem, aber für die Heimfahrt kommen dann leider weder Bus (führt nicht mehr) noch car2go (nicht garantiert Verfügbar) in Frage. Größere Einkäufe gestalten sich ebenfalls schwierig oder (subjektiv) teuer.

Mein Fazit nach zwei autolosen Jahren: Ich brauche kein Auto, aber ich habe es als Luxus-Gegenstand schätzen gelernt. Für den Moment investiere ich das Geld aber lieber anderweitig.

Essen aus dem Internet

Ich bestelle wirklich gerne im Internet und es gibt wohl kaum etwas, das ich noch nicht bei Amazon bestellt hätte. Lebensmittel gehörten bis jetzt allerdings nicht dazu. Als mich dann die Meldung erreichte, dass Amazon jetzt auch Lebensmittel (Affili-Link) verkauft, war ich mir sicher, dass sich das schnell ändern würde. Anfangs waren viele Artikel noch versandkostenfrei zu haben, so dass ich stark versucht war 0,39 € in eine Banane zu investieren und diese dann gleich vor den Augen des DHL-Boten zu verspeisen. Zunächst hat dann aber doch die Vernunft gesiegt und bevor mein Spieltrieb sich wieder durchsetzen konnte waren die Versandkosten dann auch schon auf unattraktive 6,90 € gestiegen. Da die Artikelpreise nicht so niedrig waren, dass sich eine Bestellung dennoch gelohnt hätte, war die Idee für mich als Schwaben damit auch schon wieder gestorben.

Letzte Woche gab es dann aber einen 25 € Gutschein für Froodies, einem der Lebensmittelhändler bei Amazon, für attraktive 6 € bei Dailydeal, was dann den Einkauf dann, trotz Versandkosten, zum Schnäppchen werden lies. Also Gutschein gekauft, Warenkorb mit Waren im Wert von gut 25 € vollgeladen und ab zur Kasse. Nach Eingabe der Adressdaten dann die erste Überraschung: Mein Rum wurde aus meinem Warenkorb entfernt, da er nicht mehr lieferbar war. Als zurück in den Shop und noch einmal nachgeschaut. Zu meiner großen Verwunderung hatte sich das Sortiment deutlich reduziert. Nach etwas suchen folgte dann des Rätsels Lösung:

Derzeit sehen Sie das Gesamtsortiment aus dem froodies Lebensmittel Online Shop, welches unter Umständen von dem an Ihrem Wohnort lieferbaren Sortiment abweichen kann.

Bitte melden Sie sich hier an oder geben Sie nachfolgend Ihre Postleitzahl ein, damit wir Ihnen das für Sie verfügbare Sortiment anzeigen können.

Also kein Rum für Claus, Warenkorb anderweitig gefüllt und dann eben (bis auf eine Flasche Guinness) alkoholfrei bestellt. Das war Mittwoch Abend.

Montag Mittag klingelt dann mein Handy und ein freundlicher Mitarbeiter von Froodies ist am Apparat. Ein Teil meiner Frühstücksflocken (tolles Wort ;-)) war nicht mehr lieferbar. Mir blieb also nichts anderes übrig, als die Bestellung noch einmal zu ändern.

Heute kam dann die Leiferung per DPD. 12,20 kg laut Paketaufkleber. Im Großen und Ganzen war alles ok, nur die Pringles hören sich an, als hätten sie den Transport nicht wirklich überlebt. Ausgepackt sah das dann so aus:

Was auf dem Bild (und in der Lieferung) leider fehlt: Das Guinness. Ich bin gespannt wie der Support auf meine Mail deswegen reagiert und ob ich Ersatz geliefert bekomme (Erstattung der paar Cent empfände ich in dem Fall nicht als faire Lösung).

Eines hat mich dann aber doch schockeirt: Die Unmengen an Verpackungsmaterial (die Bionade dient zum Größenvergleich):

Mir ist durchaus klar, dass Glasflaschen gut eingepackt sein wollen und auch Krümelkekse bei den Kunden eher schlecht ankommen, aber so viel Müll ist wirkt dann doch „leicht“ übertrieben.

Ich warte jetzt mal noch ab, wie der Support wegen des fehlenden Bieres verhält, aber in Zukunft werde ich dann wohl doch weiter meine lokalen Einzelhändler dem Internet vorziehn, falls es mir an Lebensmitteln mangelt.

Edit: Inzwischen kam Antwort vom Support:

Bitte entschuldigen Sie dieses Versäumnis. Wir werden Ihnen eine Flasche Guiness nachsenden.

Klingt also gut.

Edit 2:

Das fehlenden wurde in der Tat 2 Tage später nachgeliefert. Der Verpackungswahnsinn wurde dabei fortgesetzt:

Auch wenn die Abwicklung damit insgesamt ganz gut war, bleibe ich doch bei meinem Fazit: Lebensmittel kommen bei mir weiterhin aus dem Supermarkt.

Freiheit statt Angst 2010

Zusammen mit Pascal, Stefan und einigen Nicht-Bloggern war ich diesen Samstag in Berlin auf der Demonstration „Freiheit statt Angst“ unterwegs. Ich möchte gar nichts weiter zur Demo selber schreiben, denn das wurde an anderen Stellen bereits genug, ich persönlich fands jedenfalls wieder gelungen und fands nur etwas schade, dass ich den ELF-Wellen-Leuten nicht wieder begegnet bin.
Warum ich der Demo dennoch einen Artikel widme? Ich war mit meine selbst gebastelten 3D-Kamera unterwegs und habe mich bemüht ein paar Eindrucke festzuhalten. Neben einigen technischen Problemen, die mich noch plagen, bin ich leider auch noch kein besonders guter Fotograf, so dass der Ausschuss leider riesig geworden ist. Einige Bilder finde ich dennoch vorzeigbar (wenn auch noch weit von „optimal“ entfernt). Wer also eine Rot-Cyan-Brille (Affili-Link) hat, der kann nach dem Klick meine Werke betrachten.
Weiterlesen

Schwörmontagsschatz

Die SWP veranstaltet dieses Jahr zum Ulmer Schwörmontag ein großes Gewinnspiel: Bei der Suche nach dem „Schwörmontagsschatz“ gibt es nicht weniger als 10.000 Euro zu gewinnen.

Das Ganze läuft wie folgt: Seit gestern gibt es täglich eine Zahl in der Printausgabe der SWP. Am Montag zwischen 12 und 13 Uhr gibt Radio 7 dann die Reihenfolge bekannt, in der man diese Zahlen in ein Onlineformular auf swp.de Eintragen muss. Anschließend erhält man die Koordinaten des Schatzes und hat dort die Chance die 10.000 Euro abzustauben, sofern man zu den ersten sieben Ankömlingen zählt.

Zunächst klang mir das alles etwas zu aufwändig (mal abgesehn davon, dass ich kein SWP-Abo habe), aber etwas Spinnerei, ist daraus eine Idee geworden, bei der ich eure Hilfe brauche:

Ich werde die Zahlen sammeln und Montag die Sendung auf Radio 7 hören. Sobald dann die Reihenfolge bekannt ist, besorge ich damit die Koordinaten. Dann kommt ihr ins Spiel: Ich verteile diese Koordinaten (per SMS) an ein Team (euch ^^) im kompletten Stadtgebiet (am besten mit Fahrrädern ausgestattet), die sich dann auf schnellstem Wege zum Ziel begeben. Es dann an euch den richtigen Umschlag zu ergattern und das Geld abzuräumen.

Weil es bei einem Teamprojekt aber etwas doof ist, wenn nur einer gewinnt teilen wir (im Falle des Gewinns wohlgemerkt ;-)) wie folgt:

  • 3333 Euro lassen wir indirekt wieder der SWP zu Gute kommen und spenden sie an das Bildblog
  • 3333 Euro gehen an den Menschen mit dem Gewinnerschlüssel
  • 3334 Euro teilen wir im restlichen Team auf

Ich kann nicht im geringsten einschätzen wie groß unsere Erfolgsaussichten sind, aber ich denke, dass es in jedem Fall eine witzige Aktion wird und hoffem, dass sich ein paar Leute finden, die sich an der Aktion beteiligen wollen.

Bei Interesse hinterlasst einfach einen Kommentar oder schreibt mir eine E-Mail an schatz (at) naeveke.de
Sollte das Interesse an der Aktion zu groß werden behalte ich mir vor die Anzahl der Teammitglieder zu beschränken (auf ca. 10-15 Personen)

Couldn’t deactivate new snapshot

Ein weiteres Problem nach dem Update von Etch auf Lenny. Wir benutzen LVM-Snapshots um unsere MySQL-Datenbanken im laufenden Betrieb zu sichern:

lvcreate -L 10G -s -n lv_backup /dev/vg_var/lv_var

Seit dem Update passierte dabei allerdings folgendes:

LV vg_var/lv_backup in use: not deactivating
Couldn’t deactivate new snapshot.

Leider keine sehr aussagekräftige Fehlermeldung. Die Lösung dafür war aber recht simpel:

aptitude install lvm2

Aptitude, „c“ und „No candidate version found for […]“

Kurz aufgeschrieben, falls jemand das gleiche Problem hat:
Nach dem Upgrade von Debian Etch auf Lenny hatten wir das Problem, dass einige Server keine php-Packages mehr installieren wollten, obwohl diese eigentlich verfügbar sind:

maggie ~ # aptitude search php5-cgi
c php5-cgi – server-side, HTML-embedded scripting language (CGI binary)
maggie ~ # aptitude install php5-cgi
Reading package lists… Done
Building dependency tree
Reading state information… Done
Reading extended state information
Initializing package states… Done
Reading task descriptions… Done
No candidate version found for php5-cgi
[…]

Die sources.list sah ganz normal aus:

deb http://ftp.de.debian.org/debian/ lenny main contrib non-free
deb http://security.debian.org/ lenny/updates main contrib non-free

Fleißiges googlen, Caches leeren und rumprobieren brachte leider keine Lösung. Irgendwann kam dann aber doch die rettende Idee: Wir hatten unter Etch die PHP-Packages von DotDeb mittels Pinning verwendet. Die Einträge für DotDeb hatten wir zwar aus der sources.list entfernt, aber in /etc/apt/preferences fand sich noch folgendes:

Package: *
Pin: origin dotdeb.netmirror.org
Pin-Priority: 50

Package: php5*
Pin: origin dotdeb.netmirror.org
Pin-Priority: 999

Nachdem die Einträge entfernt waren, hatte sich das Problem erledigt.

Meine erste und letzte C&A Bestellung

Anfang der Woche wurde ich auf dieses C&A Angebot aufmerksam. Da ich Schwabe bin und dem Namen auf irgendwelchen Etiketten keine gesteigerte Bedeutung bemesse, habe ich natürlich sofort zugeschlagen – Für den Preis kann man schließlich nichts falsch machen.

6 Hose für je 9 € (-20% Dank Gutschein) und 5,50 € als Versandkosten – Letztere sind zwar nicht unbedingt wenig, aber bei dem Hosenpreis kein Problem. Auf Rechnung bestellt und auf die Lieferung gewartet.

Statt einen Paket kamm aber zunächst eine eMail:
Aufgrund unserer Prüfkriterien können wir Ihre Bestellung vom 24.11.09 15:46:43 leider nicht auf Rechnung ausliefern.

Wir reservieren Ihre Bestellung gerne für weitere 3 Tage und bitten Sie, die gewählte Zahlungsart auf Nachnahme
umzustellen. Bitte teilen Sie uns dazu telefonisch mit, ob Sie die Umstellung auf diese Zahlungsart wünschen.

Daraufhin habe ich eine Mail zurück geschickt und mich darüber beschwert, dass ich es eine Frechheit finde, dass ich auf Grund meiner Adresse als nicht kreditwürdig einstuft werde. Nichts desto trotz habe der Nachnahme zugestimmt, aber nicht ohne anzumerken, dass ich es eigentlich nicht einsehe nun noch die 2 € für die Nachnahme abzudrücken (die DHL für sich mit kassiert). Die Antwort lautete wie folgt:

Ihre E-Mail wurde wunschgemäß bearbeitet. Der Auftrag wird auf Nachnahme umgestellt.

Sie bezahlen den Rechnungsbetrag bei Erhalt der Ware in bar beim ausliefernden Boten. Zusätzlich zur Kaufsumme wird neben einer Bearbeitungsgebühr in Höhe von € 3,95 eine Nachnahmegebühr in Höhe von € 2,- erhoben.

Wir hoffen, Ihnen mit dieser Antwort zu Ihrer Zufriedenheit weitergeholfen zu haben, und würden uns freuen, Sie bald wieder in unserem C&A Online Shop begrüßen zu dürfen.

Ich darf also nicht nur nicht auf Rechnung bestellen, weil ich da wohne wo ich wohne und muß 2 € zusätzlich an DHL abdrücken, sondern werde auch noch 3,95 € an C&A selber los, was man mir aber lieber vorher nicht mitteilt…

Meine Beschwerde darüber blieb bis jetzt unbeantwortet. Offensichtlich bin ich aber nicht allein: Bei MyDealz beschwerden sich andere über ähnliche Bestell-Abläufe.

Ich für meinen Teil werde bei C&A sicherlich nichtmehr bestellen, denn Kundenfreundlichkeit sieht anders aus. Vielleicht sollten sie sich da lieber mal etwas von anderen Marktbegleitern abschauen, mit denen bin ich nämlich sehr zufrieden.

Update am 30.11.:

Es kommt noch besser:

Sehr geehrter Herr Näveke,

vielen Dank für Ihren ersten Einkauf im C&A Online Shop.

Wir freuen uns, Sie als neue/n Kunden/in begrüßen zu dürfen.

Um Sie zukünftig immer auf dem Laufenden zu halten, werden wir Ihnen jede Woche Informationen rund um die C&A Kollektion, zu neuen Modethemen, tollen Angeboten und Sonderaktionen zusenden.

Um einen optimalen Service für Sie zu erreichen, werden wir den Newsletter möglichst auf Ihre individuellen Bedürfnisse und Kaufgewohnheiten zuschneiden.

Wir wünschen Ihnen viel Spaß mit dem C&A Newsletter und natürlich beim Einkauf in unserem Online-Shop!

Ich kann mich nicht erinnern einem Newsletter zugestimmt zu haben und nach der Vorgeschichte bin ich darauf sicher nicht scharf.

Und das schönste daran? Kein Link um sich auszutragen!

Update am 01.12.:

Auf meine letzte Mail kam sogar nocheinmal eine Reaktion:

Selbstverständlich sind für uns jegliche Rückmeldungen und Anregungen unserer Kunden sehr wichtig, denn nur durch eben diese haben wir die Möglichkeit, unsere Serviceorientierung und unser Leistungsprogramm im C&A Online Shop im Sinne unserer Kundinnen und Kunden kontinuierlich zu optimieren.

Daher haben wir Ihren Verbesserungsvorschlag zwischenzeitlich bereits an unsere zuständige Fachabteilung weitergeleitet, damit wir Ihren Hinweis ggfs. in unsere künftigen Produktentwicklungen mit einfließen lassen können.

Abschließend möchten wir uns nochmals bei Ihnen für Ihre Unterstützung bedanken.

Ich werde diese Mail gleich mal nutzen und meine Kritik zum Newsletter kundtun. Man darf gespannt sein.

Update am 06.12.:

Ihrem Wunsch entsprechend haben wir Ihre e-mail Adresse aus unserem Newsletter-Verteiler gelöscht.

Sollten Sie eine Löschung all Ihrer Daten gewünscht haben, können wir Ihrem Wunsch leider nicht nachkommen, da wir Ihre Daten aus rechtlichen Gründen benötigen, um den (stornierten) Bestellvorgang auch zu einem späteren Zeitpunkt noch nachvollziehen zu können. Jedoch dienen diese Daten nur dem internen Gebrauch.

Immerhin ausgetragen. Darüber warum ich überhaupt angemeldet wurde aber kein Wort. Wäre ja halbwegs akzeptabel, wäre ich wirklich ausgetragen worden, denn 2 Tage später kam der nächste Newsletter. Ich glaub ich schreib denen mal nocheinmal…