Plugin-Entwicklung: Eigene Icons mit getProgramTableIcons

Hier haben Plugin-Entwickler die Möglichkeit, sich auszutauschen.
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Plugin-Entwicklung: Eigene Icons mit getProgramTableIcons

Beitrag von henryk »

Moin,

Ich versuche zur Zeit ein kleines Plugin zu schreiben welches unter anderem auch Icons in der Programmtabelle anzeigen muß (ähnlich wie das TVRaterPlugin).

Soweit ich aus den Quellen erkennen konnte muß ich dazu public Icon[] getProgramTableIcons(Program program) überschreiben, richtig?

Nur wird diese Funktion in meinem Plugin nie aufgerufen. Mein abgespeckter Versuch sieht so aus:

Code: Alles auswählen

	public Icon[] getProgramTableIcons(Program program) {
		System.err.println("huhu");
		return new ImageIcon[] { new ImageIcon(CrmTv.class.getResource("crmtv/plus.png")) };
	}
(das ganze natürlich in einer Klasse die von devplugin.Plugin erbt und auch sonst funktioniert).

Ein

Code: Alles auswählen

	public String getProgramTableIconText() {
		return "CRM114-Klassifikation";
	}
habe ich natürlich auch, trotzdem sehe ich keinen Effekt: Kein Icon und auch kein Lebenszeichen auf der Konsole. Muß ich mich noch irgendwo registrieren oder ähnliches? Ich werde aus den existierenden Implementierungen nicht so wirklich schlau.

Der Vollständigkeit halber: Ich benutze Gentoo Linux, Java 1.4.2_05 und TV-Browser 1.0RC5.

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Hast du in den Einstellungen dein Plugin aktiviert?
Siehe http://wiki.tvbrowser.org/index.php/Ein ... ngsanzeige ?

Dort wird auch der Icon-Text angezeigt :)
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Moin,

Ah, vielen Dank, das war es. Ich wusste gar nicht (mehr) dass es da so eine Einstellung gibt.

Jetzt muß ich nur noch dafür sorgen, dass mein Plugin nicht jedes mal 3 Minuten braucht um für alle Sendungen zu berechnen welche Icons es darstellen will ... ;-)

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Was macht dein Plugin eigentlich, wenn man fragen darf ;) ?
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Ich versuche den CRM114 Discriminator dazu zu bewegen mir automatisch Sendungen herauszusuchen die ich gerne sehen würde, basierend darauf wie ich andere Sendungen bewertet habe.

Ich bin mir noch nicht sicher ob es funktionieren wird, da die Beschreibungstexte aus den Datenquellen nicht so schön sind wie etwa die auf http://de.tv.yahoo.com, aber dafür ist die Pluginschnittstelle angenehm aufgebaut und man kommt einfach an die Daten heran. Das spart mir den Aufwand die Daten aus der Webseite von Yahoo herauszuspidern und auch noch ein Interface zum Anzeigen zu schreiben.

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Hast du ahnung von statistischer auswertung? Wenn ja, kannst du ein PHP-Skript schreiben, das mit hilfe deiner Bewertungen und Bewertungen von anderen Personen dir Sendungen empfehlen kann?!

Ich such noch jemanden, der sowas proggen kann :D
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Nicht so wirklich, obwohl das Thema in ein paar Kursen die ich belegt hatte gestreift wurde. Ich wüsste jetzt auf Anhieb auch nicht wie das in effizient gehen könnte. Alles was mir dazu einfällt wäre ziemlich aufwendig. Interessieren würde mich das Feature schon und ich schau mich mal in Google um.

Über wieviele Datensätze (User, bewertete Sendungen) reden wir hier eigentlich?

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Momentan über 5,379 Bewertungen von 1628 Filmen von 1429 Usern

Wird aber täglich mehr :D
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Plugin: Eigene Icons auch asynchron?

Beitrag von henryk »

