Yandex.Fonctions, Sublime Text et compétences pour Alice

Le 27 juin, Yandex a organisé un hackathon en ligne pour développer les compétences d'Alice.



J'ai également décidé d'y participer. J'ai déjà fait des compétences pour Alice, mais je les ai toutes hébergées sur Google App Engine. J'ai immédiatement décidé d'apprendre quelque chose de nouveau dans le cadre du Hackathon. Yandex promeut activement ses fonctions dans Yandex.Cloud pour le développement des compétences. Pour les compétences, ils sont gratuits (bien que tout ne soit pas gratuit).



Et Google App Engine nécessite désormais la connexion d'un compte pour le paiement afin de télécharger l'application sur le serveur.



J'ai décidé d'essayer la compétence dans Yandex.Cloud pour placer. De plus, j'ai décidé que la compétence devait être simple - pour avoir le temps de le faire en une journée dans le Hackathon. Ici, les fonctions dans le cloud sont très appropriées - vous n'avez pas besoin d'accéder à des services tiers (ils sont payés en fonctions), les données peuvent être stockées dans la compétence elle - même , une base de données externe n'est pas nécessaire.



Auparavant, j'ai essayé de faire des compétences utiles - pour payer le stationnement par la voix, par exemple (dans Yandex.Navigator) ou pour savoir quand le bus / trolleybus / tram arrivera à l'arrêt le plus proche. Cela a nécessité des intégrations avec des services tiers, un long développement et Yandex, à en juger par le prix Alice, plus de compétences de jeu et de divertissement à votre goût. Alors cette fois j'ai décidé de faire un jeu.



Pour travailler avec les Fonctions, il est proposé soit de tout faire localement, puis de télécharger les fichiers dans les Fonctions, soit d'éditer les fichiers dans l'éditeur en ligne. J'adore les éditeurs en ligne;), alors j'ai d'abord essayé de l'utiliser. Cependant, après deux ou trois ou quatre modifications et en enregistrant de nouvelles versions, j'ai décidé d'abandonner cette idée - il est très gênant que cliquer sur Enregistrer vous redirige vers un autre écran. Au total, chaque modification est un tas de clics supplémentaires.



C'est un peu plus facile de vivre avec une ligne de commande . Mais les fichiers doivent être ajoutés au zip à chaque fois, et seulement ensuite chargés dans le Cloud. Mains - inconfortables.



Il se trouve que mon IDE est Sublime Text 3. Récemment, Google a abandonné le lanceur Google App Engine et la seule option qui lui reste est de télécharger des fichiers via la ligne de commande. C'est alors que j'ai appris l'existence de systèmes de construction dans Sublime Text - appuyez sur Ctrl / Cmd + B et Sublime exécute la commande dont vous avez besoin. Pour GAE, j'ai ensuite créé un ensemble de commandes , j'ai décidé qu'il fallait quelque chose de similaire ici.



Premièrement, la fonctionnalité a été conçue pour simplement télécharger des fichiers.



Pour GAE, j'ai fait en sorte que les paramètres passés (à savoir, le nom du projet) soient lus à partir du fichier de projet Sublime Text. Pour gagner du temps, le nom de la fonction, le point d'entrée et d'autres paramètres sont simplement codés en dur dans le système de construction. Pas très bon, mais adapté à mes besoins.







Mais si tout est testé sur un serveur de production, les journaux doivent être consultés d'une manière ou d'une autre. Par conséquent, une commande distincte a été ajoutée pour charger et afficher les journaux.



Hélas, si les journaux sont faciles à afficher, il est assez difficile de s'y retrouver.



J'ai dû bricoler un peu avec la commande (pour que les chaînes unicode soient affichées correctement - mais même dans ce cas, cela ne fonctionne pas toujours), avec le code lui-même (pour afficher JSON sous une forme lisible):



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


et créez un fichier de syntaxe distinct pour mettre en évidence les erreurs dans le journal.







Une fonctionnalité pratique distincte - Sublime Text est capable de mettre en évidence la ligne elle-même s'il l'a trouvée dans le code.



Le total est le suivant -



Fichier de construction Yandex Cloud.sublime
// 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)\""
            }
        ]
}




Fichier de syntaxe 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




Il est beaucoup plus agréable de modifier le code de fonction dans Yandex.Cloud.



PS Mon talent est le jeu Devinez la langue .



All Articles