Jetzt reichts mir mit Hostpoint

HostpointSchade, Hostpoint, Ihr wart mal wirklich gut. Nun geht leider nicht mehr viel, und das Wenige das noch geht, geht langsam; Lange und kurze Ausfälle von Mail, Datenbanken, Websites, Control Panel oder allem zusammen (bzw. beliebige Permutationen) sind an der Tagesordnung. Oftmals waren die Ladezeiten der Seiten zum Timeouten und Verzweifeln. Ein riesen Chaos herrscht im Adminbereich, da meine Datenbanken auf verschiedenen Server liegen (in verschiedenen Versionen), so dass sie mit PHPMyAdmin nicht mehr auffindbar sind, Subdomains werden in verschiedenen Directories abgelegt (eines davon ist im Webroot des Hauptservers…?), etcetc.

Die Folgen: Mein Blog läuft nicht, meine Homepage ist auch unzuverlässig, Mails erhalte ich nimmer (ok, das ist noch der Angenehmste Teil 🙂 ) und Webentwicklung wird zum Glücksspiel. Ich hatte viel Geduld (Monate), doch nun ist fertig.

Wer ein Bisschen sucht, findet noch weitere, unzufriedene Kunden. Ich ziehe nun um zu Hosterbox (kein Link, die Domain gibt es nicht mehr), mal sehen was ich für ein Drittel meines Geldes erhalte.

Schade, Hostpoint, Ihr wart mal so gut, dass ich sogar zum Reseller wurde. Hier trennen sich jedoch unsere Wege.

→ Bis ich diesen Beitrag speichern konnte hats sicher eine Stunde gebraucht *sigh*.

Update April 2008: Mein Wechsel zu Hosterbox ist vollzogen. Ich bin sehr zufrieden und werde zu einem späteren Zeitpunkt mal drüber bloggen. Leider habe ich noch einige geresellte Domains bei Hostpoint. Im Moment laufen sie, aber unerträglich langsam 🙁 . Das ist eine Qual.

Weitere Beschwerden gibts auch bei think eMeidi, iRaff und vielen anderen Orten.

flughexe.ch – Finde den günstigsten Flug

Dies ist ein von trigami vermittelter bezahlter Eintrag Hinweis: Dies ist ein von trigami vermittelter bezahlter Eintrag.

Einen Flug hexen?

FlughexeEigentlich ist das Fliegen ja kein Spass. Man sitzt da, dicht eingezwängt zwischen labernden oder schnarchenden Nachbarn, deren Menüplan an ihrer Transpiration erkennbar ist, das Handgepäck sollte streichholzschachtelgrösse nicht überschreiten, da es sonst nimmer in die Ablage passt, zum Essen gibt es feuchten Karton mit Sägespänen und der dringend benötigte Alkohol wird einem vor der Nase hin und her getragen. Ganz zu schweigen von den Erstickungsanfällen, weil das Rauchen verboten ist wenn man nur schon an einen Flughafen denkt, die Flieger immer Verspätung haben oder gar nicht mehr fliegen (wie schon mit EasyJet erlebt) und der Kaffee den Namen nicht verdient hat. (BTW: Auf meinen ersten Flügen habe ich noch geraucht, jaaa, im Flugzeug drin! Und Essen gabs auch, mit Wein!!! Damals war die Welt noch eine Scheibe, aber durchaus in Ordnung 🙂 ).

Nundenn, Laufen ist leider immer noch mühsamer, und so will ich wenigstens so wenig wie möglich für diese Tortur bezahlen. Da gibts nun verschiedene Möglichkeiten:

  • Ich gehe ins Reisebüro. Nachteil: ich bezahle unter Umständen zusätzlich die Beratung und sie haben Öffnungszeiten.
  • Ich checke alle Fluggesellschaften durch die es gibt. Nachteil: Das gibt mächtig zu tun.
  • Ich bediene mich eines Preisvergleichers. Und genau hier kommt die Flughexe ins Spiel.

Oberfläche und Bedienung

Die Website http://www.flughexe.ch kommt im modernen Web-2.0 Design daher: Klar, mit knalligen Farben (nur die Web 2.0 typischen Gradienten fehlen) und mit runden Ecken. Mir gefällt dieses Schnörkellose sehr. Die zentrale Sache der Website (das Suchen nach Flügen) ist zentral in der Mitte. Sehr diskret ist etwas Werbung auf der Seite verteilt.

Flughexe-Screenshot

