Yandex.Functions, Sublime Text e habilidades para Alice

Em 27 de junho, a Yandex realizou um hackathon on - line para desenvolver habilidades para Alice.



Eu também decidi participar. Já desenvolvi habilidades para Alice, mas hospedei todas elas no Google App Engine. Decidi imediatamente aprender algo novo dentro do Hackathon. A Yandex está promovendo ativamente suas funções no Yandex.Cloud para o desenvolvimento de habilidades. Para as habilidades, elas são gratuitas (embora nem tudo seja gratuito).



E o Google App Engine agora exige que uma conta seja conectada para pagamento, a fim de fazer o upload do aplicativo no servidor.



Eu decidi tentar a habilidade no Yandex.Cloud para colocar. Além disso, eu decidi, a habilidade deve ser simples - para ter tempo para fazê-lo em um dia dentro do Hackathon. Aqui, as funções na nuvem são muito adequadas - você não precisa acessar serviços de terceiros (eles são pagos em funções), os dados podem ser armazenados na própria habilidade , não é necessário um banco de dados externo.



Anteriormente, tentei usar habilidades úteis - pagar estacionamento por voz, por exemplo (no Yandex.Navigator) ou descobrir quando o ônibus / trólebus / bonde chegará à parada mais próxima. Isso exigiu integrações com serviços de terceiros, desenvolvimento longo e Yandex, a julgar pelo prêmio Alice, mais habilidades de jogos e entretenimento ao seu gosto. Então desta vez eu decidi fazer um jogo.



Para trabalhar com as funções, propõe-se fazer tudo localmente e, em seguida, fazer upload dos arquivos nas funções ou editar os arquivos no editor online. Eu amo editores on-line;), então primeiro tentei usá-lo. No entanto, após duas ou três ou quatro edições e salvando novas versões, decidi abandonar essa idéia - é muito inconveniente que clicar em Salvar o redirecione para outra tela. No total, cada edição é um monte de cliques extras.



É um pouco mais fácil viver com uma linha de comando . Mas os arquivos precisam ser adicionados para compactar todas as vezes e somente depois carregados na nuvem. Mãos - desconfortáveis.



Aconteceu que meu IDE é Sublime Text 3. Recentemente, o Google abandonou o Iniciador do Google App Engine e a única opção que resta é baixar arquivos pela linha de comando. Foi então que aprendi sobre a existência de sistemas de construção no Sublime Text - pressione Ctrl / Cmd + B e o Sublime executa o comando que você precisa. Para o GAE, fiz um conjunto de comandos e decidi que algo semelhante era necessário aqui.



Primeiro, a funcionalidade foi feita para simplesmente baixar arquivos.



Para o GAE, eu fiz isso para que os parâmetros passados ​​(ou seja, o nome do projeto) fossem lidos no arquivo de projeto de Texto Sublime. Para economizar tempo, o nome da função, o ponto de entrada e outros parâmetros são apenas codificados no sistema de construção. Não é muito bom, mas adequado para os meus propósitos.







Porém, se tudo for testado em um servidor de produção, os logs deverão ser vistos de alguma forma conveniente. Portanto, um comando separado foi adicionado para carregar e exibir logs.



Infelizmente, se os logs são fáceis de exibir, é muito difícil navegar neles.



Eu tive que mexer um pouco com o comando (para que as strings unicode fossem exibidas corretamente - mas mesmo assim, isso nem sempre funciona), com o próprio código (para exibir o JSON de forma legível):



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


e crie um arquivo de sintaxe separado para destacar erros no log.







Um recurso útil separado - o Sublime Text pode destacar a própria linha, se a encontrar no código.



O total é o seguinte -



Arquivo 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)\""
            }
        ]
}




Arquivo 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




É muito melhor editar o código da função no Yandex.Cloud.



PS Minha habilidade é o jogo Adivinhe a linguagem .



All Articles