Category: Programming

GUI-Scripting mit XML und LUA

Ja genau, und zwar für World of Warcraft! ;-)

Leider gibt es zu diesem Thema relativ wenig Dokumentation - und schon gar nicht von Blizzard selbst. Also heißt es ausprobieren - UI neu laden (mit /console reloadui) und das ganze nochmal von vorne. Aber wenn man erstmal das System verstanden hat, dann macht es echt Spaß “Frames” in XML zu basteln und das ganze dann mit LUA zum Leben zu erwecken. Insgesamt ein tolles - und vor allem auf offenen Standards basierendes - System, dass sich Blizzard da ausgedacht hat.

Nur eines vermisse ich etwas: Das erzeugen von Frames bzw. Elementen per LUA. Wenn man eine variable Anzahl von irgendwelchen Elementen bereitstellen möchte, kann man das nur lösen indem man vorher eine größere Anzahl von diesen Elementen definiert - meiner Ansicht nach nur die zweitbeste Lösung. Ein kleines Beispiel, um das zu veranschaulichen: Ich möchte ein Aufklappmenü basteln, dass aus einer Liste generiert wird, in die der Benutzer selbst Daten eintragen kann. Da ich ja für jeden Menüeintrag ein XML-Element (Frame bzw. FontString) brauche, muss ich eine großzügig dimensionierte Anzahl in der XML-Datei definieren, damit mir nicht irgendwann die verfügbaren Felder ausgehen.

Ich habe mich mal drangemacht, meinen “PlayerFrame” zu verbessern und einige Funktionen hinzuzufügen, die neuesten Versionen gibt’s immer bei ui.worldofwar.net und zwar unten rechts in der Dev Zone.

DNS

Und zwar hab ich mir folgendes überlegt: Ich könnte ja eigentlich alle Subdomains von timcn.de auf ein Laufwerk meiner Festplatte mappen. Genauer: Wenn man beispielsweise http://localhost.timcn.de eingibt, liefert mein lokaler Apache die Daten aus dem Verzeichnis D:\localhost. Mit Apache geht das eigentlich ganz einfach, es gibt dazu die Direktive VirtualDocumentRoot - das ist alles was man benötigt. Auf Serverseite schaut das etwas komplizierter aus. Ich habe bei meinem Domain-Provider (mein Webspace liegt wieder bei einem anderen Provider ;-)) veranlasst, dass alle Subdomains außer www auf den Host timcn.no-ip.com umgeleitet werden. Der wiederum wird per No-IP-DUC auf dem aktuellen Stand, also meiner IP-Adresse, gehalten. Mal schaun ob die Lösung so klappt oder ob ich das irgendwie anders machen muss. Noch ne Frage, kennt jemand einen Weg, Windows dazu zu bringen, bei allen Subdomains einer Domain (außer www) auf eine feste IP umzuleiten (also 127.0.0.1)?

Update um 21:17 Uhr:
Es funktioniert wirklich! Finde ich irgendwie eine coole Lösung. Jetzt muss ich nur noch .htaccess-Dateien schreiben und den Zugriff von außen beschränken ;-)

Datumsauszeichnung

Mal wieder ne knifflige Frage: Welches (X)HTML-Element sollte man verwenden, um ein Datum auszuzeichnen? Ich meine kein Datum im normalen Textfluss sondern ein alleine stehendes Datum, z.B. bei einem Blogeintrag wie es auch hier zu finden ist.

  1. <div class="date">17. 05. 2005</div>
  2. <small class="date">17. 05. 2005 (Vorschlag von Markus)
  3. <span class="date">17. 05. 2005</span>
  4. oder direkt inline im Elternelement?

Ich weiß momentan nicht weiter. div hat halt keinerlei semantische Bedeutung. small ist eine rein physische Auszeichnung und meiner Meinung nach nicht für eine Datumsauszeichnung geeignet. span hat im Prinzip auch keine Bedeutung - noch dazu wird der Text quasi inline-Content. Und direkt in das Elternelement - damit hab ich auch keine Semantik, ich hab zwar vielleicht nix falsch gemacht, aber nichts machen ist auch keine Garantie dafür, dass es richtig ist ;-).

Wenn dann noch eine Uhrzeit dazukommt wirds erst richtig spannend. Die einzelnen Datumsbestandteile (also Datum und Zeit) noch in spans unterteilen? Und vor allem: Welches Datumsformat verwenden damit das ganze nicht zu unübersichtlich wird? (ISO-Daten mögen zwar einfach (maschinen-)lesbar sein, schön anzusehen sind sie aber nicht, da ihnen meiner Meinung nach die Struktur fehlt, also Satzzeichen zum deutlichen Trennen der einzelnen Bestandteile).

