Chat Relater (PieSpy clone)

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Aus Neugier habe ich mich in den letzten Tagen daran gemacht, das [wiki=IRC_Channel/Soziogramm]#python.de-Soziogramm[/wiki] nachzubilden. ChatRelater (coole Namen waren leider schon aus) ist das Resultat.

Im Gegensatz zu PieSpy läuft das Programm nicht als IRC-Bot, sondern analysiert abgelegte Logfiles. Damit kann man es aber auch für nicht-IRC-Konversationen verwenden.

Für das Zeichnen des Graphen kommt GraphViz zum Einsatz. Leider ist das Ergebnis bei Weitem nicht so schön wie das von PieSpy. Zwar reißen der SVG-Output und vielleicht andere Formate einiges raus, aber so super isses dann doch nicht.

Die Kanten sind nicht an den Enden abgerundet. Eine Point-Darstellung gibt es zwar, allerdings hat es nicht geklappt, die Label daran anzuzeigen. Feintuning geht über einige DOT-Attribute, die pydot aber scheinbar noch nicht unterstützt. Dessen Autor habe ich bzgl. einiger Inkonsistenzen in der Doku eine Email geschickt, aber bisher noch keine Antwort erhalten (oder unglücklich im Spam-Ordner übersehen und gelöscht, glaube ich aber nicht). Ok, das Programm ist von 2004, aber hey.

Dafür sind aber gerichtete Graphen möglich (vielleicht kann PieSpy das ebenfalls, aber ich habe das Programm nicht ausprobiert).

Auf jeden Fall war das Programm aber eine sehr gute Gelegenheit für mich, mich näher mit Unit-Tests zu befassen. Ohne Web- und GUI-Oberfläche geht das doch etwas entspannter, auch wenn es weiterhin viele Hürden gibt, die überwunden werden wollen. Aber eine Handvoll Tests ist letztlich besser als gar keine.

Ja, vielleicht probiert es ja mal wer aus. Feedback und Funktionsbestätigungen sind willkommen!
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hey Nett, kann ich irgend wie das Format ändern damit ich auch irssi Logs Verwenden kann? Oder muss ich irssi beibringen wie xchat zu loggen ;)
lunar

Ich wäre dafür, dass du das Parsing der Logdateien quasi in separate Plugins auslagerst, die dann ans Hauptprogramm einfach nur Objekte zurückliefern müssen. Dadurch könnte man dem Programm sehr einfach verschiedene Logformate beibringen, und es stellt eine hübsche Übung zur Implementierung eines Pluginssystems dar ;)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wenn das Log in etwa wie

Code: Alles auswählen

<foo> honk, honk
<bar> fliewatüüt!
aussieht, sollte das so gehen. Ggf. Timestamps strippen und die Nickname-Delimiter mit externen Tools im Log oder direkt im Parser anpassen, aber da steckt wirklich nicht viel hinter.


lunar: Der Ansatz ist natürlich nicht verkehrt. Gründe dafür, dass es das aktuell nicht gibt:
- Ich benutze nur XChat, habe deshalb auch keine anderen Logs zur Hand.
- Das Log-Format ist äußerst simpel und gängig; andere Formate lassen sich mit sed und Konsorten meist leicht überführen.
- An Pluginsysteme habe ich im Rahmen anderer Projekte schon viel Zeit investiert, da habe ich mir die Hörner bereits abgestoßen ;)
- KISS. Es sollte erstmal released sein und ich habe schon viel Gedanken zur Optimierung und eleganten Lösung in die anderen Teile investiert. Und wozu tausend Logformate implementieren, wenn das Programm nachher sowieso keiner benutzt?

Also: Wenn Interesse besteht, dürfen hier gerne Log-Ausschnitte von diversen Programmen gepostet werden, dann wird sich zeigen, was für dessen Verarbeitung erforderlich ist.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Wäre es nicht möglich das Logformat dynamisch anzugeben? Als Regex zum Beispiel :)

sed -e "s/^[^<]*//"

So geht es auf jeden Fall :)

Ein paar Kritikpunkte/Vorschläge:
Die Diagramme werden auch für kleine Channels (~20 Personen) viel zu gross.
Es wäre sinnvoll kleine Verbindungen auszulassen. Ein weiteres wichtiges Feature wäre Nicktracking für Leute die es für nötig halten ihren Nick alle 10 Minuten zu ändern. :twisted:
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Klar, das ist alles machbar und sinnvoll. Einige Ideen habe ich auch noch, etwa im Laufe der Zeit veränderte Graphen mit z.B. farblich dargestellter Alterung von Links usw.

Ein wenig habe ich bei den Graphen die Motivation verloren, weil GraphViz nicht so wollte wie ich. Kennt jemand vielleicht eine gute Alternative mit (möglichst puren) Python-Bindings, die sauberere Graphen erzeugen kann? Was kommt noch in Frage? Kann man sowas über 2D-OpenGL ohne GUI erzeugen und in Dateien schreiben? PIL wäre sicherlich noch auf der Kandidatenliste.

Letztlich muss dann aber ein eigener Routing-Algorithmus her, und das wollte ich vermeiden ;) Andererseits überschneiden sich Graphen über twopi, neato und fdp auch meistens, während dot das zwar vermeidet, aber eben die viel passendere zirküläre Darstellung nicht hat.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

An sowas wollte ich mich auch machen, aber dann hatte GraphViz eben nur diese grausame Ausgabe und AGG war irgendwie noch unfertig... der Vorteil bei PieSpy ist eben auch, dass es die Timestamps berücksichtigt und dadurch auch merkt, das irgendwer schon lange nicht mehr gesprochen hat und den betreffenden User aus dem Soziogramm rauswirft.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wie gesagt, möglich - und oft auch einfach - ist vieles. Für mich habe ich aber versucht, erstmal einen Strich zu ziehen, damit ich mich vielleicht doch wirklich wichtigen und/oder herausfordernden Dingen widmen kann.

Es würde mich wundern, wenn man PieSpy nicht auch gut ohne die Bot-Komponente betreiben und entsprechend auf die - umfangreicheren - Features bzgl. Aufbereitung und Darstellung der Daten zugreifen könnte.

Wer aber Freude daran hat, das Rad neu zu erfinden - und das machen wir Entwickler nun mal gerne, für uns, zum Spaß und zum Lernen - dann bitte!
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Achso, möglicherweise hat sich jemand gefragt, warum ich YAML als Zwischenformat verwende. Der Grund ist, dass ich zwar vorher `shelve` verwendet habe, das von einem Moment auf den anderen aber plötzlich gestreikt hat. Irgendwo tief im `shelve`-Modul gab es einen Fehler mit einer Typkonvertierung (habe ich verdrängt).

Nach langem Suchen und der Erkenntnis, dass zumindest dafür die Unittests auch nicht das absolute Sicherheitsnetz sind, hatte ich die Fatzen dicke und habe mich des YAML-Moduls bedient, weil ich damit schon so einiges realisiert und es dabei zu schätzen gelernt habe. Und es lief ab dann auch einwandfrei, auch wenn ich diese zusätzliche Abhängigkeit auch gerne vermieden hätte.

Etwas Gutes lässt sich dem dennoch abgewinnen: Die Daten sind in ein sehr lesbares Format serialisiert worden, das auch nicht-Python-Programme mit der entsprechenden Bibliothek einlesen und weiter verarbeiten können. Auch lassen sich diese Klartextdaten von STDOUT an den Visualizer weiter-pipen, sondern dabei auch durch gängige Kommandozeilentools wie sed, awk und Konsorten weiter filtern oder anderweitig bearbeiten.
Antworten