[ML-Aents] Ich habe versucht, maschinelles Lernen mit Unity und TensorFlow of Python (v0.11β-kompatibel) zu lernen.

Einführung

Ich konnte den japanischen Artikel von v0.11.0 nicht finden, daher habe ich ein Memorandum.

Dieser Artikel ist __für Anfänger __. Anfänger von Unity ahmen [eines der offiziellen ML-Agents-Tutorials] nach (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md) Tu es Es ist eines der maschinellen Lernen, __Verstärkungslernen __.

Rollerball.gif __ Ich werde so etwas machen. : Pfeil nach oben: __

Es ist für Leute, die noch kein maschinelles Lernen gemacht haben, obwohl sie wissen, wie man Unity einfach zum Laufen bringt. Anstatt uns auf die Theorie zu konzentrieren, führen wir sie ein, damit Sie sie erleben können, während Sie Ihre Hände bewegen.

* Dieser Artikel ist ab dem 13. November 2019 aktuell. </ b> ML-Agenten werden schnell aktualisiert. Überprüfen Sie daher immer die neuesten Informationen. ~~ [Buch letztes Jahr veröffentlicht](https://www.amazon.co.jp/Unity%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82 % 8B% E6% A9% 9F% E6% A2% B0% E5% AD% A6% E7% BF% 92% E3% 83% BB% E5% BC% B7% E5% 8C% 96% E5% AD% A6 % E7% BF% 92-Unity-ML-Agenten% E5% AE% 9F% E8% B7% B5% E3% 82% B2% E3% 83% BC% E3% 83% A0% E3% 83% 97% E3 % 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E5% B8% 83% E7% 95% 99% E5% B7% 9D-% E8% 8B% B1% E4% B8% 80 / dp / 48624648181) hat ~~ nicht geholfen (Übrigens, diesjähriger Übergang ⇒ 19. Januar: * v0.6 * ➡ April: * v0.8 * ➡ Oktober: * v0.10 * ➡ Stand November: * v0.11 *)

Ungefähr der Punkt

Es gibt einige wesentliche Wörter für maschinelles Lernen in Unity. Das ist __ "Akademie", "Gehirn" und "Agent" __.

Grundsätzlich steuert "Brain" die Aktionen, die "Agent" in der von "Academy" in Unity definierten Umgebung ausführt. Dieses Mal werden wir das Verstärkungslernen über ein externes TensorFlow (Python-Framework) durchführen und das generierte neuronale Netzwerkmodell in Unity laden und ausführen. (Dies ist ein einfaches Tutorial, daher werde ich die Akademie nicht sehr berühren.)

ML-Agents

Wichtige Änderungen gegenüber Version 0.10.0

__ Wenn Sie neu in diesem Bereich sind, können Sie es überspringen. __ __ Ich habe v0.8x und v0.9x verwendet, bin mir aber nicht sicher, weil ich keine Gehirnparameter finden kann. Wenn Sie jedoch nur hier suchen, ist dies möglicherweise in Ordnung.

    • Broadcast Hub * wird abgeschafft.
    • Brain Scriptable Objects * wird abgeschafft. ⇒ Wechseln Sie zu * Verhaltensparameter * </ b>
  • Wichtige Setup-Änderungen für * Visual Observation *.
  • Erneuerte Definition von gRPC. --Abolition des Online-BC-Trainings.

Ausführungsumgebung

  • Windows10
  • Unity 2019.1.4f1
  • ML-Agents Beta 0.11.0
  • Python 3.6(Anaconda)

Vorbereitung

Bitte installieren Sie zuerst Folgendes.

Projekterstellung

    1. Starten Sie Unity und erstellen Sie ein Projekt namens "Roller Ball".
    • Datei-> Build-Einstellungen ...-> Player-Einstellungen ...-> Andere Einstellungen-> Konfiguration *
  • Scripting Runtime Version </ b> * und * API-Kompatibilitätsstufe </ b> * sind * .NET 4.x-Äquivalent </ b> * bzw. * .NET. 4. Stellen Sie sicher, dass es x </ b> * ist. YHN.png
    1. Laden Sie ML-Agents-Assets in Ihr Projekt. Befindet sich im heruntergeladenen ml-Agents-Master \ UnitySDK \ Assets
  • D & D * der Ordner "ML-Agents" in Ihrem Projekt. ooop.png

Bühnenerstellung

Einen Boden schaffen

    • 3D-Objekt> Ebene * zum Erstellen einer Ebene. --Nennen Sie die * Ebene *, die Sie als "Boden" erstellt haben.
    • Transform * von Floor
    • Position = (0, 0, 0)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) Zu -Spielen Sie mit * Element * von * Inpector *> * Materials *, damit es so aussieht, wie Sie es möchten. ppppp.png

