Basis Script zum anpassen

Dieses Forum beschäftigt sich mit allen Fragen, Kommentaren und Anregungen zu MemBrain Skripten. Auch der Austausch von Skripten zwischen MemBrain Benutzern soll hiermit gefördert werden.
Wenn Sie ein interessantes Skript haben, das Sie anderen MemBrain Benutzern zur Verfügung stellen wollen, dann Erstellen Sie dafür jeweils bitte ein neues Thema in diesem Forum. Der Titel des Themas sollte es anderen Benutzern erlauben möglichst schnell zu erfassen, wozu Ihr Skript dient.
User avatar
Seppy
Posts: 47
Joined: Fri 5. Dec 2008, 04:48
Location: 90537 Feucht

Basis Script zum anpassen

Post by Seppy »

Hallo Leute,
ich stell hier mal ein "Basis-Script" rein, das jeder an seine Gegebenheiten anpassen kann/soll...

Das Script benötigt min. Version: 03.05.01.01. von MemBrain, bitte vorher in MemBrain prüfen.

"Base.as" Version vom 30.08. 2009.

BESCHREIBUNG:

Funktion des Script's:

1. Laden des Netzes.
2. Laden der Lessons/Daten.
3. Einstellen der Views/Charts.
4. Einstellen des Teachers/Lehrers.
5. Das Netz normalisieren.
6. Das Netz bis zum Abbruchkriterium (Zeit, Lessons, NetError) trainieren.
5. Das trainierte Netz abspeichern.
6. Abarbeiten einer "Think-Lesson".
(Mit jeder Zeile der "Think-Lesson" DENKT das Netz einmal, und erzeugt dabei den Output).
7. Abspeichern des Outputs in einer CSV-Datei (Output.csv).


Voraussetzung:

1. Ein Netz, das zu Deinen Daten/Lessons paßt (Anzahl der IN/OUT Put-Neuronen).

2. Vier(4) Dateien/Lessons.

a. Die "Normalize Lesson".
(In dieser Datei sollten ALLE Werte enthalten sein, die die IN/OUT Put-Neuronen jemals erreichen können).
(Es geht hier um die minimal und maximal Werte der IN/OUT Put-Neuronen).
(Wenn Ihr euch nicht sicher seid, benutzt einfach die "Trainings / Learn - Lesson" zum normalisieren).
(Diese kann über die Einstellung "AUTO_CREATE_NORMALIZE_LESSON" auch automatisch aus den drei anderen Lessons erzeugt werden).

b. Die "Learn Lesson".
(In dieser Datei befinden sich die Daten, mit denen das Netz trainiert wird).

