Hinter den Kulissen
Ich hab mir gedacht, ich erzähle euch mal, was mich die letzten Tage so bewegt hat – und dass, wo ich doch eher unbewegt im Bett lag. Schliesslich ist das doch der Sinn eines Blogs, dass man etwas von sich selbst erzählen kann.
So habe ich mich wieder als Programmierer betätigt, musste Wizards aber auf ihre Anfrage, ob ich ihnen bei MTGO v3 aushelfe, einen Korb geben. Nicht ganz uneigennützig… (couchdraft geht nur mit v2.5) – so bleibts erstmal bei der alten Version. hrhr
Ich programmiere sehr gerne und habe neuerdings, nach einigen Ausflügen in Visual Basic und Makroprogrammierung in Excel und Access (ich denke, da fast alles gesehen zu haben) mich endlich in die Welt von PHP und Co getraut.
Wobei „und Co“ warscheinlich JavaScript ist, in gewisser Weise aber auch diese von Access schon ansatzweise bekannte SQL-Sprache. PHP ist ja auch sinnvoller, da sich inzwischen wirklich alles früher oder später im Internet breit macht.
Daher quäle ich euch heute mit meinen Ergebnissen. Meine Deckdatenbank beispielsweise. Wobei ich hinzufügen muss: Solange sie noch da ist.
Brandstifter Direkt zum UPDATE
Wie ich heute morgen feststellen musste, hat sich nämlich eine Horde Terroristen über meine Deckdatenbank her gemacht und mehr als die Hälfte gelöscht – ja, die Datenbank beginnt nun mit 39 und hat ein Loch zwischen 48 und 63.
Insgesamt 51 Decks hat jemand (eventuell waren es auch viele) gelöscht. Gut, das kommt eben davon, wenn man zwei Fehler kombiniert. Die Löschfunktion, die ich anfangs häufiger brauchte, ist inzwischen fehl am Platz, aber immer noch verfügbar. Dabei gibt es ein Zugriffmerkmal, dass Decks auf inaktiv setzen kann ohne sie zu löschen – ich habe es nur noch nicht an Stelle des tatsächlichen Löschens eingebaut. Immerhin ist das Löschen über eine Benutzerberechtigung abgesichert, so dass nicht jeder Decks löschen kann.
Aber in der Benutzerberechtigung (über das Setzen eines Cookies) war der zweite Fehler, der, das ist der Stand meiner Erkenntnis, den Keks immer wieder herstellt, auch wenn das Skript zum Erstellen des Cookies eigentlich einen nur mir bekannten Aufruf benötigen sollte und den Cookie ansonsten löscht. Dachte ich zumindest…
Jemand hat diese beiden Fehler entdeckt und sich einen Spass gemacht, vor allem alte Decks zu löschen. Ich kann mir nicht erklären, warum – diese Psychologie wird mir nicht zugängig, je öfter ich auch darüber nachdenke, aber es ist so. Lässt man alles soweit „offen“ – das trifft schliesslich auch auf die Anmeldungen bei Couchdraft und Couchmagic zu, dann gibt es Personen, die mit dieser geteilten Art nicht zurecht kommen. Schade.
Ob ich es mal mit einem Fundraiser probieren soll? Eine Spende zur Wiederherstellung der Datenbank aus Backups – die mein Provider sich gut bezahlen lässt? Wer entsprechendes Engagement hat, bitte per mail an mich (Klammerausdruck durch ein @-Zeichen ersetzen) oder in die Kommentare. Aber warscheinlicher wird sein, dass ich es aus Mitteln von Magicuniverse decken kann.
Darüber wollte ich auch noch was schreiben – aber die Brandstifter-Sache hat es nun verdrängt. Lest ihr darüber eben erst beim nächsten Mal.
Deck.php
Nun aber zum eigentlichen Erfolg. Ich habe die Funktionalität meiner Deckdarstellung wesentlich erweitert (so weit, dass mir bald nichts mehr Neues einfallen will). Hier mal ein Deck, dass ich noch in der Datenbank gefunden habe:
Bei der Durchsicht meiner Blogeinträge fiel mir auf, dass ich die Darstellung noch nie erklärt habe. Also jetzt: wie das Deck heisst, welches Format wann wer womit gespielt hat, dürfte sich auf einen Blick erschliessen. Das ist trivial und bedarf keiner weiteren Erklärung. Dass der Autorenname auch noch ein Link auf die Quelle des Decks ist, sollte ich aber mal erwähnen.
Neu ist nun, dass beim Ãœberfahren der Kartenlinks die entsprechende Karte in einem Mouseover dargestellt wird. Da ich hier ohne Bilder – nur mit den Textlinks – arbeite, ist es mit einem Preload etwas tricky (eventuell ein späteres Projekt) und die Darstellung des Mouseover-Bilds verzögert sich durch die Nachladegeschwindigkeit. Bisher funktioniert das auch nur mit korrekt geschriebenen und englischen Kartennamen.
Auch die Anzahl der Karten in Maindeck und Sideboard wird schon korrekt gezählt. Ich plane hier noch die Unterteilung in Kartentypen, was aber wohl eine weitere Datenbank (und deren Pflege – Örks!) benötigt. Ich sprach bereits mit Schöppi und Evil – beide gaben übereinstimmende Antworten, daher wird es wohl so sein.
Jedes Deck (das noch da ist – sic!) hat einen eigenen Counter, der als Link auf eine eigene Seitendarstellung dient. Die Decks lassen sich implementiert (wie in diesem Blogeintrag) oder als eigene Seite aufrufen. Wenn ein Deck separat aufgerufen wird, zeigt es auch eine etwas andere Funktionalität, dann gibt es Links für Foren und HTML unter dem Deck und der Mouseover wurde durch ein weniger störenendes Kartenbild in der rechten Seitenleiste ersetzt.
Der Counter steht entweder im Bereich „Info“ – welcher sich übrigens automatisch auf die kürzere Seite schreibt, meistens das Sideboard – oder, wenn es Eltern- und Kind-Verknüpfungen gibt, zentriert unter dem Deck. Dann kann man die Historie des Decks mit seinen Entwicklungen verfolgen.
Neuerdings auch über eine „Compare“ Funktion, die zeigt, welche Änderungen am Deck passiert sind. Während ich hier schrieb, wurden übrigens weitere Decks gelöscht, daher kann ich euch nur diesen Link anbieten, um das zu testen: Riesendeck v1.4.
Ich mag diese Funktion, die auch nicht ganz so einfach zu programmieren war, wie ich mir das zunächst dachte.
Ausserdem funktioniert nun endlich der Link auf Evil’s Deckstats auch in der implementierten Fassung. Hier kämpfte ich lange Zeit mit etwas, das UTF-8 heisst, aber die Lösung war hier sehr einfach. Durch ein „<pre>“ Tag vor und nach dem unsichtbaren Formular wurde der Text korrekt an Evils geniales Skript übermittelt, in dem man sich die Statistiken zum Deck ansehen kann.
Die nächsten Schritte sind allerdings wieder unsichtbarer Natur, denn ich werde von der offenen Schnittstelle zu einer Anmeldung wechseln. Am liebsten wäre mir eine Verwendung der wp_users, denn ich habe ja schon registrierte Benutzer in WordPress. Vielleicht hat ja jemand einen Tipp, wie man die entsprechenden Benutzerberechtigungen in eigene php-Skripte einbinden kann.
Endlose Freude
Beim Sichten von log-files und Statistiken fiel mir auf, wie hoch der Traffic im Januar war. Messe ich meine Besucher in Megabyte, dann haben annähernd 2 Gigabyte Besucher meine Seite im Januar frequentiert. Erheblich daran mitgewirkt hat sicherlich die Couchdraft-Seite, deren bildintensive Darstellung mitverantwortlich ist.
Ãœbrigens gibt es für den Druck optimierte CSS-Layouts auf Couchmagic, falls ich es noch nicht gesagt habe – dazu gehört, dass die Hälfte an Papier bei Couchdraft eingespart wird, da beim Druck die Bilder weggelassen werden und nur die Textlinks erscheinen.
Ich möchte daher diese Gelegenheit nutzen, um mich bei meinen Besuchern für die Aufmerksamkeit, die sich im enorm gestiegenen Traffic ausdrückt, zu bedanken. Wenn ich wieder Magic spiele, gibt es auch wieder „Secret Tech“. Am 23.2. ist schliesslich das Phoenixhort-Turnier in Essen.
UPDATE – 22:06h
Zunächst habe ich aus dem vor diesem Artikel gezogenen Backup eine teilweise Wiederherstellung durchgeführt und mich dann auf die Suche gemacht. Ihr kennt diese Dokumentationen von Flugzeugunglücken auf N24?
„22:06h – wir haben nun die Vorgänge, die zur Katastrophe führten, analysiert. Viel komplexer als vorher angenommen, können die Spezialisten rekonstruieren, welche verhängnisvolle Verkettung von Umständen das Unglück auslöste, bei dem 51 Decks ums Leben kamen“ (oder so…)
Beginnen wir mit dem Cookie-Skript. Wie ich schrieb, dachte ich, es arbeitete fehlerfrei, heute morgen dachte ich dann, es sei defekt – die letzte Wahrheit (auf die kommt es an!) ist die, dass es tatsächlich fehlerfrei seinen Dienst versah.
Warum also wurde den Besuchern der „Delete“ Knopf angezeigt, obwohl das Cookie einwandfrei arbeitete? Schauen wir uns dafür diesen kleinen Code-Schnipsel an:
if ($delete == "anybody" or $delete = "atog28") { echo '<li><a href="cm_koala.php">Destroy Cookie</a></li>'; }
Fällt euch etwas auf? Diese Abfrage steht vor der Anzeige der „Delete“-Links. Versierte PHP-Programmierer haben es sofort entdeckt. Es fehlt ein Gleichheitszeichen bei der zweiten Abfrage! Dadurch wurde, egal, was der Keks sagt (wir fragten ihn vorher), immer die Admin-Berechtigung eingeschaltet. Eine kleine Ursache, aber eine fatale Wirkung!
Kommen wir nun zum nächsten Puzzle-Stück. Wer klickte auf alle Links um die gesamte Datenbank zu löschen? Waren es verantwortungslose Unruhestifter? Sollte es mit der Magic-Community so schlecht bestellt sein? Werfen wir dazu einen Blick in die Log-Files. Glücklicherweise rufe ich ein separates Skript zum löschen auf, so ist der Zugriff schnell ermittelt.
Bei allen Einträgen der delete.php, ich habe keine Ausnahme gefunden die pfirfel’s Kommentar rechtfertigen würde (aber ich habe auch nicht danach gesucht), bietet sich folgendes Bild:
66.249.66.243 – – [11/Feb/2008:19:55:52 +0100] „GET /robots.txt HTTP/1.1“ 404 1503 „-“ „Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)“
66.249.66.243 – – [11/Feb/2008:19:55:52 +0100] „GET /delete.php?id=5 HTTP/1.1“ 302 5 „-“ „Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)“
66.249.66.243 – – [11/Feb/2008:19:55:54 +0100] „GET /decklist.php HTTP/1.1“ 200 7087 „-“ „Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)“
Für die technischen Mondkucker: Auslöser war der Bot von Google, der die Seiten scannt. Da der Link auch ohne Keks angezeigt wurde (Kekse nimmt der Bot nicht, warum auch immer, ich vermute: Weissheitszähne…) folgte er in der Annahme, auf eine neue Seite zu kommen, dem Lösch-Knopf und sprang wieder zurück.
Eventuell sollte ich eine
robots.txt
schreiben damit das nicht nochmal passiert, aber das ist ein anderes Thema. Mein Glaube in die Magic-Community ist wieder hergestellt – da habt ihr noch mal Glück gehabt. Was pfirfel angeht: drei Draftwalkthroughs und ein Artikel für MU!
Ob die Datenbank wieder hergestellt werden kann, bleibt abzuwarten. Den Restore-Auftrag habe ich gerade gestellt, aber die Backups gehen eventuell nicht weit genug in die Vergangenheit. Die Skripte sind nun geändert, ein Löschen ist nicht mehr möglich (nur noch ein Setzen eines „ich bin gelöscht“ Flags, wie es sich gehört). Den Rest dazu (dass die gelöschten auch nicht mehr angezeigt werden) muss ich noch programmieren, aber das kommt dann später…
Da hab ich dann ja wieder was zu tun. Nach der „Bindestrich-Affäre“ ist mein Lieblingsbuchstabe heute der Doppelstrich (das Gleichheitszeichen).
13. Februar 08 um 14:38
Das Tunier findet in der Villa Rü statt. Wollte es nur anmerken, nicht das da am Samstag Leute vor der falschen Location stehen. Im Phönixhort wird am 21.02 ganz normal Casual gespielt…
13. Februar 08 um 17:06
Ich gebe es zu. Ich konnte der Versuchung nicht trotzen. Einmal habe ich in deiner schnuckligen Datenbank auf „Löschen“ gedrückt. Das ist wie das hier: http://www.wimp.com/press/
13. Februar 08 um 17:09
Da macht ihr ein Turnier direkt um die Ecke und ich bin in Belgien…
@Atog: Was ist mit Wien?
13. Februar 08 um 17:19
ROTFLMAO – nun hat noch jemand BaJis Deck getötet. Ihr Schweine! (ok, auch ein bisschen Kindergarten, aber Schweine, nonetheless. Kindergartenschweine…^^)
Wien? Hab ich wohl „versehentlich“ gelöscht… Wien gibt es nicht mehr.
13. Februar 08 um 22:16
Soooo… ich habe das wieder hingebogen, und hier steht das Update!
Wien – ich weiss nicht genau ob ich da hin möchte. Kläre ich Montag.
15. Februar 08 um 13:32
Ohhh man.
Wie kannst Du nur eine Abfrage bauen, indem direkte Zeichenketten vergleichst.
Mach es über die interene User ID, ansonsten wird dann script immer dann wieder fehler machen wenn du deinen nick änderst.^^
NENENE das kommt von quick&dirty
lieber vorher für zeichenketten konstanten verwenden.
Ist nicht nur non-nooby sondern vermeidet auch Fehler.
15. Februar 08 um 15:18
Hmjam… Scheinbar können Kekse noch mehr? Die Idee mit der User-ID gefällt mir, danke.
Ich lese bisher den $delete Wert aus dem Keks und der Code-Schnipsel ist nur ein Beispiel. Da steht nicht wirklich mein Username im Keks, es sollte die Abfrage nur verdeutlichen. Aber quick’n dirty trifft’s.