# 第二部達成基準

第二部における各課題の達成基準を次のようにまとめます．

## Day8からDay12および最終課題の必須課題（単位取得のための必須項目）
- Day8 「ベンチマークソフトab（Apache Bench）」を用いてWebサーバの性能計測を実施する
- Day9 「DBMSとの接続」において「可(C)」レベル以上のWebアプリケーションを実装し，性能評価の結果について報告する
- Day10 Day9の実装をベースに設計・実装を継続し，グループ内で各自の実装内容を共有する
- Day11 「検討状況の確認（必須）」として，Day11時点での基礎課題の性能を計測し，グループ発表に向けた性能向上方針を検討してレポートに記載する
- Day12 パフォーマンスチューニングに取り組み，ボトルネックを分析して改善した結果を報告する
- 最終課題 「基礎課題1（全員必須）」として実装A・実装B・実装Cを全て実装し，性能比較の結果を報告する
- 最終課題 「応用課題①（検索サーバ高性能化コンテスト）」に参加し，実装Aをさらに改良した結果を報告する

なお，性能比較等において設定する計測条件については各自で工夫すること

## 発展課題（必須ではないが加点となる）
- Day8 「Webシステムの基礎（発展）」の内容についてまとめて報告する
- Day9 「DBMSとの接続」において「良(B)」・「優(A)」・「秀(S)」レベルの実装を行い報告する
- Day9 「DBMSとの接続」における性能評価において，ボトルネック部分を改善させた結果を報告する（発展）
- Day11 「自由課題（イマジネーション）チーム」として現時点での検討状況を整理しプロトタイプ実装の問題点を報告する
- 最終課題 「応用課題②（Apache MPMによる高速化）」を実施し，独自実装との性能比較を報告する
- 最終課題 「応用課題③（自由課題・イマジネーション）」として独創的なWebシステムを実装して報告する

また，レポートへの取り組みにあたっては，まずはグループリーダーを決めてください（もちろんグループリーダーが全責任を負うわけではありません．リーダーを担当することでグループワークの苦労を実感すると思いますが，就職活動等でアピールできる経験になりますから一度は担当してみた方がよいです．また，メンバとしての役割も重要ですから，リーダーに求められること，メンバに求められることが何かも意識してみてください）．グループリーダーを中心に班員全員が各項目を理解できるよう話し合いをし，必須課題のそれぞれの実装の詳細まで全員で理解を深めてください．まずは必須課題のそれぞれを分担して実装してください．それぞれの実装を共有してお互いに実装内容を説明し合って理解を深めてください．もし興味深い実装をしている人がいたら，その部分を強調してアピールしてください（内容によりますが加点要因として考慮します）．

---


# 達成基準に関するもう少し詳しい解説
各課題が必須/発展であるかについては上記を参照してください

## ベンチマークソフトab（Apache Bench）
abコマンドを用いてWebサーバの性能を計測できることが最低限の確認事項です．単にコマンドを実行するだけでなく，計測条件（同時接続数やリクエスト数）を変えたときにどのような違いが生じるか，その理由についても班内で議論しておきましょう．

## DBMSとの接続
### 「可(C)」レベル
最低限，以下を確認できればOKです．

1. 「郵便番号」・「住所」・「住所のカナ」のいずれかによる検索入力を受け付けること
2. 条件に合致するエントリーをテーブル形式で表示すること
3. 表示件数が多い場合に複数ページへ分割して表示すること

### 「良(B)」レベル
最低限，以下を確認できればOKです．

1. 「可(C)」レベルの全要件を満たしていること
2. 郵便番号を全国対応にすること，または BootstrapやWebix 等のUIツールでページをデザインすること

### 「優(A)」レベル
最低限，以下を確認できればOKです．

1. 「良(B)」レベルの全要件を満たしていること
2. 住所入力中に候補を表示するサジェスト機能，またはGoogle Maps等の地図系ツールとの連携を実装していること

### 「秀(S)」レベル
最低限，以下を確認できればOKです．

1. 「優(A)」レベルの全要件を満たしていること
2. 「優(A)」レベルの内容をNode.jsで実装するなど，秀に相当する工夫や実装を行っていること

### 性能評価
実装した住所・郵便番号検索Webシステムについて，以下を実施してください．

1. 実装内容（C/B/A/Sのどのレベルまで実装したか）と工夫した点を説明する
2. 応答時間を計測し，各クエリの処理時間などの詳細な分析結果を示すこと，および各種性能分析コマンドを駆使してボトルネックの原因を考察すること
3. 性能向上のための改善案を検討してレポートに記載すること
4. 【発展】ボトルネック部分を実際に改善し，どこまで改善できるか試行錯誤した結果を報告すること