c. Die "Validate Lesson".
(In dieser Datei befinden sich die Daten, die von den Trainingsdaten abgezweigt wurden (ca. 5 - 10 % der Trainingsdaten).
(Um das Netz mit "NICHT trainierten Daten" zu prüfen/testen).

d. Die "Think Lesson".
(In dieser Datei befinden sich die Daten, mit denen man eine Prognose erstellen will).
(Diese Datei enthält NUR die Inputs, die Outputs werden ja durch das Netz erzeugt).

3. Es sollte ein "Net Error" Wert bekannt sein, der mit dem Netz und den Learn/Validate Daten auch erreicht werden kann.
(Das könnt Ihr z.B. mit dem Script "Traintime" herausfinden).


Bedienung:

1. Ladet den Editor "PSPad" herunter und installiert diesen.
http://www.pspad.com
(Dieser Editor ist Freeware, kostet NICHTS, hat "Syntax Highlighting" und kann sehr gut für MemBrain/AngelScript eingerichtet werden).
(Es geht natürlich auch mit "Windows Editor", dann aber OHNE Farbe).

2. Entpackt die ZIP-Datei "Base.zip" in einen Ordner.

3. Kopiert alle Dateien aus diesem Ordner, in den Ordner, der auch das Netz und die Daten/Lessons enthält.
("NetEditor.as, Position.as und SecondsTimer.as" MÜSSEN ZWINGEND im selben Ordner sein).

4. Öffnet das Script "Base.as" mit "PSPad / Win Editor".
(Ist eine reine Text-Datei, also bitte nicht mit MS-Word im DOC-Format abspeichern).

5. Ändern / überprüfen ALLER "Einstellungen" oben im Script, NACH der Beschreibung und INNERHALB der gestrichelten Zeilen, zwischen:

// BEGINN der Einstellungen, bitte anpassen !!!
UND
// ENDE der Einstellungen, danke...

Ihr müßt immer den Wert RECHTS vom "=" ändern.
Wenn Ihr mit einem Wert NICHTS anfangen könnt, dann last in erstmal UNVERÄNDERT !!!

5.1 Wie oft soll das Script abgearbeitet werden (Init_Always - Think_Lesson in main() ) ?

5.2 Dateiname des Netzes.

5.3 Das Dateiformat der Lessons.
"1" = RAW CSV (Standart Excel CSV-Format).
"2" = MemBrain CSV (MemBrain Sectioned CSV-Format).
"3" = MemBrain MBL (MemBrain Standart Lessons MBL-Format).
5.4 Soll die Normalize - Lesson automatisch aus den anderen drei Lessons erzeugt werden ?
5.5 Dateinamen aller Lessons/Dateien.

5.6 Soll der "Net Error Viewer" angezeigt werden ?
5.7 Soll der "Pattern Error Viewer" angezeigt werden ?
5.8 Nach wieviel Sekunden soll der "Pattern Error Viewer" Chart in der Höhe angepasst werden (Y-Fit) ?

5.9 Name des Teachers
(Dieser muß natürlich auch bei den Teachers vorhanden/eingetragen sein).
5.10 Die Lernrate des Teachers.
5.11 Die Reihenfolge in der die Lern / Trainingsdaten gelernt werden.

5.12 Soll das Training nach einer bestimmten Zeit abgebrochen werden ?
5.13 Soll bei Trainingsabbruch durch "Zeit" ein "Think ausgeführt / Output gespeichert" werden ?
5.14 Nach welcher Zeit (In Sekunden) soll das Training abgebrochen werden ?

5.15 Soll das Training nach einer bestimmten Anzahl Durchläufe der Lern / Trainings - Lesson (Lesson Repetitions) abgebrochen werden ?
5.16 Soll bei Trainingsabbruch durch "Lesson Repetitions" ein "Think ausgeführt / Output gespeichert" werden ?
5.17 Nach wievielen Durchläufen der Lern / Trainings - Lesson (Lesson Repetitions) soll das Training abgebrochen werden ?

5.18 Soll das Training bei erreichen eines bestimmten Net Errors abgebrochen werden ?
5.19 Soll bei Trainingsabbruch durch "Net Error" ein "Think ausgeführt / Output gespeichert" werden ?
5.20 Bei welchem "Net Error" (z.B. 0.002) soll das Training abgebrochen werden ?

5.21 Sollen in der Output - Lesson - Datei auch die Input-Daten des Netzes enthalten sein ?
5.22 Soll die "Output" CSV-Datei am Ende des Scripts z.B. mit Excel geöffnet werden ?

5.23 Soll "MemBrain" am Ende des Scripts auch beendet werden ?

6. Startet "MemBrain".

7. Startet das Script im Menü über "Scripting > Execute Script...".

Gruß Seppy
Base.zip
(11.72 KiB) Downloaded 714 times
Last edited by Seppy on Sun 30. Aug 2009, 03:40, edited 8 times in total.
Wer arbeitet macht Fehler, wer wenig arbeitet macht wenig Fehler, wer nicht arbeitet macht keine Fehler, wer keine Fehler macht wird befördert.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Basis Script zum anpassen

Post by Admin »

Hallo Seppy,

vielen Dank, das ist bestimmt eine ausgezeichnete Basis für alle Benutzer!

Ein kleiner Verbesserungsvorschlag noch:

anstatt:

Code: Select all

while (TRAINING_EXIT == TR_OK)          // Diese Schleife/Training des Netzes wird durchlaufen bis der NetError von "TRAINING_EXIT" erreicht wird.
  {
    TRAINING_EXIT = GetLastTeachResult(); // Die Variable "TRAINING_EXIT" wird auf das letzte "TeachResult" gesetzt, (NetError erreicht ???), wenn NICHT gehts oben bei "while (TRAINING_EXIT == TR_OK)" wieder von vorne los.
  }
wäre die Zeile

Code: Select all

SleepExec();
wesentlich besser. Das hat den großen Vorteil, dass das Skript keine Rechenzeit verbrät, nur um auf das Beenden des Teachers zu warten. MemBrain wartet intern mit dieser Funktion auf das Beenden, ohne Rechenzeit zu benötigen. Alternativ könnte man in die while-Schleife ein Sleep(100) oder so aufnehmen, SleepExec() ist aber hier eleganter und leichter zu verstehen, denke ich.

Viele Grüße und nochmals vielen Dank für Dein tolles Engagement im Forum!
Thomas
User avatar
Seppy
Posts: 47
Joined: Fri 5. Dec 2008, 04:48
Location: 90537 Feucht

Re: Basis Script zum anpassen

Post by Seppy »

Hallo Thomas,

erstmal dankeschön, ich dachte das mit SleepExec() geht hier nicht, hab diese Schleife nämlich vor einiger Zeit aus einem Deiner "Beispiel Scripte" entnommen.
Ich hab's jetzt geändert, und es funktioniert.

Ich hab da aber noch ein kleines Problem:

Ich wollte zumindest die Abfolge der Trainingsdaten, ORDERED/RAND_ORDER/RAND_SELECT über eine Variable steuern, es geht aber nicht.
Wenn ich z.B. eine Variable mit:

const string XXX = "ORDERED";

und dann mit:

TeacherSetting(PATTERN_SELECT, XXX);

die Variable einsetzen will, bekomm ich diese Meldung:

Compiling and Starting Script:
C:\Users\Josef Rauch\Documents\MemBrain\Dax_Woche\Base.as
C:\Users\Josef Rauch\Documents\MemBrain\Dax_Woche\Base.as (232, 1) : INFO : Compiling void Teacher_Settings()
C:\Users\Josef Rauch\Documents\MemBrain\Dax_Woche\Base.as (241, 4) : ERR : No matching signatures to 'TeacherSetting(const ETeachSetting, const string&)'
1 Error(s).
0 Warning(s):
Unable to execute script!

Liegts am "Variable Type", geht das überhaupt ?

Zu dem Script allgemein hab ich schon noch einige Ideen, auch die Beschreibung ist noch nicht OPTI.
Es sollten aber Funktionen sein, die der NORMAL-USER braucht, am besten EIN/AUS schaltbar, über Variablen.
(Werd mich am Wochenende dranmachen).

Ich denke da an:

Wird der "Net Error Viewer" eingeblendet.
Wird der "Pattern Error Viewer" eingeblendet.
Man könnte das Script auch mehrfach ablaufen lassen.
(Das Netz nach jedem Durchlauf initialisieren/trainieren, und dann mit jedem Netz einen OUTPUT generieren).
(Aber welches Netz speichere ich dann ab, nur das letzte, das beste oder alle) ?
(Dann giebt jemand (Der DAU) 10000 Durchläufe an, und hat dann einen Ordner mit 10000 MemBrain Netzen und 10000 Output Dateien, auch nicht so gut).
(Die Outputs alle in eine CSV-Datei, oder dann auch 10000 Output Dateien) ?

Die Trainingszeit automatisch ermitteln.
Einen "guten/durchschnittlichen" Net Error für den Abbruch des Trainings automatisch ermitteln.

Naja es ist nicht ganz einfach, ein Script für ALLE zu basteln, aber ich versuch's einfach mal...

Thomas, ich muß es einfach nochmal ansprechen:
Kann man nicht die Fensterpositionen von:
Trace Windows
Net Error Viewer
Pattern Error Viewer
irgendwo abspeichern (ist echt nervtötend, alle Fenster jedesmal neu zu positionieren).
Beim beenden von MemBrain ?
Über's Script ?

Wenn ich z.B. in diesem Base Script beide Viewers einblenden will, liegen diese genau übereinander, ist ja auch nicht so toll.

Gruß Seppy
Wer arbeitet macht Fehler, wer wenig arbeitet macht wenig Fehler, wer nicht arbeitet macht keine Fehler, wer keine Fehler macht wird befördert.
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Basis Script zum anpassen

Post by Admin »

Hallo Seppy,
Seppy wrote:const string XXX = "ORDERED";

und dann mit:

TeacherSetting(PATTERN_SELECT, XXX);
mit einem String geht das nicht, es müsste aber mit folgendem gehen:

Code: Select all

EPatternSelect patternSelectMethod = ORDERED;

TeacherSetting(PATTERN_SELECT, patternSelectMethod );
Kann es jetzt gerade nicht ausprobieren, müsste aber klappen.
Seppy wrote:Kann man nicht die Fensterpositionen von:
Trace Windows
Net Error Viewer
Pattern Error Viewer
irgendwo abspeichern (ist echt nervtötend, alle Fenster jedesmal neu zu positionieren).
Beim beenden von MemBrain ?
Über's Script ?
Das ist wirklich eine gute Erweiterung, ich werde sehen, was ich machen kann.

Viele Grüße
Thomas Jetter
User avatar
NNTUM
Posts: 10
Joined: Wed 22. Jul 2009, 23:24

Re: Basis Script zum anpassen

Post by NNTUM »

Hi,

ich bräuchte eine Möglichkeit das Training abbrechen zu lassen sobald eine gewisse Anzahl "Lessen Repitions" erreicht wurde. (Macht wahrscheinlich nur bei ORDERED und RANDOM_ORDERED sinn, aber das wäre bei mir der Fall)

Habe versucht das ganze mal in der Funktion Training_Net() einzubauen, aber hat leider nicht funktioniert:
(Das Skript startet zwar, aber der PC reagiert dann nicht mehr und bricht auch nicht bei der gewünschten Anzahl Lernschritten ab)

Code: Select all

const double MAX_LESSON_REPS = 100;

.....

void Training_Net()
{
  StopThink();                            // ALLE Think-Vorgänge werden gestopt.
  StopTeaching();                         // ALLE Teaching-Vorgänge werden gestopt.
  ResetNet();                             // Das Netz resetten.
  RandomizeNet();                         // Das Netz mit Zufallswerten initialisieren.
  ResetThinkSteps();                      // Die "ThinkSteps" werden auf "0" gesetzt.
  SelectLesson(1);                        // Lesson "2" für's training aktivieren.
  SelectNetErrLesson(2);                  // Lesson "3" zur berechnung des NetErrors aktivieren.
  EnableLessonOutData(true);              // Siehe MemBrain Hilfe, ich muß auch erst noch nachsehen.
  ShowLessonEditor(false);                // Der "LessonEditor" soll NICHT angezeigt werden.


  ResetLessonReps();					  // Anzahl der Lesson-Wiederholungen wird zurückgesetzt


  StartTeaching();                        // Das Training wird gestartet.


  const double DONE_LESSON_REPS = 0;
  while (DONE_LESSON_REPS  <= MAX_LESSON_REPS)          // Diese Schleife/Training des Netzes wird durchlaufen bis der NetError von "TRAINING_EXIT" erreicht wird.
  {
    const double DONE_LESSON_REPS = GetLessonReps();	  // Anzahl der Lesson-Wiederholungen wird ermittelt
  }


  SleepExec();                            // Das Netz wird trainiert bis der Net Error von "TRAINING_EXIT" erreicht wurde.
  SaveNet(NET_FILE_NAME);                 // Das Netz abspeichern.
}
Edit: hab mir den Code gerade nochmal angekuckt - macht so keinen Sinn die Schleife. Ist wohl schon etwas spät um sich jetzt noch in etwas einarbeiten zu wollen :)

Gibts ne einfache Möglchkeit das zu implementieren? Würde mir sehr helfen, da ich ca. 20-40 unterschiedliche Netze an der Uni auf Tauglichkeit prüfen und das nicht unbedingt per Hand machen will. Da darf der PC dann halt paar Tage durchlaufen, ohne dass es stört. Aber ich kenn für die meisten netze keine realistischen NetError-Werte als Abbruchbedingungen. Manche schaffen es bis auf NetError "0" (Binärer Output), manche nur bis 0,xx und einige schaffens nicht mal in den einstelligen Bereich.

Hoffe ihr könnt mir weiterhelfen.

Grüße,
Jonathan
________________________________________________
"Sooooo, this is engineering, huh? [...] Engineering - where the noble semi-skilled laborers execute the vision of those who think and dream... Hello Oompa Loompas of science!" :D
User avatar
Seppy
Posts: 47
Joined: Fri 5. Dec 2008, 04:48
Location: 90537 Feucht

Re: Basis Script zum anpassen

Post by Seppy »

Hallo Jonathan,

das mit den "Lessen Repitions" werd ich am Wochenende mal versuchen einzubauen, vorher komm ich leider nicht dazu (Ich hoffe Du hast solange Zeit).
Ich will auch noch einen Trainingsabbruch nach einer gewissen Zeit/Sek/Min einfügen.

