Erstellen Sie einen leichtgewichtigen Server in Python und hören Sie sich die HTTP-Erweiterungen von Scratch 2 an

Warum gibt es einen leichten HTTP-Server?

Als Beispiel für die Erklärung hier wird die Methode zur Verwendung der Sprachsynthese und Spracherkennung in der Scratch 2-Offline-Version unten zusammengefasst.

Fügen Sie außerdem den Code, der in der folgenden Beschreibung angezeigt wird, in github ein.

Fügen Sie Blöcke in die Scratch 2 s2e-Datei ein

Erklärung PDF In Scratch Extension Page Wenn Sie HTTP-9-11.pdf) lesen, heißt es, dass Sie Blöcke hinzufügen können, indem Sie eine Datei im JSON-Format mit der Erweiterung ".s2e" erstellen und lesen. (Es spielt keine Rolle, um welche Erweiterung es sich handelt, aber es scheint, dass Sie .s2e verwenden sollten.) Im Folgenden werde ich versuchen, das in dieser Erklärung angegebene Beispiel zu verwenden.

test.s2e


{ "extensionName": "Extension Example",
    "extensionPort": 12345,
    "blockSpecs": [
        [" ", "beep", "playBeep"],
        [" ", "set beep volume to %n", "setVolume", 5],
        ["r", "beep volume", "volume"],
    ]
}

Speichern Sie dies in einer Datei namens test.s2e. Wenn Sie die Umschalttaste gedrückt halten und [Datei] in Scratch auswählen, wird [Experimentelle HTTP-Erweiterung laden] angezeigt. Wenn Sie also die dort gespeicherte Datei test.s2e auswählen und laden, wird sie mit Sicherheit blockiert. Wird hinzugefügt werden!

extension_example_empty-s.png

Das? Der Kreis neben "Erweiterungsbeispiel" ist rot.