Dateiupload mit PHP

Sehr interessant finde ich die Funktion, HTTP-Dateiuploads via Browser mit einer Fortschrittsanzeige zu versehen. Oft muss man auch mal größere Bilder hochladen - und die Seite lädt und lädt und lädt… und man weiß nie genau, wie weit der Upload nun fortgeschritten ist und wann man seinen - der Telekom sei Dank - ohnehin schmal bemessenen Upstream anderweitig nutzen kann. So eine Funktion kann man beispielsweise bei PhotoCase oder bei Müller Foto in Aktion sehen. Allerdings scheint eine solche Anzeige nicht mit PHP realisierbar zu sein. Punkt. PHP kann nicht auf halb hochgeladene Dateien zugreifen. Das enttäuscht mich irgendwie weil ich bisher immer angenommen habe, mit PHP kann man alles machen. Tja, so kann man sich in OpenSource-Gefrickel täuschen. ;-)

Allerdings gibt es dennoch eine Lösung wie man - zumindest mit gaaanz wenig Fremdcode (also aus anderen Programmiersprachen stammender Kot) - doch eine solche Funktion basteln kann. Es gibt eine vorgefertigte Scriptsammlung namens Mega Upload, die schon Perl- und JSP-Scripts mitbringen, die eine entsprechende Funktion bereitstellen. Dann braucht man sich seinen (hoffentlich) schönen PHP-Programmierstil nicht von - hüstel - anderen Programmiersprachen versauen lassen.

Creole

Creole

Creole ist ein Database Abstraction Layer. Aber Creole ist anders als andere DBALs. Creole ist schnell. Sehr schnell. Und objektorientiert. Und Creole ist extra für PHP 5 programmiert und nutzt die ganzen Vorteile von PHP 5 aus. Kurz und gut, Creole ist wirklich empfehlenswert.

Andere Abstraktionsschichten wie Pear:DB, Pear:MDB etc. sind oft recht schwerfällig in der Anwendung. AdoDB ist zwar auch recht nett, hat aber Features für wirklich alles und jedes. Auch für Features, die nur eine einzige Datenbank unterstützt. Das finde ich etwas übertrieben, denn der Sinn eines DBALs ist für mich die möglichst große Kompatibilität mit verschiedenen Datenbanken. Creole unterstützt MySQL, PostgreSQL, SQLite, MS SQL Server und bald auch Oracle. Also alle wichtigen Datenbanksysteme.

Creole hat auch ein recht interessantes Sicherheitssystem. Wenn man das nutzt, gehören SQL-Injections der Vergangenheit an, da man für jedes Feld definieren kann, welchen Datentyp es besitzt. Außerdem werden alle von Nutzern übermittelten Daten automatisch maskiert so dass keine SQL-Anweisungen untergangen werden können.

Das Creole wirklich solide ist, kann man bereits am Quellcode erkennen. Der Code ist wirklich extrem gut und ausführlich kommentiert. So einen schönen Code sieht man wirklich selten.

Datenbankexport mit phpMyAdmin

Ich habe gerade einen bequemen Weg gefunden, wie man seine Datenbank mit nur einem Klick sichern kann. Man braucht dazu nur phpMyAdmin und einen URI, dem man alle gewünschten Parameter übergibt. Glücklicherweise akzeptiert das PHP-Script die Parameter nämlich auch per GET und besteht nicht auf der Übergabe per POST. Die Parameter sind im Einzelnen:

  • lang=de-iso-8859-1
  • server=[Servernummer, normalerweise 1]
  • db=[Name der Datenbank]
  • export_type=database
  • what=sql
  • sql_structure=structure
  • auto_increment=1
  • use_backquotes=1
  • sql_data=data
  • hexforbinary=yes
  • sql_type=insert
  • asfile=sendit
  • filename_template=__DB___%Y-%m-%d
  • compression=gzip

Die dann alle mit einem kaufmännischen Und verketten und an http://example.com/phpmyadmin/export.php? anhängen. Man kann natürlich auch das Dateinamensformat ändern und sämtliche anderen Parameter, die man auf der Seite einstellen kann. Die nötigen Parameter finden sich im (geparsten) Quelltext der Datei.

Man bekommt dann ungefähr so eine URL:

http://example.com/phpmyadmin/export.php?lang=de-iso-8859-1&server=1&db=datenbank&export_type=database&what=sql&sql_structure=structure&auto_increment=1&use_backquotes=1&sql_data=data&hexforbinary=yes&sql_type=insert&asfile=sendit&filename_template=__DB___%Y-%m-%d&compression=gzip`

Einmal am Tag draufklicken und fertig ist das Backup :-D