Schau auch immer aufs Datum (Steht im 1. Beitrag im Forum in der 3. Zeile "Version vom 22.07. 2009." und auch im Script selbst in der 1. Zeile).
Ich werd da noch einige Sachen einbauen, und dann immer die aktuellste Version ins Forum stellen, unter der Woche ist das aber schwierig (Zeitmangel).

Ich hab auch in Deinem Code gesehen, daß Du die Befehle "SelectLesson/SelectNetErrLesson" geändert hast (Evtl. hat es deshalb nicht funktioniert).
-----------------------------------------------------------------------------------------------------------
SelectLesson(1); // Lesson "2" für's training aktivieren.
SelectNetErrLesson(2); // Lesson "3" zur berechnung des NetErrors aktivieren.
-----------------------------------------------------------------------------------------------------------

Die Reihenfolge der Lessons ist z.Z. nämlich FEST VORGEGEBEN:
(Ich werd das später auch noch mit Variablen machen).

1. Normalize
2. Training
3. Validate
4. Thinking
5. Output
Wenn Du keine "Normalize-Lesson" hast, trag bei Normalize und Training die gleiche Lesson ein (Also den Dateiname deiner Train-Lesson, das sollte funktionieren).
Oder kopier die Train-Lesson nach Normalize.csv, und trag diese dann als "Normalize-Lesson" ein.