Moin,
henryk hat geschrieben: Jetzt muß ich nur noch dafür sorgen, dass mein Plugin nicht jedes mal 3 Minuten braucht um für alle Sendungen zu berechnen welche Icons es darstellen will ... ;-)
So, die offensichtlichen Optimierungen habe ich jetzt drin, trotzdem kann ich nur etwa 20 Sendungen pro Sekunde beackern, für das gesamte Fernsehprogramm eines Tages dauert das also immer noch zu lange. Zwar fallen mir noch zwei Sachen ein, nämlich nur bestimmte Sender zu bestimmten Zeiten zu markieren und die Ergebnisse zwischenzuspeichern, aber schön ist anders. Beim Zwischenspeichern wäre das Problem zumindest, dass Wechsel zu neuen Tagen immernoch lange dauern und Lernvorgänge nicht sofort sichtbar werden.

Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen? D.h. also ich starte einen eigenen Prozess (meinetwegen auch Thread, wobei ich mit Threads noch nie was gemacht habe) der dann mit niedriger Priorität nebenherläuft und Bewertungen berechnet und jedes mal wenn der eine Sendung fertig hat ruft er irgendwo ein Callback auf und das aktualisiert dann für diese Sendung die Icons. Währenddessen läuft der Hauptprozess ganz normal weiter und die neuen Icons erscheinen dann quasi nachträglich.

--
Henryk Plötz
Grüße von der Ostsee
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Auswertung der TVRaterPlugin-Daten

Beitrag von henryk »

Moin,
bodo hat geschrieben:Momentan über 5,379 Bewertungen von 1628 Filmen von 1429 Usern
Also mein erster Gedanke dazu ging ungefähr so: um die Empfehlungen für einen User X zu berechnen, berechne zuerst die Ähnlichkeit von X zu allen anderen Usern (d.h. Suche für alle anderen User Y alle Sendungen raus die X und Y gleichzeitig bewertet haben und berechne da irgendein Übereinstimmungsmaß). Um dann für jede Sendung die X noch nicht bewertet hat auszurechnen wie er sie bewerten würde macht man dann einfach eine Art gewichteten (nach der Ähnlichkeit) Mittelwert über die Bewertungen aller anderen User. Das ist ..äh.. aufwendig.

Da aber so wenige Bewertungen vorliegen, kann man das vielleicht einfacher machen. Wie liegen die denn vor? SQL-Datenbank? Ich würde die vermutlich einfach primär nach Filmen und sekundär nach Bewertung sortiert rausholen, alle für einen Film zusammentragen, dann für alle beteiligten User ihre Ähnlichkeit in einer großen (Anzahl der User x Anzahl der User) Tabelle aktualisieren und mit dem nächsten Film fortfahren. Der Aufwand dafür ist ungefähr linear zur Anzahl der Bewertungen, braucht dafür aber (Anzahl der User)² Speicher. Diese Tabelle muß man auch gar nicht ständig aktualisieren, es reicht wenn man das einmal am Tag tut (oder so).

Wenn man dann für einen User die wahrscheinlichste Bewertung für einen Film erraten will, holt man nur noch alle Bewertungen für den Film hervor, schlägt den User in der Ähnlichkeitstabelle nach und rechnet die Bewertungen gewichtet zusammen.

