Step3: プログラミング1
このStepでは、Pythonの基本文法・制御構文・データ構造・関数・クラス・応用構文・ライブラリを学び、その理解を活かして sns-camp-api から取得した投稿一覧を集計するツールを Python で作成します。
| 💡 ポイント |
|---|
| インフラエンジニアであっても、サーバレス処理や自動化の実装、なにより自分が作る基盤の中身を理解するために、プログラミングの基礎を身につけておくことを推奨します。一方で、プログラミングに苦手意識がありインフラ構築に集中したい場合や、すでに多言語を含めてプログラミング経験がある場合は、Step 3 のプログラミング講座と課題をスキップしても構いません。スキップした場合は、後半の「非機能要件の実装」(Step 10〜12)にその分の時間を充てて、より多くの施策実装に取り組んでいただけます。 |
1. 講座の履修
Python講座 の以下の章を実施してください。すでに同等の知識がある場合は、講座の履修はスキップしても構いません。
2. 課題の実施
2.1 目的・背景
Python の基本文法から応用構文までを学んだうえで、それらを実際に使いこなせるかを、sns-camp-api から取得したデータを集計する簡単なツールを通じて確認します。API を叩いて JSON を受け取り、ループ・条件分岐・辞書を組み合わせてデータを集計するという、実務でも頻出のパターンを一通り体験することが目標です。
2.2 実施要件
以下のプログラム詳細設計に沿って、投稿一覧の集計ツールを Python で実装してください。設計書の内容だけで実装できる状態になっているので、そのまま設計に従って実装することを目標とします。
プログラム概要
Step 2 までに構築した sns-camp-api の GET /api/v1/public-timeline(認証不要)を叩いて投稿一覧を取得し、投稿者別・文字数別に集計した結果を標準出力に整形表示するコマンドラインツールを実装します。
ファイル構成
| ファイル名 | 説明 |
|---|---|
aggregate_posts.py |
集計ツールのメインスクリプトとして実装する(単一ファイル構成) |
入力仕様
環境変数:
| 環境変数名 | 内容 | 例 |
|---|---|---|
API_BASE_URL |
sns-camp-api の接続先ベース URL を指定する | https://<公開URL> |
呼び出す API
| メソッド | パス | 認証 | 用途 |
|---|---|---|---|
| GET | /api/v1/public-timeline |
不要 | 投稿一覧を取得する |
呼び出し方法:
Python の requests ライブラリを使う場合の例です。response.json() の返り値を変数 data に格納します。
import requests
response = requests.get(f"{base_url}/api/v1/public-timeline", params={"limit": 50})
data = response.json()
data には Python の辞書として、以下のような構造で値が入ります(各値の右に Python の型を記載)。
{
"data": [ # list
{ # dict
"id": 42, # int
"user_id": 1, # int
"content": "はじめての投稿です!", # str
"username": "yamada", # str
"display_name": "山田太郎", # str
"like_count": 5, # int
"created_at": "2026-04-03T12:00:00", # str(ISO 8601 形式)
"updated_at": "2026-04-03T12:00:00", # str(ISO 8601 形式)
},
{
"id": 41,
"user_id": 2,
"content": "今日は天気が良いですね",
"username": "tanaka",
"display_name": "田中花子",
"like_count": 2,
"created_at": "2026-04-03T11:50:00",
"updated_at": "2026-04-03T11:50:00",
},
{
"id": 40,
"user_id": 1,
"content": "sns-camp を触りはじめました",
"username": "yamada",
"display_name": "山田太郎",
"like_count": 8,
"created_at": "2026-04-03T11:30:00",
"updated_at": "2026-04-03T11:30:00",
},
]
}
出力仕様
標準出力に、以下の 3 種類の集計結果を整形して表示します。
| 集計項目 | 集計内容 |
|---|---|
| 総投稿数 | 取得した投稿の件数を表示する |
| 投稿者別の投稿数 | username ごとの件数を辞書でカウントし、件数の降順に並べて表示する |
| 文字数別の投稿数 | 各投稿の content の文字数を len() で数え、下記 3 カテゴリに分類してカウントする |
文字数別の分類基準:
| カテゴリ | 判定条件 |
|---|---|
| 短文 | 文字数が 50 未満のときに分類する |
| 中文 | 文字数が 50 以上 150 未満のときに分類する |
| 長文 | 文字数が 150 以上のときに分類する |
出力例:
先ほどの「呼び出し方法」に示したレスポンス(3 件)を集計した場合、以下のような出力になります。
=== 集計結果 ===
総投稿数: 3 件
投稿者別:
yamada: 2 件
tanaka: 1 件
文字数別:
短文: 3 件
中文: 0 件
長文: 0 件
実装上の指定
- HTTP リクエストは、標準ライブラリまたは
requestsライブラリを使う - 集計処理は for ループ・if 文・辞書を組み合わせて実装する
- 投稿一覧の取得件数はクエリパラメータ
?limit=50で 50 件に固定する
エラー処理
API 呼び出しでエラーが発生した場合は、取得したエラーメッセージを標準エラー出力に表示して、プログラムを異常終了します。
2.3 判定基準
動作確認
Step 2 までに構築した sns-camp-api の公開 URL に対して、作成したツールを実行し、以下のように期待通りの結果が得られることを確認してください。
export API_BASE_URL=https://<公開URL>
python aggregate_posts.py
以下のような集計結果が標準出力に表示されます(内容は投稿状況によって変わります)。
=== 集計結果 ===
総投稿数: 42 件
投稿者別:
yamada: 15 件
tanaka: 12 件
suzuki: 10 件
takahashi: 5 件
文字数別:
短文: 20 件
中文: 15 件
長文: 7 件
2.4 課題提出
下記内容を提出フォームより提出してください(提出はプレミアムプランでご利用いただけます)。
| 項目 | 内容 |
|---|---|
| 概要 | 作成したツールの構成・工夫した点を簡潔に記載する |
| 実装コード | ツールの実装コード、または GitHub リポジトリの URL を記載する |
| 動作確認 | ツールを実行した結果を、コマンドと出力がわかる形で記載する |
| まとめ | 実装中に苦労したこと、工夫したこと、学んだことを記載する |