応用情報技術者 2023年 春期 午後 問04
ITニュース配信サービスの再構築に関する次の記述を読んで、設問に答えよ。
H社は、IT関連のニュースを配信するサービスを提供している。このたび、OSや開発フレームワークの保守期間終了を機に、システムを再構築することにした。
〔現状のシステム構成と課題〕
ITニュース配信サービスでは、多くの利用者にサービスを提供するために、複数台のサーバでシステムを構成している。配信される記事には、それぞれ固有の記事番号が割り振られている。現状のシステム構成を図1に、ニュースを表示する画面一覧を表1に示す。


現状のシステム構成では、PC、タブレット、スマートフォン、それぞれに最適化したWebサイトを用意している。APでは、RDBとのデータ入出力とHTMLファイルの生成を行っている。また、関連する記事を見つけるために、各WebサーバのアクセスログをRDBに取り込み、URL中の記事番号を用いたアクセス解析をRDB上のストアドプロシージャによって行っている。
最近、利用者の増加に伴い、通勤時間帯などにアクセスが集中すると、応答速度が遅くなったり、タイムアウトが発生したりしている。
〔新システムの方針〕
この課題を解消するために、次の方針に沿った新システムの構成とする。
・aの機能を用いて、一つの Webサイトで全ての種類の端末に最適な画面を表示できるようにする。
・AP での動的な HTML の生成処理を行わない、SPA (Single Page Application) の構成にする。HTML、スクリプトなどのファイルはWebサーバに配置する。動的なデータは AP から WebAPI を通じて提供し、データ形式は各端末の Webブラウザ上で実行されるスクリプトが扱いやすいbとする。
・RDB への負荷を減らし、応答速度を短縮するために、キャッシュサーバを配置する。
・ITニュース一覧画面に表示する記事の一覧のデータと、ITニュース記事画面に表示する関連する記事に関するデータは、キャッシュサーバに格納する。キャッシュサーバには、これらのデータを全て格納できるだけの容量をもたせる。その上で、記事のデータは、閲覧されたデータをキャッシュサーバに設定したメモリの上限値まで格納する。
・RDBのデータベース構造と、関連する記事を見つける処理は現状の仕組みを利用する。
AP で提供する WebAPI を表2に示す。

次に、Webブラウザ上で実行されるスクリプトの概要を表3に示す。

〔キャッシュサーバの実装方式の検討〕
キャッシュサーバの実装方式として、次に示す二つの方式を検討する。
(1) 各APの内部にインメモリデータベースとして実装する方式
(2) 1台のNoSQLデータベースとして実装する方式
APのOSのスケジューラが5分間隔で、ITニュース一覧画面に表示する記事の一覧と、各記事に関連する記事の一覧のデータを更新する処理を起動する。(1)の場合、各AP上のプロセスが内部のキャッシュデータを更新する。(2)の場合、特定のAP上のプロセスがキャッシュデータを更新する。
なお、APのCPU使用率が高い場合、WebAPIの応答速度を優先するために、更新処理は行わない。
〔応答速度の試算〕
新システムにおける応答速度を試算するために、キャッシュサーバの二つの方式をそれぞれテスト環境に構築して、本番相当のテストデータを用いて処理時間を測定した。その結果を表4に示す。

