เชถเซเช เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชเชตเชพ เชเชพเชฐเซเชฏเซ เชเซ เชเซ เชฆเชฐเชฐเซเช, เช
เช เชตเชพเชกเชฟเชฏเชพ เชชเชเซ เช
เช เชตเชพเชกเชฟเชฏเชพเชจเซเช เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชเชฐเซ เชเซ? เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เช
เชนเซเชตเชพเชฒเซ เชฒเชเชตเชพ. เชคเชฎเซ เชกเซเชเชพเชจเซ เชตเชฟเชจเชเชคเซ เชเชฐเซ, เชคเซเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเซ, เชคเซเชจเซ เชตเชฟเชเซเชฏเซเช
เชฒเชพเชเช เชเชฐเซ (เชเซเชฐเชพเชซ, เชเชพเชฐเซเช เชฌเชจเชพเชตเซ), เช
เชจเซ เชชเชเซ เชคเซเชจเซ เชคเชฎเชพเชฐเชพ เชฌเซเชธเชจเซ เชฎเซเชเชฒเซ. เชชเชฐเชเชคเซ เชเซ เช เชฌเชงเซเช เชธเซเชตเชฏเชเชธเชเชเชพเชฒเชฟเชค เชนเซเชค เชคเซ?
เช เชเซเชฏเซเชเซเชฐเซเชฏเชฒเชฎเชพเช เชเชชเชฃเซ เชเซเชฒเชฟเชเซเชฐเชพเชฎ เชฎเชพเชเซ เชเช เชฌเซเช เชฌเชจเชพเชตเซเชถเซเช เชเซ เชธเซเชตเชเชพเชฒเชฟเชค เชฐเซเชชเซเชฐเซเชเซเชเชเชฎเชพเช เชฎเชฆเชฆ เชเชฐเชถเซ. เช
เชจเซ เชธเซเชฅเซ เชธเชฐเชธ เชตเชพเชค เช เชเซ เชเซ เชเชเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชเซเชกเชจเซ เชฎเชพเชคเซเชฐ 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 เชเชนเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
GOOGLE_APPLICATION_CREDENTIALS เชธเซเช เชเชฐเซ, เชเชฐเซเชฎเชฟเชจเชฒเชฎเชพเช creds.jsonเชจเซ เชฎเชพเชฐเซเช เชธเซเชชเชทเซเช เชเชฐเซ.
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 เชซเชเชเซเชถเชจ เชชเชฐ เชเซเชฒ เชเชฐเซ.
เชกเซเชเชพเชซเซเชฐเซเชฎ = เชเซเชตเซเชฐเซ_เชฅเซ_เชฌเชฟเชเชเซเชตเซเชฐเซ(เชเซเชตเซเชฐเซ)
เชชเชเซ เชเชชเชฃเซ x-เช เชเซเชท เชฎเชพเชเซ เชคเชพเชฐเซเช เชกเซเชเชพ เชเซเชฒเชฎ เช เชจเซ y-เช เชเซเชท เชฎเชพเชเซ เชเซเชฒ_เชชเซเชธเซเช เชเซเชฒเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช.
x = เชกเซเชเชพเชซเซเชฐเซเชฎ['เชคเชพเชฐเซเช'].เชเซเชฒเชฟเชธเซเช()
y = เชกเซเชเชพเชซเซเชฐเซเชฎ['total_posts'].tolist()
เช เชฎเซ เชคเซเชจเซ visualize_bar_chart เชซเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชตเชฟเชเซเชฏเซเช เชฒเชพเชเช เชเชฐเซเช เชเซเช เช เชจเซ เชคเซเชจเซ เชเชฎเซเช เชคเชฐเซเชเซ เชธเซเชต เชเชฐเซเช เชเซเช.
plt = เชตเชฟเชเซเชฏเซเช
เชฒเชพเชเช_เชฌเชพเชฐ_เชเชพเชฐเซเช(x=x, x_label='เชคเชพเชฐเซเช', y=y, y_label='เชเซเชฒ เชชเซเชธเซเช', เชถเซเชฐเซเชทเช='เชฆเซเชจเชฟเช เชชเซเชธเซเช')
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# เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .- เชเช เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"0 เชฅเซ PRO เชธเซเชงเซ PHP เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .
เชธเซเชฐเซเชธ: www.habr.com