Wenn Du an dieser Reihenfolge etwas ändern willst:
Dann mußt Du auch alle Befehle die mit den Lessons zu tun haben in:
Der Funktion "Load_Lessons".
Der Funktion "Training_Net".
Der Funktion "Thinking_Lesson".
Der Funktion "Save_Output".
ÄNDERN, sonst GEHT ES NICHT !!!

Schau mal am Sonntag nach, ob es eine neue Version giebt, ich meine, das bekomm ich Samstag/Nacht hin, (Meine NACHT ist LAAAANG, schöööööön, duuuuunkel und COOOOL).

Gruß Seppy
Wer arbeitet macht Fehler, wer wenig arbeitet macht wenig Fehler, wer nicht arbeitet macht keine Fehler, wer keine Fehler macht wird befördert.
User avatar
NNTUM
Posts: 10
Joined: Wed 22. Jul 2009, 23:24

Re: Basis Script zum anpassen

Post by NNTUM »

Hallo Seppy,

da ich meine Input-Daten gleich beim Generieren auch normalisiere habe ich die Normalize-Datei weggelassen und die entsprechenden Zeilen abgeändert. Auch die Think-Steps lass ich weg, weil ich nur Trainieren und Validieren will, sonst nix. Daran dürfte es nicht gehapert haben sondern wahrscheinlich wirklich nur an meiner Schleife die ich da eingebaut hab.

Aber Danke für dein Bemühen, bis zum WE kann ich noch locker warten :)
Die Zeitfunktion ist sicherlich auch seeeehr hilfreich. Wär toll wenn man alle 3 Abbruchkriterien setzen könnte und er dann abbricht wenn er eines der 3 - also entweder NetError ODER Lesson-Repetitions ODER Zeit - erreicht hat.
________________________________________________
"Sooooo, this is engineering, huh? [...] Engineering - where the noble semi-skilled laborers execute the vision of those who think and dream... Hello Oompa Loompas of science!" :D
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Basis Script zum anpassen

Post by Admin »

Hallo Seppy,
Seppy wrote:Ich will auch noch einen Trainingsabbruch nach einer gewissen Zeit/Sek/Min einfügen.
Um das ein bisschen zu unterstützen, habe ich die Skript-Beipiele auf der Homepage noch etwas angepasst, speziell habe ich das Skript 'SecondsTimer.as' erweitert:

