Leipzig

Wir sind wieder zurück von der Games Convention. Momentan schaufle ich gerade ein paar andere Daten von meinem Rechner auf DVDs, damit ich danach die Videos von der Messe bearbeiten kann. Wird es demnächst zu sehen geben.

Aber schon mal ein kurzer sum-up:

Die Züge, mit denen wir dieses Jahr unterwegs waren, waren erstaunlich pünktlich. Mehr als 5 Minuten Verspätung war nicht drin. Großes Plus an die Bahn!

Das Hotel, in dem wir untergebracht waren, war auch der Hammer. Es war das günstigste Hotel, das wir haben bekommen können – war halt etwas ab vom Schuss (20 Minuten mit der Straßenbahn bis zum Hauptbahnhof) – aber super gemütlich und sehr große Zimmer. Wenn ich mir überlege, daß wir bei einem anderen Hotel auch das dreifache ausgeben gekonnt hätten… Was hätte man da mehr bekommen? Massage für jeden Einwohner inklusive?

Einziger Haken war, daß im Einkaufszentrum direkt nebendran gebaut wurde – und zwar rund um die Uhr. Und das mit Kreissäge, klappernden Metallstangen und allem, was krach macht. Rein gefühlsmäßig nachts sogar lauter als tags (solange wir im Hotel waren).

Leipzig empfinde ich als keine attraktive Stadt. Das könnte aber auch daran liegen, daß momentan ÜBERALL gebaut wird. Aber auch die Häuser sind nicht der Renner – und die Straßenbahnen sind absolut aus dem letzten Jahrhundert… Allerdings sind uns die Augen fast aus dem Kopf gefallen, als wir dann die Preise gesehen haben. Am ersten Abend waren wir noch in einer Kneipe – zwei Weizen und zwei kleine FANTA: 5,40 Euro. Dafür bekommt man in Heidelberg ja noch nicht mal zwei Weizen alleine… Und Döner für 2 Euro? In Heidelberg ist man glücklich, wenn man in der „Happy Hour“ den Döner mal für 3 Euro bekommt…

Auch nicht übel: Wenn man durch Leipzig läuft (oder fährt), dann gibt’s für Männer des öfteren mal was zum hingucken. Neben dem „normalen Volk“ rennt einem dort alle paar Minuten eine Frau über den Weg, bei der man sich auch nach dem fünften Blick noch nicht sattgesehen hat… Wow! Da muß irgendwo ein Nest sein. Kann man das nicht irgendwo hier in der Region auch mal installieren? 😉

Die Messe war eigentlich ziemlich ähnlich wie letztes Jahr. Als „Fachbesucher“ haben wir zwar ein vielfaches bezahlt, aber zwei der drei interessanteren Kontakte hatten wir im Consumer-Bereich. Ansonsten war irgendwie niemand für uns interessantes ansprechbar. Wir hätten aber vielleicht auch vorzeitig mal einen Plan machen sollen, was wir überhaupt wollen 😉 – Naja. Halt doch eher Techniker als vom Marketing…

Das Eröffnungskonzert war sehr nett – aber ein paar mehr Klassiker in der Musikauswahl hätten nicht geschadet.

Aber dafür hatten Sebastian und ich eine nette Idee für ein zukünftiges Projekt… Mal schauen.

Spaß gemacht hat’s trotzdem und gelohnt hat es sich alleine der Abwechslung wegen. Ein paar Tage raus aus dem immer wiederkehrenden Büro-Alltag.

Ich packe meinen Koffer und nehme mit…