Die Bedienung ist sehr einfach: Eingeben was man wünscht, Formular abschicken, kurz warten und schwupps erscheinen die Resultate, aufsteigend nach Preisen geordnet, mit Zwischenstopps, etc. Die Suche geht erfreulich schnell vonstatten! Einige andere Flugsuchen – die sich mitunter nur mit einer Airline beschäftigen müssen – scheinen zuerst jemanden aufs Rollfeld zum Nachfragen zu schicken, der dann die Flüge von Hand eintippt. Bei den Resultaten gibt es ein Link zu den jeweiligen Partnern, von wo aus dann der Flug gebucht werden kann.

Es ist möglich, sich einen Account zu erstellen. Dieser bietet aber keine weitere Vorteile als einen Newsletter. Naja, ich bekomm ja so extrem wenig Mails…

Technik

Hier der gefürchtete Teil der Rezension 🙂 . Natürlich habe ich wieder was herumzumaulen.

Zum Einen wieder mal das Logo oben links. An sich sollte es zurück auf die Homepage führen, das hat sich so eingebürgert. Flughexe gibt es nun in zwei Versionen: flughexe.ch mit Preisen in Schweizerfranken und flughexe.com in Euro. Ein Klick auf das Logo führt nun immer auf die Euroversion, was sehr verwirrend sein kann (ok, ist so beschriftet, aber trotzdem…).

Etwas hässlicher ist, dass man immer ein Rückflugdatum angeben muss, das hinter dem Abflugdatum liegt, auch wenn man nur den Hinflug anzeigen lassen will. Sonst wird man ziemlich bestimmt zurecht gewiesen, inklusive Ausrufezeichen!

Wenn man auf Google angewiesen ist, dann sollte man nett mit Google sein. Diese Seite bietet da noch einiges an Optimierungspotential:

  • Der Titel ist mit Schlüsselwörtern gefüllt. Das sieht beim Erstellen eines Lesezeichens hässlich aus und interessiert Google schon lange nimmer so.
  • Die Schlüsselwörter werden im keywords Metatag wiederholt. Ok, aber in description und abstract gehören sie nicht auch noch! Das kann ganz übel aussehen bei den Excerpts in den Suchresultaten. Wer klickt denn auf so einen Eintrag (so gefunden bei Google):
    Flughexe bei Google
  • Die Site hat 26 HTML Fehler. Beim CSS sind es nur 4 Ungereimtheiten. Das mag Google nicht und das ist auch nicht zukunftsgerichtet, wenn man an die mobilen Geräte denkt.
  • Weitere SEO-Aktivitäten (Social Bookmarking, Alexa-Ranking, …) wurden anscheinend nicht durchgeführt.

Offene Partnersache?

Es wäre interessant wenn irgendwo offen und transparent aufgeführt würde, welche Fluggesellschaften berücksichtigt werden. Ich habe diese Information nirgends auf der Seite auftreiben können.

Zum Buchen der Flüge scheint als einziger Partner LTURfly.com aufgeführt. Sind denn alle Flüge dort auch auffindbar? Was ist der Mehrwert der Flughexe (ausser dem schöneren Design)? Ganz unten ist auch noch ein Link auf Billig-Reise platziert. Diese Site bietet ebenfalls eine Suche nach Flügen aus der Schweiz an, allerdings viel weniger komfortabel als das Hexchen. Aber wie ist da der Zusammenhang? Das wirkt auf mich etwas undurchsichtig.

Verbesserungsvorschläge

Neben den Fehlern und den Unklarheiten hätte ich einen ganz klaren Wunsch: Ich will beispielsweise von der Schweiz aus nach Amsterdam. Jetzt muss ich alle Schweizerflughäfen durchprobieren, denn der Preisunterschied kann enorm sein! Wenn es nun auch am Zielort drei Flughäfen gibt und ich jeweils Zürich und Basel ausprobieren muss, dann ergibt das sechs Suchanfragen. Es wäre ein echter Mehrwert, wenn das irgendwie automatisiert werden könnte.

Vielleicht könnte man auch noch den Account ein bisschen aufpeppen und die schon gewählten Destinationen einfacher erreichbar machen oder so ähnlich. Das würde die Kunden auch mehr binden.

Fazit

Die Flughexe sucht günstige Flüge, und das macht sie gut. Die Seite gefällt und ist sehr benutzerfreundlich. Etwas Transparenz und ein paar Goodies würden sie noch mehr aus der Masse herausstechen lassen.

Videos und Musik unter Linux mit dem iRiver X20

