Yandex.Funktionen, erhabener Text und Fähigkeiten für Alice

Am 27. Juni veranstaltete Yandex einen Online-Hackathon , um Fähigkeiten für Alice zu entwickeln.



Ich habe mich auch entschlossen, daran teilzunehmen. Ich habe bereits Fähigkeiten für Alice entwickelt, aber ich habe sie alle in Google App Engine gehostet. Sofort beschloss ich, beim Hackathon etwas Neues zu lernen. Yandex fördert aktiv seine Funktionen in Yandex.Cloud für die Entwicklung von Fähigkeiten. Für Fähigkeiten sind sie kostenlos (obwohl nicht alles kostenlos ist).



Für Google App Engine muss jetzt ein Konto zur Zahlung verbunden sein, damit die Anwendung auf den Server hochgeladen werden kann.



Ich beschloss, die Fähigkeit in Yandex.Cloud zu versuchen, um zu platzieren. Außerdem habe ich beschlossen, dass die Fertigkeit einfach sein sollte - um an einem Tag innerhalb des Hackathons Zeit dafür zu haben. Hier sind Funktionen in der Cloud sehr gut geeignet - Sie müssen nicht auf Dienste von Drittanbietern zugreifen (sie werden in Funktionen bezahlt), Daten können in der Fähigkeit selbst gespeichert werden , eine externe Datenbank wird nicht benötigt.



Zuvor habe ich versucht, nützliche Fähigkeiten zu erwerben - zum Beispiel das Parken per Spracheingabe (in Yandex.Navigator) oder um herauszufinden, wann der Bus / Trolleybus / die Straßenbahn an der nächsten Haltestelle ankommen wird. Dies erforderte Integrationen mit Diensten von Drittanbietern, langjähriger Entwicklung und Yandex, gemessen am Alice Award, mehr Spiel- und Unterhaltungsfähigkeiten nach Ihren Wünschen. Also habe ich mich dieses Mal entschlossen, ein Spiel zu machen.



Um mit den Funktionen arbeiten zu können, wird empfohlen, entweder alles lokal auszuführen und dann die Dateien in den Funktionen hochzuladen oder die Dateien im Online-Editor zu bearbeiten. Ich liebe Online-Editoren;), also habe ich zuerst versucht, es zu benutzen. Nach zwei, drei oder vier Änderungen und dem Speichern neuer Versionen habe ich mich jedoch entschlossen, diese Idee aufzugeben. Es ist sehr unpraktisch, dass Sie durch Klicken auf Speichern zu einem anderen Bildschirm weitergeleitet werden. Insgesamt ist jede Bearbeitung eine Reihe von zusätzlichen Klicks.



Es ist etwas einfacher, mit einer Kommandozeile zu leben. Die Dateien müssen jedoch jedes Mal zum Zip hinzugefügt und erst dann in die Cloud geladen werden. Hände - unangenehm.



Es ist einfach so passiert, dass meine IDE Sublime Text 3 ist. Vor kurzem hat Google den Google App Engine Launcher aufgegeben und die einzige verbleibende Option ist das Herunterladen von Dateien über die Befehlszeile. Zu diesem Zeitpunkt erfuhr ich von der Existenz von Build-Systemen in Sublime Text. Drücken Sie Strg / Befehlstaste + B, und Sublime führt den gewünschten Befehl aus. Für GAE habe ich dann eine Reihe von Befehlen erstellt und festgestellt, dass hier etwas Ähnliches benötigt wird.



Zunächst wurde die Funktionalität zum einfachen Herunterladen von Dateien entwickelt.



Für GAE habe ich es so gemacht, dass die übergebenen Parameter (nämlich der Projektname) aus der Sublime Text-Projektdatei gelesen wurden. Um Zeit zu sparen, werden der Name der Funktion, der Einstiegspunkt und andere Parameter nur im Build-System fest codiert. Nicht sehr gut, aber für meine Zwecke geeignet.







Wenn jedoch alles auf einem Produktionsserver getestet wird, sollten die Protokolle irgendwie bequem angezeigt werden. Daher wurde ein separater Befehl zum Laden und Anzeigen von Protokollen hinzugefügt.



Wenn die Protokolle einfach anzuzeigen sind, ist es leider ziemlich schwierig, sie zu navigieren.



Ich musste ein wenig an dem Befehl basteln (damit Unicode-Zeichenfolgen korrekt angezeigt wurden - aber selbst dann funktioniert dies nicht immer), mit dem Code selbst (um JSON in lesbarer Form anzuzeigen):



    logging.getLogger().setLevel(logging.DEBUG)
    logging.debug('REQUEST: ')
    for line in json.dumps(event['request'], indent=4).split('\n'):
        logging.debug(line)


und erstellen Sie eine separate Syntaxdatei , um Fehler im Protokoll hervorzuheben.







Eine separate praktische Funktion - Sublime Text kann die Zeile selbst hervorheben, wenn sie im Code gefunden wurde.



Die Summe ist die folgende -



Yandex Cloud.sublime-Build-Datei
// Install Yandex CLI - https://cloud.yandex.ru/docs/cli/quickstart#install
//
// http://www.sublimetext.com/docs/3/build_systems.html
// https://cloud.yandex.ru/docs/functions/operations/function/version-manage#version-create
{
    "file_patterns": ["*.py"],
    "syntax": "Packages/User/YCLog.sublime-syntax",
    "file_regex": "File \\\"/function/code/(...*?)\\\", line ([0-9]*)", 
    "variants":
        [
            {
                "name": "Upload",
                "shell_cmd": "zip -u -0 yc_upload.zip *.py && yc serverless function version create --function-name=my-function-name --runtime=python27 --entrypoint=main.handler --memory=128m --execution-timeout=2s --source-path=yc_upload.zip",
            },
            {
                "name": "Logs",
                "shell_cmd": "printf '%b\n' \"\\$(yc serverless function logs alice-guess-the-language)\""
            }
        ]
}




YCLog.sublime-Syntaxdatei
%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
name: YC Log
file_extensions: [log]
scope: source.example-c
contexts:
  main:
    # Request identifiers
    - match: '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} (START|END|REPORT) RequestID: .*'
      scope: storage.type.string.c

    # Dates
    - match: '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
      scope: comment.line.c

    - match: '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{2,3}Z    [0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}'
      scope: comment.line.c

    # Log level
    - match: '\[(INFO|DEBUG)\]'
      scope: comment.line.example-c

    # Log level
    - match: '\[(ERROR|WARNING)\]'
      scope: keyword.control.flow.break.c


    # Strings begin and end with quotes, and use backslashes as an escape
    # character
    - match: '"'
      scope: punctuation.definition.string.begin.c
      push: double_quoted_string


  double_quoted_string:
    - meta_scope: string.quoted.double.example-c
    - match: '\\.'
      scope: constant.character.escape.example-c
    - match: '"'
      scope: punctuation.definition.string.end.example-c
      pop: true




Es ist viel schöner, den Funktionscode in Yandex.Cloud zu bearbeiten.



PS Meine Fähigkeit ist das Spiel Guess the Language .



All Articles