インターネットを介した転送時間や Webブラウザ上の処理時間は掛からないと仮定して応答時間を考える。その場合、ITニュース一覧画面を初めて表示する場合の応答時間は、方式(1)では 180ms、方式(2)では c msである。ITニュース一覧画面のページを切り替える場合の応答時間は、方式(1)では 100ms、方式(2)では d msである。次に、記事をリクエストした際の応答時間を考える。
WebAPI “ITNewsDetail”の平均応答時間は、方式(1)では 156ms、方式(2)では e msである。
したがって、WebAPI “ITNewsHeadline”の呼び出しも含めた ITニュース記事画面を表示するための平均応答時間は、方式(1)ではfms、方式(2)では 285ms となる。
以上の試算から、方式(1)を採用することにした。
〔不具合の指摘と改修〕
ITシステムの方式(1)を採用した構成についてレビューを実施したところ、次の指摘があった。
(1) ITニュース記事画面での応答速度の不具合
ITニュース記事画面を生成するスクリプトが実際にインターネットを介して実行された場合、試算した応答速度より大幅に遅くなってしまうことが懸念される。
WebAPI g 内から、WebAPI h を呼び出すように処理を改修する必要がある。
(2) AP の CPU 使用率が高い状態が続いた場合の不具合
AP に処理が偏って CPU 使用率が高い状態が続いた場合、②ある画面の表示内容に不具合が出てしまう。
この不具合を回避するためには、各 AP の CPU 使用率を監視して、しきい値を超えた状態が一定時間以上続いた場合、AP をスケールアウトして負荷を分散させる仕組みをあらかじめ用意する。
(3) 関連する記事が取得できない不具合
関連する記事を見つける処理について、③現状の仕組みのままでは関連する記事が見つけられない。
Webサーバのアクセスログを解析する処理を、AP のアクセスログを解析する処理に改修する必要がある。
以上の指摘を受けて、必要な改修を行った結果、新システムをリリースできた。
設問1:〔新システムの方針〕について答えよ。
(1)本文中のaに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群
ア:CSS
イ:DOM
ウ:HREF
エ:Python
模範解答
a:ア
解説
解答の論理構成
- 【問題文】には「・aの機能を用いて、一つの Webサイトで全ての種類の端末に最適な画面を表示できるようにする。」とあります。
- 端末の画面サイズや解像度に応じてレイアウトを自動調整する仕組みは、一般に“レスポンシブ Web デザイン”と呼ばれます。
- レスポンシブ Web デザインを実現する中心技術は、メディアクエリなどを備えた「CSS(Cascading Style Sheets)」です。HTML 文書に対してスタイルを切り替えることで、同一 URL でも PC、タブレット、スマートフォンへ最適化した表示が可能になります。
- 選択肢のうち「ア:CSS」だけがこの要求を直接満たすため、a に入る適切な字句は「CSS」と判断できます。
誤りやすいポイント
- 「DOM」は文書構造の API であり、表示を制御するスタイル自体は持ちません。レスポンシブ対応には直接結び付きません。
- 「HREF」はリンク先 URL を示す属性で、画面レイアウト制御の機能はありません。
- 「Python」はサーバ側プログラミング言語で、クライアント側のスタイル切り替えには不向きです。
- “WebAPI” や “SPA” といったキーワードに引きずられ、サーバ側技術を選択してしまうミスが起きやすい点に注意が必要です。
FAQ
Q: CSS のどの機能で端末ごとの最適表示を行うのですか?
A: 一般的には @media ルール(メディアクエリ)を用い、画面幅・解像度・向きなどに応じてレイアウトやフォントサイズを切り替えます。
A: 一般的には @media ルール(メディアクエリ)を用い、画面幅・解像度・向きなどに応じてレイアウトやフォントサイズを切り替えます。
Q: JavaScript で画面サイズを判定する方法と比べて CSS を選ぶ利点は?
A: CSS だけで完結すればダウンロードすべきスクリプトが減り、レンダリングもブラウザ任せにできるためパフォーマンス面で有利です。またアクセシビリティの観点からも推奨されます。
A: CSS だけで完結すればダウンロードすべきスクリプトが減り、レンダリングもブラウザ任せにできるためパフォーマンス面で有利です。またアクセシビリティの観点からも推奨されます。
Q: SPA にしても CSS は必要ですか?
A: はい。SPA は画面遷移をスクリプトで制御しますが、個々のコンポーネントやページを見やすく調整するのは CSS の役割です。SPA と CSS は補完関係にあります。
A: はい。SPA は画面遷移をスクリプトで制御しますが、個々のコンポーネントやページを見やすく調整するのは CSS の役割です。SPA と CSS は補完関係にあります。
関連キーワード: CSS, レスポンシブデザイン, メディアクエリ, SPA
設問1:〔新システムの方針〕について答えよ。
(2)本文中のbに入れる適切な字句を答えよ。
模範解答
b:JSON
解説
解答の論理構成
- 【問題文】では、動的データの受け渡しについて「動的なデータは AP から WebAPI を通じて提供し、データ形式は各端末の Webブラウザ上で実行されるスクリプトが扱いやすいbとする。」と明記されています。
- 各端末(PC・タブレット・スマートフォン)の Webブラウザで直接扱いやすいデータフォーマットとして、現在もっとも一般的に用いられるのは JavaScript のオブジェクト表現そのものをテキスト化した JavaScript Object Notation です。
- JSON は
- JavaScript でネイティブに parse / stringify でき、追加ライブラリが不要
- 軽量かつ人間可読で、ネットワーク転送量を削減
- RESTful WebAPI や SPA のデファクトスタンダード
という特長を持ち、【新システムの方針】で掲げる「SPA (Single Page Application)」と「WebAPI」に最適合します。
- よって b に入る字句は「JSON」と判断できます。
誤りやすいポイント
- XML と迷う
- 旧来の Web サービスでは XML が多用されていたため、慣習的に選びがちです。しかし問題文は「Webブラウザ上で実行されるスクリプトが扱いやすい」と限定しており、パーサ不要で直接扱える JSON が適切です。
- CSV や YAML を想起する
- CSV は階層構造を表しにくく、YAML はブラウザネイティブではありません。SPA で複雑なオブジェクトをやり取りする前提と合致しません。
FAQ
Q: JSON はバイナリデータを扱えますか?
A: 直接は扱えませんが、Base64 などでエンコードすれば文字列として送受信可能です。画像は URL で参照させる設計なので問題ありません。
A: 直接は扱えませんが、Base64 などでエンコードすれば文字列として送受信可能です。画像は URL で参照させる設計なので問題ありません。
Q: JavaScript が苦手な端末でも JSON は利用できますか?
A: 問題文の対象は「Webブラウザ上で実行されるスクリプト」が動く端末です。モダンブラウザを前提にしているため JSON 解析機能は標準装備です。
A: 問題文の対象は「Webブラウザ上で実行されるスクリプト」が動く端末です。モダンブラウザを前提にしているため JSON 解析機能は標準装備です。
Q: JSON と同時にスキーマ定義は必要ですか?
A: 厳密なバリデーションが必要であれば JSON Schema を別途用意しますが、本問ではフォーマットのみが問われており、スキーマまでは求められていません。
A: 厳密なバリデーションが必要であれば JSON Schema を別途用意しますが、本問ではフォーマットのみが問われており、スキーマまでは求められていません。
関連キーワード: SPA, WebAPI, JSON, キャッシュサーバ, REST
設問1:〔新システムの方針〕について答えよ。
(3)表2中の下線①の方式にすることで、どのような記事がキャッシュサーバに格納されやすくなるか。15字以内で答えよ。
模範解答
参照回数の多い記事
解説
解答の論理構成
- 【問題文】表2の “ITNewsDetail” には「キャッシュするデータは①LFU方式で管理する。」とあります。
- 「LFU方式」は Least Frequently Used、すなわち“参照頻度が少ないデータを追い出し、参照頻度が高いデータを残す”アルゴリズムです。
- したがって、同方式を採用するとキャッシュ領域には参照頻度の高いデータが保持されやすくなります。
- このデータとは「ITニュース記事画面でアクセスされる記事」のことであり、頻繁に読まれる記事ほどキャッシュに残るため、
➡︎ 答え「参照回数の多い記事」と結論づけられます。
誤りやすいポイント
- LFU を LRU(最近使われた順)と取り違え、「最新の記事」や「直近に読まれた記事」と答えてしまう。
- 「キャッシュサーバに格納されやすい」を“登録時点”と誤解し、「新着記事」などと回答してしまう。
- 「参照回数=アクセス数」の理解不足で、単に「人気記事」と曖昧に書いて減点される。
FAQ
Q: LFU方式は常に最適ですか?
A: 高頻度アクセスが集中するニュースサイトのようなケースでは有効ですが、短期間に閲覧対象が急変する場合は LRU 等の方が効果的なこともあります。
A: 高頻度アクセスが集中するニュースサイトのようなケースでは有効ですが、短期間に閲覧対象が急変する場合は LRU 等の方が効果的なこともあります。
Q: “参照回数”はどのタイミングでカウントされますか?
A: WebAPI “ITNewsDetail” が呼び出された都度、当該記事の参照回数がインメモリデータベース上で更新されます。
A: WebAPI “ITNewsDetail” が呼び出された都度、当該記事の参照回数がインメモリデータベース上で更新されます。
Q: キャッシュ容量を超えた場合はどうなりますか?
A: LFUに基づき最も参照回数の少ない記事データが逐次削除され、新しいデータが格納されます。
A: LFUに基づき最も参照回数の少ない記事データが逐次削除され、新しいデータが格納されます。
関連キーワード: LFU方式, キャッシュアルゴリズム, インメモリデータベース, 参照頻度, WebAPI
設問2:
本文中のc~fに入れる適切な数値を答えよ。
模範解答
c:280
d:200
e:138
f:246
解説
解答の論理構成
-
ITニュース一覧画面 ― 初回表示
- 測定結果 No.1「“80ms”」+ No.2 方式(2)「“200ms”」
- よって → c は 280
-
ITニュース一覧画面 ― ページ切替
- ページ切替時は HTML などを再取得しないので No.2 方式(2)「“200ms”」のみ
- よって d は 200
-
WebAPI “ITNewsDetail” の平均応答時間
- キャッシュヒット率 No.3 方式(2)「“90%”」
- ヒット時時間 No.4 方式(2)「“120ms”」
- ミス時時間 No.5「“300ms”」
- 平均
- よって e は 138
-
ITニュース記事画面 ― 平均応答時間
- “ITNewsDetail” 平均 138ms
- “ITNewsHeadline” は 6 件、No.6 方式(1)「“15ms”」より方式(1)は ms
- 方式(1): → f は 246
誤りやすいポイント
- No.1 の “80ms” をページ切替時にも加算してしまう
- ヒット率を百分率でなく小数で計算し、 のように掛けてしまう
- “ITNewsHeadline” が 6 件であること(表2 で「6件」)を見落とす
- 方式(1) と 方式(2) の測定値を混在させ、平均を誤る
FAQ
Q: 「ITNewsDetail」の平均を計算する際、ヒットとミスの時間以外のオーバーヘッドは考慮しないのですか?
A: 問題文に示された測定結果 No.4 と No.5 が「全て転送するまでの時間」と明記されているため、これらをそのまま加重平均します。
A: 問題文に示された測定結果 No.4 と No.5 が「全て転送するまでの時間」と明記されているため、これらをそのまま加重平均します。
Q: ページ切替時に HTML の再転送が不要になる根拠は?
A: SPA 構成で「HTML、スクリプトなどのファイルは Webサーバに配置する」とあり、初回取得後はブラウザ内で画面を切替えるためです。
A: SPA 構成で「HTML、スクリプトなどのファイルは Webサーバに配置する」とあり、初回取得後はブラウザ内で画面を切替えるためです。
Q: “ITNewsHeadline” を並列呼び出しできるのでは?
A: 問題では「WebAPI の応答時間を足し上げて算出する」形式で示されており、並列実行による短縮は前提にしていません。
A: 問題では「WebAPI の応答時間を足し上げて算出する」形式で示されており、並列実行による短縮は前提にしていません。
関連キーワード: SPA, キャッシュヒット率, 加重平均, WebAPI, インメモリデータベース
設問3:〔不具合の指摘と改修〕について答えよ。
(1)本文中のg、hに入れる適切な字句を、表2中のWeb API名の中から答えよ。
模範解答
g:ITNewsDetail
h:ITNewsHeadline
解説
解答の論理構成
- 【問題文】の表3には、
「ITニュース記事」画面のスクリプトは
「表示させたい記事の記事番号を指定して WebAPI “ITNewsDetail” を呼び出し、…次に…一つずつ指定して WebAPI “ITNewsHeadline” を呼び出し…」
と記載されています。 - つまりブラウザは 1 画面表示のたびに 1 回の “ITNewsDetail” + 6 回の “ITNewsHeadline” をインターネット越しに発行しており、往復遅延が累積します。
- 指摘(1)では「インターネットを介して実行された場合、試算した応答速度より大幅に遅くなる」とし、解決策として
「WebAPI g 内から、WebAPI h を呼び出すように改修」とあります。
これは「ブラウザ → AP へのリクエスト数を 1 件に集約し、関連見出し取得をサーバ側で完結させよ」という意味です。 - サーバ側で関連記事の見出しを集約する主体は「対象記事のデータを返す」役割を持つ “ITNewsDetail” です。
一方、集約対象となる「関連する記事1件分の画像のURLと見出し」を返すAPIは “ITNewsHeadline” です(表2を参照)。 - よって
g=ITNewsDetail
h=ITNewsHeadline
が最適解となります。
誤りやすいポイント
- “ITNewsHeadline” をブラウザが呼ぶ仕様が表3にあるため、「g に ITNewsHeadline」と思い込みやすい。改修後は逆転する点に注意。
- 表2の説明文で “ITNewsDetail” に「関連する記事の記事番号のリストを返す」とあることを読み飛ばすと、どちらが呼び出し元か判断できなくなる。
- 「呼び出す側/呼び出される側」を混同しがち。呼び出し“内”に入るのは常に“上位”の業務 API。
FAQ
Q: なぜ “ITNewsDetail” が呼び出し元と判断できるのですか?
A: 表2に「本文内に表示する画像のURL、関連する記事の記事番号のリストを返す」とあり、関連情報の統合役を担う設計だからです。ここに “ITNewsHeadline” の結果を組み込めばブラウザは1回の呼び出しで済みます。
A: 表2に「本文内に表示する画像のURL、関連する記事の記事番号のリストを返す」とあり、関連情報の統合役を担う設計だからです。ここに “ITNewsHeadline” の結果を組み込めばブラウザは1回の呼び出しで済みます。
Q: “ITNewsHeadline” を廃止して完全に不要にできませんか?
A: 既存モジュールの再利用を優先しているため、内部呼び出し部品として残します。将来 API を整理する際に統合を検討するのが現実的です。
A: 既存モジュールの再利用を優先しているため、内部呼び出し部品として残します。将来 API を整理する際に統合を検討するのが現実的です。
Q: この改修でキャッシュヒット率に影響はありますか?
A: “ITNewsHeadline” の呼び出し自体は同じですが、AP 内部呼び出しになるためネットワーク遅延が減少し、キャッシュの仕組み(①LFU方式)はそのまま機能します。
A: “ITNewsHeadline” の呼び出し自体は同じですが、AP 内部呼び出しになるためネットワーク遅延が減少し、キャッシュの仕組み(①LFU方式)はそのまま機能します。
関連キーワード: SPA, キャッシュ戦略, API集約, レスポンス最適化, 関係データベース
設問3:〔不具合の指摘と改修〕について答えよ。
(2)本文中の下線②にある不具合とは何か。35字以内で答えよ。
模範解答
ITニュース一覧と各記事に関連する記事の一覧が更新されない。
解説
解答の論理構成
- 問題文ではキャッシュ更新の仕組みとして
「"AP の OS のスケジューラが 5 分間隔で、ITニュース一覧画面に表示する記事の一覧と、各記事に関連する記事の一覧のデータを更新する処理を起動する。」と記載されています。 - さらに同じ段落で
「"なお、AP の CPU 使用率が高い場合、WebAPI の応答速度を優先するために、更新処理は行わない。」との条件があります。 - つまり CPU 使用率が高い状態が続くと、5 分ごとの更新処理がスキップされ、キャッシュ内の
・「"ITニュース一覧画面に表示する記事の一覧"」
・「"各記事に関連する記事の一覧"」
が古いままになります。 - 〔不具合の指摘と改修〕(2) では
「"AP に処理が偏って CPU 使用率が高い状態が続いた場合、②ある画面の表示内容に不具合が出てしまう。」と述べられています。 - この“ある画面”とは、前述の更新対象である「ITニュース一覧」および「各記事に関連する記事の一覧」を表示する画面です。CPU 高負荷で更新が実行されないため “更新されない” という不具合が発生します。
- 以上より回答は「ITニュース一覧と各記事に関連する記事の一覧が更新されない。」となります。
誤りやすいポイント
- 「WebAPI がタイムアウトする」と勘違いし、表示内容ではなく応答時間の不具合と答えてしまう。
- 更新対象が “記事本文” だと思い込み、本文が古くなると記述してしまう。問題文で更新対象は「記事の一覧」「関連する記事の一覧」に限定。
- 方式(2) の集中キャッシュと混同し、「NoSQL が単点故障になる」といった対策面を不具合として書いてしまう。
FAQ
Q: CPU 使用率が高い場合でも強制的に更新した方が良いのでは?
A: WebAPI の応答速度を優先する要件があるため、優先度の低い更新処理はスキップする設計です。ただし負荷分散(スケールアウト)で回避する仕組みを追加します。
A: WebAPI の応答速度を優先する要件があるため、優先度の低い更新処理はスキップする設計です。ただし負荷分散(スケールアウト)で回避する仕組みを追加します。
Q: 「関連する記事の一覧」は ITNewsDetail のレスポンスとは別なのですか?
A: 更新処理で用意するのは一覧用データです。詳細画面用の「ITNewsDetail」でキャッシュが miss した場合は個別にキャッシュします。
A: 更新処理で用意するのは一覧用データです。詳細画面用の「ITNewsDetail」でキャッシュが miss した場合は個別にキャッシュします。
Q: 方式(1) のキャッシュが更新されないと一覧以外に影響はありますか?
A: 主に一覧系の画面が最新状態でなくなるだけで、記事本文自体は要求時に個別キャッシュされるため影響しにくい構成です。
A: 主に一覧系の画面が最新状態でなくなるだけで、記事本文自体は要求時に個別キャッシュされるため影響しにくい構成です。
関連キーワード: キャッシュ更新, CPU負荷, スケジューラ, スケールアウト, インメモリデータベース
設問3:〔不具合の指摘と改修〕について答えよ。
(3)本文中の下線③の理由を、40字以内で答えよ。
模範解答
記事間の遷移がWebサーバのアクセスログのURLでは解析できないから
解説
解答の論理構成
-
現状の関連記事抽出方法
– 問題文には「各WebサーバのアクセスログをRDBに取り込み、URL中の記事番号を用いたアクセス解析をRDB上のストアドプロシージャによって行っている。」とある。
– つまりアクセスログの URL に含まれる記事番号 が解析の鍵になっている。 -
新システムへの変更点
– 新方針では「AP での動的な HTML の生成処理を行わない、SPA (Single Page Application) の構成にする。」
– SPA では Web サーバは HTML やスクリプトなどの静的ファイルのみを返却し、記事データ取得は WebAPI が担当する。 -
変更による影響
– ブラウザが記事を閲覧する際に呼び出すのは WebAPI “ITNewsDetail” であり、その URL は Web サーバではなく AP が受け取る。
– 従って Web サーバのアクセスログには 記事番号を含む URL が記録されなくなる。 -
結論
– 記事番号が含まれないため「記事間の遷移がWebサーバのアクセスログのURLでは解析できない」。これが下線③の理由である。
誤りやすいポイント
- 「SPA でも URL は変化するから解析できる」と誤解しやすい
SPA の画面遷移はフロント側のスクリプトが制御するため、サーバに HTTP リクエストが飛ばないケースが多い。 - 「AP のログも取り込んでいる」と思い込む
現状の仕組みは Web サーバのログしか対象にしていないと明示されている。 - 「静的ページにも記事番号が残る」と勘違いする
記事本文は動的データとして WebAPI で配信されるため、静的ファイルの URL に記事番号は含まれない。
FAQ
Q: SPA でもブラウザのアドレスバーは記事番号付き URL になりませんか?
A: ハッシュや pushState で表示 URL が変わることはありますが、ブラウザがサーバへ新規リクエストを送らない場合は Web サーバのアクセスログには記録されません。
A: ハッシュや pushState で表示 URL が変わることはありますが、ブラウザがサーバへ新規リクエストを送らない場合は Web サーバのアクセスログには記録されません。
Q: なぜ AP のアクセスログ解析に改修するだけで解決できるのですか?
A: 記事データを配信する WebAPI “ITNewsDetail” を受けるのは AP なので、AP のアクセスログには確実に記事番号付きのリクエストが残り、従来と同じロジックで解析できます。
A: 記事データを配信する WebAPI “ITNewsDetail” を受けるのは AP なので、AP のアクセスログには確実に記事番号付きのリクエストが残り、従来と同じロジックで解析できます。
Q: Web サーバ側でリバースプロキシを使えばログ解析は続行できますか?
A: 可能ではありますが、AP で直接取得した方が余分な転送や設定を省け、ログに必要な情報も揃っているため、問題文では AP 側への移行を選択しています。
A: 可能ではありますが、AP で直接取得した方が余分な転送や設定を省け、ログに必要な情報も揃っているため、問題文では AP 側への移行を選択しています。
関連キーワード: SPA, アクセスログ解析, キャッシュサーバ, LFU, WebAPI


