كتاب "البراغماتية لمنظمة العفو الدولية. تعلم الآلة والتكنولوجيا السحابية

الصورة مرحبا ، habrozhiteli! كتاب نوح للهدايا هذا مخصص لأي شخص مهتم بالذكاء الاصطناعي والتعلم الآلي والحوسبة السحابية وأي مزيج من مواضيع البيانات. سيجد كل من المبرمجين والتقنيين الذين يهتمون بكل بساطة معلومات مفيدة هنا. وترد أمثلة التعليمات البرمجية في بيثون. ويغطي الكثير من الموضوعات المتقدمة مثل استخدام الأنظمة الأساسية السحابية (على سبيل المثال ، AWS و GCP و Azure) ، بالإضافة إلى تقنيات التعلم الآلي وتطبيق الذكاء الاصطناعي. سيجد Jedi الذي يجيد لغة Python والحوسبة السحابية و ML أيضًا العديد من الأفكار المفيدة لأنفسهم الذين يمكنهم التقديم الفوري في أعمالهم الحالية.

نحن ندعوك لقراءة مقتطف من كتاب "إنشاء بوت سلاك ذكي في AWS"

لطالما حلم الناس بخلق "حياة مصطنعة". في معظم الأحيان ، في حين أن هذا ممكن عن طريق إنشاء روبوتات. أصبحت الروبوتات جزءًا لا يتجزأ بشكل متزايد من حياتنا اليومية ، وخاصة منذ ظهور سيري من أبل وأليكسا من أمازون. في هذا الفصل ، سنكشف عن أسرار إنشاء برامج الروبوت.

بوت خلق


