Yandex.Functions ، نص رفيع ومهارات لأليس

في 27 يونيو ، عقدت Yandex هاكاثون عبر الإنترنت لتطوير المهارات لأليس.



كما قررت المشاركة فيها. لقد قمت بالفعل بمهارات لـ Alice ، لكنني استضفتهم جميعًا على Google App Engine. قررت على الفور تعلم شيء جديد داخل الهاكاثون. تعمل Yandex بنشاط على تعزيز وظائفها في Yandex.Cloud لتطوير المهارات. بالنسبة للمهارات ، فهي مجانية (على الرغم من أن كل شيء ليس مجانيًا).



ويتطلب محرك تطبيقات Google الآن ربط حساب للدفع من أجل تحميل التطبيق على الخادم.



قررت أن أجرب المهارة في Yandex. بالإضافة إلى ذلك ، قررت أن المهارة يجب أن تكون بسيطة - من أجل الحصول على الوقت للقيام بذلك في يوم واحد داخل الهاكاثون. هنا تعتبر الوظائف في السحابة مناسبة جدًا - لا تحتاج إلى الوصول إلى خدمات الطرف الثالث (يتم الدفع مقابلها في الوظائف) ، ويمكن تخزين البيانات في المهارة نفسها ، ولا حاجة إلى قاعدة بيانات خارجية.



في السابق ، حاولت القيام بمهارات مفيدة - لدفع ثمن وقوف السيارات عن طريق الصوت ، على سبيل المثال (في Yandex.Navigator) أو لمعرفة موعد وصول الحافلة / الحافلة / الترام إلى أقرب محطة. يتطلب هذا عمليات تكامل مع خدمات الجهات الخارجية ، والتطوير الطويل ، و Yandex ، بناءً على جائزة Alice، والمزيد من الألعاب ومهارات الترفيه ترضيك. لذا هذه المرة قررت أن أصنع لعبة.



للعمل مع الوظائف ، يُقترح القيام بكل شيء محليًا ، ثم تحميل الملفات في الوظائف ، أو تحرير الملفات في المحرر عبر الإنترنت. أنا أحب المحررين عبر الإنترنت ؛) ، لذا حاولت أولاً استخدامه. ومع ذلك ، بعد تحريرين أو ثلاثة أو أربعة وحفظ نسخ جديدة ، قررت التخلي عن هذه الفكرة - من غير المريح جدًا أن يؤدي النقر فوق حفظ إلى إعادة توجيهك إلى شاشة أخرى. في المجموع ، يعد كل تعديل مجموعة من النقرات الإضافية.



من الأسهل قليلاً العيش مع سطر الأوامر . ولكن يجب إضافة الملفات إلى ملف zip في كل مرة ، ثم تحميلها فقط في السحابة. اليدين - غير مريح.



حدث ذلك أن IDE الخاص بي هو Sublime Text 3. تخلى Google مؤخرًا عن Google App Engine Launcher والخيار الوحيد المتبقي معه هو تنزيل الملفات عبر سطر الأوامر. عندها علمت بوجود أنظمة بناء في نص Sublime - اضغط على 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
// 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