Yanix TableEditor
5. Februar 2008
Was ist nun das? Ein Tabelleneditor für Yanix? Was soll das sein?
Ganz einfach, die Manipulation von Datenbanken mit reinem PHP Code!
Hier mal ein kleines Beispiel der aktuellen Entwicklungsversion:
1 2 3 4 5 6 | $tbl = DB::getTable('test', false); $tbl->Insert(array( 'test' => 'blubb', 't_char' => 'lol', 't_int' => 10 )); |
Erklärung: Die erste Zeile holt ein Tabellenobjekt von der Datenbank-Klasse ab, diese erstellt ein Objekt falls nötig und gibt es zurück. Das Objekt holt sich dann alle Informationen über die genannte Tabelle vom Datenbank-Server (aktuell nur MySQL getestet) und merkt sich diese. Bei Abfragen werden dann die Felder überprüft, sollten die Typen nicht überein stimmen, wirft das Objekt eine Exception (In diesem Beispiel habe ich aus der Zahl im vorherigen Beispiel eine Zeichnenkette gemacht):
* Catched Exception: * Message: Invalid value for t_int. Expected int, got string * File: /home/michael/Desktop/PHP/Yanix/lib/TableEditor.class.php (129)
Jetzt wurde die Exceptions direkt von Yanix gefangen, natürlich können auch Plugins diese fangen, mehr dazu im PHP-Manual unter Exceptions.
Ich mache mich jetzt weiter ans Werk um das möglichst weit fertig zu bekommen, die erste öffentliche Yanix-Beta rückt immer näher!
Yanix im Detail: Events, Handler und SmartIRC
13. Januar 2008
Bisher gab es für Plugins so gut wie keine Möglichkeit, mit dem Bot-Kern zu arbeiten. Durch die Entwicklung der allgemeinen Events-Klasse wird sich einiges ändern. Doch erstmal ein bisschen Geschichte:
Wegen einem Fehler (oder Feature?) in SmartIRC war es bisher nicht möglich, mehr als einen Handler für eine Aktion zu registrieren, z.B. konnte nur ein Plugin auf einen Join reagieren. Deswegen wurden die YanixHandlers geschrieben, welche dies überwunden, indem sie diese Aktionen belegten und an beliebig viele Plugins weitergeben konnten. Durch einen Patch (von vielen), welche ich an SmartIRC angewandt habe, sind diese nicht mehr möglich.
Diese Klasse wurde im Laufe der Entwicklung auch für den Heartbeat verwand, welcher regelmäßige Aktionen ermöglicht. Erst durch diesen wurden Funktionen wie die Absturzsicherung möglich. Anfangs habe ich diesen als Erweiterung der YanixHandlers-Klasse genutzt, was jedoch eine ziemlich Zweckentfremdung und ziemlich unsauber war. Da das Ganze auch alles andere als flexibel war, musste eine komplett neue Lösung her. Die Events.
Die Events funktionieren wie die meisten Plugin-Systeme. Es können Callbacks registriert werden welche dann im späteren Verlauf aufgerufen werden. Prominentes Beispiel für diese Methode ist Wordpress (welches dies aber nicht objektorientiert macht). Die Klasse ist simpel und allgemein und kann daher auch für andere Projekte genutzt werden aber doch sehr praktisch.
SmartIRC ist eine sehr praktische Klasse um mit PHP eine Verbindugn zu IRC-Servern herstellen zu können. Leider ist die Klasse veraltet und schon lange nicht mehr weiterentwickelt worden. Das letzte Release ist vom 27.05.2005, der letzte Commit im CVS knapp 4 Monate her, manche Bugsmeldungen sind schon über ein Jahr offen. Ich bin schon öfters am Überlegen ob ich einen Fork der Klasse mache, vor allem wegen diesen Gründen:
- Ist nicht wirklich PHP5-kompatibel, ich musste einige Male patchen um E_STRICT Fehler los zu werden.
- Merkwürdige Bugs und Verhaltensweisen, teilweise beendet die Klasse mit die() den Bot.
- Callbacks sind nur mit Objekten möglich, Funktionen und rein statische Klassen bleiben außen vor.
Aufgrund des Umfangs der Klasse würde das Umschreiben auf eine komplett statische Klasse (was ich am sinnvollsten und praktischsten) einige Zeit kosten und ein Umschreiben von großen Teilen von Yanix bedeuten (was eh schon beim Umstieg von iBot der Fall war). Jedoch würde es viele Vorteile haben.
Vor wenigen Tagen habe ich mal die CVS-Version von SmartIRC getestet. Sie ist 4 Monate alt, also recht “neu”. Ergebnis: Ständige Abstürze durch den Aufruf von nicht-existenten Funktionen. Schade.
Ich warte erst mal auf PHP 5.3, die Namespaces könnten sehr interessant werden.
Yanix im Detail: Mehrsprachigkeit und Dateiformate
28. Dezember 2007
Die Welt ist groß und spricht nicht nur eine Sprache. iBot konnte bisher zwei: Einen wirren Mischmasch aus Deutsch und Englisch. Das wird in Yanix nicht mehr sein.
Ein mächtiges aber effektives System zur Mehrsprachigkeit soll dem Abhilfe schaffen. Über die Realisierung habe ich mir einige Zeit den Kopf zerbrochen. Die meisten PHP-System inkludieren einfach eine PHP-Datei, welche die Definition für viele viele Sprach-Strings enthält. Diese Methode hat jedoch einige Nachteile:
- Langsam: Erst muss der PHP-Parser über die Datei, dann muss diese noch ausgeführt werden.
- Groß: Es entsteht durch die PHP-Definitionen sehr viel Code der nicht sein muss. Übersetzer, die vielleicht nicht viel Ahnung von PHP haben, könnten außerdem Code zerstören.
- Umständlich: Definitionen kopieren, Maskierungen beachten, keine Syntax-Fehler machen usw. Sehr viel Aufwand der eigentlich nicht sein müsste.
Anfangs wollte ich in Yanix viel auf XML-Dateien setzen, jedoch ist das Parsen von diesen in PHP sehr unbequem. Dann fand ich diesen Befehl, mit welchem sich wirklich sehr einfach .ini-Dateien parsen lassen. Dieses Dateiformat ist uralt, aber sehr praktisch: Es unterstützt Sektionen und hat eine sehr einfache Syntax.
Anfangs setzte ich gerne auf diese Funktion und habe viel (Profile, Plugin-Informationen) damit gemacht, doch stoßte auf ein Problem: Die PHP-Funktion ignoriert Zeilen die es für “ungültig” hält und Sektionen muss man extra wählen.
Ich fand in meiner Klassensammlung schnell einen Parser für .ini-Dateien, optimierte ihn und stellte Teile von Yanix darauf um.
Genug von Formaten, zurück zu der Mehrsprachigkeit! Ich habe für die Yanix-Sprachdateien das .ini-Format gewählt, Sprachdateien schauen nun etwa so aus:
1 2 3 4 5 6 | [options] prefix=[PluginController] [strings] ; General load_failed_file_not_exists=Could not load %plugin%: file not exists |
Im Options-Block werden Einstellungen für dne Sprachparser definiert, im Beispiel soll jedem Eintrag bei Abruf der Prefix [PluginController] voran gestellt werden. Variablen können mit %name% definiert werden und werden vom Parser ersetzt.
Ein praktisches Beispiel (in einem Plugin):
Log::Debug($this->Lang('load_failed_file_not_exists', array('plugin' => 'demo')));
In Plugins wird die Methode Lang() der Klasse PluginBase verwendet, von der jedes Plugin erbt. PluginBase hat ein paar Methoden, dazu aber vielleicht ein anderes Mal mehr dazu.
Die Ausgabe der Konsole:
[D 28.12 14:21:51][PluginController] Could not load demo: file not exists
Plugins und Yanix selbst nutzen getrennte Orte zum Speichern der Sprachdateien. Bei Yanix liegen diese im Ordner lang/, bei den Plugins in deren Ordnern.
Eine weitere Möglichkeit, wenn Plugins z.B. sehr viele Sprachstrings brauchen und oft die selben Variablen darin benötigen, ist diese:
1 2 3 4 5 6 7 8 | // Namespace definieren ($this->name ist immer der Pluginname) Lang::UseNamespace($this->name); // Allgemeine Variablen definieren Lang::UseVariables(array('plugin' => $this->name, 'foo' => 'bar')); // Sprachstring ausgeben $string = __('foo'); Log::Debug($string); |
Im Moment bin ich noch dabei, das ganze System zu verfeinern und zu optimieren, bis zum Release ist Yanix dann vollständig übersetzbar!
Yanix release rückt immer näher
23. Dezember 2007
Gerade eben habe ich die Datenbank-API fertig gestellt. Nach vielen Stunden Arbeit habe ich diesen Brocken endlich vollendet. Im Moment wird nur SQLite unterstützt, die Treiber für MySQL(i) und Postgre folgen im Laufe der Tage.
Einige Vorteile gegenüber der bisherigen Version:
- Besserer Aufruf der Funktionen möglich (später mehr dazu)
- Sauberer Code, die bisherige Implementation war sehr herzlos eingeflickt
Bisheriger Aufruf:
$this->bot->db->Query('SELECT * FROM '.$this->bot->settings['db_prefix']. 'users');
Neu:
DB::Query('SELECT * FROM {PREFIX}users');
Mein Beta-Tester feuerfuchs ist bereits fleißig am Testen, als bisheriger Eggdrop-Nutzer ist er besonders von der besseren Geschwindigkeit begeistert. ![]()
Es folgt noch Bugfixing, die Realisierung einiger geplanter Features und das Release kann kommen!
Yanix im Detail: StandBye
17. Dezember 2007
In diesem und nächsten Beiträgen nehme ich ein paar neue Funktionen von Yanix genauer unter die Lupe, um euch das Release noch schmackhafter zu machen.
Heute dreht sich alles um StandBye, einer Funktion welche Datenverluste beim Neustart des Bots verhindern soll. Das Prinzip ist einfach:
Auf Befehl speichert Yanix alle wichtige Daten (Registry, Plugins, Einstellungen und andere Objekte) auf der Festplatte ab und beendet sich. Beim Schreiben des Artikels grübel ich auch über eine Auto-Backup-Funktion, welche z.B. bei jedem 20. HeartBeat (wird bei jeder empfangenen Nachricht ausgelöst) aktiv wird und dann die Daten speichert um besser gegen Abstürze gewappnet zu sein.
Die Bedienung der Funktion ist recht simpel: Einfach im Query !StandBye angeben (wenn man die Rechte dazu hat, dazu ein anderes Mal mehr) und schon geht er schlafen. Meist dauert dies knapp eine Sekunde. Hier ein Screenshot der Konsole während dem Einschlafen und Aufwachens:
![]()
Yanix kommt näher!
16. Dezember 2007
Die Download-Links für die alten iBot-Versionen habe ich gerade entfernt um mir die Supportanfragen für die verbuggten Versionen zu ersparen. Momentan arbeite ich jeden Tag einige Stunden an dem Bot, damit er meinen und den Erwartungen der anderen entsprechen kann.
Ein paar Änderungen der letzten Tage:
Änderungen am SmartIRC
Yanix nutzt die SmartIRC-Klasse von PEAR für die Verbindungen zu IRC-Servern. Die Klasse ist sehr gut, aber manche Dinge sind sehr nervig. Zum Beispiel, dass nur ein Funktionsaufruf auf einen IRC-Befehl durchgeführt wird. Dieses Verhalten war bisher egal, jedoch funktionen keine anderen Plugins mehr, wenn das neue chanlogger-Plugin aktiviert wird, welches sämtliche Nachrichten in einem Channel aufzeichnet.
michfrm.net – 2008
10. Dezember 2007
Ich hab momentan nicht sehr viel Zeit zum Bloggen da ich fleißig an einigen Projekte werkel die ich jetzt mal vorstelle:
michfrm.net v3
Ich habe schon ein paar Mal ein paar Teile aus dem geplanten neuen michfrm.net veröffentlicht, welche jedoch schon wieder veraltet sein können, weil ich ständig meine Pläne umwerfe, was sich auch im Code meines CMS wiederspiegelt. Erst wollte ich Source und Mind and Links (Nachfolger von Gedanken und Links) seperieren, jetzt kommen die beiden zusammen mit auf die Hauptseite. Source ist intern schon bei v5 weil ich mir ständig ein besseres Konzept einfällt, unter anderen ein Index und eine Suche für die Quellcodes.
Das neue Design und große Teile des Kernes sind bereits fertig, ich hoffe ich werde noch dieses Jahr mit allem fertig (vor allem Source macht mir noch Sorgen), damit 2008 die neue Webseite online gehen kann.
Das System dahinter ist komplett selbst entwickelt, demnächst gibt es vllt. noch Screenshots davon (im Gegensatz der Webseite sehr düster
).
wiki-in-a-box
Vor kurzem habe ich in der Langeweile mir ein kleines Wiki entwickelt welches AJAX nutzt um die Bequemlichkeit zu erhöhen. Später erkannte ich die Nützlichkeit (vor allem in der Schule) und das Potenzial des Skripts und baute es weiter aus. Einige Kernpunkte davon:
- Besteht aus nur einer Datei
- Keine Datenbank notwendig, lediglich ein Verzeichnis mit Schreibrechten
- “Pretty URLs” auch ohne mod_rewrite
Im Moment ist der Code noch Chaos (wandel ich langsam in OOP um) und einiges steht noch auf der To-Do Liste, eine Beta wird es also erst nächstes Jahr geben.
Yanix
Der aus meinem iBot-Projekt entsprunge IRC-Bot erhält gerade eine Generalüberholung die aus Code-Cleaning, Bug-fixing und neuen Funktionen besteht. Ich habe keinen Changelog erstellt, dieser würde eh die Grenzen sprengen. Plugins für iBot werden nicht mehr funktionieren da ich den halben Kern neu geschrieben habe und nun wesentlich mehr gebrauch von den OOP-Features von PHP5 mache.
Sehen kann man ihn ab und an im Raum #botcamp auf irc.mircdevil.net, Anregungen sind willkommen!
iBot ist tot. Es lebe Yanix!
23. September 2007
Es ist nun beschlossene Sache. Das kleine Team um feuerfuchs (Plugin-Entwickler) und mich hat nach langem Grübeln einen neuen Namen für den iBot gefunden.
Es gab mehrere Gründe den Bot umzubenennen, unter anderem weil der Name schon algemein sehr weit verbreitet ist und das kleine i am Anfang eine Verbindung zu den vielen Apple-Produkten machte die es ja nicht gibt.
Die Versionierung dann auch wieder von Vorne anfangen da wir einiges an größeren Änderungen vornehmen werden, was genau wird jetzt noch nicht verratet.