Es weihnachtet sehr…

iriver x20Mir ist das Christkind begegnet und hat mir einen iRiver X20 gebracht! Wahrscheinlich weil ich so ein Lieber bin 😉 . Dieses kleine, schwarze Teil hat in meiner Version 4 GB an Speicher, ein 2.2″ Display und es kann Radio empfangen, Stimmen aufzeichnen (nicht die in meinem Kopf 🙂 ), Bilder und Videos darstellen. schön aussehen und natürlich auch Musik spielen. Etwas verwundert hat mich dann, dass Updateable Firmware ganz gross auf der Verpackung stand. Wird das nun schon als Vorteil beworben? Flawless Firmware wäre mir sympathischer. Ein Check (Settings, Advanced, System Information, 2/2) hat dann aber zum Glück gezeigt, dass meinereiner auf dem neusten Stand ist und ich mir die Stunden des Updatens sparen kann die ich – wie süchtig nach neuen Versionsnummern nach dem Komma – wider besseren Wissens mit Fluchen verbracht hätte.

Damit die Übertragung unter Linux läuft, muss dann noch der Übertragungsmodus auf MSC gestellt werden (Settings, Advanced, Connection Type) und schon meldet er sich nach dem Einstecken.

Musik

Meine Musik ist in MP3 und einigermassen gut getaggt. Diese Dateien abspielen kann er, schön. Möchte man auch noch das Cover sehen, dann muss man einen etwas grösseren Aufwand treiben; Er zieht dieses tatsächlich aus den ID-Tags (Metainformation, die direkt in die mp3-Datei codiert wird). Benutzt wird ein ID3V2 APIC Tag. Unter Linux kann man den zum Beispiel mit kid3 sehr vornehm setzen:

kid3 - Cover Art Taggen

Der Sound selbst ist leider, hmm, unflexibel. Geht man beim Equalizer im Bass eines hoch, dann schepperts gewaltig im Gehörgang. Naja, wieder was gelernt: Guter Name+Gutes Design+Wenig Zeit entbindet NICHT vom Probehören!

Der Radio ist ebenfalls so naja. Es gibt doch RDS, das Informationen über Station und gespielter Sound, themenorientiertes Radiohören und Autoadjustment (bei einem portablen Player nicht gerade sinnlos) bietet. Diese Innovationen sind am X20 spurlos vorbei gegangen 🙁 . Der einzige Luxus ist eine automatische Sendersuche und Speichern von Frequenzen (ohne Tagging).

Videos

Nicht zuletzt wollte ich natürlich auch – meine immer schlimmerwerdende Sehschwäche ignorierend – Videos kucken (natürlich ausschliesslich Lernvideos, ein Schelm wer Böses dabei denkt!). Im Laden stand was von MP4 und im Manual was von AVI. Da ich nicht die offizielle Windowssyncsoftware verwenden kann/will, musste halt ein anderer Weg gefunden werden. Versuche mit ffmpeg scheiterten zuerst daran, dass bei Debian keine Lame Unterstützung einkompilliert wurde. Nachdem dieses Hinderniss aus dem Weg geräumt war, brachten die generierten Vids den neuen Player zum Abstürzen 🙁 . Armes Teil. Ebenfalls war den Versuchen mit verschiedenen online-Konverter kein grosser Erfolg beschieden.

Zum Glück hat es Beispieldateien und mplayer meldete folges:

AVI file format detected.
VIDEO:  [XVID]  320x240  12bpp  30.000 fps  491.3 kbps (60.0 kbyte/s)
[...]
AUDIO: 44100 Hz, 2 ch, s16le, 192.0 kbit/13.61% (ratio: 24000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)

XVID, das macht Sinn! Eine Recherche ergab, dass sich mencoder eignen könnte. Leider ist der im Standard-Debian nicht dabei. Zum Glück gibt es für solche Fälle das fantastische Debian Multimedia. Flugs die Datei /etc/apt/sources.list um deb http://www.debian-multimedia.org testing main ergänzt, apt-get update und apt-get install mencoder und schon war das Wunderteil auf der Pladde.

Die Bedienung ist etwas kryptisch. Folgende Konfiguration hat den Erfolg gebracht:

mencoder TheCrxshadowsDeception.flv -ovc xvid -oac mp3lame -xvidencopts bitrate=491 -o cs.avi

Will man Videos von YouTube herunterladen, eignet sich clive ganz gut. Ein nettes Tool das macht was es verspricht.

