рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЕрд╢реА рдХрд╛рд░реНрдпреЗ рдЖрд╣реЗрдд рдЬреА рджрд┐рд╡рд╕реЗрдВрджрд┐рд╡рд╕, рдЖрдард╡рдбреНрдпрд╛рдирдВрддрд░ рдЖрдард╡рдбрд╛рднрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддрд╛рдд? рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЕрд╣рд╡рд╛рд▓ рд▓рд┐рд╣рд┐рдгреЗ. рддреБрдореНрд╣реА рдбреЗрдЯрд╛рдЪреА рд╡рд┐рдирдВрддреА рдХрд░рд╛, рддреНрдпрд╛рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рд╛, рддреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рд╛ (рдЖрд▓реЗрдЦ, рддрдХреНрддреЗ рдмрдирд╡рд╛) рдЖрдгрд┐ рдирдВрддрд░ рддреЛ рддреБрдордЪреНрдпрд╛ рдмреЙрд╕рд▓рд╛ рдкрд╛рдард╡рд╛. рдкрдг рд╣реЗ рд╕рд░реНрд╡ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЕрд╕реЗрд▓ рддрд░?
рдпрд╛ рдЯреНрдпреБрдЯреЛрд░рд┐рдпрд▓рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдПрдХ рдмреЙрдЯ рддрдпрд╛рд░ рдХрд░реВ рдЬреЛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧрд▓рд╛ рдорджрдд рдХрд░реЗрд▓. рдЖрдгрд┐ рд╕рд░реНрд╡рд╛рдд рдЫрд╛рди рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЧреНрд░рд╛рдордордзреНрдпреЗ рдХреЛрдбрдЪреНрдпрд╛ рдлрдХреНрдд 50 рдУрд│реАрдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕реЗрд▓! рдЬрд░ рддреБрдореНрд╣реА рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдорд╕рд╛рдареА рдмреЙрдЯ рддрдпрд╛рд░ рдХрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рддреБрдореНрд╣реА рд╣реЗ рджреЗрдЦреАрд▓ рд╡рд╛рдЪрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рдкрд╛рдпрдерди рд╡рд┐рдХрд╕рдХ .рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.
рдЪрд▓рд╛ рд╕реБрд░реВ рдХрд░реБрдпрд╛
рд▓рд╛рдпрдмреНрд░рд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ
рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ
pip3 рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ google-Cloud-bigquery matplotlib numpy pandas python-telegram-bot
Google BigQuery API рдХрдиреЗрдХреНрдЯ рдХрд░рдд рдЖрд╣реЗ
рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕, рдЖрдореНрд╣рд╛рд▓рд╛ Google BigQuery API рдХрдиреЗрдХреНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдЬрд╛
рдирд┐рдпрдВрддреНрд░рдг рдкреЕрдиреЗрд▓рдордзреНрдпреЗ, APIs рдЖрдгрд┐ рд╕реЗрд╡рд╛ рд╕рдХреНрд╖рдо рдХрд░рд╛ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ BigQuery API рд╢реЛрдзрд╛.
API рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рдХреНрд╖рдо рдХрд░рд╛ рдирд┐рд╡рдбрд╛.
рдЦрд╛рддреЗ рдХреА рддрдпрд╛рд░ рдХрд░рд╛
рдЪрд▓рд╛ рдкреБрдиреНрд╣рд╛ рдЬрд╛рдКрдпрд╛
рдирдВрддрд░ - рдирд╡реАрди рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ, рдЖрдгрд┐ рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдирд╛рд╡ рдлреАрд▓реНрдбрдордзреНрдпреЗ рдирд╛рд╡ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛.
рд░реЛрд▓ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреАрдордзреВрди, рдкреНрд░рдХрд▓реНрдк > рдорд╛рд▓рдХ рдирд┐рд╡рдбрд╛, рдирдВрддрд░ рддрдпрд╛рд░ рдХрд░рд╛.
рдЬреА рдлрд╛рдЗрд▓ рдЖрдкреЛрдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдИрд▓ рддрд┐рд▓рд╛ creds.json рдореНрд╣рдгрддрд╛рдд.
рдЯрд░реНрдорд┐рдирд▓рдордзреНрдпреЗ creds.json рдЪрд╛ рдорд╛рд░реНрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди GOOGLE_APPLICATION_CREDENTIALS рд╕реЗрдЯ рдХрд░рд╛.
GOOGLE_APPLICATION_CREDENTIALS='[PATH_TO_CREDS.JSON]' рдирд┐рд░реНрдпрд╛рдд рдХрд░рд╛
рдЬрд░ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЭрд╛рд▓реЗ рддрд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рд╡реЗрд│ рдЖрд▓реА рдЖрд╣реЗ.
рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддрдпрд╛рд░ рдХрд░рдгреЗ
рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рд╕рд╛рдареА рдЖрдореНрд╣реА bigquery-public-data.stackoverflow рдХрдбреАрд▓ рдбреЗрдЯрд╛ рд╡рд╛рдкрд░реВ, рдЖрдордЪреНрдпрд╛ рдЕрд╣рд╡рд╛рд▓рд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рджреИрдирд┐рдХ рдкреНрд░рдХрд╛рд╢рдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд╡рдбреВ.
рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЕрдЧрджреА рд╕реЛрдкреЗ рдЖрд╣реЗ.
рдЯреЗрдмрд▓рдЪреА рдХреНрд╡реЗрд░реА рдХрд░рд╛ -> рдбреЗрдЯрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдХрд░рд╛ -> рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рдЬрддрди рдХрд░рд╛ -> рдкреНрд░рддрд┐рдорд╛ рдкрд╛рдард╡рд╛
рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╡реВ.
BigQuery рд▓рд╛ рдХреНрд╡реЗрд░реА
рдкреНрд░рдердо рдЖрдкрдг рд▓рд╛рдпрдмреНрд░рд░реА рдЖрдпрд╛рдд рдХрд░рддреЛ.
google.cloud рд╡рд░реВрди bigquery рдЖрдпрд╛рдд рдХрд░рд╛
рдЖрдореНрд╣реА query_to_bigquery рдирд╛рд╡рд╛рдЪреЗ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рддреЛ, рдЬрд┐рдереЗ рдкреЕрд░рд╛рдореАрдЯрд░ рдХреНрд╡реЗрд░реА рдЖрд╣реЗ.
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframe
рд╣реЗ рдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдореНрд╣рдгреВрди рд╡рд┐рдирдВрддреА рдкрд░рдд рдХрд░реЗрд▓.
рдбреЗрдЯрд╛ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭрд┐рдВрдЧ
рдпрд╛ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, matplotlib рдирд┐рд╡рдбрд╛.
matplotlib.pyplot plt рдореНрд╣рдгреВрди рдЖрдпрд╛рдд рдХрд░рд╛
рдЖрдореНрд╣рд╛рд▓рд╛ рдкрд╛рдЪ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдЬрд┐рдереЗ x рд╣рд╛ x-рдЕрдХреНрд╖ рдбреЗрдЯрд╛ рдЖрд╣реЗ, x_label рд╣реЗ рдЕрдХреНрд╖рд╛рдЪреЗ рд╢реАрд░реНрд╖рдХ рдЖрд╣реЗ, y рд╣реЗ y-рдЕрдХреНрд╖ рдбреЗрдЯрд╛ рдЖрд╣реЗ, y_label рд╣реЗ рдЕрдХреНрд╖рд╛рдЪреЗ рд╢реАрд░реНрд╖рдХ рдЖрд╣реЗ рдЖрдгрд┐ рд╢реАрд░реНрд╖рдХ рд╕рдВрдкреВрд░реНрдг рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рдирдЪреЗ рд╢реАрд░реНрд╖рдХ рдЖрд╣реЗ.
def visualize_bar_chart(x, x_label, y, y_label, title):
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
index = np.arange(len(x))
plt.xticks(index, x, fontsize=5, rotation=30)
plt.bar(index, y)
return plt
рдкреНрд░рддрд┐рдорд╛ рдЬрддрди рдХрд░рд╛
рдЖрддрд╛ рд╡реНрд╣рд┐рдЬреНрдпреБрдЕрд▓рд╛рдпрдЭреЗрд╢рди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╕реЗрд╡реНрд╣ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЛрди рдлрдВрдХреНрд╢рдиреНрд╕ рд╡рд╛рдкрд░реВ.
рдЖрдореНрд╣реА рджрд░рд░реЛрдЬ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреЛрд╕реНрдЯрдЪреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдард╡реВ. рдкреНрд░рдердо рдЖрдореНрд╣реА рдПрдХ рд╡рд┐рдирдВрддреА рд▓рд┐рд╣рд┐рддреЛ.
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
рдХреНрд╡реЗрд░реА 2 рдбрд┐рд╕реЗрдВрдмрд░ 2018 рдкрд╛рд╕реВрди рджреЛрди рдЖрдард╡рдбреНрдпрд╛рдВрд╕рд╛рдареА рдбреЗрдЯрд╛ рдЧреЛрд│рд╛ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░рддреЗ.
рдЖрдореНрд╣реА рд╣реА рддрд╛рд░реАрдЦ рд╡рд╛рдкрд░рддреЛ рдХрд╛рд░рдг 2018-12-02 рд╣рд╛ bigquery-public-data.stackoverflow.post_history рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗрд▓рд╛ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдЖрд╣реЗ, рдЗрддрд░ рдмрд╛рдмрддреАрдд рддреБрдореНрд╣реА рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдорд┐рд│рд╡рдгреНрдпрд╛рд╕рд╛рдареА CURRENT_DATE() рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.
рдбреЗрдЯрд╛ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА query_to_bigquery рдлрдВрдХреНрд╢рдирд▓рд╛ рдХреЙрд▓ рдХрд░рд╛.
рдбреЗрдЯрд╛рдлреНрд░реЗрдо = query_to_bigquery(рдХреНрд╡реЗрд░реА)
рдирдВрддрд░ рдЖрдкрдг x-рдЕрдХреНрд╖рд╛рд╕рд╛рдареА рддрд╛рд░реАрдЦ рдбреЗрдЯрд╛ рд╕реНрддрдВрдн рдЖрдгрд┐ y-рдЕрдХреНрд╖рд╛рд╕рд╛рдареА рдПрдХреВрдг_рдкреЛрд╕реНрдЯ рд╕реНрддрдВрдн рд╡рд╛рдкрд░рддреЛ.
x = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['date'].tolist()
y = рдбреЗрдЯрд╛рдлреНрд░реЗрдо['total_posts'].tolist()
рдЖрдореНрд╣реА visualize_bar_chart рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реВрди рддреЗ рджреГрд╢реНрдпрдорд╛рди рдХрд░рддреЛ рдЖрдгрд┐ рдЗрдореЗрдЬ рдореНрд╣рдгреВрди рд╕реЗрд╡реНрд╣ рдХрд░рддреЛ.
plt = visualize_bar_chart(x=x, x_label='date', y=y, y_label='рдПрдХреВрдг рдкреЛрд╕реНрдЯ', title='рджреИрдирд┐рдХ рдкреЛрд╕реНрдЯ')
plt.savefig('viz.png')
рдЖрдореНрд╣реА рд╣рд╛ рдХреЛрдб get_and_save_image рдирд╛рд╡рд╛рдЪреНрдпрд╛ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рдЧреБрдВрдбрд╛рд│рддреЛ.
def get_and_save_image():
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
dataframe = query_to_bigquery(query)
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
рдПрдХ рдкреНрд░рддрд┐рдорд╛ рдкрд╛рдард╡рд╛
рдкреНрд░рд╛рдкреНрддрдХрд░реНрддреНрдпрд╛рд▓рд╛ рдЕрд╣рд╡рд╛рд▓ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ chat_id рдкреЕрд░рд╛рдореАрдЯрд░ рдорд╛рд╣рд┐рдд рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ
рдЖрддрд╛ send_image рдлрдВрдХреНрд╢рди рдмрдирд╡реВ. рддреЗ рдкреНрд░рддрд┐рдорд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рдЬрддрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА get_and_save_image рдлрдВрдХреНрд╢рди рд╡рд╛рдкрд░реЗрд▓. рдЖрдгрд┐ рдордЧ рдЖрдореНрд╣реА рд╕рд░реНрд╡рдХрд╛рд╣реА рдпреЛрдЧреНрдп рд╕рдВрдкрд░реНрдХрд╛рдХрдбреЗ рдкрд╛рдард╡рддреЛ.
def send_image(bot, update):
get_and_save_image()
chat_id = 'CHAT_ID_RECEIVER'
bot.send_photo(chat_id=chat_id, photo=open('viz.png','rb'))
рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо
рд╢реЗрд╡рдЯреА, рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдБрдЪ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рджреБрд╕рд░реЗ рдлрдВрдХреНрд╢рди рддрдпрд╛рд░ рдХрд░рддреЛ, рдореБрдЦреНрдп. рдмреЙрдЯрд╕рд╛рдареА YOUR_TOKEN рдмрджрд▓рд╛рдпрд▓рд╛ рд╡рд┐рд╕рд░реВ рдирдХрд╛.
рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛: рд╣рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдкрдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│реА рдкреНрд░рддрд┐рдорд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рддрдкрдгреЗ рдкрд╛рдард╡реЗрд▓. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдореНрд╣реА рджрд░рд░реЛрдЬ рд╕рдХрд╛рд│реА рдирдК рд╡рд╛рдЬрддрд╛ рдЕрд╣рд╡рд╛рд▓ рдкрд╛рдард╡реВ.
def main():
updater = Updater('YOUR_TOKEN')
updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
рдкрд░рд┐рдгрд╛рдореА, рдЖрдордЪрд╛ рдЕрд░реНрдЬ рдпрд╛рд╕рд╛рд░рдЦрд╛ рджрд┐рд╕реЗрд▓:
from google.cloud import bigquery
from telegram.ext import Updater
import matplotlib.pyplot as plt
import numpy as np
import datetime
def query_to_bigquery(query):
client = bigquery.Client()
query_job = client.query(query)
result = query_job.result()
dataframe = result.to_dataframe()
return dataframe
def visualize_bar_chart(x, x_label, y, y_label, title):
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
index = np.arange(len(x))
plt.xticks(index, x, fontsize=5, rotation=30)
plt.bar(index, y)
return plt
def get_and_save_image():
query = """
SELECT DATE(creation_date) date, COUNT(*) total_posts
FROM `bigquery-public-data.stackoverflow.post_history`
GROUP BY 1
HAVING date > DATE_SUB('2018-12-02', INTERVAL 14 DAY)
ORDER BY 1
"""
dataframe = query_to_bigquery(query)
x = dataframe['date'].tolist()
y = dataframe['total_posts'].tolist()
plt = visualize_bar_chart(x=x, x_label='Date', y=y, y_label='Total Posts', title='Daily Posts')
plt.savefig('viz.png')
def send_image(bot, update):
get_and_save_image()
chat_id = 'CHAT_ID_RECEIVER'
bot.send_photo(chat_id=chat_id, photo=open('viz.png', 'rb'))
def main():
updater = Updater('YOUR_TOKEN')
updater.job_queue.run_daily(send_image, time=datetime.datetime.strptime('9:00AM', '%I:%M%p').time(), days=(0,1,2,3,4,5,6))
updater.start_polling()
updater.idle()
if __name__ == '__main__':
main()
рдлрд╛рдИрд▓ рд╕реЗрд╡реНрд╣ рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ main.py рдХреЙрд▓ рдХрд░рд╛.
рдЖрдореНрд╣реА рдЯрд░реНрдорд┐рдирд▓рдордзреНрдпреЗ рдХрдорд╛рдВрдб рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░реВрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХрд░рддреЛ:
python3 main.py
рд╕рд░реНрд╡ рддрдпрд╛рд░ рдЖрд╣реЗ. рдЖрддрд╛ рдЖрдордЪреНрдпрд╛рдХрдбреЗ рдХреЛрдбрдЪреНрдпрд╛ 50 рдУрд│реАрдВрдЪрд╛ рдПрдХ рд░реЛрдмреЛрдЯ рдЖрд╣реЗ рдЬреЛ рдЖрдордЪреНрдпрд╛ рд╣рд╕реНрддрдХреНрд╖реЗрдкрд╛рд╢рд┐рд╡рд╛рдп рдЕрд╣рд╡рд╛рд▓ рддрдпрд╛рд░ рдХрд░рддреЛ.
рдЪрд▓рд╛ рдмреЙрдЯ рддрдкрд╛рд╕реВрдпрд╛
рдЖрдкрдг рд╕рдорд╛рдкреНрдд рдХреЛрдб рдпреЗрдереЗ рдорд┐рд│рд╡реВ рд╢рдХрддрд╛
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:
- рджреЛрди рд╡рд░реНрд╖рд╛рдВрдЪрд╛ рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
"рдореА рдкреНрд░реЛ рд╡реЗрдм рдбреЗрд╡реНрд╣рд▓рдкрд░ рдЖрд╣реЗ" .- рдСрдирд▓рд╛рдИрди рдХреЛрд░реНрд╕
"0 рд╡рд░реВрди C# рд╡рд┐рдХрд╕рдХ" .- рдПрдХ рд╡рд░реНрд╖рд╛рдЪрд╛ рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
"PHP рд╡рд┐рдХрд╕рдХ 0 рддреЗ PRO" .
рд╕реНрддреНрд░реЛрдд: www.habr.com