Mann kann jetzt einfach die Methode 'Start()' eines Timers auch ohne Argumente aufrufen. Das startet den Timer und man kann zu jedem beiliebigen Zeitpunkt über die Methode 'SecondsSinceStart()' die Anzahl Sekunden bekommen, die seit dem Start verstrichen sind. So könnte man also die Laufzeit eines Trainingsvorgangs messen, um diesen nach einer gewissen Zeit abzubrechen. Diese Methode macht allerdings keinen Sinn, wenn der Timer mit einem Ablaufintervall (also z.B. 'MeinTimer.Start(1000)') gestartet wurde. Sie sollte nur für Timer verwendet werden, die ohne Argument zu 'Start' gestartet wurden, also z.B. 'MeinTimer.Start()'.
Wenn ein Timer-Objekt neu erzeugt wird, wird der entsprechende Timer übrigens gleich automatisch gestartet.

Wenn man Start() für einen Timer erneut aufruft, so wird die verstrichene Zeit wieder auf 0 gesetzt, die Methode ist also eigentlich ein 'Reset And Start'.

Das Demo-Skript 'UsingSecondsTimerExample.as' habe ich entsprechend angepasst, um die neuen Methoden zu veranschaulichen.

Viele Grüße,
Thomas
Thomas Jetter
User avatar
Admin
Site Admin
Posts: 438
Joined: Sun 16. Nov 2008, 18:21

Re: Basis Script zum anpassen

Post by Admin »

Hallo Seppy,
Seppy wrote:Thomas, ich muß es einfach nochmal ansprechen:
Kann man nicht die Fensterpositionen von:
Trace Windows
Net Error Viewer
Pattern Error Viewer
irgendwo abspeichern (ist echt nervtötend, alle Fenster jedesmal neu zu positionieren).
Beim beenden von MemBrain ?
Eine neue MemBrain Version 03.05.01.00 liegt seit gerade eben auf dem Server unter http://www.membrain-nn.de.
Diese merkt sich die Fensterpositionen beim Beenden.

Ich habe für diese neue Version nicht schon wieder einen Newsletter geschrieben, für die meisten Benutzer ist die Änderung wahrscheinlich nicht allzu relevant. Ich fand's aber ne schöne Idee.

Viele Grüße,
Thomas
Thomas Jetter
User avatar
Seppy
Posts: 47
Joined: Fri 5. Dec 2008, 04:48
Location: 90537 Feucht

Re: Basis Script zum anpassen

Post by Seppy »

Hallo Thomas,

vielen, vielen Dank für das letzte MB Update.
Endlich hat dieses "PIXELGENAUEFENSTERVERSCHIEBENMEHRMALSTÄGLICH" ein Ende.
danke, danke, danke.

Das Script ist fertig, ich werd noch ein bisschen testen.
Aber soweit ich das sehe, funktioniert jetzt alles:

Net Error Viewer EIN/AUS blenden.
Pattern Error Viewer EIN/AUS blenden.
Trainingsabbruch nach Zeit.
Trainingsabbruch nach Lesson Repetitions.
Trainingsabbruch nach Net Error.
Die Reihenfolge in der die Trainingsdaten gelernt werden über eine Variable einstellen.
(ORDERED/RAND_ORDER/RAND_SELECT)

Der neue Timer hat mich auch ein ganzes STÜCK weiter gebracht, danke.

Ich wollte das ganze erst mit SleepExec() / SleepExec(uint maxTimeMs), machen, hab damit aber keine Lösung gefunden.
(Ich check das nicht, wie ich das in eine "While Schleife" einbauen kann, mit den ganzen IF's)

Also verwende ich wieder die alte "while" Schleife mit Sleep(100).

Fragen:
Wo füge ich den Sleep(100) am besten ein (Anfang oder Ende der Schleife)?
Wie werden Befehle wie z.B. "bool SleepExec(uint maxTimeMs)" verwendet ?

Der SleepExec() sieht ja so aus:
SleepExec();

Wie ist das mit "bool SleepExec(uint maxTimeMs)" ?
SleepExec(6000);
SleepExec("6000");
bool SleepExec(6000);
bool SleepExec("6000");
????????????

Wäre schön wenn Du mir da einen kleinen SCHUBS in die richtige Richtung geben könntest, evtl. brauch ich solche Befehle doch irgendwann.
Das Script hab ich gerade hochgeladen.

Für Verbesserungen/weitere Funktionen bin ich natürlich IMMER zu haben...

Gruß Seppy
Wer arbeitet macht Fehler, wer wenig arbeitet macht wenig Fehler, wer nicht arbeitet macht keine Fehler, wer keine Fehler macht wird befördert.
Post Reply