Yandex.Alice的功能,崇高文字和技能

6月27日,Yandex举行了在线黑客马拉松,为爱丽丝开发技能。



我也决定参加。我已经完成了Alice的技能培训,但是我将所有技能都托管在了Google App Engine上。我立即决定在Hackathon中学习一些新知识。Yandex正在积极地在Yandex.Cloud中推广其功能以发展技能。对于技能,它们是免费的(尽管并非所有内容都是免费的)。



而且,Google App Engine现在需要连接一个帐户进行支付,才能将应用程序上载到服务器。



我决定尝试在Yandex.Cloud中使用该技能。另外,我认为,这项技能应该很简单-为了有时间在Hackathon中一天完成这项工作。在这里,云中的功能非常适合-您不需要访问第三方服务(它们是在功能中付费的),数据可以存储在技能本身中,而无需外部数据库。



我曾经尝试做一些有用的技能-例如,通过语音支付停车费用(在Yandex.Navigator中),或者找出公交车/无轨电车/电车何时到达最近的车站。根据Alice奖的判断,这需要与第三方服务,长期开发和Yandex集成。,更多游戏和娱乐技能供您选择。所以这次我决定做一个游戏。



要使用这些功能,建议要么在本地进行所有操作,然后在“功能”中上载文件,要么在在线编辑器中编辑文件。我喜欢在线编辑;),所以首先我尝试使用它。但是,经过2或3或4个编辑并保存新版本后,我决定放弃这个想法-单击“保存”将您重定向到另一个屏幕是非常不便的。总体而言,每次修改都是一堆额外的点击。



使用命令行要容易一些。但是,每次都需要将文件添加到zip中,然后才将其加载到Cloud中。手-不舒服。



碰巧我的IDE是Sublime Text3。最近,Google放弃了Google App Engine启动器,唯一剩下的选择就是通过命令行下载文件。那时我了解到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语法文件
%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中编辑功能代码会更好。



PS我的技能是游戏“ 猜语言”



All Articles