## 検討状況の確認（Day11必須課題）

Day11時点での以下の事項を整理してレポートに記載してください．

1. **基礎課題の検討状況**：Day11時点での性能を計測すること．グループ発表に向けてどのようにしたら性能向上させられるかの方針を検討した結果を記載すること．仮説を立てた上で実験を行い，仮説と異なる結果が得られた場合にはその原因を更に検証してください（その結果をレポートにまとめてください）．
2. **超高性能化の検討状況**：現時点での性能を計測し，グループ発表に向けた性能向上方針の検討結果をレポートに含めること．
3. **（自由課題に取り組む班のみ）** 現時点での自由課題の検討状況をグループ内で共有すること．完成のイメージが分かるよう現在の検討状況を整理した上で，完成までの問題点を洗い出し，Day12時点でのプロトタイプ実装の問題点としてレポートに記載すること．

## 最終課題：基礎課題
Flickrの写真データ（geotag.csv・tag.csv，各約1,000万件）を用いて，「任意のタグを持つ写真の撮影時刻・緯度・経度・URLの一覧を撮影時刻降順で出力するWebアプリケーション」を以下の3種類の方針で実装してください．いずれの実装においても，ユーザがWebブラウザの検索フォームからタグを指定でき，最大100件を表示するという共通仕様を満たしてください．

### 実装A
**データベースを使用せず，CSVファイルを直接開いて検索するプログラム（progA.php）** を実装できればOKです．
独自インデックスの実装など，何らかの工夫によって実装Cの速度を上回ることを目指してください．

### 実装B
**データベースを使用するが，i_tagインデックスを使用しないで検索するプログラム（progB.php）** を実装できればOKです．

`SELECT * FROM tag IGNORE INDEX(i_tag) WHERE tag like '...'` のようにインデックスを明示的に除外してください．

### 実装C
**データベースおよびi_tagインデックスを使用して検索するプログラム（progC.php）** を実装できればOKです．

### 性能比較

実装A〜Cの性能をabコマンドで計測し，結果を分析してください．グループ内全員の各実装の性能をグラフ化して比較してください．グループ発表ではグループ内で最も高性能な実装を紹介するとともにメンバー間で性能差が生じた原因について考察できると良いでしょう．性能は概ね「実装B ＜ 実装A ＜ 実装C」になると予想されますが，実装Aの工夫次第では「実装B ＜ 実装C ＜ 実装A」も可能です．計測条件（abのパラメータなど）は発表資料およびレポートに必ず明記してください．

## 最終課題：応用課題①（検索サーバ高性能化コンテスト）
全員必須課題です．
実装Aをさらに改良して実装Cの速度を上回る検索パフォーマンスを目指し，ベンチマークサーバを使って計測した結果を報告できればOKです．
性能向上の手法は世の中で実際に使用される手法であれば何でも構いません（例：CSVファイルの前処理・独自データ構造による保存，Raspberry Piの複数台クラスタ化，オンメモリ処理など）．クライアントサイドのみやオンメモリで完結するような実装は，その旨を明記した上で参考値として示してください．

## 最終課題：応用課題②（Apache MPMによる高速化）
任意課題です（発展）．
Apacheのマルチプロセス機能（Prefork・Worker・Event）の設定を変更し，独自実装との性能差を比較してください．最低限，以下を実施できればOKです．

1. Apache MPMの各方式について要点を整理し，どのような結果になるか論理的な仮説を立てる
2. MPM各方式の計測結果を可視化し，なぜそうなったのか（なぜ仮説通りにならなかったのか）論理的に考察する
3. KeepAliveのON/OFFが性能に与える影響を測定し考察する

## 最終課題：応用課題③（自由課題・イマジネーション）
任意課題（余裕がある方向け）です．
Raspi上に構築したFlickr写真情報データセット，あるいはそれに準ずる大規模データセットを用いた興味深いWebシステムを自由な発想で実装してください．例えば，地図との連携，AI系APIの活用，WebSocketやServer-Sent Eventsを用いたリアルタイム更新など，独創的なアプローチを期待しています．最低限，以下を確認できればOKです．

1. グループ内で自由課題のテーマが重複しないよう事前に意識合わせができていること
2. 対象とする写真が10万件以上であること（Flickrの写真データを直接利用する場合も含む）
3. 実装した内容と工夫点，ならびにどの程度大変だったかをアピールできること

それぞれの仕様をどこまで実装するか任せますので，何をどこまで実装したのか，どの程度難しかったのか，どの程度加点するのがよさそうか上手にアピールしてください．実施した内容や検討した内容はポジティブに受け取ります．