Die Games Convention ruft… Und ich packe meinen Koffer und nehme mit:

  • Visitenkarten
  • Videokamera
  • 5 Akkus für die Videokamera
  • 10 leere Videokassetten
  • Ladegerät für Videokamera-Akkus
  • Netzteil für die Videokamera
  • Fotokamera
  • Zwei Speicherkarten (1x 128MB, 1x 16 MB) für die Fotokamera
  • 20 Mignon Akkus (AA) für die Fotokamera (jeweils 4 Stück gleichzeitig benötigt)
  • Ladegerät für Mignon Akkus (AA)
  • Stativ für wahlweise Video- oder Fotokamera
  • Handy N-Gage
  • Ladekabel für das N-Gage
  • MMC-Speicherkarten für N-Gage (MP3-Player)
  • Kopfhörer / Freisprechkabel für N-Gage
  • Ersatzakku für N-Gage
  • 3fach Steckdosenleiste
  • 3 Unterhosen
  • 3 Paar Socken
  • 2 schwarze Polo-Shirts „4cheaters.de / Dominik Deobald“
  • weißes Kurzarmhemd
  • schwarze Jeans
  • grüner Pullover
  • Shorts und T-Shirt, a.k.a. Schlafanzug
  • Zahnbürste
  • Rasierer plus Rasierschaum
  • Duschgel
  • Seife
  • Deospray
  • Handtuch
  • Proviant für die Reise muß ich morgen vor der Abreise noch organisieren

Außerdem darf ich natürlich nicht vergessen:

  • Fahrkarte (Deutsche Bahn)
  • Eintrittskarten für das Eröffnungskonzert
  • Hotelreservierung
  • Fachbesucher Registrierungsnummern für die Games Convention (die haben mich übrigens alleine in der Anschrift zwei mal falsch geschrieben – ein mal Deobold und ein mal Deovald)

SMS-Bestellung ist aus

Letzte Woche haben wir bei Verivox unserem SMS-Bestellungs Gateway den Todesstoß gegeben. Man konnte darüber Prepaid-Aufladecodes einfach via SMS anfordern, indem man eine vorgefertigte SMS in einem bestimmten Format an uns schickte. Lief auch wunderbar, bis es ein paar Änderungen bei den Kreditkartenzahlungen gab – danach war es leider nicht mehr möglich.

Über das Interface sind über die Jahre einige fehlgeleitete oder fehlverstandene SMS bei uns angekommen. Ich habe mal ein paar davon rausgesucht:

  • Ja ich moechte kaufen.Danke
    Schön – und was?

  • Hi du kommst morgen mit ins avalon? Und hast lust übermorgen mit zu kommen auf ne Tupperparty? Meld dich Elfi
    Au ja, Tupperparty!

  • Ich bin im Ausland und benötige dringend Guthaben. Meine Daten sind hinterlegt bei Ihnen (3426966). Bitte senden sie mir 30 Euro D1-Guthaben. Danke.
    Ja, wir lesen jede empfangene SMS und bearbeiten sie manuell…

  • na du, ich wollte mal fragen, was du ueber pfingsten geplant hast? wollen wir beiden etwas zusammen unternehmen? meld dich doch mal. lieben gruss kim
    Diese SMS haben wir übrigens beantwortet mit „Ich liebe dich auch… Aber vielleicht sollte ich erwähnen, daß ich nur ein Automat bin, bei dem man Einkaufen kann. Mehr Infos bei www.charge-it.de“ – weil in ihm irgendwann mal das Wort „Liebe“ beigebracht habe 😉

  • ####@aol.com: hallo habe eure sms empfangen, kann sie aber nicht an euch weiterleiten da das guthaben nicht mehr reicht. was mache ich jetzt
    Hmmmm… Problem 😉

  • Nach nicht die tür auf wenn es klingelt
    Uh-Oh…

  • ####@aol.com: so fertig geschneit 😛 samma schatzl übertreibs aber nich so trinkmässig ok
    Alkohol ist nicht gut!

  • hi,ich bin Alex und moechte dich gerne kennen lernen. Ich bin solo sehr spontan und ausgeflippt. hast du lust mich kennen zu lernen? 1.99eur/sms
    Nur 1,99 pro SMS – na toll… Und Alex/Frau oder Alex/Mann? 🙂

  • Hey na du lange nix gehört! Wie geht es dir? Gruß susi
    und kurz drauf
    Hey die mail war nicht für dich sorry!
    Doh! 😉

  • Sorry dass ich erst jetzt schreibe,habe getelt und konnte nicht ins i net um handy aufzuladen. Ich gehe jetzt ins bett. Ich liebe dich!
    Jaja…

  • Ich befinde mich zur Zeit im Auslandseinsatz in Usbekistan und benötige insgesammt noch etwa 4 Karten. Läßt sich da was machen? MfG Jan-Hauke ####
    Und später
    Ihr mich auch
    Die glauben wirklich, daß wir das manuell machen…

  • Man ich hasse hasse hasse hasse hasse dieses beschissene bild.am liebsten würd ich einen topf schwarze farbe nehmen und einfach drüber kippen.man ich hasse es
    Auch eine Art abzureagieren

  • ####@gmx.de (Gute Nacht!)Scheint bei dir auch so herrlich romantisch der Mond? Gute Nacht. ursa
    Der Mond ist toll hier! 🙂

  • Ich leb noch keine Angst… 🙂 im strömenden regen noch a karte gholt! Nur wegen Dir 🙂 meins! Für immä!
    Von wegen… Bei uns bestellt hat er – noch nicht mal das Haus verlassen…

  • Hy süße kennstf mich noch
    Ja, klar 😉

  • Nach § 11(4) des dt. liebesbuches sperre ich dich sofort lebensl“nglich in mein herz ein. Gegen dieses urteil kann keinerlei widerspruch eingelegt werden.
    Der ist goldig, oder?

  • wer bist du ?wäre nett um sms antwort
    Ich bin ich, wer bist du?

  • Sorry. Meld mich nachher nochmal… Nicht böse sein
    Doch, bin ich

  • Nein,ich bin nicht sauer.ich bin nur krank u deshalb wird es heute auch nix.
    Jaja 😉

  • hi sorry die späte störung aber deine nummer hab ich im handy und keinen namen dazu würde gern wissen wer du bist!
    Eine Maschine!

  • Danke fürs einkaufen, baby! Liebe dich!
    Kaufe doch gerne ein…

  • Soll ich dir ein Salat mitbringen? Vom Fabri…bin gerade da in ne Nähe…
    Ich nicht, aber Dominik R. vielleicht 😉

  • Wo treibschtn du dich schun wida rum, Sista ? Hoscht schun beim Tätowierer ogerufe ? ;o)
    Ne, kein Stempel aufgedrückt bisher

  • Liebe dich sehr mein engel
    Dein Teufelchen…

  • Hä? -lieb sag- hast du ne Karte für mich? -lieb frag- woher kommst du und wie alt bist du?
    Ziemlich alt…
    Toll ich hab kein Geld mehr auf m Karte… -traurig guck-
    Sniff

  • Und zum Abschluß mein absoluter Favorit:
    Schön das du ein freund hast. Wieso sagst du zu mir schwuchtel. Hab ich dir was getan oder was. Wieso machst du das. Schreib zurück

Thumbnails und deren Erstellung

Nachdem ich mich die letzten paar Tage mehr oder weniger erfolgreich mit Gallery 2 herumgeschlagen habe und es mir in mehrerlei Hinsicht ernsthaft Kopfzerbrechen bereitet hat („Manche Bilder lassen sich beim besten Willen nicht importieren…“, „Wie komme ich an die Inhalte ran, wenn ich grade kein Browser bin, sondern ’ne andere Webseite (soll passieren…)?“ oder „Es frisst alle meine Resourcen!“) – und schon bin ich wieder beim Stand von vorher:

Ich mache es selbst.

Immerhin habe ich inzwischen entschieden, kein verteiltes System mehr draus zu machen. Alles auf einen Server vorerst.

Heute habe ich ein nicht ganz unwichtiges Problem gelöst: Thumbnails. Ich weiß, die hab ich schon etwa 5 mal vorher auch gelöst, aber jedes mal wurde es wieder ein bisschen besser. Langsam aber sicher bin ich glaube ich beim Optimum angekommen.

Eine der Schwachstellen meiner Thumbnail-Lösungen bisher war, daß sie über dynamische Scripts liefen, die in jedem Fall Resourcen für den PHP-Interpreter futtern. Und sei es nur, um zu überprüfen, ob die Datei da ist – und wenn ja, einfach eine Weiterleitung zur Thumbnail-URL zu machen. Da solche Galerieseiten zumindest bei mir nicht selten ein paar hundert Bilder enthalten, bedeutet das mehrere hundert PHP-Seitenaufrufe, die eigentlich nichts machen.