Box erstellen (Ziel)

    • 3D-Objekt> Würfel * zum Erstellen eines Würfels. --Nennen Sie den erstellten * Würfel * "Ziel".
    • Transform * von Target
    • Position = (3, 0.5, 3)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) Zu
  • Ähnlich wie bei "Boden" können Sie das Erscheinungsbild nach Ihren Wünschen ändern. box.png

Erstellen eines Fußballs (Agent)

    • 3D-Objekt> Kugel *, um eine Kugel zu löschen. --Nennen Sie die * Kugel *, die Sie als "RollerAgent" erstellt haben.
    • Transform * von RollerAgent
    • Position = (0, 0.5, 0)
    • Rotation = (0, 0, 0)
    • Scale = (1, 1, 1) Zu ―― Ändern Sie nach wie vor das Erscheinungsbild nach Ihren Wünschen. Wenn Sie möchten, dass es wie eine Kugel aussieht, wählen Sie das Material "CheckerSquare". -Add * Rigidbody * von * Add Component *. kkkkk.png

Erstellen eines leeren Objekts (Akademie)

    • Create Empty * bringt ein leeres * GameObject * hervor. --Nennen Sie das erstellte * GameObject * "Academy". oooiiiii.png

Als nächstes werde ich den Inhalt in C # beschreiben.

Implementierung einer Akademie

  • Wenn im Fenster * Hierarchie * die Option Akademie ausgewählt ist, verwenden Sie * Komponente hinzufügen-> Neues Skript *, um ein Skript mit dem Namen RollerAcademy.cs zu erstellen.
  • Schreiben Sie den Inhalt von RollerAcademy.cs wie folgt um. Sie können den ursprünglichen Inhalt löschen.

RollerAcademy.cs


using MLAgents;
public class RollerAcademy : Academy{ }

In dieser Beschreibung Grundfunktionen wie "Beobachtungsentscheidungsaktion" (hier weggelassen) werden von der Klasse * Academy * an die Klasse * RollerAcademy * vererbt. Es ist also okay mit zwei Zeilen.

Implementieren Sie einen Agenten

Wählen Sie im Fenster * Hierarchie * RollerAgent und wählen Sie Erstellen Sie ein Skript mit dem Namen RollerAgent.cs mit * Add Component-> New Script *.

Vererbung der * Basis *

Schreiben Sie den Inhalt von "RollerAgent.cs" wie folgt um.

RollerAgent.cs


using MLAgents;
public class RollerAgent : Agent{ }

Wie * Academy * liest es den Namespace * MLAgents * und gibt * Agent * als zu erbende Basisklasse an.

Dies ist das grundlegende Verfahren zum Einbinden von ML-Agenten in __Unity. Als nächstes werden wir einen Mechanismus hinzufügen, mit dem der Ball auf die Box zuläuft, indem das Lernen gestärkt wird.

Initialisierung und Zurücksetzen

Schreiben Sie den Inhalt von "RollerAgent.cs" wie folgt um.

RollerAgent.cs


using unityEngine;
using MLAgents;

public class RollerAgent:Agent
{
    Rigidbody rBody;
    void Start(){
        rBody = GetComponent<Rigidbody>();
    }

    public Transform Target;
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            //Rotationsbeschleunigung und Zurücksetzen der Beschleunigung
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            //Bringen Sie den Agenten in die Ausgangsposition zurück
            this.transform.position = new Vector3( 0, 0.5f, 0)
        }
        //Zielverlagerung
        Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
                                      Random.value * 8 - 4);
    }

}

Hier,

