También decidí participar en ello. Ya hice habilidades para Alice, pero las alojé todas en Google App Engine. Inmediatamente decidí aprender algo nuevo dentro del Hackathon. Yandex está promoviendo activamente sus funciones en Yandex.Cloud para el desarrollo de habilidades. Por habilidades, son gratuitas (aunque no todo es gratis).
Y Google App Engine ahora requiere que se conecte una cuenta para el pago con el fin de cargar la aplicación en el servidor.
Decidí probar la habilidad en Yandex.Cloud para colocar. Además, decidí que la habilidad debería ser simple, para tener tiempo para hacerlo en un día dentro del Hackathon. Aquí las funciones en la nube son muy adecuadas: no necesita acceder a servicios de terceros (se pagan en funciones), los datos se pueden almacenar en la habilidad en sí , no se necesita una base de datos externa.
Solía intentar hacer habilidades útiles: pagar el estacionamiento por voz, por ejemplo (en Yandex.Navigator) o averiguar cuándo llegaría el autobús / trolebús / tranvía a la parada más cercana. Esto requería integraciones con servicios de terceros, desarrollo prolongado y Yandex, a juzgar por el premio Alice, más habilidades de juego y entretenimiento a tu gusto. Así que esta vez decidí hacer un juego.
Para trabajar con las funciones, se propone hacer todo localmente y luego cargar los archivos en las funciones, o editar los archivos en el editor en línea. Me encantan los editores en línea;), así que primero intenté usarlo. Sin embargo, después de dos o tres o cuatro ediciones y guardar nuevas versiones, decidí abandonar esta idea; es muy inconveniente que al hacer clic en Guardar lo redirija a otra pantalla. En total, cada edición es un montón de clics adicionales.
Es un poco más fácil vivir con una línea de comando . Pero los archivos deben agregarse a zip cada vez, y solo luego cargarse en la nube. Manos incómodas.
Dio la casualidad de que mi IDE es Sublime Text 3. Recientemente Google abandonó el Google App Engine Launcher y la única opción que queda es descargar archivos a través de la línea de comandos. Fue entonces cuando me enteré de la existencia de sistemas de compilación en Sublime Text: presione Ctrl / Cmd + B y Sublime ejecuta el comando que necesita. Para GAE, luego hice un conjunto de comandos , decidí que se necesitaba algo similar aquí.
Primero, se creó la funcionalidad para simplemente descargar archivos.
Para GAE, lo hice para que los parámetros pasados (es decir, el nombre del proyecto) se leyeran desde el archivo del proyecto Sublime Text. Para ahorrar tiempo, el nombre de la función, el punto de entrada y otros parámetros simplemente están codificados en el sistema de compilación. No muy bueno, pero adecuado para mis propósitos.
Pero si todo se prueba en un servidor de producción, entonces los registros deben verse de alguna manera convenientemente. Por lo tanto, se agregó un comando separado para cargar y mostrar registros.
Por desgracia, si los registros son fáciles de mostrar, entonces es bastante difícil navegar en ellos.
Tuve que jugar un poco con el comando (para que las cadenas unicode se mostraran correctamente, pero incluso así, esto no siempre funciona), con el código en sí (para mostrar JSON en una forma legible):
logging.getLogger().setLevel(logging.DEBUG)
logging.debug('REQUEST: ')
for line in json.dumps(event['request'], indent=4).split('\n'):
logging.debug(line)
y cree un archivo de sintaxis separado para resaltar los errores en el registro.
Una característica útil separada: Sublime Text puede resaltar la línea en sí misma si la encuentra en el código.
El total es el siguiente:
Yandex Cloud.sublime-build file
// 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)\""
}
]
}
Archivo 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
Es mucho mejor editar el código de función en Yandex.Cloud.
PD: Mi habilidad es el juego Guess the Language .