Okay, was war bisher:

  • Zum Anzeigen eines Thumbnails wurde eine PHP-Seite aufgerufen.
  • Diese hat überprüft, ob die Thumbnail-Datei schon existiert:
    • Falls ja: Ressourcen verschwenden, nichts tun…
    • Falls nein: Datei erstellen
  • Weiterleiten zur URL des Thumbnails

Und jetzt?

  • Die URL des Thumbnails wird direkt aufgerufen
  • Datei vorhanden?
    • Falls ja: Alle glücklich, wir sind schon fertig, es wurde kein PHP aufgerufen
    • Falls nein:
      • In der .htaccess steht „ErrorDocument 404 /thumber.php“, also wird /thumber.php aufgerufen.
      • thumber.php schaut sich $_SERVER[„REQUEST_URI“] an, und weiß daher, welche Datei eigentlich hätte aufgerufen werden sollen
      • So weit möglich erstellt es sie also…
      • … und schickt ihren neuen Inhalt an den Browser

Für jede Datei bzw. ihren Thumbnail erfolgt der Aufruf des PHP-Scripts also nur ein mal. Alles andere läuft über den Austausch statischer Dateien. Alle sind glücklich, der Server ist entlastet.

Und das allerbeste: Es funktioniert sogar 😉

Informationen zu Medien-Dateien

Momentan schraube ich an den Bildergalerie von Spherical Bytes rum und bin – da ich das ganze wie üblich zum allwissenden Weltherrschaftsübernahmetool ausbaue – auf die Grenzen von PHP gestoßen. Ich möchte nämlich nicht nur eine „Bildergalerie“ haben, sondern eine Media-Galerie, die auch Videos und Audio-Dateien futtert.

Nur kann PHP eben mit Bild-Dateien ganz problemlos umgehen, aber wie bekomme ich Informationen über die Laufzeit eines Videos oder einer MP3-Datei? Mit den Bordmitteln gar nicht – aber es gibt ja jede Menge andere Leute, die die gleichen Probleme haben wie ich. Und die waren schon fleißig und haben getID3() gebaut. Ein weiteres Beispiel für einfach zu verwendende aber sehr leistungsfähige Open Source Software!

Sicherheit und Geschwindigkeit

Seit einiger Zeit gibt es auf 4cheaters.de jetzt schon die Forums-Funktionalität. Anfangs habe ich ja eigentlich gar nicht wirklich damit gerechnet, daß hier viel passieren wird, aber inzwischen ist da richtig was los. Mittlerweile sind weit über 12.000 Beiträge geschrieben worden.

Zeit für mich, das ganze mal wieder etwas genauer unter die Lupe zu nehmen. Wenn auch zugegebenermaßen etwas unfreiwillig, weil ein Störenfried am letzten Wochenende gewütet hat und in wenigen Minuten 90 mal den gleichen Beitrag geposted hat. Damit ist einerseits natürlich die Webseite übergelaufen und andererseits haben die Leute auf meiner Seite die Möglichkeit, sich per E-Mail über neue Beiträge in einem Thread informieren zu lassen. Im entsprechenden Board zu Vampire: The Masquerade – Bloodlines nutzen momentan etwas mehr als 20 Leute diese Funktion. Ergo: knapp 2000 Mails gingen da sinnloserweise raus.

Ergo: Generalüberholung ist angesagt.

Schritt eins war relativ schnell realisiert: Eine maxmiale Zahl von Posts pro Zeitabschnitt pro IP-Adresse. Dazu speichere ich jetzt (endlich) die IP zu jedem Beitrag. Hätte ich schon früher machen sollen. Mit einer einfachen SQL-Abfrage kann man dann ganz einfach erkennen, wie viele andere Posts von dieser IP in den letzten 3 Minuten kamen. Sind es 3 oder mehr, dann muß der betreffende erst mal ein bisschen warten. Jenachdem, ob das reicht, kann ich notfalls auch noch eine weitere Stufe einbauen, z.B. maximal 10 Posts pro Stunde oder so. Ich gehe aber mal davon aus, daß das Störenfrieden relativ schnell den Spaß (?) verdirbt.