TuxMobil - Linux on Laptops, Notebooks, PDAs and Mobile Phones

Nachtrag 07. 2009:Der X20 ist von der iRiver Homepage verschwunden…

Google hat mich wieder lieb…

Google loves youJuhuuu, Google hat mich wieder lieb! Dieses Blog existiert noch nicht sooo lange unter dieser Adresse und so war ich erfreut, als Google mir den PageRank 1 verlieh. Dann hat er viele Bloggerz (unter Anderem meine Wenigkeit) mit PageRank 0 bestraft. Oje, was hab ich nur für schändlich Werk getan? Nach einigem Recherchieren kam heraus, dass die Beiträge für trigami schuld daran sein könnten. Flugs alle Links auf rel="nofollow" gesetzt (ist laut trigami absolut ok), um Reconsideration gebeten und, siehe da: Ein paar Tage später gabs PageRank 2. Damit ist der Tag gerettet, alle sind fröhlich und tanzen trallalla.

Naja, irgendwie geht es mir doch gegen den Strich. Ich rezensiere nur wovon ich glaube, was zu verstehen und ich bin auch ehrlich dabei. Wieso sollen denn die Links nicht zählen? Aber was will ich denn… Vielleicht den Googlebot aussperren? Das Beispiel, das Herr Google, ähm, sorry, Matt Cuts gibt ist doch extrem einleuchtend für diese Situation, oder etwa nicht? Pssst, sonst mag mich Google dann nimmer….

Blogfever und Themenrelevanz, oder sogar Spam?

Blogfever ist nach wie vor eine gute Idee und die Jungs arbeiten hart. Der Ausfall hat sich nicht wiederholt und an sich läuft es gut… Bis ich heute wieder einmal das Widget genauer angesehen habe… Hui, wie Themensensitiv ist das denn?

  • 2 mal Audi S5 Bildergalerie
  • Skoda probefahren
  • Neue Deckenleuchter eingetroffen (eindeutig Spam von „gewerbemoebel.de“)
  • Gutschein Starter Set bei Symio (Affiliate !!!)
  • Schutz vor Sonnenbrand – Ihr Hauttyp

Blogfever

Ich hatte echt Spass dabei, als ich es ein paar mal reloaded habe. Doch nun habe ich keinen mehr: Wenn ich Werbung einblende, will ich Kohle! Ich weiss, ich rante ziemlich oft, aber naja, das ist halt das Einzige das ich einigermassen kann….

Drupal mit neuen Google AdSense Werbeblöcken (Serverbasiert)

Neues AdSense


(Affilliate Link 🙂 ) sind neuerdings Serverbasiert. Das heisst: Aussehen, Inhalt, etc kann grösstenteils von der AdSense-Seite aus gemanaged und muss nicht mehr mühsam von Hand auf jeder Seite eingepflegt, geftpt und gecheckt werden. Das geniale Drupal AdSense Modul beherrscht diese neue Variante leider (noch) nicht von Haus aus. Mit einem kleinen Patch geht das aber.

Vorgehen

  1. Die Datei adsense.module mit diesem Patch so patchen, wie in diesem Beitrag beschrieben.
  2. Auf der Google AdSense Seite AdSense-Setup → Anzeigen Verwalten aufrufen und eine neue Anzeige designen.
  3. Den Code anzeigen lassen und die Slot-Nummer notieren. Es sollte etwas sein wie 2666876213.
  4. In Dupal als Administrator Administer → Site configuration → Google AdSense aufrufen und Custom Channels aufklappen.
  5. Die Slotnummer in einen Channel schreiben.
  6. Diesen Channel beim Block für die Anzeige einsetzen.
  7. Warten… Und sich freuen…

PHP: NHL-Spielerstatistiken in Excel ausgeben für Fantasy-Leagues

Das Problem

HockeyIch habe mir sagen lassen, dass es auch hier bei uns Leute gibt die in einer Fantasy League mitspielen. Irgendwie werden da virtuelle aber real existierende Sportler gezogen und verkauft und nach einem speziellen Algorithmus werden Punkte verteilt, die abhängig von den tatsächlichen Resultaten sind, die dieser Spieler erzielt. Nun, auf jeden Fall wird da viel mit Statistiken gewurstelt. Ein Fantasy League-Mitglied ist an mich herangetreten, weil er die online publizierten Resultate der Skaters und Goalies der NHL in einem Excel haben wollte.

Zuerst dachte ich, das sei ein Fall für Dapper. War es aber nicht, da auf der Webpage reine Text-Exporte waren.