لإنشاء برنامج الروبوت ، سوف نستخدم مكتبة سلاك للغة بيثون (https://github.com/slackapi/python-slackclient). لبدء استخدام Slack ، تحتاج إلى إنشاء رمز تعريف مميز. بشكل عام ، يكون من المنطقي عند العمل مع هذه العلامات لتصدير متغير البيئة. غالبًا ما أقوم بذلك في virtualenv ، وبالتالي يمكنني الوصول إليه تلقائيًا عند تنفيذه في البيئة الحالية. للقيام بذلك ، تحتاج إلى "كسر" الأداة المساعدة virtualenv قليلاً عن طريق تحرير البرنامج النصي للتنشيط.

عند تصدير متغير Slack في البرنامج النصي ~ / .env / bin / activate ، سيبدو كما يلي.

وللحصول على المعلومات فقط ، إذا كنت ترغب في مواكبة أحدث الابتكارات ، فمن المستحسن استخدام الأداة Python الرسمية الجديدة لإدارة البيئة - pipenv (https://github.com/pypa/pipenv):

_OLD_VIRTUAL_PATH="$PATH" PATH="$VIRTUAL_ENV/bin:$PATH" export PATH SLACK_API_TOKEN=<Your Token Here> export SLACK_API_TOKEN 

من المريح استخدام الأمر printenv لأنظمة التشغيل OS X و Linux للتحقق مما إذا كان قد تم تعيين متغير البيئة. بعد ذلك ، يمكنك استخدام البرنامج النصي القصير التالي للتحقق من إرسال رسالة:

 import os from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) sc.api_call( "chat.postMessage", channel="#general", text="Hello from my bot! :tada:" ) 

تجدر الإشارة أيضًا إلى أن أداة pipenv هي الحل الموصى به الذي يجمع بين إمكانات أدوات pip و virtualenv في مكون واحد. لقد أصبح معيارًا جديدًا ، لذلك فمن المنطقي أن ننظر إليه من منظور إدارة الحزمة.

تحويل المكتبة إلى أداة سطر الأوامر


كما هو الحال مع الأمثلة الأخرى في هذا الكتاب ، من الجيد تحويل الشفرة الخاصة بنا إلى أداة مساعدة لسطر الأوامر لتسهيل اختبار الأفكار الجديدة. تجدر الإشارة إلى أن العديد من المطورين المبتدئين يفضلون غالبًا أدوات سطر الأوامر ، لكن الحلول الأخرى ، على سبيل المثال ، يعملون ببساطة في دفاتر جوبيتر. سوف ألعب لفترة قصيرة دور محامي الشيطان وسأطرح سؤالاً قد يكون لدى القراء: "لماذا نحتاج إلى أدوات مساعدة لسطر الأوامر في مشروع يعتمد على دفاتر جوبيتر؟ أليس الهدف من دفاتر المشترى هو جعل سطر الأوامر وسطر الأوامر غير ضروريين؟ " تعد إضافة أداة مساعدة لسطر الأوامر إلى مشروع جيدة لأنها تتيح لك تجربة خيارات الإدخال المختلفة بسرعة. لا تقبل كتل كود دفتر Jupiter المدخلات ؛ بمعنى أن هذه البرامج النصية تحتوي على بيانات سلكية صلبة.

لا توجد العديد من الأدوات المساعدة لسطر الأوامر على كل من منصات GCP و AWS بالصدفة: فهي توفر المرونة والميزات غير المتوفرة على الواجهات الرسومية. تسمى مجموعة رائعة من المقالات حول هذا الموضوع من قبل كاتب الخيال العلمي نيل ستيفنسون "في البداية ... كان هناك سطر الأوامر". يقول Stevenson في ذلك: "تستلزم واجهة المستخدم الرسومية حملًا إضافيًا كبيرًا لكل مكون ، حتى أصغر البرامج ، الذي يغير بيئة البرمجة تمامًا." أنهى المجموعة بالكلمات: "... الحياة شيء صعب وصعب للغاية ؛ لا واجهة سيغير ذلك ؛ وأي شخص يعتقد خلاف ذلك هو بساطة ... "صعبة بما فيه الكفاية ، ولكن تجربتي تشير إلى أنه صحيح بما فيه الكفاية. الحياة مع سطر الأوامر تتحسن. جربه ولن ترغب في العودة إلى واجهة المستخدم الرسومية.

للقيام بذلك ، سوف نستخدم حزمة النقرات ، كما هو موضح أدناه. إرسال الرسائل باستخدام الواجهة الجديدة بسيط للغاية.

 ./clibot.py send --message "from cli" sending message from cli to #general 

يوضح الشكل 7.1 القيم الافتراضية وكذلك الرسالة المخصصة من أداة cli.

 #!/usr/bin/env python import os import click from slackclient import SlackClient SLACK_TOKEN = os.environ["SLACK_API_TOKEN"] def send_message(channel="#general", message="Hello from my bot!"): """   """ slack_client = SlackClient(SLACK_TOKEN) res = slack_client.api_call( "chat.postMessage", channel=channel, text=message ) return res @click.group() @click.version_option("0.1") def cli(): """      """ @cli.command("send") @click.option("--message", default="Hello from my bot!", help="text of message") @click.option("--channel", default="#general", help="general channel") def send(channel, message): click.echo(f"sending message {message} to {channel}") send_message(channel, message=message) if __name__ == '__main__': cli() 

الصورة

نأخذ الروبوت إلى مستوى جديد باستخدام خدمة وظائف AWS Step


بعد إنشاء قنوات اتصال لإرسال الرسائل إلى Slack ، يمكنك تحسين التعليمات البرمجية الخاصة بنا ، وهي: تشغيلها وفق جدول زمني واستخدامها في أي إجراءات مفيدة. خدمة وظائف AWS Step هي خدمة رائعة لهذا الغرض. في القسم التالي ، سوف يتعلم برنامج الروبوت الخاص بنا Slack إلغاء الصفحات الرياضية لـ Yahoo! لاعبي NBA ، واستعادة مكان ميلادهم ، ثم إرسال هذه البيانات إلى سلاك.

يوضح الشكل 7.2 وظيفة خطوة بخطوة جاهزة في العمل. تتمثل الخطوة الأولى في استخراج عناوين URL لملف تعريف لاعب NBA ، والثاني هو استخدام مكتبة حساء جميل للعثور على مسقط رأس كل لاعب. عند الانتهاء من وظيفة خطوة بخطوة ، سيتم إرسال النتائج مرة أخرى إلى سلاك.

الصورة

يمكن استخدام AWS Lambda و Chalice لتنسيق الأجزاء الفردية للعمل ضمن وظيفة خطوة. يسمح Lambda (https://aws.amazon.com/lambda/) للمستخدم بأداء وظائف في AWS ، ويتيح لك إطار عمل Chalice (http://chalice.readthedocs.io/en/latest/) إنشاء تطبيقات بدون خادم في Python. فيما يلي بعض المتطلبات الأساسية:

  • يجب أن يكون لدى المستخدم حساب AWS.
  • يحتاج المستخدم إلى بيانات اعتماد لاستخدام API ؛
  • يجب أن يكون لدور Lambda (الذي أنشأته Chalice) سياسة ذات الامتيازات اللازمة لاستدعاء خدمات AWS المقابلة ، مثل S3.

تكوين بيانات اعتماد IAM


يمكن الاطلاع على التعليمات التفصيلية لإعداد بيانات اعتماد AWS على boto3.readthedocs.io/en/latest/guide/configuration.html . يمكن العثور هنا على معلومات حول تصدير متغيرات AWS على أنظمة تشغيل Windows و Linux. هناك العديد من الطرق لتكوين بيانات الاعتماد ، ولكن يمكن لمستخدمي virtualenv وضع بيانات اعتماد AWS في بيئة افتراضية محلية في البرنامج النصي / bin / activate:

 #  AWS AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=xxxxxxxx AWS_SESSION_TOKEN=xxxxxxxx 


 #  export AWS_DEFAULT_REGION export AWS_ACCESS_KEY_ID export AWS_DEFAULT_REGION 

العمل مع الكأس. يحتوي Chalice على أداة مساعدة لسطر الأوامر مع توفر العديد من الأوامر:

 Usage: chalice [OPTIONS] COMMAND [ARGS]... Options: --version Show the version and exit. --project-dir TEXT The project directory. Defaults to CWD --debug / --no-debug Print debug logs to stderr. --help Show this message and exit. Commands: delete deploy gen-policy generate-pipeline Generate a cloudformation template for a... generate-sdk local logs new-project package url 

يمكن استبدال الكود الموجود داخل قالب app.py بوظائف خدمة Lambda. AWS Chalice مناسب لأنه يتيح ، بالإضافة إلى خدمات الويب ، وظائف Lambda "مستقلة". بفضل هذه الوظيفة ، يمكنك إنشاء العديد من وظائف Lambda ، وربطها بوظيفة خطوة بخطوة ، والجمع بينها مثل مكعبات Lego.

على سبيل المثال ، يمكنك بسهولة إنشاء دالة Lambda مجدولة تؤدي أي إجراء:

 @app.schedule(Rate(1, unit=Rate.MINUTES)) def every_minute(event): """,    """ #   Slack 

لإقامة تفاعل مع bot للتجريد عبر الويب ، تحتاج إلى إنشاء عدة وظائف. في بداية الملف يتم الاستيراد ويتم الإعلان عن عدد من المتغيرات:

 import logging import csv from io import StringIO import boto3 from bs4 import BeautifulSoup import requests from chalice import (Chalice, Rate) APP_NAME = 'scrape-yahoo' app = Chalice(app_name=APP_NAME) app.log.setLevel(logging.DEBUG) 

قد يحتاج الروبوت إلى تخزين بعض البيانات في S3. تستخدم الوظيفة التالية Boto لحفظ النتائج في ملف CSV:

 def create_s3_file(data, name="birthplaces.csv"): csv_buffer = StringIO() app.log.info(f"Creating file with {data} for name") writer = csv.writer(csv_buffer) for key, value in data.items(): writer.writerow([key,value]) s3 = boto3.resource('s3') res = s3.Bucket('aiwebscraping').\ put_object(Key=name, Body=csv_buffer.getvalue()) return res 

تستخدم دالة fetch_page مكتبة Beautiful Soup لتحليل صفحة HTML موجودة وفقًا لعنوان URL لإحصائيات الدوري الاميركي للمحترفين وإرجاع كائن الحساء:

 def fetch_page(url="https://sports.yahoo.com/nba/stats/"): """ URL Yahoo""" #       #  Beautiful Soup app.log.info(f"Fetching urls from {url}") res = requests.get(url) soup = BeautifulSoup(res.content, 'html.parser') return soup 

تحصل وظائف get_player_links و fetch_player_urls على روابط لعناوين URL لملف تعريف اللاعب:

 def get_player_links(soup): """   URL    URL     'a'       'nba/players' """ nba_player_urls = [] for link in soup.find_all('a'): link_url = link.get('href') #  if link_url: if "nba/players" in link_url: print(link_url) nba_player_urls.append(link_url) return nba_player_urls def fetch_player_urls(): """ URL """ soup = fetch_page() urls = get_player_links(soup) return urls 

بعد ذلك ، في وظيفة find_birthplaces ، نستخلص مواضع اللاعبين من عناوين URL الموجودة على هذه الصفحات:

 def find_birthplaces(urls): """       NBA  Yahoo""" birthplaces = {} for url in urls: profile = requests.get(url) profile_url = BeautifulSoup(profile.content, 'html.parser') lines = profile_url.text res2 = lines.split(",") key_line = [] for line in res2: if "Birth" in line: #print(line) key_line.append(line) try: birth_place = key_line[0].split(":")[-1].strip() app.log.info(f"birth_place: {birth_place}") except IndexError: app.log.info(f"skipping {url}") continue birthplaces[url] = birth_place app.log.info(birth_place) return birthplaces 

الآن سوف ننتقل إلى وظائف الكأس. يرجى ملاحظة: بالنسبة لإطار عمل الكأس ، يجب إنشاء المسار الافتراضي:

 #     HTTP- @app.route('/') def index(): """ URL""" app.log.info(f"/ Route: for {APP_NAME}") return {'app_name': APP_NAME} 

وظيفة Lambda التالية هي طريق يربط عنوان URL HTTP بوظيفة مكتوبة مسبقًا:

 @app.route('/player_urls') def player_urls(): """ URL """ app.log.info(f"/player_urls Route: for {APP_NAME}") urls = fetch_player_urls() return {"nba_player_urls": urls} 

وظائف Lambda التالية مستقلة ، ويمكن استدعاؤها داخل وظيفة خطوة بخطوة:

 #   Lambda @app.lambda_function() def return_player_urls(event, context): """  Lambda,  URL """ app.log.info(f"standalone lambda 'return_players_urls'\ {APP_NAME} with {event} and {context}") urls = fetch_player_urls() return {"urls": urls} #   Lambda @app.lambda_function() def birthplace_from_urls(event, context): """   """ app.log.info(f"standalone lambda 'birthplace_from_urls'\ {APP_NAME} with {event} and {context}") payload = event["urls"] birthplaces = find_birthplaces(payload) return birthplaces #   Lambda @app.lambda_function() def create_s3_file_from_json(event, context): """  S3      JSON""" app.log.info(f"Creating s3 file with event data {event}\ and context {context}") print(type(event)) res = create_s3_file(data=event) app.log.info(f"response of putting file: {res}") return True 

إذا قمت بتشغيل تطبيق Chalice الناتج محليًا ، فسيتم عرض النتائج التالية:

 → scrape-yahoo git:(master)  chalice local Serving on 127.0.0.1:8000 scrape-yahoo - INFO - / Route: for scrape-yahoo 127.0.0.1 - - [12/Dec/2017 03:25:42] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [12/Dec/2017 03:25:42] "GET /favicon.ico" scrape-yahoo - INFO - / Route: for scrape-yahoo 127.0.0.1 - - [12/Dec/2017 03:25:45] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [12/Dec/2017 03:25:45] "GET /favicon.ico" scrape-yahoo - INFO - /player_urls Route: for scrape-yahoo scrape-yahoo - INFO - https://sports.yahoo.com/nba/stats/ https://sports.yahoo.com/nba/players/4563/ https://sports.yahoo.com/nba/players/5185/ https://sports.yahoo.com/nba/players/3704/ https://sports.yahoo.com/nba/players/5012/ https://sports.yahoo.com/nba/players/4612/ https://sports.yahoo.com/nba/players/5015/ https://sports.yahoo.com/nba/players/4497/ https://sports.yahoo.com/nba/players/4720/ https://sports.yahoo.com/nba/players/3818/ https://sports.yahoo.com/nba/players/5432/ https://sports.yahoo.com/nba/players/5471/ https://sports.yahoo.com/nba/players/4244/ https://sports.yahoo.com/nba/players/5464/ https://sports.yahoo.com/nba/players/5294/ https://sports.yahoo.com/nba/players/5336/ https://sports.yahoo.com/nba/players/4390/ https://sports.yahoo.com/nba/players/4563/ https://sports.yahoo.com/nba/players/3704/ https://sports.yahoo.com/nba/players/5600/ https://sports.yahoo.com/nba/players/4624/ 127.0.0.1 - - [12/Dec/2017 03:25:53] "GET /player_urls" 127.0.0.1 - - [12/Dec/2017 03:25:53] "GET /favicon.ico" 

لنشر التطبيق ، قم بتشغيل الأمر chalice publish:

 → scrape-yahoo git:(master)  chalice deploy Creating role: scrape-yahoo-dev Creating deployment package. Creating lambda function: scrape-yahoo-dev Initiating first time deployment. Deploying to API Gateway stage: api https://bt98uzs1cc.execute-api.us-east-1.amazonaws.com/api/ 

بفضل واجهة سطر الأوامر لـ HTTP (https://github.com/jakubroztocil/httpie) نحن نسمي مسار HTTP من AWS ونستخرج الروابط المتاحة في / api / player_urls:

 → scrape-yahoo git:(master)  http \ https://<a lambda route>.amazonaws.com/api/player_urls HTTP/1.1 200 OK Connection: keep-alive Content-Length: 941 Content-Type: application/json Date: Tue, 12 Dec 2017 11:48:41 GMT Via: 1.1 ba90f9bd20de9ac04075a8309c165ab1.cloudfront.net (CloudFront) X-Amz-Cf-Id: ViZswjo4UeHYwrc9e-5vMVTDhV_Ic0dhVIG0BrDdtYqd5KWcAuZKKQ== X-Amzn-Trace-Id: sampled=0;root=1-5a2fc217-07cc12d50a4d38a59a688f5c X-Cache: Miss from cloudfront x-amzn-RequestId: 64f24fcd-df32-11e7-a81a-2b511652b4f6 { "nba_player_urls": [ "https://sports.yahoo.com/nba/players/4563/", "https://sports.yahoo.com/nba/players/5185/", "https://sports.yahoo.com/nba/players/3704/", "https://sports.yahoo.com/nba/players/5012/", "https://sports.yahoo.com/nba/players/4612/", "https://sports.yahoo.com/nba/players/5015/", "https://sports.yahoo.com/nba/players/4497/", "https://sports.yahoo.com/nba/players/4720/", "https://sports.yahoo.com/nba/players/3818/", "https://sports.yahoo.com/nba/players/5432/", "https://sports.yahoo.com/nba/players/5471/", "https://sports.yahoo.com/nba/players/4244/", "https://sports.yahoo.com/nba/players/5464/", "https://sports.yahoo.com/nba/players/5294/", "https://sports.yahoo.com/nba/players/5336/", "https://sports.yahoo.com/nba/players/4390/", "https://sports.yahoo.com/nba/players/4563/", "https://sports.yahoo.com/nba/players/3704/", "https://sports.yahoo.com/nba/players/5600/", "https://sports.yahoo.com/nba/players/4624/" ] } 

هناك طريقة أخرى ملائمة للعمل مع وظائف Lambda وهي الاتصال بهم مباشرة باستخدام حزمة النقرات ومكتبة Python Boto.

يمكننا إنشاء أداة مساعدة لسطر الأوامر جديدة تسمى wscli.py (اختصار لواجهة سطر الأوامر لإلغاء الويب - "واجهة سطر الأوامر لإلغاء الويب"). في الجزء الأول من التعليمات البرمجية ، نقوم بتكوين تسجيل واستيراد المكتبات:

 #!/usr/bin/env python import logging import json import boto3 import click from pythonjsonlogger import jsonlogger #  log = logging.getLogger(__name__) log.setLevel(logging.INFO) LOGHANDLER = logging.StreamHandler() FORMMATTER = jsonlogger.JsonFormatter() LOGHANDLER.setFormatter(FORMMATTER) log.addHandler(LOGHANDLER) 

تم تصميم الوظائف الثلاث التالية للاتصال بوظيفة Lambda من خلال invoke_lambda:

 ### API Boto Lambda def lambda_connection(region_name="us-east-1"): """   Lambda""" lambda_conn = boto3.client("lambda", region_name=region_name) extra_msg = {"region_name": region_name, "aws_service": "lambda"} log.info("instantiate lambda client", extra=extra_msg) return lambda_conn def parse_lambda_result(response): """     Boto   JSON""" body = response['Payload'] json_result = body.read() lambda_return_value = json.loads(json_result) return lambda_return_value def invoke_lambda(func_name, lambda_conn, payload=None, invocation_type="RequestResponse"): """  Lambda""" extra_msg = {"function_name": func_name, "aws_service": "lambda", "payload":payload} log.info("Calling lambda function", extra=extra_msg) if not payload: payload = json.dumps({"payload":"None"}) response = lambda_conn.invoke(FunctionName=func_name, InvocationType=invocation_type, Payload=payload ) log.info(response, extra=extra_msg) lambda_return_value = parse_lambda_result(response) return lambda_return_value 

نحن نلف دالة invoke_lambda بحزمة Python لإنشاء أدوات مساعدة لسطر الأوامر Click. يرجى ملاحظة أننا قمنا بتعيين القيمة الافتراضية لخيار --func ، والذي يستخدم وظيفة Lambda التي قمنا بنشرها مسبقًا:

 @click.group() @click.version_option("1.0") def cli(): """     -""" @cli.command("lambda") @click.option("--func", default="scrape-yahoo-dev-return_player_urls", help="name of execution") @click.option("--payload", default='{"cli":"invoke"}', help="name of payload") def call_lambda(func, payload): """  Lambda ./wscli.py lambda """ click.echo(click.style("Lambda Function invoked from cli:", bg='blue', fg='white')) conn = lambda_connection() lambda_return_value = invoke_lambda(func_name=func, lambda_conn=conn, payload=payload) formatted_json = json.dumps(lambda_return_value, sort_keys=True, indent=4) click.echo(click.style( "Lambda Return Value Below:", bg='blue', fg='white')) click.echo(click.style(formatted_json,fg="red")) if __name__ == "__main__": cli() 

تتشابه النتائج التي تظهرها هذه الأداة مع استدعاء واجهة HTTP:

 → X ./wscli.py lambda \ --func=scrape-yahoo-dev-birthplace_from_urls\ --payload '{"url":["https://sports.yahoo.com/nba/players/4624/",\ "https://sports.yahoo.com/nba/players/5185/"]}' Lambda Function invoked from cli: {"message": "instantiate lambda client", "region_name": "us-east-1", "aws_service": "lambda"} {"message": "Calling lambda function", "function_name": "scrape-yahoo-dev-birthplace_from_urls", "aws_service": "lambda", "payload": "{\"url\":[\"https://sports.yahoo.com/nba/players/4624/\", \"https://sports.yahoo.com/nba/players/5185/\"]}"} {"message": null, "ResponseMetadata": {"RequestId": "a6049115-df59-11e7-935d-bb1de9c0649d", "HTTPStatusCode": 200, "HTTPHeaders": {"date": "Tue, 12 Dec 2017 16:29:43 GMT", "content-type": "application/json", "content-length": "118", "connection": "keep-alive", "x-amzn-requestid": "a6049115-df59-11e7-935d-bb1de9c0649d", "x-amzn-remapped-content-length": "0", "x-amz-executed-version": "$LATEST", "x-amzn-trace-id": "root=1-5a3003f2-2583679b2456022568ed0682;sampled=0"}, "RetryAttempts": 0}, "StatusCode": 200, "ExecutedVersion": "$LATEST", "Payload": "<botocore.response.StreamingBody object at 0x10ee37dd8>", "function_name": "scrape-yahoo-dev-birthplace_from_urls", "aws_service": "lambda", "payload": "{\"url\":[\"https://sports.yahoo.com/nba/players/4624/\", \"https://sports.yahoo.com/nba/players/5185/\"]}"} Lambda Return Value Below: { "https://sports.yahoo.com/nba/players/4624/": "Indianapolis", "https://sports.yahoo.com/nba/players/5185/": "Athens" } 

الانتهاء من إنشاء وظيفة خطوة بخطوة


الخطوة الأخيرة في إنشاء دالة خطوة بخطوة ، كما هو موضح في وثائق AWS (https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-creating-activity-state-machine.html) ، هي إنشاء باستخدام واجهة الويب لهيكل آلة الحالة في تنسيق JavaScript Objectation (JSON). توضح التعليمة البرمجية التالية خط الأنابيب هذا ، بدءًا من وظائف Lambda الأصلية لإلغاء Yahoo! ، وتخزين البيانات في ملف S3 ، وأخيراً إرسال محتوى إلى Slack:

 { "Comment": "Fetch Player Urls", "StartAt": "FetchUrls", "States": { "FetchUrls": { "Type": "Task", "Resource": \ "arn:aws:lambda:us-east-1:561744971673:\ function:scrape-yahoo-dev-return_player_urls", "Next": "FetchBirthplaces" }, "FetchBirthplaces": { "Type": "Task", "Resource": \ "arn:aws:lambda:us-east-1:561744971673:\ function:scrape-yahoo-dev-birthplace_from_urls", "Next": "WriteToS3" }, "WriteToS3": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:\ 561744971673:function:scrape-yahoo-dev-create_s3_file_from_json", "Next": "SendToSlack" }, "SendToSlack": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:561744971673:\ function:send_message", "Next": "Finish" }, "Finish": { "Type": "Pass", "Result": "Finished", "End": true } } } 

في التين. 7.2 تم عرض تنفيذ الجزء الأول من خط الأنابيب هذا. من المفيد للغاية رؤية النتائج الوسيطة لجهاز الحالة. بالإضافة إلى ذلك ، فإن إمكانية المراقبة في الوقت الفعلي لكل جزء من جهاز الحالة مريحة للغاية للتصحيح.

يوضح الشكل 7.3 خط أنابيب كاملًا مع إضافة خطوات الكتابة إلى ملف S3 وإرسال محتوى إلى Slack. يبقى فقط أن تقرر كيفية تشغيل هذه الأداة المساعدة للتخليص - في فترة زمنية معينة أو استجابة لحدث ما.

الصورة

ملخص


في هذا الفصل ، تم تعريفك بالعديد من المفاهيم المذهلة لبناء تطبيقات الذكاء الاصطناعي. لقد أنشأت الأداة المساعدة Slack bot و scraping على الويب ، والتي تم توصيلها بعد ذلك باستخدام خدمات بلا خادم من AWS. يمكنك إضافة الكثير إلى هذا الإطار الأولي - على سبيل المثال ، وظيفة Lambda لمعالجة النصوص المكتوبة باللغات الطبيعية لقراءة صفحات الويب والحصول على محتوياتها المختصرة أو خوارزمية التجميع بدون مدرس ، والتي من شأنها تجميع اللاعبين الجدد في الدوري الاميركي للمحترفين بخصائص تعسفية.

»يمكن الاطلاع على مزيد من المعلومات حول الكتاب على موقع الناشر
» المحتويات
» مقتطفات

خصم 20٪ على كوبون Courier - Gift

ملاحظة: 7٪ من تكلفة الكتاب ستذهب إلى ترجمة كتب الكمبيوتر الجديدة ، قائمة الكتب التي سلمت إلى المطبعة هنا .

Source: https://habr.com/ru/post/ar439990/


All Articles