Schritt zwei ist auch nicht viel schwieriger: Bisher kam es relativ häufig vor, daß Leute ihre Posts doppelt eingetragen haben. Ich denke, das geschieht einfach durch einen – gewollten oder ungewollten – Doppelklick auf den „Absenden“-Knopf oder durch das drücken des Reload-Buttons. Das wurde bisher nämlich nicht abgefangen. Der Doppelklick wird ab sofort schon mal durch ein kleines Javascript erschwert:

<input type="submit"
value="Absenden"
id="submitbutton"
onclick="window.setTimeout('document.getElementById('submitbutton').disabled = true;', 10);">

Dadurch wird der Knopf nach dem drücken ausgegraut und kann nicht mehr angeklickt werden. Das ist aber noch nicht alles. Im Formular übergebe ich jetzt auch noch ein verstecktes Feld mit einer einmaligen ID:

<input
type="hidden"
name="comment_session"
value="<?PHP echo md5($_SERVER[REMOTE_ADDR] . date("D M j G:i:s T Y")); ?>"/>

Diese wird beim Abspeichern überprüft und damit werden Doppel-Posts effektiv verhindert.

Und jetzt kommt der dritte und momentan letzte Schritt, der allerdings mit der ganzen Störenfried-Thematik nichts zu tun hat:

Wie schon geschrieben, habe ich beim Entwickeln der Forums-Funktion nicht mit einem durchschlagenden Erfolg gerechnet. Der kam aber, und damit wurde alles sehr, sehr langsam. Das Erzeugen der oben verlinkten Seite hat zwischen 20 und 50 Sekunden gedauert – und der Webserver war in dieser Zeit sehr beschäftigt. Das Problem war die Darstellung des Threads in der Baumstruktur.

Der Einfachheit halber habe ich dazu einen rekursiven Ansatz gewählt und diesen auch nicht wirklich optimiert. Es wurden daher ein mal alle Beiträge aus der Datenbank gelesen. Danach wurde die Darstellung gestartet, die auf dem Prinzip basiert, daß jedes mal, wenn ein Beitrag dargestellt wurde, wieder alle anderen Beiträge durchsucht wurden, ob sie in der Hierarchie unter dem gerade dargestellten liegen. Bei 10 Beiträgen ist das nicht weiter wild. Macht 10×10 = 100 Überprüfungen. Wenn jetzt aber wie zum Beispiel bei Counterstrike etwa 600 Beiträge da rumlungern, dann sind wir schon bei 600×600 = 360.000 Vergleichen -> Laaangsaaam 😉

Der neue Ansatz ist wesentlich Resourcen schonender:
Es wird ein mal am Anfang zu jedem Beitrag ein „Hierarchie-String“ erzeugt. Das könnte etwa so aussehen:

0001
0001-0002
0001-0003
0001-0003-0004
0005-0006

Hier hat also das Root-Element die Unter-Elemente 1 und 5. Element 1 wiederum hat die Unter-Elemente 2 und 3, von denen 3 noch das Element 4 enthält. Element 6 liegt in Element 5.

Das Aufbauen eines Hierarchie-Strings ist relativ einfach möglich, indem man jeweils den String des Parent-Elements nimmt entsprechend erweitert. Auch einfach ist es danach, diese Strings zu sortieren – in PHP am geschicktesten mit der Funktion asort(). Und danach muß man nur noch ausgeben. Eigentlich interessiert einen an diesem Punkt die Hierarchie an sich gar nicht. Man muß nur entscheiden, wie weit man seine Elemente einrücken muß – und das kann man aus der Länge des Strings ablesen.

Ergebnis: von 20 Sekunden (im bisher besten Fall, wenn dem Server sonst langweilig war) runter auf 0.2 Sekunden (wenn der Server ganz normal arbeitet). Was so ein Algorithmus ausmachen kann…

Schritt vier wird demnächst folgen: Das Ein- und Ausblenden von Threads durch das Klicken auf kleine „+“ und „-“ Icons, ähnlich wie es z.B. im Explorer mit den Verzeichnissen auch funktioniert. Ich muß mich nur noch entscheiden, welchen Ansatz ich hier nehme. Ich würde ja gerne auf DHTML setzen. Die Art, wie Microsoft das in der MSDN-Seite gelöst hat gefällt mir nämlich super-gut 🙂 – nur macht das so viel Arbeit…