--Nächste __ Verlagerung und Initialisierung __ wenn RollerAgent die Box erreicht ( Ziel) --__ Zurück __ wenn RollerAgent vom Boden fällt ( Floor)

Wird verarbeitet.

Rigidbody ist eine Komponente, die in der physikalischen Simulation von Unity verwendet wird. Dieses Mal wird es verwendet, um den Agenten auszuführen. Die Werte von * Position, Rotation, Scale * werden in Transform aufgezeichnet. Durch die Definition in "public" kann * Inpector * "Transform" von * Target * übergeben.

Umwelt beobachten

Fügen Sie Folgendes in die Klasse von "RollerAgent.cs" ein.

public override void CollectObservations()
{
    //Ziel- und Agentenstandort
    AddVectorObs(Target.position);
    AddvectorObs(This.transform.position);

    //Agentengeschwindigkeit
    AddVectorObs(rBody.velocity.x);
    AddVectorObs(rBody.velocity.z);
}

Hier, __ Verarbeitung zum Sammeln beobachteter Daten als Merkmalsvektor __ Ich mache.

Die 3D-Koordinaten von * Target * und * Agent * und die gesamten 8D-Vektoren von * Agent * -Geschwindigkeiten * x * und * z * werden an das neuronale Netzwerk übergeben. ~~ 8. Dimension ist cool ~~

Aktionen und Belohnungen

Fügen Sie die folgende Verarbeitung für die Funktion AgentAction () zu RollerAgent.cs hinzu.

public float speed = 10
public override void AgentAction(float[] vectorAction, string textAction)
{
    //Aktion
    Vector3 controlSignal = Vector3.zero;
    controlSignal.x = vectorAction[0];
    controlSignal.z = vectorAction[1];
    rBody.AddForce(controlSignal * speed);

    
    //Belohnung
    //Ermitteln Sie die Entfernung zur Box (Ziel) aus der Entfernung, die der Ball (Agent) bewegt hat
   float distanceToTarget = Vector3.Distance(this.transform.position, 
                                             Target.position);

    //Wenn die Box (Ziel) erreicht ist
    if (distanceToTarget < 1.42f)
    {
        //Belohnt und abgeschlossen
        SetReward(1.0f);
        Done();
    }

    //Wenn Sie vom Boden fallen
    if (this.transform.position.y < 0)
    {
        Done();
    }
}

Hier, __Die "Aktion" des Lesens der beiden Arten von Kräften (kontinuierliche Werte) in X- und Z-Richtung und des Versuchs, den Agenten zu bewegen Wir verarbeiten einen Lernalgorithmus, der eine "Belohnung" gibt, wenn der Agent die Box erfolgreich erreicht, und die "Belohnung" aufnimmt, wenn sie fällt.

Die Funktion "AddForce" ist eine Funktion zum Aufbringen physischer Kraft auf ein Objekt mit einer * Rigidbody * -Komponente und zum Verschieben. Erst wenn der Abstand unter dem Referenzwert berechnet wird, um zu beurteilen, ob das Ziel erreicht wurde, wird die Belohnung vergeben und das Zurücksetzen durchgeführt.

Um in komplizierteren Situationen genug zu lernen, ist es effektiv, nicht nur die Belohnung, sondern auch die Bestrafung zu schreiben. ~~ (Bei v0,5x war es "-1", als es vom Boden fiel, aber es scheint, dass es in der neuesten Version als unnötig beurteilt wurde) ~~

Zusammenfassend sieht RollerAgents.cs folgendermaßen aus:

RollerAgents.cs


using unityEngine;
using MLAgents;

public class RollerAgent:Agent
{
    Rigidbody rBody;
    void Start(){
        rBody = GetComponent<Rigidbody>();
    }

    public Transform Target;
    public override void AgentReset()
    {
        if (this.transform.position.y < 0)
        {
            //Rotationsbeschleunigung und Zurücksetzen der Beschleunigung
            this.rBody.angularVelocity = Vector3.zero;
            this.rBody.velocity = Vector3.zero;
            //Bringen Sie den Agenten in die Ausgangsposition zurück
            this.transform.position = new Vector3( 0, 0.5f, 0)
        }
        //Zielverlagerung
        Target.position = new Vector3(Random.value * 8 - 4, 0.5f,
                                      Random.value * 8 - 4);
    }