Die Erfahrung hat gezeigt, dass die Form der Ausgabe auf diesen Seiten oftmals ändert und man sich auf so wenig wie möglich verlassen sollte.

Die Felder dieser Tabelle haben keine Trennzeichen, sondern eine feste Breite und sind links- oder rechtsbündig formatiert.

Einige Punkte der Lösung

Download der Webseite in eine Variable

Zuerst muss man mal an die Seite rankommen. In PHP den Inhalt einer URL in einen String laden ist in der Theorie relativ einfach. In der Praxis jedoch ist aus Sicherheitsgründen der Zugriff auf URLs für die file* Funktionen oftmals eingeschränkt. Nunja, dann wird halt ein cURL-Fallback mit eingebaut, so dass wir auf jeden Fall in $page ein Array aus den Zeilen der HTML-Datei haben:

  if(!($page = @file($url))) {
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_USERAGENT, 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20070723 Iceweasel/2.0.0.6 (Debian-2.0.0.6-0etch1+lenny1)');
    curl_setopt ($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    $result = curl_exec ($ch);
    curl_close ($ch);
    $page=explode("\n",$result);
  }

Überschriften auslesen

Ich lese die Tabellenübberschriften mit einem regulären Ausdruck aus (man beachte dass die Sternchen sich der Formatierung (links/rechts) anpassen), aus dem danach die Spaltenbreiten gelesen werden können. Aus den Spaltenbreiten wiederum kann ein regulärer Ausdruck gebaut werden über den auf die Werte zugegriffen werden kann.

Beispielsweise steht auf der Webpage:

NAME                                   POS GP   G    A PTS SOG +/- PIM PPG SHG

daraus lese ich mit folgendem Regexp die Feldbreiten:

'@^(NAME *)(POS *)(GP)( *G)( *A)( *PTS)( *SOG)( *\\+/\\-)( *PIM)( *PPG)( *SHG)$@'

Damit baue ich dynamisch einen neuen regulären Ausdruck, der die Tabellendaten auslesen kann:

/^(.{39})(.{4})(.{2})(.{4})(.{5})(.{4})(.{4})(.{4})(.{4})(.{4})(.{4})$/

Codiert sieht es so aus. $tline im Codebeispiel beinhaltet eine getrimmte Zeile aus dem HTML.

// Überschriften und Feldgrössen
if(preg_match('@^(NAME *)(POS *)(GP)( *G)( *A)( *PTS)( *SOG)( *\\+/\\-)( *PIM)( *PPG)( *SHG)$@',$tline,$matches)) {
  if(!$inresults) {
    // Nach den Überschriften kommen die Tabelleneinträge
    $inresults=true;
    // Überschriften auslesen
    $headercaptions=preg_split('/ +/', $tline, -1, PREG_SPLIT_NO_EMPTY);
    // Überschriften ausgeben
    echo "\r\n".join("\t",$headercaptions)."\r\n";
  }
  // Wie breit ist ein Feld (in Zeichen)
  $sizes=array();
  for($i=1;$i<count($matches);$i++) {
    $sizes[$i-1]=strlen($matches[$i]);
  }

  // Suchmuster für Einträge aufbauen
  $searchpattern="";
  foreach($sizes as $size) {
    $searchpattern.='(.{'.$size.'})';
  }
  //print $searchpattern."<br />";
  $searchpattern='/^'.$searchpattern.'$/';
  continue;
}
// Tabellenzeilen auslesen
if($inresults && preg_match($searchpattern, $tline, $matches)) {
   $row=array();
   for($i=1; $i<count($matches); $i++) {
     $row[]=trim($matches[$i]);
   }
   // Und ausgeben
   echo join("\t",$row)."\r\n";
   continue;
}

Ausgabe als Excel

Hier bescheisse ich… Ich gebe nur eine tabulatorseparierte Liste aus. Excel schnallts, OpenOffice leider nicht (hat da wer eine gescheitere Lösung? HTML-Tabellen?)…

Zuerst die Headers:

header("Content-type: application/vnd.ms-excel");
header('Content-Disposition: inline; filename="'.$dateiname.'.xls"');

Einzelne Zellen werden mittels Tabulator (\t) voneinander getrennt, Zeilenenden werden durch "\r\n" markiert:

echo join("\t",$row)."\r\n";

Die Lösung

Die komplette Lösung kann hier fantasy-league heruntergeladen werden und eine Demo gibts auf apps.oncode.info