Ich hab mal Google gefragt (http://www.google.de/search?q=generate+recommendations) und schon das erste Ergebnis (http://dsonline.computer.org/0301/d/wp1lind.htm) ist sehr interessant. (Das bezeichnet meine oben skizzierte Idee - mehr oder weniger - als Traditional Collaborative Filtering) Das Clustering-Verfahren da fände ich für die Anwendung auch eine gute Idee: Es würden da wahrscheinlich Gruppen wie "SciFi-Fans", "Western-Fans", etc. rausfallen die pi*Daumen auch gute Ergebnisse erzielen würden.

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Re: Auswertung der TVRaterPlugin-Daten

Beitrag von bodo »

henryk hat geschrieben:Moin,
Also mein erster Gedanke dazu ging ungefähr so: um die Empfehlungen für einen User X zu berechnen, berechne zuerst die Ähnlichkeit von X zu allen anderen Usern (d.h. Suche für alle anderen User Y alle Sendungen raus die X und Y gleichzeitig bewertet haben und berechne da irgendein Übereinstimmungsmaß). Um dann für jede Sendung die X noch nicht bewertet hat auszurechnen wie er sie bewerten würde macht man dann einfach eine Art gewichteten (nach der Ähnlichkeit) Mittelwert über die Bewertungen aller anderen User. Das ist ..äh.. aufwendig.
So ungefähr hatte ich mir das auch schon vorgestellt...die Anzahl der bewertungen wird wahrscheinlich noch start steigen, wenn dieses System funktioniert. Aber da wir ja sowieso nur über einen begrenzten Userkreis reden (wieviele Leute in Deutschland "brauchen" eine Digitale Fernsehzeitung?!) werden es bestimmt nich mehr als 10-15.000 User...
henryk hat geschrieben: Da aber so wenige Bewertungen vorliegen, kann man das vielleicht einfacher machen. Wie liegen die denn vor? SQL-Datenbank? Ich würde die vermutlich einfach primär nach Filmen und sekundär nach Bewertung sortiert rausholen, alle für einen Film zusammentragen, dann für alle beteiligten User ihre Ähnlichkeit in einer großen (Anzahl der User x Anzahl der User) Tabelle aktualisieren und mit dem nächsten Film fortfahren. Der Aufwand dafür ist ungefähr linear zur Anzahl der Bewertungen, braucht dafür aber (Anzahl der User)² Speicher. Diese Tabelle muß man auch gar nicht ständig aktualisieren, es reicht wenn man das einmal am Tag tut (oder so).
Aber 10.000x10.0000 klingt nich mehr so sinnvoll, oder? Viellleicht gibt es dafür ja noch eine "einfachere" Datenstruktur...

henryk hat geschrieben: Wenn man dann für einen User die wahrscheinlichste Bewertung für einen Film erraten will, holt man nur noch alle Bewertungen für den Film hervor, schlägt den User in der Ähnlichkeitstabelle nach und rechnet die Bewertungen gewichtet zusammen.

Ich hab mal Google gefragt (http://www.google.de/search?q=generate+recommendations) und schon das erste Ergebnis (http://dsonline.computer.org/0301/d/wp1lind.htm) ist sehr interessant. (Das bezeichnet meine oben skizzierte Idee - mehr oder weniger - als Traditional Collaborative Filtering) Das Clustering-Verfahren da fände ich für die Anwendung auch eine gute Idee: Es würden da wahrscheinlich Gruppen wie "SciFi-Fans", "Western-Fans", etc. rausfallen die pi*Daumen auch gute Ergebnisse erzielen würden.
Ich werd mir das mal ansehen...hast du Lust bekommen sowas zu implementieren ;) ?

Bodo
Benutzeravatar
Til
Site Admin
Beiträge: 1498
Registriert: 04 Dez 2003, 11:21
Wohnort: Karlsruhe
Kontaktdaten:

Re: Plugin: Eigene Icons auch asynchron?

Beitrag von Til »

henryk hat geschrieben:Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen? D.h. also ich starte einen eigenen Prozess (meinetwegen auch Thread, wobei ich mit Threads noch nie was gemacht habe) der dann mit niedriger Priorität nebenherläuft und Bewertungen berechnet und jedes mal wenn der eine Sendung fertig hat ruft er irgendwo ein Callback auf und das aktualisiert dann für diese Sendung die Icons. Währenddessen läuft der Hauptprozess ganz normal weiter und die neuen Icons erscheinen dann quasi nachträglich.
Ja, sowas ist möglich. Es gibt zwar keine direkte Möglichkeit, eine Aktualisierung auszulösen, aber du kannst die Sendung markieren und sofort wieder entmarkieren. Dann wird die Sendung neu gemalt, dabei werden von deinem Plugin die Icons abgefragt.

Trotz allem solltest du deine Ergebnisse zwischenspeichern: 1. werden bei jedem Neumalen einer Sendung die Icons abgefragt und 2. kannst du damit bestimmt sehr viel einsparen, weil manche Sendungen sehr oft wiederholt werden (Nachrichten, Serien).

Du kannst dir ja merken, wann das Ergebnis zuletzt berechnet wurde und wann es zuletzt abgefragt wurde. So kann du asynchron alte Ergebnisse neu berechnen, bzw. rausschmeissen, wenn sie seit einem Monat (oder so) nicht mehr abgefragt wurden.
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Re: Plugin: Eigene Icons auch asynchron?

Beitrag von henryk »

Moin,
Til hat geschrieben:
henryk hat geschrieben:Deshalb: Ist ein einfacher Weg vorgesehen die Markierungen asynchron zu verteilen?
Ja, sowas ist möglich. Es gibt zwar keine direkte Möglichkeit, eine Aktualisierung auszulösen, aber du kannst die Sendung markieren und sofort wieder entmarkieren. Dann wird die Sendung neu gemalt, dabei werden von deinem Plugin die Icons abgefragt.
Hat das schonmal jemand erfolgreich getan? Ich bin jetzt nämlich soweit dass mein Plugin im wesentlichen das tut, die richtigen Icons werden aber nicht angezeigt.

Reihenfolge der Aktionen: getProgramTableIcons wird aufgerufen und stellt fest dass die Bewertung für diese Sendung noch nicht zwischengespeichert wurde. Dann gibt es ein null (oder ein Fragezeichen-Icon, völlig egal) zurück. Später (ich mache das noch manuell, weil es sich dann einfacher testen lässt) veranlasse ich die tatsächliche Berechnung der Bewertung in einem eigenen Thread. Ich sehe dann über ein paar strategisch verteilte System.out.println()s auch dass folgendes passiert: Die Bewertung wird berechnet und zwischengespeichert, dann ruft der andere Thread einen Callback bei mir im Plugin auf und der macht erfolgreich ein mark()/unmark() auf das program-Objekt (ich bilde mir auch ein die Sendung einmal kurz rot aufleuchten gesehen zu haben). Weiter passiert nichts, insbesondere ändert sich das Icon das von meinem Plugin angezeigt wird nicht.

Wenn ich im TV-Browser dann einen Tag vor und wieder zurück gehe, die Sendungen also wirklich alle neu gezeichnet werden, dann ist auch das geänderte Icon da.

--
Henryk Plötz
Grüße aus Berlin
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Re: Plugin: Eigene Icons auch asynchron?

Beitrag von henryk »

Moin,
henryk hat geschrieben: Hat das schonmal jemand erfolgreich getan? Ich bin jetzt nämlich soweit dass mein Plugin im wesentlichen das tut, die richtigen Icons werden aber nicht angezeigt.
Ok, ein paar Experimente weiter:
Die folgenden Ansätze funktionieren nicht:

Code: Alles auswählen

public void refreshProgram(Program program)
{ 
    program.mark();
    program.unmark();
}
sowie

Code: Alles auswählen

public void refreshProgram(Program program)
{ 
    tvdataservice.MutableProgram mprog = (tvdataservice.MutableProgram) program;
    mprog.markAsOnAir(mprog.isOnAir());
}
(Ja, ich weiss, das ist nichtmal annähernd die feine englische Art, aber ich wollte halt irgendwie das fireStateChanged() auslösen.)

Das folgende geht aber, naja irgendwie jedenfalls:

Code: Alles auswählen

refreshProgram(Program program)
{ 
    tvbrowser.ui.mainframe.MainFrame.getInstance().getProgramTableScrollPane().forceRepaintAll();      
}
Es macht etwa das was es soll: Die Bewertungen werden im Hintergrund berechnet und sobald eine Bewertung bereit ist erscheint sie auch in der Programmtabelle. Allerdings ist das nicht direkt minimalinvasiv und produziert einiges an Overhead. (Lies: Es ist nicht schneller als vorher, eher langsamer.)

Ich bin versucht das nicht-Funktionieren des ersten Ansatzes als Bug im TV-Browser zu bezeichnen. Zustimmung? Kann man das beheben?

--
Henryk Plötz
Grüße aus Berlin
platin(x)
Gold Member
Beiträge: 269
Registriert: 08 Jul 2004, 16:22

Beitrag von platin(x) »

Gibst du hier:

Code: Alles auswählen

public String getMarkIconName();
null zurück? Das wäre dann das Problem...
Returns the name of the file, containing your mark icon (in the jar-File).

This icon is used for marking programs in the program table.

Return null if your plugin does not provide this feature.

See Also:
.getMarkIcon()
Antworten