Laut Erklärung PDF fordert Scratch etwa 30-mal pro Sekunde eine Abfrage an `` GET / poll Ich sende `an den Helfer, aber es scheint rot zu werden, wenn keine Antwort darauf erfolgt. Wenn der Helfer reagiert, wird er grün.

Leichter HTTP-Server mit Python

Teil 1: Reagiere auf GET / Umfrage

Installieren Sie aiohttp mit $ pip install aiohttp und erstellen Sie das folgende Programm (testhelper.py).

testhelper.py


from aiohttp import web

async def handle_poll(request):
    return web.Response(text="OK")

app = web.Application()
app.router.add_get('/poll', handle_poll)

web.run_app(app, host='127.0.0.1', port=12345)

Ich werde es versuchen.

> python testhelper.py
======== Running on http://127.0.0.1:12345 ========
(Press CTRL+C to quit)

Übrigens, wenn ich auf den Bildschirm von Scratch schaue ... Oh, er wurde grün!

extension_example_polling-s.png

Für alle Fälle versuchen Sie GET from bash mit nc.

$ nc localhost 12345
GET /poll HTTP/1.1

Wenn Sie damit die Eingabetaste drücken ...

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Date: Tue, 19 Sep 2017 13:41:21 GMT
Server: Python/3.5 aiohttp/2.1.0

OK

Es scheint, dass aiohttp antwortet.

Teil 2: Senden Sie einen Befehl von Grund auf neu (Befehlsblock)

Lassen Sie uns zunächst den Signaltonblock als Überprüfung implementieren. Der Block, der Befehle von Scratch an den Helfer sendet, wird als "Befehlsblock" bezeichnet. Wenn Sie sich s2e ansehen, können Sie sehen, dass dies mit dem Befehlsnamen playBeep verbunden ist. Zu diesem Zeitpunkt wird GET / playBeep an den Helfer gesendet, und der Helfer sollte dies nehmen und etwas tun. Versuchen Sie, mit "\ 007" zu klingeln.

async def handle_beep(request):
    print("play beep!")
    print("\007")
    return web.Response(text="OK")

#Kürzung

app.router.add_get('/playBeep', handle_beep)

web.run_app(app, host='127.0.0.1', port=12345)

Durch Drücken des Signaltons auf Scratch 2 ertönt ein Geräusch.

Versuchen Sie als Nächstes, den Befehlsblock set beep volume auf (...) zu implementieren, der den Wert sendet. Im folgenden Beispiel hat vol einen Wert, sodass Sie ihn mit request.match_info ['vol'] abrufen können.

async def handle_setvolume(request):
    volume = int(request.match_info['vol'])
    if volume >= 0 and volume <= 10:
        
        print("set volume= " + str(volume))
    else:
        print("out of range: " + str(volume))
    return web.Response(text="OK")

#Kürzung

app.router.add_get('/setVolume/{vol}', handle_setvolume)

web.run_app(app, host='127.0.0.1', port=12345)

Die Anzeige ändert sich abhängig davon, ob Sie einen Wert von 0 bis 10 eingeben und den Block drücken oder ob Sie einen anderen Wert eingeben. (Es ist auch notwendig, "isinteger ()" vor "int ()" zu überprüfen, aber wegzulassen.)

Teil 3: Wert in Scratch empfangen (Reporterblock)

Lassen Sie uns abschließend den Wert vom Helfer an Scratch zurückgeben. In Scratch wird der Block, der diesen Wert empfangen kann, als Reporterblock bezeichnet. Wenn er eine Zahl oder Zeichenfolge empfängt, wird ihm in der s2e-Datei das Präfix "r" vorangestellt. Wenn Sie dagegen einen booleschen Wert erhalten, fügen Sie "b" hinzu, um ihn zu unterscheiden.

Verwenden Sie die Antwort auf "GET / poll", um einen Wert an den Reporterblock zurückzugeben. "Beep Volume" ist mit dem Namen "Volume" verknüpft. Wenn Sie also "Volume 10" auf "GET / Poll" zurücksetzen, wird der Reporterblock gefüllt.

Im Folgenden wird der durch "Beep Volume auf (...) setzen" angegebene Wert unverändert zurückgegeben. Hier ist der gesamte Code bis jetzt.

testhelper.py


from aiohttp import web

volume = 0

async def handle_poll(request):
    text = "volume " + str(volume) + "\n"
    return web.Response(text=text)

async def handle_beep(request):
    print("play beep!")
    print("\007")
    return web.Response(text="OK")

async def handle_setvolume(request):
    global volume  #Vergiss nicht
    tmp_volume = int(request.match_info['vol']) #Einmal zu einer anderen Variablen
    if tmp_volume >= 0 and tmp_volume <= 10:
        volume = tmp_volume
        print("set volume= " + str(volume))
    else:
        print("out of range: " + str(tmp_volume))
    return web.Response(text="OK")

app = web.Application()
app.router.add_get('/poll', handle_poll)
app.router.add_get('/playBeep', handle_beep)
app.router.add_get('/setVolume/{vol}', handle_setvolume)

web.run_app(app, host='127.0.0.1', port=12345)

Es scheint besser, es zu einer Klasse zu machen und wie "self.volume" darauf zuzugreifen. Ist es so im Unterricht?

Versuchen Sie es mit Scratch. Überprüfen Sie zunächst den Wert neben dem Reporterblock "Beep Volume", um den Wert anzuzeigen. Wenn Sie als Nächstes eine Zahl in den Befehlsblock "Set Beep Volume auf (...)" eingeben und ausführen (auf den Block klicken), ändert sich der Wert des Reporterblocks "Beep Volume" auf den im Befehlsblock angegebenen Wert. Sie können sehen, dass.

command_and_reporter.png

Wenn mehrere Reporterblöcke vorhanden sind, geben Sie die Antwort getrennt durch den Zeilenvorschubcode "0A" zurück.

Andere: Befehlsblock warten usw.

Einige Befehlsblöcke warten auf ihre Ausführung und werden durch das Präfix "w" in s2e angegeben. Um diesen Block zu implementieren, müssen Sie Scratch mitteilen, dass der Befehl ausgeführt wird.

Wenn Sie beispielsweise "w" hinzufügen, um die Signaltonlautstärke auf (...) zu setzen, wird aus "GET / setVolume / 5" die Befehls-ID "GET / setVolume / 2574/5". Wird hinzugefügt (2574 ist ein Beispiel, tatsächlich ist der Wert für jede Befehlsanforderung unterschiedlich). Durch Hinzufügen dieser Befehls-ID zur Antwort auf die Abfrage wird der Scratch-Seite mitgeteilt, welcher Block ausgeführt wird. Fügen Sie es zu diesem Zeitpunkt im Format "_busy 2574" hinzu. Wenn Sie mehrere Befehls-IDs zurückgeben müssen, trennen Sie diese durch ein Leerzeichen.

Darüber hinaus gibt es verschiedene Themen wie das Auswählen eines Blocks aus einem Pulldown-Menü ohne Eingabe eines Werts, das Empfangen einer Zeichenfolge, das Zurücksetzen, domänenübergreifende Richtlinien usw. [Erläuterung PDF](https: // wiki. Es wird in Scratch.mit.edu/w/images/ExtensionsDoc.HTTP-9-11.pdf erwähnt.

abschließend

Die obige Methode kann eine Verbindung zu Scratch 3 sein (ich bin nicht sicher, was mit der Offline-Version von Scratch 3 passiert und wie sie erweitert werden kann), aber mit Python gibt es verschiedene Dinge wie OpenCV, maschinelles Lernen, numerische Berechnung usw. Da die Bibliothek einsatzbereit ist, scheint sie recht frei zu erweitern.

Natürlich kann Node.js auch einen kompakten Server mit ähnlichen asynchronen E / A einrichten. Wenn Sie sich also nicht mit Python-Modulen auskennen, können Sie ihn in JavaScript schreiben. (Ich habe diesen Artikel zusammengefasst)

Wenn Sie die HTTP-Erweiterung in Scratch 3 behalten möchten (und sie derzeit entfernt wird), können Sie auch Scratch 3 ändern.

Recommended Posts

Erstellen Sie einen leichtgewichtigen Server in Python und hören Sie sich die HTTP-Erweiterungen von Scratch 2 an
Einfacher HTTP-Server für Python
Erstellen Sie eine Python-Umgebung und übertragen Sie Daten auf den Server
<Python> Erstellen Sie einen Server für die Datenanalyse mit Jupyter Notebook
Bibliothek zur Angabe eines Nameservers in Python und Dig
Erstellen Sie unter CentOS 7.7 eine Python-Umgebung für Ihren Heimserver
Schreiben Sie einen HTTP / 2-Server in Python
Erstellen und testen Sie eine CI-Umgebung für mehrere Versionen von Python
Holen Sie sich ein Zeichen für Conoha mit Python
Erstellen Sie mit Docker eine CentOS Linux 8-Umgebung und starten Sie Apache HTTP Server
Erstellen Sie schnell eine Python-Umgebung für Deep Learning / Data Science (Windows)
Stellen Sie Docker in Windows Home und führen Sie einen einfachen Webserver mit Python aus
Richten Sie mit Python 3 einen einfachen HTTPS-Server ein
Organisieren Sie Python-Module und -Pakete in einem Chaos
Ich habe eine Klasse in Python3 und Java geschrieben
Richten Sie einen Test-SMTP-Server in Python ein.
Starten Sie einen Webserver mit Python und Flask
Richten Sie einen einfachen SMTP-Server in Python ein
Automatisieren Sie das Entfernen des Hintergrunds für die neuesten Porträts in einem Verzeichnis mit Python und API
Erstellen Sie einen API-Server, um den Betrieb der Front-Implementierung mit Python3 und Flask zu überprüfen
Ursachen und Lösungen, wenn die Erstellung von Python Sam in einer neu erstellten Cloud9-Umgebung fehlschlägt
Ich kann nicht schlafen, bis ich einen Server erstellt habe !! (Einführung in den Python-Server an einem Tag)
Janken Poi in Python für Anfänger (Antworten und Erklärungen)
Erstellen Sie mit Python eine interaktive Umgebung für maschinelles Lernen
Erstellen einer R- und Python Docker-Arbeitsumgebung
Erstellen Sie die Python-Erweiterung E-Cell 4 unter Windows 7 (64 Bit).
Erstellen Sie mit pyenv-virtualenv eine Python-Umgebung für jedes Verzeichnis
Einstellungen für das Spielen von Wave in Python PyAudio und PortAudio
Versuchen Sie, in Python nach einem Profil mit einer Million Zeichen zu suchen
Probleme und Gegenmaßnahmen zum Überlaufen der Binärisierung von Otsu in Python
Erstellen Sie Apache HTTP Server und Wildfly unter Oracle Linux 8
Einfache Einstellungen für HTTP-Server und Systemd-Autostart in Go
Erstellen Sie eine virtuelle Python-Umgebung mit virtualenv und virtualenvwrapper
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
Suchen Sie rekursiv nach Dateien und Verzeichnissen in Python und geben Sie sie aus
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
Proxy für Python-Pip festlegen (beschrieben in pip.ini)
HTTP-Anfrage in Python
Ich suche einen einheitlichen Weg, um auf Statusänderungen von Selenium für Python-Elemente zu warten
Analysieren Sie die Researchmap-API mit Python und erstellen Sie automatisch eine Word-Datei für die Leistungsliste
[Sakura Rental Server] (Für Anfänger) So erstellen Sie eine Umgebung für Python, Pyenv und Flask. Für csh
Listet Methodenargumentinformationen für Klassen und Module in Python auf
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum
So geben Sie das öffentliche Verzeichnis Python Simple HTTP Server an
Erstellen Sie eine Python-Entwicklungsumgebung mit Eclipse (fügen Sie einen HTML-Editor hinzu).
Installationsverfahren für Python und Ansible mit einer bestimmten Version
Eine einfache Möglichkeit, mehrere for-Schleifen in Python zu vermeiden
Tipps zum Codieren kurz und einfach in Python zu lesen
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
Explosive Geschwindigkeit! Verwenden von Python Simple HTTP Server für die Kintone-Entwicklung
Nützliche Tricks in Bezug auf Listen und Anweisungen in Python
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Erstellen Sie die Python-Erweiterung E-Cell 4 unter Mac OS X (Yosemite).
Probleme und Lösungen bei der Frage nach MySQL db in Python 3
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten