Yandex.Functions、崇高なテキスト、アリスのスキル

6月27日、Yandexはオンラインハッカソン開催し、アリスのスキルを開発しました。



それに参加することも決めました。私はすでにアリスのスキルを習得しましたが、それらすべてをGoogle App Engineでホストしました。すぐに私はハッカソンで何か新しいことを学ぶことにしました。Yandexは、スキル開発のためにYandex.Cloudの機能を積極的に宣伝しています。スキルに関しては、無料です(すべてが無料というわけではありません)。



また、Google App Engineでは、アプリケーションをサーバーにアップロードするために、アカウントを支払い用に接続する必要があります。



Yandex.Cloudのスキルを試してみることにしました。さらに、ハッカソン内で1日でそれを行う時間を持つために、スキルは単純であるべきだと私は決めました。ここではクラウド内の関数が非常に適しています-サードパーティのサービスにアクセスする必要はありません(関数で支払います)。データはスキル自体に保存でき、外部データベースは必要ありません。



以前は、便利なスキルを試してみました。たとえば、(Yandex.Navigatorで)音声で駐車料金を支払うか、バス/トロリーバス/トラムが最寄りの停留所にいつ到着するかを調べました。アリス賞によると、これにはサードパーティのサービス、長い開発、Yandexとの統合が必要でした、あなたの好みに合わせてより多くのゲームとエンターテイメントのスキル。そこで今回はゲームを作ることにしました。



関数を使用するには、すべてをローカルで実行してから、関数にファイルをアップロードするか、オンラインエディターでファイルを編集することをお勧めします。私はオンラインエディターが大好きです;)なので、最初にそれを使ってみました。しかし、2、3、4回編集して新しいバージョンを保存した後、私はこのアイデアを破棄することにしました。[保存]をクリックすると、別の画面にリダイレクトされるので非常に不便です。全体として、各編集は追加のクリックの集まりです。コマンドライン



を使用する方が少し簡単です。ただし、ファイルは毎回zipに追加して、クラウドにロードする必要があります。手-不快。



たまたま私のIDEはSublime Text 3でした。最近、GoogleはGoogle App Engine Launcherを放棄しました。それに残された唯一のオプションは、コマンドラインからファイルをダウンロードすることです。その後、Sublime Text ビルドシステムの存在について学びました-Ctrl / Cmd + Bを押すと、Sublimeが必要なコマンドを実行します。 GAEでは、次に一連のコマンドを作成しましたが、ここでも同様のものが必要だと判断しました。



最初に、ファイルを単にダウンロードする機能が作成されました。



GAEでは、渡されたパラメーター(つまり、プロジェクト名)がSublime Textプロジェクトファイルから読み取られるようにしました。時間を節約するために、関数の名前、エントリポイント、およびその他のパラメーターは、ビルドシステムにハードコード化されています。あまり良くありませんが、私の目的には適しています。







しかし、すべてが本番サーバーでテストされている場合、ログは何とか便利に表示されるはずです。そのため、ログをロードして表示するための別のコマンドが追加されました。



悲しいかな、ログが表示しやすい場合は、ログ内を移動するのは非常に困難です。



(Unicode文字列が正しく表示されるように、ただしそれでも常に機能するとは限りません)コード自体(JSONを読み取り可能な形式で表示するため)を少し変更する必要がありました。



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


そして、ログ内のエラーを強調表示する別の構文ファイル作成します。







別の便利な機能-Sublime Textは、コードで検出された行自体を強調表示できます。



合計は次のとおりです-



Yandex Cloud.sublime-buildファイル
// 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-syntaxファイル
%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




Yandex.CloudでFunctionコードを編集する方がずっと便利です。



PS私のスキルは、ゲームGuess the Languageです。



All Articles