    public override void CollectObservations()
    {
        //Ziel- und Agentenstandort
        AddVectorObs(Target.position);
        AddvectorObs(This.transform.position);

        //Agentengeschwindigkeit
        AddVectorObs(rBody.velocity.x);
        AddVectorObs(rBody.velocity.z);
    }

    public override void AgentAction(float[] vectorAction, string textAction)
    {
        //Aktion
        Vector3 controlSignal = Vector3.zero;
        controlSignal.x = vectorAction[0];
        controlSignal.z = vectorAction[1];
        rBody.AddForce(controlSignal * speed);

    
        //Belohnung
        //Ermitteln Sie die Entfernung zur Box (Ziel) aus der Entfernung, die der Ball (Agent) bewegt hat
        float distanceToTarget = Vector3.Distance(this.transform.position, 
                                                 Target.position);

        //Wenn die Box (Ziel) erreicht ist
        if (distanceToTarget < 1.42f)
        {
            //Belohnt und abgeschlossen
            SetReward(1.0f);
            Done();
        }

        //Wenn Sie vom Boden fallen
        if (this.transform.position.y < 0)
        {
            Done();
        }
    }
}

Beenden Sie im Unity-Editor

-Wählen Sie im Fenster * Hierarchie * die Option "RollerAgent" und ändern Sie das Element "RollerAgent (Skript)" um zwei Punkte. Decision Interval = 10 Target = Target(Transform) sct.png

-Add * Komponente hinzufügen> Verhaltensparameter * und ändern Sie die Einstellungen wie folgt.

Behavior Name = RollerBallBrain Vector Observation Space Size = 8 Vector Action Space Type = Continuous Vector Action Space Size = 2

Be.png

Laut offizieller Dokumentation (https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Create-New.md), wenn Sie weiterhin die Standardparameter 30 verwenden Es scheint, dass es Zeit braucht, um 10.000 Schritte zu lernen. Diesmal ist es nicht so kompliziert, also schreiben wir einige der Parameter neu, um die Anzahl der Versuche auf weniger als 20.000 Schritte zu reduzieren.

-Öffnen Sie Trainer_config.yaml in * ml-Agents-Master-0.11> config> * mit einem Editor (VS-Code oder Editor) und schreiben Sie die Werte der folgenden Elemente neu.

aaaa.png

batch_size: 10
buffer_size: 100

Jetzt können Sie trainieren.

Manueller Test

Es ist fast Zeit, hierher zu kommen. Bevor Sie das Lernen stärken, überprüfen wir manuell, ob die bisher erstellte Umgebung ordnungsgemäß funktioniert. Implementieren Sie die folgende Methode zusätzlich in der Klasse "RollerAgent.cs".

public override float[] Heuristic()
{
    var action = new float[2];
    action[0] = Input.GetAxis("Horizontal");
    action[1] = Input.GetAxis("Vertical");
    return action;
}

Horizontale (horizontale) Eingabeachse mit "Horizontal", Ermöglicht Vertical, vertikale (vertikale) Eingabeachsen zu akzeptieren.

Sie können jetzt die Tasten "W", "A", "S", "D" oder die Pfeiltasten verwenden.

Schließlich im * Inspector * des Roller Agent, Aktivieren Sie das Kontrollkästchen * Heuristik verwenden * unter * Verhaltensparameter *.

he.png

Drücken Sie Play, um es auszuführen. Wenn Sie durch Tastatureingabe bestätigen können, dass es funktioniert, ist es erfolgreich.

Trainiere mit TensorFlow

Fahren wir nun mit dem Lernschritt fort.

Umgebungsbau / Bibliotheksinstallation

Starten Sie zunächst Anaconda Prompt. Sie finden es sofort, indem Sie über das Startmenü (Win-Taste) suchen. an.png

conda create -n ml-agents python=3.6

Geben Sie ein, um eine virtuelle Umgebung zu erstellen. [^ 1] on.png

Proceed([y]/n)?

Sie werden gefragt, ob Sie es installieren möchten. Geben Sie also "y" ein. fortsetzen,

activate ml-agents

Geben Sie ein, um in die virtuelle Umgebung zu wechseln. [^ 2] Stellen Sie sicher, dass Sie die "(ml-Agenten)" am Anfang der Befehlszeile sehen. aaaa.png

cd <ml-Agentenordner >

Gehe zu. [^ 3]

pip install mlagents

Installieren Sie die Bibliothek, die ML-Agents unabhängig verwendet. (Es dauert ein paar Minuten) Diese Installation macht Abhängigkeiten wie TensorFlow / Jupyter.

Nach einer Weile, Es ist in Ordnung, wenn ein Bildschirm wie dieser angezeigt wird. wewe.png

cd <ml-Agentenordner >\ml-agents-envs

Gehe zu.

pip install -e .

So installieren Sie das Paket. konnna.png Es ist in Ordnung, wenn der Bildschirm so aussieht. Und

cd <ml-Agentenordner >\ml-agents

Gehe zu.

pip install -e .

So installieren Sie das Paket. www.png

Damit ist die Vorbereitung auf der Python-Seite abgeschlossen.

__ : Kollision: [Hinweis]: Das TensorFlowSharp-Plug-In wird in Version 0.6.x oder höher nicht verwendet. __ Wenn Sie sich auf alte Bücher bezogen haben, empfehlen wir Ihnen, eine neue virtuelle Umgebung neu zu erstellen.

Bis ML-Agents Version 0.0.0 wurde TensorFlowSharp für die Kommunikation mit Python verwendet. Verwenden Sie es jedoch nicht in der neuesten Version. Wenn Sie es verwenden, tritt der folgende Fehler auf.

No model was present for the Brain 3DBallLearning. UnityEngine.Debug:LogError(Object) MLAgents.LearningBrain:DecideAction() (at Assets/ML-Agents/Scripts/LearningBrain.cs:191) MLAgents.Brain:BrainDecideAction() (at Assets/ML-Agents/Scripts/Brain.cs:80) MLAgents.Academy:EnvironmentStep() (at Assets/ML-Agents/Scripts/Academy.cs:601) MLAgents.Academy:FixedUpdate() (at Assets/ML-Agents/Scripts/Academy.cs:627)

(Quelle)


Verstärkungslernen

Nun, endlich werden wir anfangen zu lernen. Das Traum-KI-Erlebnis steht vor der Tür. geben wir unser Bestes.

cd <ml-Agenten> Ordner

Geben Sie ein, um zur heruntergeladenen Ordnerhierarchie zu wechseln.

mlagents-learn config/trainer_config.yaml --run-id=firstRun --train

Ausführen. [^ 4] aaaaw.png Am Ende der Befehlszeile, __INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor. (Gehen Sie zurück zum Unity-Editor und drücken Sie die Wiedergabetaste, um das Training zu starten.) __ Wird angezeigt.

Kehren Sie zum Unity-Bildschirm zurück und deaktivieren Sie * Use Heuristic * in __ * Behavior Parameters * und drücken Sie die Taste __ ,: arrow_forward :.

Als der Ball anfing, die Box zu jagen, begann das Lernen normal.

__ Wenn Sie die Wiedergabetaste eine Weile nicht drücken, tritt ein Timeout-Fehler auf. Führen Sie daher denselben Befehl erneut aus. __ __

Das Protokoll wird alle 1000 Schritte in das Konsolenprotokoll ausgegeben. Wenn Sie in der Mitte unterbrechen möchten, können Sie mit Strg + C unterbrechen. (Wenn Sie es wagen, früh fertig zu werden, können Sie eine "schwache KI" machen) おー!!!!.png

__Schritt ist die Anzahl der Versuche (Lernen), __ __Mittelbelohnung verdient durchschnittliche Belohnung, __ __Std der Belohnung ist die Standardabweichung __ (Wert, der die Datenvariation darstellt) Repräsentiert.

Nach dem Lernen wird eine RollerBallBrain.nn-Datei unter <ml-agent-Ordner> \ models \ <id name ~> erstellt.

hyhy.png

Reflexion des Lernens

Jetzt ist es Zeit, das Modell des erzeugten neuronalen Netzwerks zu testen.

Kopieren Sie die Datei "RollerBallBrain.nn" von früher in den Ordner "* Assets *" in Unitys Projekt. (Der Speicherort kann sich an einer beliebigen Stelle im Projekt befinden.) wwqqqq.png

Klicken Sie dann auf die Schaltfläche: radio_button: ganz rechts neben dem Element * Model * im * Inspector * des RollerAgent und wählen Sie die importierte .nn-Datei aus. (* Achten Sie zu diesem Zeitpunkt darauf, nicht zu verwechseln, wenn eine Erweiterungsdatei ".nn" mit demselben Namen vorhanden ist.)

Wenn * Heuristik verwenden * in * Verhaltensparameter * aktiviert bleibt, funktioniert dies nicht ordnungsgemäß. __ Deaktivieren Sie das Kontrollkästchen nach dem Test. __ __ aaaqqqq.png

Drücken wir nun: arrow_forward: Play.

__ Wenn der Ball Sie sicher verfolgt, sind Sie erfolgreich. __ __ 30fps.gif

(Bonus) Beobachten Sie das Übergangsdiagramm mit TensorBoard

Gehen Sie in Anaconda Prompt wie folgt vor:

tensorboard --logdir=summaries --port=6006

Wenn Sie [localhost: 6006](http: // localhost: 6006 /) in Ihrem Browser öffnen, sehen Sie den __ Lernübergang in einem Diagramm __. ほほう、TensorBoardですか。(ニチャア・・・.png

Zusammenfassung

――Wenn Sie mehr über Gorigori C # lesen können, können Sie den Algorithmus selbst optimieren. __

  • Beim verbesserten Lernen kann die Weisheit von __AI anhand der Anzahl der Lernvorgänge in schwach, mittel, stark usw. eingeteilt werden. __ --Ver wird häufig erneuert, __ Informationen können sich verschlechtern __ ―― ~~ Lernen ist viel schneller als Menschen. Die Kraft der Wissenschaft ist erstaunlich! !! ~~

Selbst Anfänger können mithilfe von Ressourcen eine bequeme Welt schaffen, in der einfaches maschinelles Lernen an einem Tag nachgeahmt werden kann. Wie war es, als du es tatsächlich berührt hast? Ich hoffe, es wird Sie für maschinelles Lernen interessieren.

Wenn Sie Ausdrücke oder Tippfehler finden, an denen Sie interessiert sind, würden wir uns freuen, wenn Sie darauf hinweisen könnten. Auch wenn Sie diesen Artikel hilfreich fanden, gefällt es mir! Es wird Ermutigung sein, wenn du mir gibst.

Danke für Ihre Kooperation.

Referenz

Nachfolgend finden Sie Artikel unserer Vorfahren, die beim Lernen sehr hilfreich waren. Ich möchte diese Gelegenheit nutzen, um __ Danke zu sagen __.

Offizielles Dokument von Unity-Technologies (GitHub) Migrationshandbuch für ml-Agenten (GitHub) [Einheit: Verwendung von ML-Agenten im September 2019 (Version 0.9.0 / 0.9.1/0.9.2)](https://www.fast-system.jp/unity-ml-agents-version-0- 9-0-wie zu /) [Unity] Ich habe ein Tutorial zum erweiterten Lernen ausprobiert (ML-Agents v0.8.1) [Erstellen Sie eine neue Lernumgebung mit den ML-Agenten von Unity (Version 0.6.0a)](http://am1tanaka.hatenablog.com/entry/2019/01/18/212915#%E5%AD%A6%E7 % BF% 92% E5% 8A% B9% E6% 9E% 9C% E3% 82% 92% E9% AB% 98% E3% 82% 81% E3% 82% 8B% E3% 81% 8A% E3% 81 % BE% E3% 81% 91)

[^ 1]: * Sie können den Teil von "ml-Agenten" * in einen beliebigen Namen ändern. [^ 2]: Aktivieren Sie mit dem von Ihnen festgelegten Namen der virtuellen Umgebung [^ 3]: Verzeichnis, in dem * ml-Agents-Master * in [Vorbereitung] heruntergeladen wurde (#Vorbereitung) [^ 4]: * Sie können den Teil von "firstRun" * in einen beliebigen Namen ändern.

Recommended Posts