FUNDAMENTAL IT ENGINEER

基本情報技術者 合格ラボ

科目Aも科目Bも、読んでから解く。

シラバスVer.9.2対応|講義60本+問題560問|科目A 90分60問・科目B 100分20問・どちらも600点で合格

卒業 0/0 苦手 0 スタンプ 0

🎯 合格までの到達度

基本情報技術者は科目A・科目Bのどちらも1000点満点中600点以上で合格(IRT採点)。片方だけ良くても受かりません。本試験の出題数は科目Aがテクノロジ41問・マネジメント7問・ストラテジ12問、科目Bがアルゴリズムとプログラミング16問・情報セキュリティ4問。科目Aの3分野に個別の基準点はありませんが、テクノロジ系だけで6割強を占めるので落とせません。金色の線が6割の目安です。

※ 解説は学習用の情報提供です。最新の出題範囲・制度は必ずIPAの公式発表をご確認ください。

1/10
N

RESULT
0 /10問正解

💾 資格バッジ図鑑

2回正解で卒業=獲得。

レアリティ:N 基本 / R 一歩ふみこみ / SR 実務・判例 / SSR 知ってたら自慢

今日の学習スタンプ

今日、基本情報の勉強をした——1問だけでもOK、続けることが合格への近道。
ルールは「知ってる」より「守れた」が偉い。30個で台紙コンプリート!

📖 まず学ぶ(講義)

前知識ゼロからでも読めるように書いています。

📚 講義の全文(60本)

基本情報技術者対策 の講義60本を、そのまま読める形で置いています。アプリを起動しなくても、ここだけで内容を確かめられます。各見出しを開くと、本文・用語・図表・例題・出典が出ます。

基礎理論

2進数・補数・シフト演算

コンピュータが数をどう保持しているのかを、基数変換・負数の表し方・シフト演算の3点で押さえます。

コンピュータは電圧の高低しか区別できないので、数はすべて0と1の並び(2進数)で持ちます。人間が読むときは桁数が長くなりすぎるため、2進数4桁をちょうど1桁にまとめられる16進数(0〜9とA〜F)や、3桁を1桁にまとめられる8進数がよく使われます。10進数から2進数への変換は「2で割って余りを下から並べる」、2進数から10進数への変換は「各桁の重み(…8, 4, 2, 1)を足す」が基本です。小数部は逆に「2を掛けて整数部を上から並べる」で求めます。

負の数は、符号ビットを別に持つ方法もありますが、実際の計算機はほとんど2の補数を使います。2の補数は「全ビットを反転して1を加える」で作れ、加算回路だけで減算もできるという大きな利点があります。ビット数がnなら表せる範囲は −2^(n−1) 〜 2^(n−1)−1 で、負のほうが1つ多いのが特徴です。全ビットを反転しただけのものは1の補数で、0の表現が+0と−0の2通りできてしまうため現在はあまり使われません。

シフト演算は、ビット列を左右にずらす操作です。左に1ビットずらすと値は2倍、右に1ビットずらすと1/2になります。ここで大事なのが論理シフトと算術シフトの違いで、論理シフトは空いた上位ビットに必ず0を入れます(符号なし整数向け)。算術シフトは右シフトのとき符号ビットと同じ値を上位に入れる(符号拡張)ため、負の数を右にずらしても負のままです。2の補数の算術右シフトは「マイナス方向への切捨て(床関数)」になる点に注意してください。

10進数を2進数・16進数に変換する手順

10進数 105 を 2 で割り続ける(余りを下から読む)

  105 ÷ 2 = 52 ... 1   ← 最下位ビット
   52 ÷ 2 = 26 ... 0
   26 ÷ 2 = 13 ... 0
   13 ÷ 2 =  6 ... 1
    6 ÷ 2 =  3 ... 0
    3 ÷ 2 =  1 ... 1
    1 ÷ 2 =  0 ... 1   ← 最上位ビット

  下から並べて  1101001(2)  = 105(10)
  4桁ずつ区切って 0110 1001 → 69(16)
10進数・2進数・8進数・16進数の対応(0〜15)
10進2進(4桁)8進16進
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
基数
位取り記数法で1桁が何種類の値を取れるかを示す数。10進数なら10、2進数なら2、16進数なら16。各桁の重みは基数のべき乗になり、右からn桁目の重みは基数の(n−1)乗で表される。
2の補数
nビットで負数を表す方式。ある値の全ビットを反転して1を加えたものが、その値の符号を反転した表現になる。減算を加算回路で実現でき、0の表現が1通りに定まるため現在の計算機で標準的に用いられる。
1の補数
全ビットを反転しただけの表現。2の補数から1を引いた値に相当する。+0(全ビット0)と−0(全ビット1)という2通りのゼロが生じ、加算時に桁上がりを最下位へ回り込ませる処理が必要になるため扱いにくい。
論理シフト
ビット列全体を左右にずらし、空いた側には常に0を詰めるシフト。符号を考えない符号なし整数やビットパターンの操作に使う。右へkビットの論理シフトは、符号なし整数を2のk乗で割った商に等しい。
算術シフト
符号ビットを保ったままずらすシフト。右シフトでは空いた上位ビットに符号ビットと同じ値を詰める(符号拡張)ため、負の数は負のまま値が1/2になる。2の補数では商を小さいほうへ切り捨てる動きになる。

例題 8ビットの2の補数表現で −45 はどう書くか。

45 は 00101101。全ビットを反転すると 11010010(これが1の補数)、1を足して 11010011 が2の補数表現。検算として 00101101 + 11010011 = 1 00000000 となり、8ビットに収まる部分が0になるので正しい。

例題 8ビットの2の補数 11010110 を算術右シフトで2ビットずらすとどうなるか。

11010110 は −42。算術右シフトは上位に符号ビット1を詰めるので 11110101 となり、値は −11。−42 ÷ 4 = −10.5 を小さいほうへ切り捨てた値である。論理右シフトなら 00110101(= 53)となり、まったく違う結果になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類1:基礎理論(離散数学)

小数の表現と誤差

固定小数点と浮動小数点の違い、IEEE 754の考え方、そして計算で必ず出てくる4種類の誤差を区別できるようにします。

小数の持ち方には2通りあります。固定小数点数は「小数点の位置をあらかじめ決めておく」方式で、たとえば16ビットのうち下位8ビットを小数部と決めれば、分解能は1/256 = 0.00390625 に固定されます。整数演算とほぼ同じ回路で計算でき高速ですが、扱える値の幅が狭いのが弱点です。浮動小数点数は「符号・指数部・仮数部」に分けて、値を ±仮数 × 基数^指数 の形で持ちます。広い範囲の数を同じビット数で表せる代わりに、有効数字の桁数には限りがあります。

現在ほとんどの処理系が採用しているのがIEEE 754です。単精度(32ビット)は符号1ビット・指数部8ビット・仮数部23ビット、倍精度(64ビット)は符号1ビット・指数部11ビット・仮数部52ビットに分かれます。指数部は負の指数も表せるようゲタばき(バイアス)表現になっていて、単精度のバイアスは127です。正規化された数では仮数の先頭は必ず1になるので、その1は記憶せず省略します(けち表現)。したがって仮数部23ビットでも実質24ビットぶんの精度が得られます。

誤差は4つを区別できれば十分戦えます。丸め誤差は表現できる桁数を超えた部分を切り捨て・切上げ・四捨五入することで生じる誤差で、10進数の0.1が2進数では循環小数になるため、有限桁では正確に表せないのが典型例です。打切り誤差は無限級数や反復計算を有限回で止めることで生じます。桁落ちはほぼ等しい2数の差を取ったときに有効桁数が激減する現象、情報落ちは絶対値が極端に違う2数を加減算したときに小さいほうが結果に反映されない現象です。加算はなるべく絶対値の小さいものから行う、といった対策が有効です。

IEEE 754 単精度のビット配分と読み方

IEEE 754 単精度(32ビット)の並び

  [S][   E(8)   ][         M(23)          ]
   1     8ビット          23ビット

  例)  0 10000010 10100000000000000000000

  符号 S = 0        → 正
  指数 E = 10000010 → 130、バイアス127を引いて 3
  仮数 M = 101...   → けち表現の1を戻して 1.101(2) = 1.625

  値 = +1.625 × 2^3 = 13.0
4種類の誤差の比較
誤差いつ起きるか典型例主な対策
丸め誤差表せる桁数を超えた部分を丸めたとき10進0.1を2進浮動小数点で表す精度の高い型を使う/整数や10進型で持つ
打切り誤差無限の計算を有限回で止めたとき級数の計算を第n項で止める項数・反復回数を増やす
桁落ちほぼ等しい2数の差を取ったとき1.234567 − 1.234566式変形して差の計算を避ける
情報落ち絶対値が極端に違う2数を加減算したとき10^8 + 10^-8絶対値の小さい順に加算する
固定小数点数
小数点の位置をビット列のどこか一箇所に固定して小数を表す方式。整数演算とほぼ同じ回路で処理でき高速だが、表現できる値の範囲と分解能があらかじめ決まってしまうため、極端に大きい値や小さい値は扱えない。
浮動小数点数
値を符号・指数部・仮数部に分け、±仮数×基数^指数 の形で表す方式。同じビット数で非常に広い範囲の値を表せるが、有効桁数は仮数部の長さで頭打ちになるため、演算のたびに丸め誤差が入りうる。
けち表現(ケチ表現)
正規化した浮動小数点数の仮数は必ず 1.xxx の形になるので、先頭の1をビットとして記憶しない工夫。IEEE 754の正規化数で使われ、単精度では仮数部23ビットで実質24ビットぶんの精度が得られる。
桁落ち
値がほぼ等しい2つの数の差を求めたときに、上位の桁が打ち消し合って有効桁数が大幅に減ってしまう現象。式を変形して差の計算を避ける(有理化するなど)ことで回避できる場合が多い。
情報落ち
絶対値の差が非常に大きい2数を加減算したとき、小さいほうの値の下位桁が丸められて結果にまったく反映されなくなる現象。多数の値を合計するときは絶対値の小さいものから順に足すと影響を減らせる。
打切り誤差
無限に続く級数や、収束するまで繰り返す反復計算を、有限の項数・回数で打ち切ることによって生じる誤差。計算量と精度のトレードオフであり、打切り条件を厳しくすれば小さくなるが計算時間は増える。

例題 16ビットの固定小数点数(2の補数、下位8ビットが小数部)で表せる最小の値は。

整数として見ると2の補数16ビットなので −32768 〜 32767。これを 2^8 = 256 で割ると −128.0 〜 127.99609375 になる。したがって最小値は −128.0、分解能(隣り合う値の差)は 1/256 = 0.00390625。

例題 なぜ 0.1 + 0.2 が 0.3 とぴったり一致しないのか。

0.1 も 0.2 も2進数では循環小数になり、有限ビットの仮数部では正確に表せないため、格納した時点ですでに丸め誤差を含んでいる。その和も0.3の最も近い表現とはわずかにずれるので、浮動小数点数どうしは等号ではなく差の絶対値が十分小さいかで比較する。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類1:基礎理論(離散数学)/IEEE 754(二進浮動小数点数演算標準)

論理演算・集合・BNF

AND/OR/XORの使い分け、ド・モルガンの法則、集合の数え上げ、そしてBNFと逆ポーランド記法の読み方をまとめます。

論理演算は真(1)と偽(0)に対する演算です。論理積ANDは両方1のときだけ1、論理和ORはどちらかが1なら1、否定NOTは反転、排他的論理和XORは2つが異なるときだけ1になります。ビット列に対して同じ演算を桁ごとに行うのがビット演算で、実務では「AND は必要なビットだけ残すマスク」「OR は特定のビットを1にする」「XOR は特定のビットを反転する」という使い分けが基本形です。XOR は同じ値を2回適用すると元に戻る(A XOR B XOR B = A)性質があり、簡易な暗号化やスワップにも使われます。

ド・モルガンの法則は「not(A and B) = (not A) or (not B)」「not(A or B) = (not A) and (not B)」の2本です。否定を内側に入れるとANDとORが入れ替わる、と覚えます。集合でも同じ形が成り立ち、補集合を取ると積集合と和集合が入れ替わります。集合の数え上げでは包除原理が頻出で、2つなら |A∪B| = |A| + |B| − |A∩B|、3つなら |A∪B∪C| = |A| + |B| + |C| − |A∩B| − |B∩C| − |C∩A| + |A∩B∩C| です。足しすぎた重なりを引き、引きすぎた3重の重なりを足し戻す、という構造になっています。

BNF(バッカス・ナウア記法)は言語の構文を定義する記法で、「::=」の左に定義する構文要素、右にその中身を書き、「|」で選択肢を並べます。自分自身を右辺に含める再帰的な定義によって、任意の長さの並びを表現できるのが特徴です。逆ポーランド記法(後置記法)は演算子をオペランドの後ろに書く方式で、括弧が一切要らないという利点があります。評価はスタックを使い、オペランドは積み、演算子が来たら上から2つ取り出して計算し結果を積み直します。取り出す順番に注意し、先に取り出したほうが右側のオペランドです。

BNFの書き方と、逆ポーランド記法への変換・評価

BNF による定義の例

  <数字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  <英字> ::= a | b | c
  <名前> ::= <英字> | <名前> <英字> | <名前> <数字>

逆ポーランド記法(後置記法)の例

  中置  (a + b) * (c - d)
  後置  a b + c d - *

  評価  8 3 2 - * 4 +
        → 3 2 - = 1、8 * 1 = 8、8 + 4 = 12
基本的な論理演算の真理値表
ABA AND BA OR BA XOR BNOT A
000001
010111
100110
111100
排他的論理和(XOR)
2つの入力が異なるときだけ1になる論理演算。同じ値で2回適用すると元に戻るため、特定ビットの反転や簡易な暗号化に使われる。A XOR A = 0、A XOR 0 = A という性質も頻出。
ド・モルガンの法則
否定を分配するとANDとORが入れ替わるという法則。not(A and B) = (not A) or (not B)、not(A or B) = (not A) and (not B)。集合では補集合を取ると積集合と和集合が入れ替わる形で現れる。
包除原理
複数の集合の和集合の要素数を求める考え方。単純に足すと重複部分を数えすぎるので引き、3つ以上では引きすぎた分を足し戻す。2集合なら |A∪B| = |A|+|B|−|A∩B| となる。
BNF
プログラミング言語などの構文を形式的に定義する記法。「::=」の左辺に構文要素、右辺にその定義を書き、「|」で選択肢を並べる。右辺に自分自身を含む再帰的定義によって、任意長の並びを有限の規則で表せる。
逆ポーランド記法
演算子をオペランドの後ろに書く後置記法。演算の順序が並びだけで決まるため括弧が不要で、スタックを使って左から一度読むだけで評価できる。コンパイラの式の評価やスタックマシンで使われる。

例題 2進数 10110011 の下位4ビットだけを反転したい。どうすればよいか。

反転したいビットを1にしたマスク 00001111 とのXORを取る。10110011 XOR 00001111 = 10111100。ANDならビットを0にするマスク、ORならビットを1にするマスクになるので、反転にはXORを使う。

例題 逆ポーランド記法「5 2 + 3 4 * -」の値は。

左から読む。5、2を積み、+ で 7。3、4を積み、* で 12。最後の - はスタック上位2つを取り出し、先に取り出した12が右側になるので 7 − 12 = −5。取り出す順番を逆にすると符号を間違えるので注意。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類1:基礎理論(離散数学)

確率・統計と待ち行列

場合の数・条件付き確率・期待値・ばらつきの指標に加えて、性能計算で必ず出るM/M/1の待ち行列を使えるようにします。

場合の数は「順序を区別するか」で決まります。区別するのが順列 nPr = n!/(n−r)!、区別しないのが組合せ nCr = n!/{r!(n−r)!} です。委員を選ぶ、チームを作るといった問題は組合せ、並べる・役職を割り当てるは順列になります。確率では条件付き確率が重要で、Bが起きたという条件のもとでAが起きる確率は P(A|B) = P(A∩B)/P(B) です。原因の確率を結果から逆算するベイズの定理は、この式を分母の全確率で書き直したものにすぎません。期待値は「値×確率」をすべて足したもので、確率の合計が1になっているかを必ず確かめます。

データのばらつきは分散と標準偏差で測ります。分散は偏差(各値−平均)の2乗の平均、標準偏差はその平方根で、元のデータと単位がそろうぶん解釈しやすくなります。ここで注意したいのが割る数で、手元のデータ全体そのものを対象とする母分散は偏差平方和をnで割り、標本から母集団を推定する不偏分散はn−1で割ります。問題文にどちらか明記されていなければ答えが2通りになってしまうため、試験問題では必ず指定されます。代表値は平均値・中央値・最頻値の3つで、極端に大きな外れ値があると平均だけが引っ張られるのが特徴です。

待ち行列理論のM/M/1は、到着がポアソン分布(到着間隔が指数分布)、サービス時間が指数分布、窓口が1つのモデルです。平均到着率λと平均サービス時間Tsから利用率ρ=λ×Tsを求め、平均待ち時間 Tw = ρ/(1−ρ)×Ts、平均応答時間 Tq = Tw + Ts = Ts/(1−ρ) を計算します。要はρ/(1−ρ)という倍率が効いていて、ρが0.5なら待ち時間はサービス時間と同じ、0.8なら4倍、0.9なら9倍と、利用率が1に近づくほど爆発的に増えるのがこのモデルの主張です。ρ≧1では行列が発散し、定常状態が存在しません。

待ち行列M/M/1でよく使う公式一式

M/M/1 モデルの公式

  λ  : 平均到着率(単位時間あたりの到着件数)
  Ts : 平均サービス時間

  利用率      ρ  = λ × Ts        (0 ≦ ρ < 1)
  平均待ち時間 Tw = ρ / (1 − ρ) × Ts
  平均応答時間 Tq = Tw + Ts = Ts / (1 − ρ)
  平均待ち人数 Lq = ρ^2 / (1 − ρ)
  平均系内人数 L  = ρ / (1 − ρ)
代表値・散布度と待ち行列の指標
指標求め方特徴・注意点
平均値全データの合計 ÷ 個数外れ値に強く引っ張られる
中央値小さい順に並べた中央の値外れ値の影響を受けにくい
最頻値最も多く現れる値分布が平坦だと定まりにくい
母分散偏差の2乗の合計 ÷ nデータ全体そのものを対象にする場合
不偏分散偏差の2乗の合計 ÷ (n−1)標本から母集団の分散を推定する場合
利用率ρ平均到着率λ × 平均サービス時間Ts1以上では行列が発散する
平均待ち時間Twρ/(1−ρ) × Tsサービス時間を含まない待ち時間
平均応答時間TqTs/(1−ρ)(=Tw+Ts)待ち時間+サービス時間
条件付き確率
事象Bが起きたと分かっている状況で事象Aが起きる確率。P(A|B) = P(A∩B) / P(B) で定義される。結果から原因の確率を求めるベイズの定理は、この分母を全確率の公式で展開した形になっている。
期待値
確率変数が取りうる値に、それぞれの確率を掛けて合計した値。長期間繰り返したときの1回あたりの平均に相当する。計算前に確率の合計が1になっているかを確かめるのが検算の基本になる。
標準偏差
分散の正の平方根で、データのばらつきの大きさを元のデータと同じ単位で表した指標。母集団そのものを扱う母分散は偏差平方和をnで割り、標本から母集団を推定する不偏分散はn−1で割る点が異なる。
相関係数
2つの変数の直線的な関係の強さを −1 以上 1 以下で表す指標。絶対値が1に近いほど直線関係が強く、0に近いほど直線的な関係が弱い。値が大きくても因果関係があることは意味しない。
M/M/1待ち行列
到着がポアソン分布、サービス時間が指数分布、窓口が1つのモデル。利用率ρ=平均到着率×平均サービス時間で、平均待ち時間はρ/(1−ρ)×サービス時間。ρが1に近づくと待ち時間は急激に増大する。
ニュートン法
方程式 f(x)=0 の近似解を求める反復解法。現在の近似値における接線とx軸の交点を次の近似値とする操作を繰り返す。収束が速い一方、初期値や関数の形によっては収束しないことがある。

例題 平均サービス時間20ミリ秒、平均到着率が毎秒40件のとき、平均待ち時間は。

ρ = 40 × 0.020 = 0.8。Tw = 0.8/(1−0.8) × 20 = 4 × 20 = 80ミリ秒。サービス時間を含む平均応答時間は 80 + 20 = 100ミリ秒なので、どちらを問われているかを必ず読み分ける。

例題 工場Aが全体の60%を作り不良率2%、工場Bが40%を作り不良率5%。取り出した1個が不良品だったとき、それが工場A製である確率は。

不良品である確率は 0.6×0.02 + 0.4×0.05 = 0.012 + 0.020 = 0.032。求める条件付き確率は 0.012 ÷ 0.032 = 0.375。生産量の多いAより、不良率の高いBのほうが不良品全体では多くなる点が直感とずれやすい。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類1:基礎理論(応用数学)

情報理論と通信・制御

情報量と符号化、誤り検出訂正、文字コード、AIの基礎、そして標本化定理とフィードバック制御までを横断します。

情報量の単位はビットで、n通りの状態を区別するには log2(n) を切り上げたビット数が必要です。たとえば5000種類のコードなら 2^12 = 4096 では足りず、2^13 = 8192 なので13ビット必要になります。各記号の生起確率が異なる場合、1記号あたりの平均情報量(エントロピー)は −Σ p log2(p) で求められ、これが理論上の圧縮限界を与えます。出現頻度の高い記号に短い符号を割り当てるハフマン符号のような可変長符号化は、この限界に近づける工夫です。

通信路では必ず誤りが起きるので、検出と訂正の仕組みが要ります。パリティチェックは1ビットの冗長ビットを付け、1の個数の偶奇で1ビット誤り(正確には奇数個の誤り)を検出しますが、2ビット誤りは見逃し、訂正もできません。CRCは生成多項式による除算の余りを付加する方式で、連続して発生するバースト誤りに強く、通信やストレージで広く使われます。ハミング符号は複数のパリティビットを組み合わせて誤った位置まで特定でき、1ビットの誤り訂正が可能です。一般に、符号の最小ハミング距離がdなら d−1 ビットの誤り検出、⌊(d−1)/2⌋ ビットの誤り訂正ができます。

文字コードでは、ASCIIが英数字と記号を7ビットで表す基礎、日本語向けにシフトJISやEUC-JPが作られ、世界中の文字を単一の文字集合にまとめたのがUnicodeです。Unicodeを実際のバイト列にする符号化方式のひとつがUTF-8で、1文字を1〜4バイトの可変長で表し、ASCII範囲の文字は1バイトのままなので既存のASCIIと互換性があります。AI分野では、正解ラベル付きデータから予測規則を学ぶ教師あり学習、ラベルなしデータから構造を見つける教師なし学習、報酬を最大化する行動を試行錯誤で学ぶ強化学習の3分類が基本です。訓練データにだけ過剰に適合して未知のデータで精度が落ちる状態を過学習といいます。

アナログの世界とつなぐのが標本化・量子化・符号化の3段階です。標本化定理(シャノンの定理)は、信号に含まれる最高周波数の2倍以上の周波数で標本化すれば元の信号を復元できると述べます。最高20kHzなら40kHz以上が必要です。量子化ビット数を上げれば量子化誤差は小さくなりますがデータ量は増えます。制御ではフィードバック制御が基本で、制御対象の出力をセンサで測って目標値と比べ、その差(偏差)が小さくなるように操作量を決めます。あらかじめ決めた順序で進めるシーケンス制御や、外乱を先読みして補正するフィードフォワード制御と区別してください。

有限オートマトンを状態遷移表で表した例

オートマトンの状態遷移表
(入力は 0 と 1、開始状態 S0、受理状態 S2)

        入力0   入力1
  S0      S0      S1
  S1      S2      S1
  S2      S2      S2

  文字列 "110" : S0 →1→ S1 →1→ S1 →0→ S2  受理
  文字列 "001" : S0 →0→ S0 →0→ S0 →1→ S1  非受理
主な誤り検出・訂正方式の比較
方式付加する情報検出できる誤り訂正
パリティチェック1ビット奇数個のビット誤り(2ビット誤りは見逃す)不可
水平垂直パリティ行と列のパリティ1ビット誤りの位置を特定できる1ビット可
チェックサム総和の下位ビット多くの誤りを検出(順序入替えには弱い)不可
CRC生成多項式による除算の余りバースト誤りに強い不可
ハミング符号複数のパリティビット単独検出なら3ビットまで、1ビット訂正と同時なら2ビットまで検出(最小距離4の場合)1ビット可
エントロピー(平均情報量)
各記号の生起確率をpとしたとき −Σ p log2(p) で求まる、1記号あたりの平均的な情報量。値が大きいほど予測しにくく、圧縮しても縮まりにくい。可変長符号化の理論的な限界を示す指標になる。
ハミング距離
同じ長さの2つの符号語を比べ、値が異なるビットの個数。符号全体で最小のハミング距離がdであれば、d−1ビットの誤り検出、⌊(d−1)/2⌋ビットの誤り訂正が可能になる。
CRC
巡回冗長検査。ビット列を多項式とみなし、あらかじめ決めた生成多項式で割った余りを検査符号として付加する。連続した複数ビットの誤り(バースト誤り)に強く、通信やストレージで広く使われる。
UTF-8
Unicodeの符号化方式の一つ。1文字を1〜4バイトの可変長で表し、ASCII範囲の文字は1バイトのままなので従来のASCIIテキストと互換性がある。Webの標準的な文字符号化方式として普及している。
教師なし学習
正解ラベルのないデータだけを使い、データ間の類似性や分布から構造を見つける機械学習の方式。クラスタリングや次元削減が代表例で、正解を与える教師あり学習、報酬で学ぶ強化学習と区別される。
過学習
訓練データの細かな特徴や雑音にまで適合しすぎて、未知のデータに対する精度がかえって下がる状態。訓練データを増やす、モデルを単純にする、正則化や交差検証を行うといった対策がとられる。
標本化定理
アナログ信号に含まれる最高周波数の2倍以上の周波数で標本化すれば、標本値から元の信号を復元できるという定理。これを下回るとエイリアシング(折返し雑音)が生じ、元の波形に戻せなくなる。
フィードバック制御
制御対象の出力をセンサで測定し、目標値との差が小さくなるように操作量を決める閉ループ制御。外乱があっても目標値に近づけられる一方、応答が遅れたり条件によっては発振したりすることがある。

例題 記号A, B, C, Dの生起確率がそれぞれ 1/2, 1/4, 1/8, 1/8 のとき、1記号あたりの平均情報量は。

−Σ p log2(p) を計算する。1/2 は 1ビット、1/4 は 2ビット、1/8 は 3ビットの情報量なので、0.5×1 + 0.25×2 + 0.125×3 + 0.125×3 = 0.5 + 0.5 + 0.375 + 0.375 = 1.75ビット。等確率なら2ビットなので、偏りがあるぶん小さくなっている。

例題 教師あり学習・教師なし学習・強化学習はどう違うか。

教師あり学習は入力と正解ラベルの組から予測規則を学ぶ(分類・回帰)。教師なし学習はラベルなしデータから構造を見つける(クラスタリング・次元削減)。強化学習は行動の結果として得られる報酬を手がかりに、報酬の総和が大きくなる方策を試行錯誤で学ぶ。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類1:基礎理論(情報に関する理論・通信に関する理論・計測・制御に関する理論)

アルゴリズムとデータ構造

配列・リスト・スタック・キュー・ハッシュ表

基本となるデータ構造を「取り出し方が速いか、出し入れが速いか」という物差しで整理します。

配列は同じ型のデータを連続した領域に並べたものです。先頭アドレスと添字から要素の位置を計算で求められるので、何番目の要素でも一定時間 O(1) で読み書きできます。その代わり途中への挿入や削除は後ろの要素をすべてずらす必要があり、要素数に比例する時間 O(n) がかかります。大きさをあらかじめ決めておく必要がある点も制約です。擬似言語では配列の要素番号は1から始まり、a[1] が先頭、長さは「aの要素数」で表します。

リストは、各要素(節)が「値」と「次の節の位置を指すポインタ」を持つ構造です。次だけを指すものが単方向リスト、前と次の両方を指すものが双方向リスト、末尾が先頭を指して輪になっているものが環状リストです。挿入や削除はポインタを付け替えるだけなので、場所さえ分かっていれば要素数に関係なく一定時間で済みます。反面「n番目の要素」を得るには先頭から順にたどるしかなく O(n) かかります。配列とリストは、参照の速さと出し入れの速さのトレードオフだと覚えてください。

スタックは後入先出(LIFO:Last In First Out)で、push で積み、pop で最後に積んだものから取り出します。関数呼出しの戻り番地や局所変数の管理、再帰、逆ポーランド記法の計算に使われます。キューは先入先出(FIFO:First In First Out)で、enqueue で末尾に入れ、dequeue で先頭から取り出します。プリンタの待ち行列や幅優先探索が代表例です。キューを配列で作るときは、末尾まで来たら先頭に戻る環状バッファ(リングバッファ)にすると、領域を無駄にせず繰り返し使えます。

ハッシュ表は、鍵をハッシュ関数に通して得た値をそのまま格納位置にする構造です。理想的には1回の計算で目的の要素に届くので、探索・挿入・削除がいずれも平均 O(1) になります。異なる鍵が同じ位置に割り当てられる衝突(シノニム)は原理的に避けられないため、同じ位置の要素を線形リストでつなぐチェイン法(連鎖法)か、空きが見つかるまで別の位置を順に調べるオープンアドレス法(線形探査法など)で対処します。表の占有率が上がるほど衝突が増え、最悪では O(n) まで劣化します。

スタックの push / pop と操作の追跡

スタックは配列 stack と頂上位置 top で実現できる

  push(v):  top ← top + 1 ; stack[top] ← v
  pop():    v ← stack[top] ; top ← top - 1 ; return v

操作: push(1) push(2) pop push(3) push(4) pop pop push(5) pop pop

  操作      stack(下→上)   取り出した値
  push(1)   1
  push(2)   1 2
  pop       1                2
  push(3)   1 3
  push(4)   1 3 4
  pop       1 3              4
  pop       1                3
  push(5)   1 5
  pop       1                5
  pop       (空)            1

  取り出された順序 = 2, 4, 3, 5, 1
基本データ構造の比較(nは要素数。計算量は代表的な場合)
データ構造取り出し方k番目の参照挿入・削除主な用途
配列添字で直接指定O(1)O(n)(後続をずらす)表・行列、添字計算が効く処理
単方向リスト先頭から順にたどるO(n)O(1)(位置が既知なら)件数が増減するデータの管理
双方向リスト前後どちらからもたどれるO(n)O(1)(前の節を探す必要なし)履歴の前後移動、エディタ
環状リスト末尾の次が先頭に戻るO(n)O(1)ラウンドロビン、バッファ管理
スタック後入先出(LIFO)頂上のみpush/pop とも O(1)関数呼出し、再帰、逆ポーランド記法
キュー先入先出(FIFO)先頭のみenqueue/dequeue とも O(1)待ち行列、幅優先探索
ハッシュ表鍵から位置を計算O(1)(平均)O(1)(平均)辞書、索引、重複チェック
配列
同じ型の要素を連続した領域に並べたデータ構造。先頭アドレスと添字から要素の位置を計算できるため、何番目の要素でも一定時間で参照できる。一方で途中への挿入・削除は後続要素の移動を伴い、要素数に比例する時間がかかる。
単方向リスト
各節が値と「次の節を指すポインタ」だけを持つ線形リスト。挿入・削除はポインタの付け替えだけで済むが、たどれる向きが一方向なので、ある節を削除するにはその1つ前の節を先頭から探し直す必要がある。
双方向リスト
各節が前の節と次の節の両方を指すポインタを持つ線形リスト。前後どちらの向きにもたどれ、ある節を指すポインタさえあれば前の節を探さずに削除できる。ポインタを2本持つぶん記憶領域は多く必要になる。
環状リスト
末尾の節のポインタが先頭の節を指し、輪になっている線形リスト。終端がないので、決まった順番で処理を回し続けるラウンドロビン方式のスケジューリングやバッファ管理に向く。たどり続けると無限に回るため停止条件が必要。
スタック
後入先出(LIFO)でデータを出し入れするデータ構造。push で頂上に積み、pop で頂上から取り出す。関数呼出し時の戻り番地や局所変数の退避、再帰処理、逆ポーランド記法の計算などに使われる。
キュー
先入先出(FIFO)でデータを出し入れするデータ構造。enqueue で末尾に加え、dequeue で先頭から取り出す。プリンタの印刷待ち、通信のバッファ、グラフの幅優先探索など、到着順に処理したい場面で使う。
ハッシュ関数
鍵から格納位置(ハッシュ値)を求める関数。鍵を表の大きさで割った余りを使う方法が代表的。値が表全体に均等に散らばるほど衝突が減り、探索が平均一定時間に近づく。
衝突(シノニム)
異なる鍵が同じハッシュ値になり、格納位置がぶつかること。対処法として、同じ位置の要素を線形リストでつなぐチェイン法(連鎖法)と、空いている別の位置を順に探すオープンアドレス法(線形探査法など)がある。

例題 要素数 n の配列の先頭に新しい要素を1つ挿入するには、何回の要素移動が必要か。

既にある n 個の要素をすべて1つずつ後ろへずらすので n 回。末尾への追加なら0回で済む。同じことを単方向リストで行うと、新しい節の next を旧先頭に向け、先頭ポインタを新しい節に付け替えるだけなので、要素数に関係なく一定時間で終わる。

例題 ハッシュ表で衝突が起きたとき、チェイン法とオープンアドレス法はどう違うか。

チェイン法は同じハッシュ値の要素を線形リストでつなぐので、表の大きさを超える件数でも格納でき、削除も対象の節を外すだけで済む。オープンアドレス法は表の別の空き位置を順に探して入れるため追加の領域が要らないが、占有率が高くなると探索距離が急に伸び、削除した位置に印を残さないと探索が途中で打ち切られてしまう。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(データ構造)

木構造・2分探索木・ヒープ

階層をもつデータを扱う木構造を、2分探索木・ヒープ・B木という代表例と3つの走査順序で押さえます。

木は根(ルート)を頂点として枝分かれする構造です。枝の先を子、その元を親と呼び、子を持たない節点を葉といいます。根からその節点までの枝の本数が深さ(レベル)で、木全体の最大の深さが高さです。すべての節点の子が2個以下の木を2分木、どの節点も子を0個か2個だけ持つ木を全2分木、葉が上から隙間なく詰まっている木を完全2分木といいます。根の深さを0とすると、高さ h の完全2分木が持てる節点数は最大 2^(h+1) − 1 個で、逆に n 個の節点を詰めたときの高さはおよそ log2 n になります。

2分探索木は「左部分木のすべての値 < 節点の値 < 右部分木のすべての値」という規則を守った2分木です。探索は根から始め、目的の値が小さければ左、大きければ右へ進むだけなので、木の形が整っていれば O(log n) で見つかります。ところが昇順に並んだデータを順番に挿入すると一直線の木になってしまい、探索は O(n) まで悪化します。これを防ぐため、挿入・削除のたびに回転を行って左右の高さの差を一定以内に保つのが平衡木(AVL木、赤黒木など)です。B木は1つの節点に複数の鍵と複数の子を持たせて木の高さを抑えたもので、1回の読み込みが高くつくディスク上の索引(データベースやファイルシステム)で使われます。

ヒープは「親の値は必ず子の値以上(最大ヒープ)」または「親の値は必ず子の値以下(最小ヒープ)」という条件だけを満たす完全2分木です。左右の子の間に大小の決まりはないので、2分探索木とはまったく別物です。根に最大値(最小値)が来ることを利用して、優先度付きキューやヒープソートに使います。完全2分木なので配列にそのまま詰められ、要素番号が1から始まるなら節点 i の左の子は 2i、右の子は 2i+1、親は i÷2 の商で求まります。挿入は末尾に置いて親と比べながら上へ、根の取り出しは末尾の要素を根へ移して子と比べながら下へ動かすので、どちらも高さに比例して O(log n) です。

木のすべての節点を一度ずつ訪れる操作を走査(トラバーサル)といい、根をどのタイミングで処理するかで3種類に分かれます。前順(先行順・行きがけ順)は「根 → 左 → 右」、中順(中間順・通りがけ順)は「左 → 根 → 右」、後順(後行順・帰りがけ順)は「左 → 右 → 根」です。2分探索木を中順で走査すると値が昇順に並ぶこと、数式を表す木を後順で走査すると逆ポーランド記法(後置記法)になることは試験で頻出なので、必ず結び付けて覚えてください。

2分木の3つの走査順序と、最大ヒープへの要素追加

          1
        /  \
       2      3
     / \      \
    4    5       6
       /
      7

  前順(根→左→右): 1, 2, 4, 5, 7, 3, 6
  中順(左→根→右): 4, 2, 7, 5, 1, 3, 6
  後順(左→右→根): 4, 7, 5, 2, 6, 3, 1

最大ヒープを1から始まる配列で持つと
  節点 i の左の子 = 2i / 右の子 = 2i + 1 / 親 = i ÷ 2 の商

  {9, 7, 8, 3, 5, 6} に 10 を追加する
    末尾に置く      : 9, 7, 8, 3, 5, 6, 10   (10は7番目、親は3番目の8)
    8 < 10 なので交換: 9, 7, 10, 3, 5, 6, 8  (10は3番目、親は1番目の9)
    9 < 10 なので交換: 10, 7, 9, 3, 5, 6, 8  (根に到達して終了)
木構造の種類と走査法(根の深さを0とする)
区分名称決まり・順序性質と主な用途
木の形完全2分木葉が上の段から隙間なく詰まる高さ h で最大 2^(h+1) − 1 節点。配列で表せる
木の形全2分木どの節点も子は0個か2個葉の数は内部節点の数より1多い
探索2分探索木左部分木 < 節点 < 右部分木整っていれば探索 O(log n)、偏ると O(n)
探索平衡木(AVL木・赤黒木)左右の高さの差を一定以内に保つ回転で形を直し、常に O(log n) を保証
探索B木1節点に複数の鍵と子を持つ多分木木が低いので読み込みが少ない。DBの索引
順序最大ヒープ親 ≧ 子(左右の順は問わない)根が最大値。挿入・取り出しは O(log n)
順序最小ヒープ親 ≦ 子根が最小値。優先度付きキューに使う
走査前順(行きがけ順)根 → 左 → 右木の複製、式の前置(ポーランド)記法
走査中順(通りがけ順)左 → 根 → 右2分探索木では値が昇順に並ぶ
走査後順(帰りがけ順)左 → 右 → 根式の後置(逆ポーランド)記法
根・葉・深さ・高さ
木の頂点にあり親を持たない節点が根、子を持たない節点が葉。根からある節点までの枝の本数がその節点の深さ(レベル)で、木の中で最大の深さが木の高さ。根の深さを0と数えるか1と数えるかは問題文で確認する。
完全2分木
根から順に、葉が上の段から左詰めで隙間なく埋まっている2分木。根の深さを0とすると高さ h で最大 2^(h+1) − 1 個の節点を持ち、節点を配列に順番に詰めるだけで親子関係を添字計算で表せる。
2分探索木
どの節点についても、左部分木の値がすべてその節点より小さく、右部分木の値がすべて大きい2分木。探索は根から大小比較で降りるだけで済むが、偏った順序で挿入すると一直線になり探索が要素数に比例してしまう。
平衡木
挿入・削除のたびに部分木を回転させ、左右の高さの差を一定以内に保つ2分探索木。AVL木や赤黒木が代表例で、どんな順序でデータを入れても探索・挿入・削除が O(log n) に収まることが保証される。
B木
1つの節点に複数の鍵と複数の子を持たせた多分木で、すべての葉の深さが等しくなるように保たれる。木の高さが低く抑えられるため読み込み回数が少なく、データベースの索引やファイルシステムで広く使われる。
ヒープ
親と子の間だけに大小関係を課した完全2分木。最大ヒープは親が子以上、最小ヒープは親が子以下で、左右の子の間に決まりはない。根が最大値(最小値)になるので優先度付きキューやヒープソートの土台になる。
木の走査
木のすべての節点を一度ずつ訪れる操作。根を先に処理する前順(根→左→右)、間に処理する中順(左→根→右)、最後に処理する後順(左→右→根)がある。2分探索木の中順走査は昇順、式の木の後順走査は逆ポーランド記法になる。

例題 節点数が1,000個の、形の整った2分探索木を探索するとき、比較は最大でおよそ何回になるか。

形が整っていれば高さはおよそ log2 1000 ≒ 9.97 なので、根から葉まで降りても比較は10回程度で済む。同じ1,000件を線形探索すると最悪1,000回なので約100分の1。ただし昇順に並んだデータを順に挿入して一直線の木になっていた場合は、最悪1,000回まで悪化する。

例題 2分探索木を中順で走査すると、どんな順序で値が出てくるか。

「左 → 根 → 右」の順に処理するので、常に昇順(小さい順)に並ぶ。左部分木の値はすべて根より小さく、右部分木の値はすべて根より大きいという規則が、走査の順序とそのまま対応するため。この性質は、整列済みのデータを取り出したいときにそのまま使える。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(データ構造・木構造)

探索アルゴリズムと整列アルゴリズム

代表的な探索法3つと整列法7つを、手順・計算量・安定性の3点で比べられるようにします。

探索の基本は線形探索です。先頭から順に比べるだけなので並び順は問いませんが、n件のうち目的の値がある場合の平均比較回数は (n+1)/2 回、最悪は n 回で計算量は O(n) です。2分探索は、あらかじめ昇順(または降順)に整列されていることが前提で、中央の要素と比べて探す範囲を毎回半分に絞ります。1回の比較で候補が半分になるので、最大比較回数は ⌊log2 n⌋ + 1 回、計算量は O(log n) です。n が1,000でも10回程度、1,000,000でも20回で済みます。ハッシュ表探索は鍵から位置を直接計算するので平均 O(1) ですが、衝突が集中すると最悪 O(n) になります。

整列アルゴリズムのうち、単純な3つはいずれも二重ループで平均・最悪とも O(n²) です。バブルソート(隣接交換法)は隣り合う要素を比べて大小が逆なら交換することを繰り返し、1回のパスで最大値が末尾に確定します。選択ソートは未整列部分から最小値を選んで先頭と交換するもので、交換回数は n−1 回と少ないのが特徴です。挿入ソートは、整列済み部分の適切な位置に次の要素を差し込むもので、ほぼ整列済みのデータなら最良 O(n) と非常に速くなります。シェルソートは、離れた要素どうしで挿入ソートを行い、間隔を徐々に詰めていく改良版です。

高速な整列は、いずれも平均 O(n log n) です。クイックソートは基準値(枢軸・ピボット)より小さい組と大きい組に分割し、それぞれを再帰的に整列する分割統治法で、平均は最速級ですが、枢軸の選び方が悪く分割が極端に偏ると最悪 O(n²) になります。マージソートは列を半分ずつに分けて整列し、整列済みの2列を併合(マージ)するもので、データの並びによらず常に O(n log n) を保証しますが、併合用に O(n) の作業領域が必要です。ヒープソートは全体をヒープに構成し、根(最大値)を取り出して末尾に置くことを繰り返すもので、こちらも常に O(n log n) で、追加の作業領域はほとんど要りません。

安定な整列とは、値(キー)が等しい要素どうしの元の前後関係が、整列後も保たれる整列のことです。バブルソート・挿入ソート・マージソートは安定ですが、離れた要素を直接入れ替える選択ソート・シェルソート・クイックソート・ヒープソートは安定ではありません。「部門順に並べたあと売上順に並べ替えても、同じ売上なら部門の順序が保たれてほしい」といった多段の並べ替えでは、安定性が実務上の要件になります。

バブルソートの擬似言語と各パス終了時の配列

○bubbleSort(整数型の配列: a)
  整数型: i, j, tmp
  for (i を 1 から aの要素数 - 1 まで 1 ずつ増やす)
    for (j を 1 から aの要素数 - i まで 1 ずつ増やす)
      if (a[j] > a[j + 1])
        tmp ← a[j]
        a[j] ← a[j + 1]
        a[j + 1] ← tmp
      endif
    endfor
  endfor

  a ← {5, 3, 8, 1, 9, 2} を整列する途中経過
    1回目終了: 3, 5, 1, 8, 2, 9   (最大値9が確定)
    2回目終了: 3, 1, 5, 2, 8, 9
    3回目終了: 1, 3, 2, 5, 8, 9
    4回目終了: 1, 2, 3, 5, 8, 9   (以降は交換なし)
探索・整列アルゴリズムの比較(nはデータ件数)
区分アルゴリズム平均計算量最悪計算量安定性特徴
探索線形探索O(n)O(n)整列不要。平均比較回数は (n+1)/2 回
探索2分探索O(log n)O(log n)整列済みが前提。最大 ⌊log2 n⌋ + 1 回
探索ハッシュ表探索O(1)O(n)鍵から位置を計算。衝突が集中すると劣化
整列バブルソートO(n²)O(n²)安定隣接要素を比較交換。実装が最も単純
整列選択ソートO(n²)O(n²)不安定最小値を選んで先頭と交換。交換は n−1 回
整列挿入ソートO(n²)O(n²)安定ほぼ整列済みなら最良 O(n) と速い
整列シェルソートn^1.25〜n^1.5 程度O(n²)不安定間隔を詰めながら挿入ソートを繰り返す
整列クイックソートO(n log n)O(n²)不安定枢軸で分割する分割統治法。平均は最速級
整列マージソートO(n log n)O(n log n)安定常に O(n log n)。O(n) の作業領域が要る
整列ヒープソートO(n log n)O(n log n)不安定根の取り出しを繰り返す。追加領域が不要
線形探索
先頭から順に目的の値と比べていく最も単純な探索法。データが整列されていなくても使えるが、n件の中に目的の値がある場合の平均比較回数は (n+1)/2 回、最悪は n 回で、計算量は O(n) となる。
2分探索
整列済みのデータに対し、中央の要素と比較して探索範囲を毎回半分に絞る探索法。最大比較回数は ⌊log2 n⌋ + 1 回で計算量は O(log n)。データが整列されていることと、添字で直接アクセスできることが前提になる。
バブルソート
隣り合う要素を比較し、大小が逆なら交換することを繰り返す整列法。隣接交換法ともいう。1回の走査ごとに最大値が末尾に確定する。平均・最悪とも O(n²) だが、隣どうししか交換しないため安定な整列である。
選択ソート
未整列部分から最小値(または最大値)を選び、未整列部分の先頭と交換することを繰り返す整列法。比較回数は常に n(n−1)/2 回で O(n²)、交換は n−1 回と少ない。離れた要素を交換するため安定ではない。
挿入ソート
整列済み部分に対して次の要素を正しい位置へ差し込んでいく整列法。平均・最悪は O(n²) だが、既にほぼ整列されているデータでは移動がほとんど起きず最良 O(n) になる。安定な整列である。
シェルソート
一定間隔だけ離れた要素の組ごとに挿入ソートを行い、間隔を徐々に狭めて最後に間隔1で仕上げる整列法。粗い段階で遠くの要素を大きく動かせるため挿入ソートより速いが、離れた要素を動かすので安定ではない。
クイックソート
基準値(枢軸・ピボット)より小さい要素の組と大きい要素の組に分割し、各組を再帰的に整列する分割統治法の整列。平均は O(n log n) と最速級だが、分割が極端に偏ると最悪 O(n²) に悪化する。安定ではない。
マージソート
列を半分ずつに分割して各々を整列し、整列済みの2列を併合していく整列法。データの並びによらず常に O(n log n) を保証する。併合用に元データと同程度の作業領域を必要とするが、安定な整列である。
ヒープソート
データ全体をヒープに構成し、根にある最大値を取り出して未整列部分の末尾に置く操作を繰り返す整列法。常に O(n log n) で、配列内で処理できるため追加領域がほとんど要らない。安定ではない。
安定な整列
キーの値が等しい要素どうしの元の並び順が、整列後も保たれる整列のこと。バブル・挿入・マージは安定、選択・シェル・クイック・ヒープは安定でない。段階的に並べ替える処理では安定性が要件になる。

例題 1,000,000件の整列済みデータを2分探索すると、比較は最大何回か。

1回の比較で候補が半分になるので、最大比較回数は ⌊log2 n⌋ + 1 回。log2 1,000,000 ≒ 19.93 なので ⌊19.93⌋ + 1 = 20 回。線形探索なら最悪1,000,000回なので、整列しておく価値がよく分かる。

例題 「安定な整列」でないと困るのはどんな場面か。

先に部門コード順に並べたデータを、次に売上金額の降順に並べ替えるような多段の並べ替え。安定な整列なら売上が同額の行は部門コード順のまま残るが、選択ソートやクイックソートのような不安定な整列だと同額の行の並びが崩れてしまう。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(探索・整列)

計算量・再帰・アルゴリズム設計技法

オーダ記法でアルゴリズムの伸び方を読み、再帰と代表的な設計技法・グラフ探索まで一気に整理します。

計算量(オーダ)は、データ件数 n が増えたときに手数がどう伸びるかを、係数や定数を無視して表したものです。O(1) は件数によらず一定、O(log n) は件数が2倍になっても手数が1増える程度、O(n) は比例、O(n log n) は比較による整列の理論的な下限、O(n²) は件数が10倍になると手数が100倍、O(2ⁿ) は件数が1増えるだけで手数が倍になり、少し大きいデータで実行不能になります。O(n²) のアルゴリズムで n を k 倍すると時間は k² 倍になる、という比例計算は試験でそのまま問われます。

同じアルゴリズムでも、データの並びによって手数は変わるので、最良・平均・最悪を分けて考えます。線形探索は先頭にあれば1回(最良)、平均 (n+1)/2 回、最悪 n 回。挿入ソートはほぼ整列済みなら O(n)(最良)ですが逆順なら O(n²)。クイックソートは平均 O(n log n) でも、枢軸の選び方が悪く毎回1個ずつしか分けられないと O(n²) になります。マージソートとヒープソートはデータの並びによらず常に O(n log n) で、性能が読みやすいのが利点です。

再帰は、関数が自分自身を呼び出す書き方です。呼出しのたびに戻り番地・引数・局所変数がスタックに積まれるので、再帰の深さに比例した記憶領域を使います。終了条件(基底)を書き忘れたり、引数が基底に近づかなかったりすると、スタック領域を使い切ってスタックオーバフローになります。素朴な再帰でフィボナッチ数を求めると同じ計算を何度も繰り返して指数時間になりますが、一度計算した答えを表に記録して使い回せば O(n) に落ちます。

アルゴリズムの設計技法として、問題を小さく分けて解き結果を併合する分割統治法(マージソート、クイックソート、2分探索)、小さい部分問題の答えを表に残して再利用する動的計画法(フィボナッチ数、ナップサック問題、最長共通部分列)、その場で最良に見える選択を繰り返す貪欲法(ダイクストラ法、ハフマン符号)があります。貪欲法は常に最適解を与えるとは限らない点に注意してください。グラフでは、キューを使って近い頂点から広げる幅優先探索、スタック(再帰)を使って行けるところまで進む深さ優先探索、重みが非負のときに始点からの距離が短い頂点から確定していくダイクストラ法が代表です。

再帰によるフィボナッチ数の計算と、重複する呼出し

○整数型: f(整数型: n)
  if (n ≦ 2)
    return 1
  endif
  return f(n - 1) + f(n - 2)

  f(1)=1  f(2)=1  f(3)=2  f(4)=3  f(5)=5  f(6)=8  f(7)=13  f(8)=21

  f(5) の呼出しの様子(同じ計算が何度も現れる)
    f(5)
      f(4)
        f(3)
          f(2)  f(1)
        f(2)
      f(3)          ← f(3) を2回計算している
        f(2)  f(1)

  一度求めた f(k) を表に記録して使い回せば(動的計画法)、
  呼出しの回数は n に比例する程度まで減らせる
オーダ記法の伸び方と、アルゴリズムの設計技法・グラフ探索
区分記法・技法意味・特徴例/n=1,000のときの手数の目安
オーダO(1)件数によらず一定配列の添字参照、ハッシュ表の平均探索/1
オーダO(log n)件数が2倍でも手数は1増える程度2分探索、平衡木の探索/約10
オーダO(n)件数に比例線形探索、合計値の計算/1,000
オーダO(n log n)比較による整列の理論的な下限マージソート、ヒープソート/約10,000
オーダO(n²)件数が10倍で手数は100倍バブルソート、二重ループ/1,000,000
オーダO(2ⁿ)件数が1増えるだけで手数が倍部分集合の全列挙/事実上計算できない
技法分割統治法小さく分けて解き、結果を併合するマージソート、クイックソート、2分探索
技法動的計画法部分問題の答えを表に残して再利用するフィボナッチ数、ナップサック問題
技法貪欲法その場で最良に見える選択を繰り返すハフマン符号、ダイクストラ法
グラフ幅優先探索(BFS)キューを使い、近い頂点から広げる重みが等しいグラフの最短経路
グラフ深さ優先探索(DFS)スタック(再帰)で行けるところまで進む経路の全列挙、閉路の検出
グラフダイクストラ法距離の短い頂点から確定していく重みが非負の単一始点最短経路
オーダ記法
データ件数 n が大きくなったときの計算時間や領域の増え方を、定数倍や低次の項を無視して表す記法。O(n²) は n が10倍になれば時間が約100倍になることを意味し、アルゴリズムどうしの規模に対する強さを比較するために使う。
最良・平均・最悪計算量
同じアルゴリズムでもデータの並びによって手数が変わるため、最も都合のよい場合・平均的な場合・最も都合の悪い場合に分けて評価する。クイックソートは平均 O(n log n) だが最悪 O(n²)、挿入ソートは最良 O(n) で最悪 O(n²) となる。
再帰
関数が自分自身を呼び出す手法。呼出しごとに戻り番地・引数・局所変数がスタックに積まれるため、深さに比例した記憶領域を消費する。終了条件(基底)が正しくないと呼出しが止まらず、スタックオーバフローを起こす。
分割統治法
問題を同じ形の小さい問題に分割して解き、その結果を併合して元の問題の答えを得る設計技法。マージソート、クイックソート、2分探索が代表例で、多くの場合 O(n log n) や O(log n) といった性能につながる。
動的計画法
小さい部分問題の答えを表に記録し、同じ計算を繰り返さないようにして全体を解く設計技法。素朴な再帰では指数時間になるフィボナッチ数やナップサック問題を、多項式時間で解けるようにする。
貪欲法
各段階でその場で最良に見える選択を繰り返して解を組み立てる設計技法。ダイクストラ法やハフマン符号のように最適解が保証される問題もあるが、一般には局所的な最良の積み重ねが全体の最適解になるとは限らない。
幅優先探索
始点に近い頂点から順に、キューを使って探索を広げるグラフ探索法。辺の重みがすべて等しい場合の最短経路や、最少手数の探索に適する。訪問済みの頂点を記録しておかないと同じ頂点を何度も処理してしまう。
深さ優先探索
進める限り先へ進み、行き止まりになったら直前の分岐点まで戻って別の道を試すグラフ探索法。スタックまたは再帰で実現する。経路の全列挙や閉路の検出、トポロジカルソートなどに使われる。
ダイクストラ法
辺の重みがすべて非負であるグラフで、1つの始点から各頂点への最短経路を求めるアルゴリズム。始点からの距離が最も短い未確定の頂点を確定していく貪欲法で、負の重みがある場合には正しい答えを得られない。

例題 計算量が O(n²) のアルゴリズムが、2,000件のデータを4秒で処理した。5,000件では何秒かかると見積もれるか。

件数の比は 5000 ÷ 2000 = 2.5 倍。O(n²) なので時間は 2.5² = 6.25 倍になり、4 × 6.25 = 25秒。これが O(n log n) なら 4 × (5000×log2 5000)/(2000×log2 2000) ≒ 11秒程度で済む。

例題 再帰呼出しの深さが増えると何が問題になるか。

呼出しのたびに戻り番地・引数・局所変数の組(スタックフレーム)がスタックに積まれるため、深さに比例して記憶領域を消費する。深さが想定を超えるとスタック領域を使い切ってスタックオーバフローとなり異常終了する。終了条件を正しく書くこと、深い再帰は繰返し(ループ)に書き換えることが対策になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(アルゴリズム・計算量)

プログラミングの基礎と言語・データ記述

変数のスコープや引数の渡し方といった共通の考え方と、主な言語・記述形式の違いを押さえます。

変数には、有効範囲(スコープ)と生存期間があります。関数やブロックの内側で宣言した局所変数は、その内側からしか参照できず、関数を抜けると値も消えます。プログラム全体から参照できる大域変数は便利に見えますが、どこからでも書き換えられるため不具合の原因を追いにくくなり、必要最小限にとどめるのが原則です。同じ名前の局所変数と大域変数があるときは、内側の局所変数が優先されます(大域変数は隠される)。

引数の渡し方には値渡しと参照渡しがあります。値渡しは実引数の値を複製して仮引数に代入するので、呼ばれた側で仮引数を書き換えても呼び出した側の変数は変わりません。参照渡しは変数そのものの位置(アドレス)を渡すので、呼ばれた側での変更が呼び出した側にも及びます。多くの言語で配列やオブジェクトは実質的に参照として渡されるため、関数の中で要素を書き換えると呼び出し元にも反映される点に注意が必要です。

ソースプログラムの実行方式には、全体を一括して機械語に翻訳してから実行するコンパイラ方式と、1文ずつ解釈しながら実行するインタプリタ方式があります。コンパイラ方式は翻訳に時間がかかる代わりに実行が速く、C言語が代表例です。インタプリタ方式は書いてすぐ動かせて試行錯誤しやすい反面、実行は遅くなりがちで、PythonやJavaScript、Rが代表例です。Javaは中間コード(バイトコード)に翻訳し、それを各環境の仮想機械(JVM)が実行するので、環境に依存しにくいという特徴があります。

データの記述形式には目的の違いがあります。HTMLは見出し・段落・リンクといったWeb文書の構造をタグで表すマークアップ言語、XMLはタグを利用者が自由に定義できるマークアップ言語で、データ交換や設定に使われます。JSONは名前と値の組を { } と [ ] で表す軽量な形式でWeb APIの標準的なやり取りに、CSVは値をコンマで区切り1行を1レコードとする表形式データの受渡しに、YAMLは字下げで階層を表し設定ファイルによく使われます。また、機能を外部から呼び出すための取り決めがAPI、よく使う機能をまとめて再利用できるようにした部品群がライブラリ、アプリケーションの骨組みを提供し開発者がその枠に沿って部品を書くのがフレームワークです。

値渡しと参照渡しで結果がどう変わるか

○swapByValue(整数型: x, 整数型: y)   /* 値渡し */
  整数型: t
  t ← x
  x ← y
  y ← t

○main()
  整数型: a, b
  a ← 3
  b ← 7
  swapByValue(a, b)
  /* ここでの a は 3、b は 7 のまま変わらない */

○setFirst(整数型の配列: arr)   /* 配列は参照として渡される */
  arr[1] ← 99

○main2()
  整数型の配列: c
  c ← {1, 2, 3}
  setFirst(c)
  /* ここでの c は {99, 2, 3} に変わっている */
主なプログラム言語とデータ記述形式の特徴
区分名称分類・実行方式主な特徴と用途
言語Cコンパイラ方式ポインタでメモリを直接扱える。OSや組込みなど速度が要る分野
言語Java中間コードに翻訳し仮想機械(JVM)で実行オブジェクト指向。環境に依存しにくく業務システムやAndroidで広く使う
言語Pythonインタプリタ方式文法が簡潔でライブラリが豊富。データ分析・AI・自動化
言語JavaScriptインタプリタ方式(主にブラウザ上で実行)Webページの動的な操作。Node.jsによりサーバ側でも使う
言語Rインタプリタ方式統計解析とグラフ描画に特化した言語
マークアップHTMLタグで文書の構造を表すWebページの見出し・段落・リンクなどの構造記述
マークアップXMLタグを利用者が定義できるシステム間のデータ交換や設定。構造の妥当性を検証できる
データ記述JSON{ } と [ ] で名前と値の組を表すWeb APIのデータ交換で最も広く使われる。JavaScript由来
データ記述CSV値をコンマで区切り1行を1レコードとする表形式データの受渡し。表計算ソフトと相性がよい
データ記述YAML字下げで階層を表す設定ファイル向け。人が読み書きしやすい
スコープ(有効範囲)
変数や関数の名前が参照できる範囲。関数やブロック内で宣言した局所変数はその内側だけで有効で、外からは見えない。大域変数はプログラム全体から参照できるが、どこからでも書き換えられるため影響範囲が読みにくくなる。
局所変数と大域変数
局所変数は宣言したブロック内でだけ有効で、通常は関数の実行中だけ存在する。大域変数はプログラム全体で共有され実行中ずっと存在する。同名の変数が両方あるときは内側の局所変数が優先され、大域変数は隠される。
値渡し
実引数の値を複製して仮引数に渡す方式。呼ばれた側で仮引数の値を変更しても、呼び出した側の変数には影響しない。複製が作られるため、大きなデータでは複製のコストがかかる点が欠点。
参照渡し
変数そのものの位置(アドレス)を渡す方式。呼ばれた側で仮引数を通じて値を変更すると、呼び出した側の変数も変わる。大きなデータを複製せずに渡せる利点があるが、意図しない書換えが起こりやすい。
コンパイラ方式
ソースプログラム全体を事前に機械語(目的プログラム)へ翻訳し、その結果を実行する方式。翻訳に時間はかかるが実行は速く、文法の誤りを実行前にまとめて検出できる。C言語などが代表的。
インタプリタ方式
ソースプログラムを1文ずつ解釈しながら実行する方式。翻訳の待ち時間がなくすぐ試せるため試行錯誤に向くが、実行のたびに解釈するため一般に実行速度は遅い。Python、JavaScript、Rなどが代表的。
XML
タグの名前を利用者が自由に定義できるマークアップ言語。データそのものと構造を一緒に記述でき、異なるシステム間のデータ交換や設定ファイルに使われる。スキーマによって文書の構造が妥当かどうかを検証できる。
JSON
名前と値の組を { } で、並びを [ ] で表す軽量なデータ記述形式。JavaScriptの記法に由来し、XMLより記述量が少ない。Web APIでサーバとクライアントがデータをやり取りする形式として広く使われている。
API
ソフトウェアの機能やデータを外部のプログラムから呼び出すための取り決め(インタフェース)。内部の作りを知らなくても、決められた呼び方と戻り値の形式に従えば機能を利用できる。Web APIはHTTPで呼び出す形式のもの。
フレームワーク
アプリケーションの土台となる骨組みと処理の流れをあらかじめ用意した枠組み。開発者はその決まりに沿って部品を書き足す。呼び出す側と呼ばれる側が逆転する点(制御の反転)が、必要なときに呼び出すだけのライブラリとの違い。

例題 大域変数を多用すると、なぜ保守しにくくなるのか。

プログラムのどこからでも読み書きできるため、値がおかしくなったときに書き換えた箇所を全体から探さなければならない。局所変数なら影響範囲が宣言したブロック内に限られるので、原因の切り分けが早く、部品として他へ流用するのも容易になる。

例題 ライブラリとフレームワークは何が違うか。

ライブラリは必要なときにこちらから呼び出す部品の集まりで、処理の流れは自分で決める。フレームワークは処理の流れと骨組みが先にあり、開発者はその決められた場所に部品を書き足す形になる。呼ぶ側と呼ばれる側が逆転するので「制御の反転」と呼ばれる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(プログラミング・言語)

コンピュータ構成要素

プロセッサの仕組みと性能

CPUの内部にどんなレジスタがあり、1つの命令がどう実行され、クロック周波数やCPIから性能をどう計算するのかが分かるようになります。

プロセッサ(CPU、中央処理装置)は、制御装置・演算装置(ALU)・レジスタ群からできています。制御装置は命令を解読して各装置に指示を出す司令塔、演算装置は加減算や論理演算を実際に行う計算係、レジスタはCPU内部にある最も高速な記憶場所です。主記憶に置かれたプログラムを1命令ずつ読み込んで実行する方式をプログラム内蔵方式(プログラム記憶方式)といい、今日のコンピュータの基本になっています。

レジスタには役割ごとに名前が付いています。プログラムカウンタ(命令アドレスレジスタ)は次に実行する命令が入っている主記憶の番地を保持し、1命令を取り出すたびに自動的に次の命令を指すように更新されます。命令レジスタは取り出した命令そのものを保持し、その命令部を命令デコーダ(解読器)が解読します。ほかに、演算対象や結果を入れるアキュムレータ・汎用レジスタ、演算結果の正負やけた上がりなどの状態を保持するフラグレジスタ(状態レジスタ)、主記憶とやり取りする番地とデータを一時的に置くメモリアドレスレジスタ(MAR)・メモリデータレジスタ(MDR)があります。

1つの命令は「命令の取出し(フェッチ)→ 命令の解読(デコード)→ オペランド(対象データ)の取出し → 命令の実行 → 結果の格納」という順番で処理されます。この一連の流れを命令サイクルといい、CPUはこれを高速に繰り返します。命令語は、何をするかを表す命令部(オペレーションコード)と、対象を表すオペランド部(アドレス部)に分かれています。

オペランド部から実際にアクセスする番地(実効アドレス)を求める決まりをアドレス指定方式といいます。即値アドレス指定はオペランド部の値そのものをデータとして使い、直接アドレス指定はオペランド部をそのまま番地として使います。間接アドレス指定はオペランド部が指す番地の中身をさらに番地として使い、指標アドレス指定は指標レジスタの値を足して配列の要素をたどるのに使います。基底アドレス指定はプログラムの先頭番地(基底レジスタ)に変位を足すのでプログラムを主記憶のどこに置いても動き、相対アドレス指定はプログラムカウンタの値に変位を足して求めます。

性能の基本は、CPUが歩調を合わせるために刻むクロックです。1秒あたりのクロック数がクロック周波数で、単位はHz。1クロックにかかる時間(クロック周期)はその逆数で、2GHzなら1÷(2×10^9)=0.5ナノ秒です。1つの命令の実行に必要な平均クロック数をCPI(Cycles Per Instruction)といい、1秒間に実行できる命令数を100万命令単位で表した指標がMIPSです。クロック周波数÷CPIで1秒あたりの命令数が求まるので、たとえば2GHz・CPI 5なら 2×10^9÷5=4×10^8命令/秒=400MIPSになります。命令の種類ごとに必要クロック数と出現割合が与えられたときは、(クロック数×割合)の合計が平均CPIです。

高速化の代表がパイプラインです。命令の実行を複数の段階(ステージ)に分け、1つ前の命令が次の段階に進んだらすぐ後続の命令を投入することで、見かけ上1クロックごとに命令が完了していきます。D段のパイプラインでI個の命令を実行するとき、1段あたりの時間(ピッチ)をtとすると、全体の実行時間は(I+D−1)×tで求められます。ただし分岐命令で流れが変わったり、直前の命令の結果を待つ必要があると、パイプラインが乱れて性能が落ちます。これをハザードといい、分岐先を予測して先に実行しておく分岐予測や投機実行で影響を減らします。

さらに、パイプラインを複数本並べて同時に複数命令を発行するスーパースカラ、1つのLSIに演算コアを複数載せるマルチコアプロセッサ、単純な計算を大量に並列処理して画像処理やAIの学習にも使われるGPUなど、並列化による高速化が進んでいます。命令セットの設計思想では、複雑で高機能な命令を多数持つCISCと、命令を単純・固定長にそろえてパイプラインを効かせやすくしたRISCがあります。

処理の途中で急ぎの用事が入ったときに、実行中の処理を中断して決められた処理に移る仕組みが割込みです。実行中のプログラム自身が原因で起こるものを内部割込み(ゼロ除算などのプログラム割込み、ページフォールト、SVC割込み)、プログラムの外側が原因のものを外部割込み(入出力完了、タイマ(インターバルタイマ)、機械チェック、電源異常)といいます。割込みが起きるとCPUは実行中のレジスタの内容を退避し、割込み処理が終わると退避した内容を戻して元の処理を再開します。

CISCとRISCの設計思想の違い

CISC と RISC の比較

  観点        | CISC                  | RISC
  ------------+-----------------------+------------------------
  命令の数    | 多い・高機能          | 少ない・単純
  命令の長さ  | 可変長                | 固定長
  1命令の時間 | 命令ごとにばらつく    | 1クロックに近くそろう
  制御方式    | マイクロプログラム制御| ワイヤードロジック制御
  レジスタ数  | 比較的少ない          | 多い
  主記憶参照  | 多くの命令が直接参照  | ロード/ストア命令だけ
  パイプライン| 効かせにくい          | 効かせやすい
アドレス指定方式の比較(オペランド部の値をxとする)
方式実効アドレス/扱い特徴と使いどころ
即値アドレス指定アドレスを求めない(xがデータそのもの)定数を扱うときに使う。主記憶を読みにいかないので最も速い
直接アドレス指定x(オペランド部がそのまま番地)最も単純。指定できる番地の範囲が命令語の長さに制限される
間接アドレス指定番地xの中に入っている値主記憶を2回たどる。ポインタのように、指す先を実行時に変えられる
指標アドレス指定x+指標レジスタの値指標レジスタを1ずつ増やして配列の要素を順にたどるのに向く
基底アドレス指定基底レジスタの値+x(変位)プログラムの先頭番地を基底に入れるので、主記憶のどこへ再配置しても動く
相対アドレス指定プログラムカウンタの値+x(変位)現在の命令位置からの差で指定する。分岐命令で使われる
プログラムカウンタ
次に実行する命令が格納されている主記憶の番地を保持するレジスタ。命令アドレスレジスタともいう。命令を取り出すごとに次の命令を指すように更新され、分岐命令では分岐先の番地が設定される。
命令レジスタ
主記憶から取り出した命令そのものを一時的に保持するレジスタ。ここに入った命令の命令部を命令デコーダが解読し、制御装置が各装置へ制御信号を送る。
フラグレジスタ
直前の演算結果が正か負かゼロか、けた上がりやあふれが起きたかなどの状態を1ビットずつ保持するレジスタ。状態レジスタともいい、条件分岐命令の判断材料になる。
実効アドレス
命令のオペランド部と指定方式から計算して求めた、実際にアクセスする主記憶の番地。同じオペランド部でも、直接・間接・指標・基底・相対のどの方式かで実効アドレスは変わる。
CPI
Cycles Per Instructionの略で、1命令の実行に必要な平均クロック数。クロック周波数÷CPIで1秒あたりの実行命令数が求まる。命令ごとのクロック数と出現割合の積を合計すると平均CPIになる。
MIPS
Million Instructions Per Secondの略で、1秒間に実行できる命令数を100万命令単位で表した性能指標。1MIPSは毎秒100万命令。命令の重さが違う機種同士の比較には向かない。
パイプライン
命令の実行を複数の段階に分け、前の命令が次の段階へ進んだらすぐ後続の命令を投入して並行処理する高速化技法。D段・ピッチtでI命令なら実行時間は(I+D−1)×t。
ハザード
パイプラインの流れが乱れて待ちが発生すること。分岐で先読みが無駄になる制御ハザード、直前の演算結果を待つデータハザード、装置の取り合いによる構造ハザードがある。
スーパースカラ
パイプラインを複数本用意し、1クロックで複数の命令を同時に発行・実行する方式。1本のパイプラインより高い並列度が得られる。
CISCとRISC
CISCは複雑で高機能な可変長命令を多数持つ設計、RISCは命令を単純・固定長にそろえて1命令1クロックに近づけ、パイプラインで高速化する設計。RISCはレジスタを多く持ち、主記憶アクセスをロード/ストア命令に限る。
内部割込み
実行中のプログラム自身が原因で発生する割込み。ゼロ除算やあふれなどのプログラム割込み、存在しないページを参照したときのページフォールト、OSの機能を呼び出すSVC割込みがある。
外部割込み
実行中のプログラムの外側が原因で発生する割込み。入出力の完了通知、タイマによる時間切れ、装置の故障を知らせる機械チェック、電源異常などがある。

例題 クロック周波数2GHz、平均CPIが5のCPUは何MIPSか。

1秒あたりの実行命令数はクロック周波数÷CPIで求める。2×10^9÷5=4×10^8命令/秒。MIPSは100万命令単位なので4×10^8÷10^6=400MIPS。

例題 命令Aが50%で4クロック、命令Bが30%で8クロック、命令Cが20%で10クロックのとき、平均CPIはいくつか。

各命令のクロック数に出現割合を掛けて合計する。0.5×4+0.3×8+0.2×10=2+2.4+2=6.4クロック。これが平均CPIになる。

例題 5段パイプラインで、1段あたり20ナノ秒のCPUが100命令を実行するのにかかる時間は。

(命令数+段数−1)×ピッチで求める。(100+5−1)×20=104×20=2,080ナノ秒。パイプラインを使わず1命令に5段×20=100ナノ秒かけると100命令で10,000ナノ秒なので、約4.8倍速い。

例題 ゼロ除算が起きたときの割込みは内部割込みか外部割込みか。

内部割込み(プログラム割込み)。実行中のプログラム自身の演算が原因だから。入出力の完了通知やタイマ、電源異常はプログラムの外側が原因なので外部割込みになる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類3:コンピュータ構成要素(プロセッサ)

メモリとキャッシュ

DRAMとSRAM、ROMの種類の違いを整理し、キャッシュのヒット率から実効アクセス時間を計算できるようになります。

記憶装置は、速いものほど容量が小さくビットあたりの単価が高いという関係にあります。そこで、CPUに近い順にレジスタ、キャッシュメモリ、主記憶、補助記憶と階層的に組み合わせ、よく使うデータを速い層に置くことで、全体として「速くて大きくて安い」記憶を実現します。これを記憶階層といいます。

主記憶に使われる半導体メモリのうち、電源を切ると内容が消える揮発性のものがRAM、電源を切っても消えない不揮発性のものがROMです。RAMにはDRAMとSRAMがあります。DRAMはコンデンサに電荷をためて1ビットを記憶するため、放っておくと電荷が抜けてしまいます。そこで一定時間ごとに読み直して書き戻すリフレッシュ動作が必要です。構造が単純で集積度が高く安いので主記憶に使われます。SRAMはフリップフロップ回路で記憶するのでリフレッシュが不要で高速ですが、1ビットに必要な素子が多く高価なため、容量の小さいキャッシュメモリに使われます。

ROMには、製造時に内容が書き込まれ利用者が変更できないマスクROMと、利用者が書き込めるPROMがあります。PROMには、一度だけ書き込めるOTPROM、紫外線を当てて全体を消去し再び書き込めるEPROM、電気的に消去して書き換えられるEEPROMがあり、EEPROMをブロック単位でまとめて消去できるようにして大容量化したものがフラッシュメモリです。フラッシュメモリはUSBメモリ・SDカード・SSDに使われますが、書換え回数に上限がある点に注意します。

主記憶よりずっと速いSRAMをCPUと主記憶の間に置き、一度読んだデータやその周辺を保持しておくのがキャッシュメモリです。目的のデータがキャッシュにあることをヒット、なくて主記憶まで取りに行くことをミスヒットといい、ヒットする割合がヒット率です。平均でどれだけ待つかを表す実効アクセス時間は、ヒット率×キャッシュのアクセス時間+(1−ヒット率)×主記憶のアクセス時間で求めます。たとえばヒット率90%、キャッシュ10ナノ秒、主記憶60ナノ秒なら、0.9×10+0.1×60=15ナノ秒です。

主記憶のどのブロックをキャッシュのどこに置くかの決め方をマッピング方式といいます。置き場所が1か所に決まるダイレクトマップ方式は回路が単純で速い一方、同じ場所に割り当たるブロックを交互に使うと追い出しが頻発します。どこにでも置けるフルアソシアティブ方式は無駄が少ない代わりに、探すための比較回路が大きくなります。両者の折衷が、いくつかの置き場所をセットにまとめてその中なら自由に置けるセットアソシアティブ方式で、実際のCPUで広く使われています。

書込みのときにキャッシュと主記憶をどう合わせるかの方式も2つあります。ライトスルー方式はキャッシュと主記憶へ同時に書くので内容が常に一致し安全ですが、書込みのたびに遅い主記憶へアクセスするので書込み性能は上がりません。ライトバック方式はまずキャッシュにだけ書き、そのブロックが追い出されるときにまとめて主記憶へ書き戻すので高速ですが、一時的に内容が食い違うため制御が複雑になります。

主記憶側の高速化にはメモリインタリーブがあります。主記憶を複数のバンクに分け、連続する番地を別々のバンクに割り当てて並行してアクセスすることで、連続したデータの読出し間隔を短くします。バンク数がnなら、連続アクセスの見かけの間隔は理論上1バンクのアクセス時間の1/nになります。

また、主記憶より大きなアドレス空間をプログラムに見せる仕組みが仮想記憶です。プログラムが使う仮想アドレスを実際の主記憶の実アドレスに変換して動かし、主記憶に載りきらない部分は補助記憶へ退避します。必要なページが主記憶にないときはページフォールト(内部割込み)が起き、補助記憶から読み込みます。

記憶階層と主な記憶素子(RAM・ROMを含む)
階層/分類代表的な素子・装置揮発性書換え速度容量とビット単価
レジスタCPU内部のレジスタ揮発性何度でも可最も速い最小・最も高い
キャッシュメモリSRAM(リフレッシュ不要)揮発性何度でも可非常に速い小さい・高い
主記憶(RAM)DRAM(リフレッシュ必要)揮発性何度でも可速い中くらい・中くらい
読出し専用(ROM)マスクROM不揮発性不可(製造時に書込み)読出しは速い小さい・量産で安い
読出し専用(ROM)PROM/EPROM不揮発性1回だけ/紫外線で消去し再書込み読出しは速い小さい・やや高い
読出し専用(ROM)EEPROM不揮発性電気的に消去して書換え可読出しは速い小さい・高い
補助記憶(半導体)フラッシュメモリ・SSD不揮発性ブロック単位・回数に上限主記憶より遅い大きい・安い
補助記憶(磁気)HDD不揮発性何度でも可SSDより遅い非常に大きい・とても安い
補助記憶(交換)光ディスク・磁気テープ不揮発性種類による最も遅い大きい・最も安い
DRAM
コンデンサに電荷をためて記憶する揮発性メモリ。放置すると電荷が失われるため一定時間ごとのリフレッシュが必要。構造が単純で集積度が高く安価なので主記憶に使われる。
SRAM
フリップフロップ回路で記憶する揮発性メモリ。リフレッシュが不要で高速だが、1ビットあたりの素子数が多く高価・低集積なので、容量の小さいキャッシュメモリに使われる。
リフレッシュ
DRAMの記憶内容を保つために、一定時間ごとに全ビットを読み出して同じ内容を書き戻す動作。これを行わないと電荷が抜けて内容が失われる。SRAMには不要。
マスクROM
製造時に内容を書き込んでしまい、以後は読出し専用となるROM。利用者は書換えできないが、大量生産すればビット単価が安く、内容が変わらない制御プログラムなどに使われる。
EEPROM
電気的に内容を消去して書き換えられるROM。電源を切っても内容が残る不揮発性で、これをブロック単位で一括消去できるようにして大容量化したものがフラッシュメモリである。
フラッシュメモリ
電気的にブロック単位で消去・書換えができる不揮発性メモリ。USBメモリ、SDカード、SSDに使われる。機械部分がなく高速だが、書換え回数に上限がある。
キャッシュメモリ
CPUと主記憶の間に置く高速で小容量のメモリ。一度使ったデータや周辺のデータを保持し、次に同じ場所を使うときの待ち時間を減らす。SRAMで作られる。
ヒット率
CPUが求めたデータがキャッシュメモリに入っていた割合。ヒット率が高いほど遅い主記憶へ行く回数が減り、実効アクセス時間が短くなる。
実効アクセス時間
キャッシュと主記憶を合わせた平均のアクセス時間。ヒット率×キャッシュのアクセス時間+(1−ヒット率)×主記憶のアクセス時間で求める。
ライトスルー方式
書込み時にキャッシュと主記憶の両方へ同時に書く方式。両者の内容が常に一致するので信頼性が高いが、毎回遅い主記憶へ書くため書込みは速くならない。
ライトバック方式
書込み時はキャッシュだけを更新し、そのブロックが追い出されるときに主記憶へ書き戻す方式。主記憶への書込み回数が減り高速だが、一時的に内容が食い違うため制御が複雑。
セットアソシアティブ方式
キャッシュの置き場所をいくつかまとめてセットとし、主記憶のブロックは決まったセットの中ならどこへでも置ける方式。ダイレクトマップとフルアソシアティブの中間で、広く使われる。
メモリインタリーブ
主記憶を複数のバンクに分け、連続する番地を別のバンクに割り当てて並行アクセスする高速化技法。連続したデータを読むとき、見かけのアクセス間隔がバンク数分の1になる。

例題 キャッシュのアクセス時間が10ナノ秒、主記憶が60ナノ秒、ヒット率が90%のときの実効アクセス時間は。

ヒット率×キャッシュ+(1−ヒット率)×主記憶=0.9×10+0.1×60=9+6=15ナノ秒。ヒットしたときだけでなく、外れたときの分も割合を掛けて足すのがポイント。

例題 キャッシュ10ナノ秒、主記憶90ナノ秒で実効アクセス時間が20ナノ秒だった。ヒット率はいくつか。

ヒット率をhとすると10h+90(1−h)=20。左辺を整理して90−80h=20、80h=70、h=0.875。よって87.5%。

例題 1バンクのアクセスに60ナノ秒かかる主記憶を4ウェイのメモリインタリーブにすると、連続する番地を読み出す見かけの間隔はどうなるか。

4つのバンクへ順にずらしてアクセスを開始できるので、理論上は60÷4=15ナノ秒間隔で次々にデータが得られる。1回のアクセス自体が速くなるわけではない点に注意。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類3:コンピュータ構成要素(メモリ)

バスと入出力インタフェース

装置をつなぐバスの幅と転送速度の計算、DMAなどの入出力制御方式、USBやBluetoothといったインタフェースの違いが分かるようになります。

CPU・主記憶・入出力装置の間でデータをやり取りする共通の通り道がバスです。運ぶ内容によって、番地を送るアドレスバス、データそのものを送るデータバス、読み書きの指示やタイミングを送る制御バスに分けられます。CPUの内部を結ぶ内部バスに対し、CPUと周辺装置を結ぶものを外部バス(システムバス、拡張バス)といいます。

バスが一度に運べるビット数をバス幅といいます。データバスの幅が広いほど1回で多くのデータを運べ、アドレスバスの幅が広いほど指定できる番地の範囲が広がります(nビットなら2^n通り)。1秒あたりに運べるバイト数がバスの転送速度で、バス幅(バイト)×1秒あたりの転送回数(クロック周波数)で求めます。たとえばバス幅32ビット=4バイトでクロック33MHz、1クロックで1回転送するなら、4×33×10^6=132×10^6バイト/秒=132Mバイト/秒です。

入出力の制御方式には3つあります。プログラム制御方式(直接制御方式)はCPU自身が1文字ずつデータを運ぶため、遅い装置に付き合ってCPUが待たされます。DMA(Direct Memory Access)制御方式はDMAコントローラが主記憶と入出力装置の間を直接転送し、CPUは転送の開始を指示したあと別の処理を進められ、終了は割込みで知らされます。チャネル制御方式は入出力専用のプロセッサ(チャネル)がチャネルプログラムを解釈して一連の入出力を代行する方式で、大型機で使われます。

装置をつなぐ規格が入出力インタフェースです。1本の線でビットを順に送るシリアル方式と、複数の線で同時に送るパラレル方式があり、高速化すると線どうしの信号のずれ(スキュー)が問題になるため、現在はUSBやシリアルATAのようにシリアル方式が主流です。USBは周辺機器を数珠つなぎやハブ経由で最大127台まで接続でき、電源を入れたまま抜き差しできるホットプラグ、つなぐだけで設定されるプラグアンドプレイ、ケーブルからの給電(バスパワー)に対応します。

無線のインタフェースでは、2.4GHz帯を使い数メートル程度の機器同士をつなぐBluetooth、かざすだけの数センチで通信し交通系ICカードや電子マネーに使われるNFC、赤外線を使うIrDAがあります。有線では、映像と音声を1本のケーブルでデジタル伝送するHDMI、映像とデータを高速に扱えるThunderbolt、内蔵ストレージをつなぐシリアルATA、映像機器で使われたIEEE1394(FireWire)、拡張カード用のPCI Expressなどがあります。

主な入出力インタフェースの比較
名称有線/無線伝送の形態主な用途と特徴
USB有線シリアル周辺機器全般。ハブ経由で最大127台、ホットプラグとバスパワー給電に対応。USB2.0は最大480Mビット/秒
Thunderbolt有線シリアル映像とデータを高速に扱う。USB Type-Cと同じ形のコネクタを使う版があり、外付けストレージやディスプレイに使う
HDMI有線シリアル映像と音声を1本でデジタル伝送。テレビ・ディスプレイ・ゲーム機の接続
シリアルATA有線シリアル内蔵HDD・SSD・光学ドライブの接続。パラレル方式のATAを置き換えた
IEEE1394有線シリアルFireWireとも呼ばれ、ビデオカメラなど映像機器の接続に使われた
PCI Express有線シリアル拡張カード(グラフィックス、SSDなど)を挿すための拡張バス
Bluetooth無線シリアル2.4GHz帯・10メートル程度まで。マウス、イヤホン、スマートフォンの接続
NFC無線シリアル13.56MHz帯・10センチメートル程度。かざして使うICカードや電子マネー
アドレスバス
CPUがアクセスしたい主記憶や入出力装置の番地を送るためのバス。幅がnビットなら2^n通りの番地を指定でき、扱えるメモリ空間の広さを決める。
データバス
CPUと主記憶や入出力装置の間で実際のデータを運ぶバス。幅が広いほど一度に多くのビットを運べるため、転送速度が上がる。
バスの転送速度
1秒間に運べるデータ量。バス幅(バイト)×1秒あたりの転送回数で求める。バス幅32ビット・33MHzで1クロック1回転送なら4×33×10^6=132Mバイト/秒。
DMA制御方式
DMAコントローラが主記憶と入出力装置の間を直接転送する方式。CPUは開始を指示したあと他の処理を進められ、転送完了は割込みで通知される。CPUの負担を大きく減らせる。
チャネル制御方式
入出力専用のプロセッサ(チャネル)がチャネルプログラムを解釈し、一連の入出力処理をCPUに代わって実行する方式。主に大型汎用機で使われる。
USB
周辺機器をつなぐシリアルインタフェース規格。ハブを使って最大127台まで接続でき、ホットプラグ、プラグアンドプレイ、バスパワー給電に対応する。USB2.0の最大転送速度は480Mビット/秒。
Bluetooth
2.4GHz帯の電波を使う近距離無線通信規格。数メートルから10メートル程度の範囲で、マウス、キーボード、イヤホン、スマートフォンなどを無線接続する。
NFC
13.56MHz帯を使い、10センチメートル程度の距離でかざして通信する近距離無線規格。交通系ICカードや電子マネー、スマートフォンのタッチ決済に使われる。
HDMI
映像と音声をまとめて1本のケーブルでデジタル伝送するインタフェース。テレビ、ディスプレイ、ゲーム機やレコーダの接続に使われ、著作権保護機能にも対応する。
シリアルATA
パソコン内部でHDDやSSD、光学ドライブを接続するシリアル方式のインタフェース。以前のパラレル方式(IDE/ATA)に代わって主流となった。
ホットプラグ
コンピュータの電源を入れたまま機器を抜き差しできる機能。USBやシリアルATAが対応しており、接続すると自動で認識・設定されるプラグアンドプレイと組み合わせて使われる。

例題 バス幅32ビット、クロック周波数33MHzで1クロックあたり1回転送するバスの最大転送速度は。

32ビット=4バイトなので、4バイト×33×10^6回=132×10^6バイト/秒=132Mバイト/秒。ビットとバイトの取り違えに注意する。

例題 実効転送速度30Mバイト/秒の回線で600Mバイトのファイルを転送すると何秒かかるか。

600÷30=20秒。データ量が「ビット」で与えられていたら8で割ってバイトに直してから計算する。

例題 DMA制御方式でCPUの負担が減るのはなぜか。

DMAコントローラが主記憶と入出力装置の間を直接転送するため。CPUは転送開始を指示したら他の処理に移れ、完了は割込みで知らされる。プログラム制御方式ではCPUが自分でデータを運ぶので、遅い装置に待たされる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類3:コンピュータ構成要素(バス・入出力デバイス)

補助記憶と入出力装置

HDDのアクセス時間の内訳と計算、SSDや光ディスクの特徴、RAIDによる信頼性向上、そして3Dプリンタやセンサまで押さえます。

HDD(磁気ディスク装置)は、磁性体を塗った円盤(ディスク)を高速回転させ、磁気ヘッドを動かして読み書きします。同心円状の記録単位がトラック、複数枚のディスクで同じ半径のトラックを縦に束ねたものがシリンダ、トラックを分割した最小の読み書き単位がセクタです。記憶容量は「1セクタのバイト数×1トラックのセクタ数×1シリンダのトラック数×シリンダ数」で計算できます。

HDDのアクセス時間は3つの合計です。目的のトラックまで磁気ヘッドを移動する時間がシーク時間(位置決め時間)、目的のセクタが回ってくるまで待つ時間が回転待ち時間(サーチ時間)、実際にデータを読み書きする時間がデータ転送時間です。回転待ち時間は回転速度から求めます。1分間にN回転するなら1回転は60÷N秒で、目的のセクタは平均するとその半分だけ待てば来るので、平均回転待ち時間は1回転の時間の半分になります。データ転送時間は、1トラック分を読むのにちょうど1回転かかることを使い、(1回転の時間)×(読み出すバイト数÷1トラックのバイト数)で求められます。

SSDはフラッシュメモリを使った補助記憶装置です。回転や磁気ヘッドの移動といった機械的な動作がないため、シーク時間も回転待ち時間も発生せず高速で、衝撃に強く静かで消費電力も小さいという長所があります。一方で、書換え回数に上限があり、同容量ならHDDより高価です。

光ディスクはレーザ光でピット(くぼみ)を読み書きします。CD、DVD、Blu-ray Discの順に波長の短いレーザを使うので記録密度が高く、容量が大きくなります。末尾の記号は書換えの可否を表し、ROMは読出し専用、Rは1回だけ書込み可能(追記型)、RWやRAM、REは繰返し書換え可能です。ほかに、大容量で単価が安く長期保存やバックアップに使われる磁気テープもあります。

複数台のディスクを組み合わせて速度や信頼性を高める技術がRAIDです。RAID0(ストライピング)はデータを分散して並行に読み書きし高速化しますが冗長性はなく、1台壊れると全体が失われます。RAID1(ミラーリング)は同じ内容を2台に書くので信頼性は高いものの、使える容量は全体の半分です。RAID5はデータとパリティを全ディスクに分散して記録し、n台なら(n−1)台分の容量が使えて1台の故障まで復旧できます。RAID6はパリティを二重に持ち2台の故障まで耐えられます。

入出力装置では、画面に表示する装置として液晶ディスプレイや有機ELディスプレイがあり、画面の細かさは解像度(画素数)で表します。印刷する装置にはインクを吹き付けるインクジェットプリンタ、トナーを熱で定着させるレーザプリンタがあり、樹脂などを一層ずつ積み上げて立体物を作る3Dプリンタも実用化されています。入力側では、光の反射で紙面を読み取るイメージスキャナ、バーコードやQRコードの読取り装置、指紋や静脈を読む生体認証装置が使われます。

また、温度・湿度・加速度・ジャイロ(角速度)・光・赤外線・磁気などの物理量を電気信号に変える装置をセンサ、電気信号を回転や移動といった物理的な動きに変える装置をアクチュエータといいます。センサで状態を測り、コンピュータが判断し、アクチュエータで動かすという組合せが、IoT機器やロボット、自動車の制御の基本になります。

RAIDの主な方式の比較(同容量のディスクをn台使う場合)
方式書き方使える容量耐えられる故障ねらい
RAID0データを分割して各ディスクへ分散(ストライピング)n台分0台(1台でも壊れると全滅)高速化のみ。冗長性はない
RAID1同じ内容を2台へ二重書込み(ミラーリング)全体の半分同じ内容を持つ組の片方まで信頼性の確保
RAID5データとパリティを全ディスクへ分散(n−1)台分1台容量効率と信頼性の両立
RAID6パリティを二重に持ち全ディスクへ分散(n−2)台分2台RAID5より高い信頼性
シリンダ
複数枚のディスクで同じ半径にあるトラックを、縦にまとめて捉えた単位。同じシリンダ内ならヘッドを動かさずに読めるので、関連するデータをまとめて置くと速い。
シーク時間
磁気ヘッドを目的のトラック(シリンダ)まで移動させるのにかかる時間。位置決め時間ともいう。HDDのアクセス時間のうち、機械的な移動にあたる部分。
回転待ち時間
目的のセクタが磁気ヘッドの位置まで回ってくるのを待つ時間。サーチ時間ともいう。1分間にN回転なら1回転は60÷N秒で、平均回転待ち時間はその半分になる。
データ転送時間
目的のセクタが来てから実際にデータを読み書きするのにかかる時間。1トラック分でちょうど1回転かかることを使い、1回転の時間×(読み出す量÷1トラックの容量)で求める。
SSD
フラッシュメモリを使った補助記憶装置。機械的な動作がないためシーク時間も回転待ち時間もなく高速で、衝撃に強く静か。書換え回数に上限があり、同容量ならHDDより高価。
光ディスク
レーザ光でピットを読み書きする記憶媒体。CD、DVD、Blu-ray Discの順に短い波長のレーザを使うため記録密度が高く大容量になる。ROMは読出し専用、Rは追記型、RWやRAMは書換え可能。
RAID1
同じ内容を2台のディスクへ同時に書き込むミラーリング方式。片方が壊れても運用を続けられるが、実際に使える容量は全体の半分になる。
RAID5
データと誤り訂正用のパリティを全ディスクに分散して書き込む方式。n台構成なら(n−1)台分の容量が使え、どれか1台が壊れても残りから内容を復元できる。
3Dプリンタ
3次元の設計データをもとに、樹脂や金属の粉末を一層ずつ積み重ねて立体物を作る出力装置。試作品(プロトタイプ)の製作や少量多品種の部品製造に使われる。
センサ
温度、湿度、加速度、角速度、光、磁気などの物理量を測って電気信号に変える装置。IoT機器では、センサで集めた値をネットワーク経由で収集し分析に使う。
アクチュエータ
電気信号を受けて、回転や直線運動といった物理的な動きに変える装置。モータなどが代表例で、センサ・コンピュータと組み合わせて機器の制御に使われる。

例題 回転速度5,000回転/分のHDDの平均回転待ち時間は何ミリ秒か。

1分間に5,000回転なら1回転は60÷5,000=0.012秒=12ミリ秒。目的のセクタはすぐ来ることもあれば1回転待つこともあるので、平均はその半分の6ミリ秒になる。

例題 平均シーク時間10ミリ秒、回転速度5,000回転/分、1トラック15,000バイトのHDDから、5,000バイトのデータを読み出すときの平均アクセス時間は。

1回転は60÷5,000=12ミリ秒、平均回転待ち時間はその半分で6ミリ秒。転送時間は1トラック分でちょうど1回転なので12×5,000÷15,000=4ミリ秒。合計10+6+4=20ミリ秒。

例題 1セクタ512バイト、1トラック100セクタ、1シリンダ10トラック、シリンダ数2,000のHDDの記憶容量は。

512×100×10×2,000=1,024,000,000バイト。順に掛けるだけだが、けたが大きいので512×100=51,200(1トラック)、×10=512,000(1シリンダ)、×2,000と段階的に計算すると間違えにくい。

例題 1Tバイトのディスク6台でRAID5を構成すると、使える容量は。

RAID5はn台のうち1台分がパリティ相当なので(6−1)×1=5Tバイト。RAID1(ミラーリング)なら半分の3Tバイト、RAID0なら冗長性なしで6Tバイト全部が使える。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類3:コンピュータ構成要素(入出力装置)

システム構成要素

システムの構成と仮想化・クラウド

クライアントサーバや3層構成、仮想化の3方式、クラウドのIaaS/PaaS/SaaSといった「システムの組み方」の違いが説明できるようになります。

1台の大型コンピュータにすべての処理を集めるやり方を集中処理、複数のコンピュータに処理を分けて受け持たせるやり方を分散処理といいます。集中処理は管理や保守が1か所で済む反面、その1台が止まると全体が止まります。分散処理は障害の影響を局所化でき、機器を足して性能を伸ばしやすい一方、構成が複雑になり運用管理の手間が増えます。

分散処理の代表がクライアントサーバシステムです。サービスを要求する側(クライアント)と、要求に応えて処理やデータを提供する側(サーバ)に役割を分けます。これを3つの層に分けたものが3層クライアントサーバ(3層アーキテクチャ)で、画面表示を担うプレゼンテーション層、業務処理を担うファンクション層(アプリケーション層)、データの格納と検索を担うデータ層に分かれます。層ごとに独立して修正・増強できるので、業務ロジックだけを直したいときにデータベースを触らずに済みます。Webシステムは、クライアント側をWebブラウザだけにし、Webサーバ・アプリケーションサーバ・データベースサーバを組み合わせた3層構成にすることが多く、クライアントに専用ソフトを配布しなくてよいのが利点です。

これに対し、対等な立場のコンピュータ同士が直接データをやり取りする形態をピアツーピア(P2P)といいます。各機器がクライアントにもサーバにもなるため、中央サーバがなくても成立し、参加台数が増えるほど全体の資源も増えます。反面、資源の所在や利用者の管理を一元的に行いにくいという弱点があります。

利用者側の端末に必要最小限の機能しか持たせず、処理やデータをサーバ側に集約する構成をシンクライアントといいます。端末にデータが残らないので情報漏えい対策になります。中でも、サーバ上で仮想的なデスクトップ環境を動かし、その画面だけを端末に転送する方式をVDI(仮想デスクトップ基盤)と呼びます。また、複数台のコンピュータを結合して1台のように見せる技術がクラスタリングで、性能向上(負荷分散)と可用性向上(1台が故障しても他が引き継ぐ)の両方の目的で使われます。地理的に離れた多数のコンピュータの余力を集めて1つの大きな計算に使うやり方はグリッドコンピューティングです。

1台の物理サーバの上に複数の仮想的なコンピュータを動かす技術が仮想化です。方式は3つあります。ホスト型はWindowsなどのホストOSの上に仮想化ソフトを載せる方式で導入が手軽ですが、ホストOSを経由するぶん性能面で不利です。ハイパーバイザ型はハードウェア上に直接ハイパーバイザを置き、その上でゲストOSを動かす方式で、サーバ用途の主流です。コンテナ型はOSのカーネルを共有し、アプリケーションとその実行環境だけを隔離する方式で、ゲストOSを持たないため起動が速く消費資源も小さいのが特徴です。動作中の仮想マシンを停止させずに別の物理サーバへ移すライブマイグレーションも仮想化の重要な機能です。

仮想化を土台に、計算資源をネットワーク越しに従量課金で借りる形態がクラウドコンピューティングです。提供範囲によって、サーバやストレージなどのインフラを貸すIaaS、アプリケーションを動かす基盤(OSやミドルウェア)まで貸すPaaS、完成したアプリケーションそのものを提供するSaaSに分かれます。利用者の管理範囲はIaaSが最も広く、SaaSが最も狭くなります。一方、クラウドにすべてを送らず、データが発生する現場の近くに処理装置を置いて即座に処理する考え方がエッジコンピューティングで、通信遅延と回線量を減らせます。

記憶装置の置き方にも構成の違いがあります。NASはLANに直接つなぐファイルサーバ専用機で、ファイル単位でアクセスします。SANはストレージ専用の高速ネットワークを別に作り、サーバからはブロック単位でアクセスします。さらにアプリケーションの作り方として、機能を小さな独立したサービスに分けて組み合わせるマイクロサービスアーキテクチャがあり、サービス単位で改修・増強できます。取引記録を複数の参加者で分散して持ち合い、直前のブロックのハッシュ値を含めて鎖状につなぐことで改ざんを困難にする技術がブロックチェーンです。

仮想化3方式の比較(ゲストOSの有無が最大の違い)
方式構成の並びゲストOS特徴
ホスト型ハードウェア → ホストOS → 仮想化ソフト → ゲストOSあり既存のPCに導入しやすいが、ホストOSを経由するため性能面で不利
ハイパーバイザ型ハードウェア → ハイパーバイザ → ゲストOSありホストOSを介さないので性能を出しやすい。サーバ仮想化の主流
コンテナ型ハードウェア → OS(カーネル共有) → コンテナなしゲストOSがないため起動が速く軽い。カーネルを共有する制約がある
クライアントサーバシステム
サービスを要求するクライアントと、要求に応じて処理やデータを提供するサーバに役割を分けた分散処理の形態。処理をサーバに集めつつ、画面操作はクライアントで行う。
3層クライアントサーバ
システムをプレゼンテーション層(画面)、ファンクション層(業務処理)、データ層(データ管理)の3つに分ける構成。層ごとに独立して改修・増強できる。
ピアツーピア(P2P)
対等な立場のコンピュータ同士が直接データをやり取りする形態。各機器がクライアントにもサーバにもなるため中央サーバが不要だが、資源や利用者の一元管理はしにくい。
シンクライアント
端末には最小限の機能だけを持たせ、処理やデータをサーバ側に集約する構成。端末にデータを残さないため、紛失や盗難による情報漏えいを防ぎやすい。
VDI(仮想デスクトップ基盤)
サーバ上で利用者ごとの仮想デスクトップを動かし、その画面情報だけを端末に転送する方式。シンクライアントを実現する代表的な仕組み。
クラスタリング
複数のコンピュータを結合して利用者からは1台に見せる技術。負荷を分散して性能を高める目的と、1台が故障しても他が処理を引き継ぐ可用性向上の目的がある。
グリッドコンピューティング
ネットワークでつながった多数のコンピュータの空き処理能力を集め、1つの大きな計算を分担して処理する方式。科学技術計算などに使われる。
ハイパーバイザ型仮想化
ハードウェア上に直接ハイパーバイザを置き、その上で複数のゲストOSを動かす方式。ホストOSを介さないため性能を出しやすく、サーバ仮想化の主流。
コンテナ型仮想化
OSのカーネルを共有したまま、アプリケーションと実行環境だけを隔離する方式。ゲストOSを持たないので起動が速く、必要な資源も小さい。
ライブマイグレーション
稼働中の仮想マシンを停止させずに別の物理サーバへ移す機能。保守作業時にサービスを止めずに物理サーバを空けられる。
IaaS・PaaS・SaaS
クラウドの提供範囲による分類。IaaSはサーバやストレージ、PaaSはOSやミドルウェアを含む実行基盤、SaaSは完成したアプリケーションを提供する。
エッジコンピューティング
データが発生する現場の近くに処理装置を置き、その場で処理してから必要なぶんだけクラウドへ送る考え方。通信の遅延と回線の負荷を減らせる。
NASとSAN
NASはLANに直接接続しファイル単位でアクセスする専用機。SANはストレージ専用の高速ネットワークを別に構成し、ブロック単位でアクセスする。
マイクロサービスアーキテクチャ
アプリケーションを小さく独立したサービスの集合として作り、APIで連携させる構成。サービス単位で開発・改修・増強ができる。
ブロックチェーン
取引記録をブロックにまとめ、直前のブロックのハッシュ値を含めて鎖状につなぎ、多数の参加者で分散して保持する技術。過去の改ざんが極めて困難になる。

例題 Webブラウザ・アプリケーションサーバ・データベースサーバで構成されたシステムは、3層のどれに対応するか。

ブラウザ(とWebサーバの画面生成)がプレゼンテーション層、アプリケーションサーバがファンクション層、データベースサーバがデータ層にあたる。業務ロジックだけを直したいときはファンクション層のみを改修すればよい。

例題 OSのバージョンを利用者が自由に選びたい。IaaS・PaaS・SaaSのどれが適切か。

IaaS。IaaSはサーバやストレージといったインフラだけを借り、OSより上は利用者が構築・管理する。PaaSはOSやミドルウェアが提供済みで選択の自由度が低く、SaaSは完成したアプリケーションを使うだけになる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類4:システム構成要素(システムの構成)

信頼性設計と冗長構成

デュアルシステムとデュプレックスシステムの違い、フェールセーフ・フェールソフト・フールプルーフの使い分け、RASISの5項目が区別できるようになります。

システムを止めないための工夫には、大きく2つの方向があります。1つは、故障しにくい高品質な部品を使い、そもそも故障を起こさせないようにするフォールトアボイダンス(故障回避)。もう1つは、故障が起きることを前提に、起きても機能を保てるように冗長化しておくフォールトトレランス(耐故障)です。フォールトトレラントシステムとは、構成要素が壊れても全体としては正常な処理を続けられるシステムを指します。

障害が起きたときの振る舞いの設計思想には、名前の似た用語が並びます。フェールセーフは、故障したときに安全な側に倒す設計で、信号機が故障したら全方向を赤にする例が典型です。フェールソフトは、故障部分を切り離して性能や機能を落としてでも稼働を続ける設計で、この縮退運転をフォールバックといいます。フールプルーフは、利用者が誤った操作をしても危険が生じないようにする設計で、ふたを閉めないと回らない洗濯機や、数字欄に文字を入力させない画面が例です。この3つは「故障時に安全側へ」「故障時に機能を落として継続」「誤操作を受け付けない」と覚えると区別できます。

冗長構成には代表的な型があります。デュアルシステムは2組の系で同じ処理を同時に行い、結果を照合します。照合により誤りを検出でき、一方が故障してもその系を切り離してそのまま処理を続けられます。デュプレックスシステムは、主系(現用系)が業務を行い、もう一方は待機します。この待機の仕方で呼び方が変わり、待機系も電源を入れて同じ状態を保ち即座に切り替えられるものがホットスタンバイ、待機系は起動しているが別の処理をしており切替えに準備が要るものがウォームスタンバイ、待機系の電源を入れておらず障害時に起動して切り替えるものがコールドスタンバイです。切替えが速いほど費用は高くなります。ロードシェアシステムは複数の系に負荷を分け合って処理し、1台が故障しても残りが処理を引き継ぎます(ただし処理能力は落ちます)。

信頼性の評価軸をまとめたものがRASISです。Reliability(信頼性、故障しにくさ。MTBFで測る)、Availability(可用性、動いている割合。稼働率で測る)、Serviceability(保守性、直しやすさ。MTTRで測る)、Integrity(保全性・完全性、データが壊れたり矛盾したりしないこと)、Security(機密性・安全性、不正利用や漏えいを防げること)の5つの頭文字です。信頼性と可用性は似ていますが、めったに壊れなくても修理に何日もかかれば可用性は下がる、という関係にあります。

なお、冗長化は費用と釣り合わせて選びます。24時間止められない基幹系にはデュアルやホットスタンバイ、夜間に止められる業務にはコールドスタンバイ、というように、停止したときの損害と冗長化の費用を比べて決めるのが基本です。

障害への設計思想と冗長構成の比較
分類用語内容具体例・特徴
考え方フォールトアボイダンス故障そのものを起こさせない高品質な部品の採用、予防保守、徹底した品質管理
考え方フォールトトレランス故障しても全体は正常に動き続ける多重化した装置で処理を継続。フォールトトレラントシステム
考え方フェールセーフ故障時に安全な側へ倒す信号機の故障時に全方向を赤にする、異常時にガスを止める
考え方フェールソフト機能を落としてでも稼働を続ける故障部分を切り離した縮退運転(フォールバック)
考え方フールプルーフ誤操作をしても危険が生じないふたを閉めないと回らない洗濯機、数字欄に文字を入れさせない画面
構成デュアルシステム2系で同じ処理を同時に行い結果を照合誤りを検出できる。片系故障時は切り離して継続。費用は高い
構成デュプレックス(ホットスタンバイ)待機系を同じ状態で通電待機切替えがほぼ瞬時。待機側にも常時費用がかかる
構成デュプレックス(ウォームスタンバイ)待機系は起動済みだが別処理をしている切替えに準備が必要で、ホットとコールドの中間
構成デュプレックス(コールドスタンバイ)待機系は電源を切って用意しておく費用は最も安いが、起動と設定に時間がかかり復旧が遅い
構成ロードシェアシステム複数系で負荷を分担する故障時は残りの系で継続。能力が落ちるため応答は遅くなる
フォールトアボイダンス
信頼性の高い部品を使い、点検や品質管理を徹底して、故障そのものを起こさないようにする考え方。故障を前提とするフォールトトレランスと対になる。
フォールトトレラントシステム
構成要素の一部が故障しても、システム全体としては正常な処理を継続できるように冗長化されたシステム。故障が起こることを前提に設計する。
フェールセーフ
故障が起きたとき、被害が出ない安全な側の状態に移行させる設計。故障した信号機を全方向赤にする、ガス機器が異常時に元栓を閉じるなどが例。
フェールソフト
故障した部分を切り離し、性能や機能を落としてでも稼働を続ける設計。この縮退運転をフォールバックという。全面停止を避けることを優先する。
フールプルーフ
利用者が誤った操作をしても危険や重大な誤りが生じないようにする設計。ふたを閉めないと動かない機器、数字欄に文字を入力できない画面などが例。
デュアルシステム
2組の系で同じ処理を同時に行い、結果を照合する構成。誤りを検出でき、片方が故障してもその系を切り離して処理を続けられるが、費用は高い。
デュプレックスシステム
主系が業務を処理し、もう一方を待機させておく構成。主系の障害時に待機系へ切り替える。待機の仕方でホット・ウォーム・コールドに分かれる。
ホットスタンバイ
待機系も電源を入れて主系と同じ状態を保ち、障害時に即座に切り替えられる方式。切替時間は最も短いが、待機側にも常に費用がかかる。
コールドスタンバイ
待機系の電源を入れずに用意しておき、障害発生後に起動して切り替える方式。費用は最も安いが、復旧までの時間は最も長くなる。
ロードシェアシステム
複数の系で負荷を分担して処理する構成。1台が故障しても残りの系が処理を引き継げるが、処理能力は減るため応答が遅くなることがある。
RASIS
信頼性(Reliability)、可用性(Availability)、保守性(Serviceability)、保全性(Integrity)、機密性(Security)の5つの評価項目の頭文字。

例題 エレベータが停電時にその場で自動停止し、扉を開かないようにするのはどの設計か。

フェールセーフ。異常時に危険のない状態(かご内に閉じ込めても落下や転落を防ぐ状態)へ移行させている。機能を落として運転を続けるならフェールソフト、そもそも誤操作をさせないならフールプルーフである。

例題 デュアルシステムとホットスタンバイのデュプレックスシステムは、何が違うか。

デュアルは2系が同じ処理を同時に実行して結果を照合するため、故障だけでなく処理誤りも検出できる。ホットスタンバイは待機系が同じ状態を保つだけで業務処理はしておらず、障害時に切り替える。照合の有無が本質的な違いである。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類4:システム構成要素(システムの評価指標・信頼性設計)

RAIDと稼働率の計算

RAID 0/1/5/6/10の使用可能容量と耐障害性、MTBF・MTTRからの稼働率、直列・並列を組み合わせた稼働率の計算ができるようになります。

複数台の磁気ディスクを組み合わせて、速度や信頼性を高める技術がRAIDです。RAID0(ストライピング)はデータを分割して複数台に分散して書くので高速ですが、冗長性がなく1台でも壊れると全データを失います。RAID1(ミラーリング)は同じデータを2台に書くため、片方が壊れても運用を続けられますが、使える容量は全体の半分です。RAID5はデータとパリティ(誤り訂正用の情報)を全台に分散して書き、どれか1台が故障してもパリティから復元できます。n台で構成したときに使える容量は(n−1)台ぶんです。RAID6はパリティを二重に持つため2台までの同時故障に耐えられ、使える容量は(n−2)台ぶんになります。RAID10(RAID1+0)はミラーリングした組をストライピングするもので、最低4台が必要、使える容量はn/2台ぶんです。

「RAID5は(n−1)台ぶん、RAID6は(n−2)台ぶん、RAID10はn/2台ぶん」は計算問題で最もよく問われます。例えば2Tバイトのディスク6台でRAID5を構成すると、使用可能容量は2×(6−1)=10Tバイト、同じ6台でRAID6なら2×(6−2)=8Tバイト、RAID10なら2×6÷2=6Tバイトです。なお、RAIDは故障に備える仕組みであって、誤って消したファイルは復元できないため、バックアップの代わりにはなりません。

システムがどれだけ動いているかを表す指標が稼働率です。平均故障間隔MTBF(Mean Time Between Failures:修理が終わってから次に故障するまでの平均時間)と、平均修理時間MTTR(Mean Time To Repair:故障してから復旧するまでの平均時間)を使い、稼働率=MTBF÷(MTBF+MTTR)で求めます。この値がRASISのA(可用性、アベイラビリティ)にあたります。逆に故障率はMTBFの逆数で表されます。運用実績から求めるときは、全運用時間から停止時間を引いたものを故障回数で割ってMTBF、停止時間の合計を故障回数で割ってMTTRとします。

装置を組み合わせたときのシステム全体の稼働率は、直列と並列で計算が変わります。直列(すべてが動いていないと機能しない)は各稼働率の積で、A×Bです。並列(どれか1つでも動いていれば機能する)は、全部が同時に止まる確率を1から引いて、1−(1−A)×(1−B)で求めます。直列につなぐほど全体の稼働率は下がり、並列にするほど上がります。複合構成は、まず並列部分をひとかたまりの稼働率にまとめてから、直列の掛け算をするのが定石です。

n台のうちk台以上が動いていれば機能するシステムでは、動いている台数の組合せをすべて足します。例えば稼働率0.9の装置3台のうち2台以上動けばよい場合、ちょうど2台動く確率3×0.9×0.9×0.1=0.243と、3台とも動く確率0.9×0.9×0.9=0.729を足して0.972となります。「ちょうど2台」の場合の数が3通りであること(どの1台が止まるかで3通り)を忘れないのがコツです。

RAID 0/1/5/6/10の比較(n台で構成した場合)
方式最低台数使用可能容量耐えられる故障特徴
RAID02台n台ぶん(全容量)0台(冗長性なし)ストライピング。高速だが1台の故障で全滅する
RAID12台n/2台ぶん(2台なら1台ぶん)ミラーの片方1台ミラーリング。容量効率は悪いが構成が単純で確実
RAID53台(n−1)台ぶん1台パリティを全台に分散。容量効率と耐障害性のバランスがよい
RAID64台(n−2)台ぶん2台パリティを二重化。RAID5より安全だが書込み負荷が大きい
RAID104台n/2台ぶん各ミラー組で1台ずつRAID1+0。高速かつ耐障害性が高いが必要台数が多い
RAID0(ストライピング)
データを分割して複数台のディスクに分散して読み書きする方式。速度は上がるが冗長性がなく、1台でも故障すると全データを失う。
RAID1(ミラーリング)
同じデータを2台のディスクに同時に書き込む方式。片方が故障しても運用を続けられるが、使用可能容量は全体の半分になる。
RAID5
データとパリティを全ディスクに分散して記録する方式。最低3台が必要で、n台なら使用可能容量は(n−1)台ぶん。1台までの故障に耐えられる。
RAID6
パリティを二重に持ち、2台まで同時に故障してもデータを復元できる方式。最低4台が必要で、n台なら使用可能容量は(n−2)台ぶん。
RAID10(RAID1+0)
ミラーリングした組をストライピングで束ねる方式。最低4台が必要で、使用可能容量はn/2台ぶん。高速性と耐障害性を両立できるが費用は高い。
MTBF(平均故障間隔)
修理が完了してから次に故障するまでの平均時間。値が大きいほど故障しにくく、RASISの信頼性(Reliability)を表す指標になる。
MTTR(平均修理時間)
故障が発生してから復旧するまでの平均時間。値が小さいほど直しやすく、RASISの保守性(Serviceability)を表す指標になる。
稼働率(アベイラビリティ)
全体の時間のうちシステムが動いていた割合。MTBF÷(MTBF+MTTR)で求める。RASISの可用性(Availability)にあたる指標。
直列システムの稼働率
すべての装置が動いていないと機能しない構成の稼働率。各装置の稼働率の積(A×B)で求める。装置を増やすほど全体の稼働率は下がる。
並列システムの稼働率
どれか1つでも動いていれば機能する構成の稼働率。1−(1−A)×(1−B)で求める。全部が同時に停止する確率を1から引くという考え方。
故障率
単位時間あたりに故障が発生する割合で、MTBFの逆数として表される。MTBFが1,000時間なら故障率は1時間あたり0.001となる。

例題 1Tバイトのディスク5台でRAID6を構成したときの使用可能容量は何Tバイトか。

RAID6の使用可能容量は(n−2)台ぶんなので、1×(5−2)=3Tバイト。同じ5台でもRAID5なら1×(5−1)=4Tバイト、RAID0なら5Tバイトになる。

例題 稼働率0.95の装置Aと、稼働率0.9の装置を2台並列にしたブロックが直列につながっている。全体の稼働率はいくらか。

まず並列部分をまとめる。1−(1−0.9)×(1−0.9)=1−0.01=0.99。次に直列なので0.95×0.99=0.9405。並列を先にまとめてから掛け算するのが定石。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類4:システム構成要素(信頼性設計・システムの評価指標)

性能の評価指標と処理形態

レスポンスタイムとターンアラウンドタイムの違い、待ち行列を使った応答時間の見積り、ベンチマークやTCO、スケールアップとスケールアウトが分かるようになります。

システムの性能は複数の物差しで測ります。スループットは単位時間あたりに処理できる仕事の量で、1時間に何件処理できるかといった形で表します。レスポンスタイム(応答時間)は、利用者が入力を終えてから最初の応答が返り始めるまでの時間です。ターンアラウンドタイムは、処理を依頼してから結果をすべて受け取り終えるまでの時間で、入力(データの転送)や出力(印刷)の時間も含みます。したがって同じ処理ならターンアラウンドタイムのほうが長くなります。対話型処理では利用者の体感に直結するレスポンスタイムを、バッチ処理では全体が終わるまでのターンアラウンドタイムを重視します。

処理形態には、一定期間のデータをまとめて一括処理するバッチ処理、要求のたびに即座に処理して結果を返すリアルタイム処理、利用者と応答をやり取りしながら進める対話型処理があります。オンラインで発生する取引を1件ずつ確実に処理する形態はトランザクション処理と呼ばれ、処理は「すべて実行するか、まったく実行しないか」のどちらかになるように管理します。

混雑したシステムの応答時間は、待ち行列理論で見積もれます。窓口が1つで、到着も処理もばらつく最も基本的なモデル(M/M/1)では、利用率をρ(ロー)、1件あたりの平均処理時間をTsとすると、平均待ち時間は ρ÷(1−ρ)×Ts、平均応答時間(待ち時間+処理時間)は Ts÷(1−ρ) で求められます。利用率が0.5のときの待ち時間は処理時間と同じですが、0.8では4倍、0.9では9倍になります。利用率が1に近づくと待ち時間が急激に伸びる、というのがこの式の要点です。

性能を測る手段としてベンチマークテストがあります。標準的な処理を実際に実行して測定するもので、SPECはCPUなどの処理性能を測る指標、TPCはトランザクション処理性能(1分あたりの処理件数と価格性能比など)を測る指標です。将来の業務量の伸びを予測し、必要な資源を前もって計画することをキャパシティプランニングといいます。

性能が足りないときの増強には2つの方向があります。スケールアップは、CPUやメモリをより高性能なものに交換して1台の能力を上げるやり方。スケールアウトは、同等の機器の台数を増やして処理を分担するやり方です。スケールアウトは台数を増やせば伸ばしやすく、1台が故障しても全体は止まりにくい一方、処理を分担できる仕組みが必要です。

費用の面では、システムの導入費だけでなく生涯にわたる総費用で判断します。これがTCO(総所有費用)で、ハードウェアやソフトウェアの購入費・開発費といった初期コスト(イニシャルコスト)と、運用・保守・教育・電気代などの運用コスト(ランニングコスト)の合計です。導入時に安く見えても運用コストが高ければTCOは大きくなるため、比較は必ずTCOで行います。

レスポンスタイムとターンアラウンドタイムの違い
項目レスポンスタイムターンアラウンドタイム
測る区間入力し終えてから、最初の応答が返り始めるまで処理を依頼してから、結果をすべて受け取り終えるまで
含まれる時間システム内部の処理時間と伝送時間入力(転送)+処理+出力(印刷など)のすべて
長さの関係同じ処理ならこちらが短い同じ処理ならこちらが長い
重視される場面対話型処理。利用者の体感速度に直結するバッチ処理。仕事が終わるまでの総時間を見る
スループット
単位時間あたりに処理できる仕事の量。1時間あたりの処理件数などで表し、値が大きいほど処理能力が高い。バッチ処理の評価によく使われる。
レスポンスタイム
利用者が入力を終えた時点から、最初の応答が返り始めるまでの時間。応答時間ともいい、対話型処理での体感の速さを表す。
ターンアラウンドタイム
処理を依頼してから結果をすべて受け取り終えるまでの時間。入力データの転送時間や印刷などの出力時間も含むため、レスポンスタイムより長くなる。
バッチ処理
一定期間に発生したデータをまとめて一括で処理する形態。給与計算や月次集計などに使われ、スループットとターンアラウンドタイムが重視される。
リアルタイム処理
要求が発生するたびに即座に処理し、決められた時間内に結果を返す形態。座席予約や制御システムなど、遅れが許されない業務で使われる。
待ち行列(M/M/1)
窓口が1つで、到着間隔と処理時間がともにばらつくときの基本モデル。利用率ρ、平均処理時間Tsのとき、平均待ち時間はρ÷(1−ρ)×Tsとなる。
ベンチマークテスト
標準的な処理プログラムを実際に実行して性能を測る方法。CPUなどの処理性能はSPEC、トランザクション処理性能はTPCの指標がよく使われる。
キャパシティプランニング
将来の業務量やデータ量の伸びを予測し、必要な処理能力や記憶容量をあらかじめ計画すること。性能不足による停止や過剰投資を防ぐ。
スケールアップ
CPUやメモリをより高性能なものに交換し、1台あたりの処理能力を高める増強方法。構成は変わらないが、1台の上限を超えては伸ばせない。
スケールアウト
同等の機器を台数で増やし、処理を分担させる増強方法。台数で性能を伸ばしやすく、1台が故障しても全体は止まりにくい。
TCO(総所有費用)
システムの導入から廃棄までにかかる費用の総額。購入費や開発費などの初期コストと、運用・保守・教育などの運用コストの合計で比較する。

例題 利用率が0.5のシステムで、1件あたりの平均処理時間が0.4秒のとき、平均待ち時間はいくらか。

ρ÷(1−ρ)×Ts=0.5÷0.5×0.4=0.4秒。利用率0.5では待ち時間は処理時間と等しくなる。応答時間は待ち時間+処理時間で0.8秒。

例題 1件0.5秒で処理できるシステムのスループットは1時間あたり何件か。

3,600秒÷0.5秒=7,200件。スループットは単位時間あたりの処理量なので、1件の所要時間の逆数に時間を掛ければよい。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類4:システム構成要素(システムの評価指標・処理形態)

ソフトウェアとハードウェア

OSとタスク管理

OSが「今どのタスクにCPUを渡すか」をどうやって決めているかが分かるようになります。

オペレーティングシステム(OS)は、CPU・主記憶・入出力装置といった資源を管理し、応用ソフトウェアから使いやすい形で見せる基本ソフトウェアです。資源管理や割込み処理を受け持つ中核部分をカーネルと呼び、利用者のコマンドを解釈する部分(シェル)とは役割が分かれています。

CPUは1つのコアにつき一度に1つの命令の流れしか実行できません。そこでOSは、実行の単位であるタスク(プロセス)を細かく切り替えて、あたかも同時に動いているように見せます。プロセスは主記憶空間や開いているファイルなどの資源をひとまとまりで持ちますが、その中をさらに分けた実行の流れがスレッドです。同じプロセス内のスレッドは主記憶空間を共有するので、切替えがプロセスの切替えより軽くて済みます。

タスクは「実行可能」「実行」「待ち」の3つの状態を行き来します。実行可能はCPUの順番待ち、実行はCPUを使っている最中、待ちは入出力の完了などを待っていてCPUを渡されても進めない状態です。実行可能から実行への遷移をディスパッチと呼び、これを行うOSの部品をディスパッチャといいます。逆に、実行中のタスクからCPUを取り上げて他へ回すことをプリエンプション(横取り)といいます。

誰にCPUを渡すかの決め方がスケジューリングです。到着順(FCFS)、処理時間の短い順(SJF)、優先度順、一定時間ごとに順番を回すラウンドロビンなどがあり、ラウンドロビンで区切る一定時間をタイムクォンタム(タイムスライス)といいます。処理時間の短いものを先に流すSJFは平均ターンアラウンドタイムが短くなりますが、長いタスクがいつまでも実行されない(飢餓)おそれがあります。

複数のタスクが同じ資源を同時にいじると壊れてしまうので、一度に1つしか入れない区間(クリティカルセクション)を作って守ります。これが排他制御で、代表的な仕組みがセマフォです。ただし排他制御をすると、お互いが相手の持つ資源の解放を待ち続けて永久に止まるデッドロックが起こり得ます。デッドロックは、相互排除・占有して待つ・横取り不可・循環待ちの4つがすべて揃ったときに発生するので、どれか1つを崩せば防げます。

処理の途中で急ぎの用件が入ったときに、いま実行中の処理を中断して別の処理へ移るのが割込みです。0除算やページフォールトのようにプログラム自身の実行が原因で起きるものを内部割込み(プログラム割込み)、入出力の完了通知・タイマ・電源異常のように外側の要因で起きるものを外部割込みといいます。

タスクの3状態と遷移、および主なスケジューリング方式
区分名前内容
状態実行可能状態実行の準備は整っていて、CPUの割当てを待っている状態
状態実行状態CPUを割り当てられ、命令を実行している状態。CPU1個につき1タスク
状態待ち状態入出力の完了などを待っていて、CPUを渡されても進めない状態
遷移実行可能→実行ディスパッチ。スケジューラが選んだタスクにCPUを割り当てる
遷移実行→実行可能プリエンプション。タイムクォンタムの使い切りや、より優先度の高いタスクの割込みでCPUを取り上げられる
遷移実行→待ち入出力を要求するなどして、自らCPUを手放す
遷移待ち→実行可能入出力完了の割込みなどで待つ理由がなくなる。ここで直接「実行」には移らない
方式到着順(FCFS)到着した順に実行する。ノンプリエンプティブ。長いタスクが先だと後続が待たされる
方式処理時間順(SJF)処理時間の見積りが短いものから実行する。平均ターンアラウンドタイムは最短になるが、長いタスクが後回しにされ続けることがある
方式優先度順優先度の高いタスクから実行する。プリエンプティブにすると、実行中でも高優先度の到着で横取りされる
方式ラウンドロビンタイムクォンタムごとにCPUを取り上げ、待ち行列の最後尾へ回す。応答時間が平均化され、対話処理に向く
カーネル
OSの中核部分。CPUや主記憶の割当て、タスクの切替え、割込みの処理、入出力の制御など、ハードウェアに近い基本機能を受け持つ。利用者が直接触るのではなく、シェルや応用ソフトウェアを通して使われる。
プロセス
実行中のプログラムをOSが管理する単位。専用の主記憶空間や開いているファイルなどの資源をひとまとまりで持ち、他のプロセスからは独立している。生成や切替えの負担はスレッドより重い。
スレッド
プロセスの中にある実行の流れ。同じプロセス内のスレッドは主記憶空間を共有するので、データの受渡しが簡単で切替えも軽い。反面、共有データを同時に書き換えないよう排他制御が必要になる。
ディスパッチャ
実行可能状態のタスクの中から次に動かすものを選び、CPUを割り当てて実行状態にするOSの部品。どのタスクを選ぶかの方針がスケジューリングで、その方針に従って実際に切り替えるのがディスパッチャの仕事。
プリエンプション
実行中のタスクからOSが強制的にCPUを取り上げ、他のタスクへ渡すこと。タイムクォンタムの使い切りや、より優先度の高いタスクの到着がきっかけになる。これを行わない方式をノンプリエンプティブという。
タイムクォンタム
ラウンドロビン方式で1つのタスクが続けてCPUを使える時間の上限。タイムスライスともいう。短くすると応答は良くなるが切替えの回数が増えてオーバヘッドが大きくなる。
セマフォ
共有資源の空き数を表す変数を使った排他制御の仕組み。資源を取るときP操作で1減らし、空きがなければタスクを待たせる。返すときV操作で1増やし、待っているタスクを起こす。空き数が1のものを特に二値セマフォという。
デッドロック
複数のタスクが互いに相手の持つ資源の解放を待ち、どれも先へ進めなくなる状態。相互排除・占有して待つ・横取り不可・循環待ちの4条件が同時に成立すると起こるので、資源の取得順序を統一するなどして条件を崩して防ぐ。
内部割込み
実行中のプログラム自身が原因で起きる割込み。0による除算、桁あふれ、無効な命令の実行、ページフォールト、スーパバイザコール(SVC)などがある。プログラム割込みとも呼ばれる。
外部割込み
実行中のプログラム以外の要因で起きる割込み。入出力の完了通知、タイマによる時間切れ、機械故障や電源異常の検知、コンソールからの介入などがある。
ターンアラウンドタイム
タスクを投入してから、その結果がすべて出終わるまでの時間。待ち時間と処理時間を合わせたもの。応答が返り始めるまでの時間を表すレスポンスタイムとは区別する。

例題 タスクA(処理時間8ミリ秒)とタスクB(処理時間2ミリ秒)が同時に到着した。到着順にA→Bで実行した場合と、処理時間順にB→Aで実行した場合の平均ターンアラウンドタイムを比べよ。

A→Bの順では、Aが8ミリ秒、Bが8+2=10ミリ秒で終わるので平均は(8+10)÷2=9ミリ秒。B→Aの順ではBが2ミリ秒、Aが2+8=10ミリ秒なので平均は(2+10)÷2=6ミリ秒。全体の終了時刻(10ミリ秒)は同じでも、短いものを先に流すと平均ターンアラウンドタイムは短くなる。

例題 タスクXが資源1を確保したまま資源2を要求し、タスクYが資源2を確保したまま資源1を要求している。この状態を防ぐ簡単な方法は何か。

デッドロックの4条件のうち「循環待ち」を崩せばよい。資源に番号を付け、必ず番号の小さい順に確保すると決めておけば、XもYも資源1→資源2の順に取ることになり、輪ができない。ほかに、必要な資源を最初に一括で確保して「占有して待つ」を崩す方法もある。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類5:ソフトウェア(オペレーティングシステム)

記憶管理と仮想記憶

主記憶が足りなくてもプログラムが動く仕組みと、ページフォールト回数の数え方が分かるようになります。

主記憶は有限なので、OSは限られた領域を複数のプログラムで分け合わせます。あらかじめ決まった大きさに区切っておく固定区画方式は管理が簡単ですが、区画より小さいプログラムを置くと余りが無駄になります(内部断片化)。必要な大きさだけ切り出す可変区画方式は無駄が少ない代わりに、割当てと解放を繰り返すうちに小さな空きがあちこちに散らばります。これがフラグメンテーション(断片化)で、置き場所を前に詰め直して空きを1か所にまとめる操作をコンパクションといいます。

実記憶が足りないときの古典的な対策が、スワッピングとオーバレイです。スワッピングは実行中のプログラムを丸ごと補助記憶へ退避(スワップアウト)し、必要になったら戻す(スワップイン)方式。オーバレイはプログラムを同時には使わない単位に分けておき、必要な単位だけを同じ領域に読み込んで上書きする方式で、分割の仕方をプログラム側が決めます。

仮想記憶は、プログラムが使うアドレス(仮想アドレス・論理アドレス)と、実際の主記憶のアドレス(実アドレス・物理アドレス)を切り離す考え方です。仮想空間を一定の大きさのページに区切り、必要になったページだけを主記憶のページ枠に載せます。実行時にはページテーブルを引いて仮想アドレスを実アドレスに変換します(動的アドレス変換)。この変換を高速に行う専用のキャッシュがTLBです。

参照したページが主記憶にないときに起きる割込みがページフォールトです。ページフォールトが起きるとOSは補助記憶から該当ページを読み込みます。空きページ枠がなければ、どれかを追い出さなければなりません。この選び方がページ置換えアルゴリズムで、FIFO(最も古く読み込んだもの)、LRU(最後に参照されてから最も長いもの)、LFU(参照回数が最も少ないもの)などがあります。最初から全部を読み込まず、参照されたときに初めて読み込む方式をデマンドページングといいます。

ページ置換えは実際に手を動かして数えるのがいちばん確実です。ページ枠の中身を左から順にメモしながら、参照列を1つずつ処理していきます。主記憶にあれば何もせず(LRUなら参照順だけ更新)、なければフォールト1回と数えて読み込みます。なお、FIFOではページ枠を増やしたのにページフォールトが増えてしまうことがあり、これをベイラディの異常(Beladyの異常)といいます。LRUではこの逆転は起こりません。

多重度を上げすぎると、どのタスクも必要なページを主記憶に置けず、ページの入替えばかりが起きてCPUがほとんど仕事をしなくなります。この現象がスラッシングです。対策は多重度を下げる、主記憶を増設する、局所性の高いプログラムに直す、などです。

主なページ置換えアルゴリズムの比較
方式追い出すページ長所短所
FIFO最も古く読み込んだページ読み込んだ順番だけ覚えればよく、実装が簡単よく使うページも古ければ追い出す。ベイラディの異常が起こることがある
LRU最後に参照されてから最も長く使われていないページ参照の局所性に合い、実際の効率がよい参照のたびに順序を更新する必要があり、実装のコストが高い
LFU参照された回数が最も少ないページよく使うページが主記憶に残りやすい昔だけよく使われたページが居座り続けることがある
OPT(最適)この先最も長く参照されないページ理論上ページフォールトが最小になる将来の参照を知る必要があり実現できない。他方式を評価する基準として使う
フラグメンテーション
主記憶やディスクの割当てと解放を繰り返すうちに、使える空き領域が小さく分断されて散らばる現象。合計では十分な空きがあっても、連続した大きな領域が取れないためプログラムを置けなくなる。
コンパクション
散らばった空き領域を1か所にまとめるため、主記憶上のプログラムを前へ詰め直す操作。空きが連続するので大きなプログラムを置けるようになるが、詰め直している間はオーバヘッドが発生する。
スワッピング
実行中のプログラムを丸ごと補助記憶へ退避し(スワップアウト)、必要になったら主記憶へ戻す(スワップイン)方式。優先度の低いタスクを一時的に追い出して、主記憶の空きを作るために使われる。
オーバレイ
主記憶に入りきらない大きなプログラムを、同時には使わない単位に分けておき、必要になった単位だけを同じ領域へ上書きして読み込む方式。分割の仕方はプログラムの作成者が指定する。
ページング
仮想記憶を固定長のページに区切り、ページ単位で主記憶と補助記憶をやり取りする方式。可変長の単位で区切るセグメンテーションと違い、外部断片化が起きにくい。
ページフォールト
参照した仮想ページが主記憶のページ枠に載っていないときに発生する割込み。OSは補助記憶から該当ページを読み込み、必要なら他のページを追い出す。内部割込みに分類される。
FIFO方式
ページ置換えで、主記憶に読み込んでから最も時間がたったページを追い出す方式。読み込んだ順番だけ覚えておけばよく実装が簡単だが、よく使うページでも古ければ追い出してしまう。
LRU方式
ページ置換えで、最後に参照されてから最も長く使われていないページを追い出す方式。直前によく使ったものは今後も使うという参照の局所性に合うため効率がよいが、参照のたびに順序を更新する必要がある。
LFU方式
ページ置換えで、参照された回数が最も少ないページを追い出す方式。よく使うページが主記憶に残りやすい一方、昔たくさん参照されたが今は使われないページが居座り続けることがある。
デマンドページング
プログラムの開始時にすべてを読み込まず、実際に参照されてページフォールトが起きたときに初めてそのページを読み込む方式。使わないページを読み込まずに済むので、主記憶を有効に使える。
スラッシング
多重プログラミングの度合いを上げすぎた結果、ページの入替えばかりが起きてCPUの利用率とスループットが急激に低下する現象。多重度を下げる、主記憶を増設するなどで解消する。
ベイラディの異常
FIFO方式のページ置換えで、ページ枠の数を増やしたにもかかわらずページフォールトの回数が増えてしまう現象。LRU方式など、枠を増やせば必ず内容が包含される方式では起こらない。

例題 ページ枠が3つ(最初は空)で、参照列が 1, 2, 3, 1, 4 のとき、FIFO方式のページフォールト回数はいくつか。

枠の中身を追う。1→フォールト(枠:1)、2→フォールト(1,2)、3→フォールト(1,2,3)、1→主記憶にあるのでヒット、4→フォールトで最も古い1を追い出す(2,3,4)。よってページフォールトは4回。LRUでも同じ手順だが、追い出す相手は「最後に使われてから最も古いもの」なので、4を読むときに追い出されるのは2になる。

例題 主記憶の空きの合計は500Mバイトあるのに、300Mバイトのプログラムを置けなかった。原因と対処は何か。

可変区画方式で割当てと解放を繰り返した結果、空きが小さく分断されるフラグメンテーションが起きている。連続した300Mバイトが取れないため置けない。対処はコンパクションで空きを1か所にまとめること。仮想記憶(ページング)にすれば、そもそも連続した実領域を必要としなくなる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類5:ソフトウェア(記憶管理)

ミドルウェアとファイルシステム

OSと業務アプリの間にある層と、ファイルの置き場所の指定方法・守り方が分かるようになります。

OSと応用ソフトウェアの間に入り、多くのアプリが共通して必要とする機能をまとめて提供するソフトウェアがミドルウェアです。データベース管理システム(DBMS)、トランザクションモニタ、Webアプリケーションサーバ、通信管理、運用管理ツールなどが代表例です。ミドルウェアを使うと、アプリはOSの細かい違いを意識せずに済み、開発量も減ります。

ソフトウェアの機能を外から呼び出すための取決めがAPI(Application Programming Interface)です。呼び出す関数の名前、渡す引数、返る値、データの形式などを定めたもので、中身の作り方を知らなくても機能を利用できます。Web上でHTTPを使って呼び出せるものはWeb APIと呼ばれます。

利用者が入力したコマンドを解釈してOSに実行を依頼するプログラムがシェルです。シェルはカーネルの外側にあり、コマンドを並べたファイル(シェルスクリプト)で定型作業を自動化できます。カーネルが資源管理の中核であるのに対し、シェルは人とOSの間の通訳だと考えると区別しやすくなります。

ファイルの中のレコードをどう並べ、どうたどるかの決め方がファイル編成です。前から順に並べる順編成、索引を別に持つ索引編成、キーの値から格納位置を計算する直接編成、複数のメンバとその場所を示すディレクトリを持つ区分編成があります。順次アクセスしかできないのが順編成、計算した位置へ一発で行けるのが直接編成、その両方ができるのが索引編成です。

ファイルは階層構造のディレクトリに置かれます。最上位がルートディレクトリで、今いる場所がカレントディレクトリです。ルートから順に書き下ろす指定が絶対パス、カレントディレクトリを起点にした指定が相対パスで、相対パスではカレントを「.」、親ディレクトリを「..」で表します。「..」を1つ書くと1階層上がる、と1つずつ丁寧にたどるのが確実です。

障害に備えてデータの複製を取るのがバックアップです。全部を毎回取るフルバックアップのほか、直前のフルバックアップ以降の変更分を取る差分バックアップ、前回のバックアップ(種類を問わない)以降の変更分だけを取る増分バックアップがあります。復元にはフルバックアップ1本+差分1本(差分方式)、またはフルバックアップ1本+その後の増分すべて(増分方式)が必要です。増分は取得が速い代わりに復元が手間になります。

更新の前後の記録を時系列に残しておくファイルがジャーナル(ログ)です。障害が起きたとき、更新後の記録を使って復元後のデータに再度反映するロールフォワードや、更新前の記録を使って処理前の状態へ戻すロールバックに使います。

主なファイル編成の比較
編成レコードの並べ方目的のレコードへの到達主な用途
順編成入力順またはキー順に前から並べる先頭から順に読む(順次アクセスのみ)一括処理、ログ、磁気テープへの保存
索引編成順に並べたデータ部と、別に持つ索引部索引を引いてから読むので、直接アクセスも順次アクセスもできるキーで1件取り出しつつ、一覧も出したい業務ファイル
直接編成キーの値から計算した位置に置く計算した位置へ直接アクセスするキーが分かっていて高速に1件取り出したい場合
区分編成複数のメンバ(小さな順編成)とディレクトリディレクトリでメンバを探し、メンバ内は順次に読むプログラムライブラリ
ミドルウェア
OSと応用ソフトウェアの中間に位置し、多くのアプリが共通して使う機能を提供するソフトウェア。DBMS、トランザクションモニタ、Webアプリケーションサーバ、運用管理ツールなどが該当し、アプリの開発量を減らせる。
API
あるソフトウェアの機能を外部のプログラムから呼び出すための取決め。関数名・引数・戻り値・データ形式などを定める。中身の実装を知らなくても機能を使えるので、部品としての再利用がしやすくなる。
シェル
利用者が入力したコマンドを解釈し、対応するプログラムの実行をOS(カーネル)に依頼するプログラム。コマンドを並べたシェルスクリプトを書けば、定型作業をまとめて自動実行できる。
順編成ファイル
レコードを入力順やキー順に前から並べたファイル。先頭から順に読む順次アクセスしかできないが、構造が単純で一括処理に向く。磁気テープのような順次アクセス専用の媒体でも使える。
索引編成ファイル
レコードを順に並べたデータ部と、キーから位置を探すための索引部を組み合わせたファイル。索引を引いて目的の位置へ飛ぶ直接アクセスと、前から読む順次アクセスの両方ができる。
直接編成ファイル
キーの値をハッシュ関数などで格納位置に対応づけ、計算した位置へ直接アクセスできるようにしたファイル。1件を高速に取り出せるが、異なるキーが同じ位置になる衝突(シノニム)への対処が必要。
絶対パス
ルートディレクトリを起点に、たどるディレクトリを順に並べてファイルの位置を表す書き方。カレントディレクトリがどこであっても同じファイルを指す。先頭が区切り文字「/」で始まる。
相対パス
カレントディレクトリを起点にファイルの位置を表す書き方。カレントを「.」、1つ上の親ディレクトリを「..」で表す。カレントが変わると同じ表記でも指す先が変わる。
差分バックアップ
直前のフルバックアップ以降に変更されたデータだけを保存する方式。復元にはフルバックアップと最新の差分バックアップの2本があればよいが、日がたつほど1回の取得量が増える。
増分バックアップ
前回のバックアップ(フルでも増分でもよい)以降に変更されたデータだけを保存する方式。1回の取得量と時間は最も少ないが、復元にはフルバックアップとその後のすべての増分が必要になる。
ジャーナル
データの更新前と更新後の内容を時系列に記録したファイル。ログファイルともいう。更新後情報を使って障害直前まで進めるロールフォワードや、更新前情報を使って処理開始前に戻すロールバックに用いる。

例題 カレントディレクトリが /usr/local/bin のとき、相対パス ../lib/data.txt はどのファイルを指すか。

「..」で1階層上がって /usr/local。続く lib/data.txt をたどるので /usr/local/lib/data.txt を指す。「..」の個数だけ上がってから、残りを下りていくと考えると間違えにくい。もし ../../lib/data.txt なら2階層上がって /usr となり、/usr/lib/data.txt を指す。

例題 日曜にフルバックアップ、月〜土は差分バックアップを取得している。木曜の朝に障害が起きた。水曜終業時点に戻すには何本必要か。

差分バックアップは「直前のフルバックアップ以降の変更分」なので、水曜の差分だけで月・火・水の変更がすべて含まれる。したがって日曜のフル1本+水曜の差分1本の計2本。これが増分バックアップなら、フル1本+月・火・水の増分3本の計4本が必要になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類5:ソフトウェア(ミドルウェア・ファイルシステム)

開発ツールとOSSとハードウェア

ソースコードが動く形になるまでの流れ、OSSライセンスの違い、論理回路の読み方が分かるようになります。

人が書いた原始プログラム(ソースコード)は、そのままではCPUが実行できません。全体をまとめて機械語へ翻訳するのがコンパイラ、1行ずつ解釈しながら実行するのがインタプリタです。コンパイラが出す目的プログラム(オブジェクトファイル)は、まだ他のモジュールやライブラリと結びついていないので、それらを結合して実行可能プログラムにするリンカ(連係編集プログラム)が必要です。実行可能プログラムを主記憶へ読み込んで実行できる状態にするのがローダです。コンパイル・リンクなど一連の作業をまとめて自動実行することをビルドといいます。

自分が動かしているコンピュータとは別のアーキテクチャ向けの目的プログラムを生成するコンパイラをクロスコンパイラといい、これを使った開発をクロス開発と呼びます。組込み機器はメモリも処理能力も限られていて開発環境をその上で動かせないため、PC上で開発してから機器へ書き込むクロス開発が一般的です。

開発を支える道具としては、実行を止めながら変数を確かめるデバッガ、実行せずにコードの誤りや規約違反を調べる静的解析ツール、実際に動かして通った経路の割合(網羅率)を測る動的テストツール、テストデータを自動生成するツールなどがあります。

ソースコードが公開され、利用・改変・再配布が認められたソフトウェアがOSS(オープンソースソフトウェア)です。OSI(Open Source Initiative)の定義では、再配布の自由、ソースコードの入手、派生物の許可、利用する人や分野で差別しないことなどが求められます。無償であることは条件ではなく、有償で販売してもかまいません。

OSSのライセンスは、改変・再配布したときに何を求めるかで性格が分かれます。同じライセンスでの公開を求める性質をコピーレフトといいます。GPLは組み込んだプログラム全体に同じライセンスでの公開を求める強いコピーレフト、LGPLはライブラリの改変部分だけを対象にする弱いコピーレフト、MPLはファイル単位のコピーレフトです。これに対しMIT LicenseやApache License 2.0はコピーレフトを持たず、著作権表示などを残せば、改変部分を公開せずに再配布できます。Apache License 2.0には特許の許諾に関する条項がある点が特徴です。

ハードウェアの最小部品が論理ゲートです。AND(両方1なら1)、OR(どちらか1なら1)、NOT(反転)を基本に、その否定であるNAND・NOR、入力が異なるときだけ1になるXOR(排他的論理和)があります。NANDやNORは、両方の入力に同じ信号を入れるとNOTとして働くため、これだけですべての論理回路を作れます(機能的完全性)。入力の組合せと出力の対応をすべて書き出した表が真理値表で、これを図に並べ替えて式を簡単にする手法がカルノー図です。

1桁の2進数の足し算をする回路が半加算器で、和Sは入力の排他的論理和、桁上げCは論理積で表せます。下位からの桁上げも受け取れるようにしたものが全加算器で、半加算器2個とOR1個で作れます。一方、入力の組合せだけで出力が決まる組合せ回路に対し、過去の状態も出力に影響する回路が順序回路で、その基本素子が1ビットを保持するフリップフロップです。

組込みシステムは、機器の中に組み込まれて特定の機能を果たすコンピュータシステムです。決められた時間内に必ず処理を終えることが求められる場面では、タスクの優先度制御と応答時間の保証を重視したリアルタイムOS(RTOS)が使われます。電池で動く機器も多いため、動作周波数や電圧を必要に応じて下げる、使わない回路への電力供給を止めるなど、消費電力を抑える工夫も重要になります。

基本論理ゲートの真理値表(入力A,Bが00/01/10/11のときの出力)と、主なOSSライセンスのコピーレフトの強さ
区分名前性格詳しく
論理ゲートAND論理積出力は 0 / 0 / 0 / 1。両方の入力が1のときだけ1
論理ゲートOR論理和出力は 0 / 1 / 1 / 1。どちらか一方でも1なら1
論理ゲートNOT否定入力1本。0→1、1→0 と反転する
論理ゲートNAND論理積の否定出力は 1 / 1 / 1 / 0。両入力に同じ信号を入れるとNOTになる
論理ゲートNOR論理和の否定出力は 1 / 0 / 0 / 0。両入力に同じ信号を入れるとNOTになる
論理ゲートXOR(排他的論理和)不一致で1出力は 0 / 1 / 1 / 0。半加算器の和の出力に使う
論理ゲートXNOR(一致回路)一致で1出力は 1 / 0 / 0 / 1。XORの否定
OSSライセンスMIT Licenseコピーレフトなし著作権表示とライセンス文を残せば、改変部分を公開せずに再配布できる
OSSライセンスApache License 2.0コピーレフトなし改変部分の公開は不要。特許の許諾に関する条項をもつ点が特徴
OSSライセンスLGPL弱いコピーレフトライブラリを改変した部分は公開が必要。リンクして使う側のプログラムまでは同じ条件を求めない
OSSライセンスMPL 2.0ファイル単位のコピーレフト改変したファイルだけを同じライセンスで公開すればよい
OSSライセンスGPL強いコピーレフト組み込んだプログラム全体を同じライセンスでソースコード公開する義務がある
コンパイラ
原始プログラム全体を解析し、機械語などの目的プログラムに翻訳するソフトウェア。実行前に翻訳を済ませるので実行速度は速いが、修正のたびに翻訳とリンクをやり直す必要がある。
インタプリタ
原始プログラムを1行(1文)ずつ解釈しながら実行するソフトウェア。翻訳を待たずにすぐ試せて誤りの箇所も分かりやすいが、実行のたびに解釈するためコンパイラ方式より実行は遅くなりやすい。
リンカ
コンパイラが出力した複数の目的プログラムやライブラリを結合し、1つの実行可能プログラムを作るソフトウェア。連係編集プログラムともいう。実行時に結合する方式を動的リンクという。
ローダ
実行可能プログラムを補助記憶から主記憶へ読み込み、必要なアドレスの調整を行って実行できる状態にするソフトウェア。翻訳や結合は行わない点でコンパイラやリンカと区別する。
クロスコンパイラ
コンパイラが動作しているコンピュータとは異なるアーキテクチャ向けの目的プログラムを生成するコンパイラ。資源の限られた組込み機器向けの開発(クロス開発)で使われる。
OSS
オープンソースソフトウェア。ソースコードが入手でき、利用・改変・再配布が認められたソフトウェア。OSIの定義では利用する人や分野を差別しないことなどが条件で、無償であることは条件に含まれない。
コピーレフト
OSSを改変・再配布するとき、派生物にも同じライセンスを適用してソースコードを公開するよう求める考え方。GPLは強いコピーレフト、LGPLやMPLは範囲を限った弱いコピーレフト、MITやApacheはコピーレフトを持たない。
真理値表
論理回路の入力のすべての組合せに対して出力がどうなるかを一覧にした表。入力がn本なら行数は2のn乗になる。回路の同一性を確かめたいときは、真理値表が完全に一致するかを調べればよい。
カルノー図
真理値表を、隣り合うマスの入力が1ビットだけ違うように並べ替えた図。出力が1のマスを2のべき乗個のまとまりでくくることで、論理式を機械的に簡単化できる。
半加算器
1桁の2進数2個を加算する回路。和Sは2入力の排他的論理和、桁上げCは論理積で表される。下位からの桁上げを受け取れないので、多桁の加算には全加算器が必要になる。
全加算器
1桁の2進数2個と下位からの桁上げの計3入力を加算し、和と上位への桁上げを出力する回路。半加算器2個とOR回路1個で構成でき、桁数だけ並べると多桁の加算器になる。
フリップフロップ
1ビットの情報を保持できる順序回路の基本素子。過去の入力(現在の状態)と今の入力で次の出力が決まる。レジスタやSRAMなどの記憶素子に使われ、RS型・D型・JK型・T型などがある。
リアルタイムOS
決められた時間内に処理を終えることを重視したOS。タスクの優先度に応じた確実な切替えと、割込みへの短い応答時間を提供する。組込みシステムや制御システムで使われる。

例題 NANDゲートだけでNOT回路とAND回路を作るには、それぞれ何個必要か。

NOTは、NANDの2つの入力に同じ信号Aを与えればよい。A・Aの否定はAの否定なので1個で作れる。ANDは、まずNANDでA・Bの否定を作り(1個)、その出力をNOTとして働くNANDに通して反転する(1個)ので合計2個。同じ考え方でORはNOT2個+NAND1個の計3個になる。

例題 2進数の 1 と 1 を半加算器で足すと、出力はどうなるか。

和Sは排他的論理和なので1と1で0、桁上げCは論理積なので1と1で1。つまりS=0、C=1で、2進数の10(10進数の2)を表す。半加算器は下位からの桁上げを受け取れないので、2桁目以降には全加算器を使う。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類5:ソフトウェア(開発ツール・オープンソースソフトウェア)/IPA 基本情報技術者試験 シラバス Ver.9.2 大分類2:コンピュータシステム 中分類6:ハードウェア

データベース

データベース方式と設計

DBMSが何をしてくれるのかと、E-R図と正規化を使って表を設計する手順が分かります。

データベースとは、複数の業務や利用者が共同で使えるように、重複をできるだけ省いて整理して蓄えたデータの集まりです。これを管理するソフトウェアがデータベース管理システム(DBMS)で、データの定義、検索や更新の受付、複数人が同時に使っても矛盾が起きないようにする排他制御、障害が起きたときの回復、利用者ごとのアクセス権限の管理などをまとめて引き受けます。応用プログラムはファイルの中身を直接いじるのではなく、DBMSに「この条件の行がほしい」と頼む形になります。

データベースの構造は3層スキーマという三つの階層で考えます。外部スキーマは利用者や応用プログラムから見た見え方で、必要な部分だけを切り出したもの(ビューがその代表)です。概念スキーマはデータ全体の論理的な構造で、どんな表があってどんな項目を持つかを決めます。内部スキーマは記憶装置への実際の格納方法で、ファイル編成や索引の持ち方を決めます。三つに分けておくと、格納方法を変えても概念スキーマから上は直さずに済み(物理的データ独立性)、表の構造を足しても既存のプログラムを直さずに済みます(論理的データ独立性)。

現在の主流は関係データベースで、データを行と列から成る表(関係)で表します。設計はまず現実世界のモデル化から始めます。E-R図では、管理したいもの(社員、部門、商品など)を実体(エンティティ)、実体どうしのつながりを関連(リレーションシップ)として描き、関連には1対1・1対多・多対多という多重度(カーディナリティ)を付けます。関係データベースの表には多対多をそのまま書けないので、両方のキーを持つ表(連関エンティティ、たとえば履修表)を間に置いて、1対多と1対多の二つに分けて実装します。

次に、同じ事実が何か所にも重複して入って更新のたびに矛盾が起きる状態(更新時異状)を防ぐために正規化を行います。1行の中に繰返しがある非正規形から、どのます目にも値が一つだけ入る第1正規形へ。主キーの一部だけで決まる項目(部分関数従属)を別表に出して第2正規形へ。主キー以外の項目を経由して決まる項目(推移的関数従属)を別表に出して第3正規形へ、と段階的に分解します。実務では第3正規形まで進めるのが基本で、さらにすべての関数従属の決定項が候補キーになるようにしたものがボイスコッド正規形です。

表どうしのつながりはキーで保ちます。行を一意に識別できる項目の組が候補キーで、その中から選んだ一つが主キーです。主キーには重複値も空値(NULL)も入れられません(実体整合性制約)。他の表の主キーを参照する項目が外部キーで、外部キーの値は参照先に必ず存在するか、さもなければNULLでなければなりません(参照整合性制約)。この制約があるため、参照されている親の行をいきなり削除することはできません。

関係データベース以外の選択肢がNoSQLです。キーと値の組だけを高速に出し入れするキーバリュー型、JSONのような構造をそのまま入れられるドキュメント指向型、列単位でまとめて大量データの集計に強いカラム指向型、節点と辺でつながりをたどるグラフ指向型があります。表の形が決まっていなくてよい代わりに、SQLによる複雑な結合や厳密なトランザクションは苦手なことが多く、用途で使い分けます。

正規形の条件と、その段階で取り除くもの
正規形条件取り除くもの
非正規形1行の中に繰返し(複数組の値)が入っている受注1行の中に商品名と数量を3組並べて持っている
第1正規形どの行・どの列にも値が一つだけ入っている繰返し部分受注1行+商品ごとの明細行に分ける
第2正規形第1正規形であり、主キー以外の項目が主キー全体に完全に関数従属する部分関数従属(主キーの一部だけで決まる項目)主キーが{受注番号,商品番号}の表から、商品番号→商品名を商品表へ出す
第3正規形第2正規形であり、主キー以外の項目の間に関数従属がない推移的関数従属(キー→A→B)社員番号→部門コード→部門名 の部門名を部門表へ出す
ボイスコッド正規形すべての関数従属の決定項が候補キーである候補キーでない決定項候補キーが複数あって項目が重なるときに第3正規形との差が出る
DBMS
データベース管理システム。データの定義と操作、複数利用者の排他制御、障害からの回復、アクセス権限の管理などをまとめて行うソフトウェア。応用プログラムはDBMS経由でデータを扱う。
3層スキーマ
データベースの構造を、利用者から見た外部スキーマ、全体の論理構造である概念スキーマ、記憶装置への格納方法である内部スキーマの三つに分けて定義する考え方。
データ独立性
格納方法を変えても論理構造から上に影響しない物理的データ独立性と、論理構造を変えても既存の応用プログラムに影響しない論理的データ独立性のこと。3層スキーマによって得られる。
E-R図
管理対象を実体(エンティティ)、実体どうしのつながりを関連(リレーションシップ)として表した図。関連には1対1・1対多・多対多という多重度(カーディナリティ)を付ける。
連関エンティティ
多対多の関連を関係データベースで実装するために、両側の主キーを組み合わせて持たせた中間の表。学生と講義の間に置く履修表などが該当する。
関数従属
ある項目Xの値が決まればYの値が一つに決まる関係。X→Yと書き、Xを決定項という。正規化は、この関数従属を手掛かりに表を分解していく作業である。
部分関数従属
複数の項目から成る主キーのうち、その一部だけで決まってしまう関数従属。これを別の表に分けて取り除くと第2正規形になる。
推移的関数従属
主キー→A→Bのように、主キー以外の項目を経由して決まる関数従属。これを別の表に分けて取り除くと第3正規形になる。
ボイスコッド正規形
すべての関数従属について、決定項が必ず候補キーになっている状態。第3正規形をさらに強めたもので、候補キーが複数あって項目が重なる場合に違いが出る。
候補キー
行を一意に識別でき、かつどの項目を欠いても識別できなくなる項目の組。一つの表に複数存在することがあり、その中から選んだ一つが主キーになる。
参照整合性制約
外部キーの値は、参照先の表に実在する主キーの値か、さもなければNULLでなければならないという決まり。参照されている行をそのまま削除することはできない。
NoSQL
関係データベース以外のデータ格納方式の総称。キーバリュー型、ドキュメント指向型、カラム指向型、グラフ指向型があり、大量データや構造が定まらないデータの扱いに向く。

例題 例題:受注明細(受注番号, 商品番号, 商品名, 単価, 数量)は、主キーが{受注番号, 商品番号}で、商品名と単価は商品番号だけで決まる。何正規形か。

答えは第1正規形。商品名と単価が主キーの一部である商品番号だけで決まる部分関数従属があるため、第2正規形の条件を満たさない。商品(商品番号, 商品名, 単価)と受注明細(受注番号, 商品番号, 数量)に分けると第2正規形になる。

例題 例題:「1人の著者は複数の本を書き、1冊の本は複数の著者が共同で書くことがある」をどう表にするか。

著者と本は多対多なので、著者表と本表のほかに、著者IDと本IDの組を主キーとする執筆表を作る。こうすると著者→執筆が1対多、本→執筆が1対多となり、関係データベースの表として素直に表せる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類9:データベース(データベース方式・データベース設計)

関係演算とSQL

選択・射影・結合という関係演算の考え方と、それをSQLでどう書くかが分かります。

関係データベースの操作は、表から表を作り出す関係演算で説明できます。基本は三つです。選択(σ)は条件に合う行だけを取り出す横方向の絞り込み、射影(π)は指定した列だけを取り出す縦方向の絞り込み、結合(⋈)は共通する項目の値が一致する行どうしをつないで1本の行にする操作です。射影の結果は関係(集合)なので、重複する行は取り除かれる点に注意してください。

このほか、列の構成が同じ二つの関係に対して、和(両方を合わせる。重複は1行)、差(一方にあって他方にない行)、共通部分(両方にある行)が使えます。列の構成が違ってもよいのが直積で、すべての行の組合せを作るため、m行とn行の直積はm×n行になります。結合は「直積を作ってから条件で選択し、必要な列を射影したもの」と考えると理解しやすくなります。

実際の操作にはSQLを使います。検索はSELECT〜FROM〜WHEREが基本形で、SELECTに書く列が射影、WHEREに書く条件が選択に当たります。並べ替えはORDER BY(既定は昇順、DESCで降順)、重複を除くのはDISTINCTです。WHEREでは比較演算子のほか、範囲を指定するBETWEEN、値の並びに含まれるかを見るIN、部分一致のLIKE(%は0文字以上、_は任意の1文字)が使えます。空値かどうかはIS NULLで判定します。NULLは「値が分からない」という印なので、= NULLと書いても決して真になりません。

集計にはGROUP BYを使い、指定した列の値が同じ行をまとめて、COUNT・SUM・AVG・MAX・MINといった集約関数を適用します。グループに対する条件はHAVINGに書きます(行に対する条件のWHEREとは適用される段階が違い、WHEREはグループ化の前、HAVINGは後です)。集約関数はNULLを無視して数えたり平均したりしますが、COUNT(*)だけは行そのものを数えるのでNULLを含む行も1行と数えます。

複数の表をまたぐときは結合を使います。内部結合(INNER JOIN)は条件に合った行だけを残すので、相手が見つからない行は結果から消えます。消したくないときは外部結合(OUTER JOIN)を使い、左の表を全部残すLEFT OUTER JOIN、右を全部残すRIGHT OUTER JOIN、両方残すFULL OUTER JOINを選びます。相手のいない行では、相手側の列がNULLで埋められます。副問合せを使うと、内側のSELECTの結果を外側の条件に使えます。INは値の一覧との照合、EXISTSは「条件に合う行が1件でもあるか」の判定で、NOT EXISTSは「1件もない」を表します。

データの追加はINSERT、更新はUPDATE、削除はDELETEです。WHEREを書き忘れると全行が対象になるので注意します。CREATE TABLEでは、PRIMARY KEY(主キー)、NOT NULL(空値禁止)、UNIQUE(重複禁止)、CHECK(値の条件)、FOREIGN KEY〜REFERENCES(参照整合性)といった制約を宣言できます。制約に反する操作はDBMSがエラーにして受け付けないので、アプリケーション側の作り込みに頼らずデータの正しさを保てます。

よく使う検索を1本の名前にまとめたものがビューで、実データを持たない仮想の表です。参照されるたびに元の表から作られるため、元の表を更新すれば内容も変わります。特定の列だけを見せるビューを与えれば、アクセス制御にも使えます。検索を速くする仕組みが索引(インデックス)で、多くのDBMSはB木(B-tree)索引を使います。B木は値が順に並ぶ木構造なので、等価検索だけでなく範囲検索や並べ替えにも効きますが、索引を増やすと更新のたびに索引も直す必要があり、更新は遅くなります。

外部結合・集約・グループへの条件をまとめて使った例(社員が1名以下の部門を人数の多い順に並べる)

SELECT 部門.部門名, COUNT(社員.社員番号) AS 人数
FROM 部門 LEFT OUTER JOIN 社員
  ON 部門.部門コード = 社員.部門コード
GROUP BY 部門.部門名
HAVING COUNT(社員.社員番号) <= 1
ORDER BY 人数 DESC
内部結合と外部結合の違い(部門4件、社員6名、うち1名は部門未所属、社員のいない部門が1件のとき)
結合の種類結果に残る行相手がいない行の扱いこの例での結果
内部結合(INNER JOIN)両方の表で条件に合った行だけ結果に出てこない5行(部門未所属の社員も、社員のいない部門も消える)
左外部結合(LEFT OUTER JOIN)左に書いた表の行はすべて残す右側の列がNULLになる部門を左に書くと6行(社員のいない部門の氏名がNULL)
右外部結合(RIGHT OUTER JOIN)右に書いた表の行はすべて残す左側の列がNULLになる部門を左・社員を右に書くと6行(部門未所属の社員の部門名がNULL)
完全外部結合(FULL OUTER JOIN)両方の表の行をすべて残す相手がいない側の列がNULLになる7行(社員のいない部門も、部門未所属の社員も残る)
選択(σ)
関係から、条件を満たす行だけを取り出す関係演算。SQLではWHERE句が対応する。行数は減るが列の構成は変わらない。
射影(π)
関係から、指定した列だけを取り出す関係演算。結果は集合なので重複する行は取り除かれる。SQLではSELECTに並べる列が対応する。
結合(⋈)
二つの関係を、共通する項目の値が一致する行どうしでつないで1本の行にする関係演算。直積を作って条件で選択したものと考えることもできる。
直積
二つの関係のすべての行の組合せを作る演算。m行の関係とn行の関係の直積はm×n行になり、列は両方の列を並べたものになる。
DISTINCT
SELECTの結果から重複する行を取り除く指定。射影の本来の動きに合わせたいときに書く。SQLでは指定しない限り重複行はそのまま残る。
GROUP BYとHAVING
GROUP BYは指定した列の値が同じ行をまとめる。HAVINGはまとめたグループに対する条件で、行単位の条件を書くWHEREとは適用の段階が異なる。
集約関数
COUNT(件数)、SUM(合計)、AVG(平均)、MAX(最大)、MIN(最小)。NULLは無視して計算するが、COUNT(*)だけは行そのものを数えるのでNULLを含む行も数える。
内部結合
結合条件に合った行だけを結果に残す結合。相手の表に対応する行がない行は結果から消える。INNER JOINと書く。
外部結合
片側(または両側)の行をすべて残す結合。相手が見つからない行では、相手側の列がNULLで埋められる。LEFT/RIGHT/FULL OUTER JOINがある。
EXISTS
副問合せの結果に行が1件でもあれば真になる述語。NOT EXISTSは1件もないときに真。「〜がない部門」のような条件を書くときに使う。
IS NULL
値が空値かどうかを調べる述語。NULLは「値が不明」を表す印なので、= NULLや<> NULLでは判定できず、必ずIS NULL/IS NOT NULLを使う。
ビュー
SELECT文に名前を付けた仮想の表。実データは持たず、参照のたびに元の表から作られる。よく使う検索の簡略化や、見せる列を絞るアクセス制御に使う。
B木索引
値が順序どおりに並ぶ木構造の索引。等価検索だけでなく範囲検索や並べ替えにも効く。作りすぎると更新のたびに索引の保守が必要になり、更新性能は落ちる。

例題 例題:3行の関係Rと2行の関係S(列の構成は同じ)について、直積・和・差の行数はそれぞれいくつになるか。ただしRとSに共通する行が1行あるとする。

直積は3×2=6行。和は重複を1行にまとめるので3+2−1=4行。差(R−S)はRにあってSにない行なので3−1=2行。共通部分は1行になる。

例題 例題:COUNT(*)とCOUNT(列名)はどう違うか。

COUNT(*)は行そのものを数えるので、どの列がNULLでも1行と数える。COUNT(列名)はその列がNULLの行を数えない。6行のうち1行だけ給与がNULLなら、COUNT(*)は6、COUNT(給与)は5になる。AVGやSUMも同じくNULLを無視するので、平均はNULLを除いた5件で計算される。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類9:データベース(データ操作)

トランザクションと排他制御

同時に何人が使っても矛盾が起きない仕組みと、その代償であるデッドロックが分かります。

口座Aから300円引いて口座Bに300円足す、のように、まとめて成功させるか、まとめて無かったことにするかのどちらかにしたい処理のかたまりをトランザクションといいます。処理を確定させることをコミット、途中でやめて開始前の状態に戻すことをロールバックといいます。DBMSはトランザクションが次の四つの性質(頭文字を取ってACID特性)を満たすように動きます。原子性(全部やるか全くやらないか)、一貫性(前後で矛盾のない状態が保たれる)、分離性(同時に動く他のトランザクションから影響を受けない)、耐久性(コミットした結果は障害が起きても失われない)です。

分離性を保つ代表的な方法が、ロックによる排他制御です。読むだけのときに掛ける共有ロックは、同じデータに対して複数のトランザクションが同時に掛けられます。書き換えるときに掛ける専有ロックは1件しか掛けられず、専有ロックが掛かっている間は他のトランザクションは共有ロックも専有ロックも掛けられません。つまり「読み×読み」は同時に進めますが、書込みが絡むと待たされます。

ロックを掛ける単位をロックの粒度といいます。表全体をまとめてロックすると管理は簡単ですが待たされる利用者が増え、行単位まで細かくすると同時に動ける度合いは上がるものの、ロックの管理そのものの負担が増えます。また、トランザクションの途中でロックを外したり掛けたりを繰り返すと直列化可能性が崩れるため、必要なロックをすべて掛け終わってから解除を始め、いったん解除を始めたら新たなロックは掛けないという2相ロック方式が使われます。

ロックには副作用があります。T1が資源Aを確保して資源Bを待ち、同時にT2が資源Bを確保して資源Aを待つと、互いに相手のロック解除を待ち続けて永久に進まなくなります。これがデッドロックです。防ぐ基本は、すべてのトランザクションで資源をロックする順序をそろえることです。それでも起きうるので、DBMSは待ちの関係を監視して検出し、どちらかを強制的にロールバックさせて解消します。

分離性を厳しくするほど安全ですが同時に動ける度合いは下がるため、SQLでは分離性のレベルを選べます。レベルが緩いと、まだコミットされていない他人の更新を読んでしまうダーティリード、同じ行を2回読むと値が変わっている反復不能読取り、同じ条件で2回検索すると前になかった行が現れるファントムリードといった異常が起こり得ます。READ UNCOMMITTEDでは三つとも起こり、READ COMMITTEDではダーティリードが消え、REPEATABLE READでは反復不能読取りも消え、SERIALIZABLEでは三つとも起きません。

複数のサイトに分かれた分散データベースを一つのトランザクションとして確定するには、2相コミットを使います。まず調停役が全サイトに「コミットできるか」を問い合わせ(第1相)、全サイトから可の回答が返ったときだけコミットを指示します(第2相)。1サイトでも不可があれば全サイトにロールバックを指示するので、一部だけ更新された状態になりません。ただし第1相の回答後に調停役が止まると、各サイトはコミットもロールバックもできない宙ぶらりんの状態になります。

ACID特性と、分離性のレベルごとに起こり得る異常
区分項目内容
ACID特性原子性(Atomicity)トランザクション内の処理は、全部実行されるか全く実行されないかのどちらかになる
ACID特性一貫性(Consistency)処理の前後で、データベースが矛盾のない状態に保たれる
ACID特性分離性(Isolation)同時に動く他のトランザクションから影響を受けず、1件ずつ順に実行したのと同じ結果になる
ACID特性耐久性(Durability)コミットした結果は、障害が起きても失われない
分離性のレベルREAD UNCOMMITTEDダーティリード・反復不能読取り・ファントムリードのすべてが起こり得る
分離性のレベルREAD COMMITTEDダーティリードは起きない。反復不能読取りとファントムリードは起こり得る
分離性のレベルREPEATABLE READダーティリードと反復不能読取りは起きない。ファントムリードは起こり得る
分離性のレベルSERIALIZABLE三つとも起きないが、同時に実行できる度合いは最も低い
トランザクション
まとめて成功させるか、まとめて取り消すかのどちらかにしたい一連の処理のかたまり。データベースを矛盾のない状態から別の矛盾のない状態へ移す単位になる。
コミット
トランザクションの処理結果を確定させ、データベースに正式に反映させる操作。コミット後の結果は障害が起きても失われないようにDBMSが保証する。
ロールバック
トランザクションを途中でやめ、更新前ログを使って開始前の状態に戻す操作。異常終了やデッドロック解消のためにDBMSが自動で行うこともある。
ACID特性
トランザクションが備えるべき四つの性質。原子性(Atomicity)、一貫性(Consistency)、分離性(Isolation)、耐久性(Durability)の頭文字を並べたもの。
共有ロック
データを読むときに掛けるロック。同じデータに対して複数のトランザクションが同時に掛けられるが、掛かっている間は誰も専有ロックを掛けられない。
専有ロック
データを更新するときに掛けるロック。1件しか掛けられず、掛かっている間は他のトランザクションは共有ロックも専有ロックも掛けられない。占有ロックともいう。
ロックの粒度
ロックを掛ける単位の大きさ。表単位のように粗いと管理は簡単だが待ちが増え、行単位のように細かいと同時実行性は上がるが管理の負担が増える。
2相ロック方式
必要なロックをすべて掛け終えてから解除を始め、いったん解除を始めたら新しいロックは掛けないという規約。守れば実行結果が直列実行と同じになることが保証される。
デッドロック
複数のトランザクションが互いに相手のロック解除を待ち続け、どちらも進めなくなる状態。ロックする順序を統一すると防ぎやすく、起きた場合は片方をロールバックして解消する。
ダーティリード
他のトランザクションがまだコミットしていない更新途中の値を読んでしまう異常。読んだ後に相手がロールバックすると、存在しなかった値を基に処理したことになる。
反復不能読取り
同じトランザクションの中で同じ行を2回読んだのに、間に他のトランザクションが更新してコミットしたために値が変わっている異常。
ファントムリード
同じ条件で2回検索したのに、間に他のトランザクションが行を追加したために、1回目になかった行が2回目に現れる異常。
2相コミット
分散データベースで、全サイトにコミット可否を問い合わせる第1相と、全サイトが可のときだけコミットを指示する第2相に分けて確定する方式。一部だけ更新された状態を防ぐ。

例題 例題:T1が口座表の行Xに専有ロックを掛けている。T2が同じ行Xを読みたいとき、T2はどうなるか。

T2は共有ロックを掛けられないので、T1がコミットまたはロールバックしてロックを解除するまで待たされる。逆にT1が共有ロック(読取り)だけを掛けている場合は、T2も共有ロックを掛けて同時に読める。

例題 例題:デッドロックを起こしにくくする工夫を二つ挙げよ。

一つはロックする資源の順序をすべてのトランザクションでそろえること(例:常に口座番号の小さい順に掛ける)。もう一つはトランザクションを短くして、ロックを持つ時間を減らすこと。それでも起きた場合は、DBMSが検出して片方をロールバックする。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類9:データベース(トランザクション処理)

障害回復とデータの活用

壊れたデータベースをどう元に戻すかと、ためたデータをどう分析に生かすかが分かります。

DBMSは更新のたびに、その内容をログ(ジャーナル)というファイルに記録しています。ログには更新前の値(更新前ログ)と更新後の値(更新後ログ)の両方が書かれます。この二つがあるおかげで、時間を戻すことも進めることもできます。更新前ログを使って更新前の状態に戻すのがロールバック(後退復帰)、更新後ログを使って更新をやり直し、後の状態へ進めるのがロールフォワード(前進復帰)です。どちらを使うかは、何が壊れたかで決まります。

トランザクション障害は、プログラムの誤りやデッドロックの解消などで1件のトランザクションだけが異常終了した状態です。データベースそのものは無事なので、そのトランザクションが行った更新だけを更新前ログで取り消せば済みます(ロールバック)。

システム障害は、停電やOSの異常終了でDBMSが止まった状態です。ディスクの内容は無事ですが、メモリ上のバッファにしかなかった更新が失われている可能性があります。そこで再起動時に、障害発生時点で未完了だったトランザクションは更新前ログでロールバックし、コミット済みなのにディスクへ反映されていなかったトランザクションは更新後ログでロールフォワードします。このとき、バッファの内容をディスクに書き出して同期を取った時点であるチェックポイントを手掛かりにすると、ログをすべて読み直さずに、直前のチェックポイント以降だけを見ればよくなり、回復が速くなります。

媒体障害は、ディスクが故障してデータベースのファイルそのものが読めなくなった状態です。ログだけでは元のデータがないので戻せません。別に保存しておいたバックアップファイルを正常な装置に復元し、そこから更新後ログを使ってバックアップ取得後の更新をやり直します(ロールフォワード)。バックアップとログを同じディスクに置いていると同時に失われるため、別の媒体に保管することが重要です。

こうしてためたデータは、日々の処理だけでなく分析にも使えます。基幹システムから集めた時系列のデータを、分析しやすい形に再編して蓄積したものがデータウェアハウスです。そのうち特定の部門や目的に合わせて一部を切り出したものがデータマート、加工せずに生のまま、形式も問わずに大量にためておく置き場がデータレイクです。基幹システムからデータを抽出・変換・格納する処理をETLといいます。

分析の手法にも名前が付いています。OLAPは、商品・地域・期間といった複数の軸(多次元)でデータを切り口を変えながら対話的に集計する仕組みで、軸を掘り下げるドリルダウンなどの操作を行います。データマイニングは、大量のデータに統計や機械学習の手法を当てて、これまで知られていなかった規則性や関係(例:この商品を買う人はあの商品も買う)を見つけ出すことです。なお、日々の受注入力のようにその場の取引を処理する仕組みはOLTPと呼び、OLAPとは目的が異なります。近年は、量(Volume)・速さ(Velocity)・多様性(Variety)で特徴づけられるビッグデータを扱う場面が増え、構造の決まっていないデータも含めて蓄積・分析できる基盤が求められています。

障害の種類と回復方法/ロールバックとロールフォワードの使い分け
種類何が起きたか回復の方法使うもの
トランザクション障害プログラムの誤りやデッドロックの解消で、1件のトランザクションだけが異常終了したそのトランザクションの更新だけを取り消す(ロールバック)更新前ログ
システム障害停電やOSの異常終了でDBMSが停止した。ディスクの内容は無事未完了のトランザクションはロールバック、コミット済みでディスク未反映のものはロールフォワード更新前ログ・更新後ログ・チェックポイント
媒体障害ディスクが故障し、データベースのファイル自体が読めないバックアップファイルを復元してからロールフォワードバックアップファイル・更新後ログ
(用語)ロールバック処理をなかったことにして時間を戻す更新前の値でデータを書き戻す更新前ログ
(用語)ロールフォワード失われた更新をやり直して時間を進める更新後の値でデータを書き直すバックアップ+更新後ログ
ログ(ジャーナル)
データベースへの更新を、更新前の値と更新後の値とともに記録したファイル。障害回復の要であり、データベース本体とは別の装置に置くのが基本。
ロールバック
更新前ログを使って、データベースを更新前の状態に戻すこと。後退復帰ともいう。トランザクション障害や、システム障害時の未完了トランザクションに対して行う。
ロールフォワード
更新後ログを使って、更新をやり直して後の状態へ進めること。前進復帰ともいう。媒体障害ではバックアップの復元後に、システム障害ではコミット済みの更新に対して行う。
チェックポイント
メモリ上のバッファの内容をディスクに書き出して同期を取る時点。システム障害からの回復で、直前のチェックポイント以降のログだけを見ればよくなり、回復時間が短くなる。
トランザクション障害
プログラムの誤りやデッドロックの解消などで、1件のトランザクションだけが異常終了した障害。そのトランザクションをロールバックすれば回復できる。
システム障害
停電やOSの異常終了でDBMSが停止した障害。ディスクの内容は無事なので、再起動時にロールバックとロールフォワードを組み合わせて回復する。
媒体障害
ディスクの故障などでデータベースのファイル自体が読めなくなった障害。バックアップを復元し、更新後ログでロールフォワードして回復する。
データウェアハウス
基幹システムから集めた時系列のデータを、分析しやすい形に再編して蓄積したもの。原則として更新せず、時間の経過とともにためていく。
データマート
データウェアハウスから、特定の部門や分析目的に合わせて必要な部分だけを切り出した小規模なデータの集まり。
データレイク
加工していない生のデータを、構造化・非構造化を問わずそのままの形で大量にためておく置き場。使うときに目的に合わせて加工する。
ETL
Extract(抽出)・Transform(変換)・Load(格納)の略。基幹システムからデータを取り出し、形式をそろえてデータウェアハウスへ入れる一連の処理。
OLAP
商品・地域・期間などの複数の軸でデータを集計し、切り口を変えながら対話的に分析する仕組み。軸を掘り下げるドリルダウンなどの操作を行う。
データマイニング
大量のデータに統計や機械学習の手法を当てて、これまで知られていなかった規則性や関係を見つけ出すこと。分析の目的が事前に決まっていない点がOLAPと異なる。
ビッグデータ
量(Volume)・速さ(Velocity)・多様性(Variety)で特徴づけられる大規模なデータ。従来の関係データベースだけでは扱いにくく、分散処理やNoSQLと組み合わせて活用する。

例題 例題:チェックポイント後にコミットしたトランザクションT1と、コミットせずに障害を迎えたT2がある。システム障害からの再起動時、それぞれどう扱われるか。

T1はコミット済みなので、ディスクに反映されていない分を更新後ログでロールフォワードして完了させる。T2は未完了なので、更新前ログでロールバックして開始前の状態に戻す。チェックポイント以前に完了しディスクへ書き出されている分は、そのままでよい。

例題 例題:バックアップとログを、データベース本体と同じディスクに置いてはいけないのはなぜか。

そのディスクが故障する媒体障害では、データベースもバックアップもログも同時に失われ、回復手段がなくなるから。ロールフォワードにはバックアップと更新後ログの両方が必要なので、別の媒体・別の場所に保管する。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類9:データベース(トランザクション処理・データベース応用)

ネットワーク

ネットワーク方式と構成機器

LANの仕組みと、ハブ・スイッチ・ルータがそれぞれどの層で何を見ているのかが分かります。

ネットワークは、つながる範囲で二つに分けて考えます。一つの建物や事業所の中など、自分たちで敷設して管理できる範囲がLAN(構内通信網)です。これに対し、離れた拠点どうしを通信事業者の回線を借りてつなぐ広い範囲がWAN(広域通信網)です。LANは自前なので速度も構成も自由に決められますが、WANは事業者のサービス品目と料金の範囲で決まります。

有線LANの標準がイーサネット(IEEE802.3)です。1000BASE-Tのように「速度BASE-媒体」の形で規格名が付き、1000BASE-Tなら1Gビット/秒・ツイストペアケーブル、1000BASE-SXなら光ファイバを指します。初期のイーサネットは1本の伝送路を全員で共有していたため、送信前に回線が空いているか聞き、空いていれば送り、それでも衝突(コリジョン)したら検出してランダムな時間待って送り直すCSMA/CDという方式を使いました。現在のスイッチングハブによる全二重通信では送信と受信の経路が分かれるので衝突自体が起こらず、CSMA/CDは実質的に使われませんが、試験ではイーサネットのアクセス制御方式として問われます。

無線LAN(IEEE802.11)では、電波は送信中に自分の信号が大きすぎて他局の信号を聞き取れないため、衝突を「検出」できません。そこで、回線が空いていても少し待ってから送り、受信側からACKが返ってこなければ衝突したとみなして送り直すCSMA/CAという回避型の方式を使います。規格は802.11b(2.4GHz帯・11Mビット/秒)、802.11a(5GHz帯・54Mビット/秒)、802.11g(2.4GHz帯・54Mビット/秒)、802.11n(2.4/5GHz帯・MIMOで最大600Mビット/秒)、802.11ac(5GHz帯のみ・最大約6.9Gビット/秒)、802.11ax(Wi-Fi 6、2.4/5GHz帯・OFDMAで最大約9.6Gビット/秒)と進んできました。2.4GHz帯は電子レンジやBluetoothと干渉しやすく、隣接するアクセスポイントとはチャネル(使う周波数の区画)をずらす必要があります。アクセスポイントは自分の名前としてSSIDを電波に乗せ、端末はこれを選んで接続します。

ネットワーク機器は「どの層の情報を見て中継するか」で区別すると整理できます。リピータとリピータハブは物理層で信号を増幅・整形して全ポートにそのまま流すだけなので、つないだ全体が一つの衝突領域(コリジョンドメイン)になります。ブリッジとL2スイッチ(スイッチングハブ)はデータリンク層のMACアドレスを見て、宛先がつながっているポートにだけ転送するので、ポートごとに衝突領域が分かれます。ただしブロードキャストは全ポートに流れるため、ブロードキャストドメインは分かれません。ルータとL3スイッチはネットワーク層のIPアドレスを見て別のネットワークへ中継するので、ここでブロードキャストドメインが分かれます。トランスポート層より上位で、プロトコルそのものを変換して橋渡しする装置がゲートウェイです。パソコン側でネットワークに接続する部品がNIC(ネットワークインタフェースカード)で、製造時にMACアドレスが割り当てられています。

L2スイッチでは、物理的な配線とは無関係に、ポートやMACアドレスの単位でネットワークを論理的に分けるVLANが使えます。同じフロアのスイッチにつながっていても、VLANが違えばブロードキャストは届かず、行き来するにはルータやL3スイッチによる中継が必要です。部署ごとに通信を分けたいときに、配線をやり直さずに実現できるのが利点です。また、IEEE802.3af/at/btのPoEを使うと、LANケーブルで通信と給電を同時に行えるため、天井のアクセスポイントやIPカメラに電源工事なしで電力を供給できます。

通信のきまりごとを層に分けて整理したものがOSI基本参照モデルで、下から物理層、データリンク層、ネットワーク層、トランスポート層、セッション層、プレゼンテーション層、アプリケーション層の7層です。実際のインターネットで使われているTCP/IPは4階層で、ネットワークインタフェース層(OSIの第1〜2層)、インターネット層(第3層)、トランスポート層(第4層)、アプリケーション層(第5〜7層)に対応します。送信側では上の層から順にヘッダを付けていき(カプセル化)、受信側では下の層から順にヘッダを外して上へ渡します。

回線の使い方には、通信の間じゅう通信路を占有する回線交換方式と、データを小さなパケットに区切って宛先情報を付け、空いている回線を次々に共有しながら送るパケット交換方式があります。インターネットは後者で、回線を効率よく使える反面、混み具合によって遅延が変わります。さらに近年は、機器ごとに設定していた経路制御の頭脳部分(制御プレーン)を機器の転送部分(データプレーン)から切り離し、ソフトウェアから集中制御するSDNという考え方が広がっています。SDNの代表的な実装がOpenFlowで、ネットワーク構成の変更をプログラムで一括して行えます。

OSI基本参照モデルとTCP/IP階層モデルの対応(動く機器と代表的なプロトコル)
OSIの層TCP/IPの階層役割この層で動く機器代表的なプロトコル・規格
7 アプリケーション層アプリケーション層応用ソフトへの通信サービスゲートウェイHTTP、SMTP、POP3、IMAP4、FTP、DNS、DHCP、NTP、SNMP
6 プレゼンテーション層アプリケーション層文字コードやデータ形式の変換ゲートウェイMIME、SSL/TLS(暗号化の位置づけ)
5 セッション層アプリケーション層通信の開始から終了までの管理ゲートウェイセッション管理の機能全般
4 トランスポート層トランスポート層端末間の通信品質の確保と多重化(ゲートウェイ)TCP、UDP
3 ネットワーク層インターネット層ネットワーク間の中継とあて先までの経路制御ルータ、L3スイッチIP、ICMP、RIP、OSPF、BGP
2 データリンク層ネットワークインタフェース層隣接する機器との誤りのない伝送ブリッジ、L2スイッチ、無線アクセスポイント、NICイーサネット(IEEE802.3)、無線LAN(IEEE802.11)、PPP
1 物理層ネットワークインタフェース層電気信号や光信号への変換リピータ、リピータハブ、NIC1000BASE-Tなどのケーブル・コネクタ規格
LANとWAN
LANは建物や事業所など自分で管理できる範囲の構内通信網、WANは通信事業者の回線を借りて離れた拠点をつなぐ広域通信網。速度や構成を自由に決められるのはLANのほうである。
CSMA/CD
有線イーサネットのアクセス制御方式。送信前に回線が空いているか調べ、衝突したら検出してランダムな時間待って再送する。全二重のスイッチング環境では衝突が起こらないため実質使われない。
CSMA/CA
無線LANのアクセス制御方式。電波では衝突を検出できないため、空いていても待ち時間を置いてから送信し、ACKが返らなければ衝突したとみなして再送する衝突回避型の方式。
SSID
無線LANのアクセスポイントに付ける最大32文字の識別名。端末はこの名前を選んで接続する。同じSSIDを複数のアクセスポイントに設定すると、移動しながら接続を引き継げる。
コリジョンドメイン
信号の衝突が影響し合う範囲。リピータハブでつないだ全体が一つの範囲になるが、L2スイッチはポートごとに分ける。ルータやL3スイッチはブロードキャストドメインも分ける。
L2スイッチ
データリンク層のMACアドレスを見て、宛先の機器がつながっているポートにだけフレームを転送する装置。スイッチングハブとも呼ぶ。ブロードキャストは全ポートに転送する。
L3スイッチ
ネットワーク層のIPアドレスを見て中継する機能をスイッチに持たせた装置。ルータと同じ働きをハードウェア処理で高速に行うが、WAN回線向けの機能はルータのほうが豊富である。
ゲートウェイ
トランスポート層より上位の層でプロトコルそのものを変換し、方式の違うネットワークどうしを橋渡しする装置。単に「デフォルトゲートウェイ」というときは外部へ出るルータを指す。
VLAN
物理的な配線とは無関係に、ポートやMACアドレスの単位でLANを論理的に分割する機能。VLANが違えばブロードキャストは届かず、行き来にはルータやL3スイッチによる中継が必要になる。
PoE
IEEE802.3af/at/btで規格化された、LANケーブルで通信と給電を同時に行う仕組み。電源が取りにくい天井のアクセスポイントやIPカメラに、電源工事なしで電力を供給できる。
OSI基本参照モデル
通信機能を下から物理・データリンク・ネットワーク・トランスポート・セッション・プレゼンテーション・アプリケーションの7層に分けて整理したモデル。層ごとに役割を切り分けて考える。
カプセル化
送信側で上位層のデータに各層のヘッダを順に付けていくこと。受信側は下位層から順にヘッダを外して上位層へ渡す。層ごとに独立して機能を差し替えられるようになる。
パケット交換方式
データを小さなパケットに区切り、宛先情報を付けて空いている回線を共有しながら送る方式。回線を占有する回線交換方式より効率がよいが、混雑によって遅延が変動する。
SDN
ネットワーク機器の経路制御を行う制御プレーンを転送部分から切り離し、ソフトウェアから集中制御する考え方。代表的な実装にOpenFlowがあり、構成変更をプログラムで一括して行える。
ルーティングプロトコル
ルータどうしが経路情報を交換して経路表を自動で作る手順。組織内ではホップ数を使うRIPやコストを使うOSPF、組織(AS)どうしの接続にはBGPが使われる。

例題 リピータハブ8ポートに8台のPCをつないだ場合と、L2スイッチ8ポートにつないだ場合で、コリジョンドメインとブロードキャストドメインはそれぞれいくつになるか。

リピータハブはコリジョンドメイン1・ブロードキャストドメイン1。L2スイッチはポートごとに衝突が分かれるのでコリジョンドメイン8・ブロードキャストドメイン1。どちらもブロードキャストは全ポートに流れるので、ドメインを分けるにはルータやL3スイッチ、またはVLANが必要。

例題 OSI基本参照モデルで、ルータとL2スイッチはそれぞれ第何層の機器か。

ルータは第3層(ネットワーク層)でIPアドレスを見て中継する。L2スイッチは第2層(データリンク層)でMACアドレスを見て転送する。リピータハブは第1層(物理層)で信号を流すだけである。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類10:ネットワーク(ネットワーク方式・通信プロトコル)

IPアドレスとサブネット

CIDR表記からネットワークアドレス・ブロードキャストアドレス・収容できる台数を自分で計算できるようになります。

IPv4アドレスは32ビットで、8ビットずつ4つに区切って10進数で書きます(例: 192.168.10.35)。32ビットは前半のネットワーク部と後半のホスト部に分かれ、どこまでがネットワーク部かを示すのがサブネットマスクです。サブネットマスクは、ネットワーク部のビットをすべて1、ホスト部をすべて0にした32ビットの値で、1が続く個数を「/24」のように書く方法をCIDR表記(プレフィックス長)といいます。かつてはアドレスの先頭ビットで区切り位置が決まるクラスA〜Cという分け方でしたが、アドレスの無駄が大きいため、現在は任意の位置で区切るCIDRが使われます。

計算の土台になるのは次の3つです。第一に、ホスト部のビット数をnとすると、そのネットワークに含まれるアドレスの総数は2のn乗個です。第二に、そのうちホスト部が全部0のものはネットワークそのものを表すネットワークアドレス、全部1のものは同じネットワーク全員あてのブロードキャストアドレスなので、機器に割り当てられる台数は2のn乗から2を引いた個数になります。第三に、あるIPアドレスのネットワークアドレスは、IPアドレスとサブネットマスクのビットごとの論理積(AND)で求められます。/24なら第4オクテットだけがホスト部なのでn=8、総数256個、使える台数254台です。

区切りがオクテットの途中に来る場合は、その1オクテットだけを見て考えると早く解けます。プレフィックス長が/26なら、第4オクテットのうち上位2ビットがネットワーク部、下位6ビットがホスト部なので、マスクは11000000(10進で192)、区切りは0、64、128、192の64個おきです。つまり192.168.10.100は192.168.10.64〜192.168.10.127の範囲に入り、ネットワークアドレスは192.168.10.64、ブロードキャストアドレスは192.168.10.127、使えるのは.65〜.126の62台です。この「1オクテット内の区切り幅=256からマスクの値を引いた数」という見方が、そのままブロードキャストアドレスの計算にも使えます。

大きなネットワークを分けることをサブネット分割といいます。プレフィックス長を1ビット伸ばすとネットワークは2つに、2ビット伸ばすと4つに増え、その分ホスト部が短くなって収容台数は半分ずつ減ります。たとえば192.168.1.0/24を/27に分けると、伸ばしたビット数は3なので2の3乗=8個のサブネットができ、それぞれのホスト部は5ビットなので使えるのは2の5乗−2=30台ずつです。逆に「500台収容したい」と言われたら、2のn乗−2が500以上になる最小のnを探してn=9、つまり32−9=23で/23(510台)と決めます。

組織の内部だけで自由に使ってよいアドレスがプライベートIPアドレスで、10.0.0.0〜10.255.255.255(10.0.0.0/8)、172.16.0.0〜172.31.255.255(172.16.0.0/12)、192.168.0.0〜192.168.255.255(192.168.0.0/16)の3つの範囲が決められています。これらはインターネット上では通用しないので、外部と通信するときは境界のルータでグローバルIPアドレスに変換します。1対1で入れ替えるのがNAT、ポート番号も一緒に書き換えて1つのグローバルアドレスを多数の端末で共有するのがNAPT(IPマスカレード)です。NAPTでは戻ってきたパケットをポート番号で見分けて内部の端末に振り分けます。

IPv4のアドレス枯渇に対する本命の答えがIPv6です。アドレス長は128ビットで、16ビットずつ8つに区切って16進数でコロン区切りに書きます。ヘッダを簡素にして中継処理を軽くし、IPsecによる暗号化への対応、ルータからの情報を使ってアドレスを自動で決めるアドレス自動設定などが取り込まれました。ブロードキャストは廃止され、代わりにマルチキャストとエニーキャストを使います。

同じネットワーク内で相手に届けるには、IPアドレスから相手のMACアドレスを知る必要があります。これを行うのがARPで、「このIPアドレスの人はMACアドレスを教えてほしい」とブロードキャストで尋ね、本人がユニキャストで答えます。宛先が別のネットワークなら、パケットはまずデフォルトゲートウェイ(自分のネットワークの出口のルータ)に渡され、ルータが経路表に従って次のルータへ中継していきます。経路表を人が書くのがスタティックルーティング、ルータどうしが情報交換して自動で作るのがダイナミックルーティングで、後者には最小ホップ数で選ぶRIP、回線速度などのコストで選ぶOSPF、組織(AS)どうしをつなぐBGPがあります。

192.168.10.100/26 を2進数で分解する

IPアドレス   192.168.10.100
  第4オクテット  100 = 01100100

サブネットマスク /26 = 255.255.255.192
  第4オクテット  192 = 11000000

AND をとる(ネットワークアドレス)
  01100100
  11000000
  --------
  01000000 = 64   → 192.168.10.64

ホスト部を全部1にする(ブロードキャストアドレス)
  01111111 = 127  → 192.168.10.127

割当て可能な範囲 192.168.10.65 〜 192.168.10.126(62台)
プレフィックス長・サブネットマスク・収容台数の対応(下位オクテットの区切り幅つき)
CIDRサブネットマスクホスト部のビット数アドレス総数割当て可能な台数第4オクテットの区切り幅
/24255.255.255.08256254—(0〜255が1組)
/25255.255.255.1287128126128
/26255.255.255.1926646264
/27255.255.255.2245323032
/28255.255.255.2404161416
/29255.255.255.2483868
/30255.255.255.2522424
/23255.255.254.09512510第3オクテットが2おき
/22255.255.252.01010241022第3オクテットが4おき
/20255.255.240.01240964094第3オクテットが16おき
サブネットマスク
IPアドレスのどこまでがネットワーク部かを示す32ビットの値。ネットワーク部を1、ホスト部を0で表す。IPアドレスとの論理積(AND)でネットワークアドレスが求められる。
CIDR表記
サブネットマスクの1が続く個数(プレフィックス長)を「192.168.1.0/24」のようにスラッシュに続けて書く方法。クラスにとらわれず任意の位置でネットワーク部を区切れる。
ネットワークアドレス
ホスト部のビットがすべて0のアドレス。そのネットワーク自体を指す番号で、個々の機器には割り当てられない。経路表ではこの値とマスクの組で宛先ネットワークを表す。
ブロードキャストアドレス
ホスト部のビットがすべて1のアドレス。同じネットワーク内の全機器あてを意味する。ネットワークアドレスと合わせて2個は機器に割り当てられないため、収容台数は2のn乗−2となる。
サブネット分割
プレフィックス長を伸ばして一つのネットワークを複数に分けること。kビット伸ばすと2のk乗個のサブネットができ、1サブネットあたりの収容台数はその分だけ減る。
プライベートIPアドレス
組織内で自由に使えるアドレス。10.0.0.0/8、172.16.0.0/12、192.168.0.0/16の3範囲が定められている。インターネットでは通用しないので変換が必要になる。
NAT
プライベートIPアドレスとグローバルIPアドレスを1対1で相互に変換する仕組み。同時に外部と通信できる端末数は、用意したグローバルアドレスの個数までに限られる。
NAPT
IPアドレスに加えてポート番号も書き換えることで、1つのグローバルIPアドレスを多数の端末で共有する仕組み。IPマスカレードとも呼ばれ、戻りのパケットはポート番号で振り分ける。
IPv6
128ビットのアドレスを持つ次世代のIP。16ビットごとに16進数でコロン区切りに書く。ヘッダの簡素化、IPsec対応、アドレス自動設定が特徴で、ブロードキャストは廃止された。
ARP
同一ネットワーク内で、IPアドレスから対応するMACアドレスを問い合わせるプロトコル。要求はブロードキャスト、応答はユニキャストで行われ、結果は一定時間キャッシュされる。
デフォルトゲートウェイ
経路表に載っていない宛先あてのパケットを託す出口のルータ。自分と同じネットワーク内のIPアドレスを指定する必要があり、ここが誤っていると外部と通信できない。
スタティックルーティング
経路表を管理者が手作業で設定する方式。構成が固定された小規模ネットワークに向き、回線障害が起きても自動では迂回しない。自動で経路を学習するのがダイナミックルーティング。
RIPとOSPF
組織内で使うルーティングプロトコル。RIPはホップ数が最小の経路を選ぶディスタンスベクタ型で最大15ホップ。OSPFは回線速度などのコストで選ぶリンクステート型で、大規模構成に向く。
BGP
AS(自律システム)と呼ばれる組織単位のネットワークどうしを結ぶ経路制御プロトコル。通過するASの並びを情報として交換し、インターネットの基幹の経路制御に使われている。

例題 172.16.5.200/21 のネットワークアドレスとブロードキャストアドレスを求めよ。

/21は第3オクテットの上位5ビットまでがネットワーク部で、マスクは255.255.248.0。区切り幅は256−248=8なので、第3オクテットは0、8、16、24…と8おき。5は0〜7の組に入るので、ネットワークアドレスは172.16.0.0、ブロードキャストアドレスは172.16.7.255。割当て可能な台数は2の11乗−2=2046台。

例題 192.168.4.0/22 を、1サブネットあたり60台を収容できる大きさに分割したい。プレフィックス長と、できるサブネットの数はいくつか。

60台には2のn乗−2≧60を満たす最小のn=6が必要なので、プレフィックス長は32−6=26。/22から/26へは4ビット伸ばすので、2の4乗=16個のサブネットに分割できる。各サブネットの収容台数は62台。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類10:ネットワーク(通信プロトコル)/RFC1918(プライベートアドレス)/RFC4632(CIDR)

トランスポート層と伝送性能

TCPとUDPの使い分けと、伝送時間・伝送効率・回線利用率の計算のやり方が身につきます。

トランスポート層は、届いたデータを「どの通信のどのアプリケーションあてか」まで見分け、必要なら品質を保証する層です。ここには性格の違う2つのプロトコルがあります。TCPはコネクション型で、通信を始める前にSYN、SYN+ACK、ACKという3ウェイハンドシェイクで相手と合意を取り、送ったデータには確認応答(ACK)を求め、届かなければ再送し、順番が入れ替わっても並べ直します。UDPはコネクションレス型で、確認も再送も順序制御もせず、ヘッダも8バイトと小さいまま投げっぱなしにします。その代わり手続きの分の待ちがなく、ブロードキャストやマルチキャストにも使えるので、DNSの問合せ、DHCP、NTP、音声や映像のリアルタイム配信のように、少しの欠落より速さが大事な通信で使われます。

TCPには流れを調整する仕組みもあります。受信側がまだ処理していないのに送りすぎると溢れるので、受信側が「今これだけ受け取れる」という窓の大きさ(ウィンドウサイズ)を伝え、送信側はその範囲内なら確認応答を待たずに続けて送れます。これがスライディングウィンドウによるフロー制御で、1つ送るたびに応答を待つ方式より効率が上がります。さらに、ネットワークの混雑を検知して送る量を絞る輻輳制御も備えています。

伝送路の誤りは、電気的な雑音などで0と1が入れ替わることで起こります。1ビットの誤りを検出できるパリティチェック、連続した誤り(バースト誤り)に強く、データリンク層で広く使われるCRC(巡回冗長検査)、誤りの位置まで特定して訂正できるハミング符号などがあり、誤りを見つけたら送り直してもらう方式をARQ(自動再送要求)といいます。また、1本の伝送路に複数の通信をまとめて載せる多重化には、時間で区切る時分割多重(TDM)、周波数で分ける周波数分割多重(FDM)、光の波長で分ける波長分割多重(WDM)があります。

性能の計算はどれも「ビットにそろえてから割る」だけです。1バイト=8ビットなのでファイルの大きさは8倍してビットに直し、回線速度で割れば理屈上の時間が出ます。実際には制御情報や再送があるため、有効に使えるのは一部だけです。この割合が伝送効率で、実効速度=回線速度×伝送効率、伝送時間=データ量(ビット)÷実効速度、となります。逆に、実際に流したデータ量を回線速度と時間で割ると回線利用率が求められます。試験では1Mビット/秒=10の6乗ビット/秒のように単位の前提が必ず書かれるので、1000系か1024系かを読み落とさないことが大切です。

パケットに分けて送ると、1つ1つにヘッダが付くぶん送る量が増えます。データ1,000バイトを、1パケットに載せられるデータが200バイト、ヘッダが20バイトという条件で送ると、パケットは5個、実際に流れるのは5×(200+20)=1,100バイトになり、伝送効率は1,000÷1,100=約90.9%です。パケットを小さくすると誤り時の再送は軽くなりますが、ヘッダの割合が増えて効率は落ちるという関係があります。

遠くのサーバとやり取りするときは、回線速度だけでなく往復にかかる伝播遅延も効いてきます。世界中の利用者に同じコンテンツを配るときに、あらかじめ各地のキャッシュサーバに複製を置き、利用者に近いところから配信して遅延と本体サーバの負荷を減らす仕組みがCDN(コンテンツデリバリネットワーク)です。

拠点間を安く安全につなぐにはVPNを使います。インターネットVPNは公衆のインターネット上に暗号化したトンネルを作る方式で、ネットワーク層で暗号化と認証を行うIPsecを使うIPsec-VPNと、ブラウザのSSL/TLSをそのまま利用して個々の端末から社内システムへ接続するSSL-VPNがあります。一方、通信事業者の閉域網を使って安全性と品質を確保するのがIP-VPNで、インターネットを通らないぶん品質が安定します。

TCPとUDPの比較
観点TCPUDP
接続の考え方コネクション型(3ウェイハンドシェイクで確立)コネクションレス型(いきなり送る)
到達の保証確認応答と再送で保証する保証しない(欠落しても気付かない)
順序の保証順番が入れ替わっても並べ直す並べ直さない
フロー制御・輻輳制御ウィンドウ制御などで行う行わない
ヘッダの大きさ20バイト以上8バイト
1対多の送信できない(1対1のみ)ブロードキャスト・マルチキャストに使える
速さとオーバヘッド手続きの分だけ遅く、負荷も大きい手続きがなく速い
主な用途HTTP、HTTPS、SMTP、POP3、IMAP4、FTP、Telnet、SSHDNSの問合せ、DHCP、NTP、SNMP、VoIP、動画のストリーミング
TCP
コネクション型のトランスポート層プロトコル。3ウェイハンドシェイクで接続を確立し、確認応答・再送・順序制御・フロー制御・輻輳制御によって、データが確実に順番どおり届くことを保証する。
UDP
コネクションレス型のトランスポート層プロトコル。確認応答も再送も順序制御も行わず、ヘッダも8バイトと小さい。遅延を嫌う音声・映像や、DNS・DHCP・NTPなどの短い通信で使われる。
3ウェイハンドシェイク
TCPが通信を始めるときに行う3回のやり取り。SYN、SYN+ACK、ACKの順に交換して、双方の送信開始位置と受信準備を確認してからデータ転送に入る。
スライディングウィンドウ
受信側が伝えたウィンドウサイズの範囲内なら、確認応答を待たずに続けてデータを送れるTCPのフロー制御方式。1つずつ応答を待つ方式に比べて回線を効率よく使える。
伝送効率
回線速度のうち、実際にデータの送信に使える割合。制御情報や再送、待ち時間の分だけ100%より小さくなる。実効速度は回線速度に伝送効率を掛けて求める。
回線利用率
回線の能力に対して実際にどれだけ使われたかの割合。ある時間に流れたデータ量(ビット)を、回線速度と経過時間の積で割って求める。
CRC
巡回冗長検査。データを多項式とみなした割り算の余りを検査符号として付け、受信側で同じ計算をして誤りを検出する。連続して起こるバースト誤りに強く、データリンク層で広く使われる。
パリティチェック
1が奇数個か偶数個かをそろえる1ビットの検査符号を付けて誤りを検出する方式。1ビットの誤りは検出できるが位置は分からず、2ビット同時に誤ると検出できない。
ハミング符号
複数の検査ビットを付けることで、1ビットの誤りであれば位置を特定して訂正できる符号。誤りを見つけて再送を求めるだけの検出方式と違い、その場で復元できる点が異なる。
多重化
1本の伝送路に複数の通信をまとめて載せる技術。時間を細かく区切って割り当てる時分割多重、周波数帯を分ける周波数分割多重、光の波長を分ける波長分割多重がある。
CDN
コンテンツデリバリネットワーク。各地に置いたキャッシュサーバに複製を配置し、利用者に近い場所から配信することで、応答の遅延と本体サーバの負荷をともに減らす仕組み。
IPsec
ネットワーク層でパケットの暗号化と認証を行うプロトコル群。IPパケット全体を包み直すトンネルモードを使うと、拠点間を結ぶVPNをアプリケーションを変えずに構築できる。
SSL-VPN
ブラウザなどが備えるSSL/TLSをそのまま使って社内システムへ安全に接続する方式。専用のソフトを入れなくても使えることが多く、在宅勤務など個々の端末からの接続に向く。

例題 回線速度100Mビット/秒(1Mビット/秒=10の6乗ビット/秒)、伝送効率50%の回線で、50Mバイト(1Mバイト=10の6乗バイト、1バイト=8ビット)のファイルを転送する時間は何秒か。

データ量は50×10の6乗×8=4×10の8乗ビット。実効速度は100×10の6乗×0.5=5×10の7乗ビット/秒。したがって4×10の8乗÷5×10の7乗=8秒。

例題 64kビット/秒(1kビット/秒=10の3乗ビット/秒)の回線で、1時間に14.4Mバイト(1Mバイト=10の6乗バイト)のデータを送った。回線利用率は何%か。

送ったビット数は14.4×10の6乗×8=1.152×10の8乗ビット。1時間=3,600秒なので平均速度は1.152×10の8乗÷3,600=32,000ビット/秒。64,000ビット/秒に対して32,000÷64,000=0.5、すなわち50%。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類10:ネットワーク(通信プロトコル・伝送)/RFC793(TCP)/RFC768(UDP)

アプリケーション層とネットワーク応用

DNS・Web・電子メールの仕組みと、モバイル通信やトラブルシューティングの道具が分かります。

アプリケーション層のプロトコルは、相手のIPアドレスに加えてポート番号で見分けられます。ポート番号は16ビットの数で、サーバ側で待ち受ける代表的な番号が0〜1023のウェルノウンポートとして決められています。HTTPは80番、HTTPSは443番、SMTPは25番、POP3は110番、IMAP4は143番、DNSは53番、FTPは制御に21番・データ転送に20番、SSHは22番です。クライアント側は空いている番号を一時的に使い、この組合せでどの通信への応答かを見分けます。

人が使うドメイン名とIPアドレスを対応づけるのがDNSです。名前からIPアドレスを求めるのが正引き、IPアドレスから名前を求めるのが逆引きです。利用者側で問合せを代行するのがリゾルバ(DNSキャッシュサーバ)で、答えを知らなければルートDNSサーバから順にたどり、そのドメインの情報を正式に持つ権威DNSサーバから答えをもらって、一定時間(TTL)キャッシュしてから利用者に返します。DNSが引けないと、通信そのものはできる状態でも「名前解決できません」となって使えません。

Webの通信はHTTPで行います。クライアントがリクエストを送り、サーバがステータスコードとともにレスポンスを返す形で、HTTPは本来やり取りの前後関係を覚えません。そこで、サーバがブラウザに小さなデータを保存させて次のリクエストに付けさせるcookieを使い、これでセッションIDを持ち回ってログイン状態を保ちます。HTTPSはHTTPの通信をSSL/TLSで暗号化したもので、サーバ証明書によって接続先の正当性も確認できます。組織の出口に置いて代理でアクセスし、内容をキャッシュしたり、アクセス先を制限したり、内部のIPアドレスを隠したりする装置がプロキシサーバです。

電子メールは、送信と受信で使うプロトコルが違うのが要点です。送信者から送信メールサーバへ、そして送信メールサーバから受信側のメールサーバへの配送はどちらもSMTPが担います。受信者が自分あてのメールをメールサーバから取り出すときはPOP3かIMAP4を使います。POP3は原則としてメールを手元にダウンロードして管理する方式、IMAP4はサーバ上にメールを置いたまま読む方式で、複数の端末から同じ状態で読みたい場合はIMAP4が向きます。日本語や添付ファイルなど、本来ASCII文字しか運べないメールで多様なデータを扱えるようにする拡張がMIMEで、これに暗号化とデジタル署名を加えたものがS/MIMEです。

差出人のなりすまし対策として、送信ドメイン認証が使われます。SPFは、そのドメインのメールを送ってよい送信元サーバのIPアドレスをDNSに公開しておき、受信側が実際の送信元と突き合わせる仕組みです。DKIMは、送信側がメールに電子署名を付け、受信側がDNSで公開鍵を取得して検証する仕組みです。DMARCは、SPFやDKIMの検証に失敗したメールをどう扱うか(何もしない・隔離する・拒否する)というドメイン所有者の方針をDNSで公開し、結果の報告も受け取れるようにするものです。

音声を扱うIP電話はVoIPの技術で成り立っています。音声をディジタル化して小さなパケットに分け、RTPで運び、SIPで呼の開始と終了を制御します。パケット交換なので、遅延そのものに加えて、到着間隔がばらつくゆらぎ(ジッタ)が音質に影響します。移動体通信では、高速大容量・低遅延・多数同時接続を特徴とする5G、複数の周波数帯を束ねて速度を上げるキャリアアグリゲーション、通信速度は低いが低消費電力で広い範囲をカバーしIoT機器に向くLPWAなどが押さえどころです。自社で無線設備を持たず、通信事業者の設備を借りてサービスを提供する事業者をMVNOといいます。

つながらないときは、下の層から順に切り分けます。ipconfig(UNIX系ではifconfigやip)で自分のIPアドレス・サブネットマスク・デフォルトゲートウェイの設定を確認し、pingでICMPのエコー要求を送って相手までの到達性と応答時間を調べます。デフォルトゲートウェイには届くのに外部に届かないときは、tracerouteやtracertで経路上のどのルータまで到達しているかをたどります。IPアドレス指定なら通じるのに名前では通じない場合はDNSの問題なので、nslookupやdigで名前解決だけを試します。機器の状態を集中的に監視するにはSNMPを使い、時刻をそろえるにはNTPを使います。

主なアプリケーション層プロトコルの役割とポート番号(メールは送受信の役割の違いに注目)
区分プロトコル役割ポート番号トランスポート
メール送信SMTP送信者からメールサーバへ、およびメールサーバ間でメールを転送する25(送信専用の窓口は587)TCP
メール受信POP3メールサーバから自分あてのメールを手元にダウンロードして管理する110TCP
メール受信IMAP4メールをサーバ上に置いたまま読む。複数端末で同じ状態を見られる143TCP
WebHTTPWebページなどのコンテンツを要求し、応答を受け取る80TCP
WebHTTPSHTTPの通信をSSL/TLSで暗号化し、サーバ証明書で相手を確認する443TCP
ファイル転送FTPファイルを転送する。制御用と実際のデータ転送用に別の接続を使う21(制御)、20(データ)TCP
名前解決DNSドメイン名とIPアドレスを相互に対応づける53UDP(大きな応答やゾーン転送はTCP)
アドレス配布DHCPIPアドレス・サブネットマスク・デフォルトゲートウェイなどを自動で配る67(サーバ)、68(クライアント)UDP
時刻同期NTP機器の時刻を基準の時計に合わせる123UDP
機器監視SNMPネットワーク機器の状態を収集・監視する161(ポーリング)、162(トラップ)UDP
遠隔操作SSH暗号化した通信で遠隔のコンピュータを操作する22TCP
ウェルノウンポート
0〜1023に割り当てられた、サーバ側で待ち受ける代表的なポート番号。HTTPの80番、HTTPSの443番、SMTPの25番、DNSの53番などがあり、クライアント側は空き番号を一時的に使う。
DNSの正引きと逆引き
ドメイン名からIPアドレスを求めるのが正引き、IPアドレスからドメイン名を求めるのが逆引き。逆引きは送信元の確認やログの解析に使われる。
権威DNSサーバ
自分が管理するドメインの情報を正式に持ち、問合せに対して正式な回答を返すサーバ。これに対し、利用者に代わって問い合わせて結果を一定時間キャッシュするのがリゾルバである。
cookie
Webサーバがブラウザに保存させる小さなデータ。次のリクエストで自動的に送り返されるので、状態を覚えないHTTPでもセッションIDを持ち回ってログイン状態を保てる。
プロキシサーバ
内部の端末に代わって外部へアクセスする中継サーバ。応答をキャッシュして通信量を減らす、アクセス先を制限する、内部のIPアドレスを隠すといった役割を持つ。
SMTP
電子メールを送るためのプロトコル。送信者からメールサーバへの送信と、メールサーバ間の転送の両方で使われる。受信者がメールを取り出すのには使わない。
POP3とIMAP4
メールサーバから自分あてのメールを受け取るプロトコル。POP3は手元にダウンロードして管理し、IMAP4はサーバ上に置いたまま読む。複数端末で同じ状態を見たいならIMAP4が向く。
MIMEとS/MIME
MIMEは日本語や添付ファイルなどをメールで扱えるようにする拡張。S/MIMEはそれに公開鍵暗号による暗号化とデジタル署名を加え、盗聴と改ざん・なりすましを防ぐ。
SPF
そのドメインのメールを送ってよい送信元サーバのIPアドレスをDNSに公開し、受信側が実際の送信元と突き合わせる送信ドメイン認証。電子署名は使わない。
DKIM
送信側がメールに電子署名を付け、受信側がDNSから取得した公開鍵で検証する送信ドメイン認証。なりすましだけでなく、途中での改ざんの検知にも役立つ。
DMARC
SPFやDKIMの検証に失敗したメールを、受信側にどう扱ってほしいか(何もしない・隔離・拒否)という方針をDNSで公開する仕組み。認証結果のレポートも受け取れる。
VoIP
音声をディジタル化してIPパケットで運ぶ技術。音声データはRTPで運び、呼の接続や切断はSIPで制御する。遅延と、到着間隔のばらつきであるゆらぎが音質を左右する。
LPWA
低消費電力で広い範囲をカバーする無線通信の総称。通信速度は低いが電池で長期間動くため、大量のセンサを広域に置くIoTの用途に適する。
MVNO
自社では無線通信設備を持たず、移動体通信事業者の設備を借りて自社ブランドで通信サービスを提供する事業者。設備投資を抑えた料金設定ができる。
pingとtraceroute
pingはICMPのエコー要求と応答で相手までの到達性と応答時間を調べる。tracerouteは経路上のルータを順に表示し、どこで通信が止まっているかを特定するのに使う。

例題 利用者が電子メールを送ってから、相手が読むまでに使われるプロトコルを順に挙げよ。

送信者のメールソフトから送信メールサーバへSMTP、送信メールサーバから受信者のメールサーバへSMTP、受信者が自分のメールサーバから取り出すときにPOP3またはIMAP4。宛先メールサーバの場所はDNSのMXレコードを引いて調べる。送信は一貫してSMTPで、受信だけがPOP3/IMAP4であることが要点。

例題 「ブラウザでサイトが開けないが、そのサイトのIPアドレスを直接入力すると開ける」場合、どこを疑うべきか。

IPアドレスで通信できている以上、経路やデフォルトゲートウェイは正常で、名前解決だけが失敗していると考えられる。DNSサーバの設定やDNSサーバ自体の障害を疑い、nslookupやdigで名前解決を単独で試して切り分ける。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類10:ネットワーク(通信プロトコル・ネットワーク応用)/RFC5321(SMTP)/RFC7208(SPF)

セキュリティ

情報セキュリティの基礎と脅威・攻撃手法

守るべき三つの性質と、代表的な攻撃手法が「どこの弱点を突いてくるのか」が分かります。

情報セキュリティとは、情報資産を機密性・完全性・可用性の三つの面から守ることです。機密性(Confidentiality)は許可された人だけが情報に触れられること、完全性(Integrity)は情報が正確で改ざんも欠落もないこと、可用性(Availability)は必要なときにいつでも使えることを指し、頭文字を取ってCIAと呼びます。JIS Q 27000ではこれに加えて、名乗ったとおりの本人・本物であることを確実にする真正性、誰が何をしたかを後からたどれる責任追跡性、行った事実を後から否定させない否認防止、意図したとおりにふるまう信頼性の四つが挙げられています。どの対策がどの特性を守るのかを言えるようにしておくことが、この分野の出発点です。

情報資産に損害を与えうる要因が脅威です。脅威は、誤操作や紛失、内部不正、ソーシャルエンジニアリングのような人的脅威、マルウェアや不正アクセス、盗聴のような技術的脅威、火災・地震・盗難のような物理的脅威に分けられます。これに対し、資産の側がもっている弱点が脆弱性で、修正プログラムを適用していないソフトウェアの欠陥、単純で使い回されたパスワード、施錠されていないサーバ室などが該当します。リスクとは、脅威が脆弱性を突いて損失が生じる可能性の度合いのことで、脅威か脆弱性のどちらかを小さくできればリスクは下がります。組織が対策を選ぶときは、この「脅威×脆弱性×資産価値」の大きさを見て判断します。

技術的脅威の中心がマルウェアです。ウイルスは単独では動かず他のプログラムに寄生して増えます。ワームは単独のプログラムとして動作し、自分の複製をネットワーク越しに送り込んで自己増殖します。トロイの木馬は有用なソフトに見せかけて導入させ、裏で不正な動作をします。ランサムウェアはファイルを暗号化して使えなくし、復元と引換えに金銭を要求します。スパイウェアは利用者の情報をひそかに収集して外部へ送信します。ボットは攻撃者のC&C(指令)サーバの命令で動き、多数が束ねられてボットネットを構成します。RATは端末を遠隔操作する道具で、標的型攻撃で侵入後に使われます。ファイルレスマルウェアはディスクに実行ファイルを置かず、メモリ上やOS標準のツールを悪用して動くため、ファイルの特徴で探す方式では見つけにくいのが特徴です。

Webアプリケーションを狙う攻撃は出題の中心です。SQLインジェクションは、入力値を文字列連結でSQL文に埋め込んでいる箇所を突き、データベースを不正に操作します。クロスサイトスクリプティング(XSS)は、入力をそのままHTMLに出力しているサイトを経由して、閲覧者のブラウザ上で攻撃者のスクリプトを実行させます。クロスサイトリクエストフォージェリ(CSRF)は、ログイン済みの利用者のブラウザから、本人が意図しない更新要求を送らせます。ディレクトリトラバーサルは「../」などを含むファイル名を与えて、公開を意図していないファイルを読み出します。OSコマンドインジェクションは、入力がシェルに渡る箇所に区切り文字を混ぜて任意のコマンドを実行させます。バッファオーバフローは入力長を検査していない領域をあふれさせて処理の流れを乗っ取ります。セッションハイジャックは、盗んだり推測したりしたセッションIDを使って他人になりすまします。

ネットワークを狙う攻撃もあります。DoS攻撃は大量の要求を送ってサービスを止め、これを多数の踏み台から一斉に行うのがDDoS攻撃です。DNSリフレクション(DNSアンプ)攻撃は、送信元IPアドレスを攻撃対象に詐称した問合せを多数のDNSサーバへ送り、問合せより大きな応答を攻撃対象へ集中させる増幅型の攻撃です。DNSキャッシュポイズニングは、DNSサーバのキャッシュに偽の対応関係を覚え込ませて利用者を偽サイトへ誘導します。中間者攻撃(Man-in-the-middle)は通信経路に割り込んで双方になりすまし、リプレイ攻撃は盗聴した認証データをそのまま送り直して認証を突破します。

パスワードそのものを狙う攻撃も整理しておきます。ブルートフォース攻撃はあり得る文字列を総当たりし、辞書攻撃は辞書に載っている単語やよくあるパスワードを試します。パスワードリスト攻撃は、他サイトから流出したIDとパスワードの組をそのまま別サイトで試すもので、使い回しがあると成立します。レインボーテーブル攻撃は、ハッシュ値と元の文字列の対応表をあらかじめ計算しておき、盗んだハッシュ値から元のパスワードを高速に割り出します。少し毛色が違うのがサイドチャネル攻撃で、暗号処理そのものではなく、処理時間・消費電力・電磁波といった物理的な観測値から鍵を推定します。

最後は人と組織を狙う攻撃です。標的型攻撃は特定の組織に狙いを定め、業務に見せかけたメールなどで長期間にわたり侵入を図ります。その一種であるやり取り型攻撃は、無害な問合せを何度か交わして信用させてからマルウェアを送り付けます。水飲み場型攻撃は、標的がよく訪れるWebサイトを改ざんして待ち伏せします。サプライチェーン攻撃は、対策の手薄な取引先や委託先、あるいはソフトウェアの配布経路を踏み台にして本来の標的へ入り込みます。ゼロデイ攻撃は修正プログラムが提供される前の脆弱性を突きます。ソーシャルエンジニアリングは、なりすましの電話や肩越しののぞき見(ショルダハッキング)、ごみ箱あさり(スキャベンジング)など、技術ではなく人の心理や不注意につけ込む手口です。内部不正については、機会・動機・正当化の三つがそろったときに起きるという「不正のトライアングル」の考え方が知られており、組織が直接手を打てるのは主として「機会」(権限の絞込み、職務分離、ログ監視、持出し制限)です。

主な攻撃手法と、それが突く弱点・主な対策
区分攻撃手法突かれる弱点主な対策
WebSQLインジェクションSQL文を入力値の文字列連結で組み立てているプレースホルダ(バインド機構)で値として渡す
Webクロスサイトスクリプティング入力値をそのままHTMLに出力している出力時のエスケープ処理
Webクロスサイトリクエストフォージェリその要求が本人の意図か確かめていない推測できないトークンを埋め込んで照合する
Webディレクトリトラバーサルファイル名を利用者の入力から組み立てているファイル名を直接受け取らず識別子で対応付ける
WebOSコマンドインジェクション入力値がシェルに渡っているシェルを介さないAPIを使い、入力を厳密に検証する
WebセッションハイジャックセッションIDが推測できる、盗聴できるIDを乱数で長くし、ログイン時に再発行、通信をTLSで暗号化
プログラムバッファオーバフロー入力長を検査せず領域をあふれさせられる境界検査を行う、安全な関数やライブラリを使う
ネットワークDoS・DDoS処理能力や回線容量には限りがあるレート制限、負荷分散、DDoS防御サービスの利用
ネットワークDNSリフレクション送信元IPを詐称でき、応答が問合せより大きいオープンリゾルバをやめる、送信元アドレスの検証
ネットワークDNSキャッシュポイズニング偽の応答をキャッシュしてしまうDNSSECで応答に署名し正当性を検証する
ネットワーク中間者攻撃・リプレイ攻撃経路上で盗聴・再送ができるTLSによる暗号化とサーバ証明書の検証、ワンタイムパスワード
認証ブルートフォース・辞書・パスワードリストパスワードが短い、単純、使い回されている長く複雑なパスワード、多要素認証、試行回数の制限
認証レインボーテーブルハッシュ値の対応表を事前計算できる利用者ごとのソルトを付けてハッシュ化、ストレッチング
標的型・水飲み場・やり取り型人の判断や信頼関係につけ込める教育と訓練、添付ファイルの制限、多層防御
内部不正権限が広すぎ、監視もされていない最小権限、職務分離、ログ監視、記憶媒体の持出し制限
機密性・完全性・可用性
情報セキュリティの三つの基本特性。許可された人だけが読めること、情報が正確で改ざんされていないこと、必要なときに使えること。頭文字を取ってCIAという。
真正性・責任追跡性・否認防止・信頼性
JIS Q 27000がCIAに加えて挙げる特性。順に、名乗ったとおりの本人であること、動作を主体まで追跡できること、行った事実を否定できないこと、意図したとおりにふるまうこと。
脆弱性
情報資産がもつ弱点。未修正のソフトウェアの欠陥、単純なパスワード、施錠されていない部屋など。脅威がこれを突いたときに損失が現実になる。
ランサムウェア
感染した端末やサーバのファイルを暗号化して使えなくし、復号と引換えに金銭を要求するマルウェア。近年はデータを窃取して公開すると脅す二重脅迫型もある。
ボット・ボットネット
攻撃者のC&C(指令)サーバからの命令で動くマルウェアと、それに感染した多数の端末が束ねられた集団。DDoS攻撃や迷惑メールの送信の踏み台にされる。
ファイルレスマルウェア
ディスクに実行ファイルを置かず、メモリ上やOS標準の管理ツールを悪用して動作するマルウェア。ファイルの特徴(シグネチャ)による検出が効きにくい。
SQLインジェクション
入力値を文字列連結でSQL文に埋め込んでいる箇所へ、SQLの断片を含む値を送り込み、データベースを不正に検索・改ざんする攻撃。対策はプレースホルダの利用。
クロスサイトスクリプティング
入力値をそのままHTMLに出力しているサイトを経由して、閲覧者のブラウザ上で攻撃者のスクリプトを実行させる攻撃。対策は出力時のエスケープ処理。
クロスサイトリクエストフォージェリ
ログイン済みの利用者のブラウザに、本人が意図しない更新要求を送らせる攻撃。対策は推測できないトークンを画面に埋め込み、要求時に照合すること。
ディレクトリトラバーサル
「../」などを含むファイル名を与えて、公開を意図していないディレクトリのファイルを読み書きする攻撃。ファイル名を利用者の入力から直接作らないことが対策。
OSコマンドインジェクション
入力値がシェルに渡る箇所へ「;」などの区切り文字を混ぜ、任意のOSコマンドを実行させる攻撃。シェルを介さないAPIを使い、入力を厳密に検証することが対策。
セッションハイジャック
盗聴や推測で入手したセッションIDを使い、他人になりすましてサービスを利用する攻撃。IDを推測困難にし、ログイン時に再発行し、通信を暗号化することが対策。
DDoS攻撃
多数の踏み台から一斉に大量の要求を送り、サービスを提供できない状態にする攻撃。可用性を直接損なう。踏み台にはボットネットが使われることが多い。
DNSリフレクション攻撃
送信元IPアドレスを攻撃対象に詐称した問合せを多数のDNSサーバへ送り、問合せより大きな応答を対象へ集中させる増幅型のDDoS攻撃。DNSアンプ攻撃ともいう。
DNSキャッシュポイズニング
DNSサーバのキャッシュに偽のドメイン名とIPアドレスの対応を覚え込ませ、利用者を偽サイトへ誘導する攻撃。応答に署名を付けるDNSSECが対策となる。
リプレイ攻撃
盗聴した認証データをそのまま送り直して認証を通過する攻撃。毎回異なる値を使うワンタイムパスワードやチャレンジレスポンス方式で防げる。
パスワードリスト攻撃
他のサイトから流出した利用者IDとパスワードの組をそのまま別のサイトで試す攻撃。パスワードの使い回しがあると成立する。多要素認証が有効な対策。
レインボーテーブル攻撃
ハッシュ値と元の文字列の対応表をあらかじめ計算しておき、盗んだハッシュ値から元のパスワードを高速に割り出す攻撃。利用者ごとのソルトを付けると無効化できる。
サイドチャネル攻撃
暗号アルゴリズムそのものではなく、処理時間・消費電力・電磁波などの物理的な観測値から鍵などの秘密情報を推定する攻撃。
水飲み場型攻撃
標的の組織の利用者がよく閲覧するWebサイトをあらかじめ改ざんしておき、訪れた標的だけにマルウェアを感染させる待ち伏せ型の攻撃。
サプライチェーン攻撃
対策が手薄な取引先や委託先、あるいはソフトウェアの配布経路を踏み台にして、本来の標的組織へ侵入する攻撃。
ゼロデイ攻撃
脆弱性が公表されてから修正プログラムが提供されるまでの間、あるいは開発元も知らない段階で、その脆弱性を突く攻撃。
ソーシャルエンジニアリング
技術ではなく人の心理や不注意につけ込んで情報を得る手口。なりすましの電話、肩越しののぞき見(ショルダハッキング)、ごみ箱あさり(スキャベンジング)など。
不正のトライアングル
内部不正は機会・動機・正当化の三つがそろったときに起きるという考え方。組織が直接減らせるのは主に「機会」で、最小権限や職務分離、ログ監視が効く。

例題 利用者が入力した氏名をそのまま画面に表示するWebサイトがあった。攻撃者が氏名欄にスクリプトを書き込んだところ、そのページを見た別の利用者のブラウザでスクリプトが動いてしまった。何という攻撃か。

クロスサイトスクリプティング(XSS)である。攻撃者のスクリプトが、脆弱なサイトを経由して被害者のブラウザ上で実行される点が特徴で、クッキーの窃取や偽の入力画面の表示に使われる。対策は、画面に出力する直前に「<」「>」「&」「"」などをエスケープして、HTMLのタグとして解釈されないようにすること。入力時の検査だけに頼るのは不十分である。

例題 退職を控えた社員が、顧客名簿を私物のUSBメモリにコピーして持ち出した。不正のトライアングルの三要素のうち、組織のしくみで直接小さくできるのはどれか。

「機会」である。動機(金銭的な事情や不満)と正当化(自分の働きに見合う、といった言い訳)は本人の内面の問題で、組織が直接消すことは難しい。一方、機会は、担当業務に必要な最小限のアクセス権しか与えない、申請と承認を別の人が行う職務分離、操作ログの取得と監視、USBメモリの使用制限といった手段で確実に減らせる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類11:セキュリティ(情報セキュリティ)/JIS Q 27000(情報セキュリティマネジメントシステム-用語)

暗号技術とディジタル署名

共通鍵と公開鍵の使い分け、そして「どちらの鍵で暗号化してどちらの鍵で戻すのか」が確実に言えるようになります。

暗号は、そのままでは読める平文を、鍵を使って読めない暗号文に変換(暗号化)し、正しい鍵をもつ人だけが元に戻せる(復号)ようにする技術です。現代の暗号ではアルゴリズムは公開されているのが普通で、安全性は鍵を秘密に保てるかどうかだけに依存します(ケルクホフスの原則)。鍵は長いほど総当たりに強くなりますが、その分処理も重くなります。暗号方式は、暗号化と復号に同じ鍵を使う共通鍵暗号方式と、対になる二つの鍵を使う公開鍵暗号方式に大きく分かれます。

共通鍵暗号方式(秘密鍵暗号方式)は、送信者と受信者が同じ鍵を共有します。代表的な方式はAESで、かつて使われたDESや3DESより安全で高速です。処理が軽いので、通信本文やファイルのように大きなデータの暗号化に向きます。弱点は鍵の配りかたで、相手ごとに別の鍵を安全に届けなければなりません(鍵配送問題)。n人が互いに通信するには n(n−1)/2 個の鍵が必要で、人数が増えると急激に増えます。10人なら45個、100人なら4,950個です。

公開鍵暗号方式は、対になる公開鍵と秘密鍵を各自がもちます。公開鍵は誰に配ってもよく、秘密鍵は本人だけが持ちます。片方の鍵で暗号化したものは、もう片方の鍵でしか戻せないという性質が要です。代表的な方式はRSAで、大きな数の素因数分解の難しさを安全性の根拠にしています。楕円曲線暗号(ECC)は、より短い鍵でRSAと同等の強度が得られるため、携帯端末やICカードで広く使われます。n人が互いに通信する場合に必要な鍵は各自1組ずつ、合計2n個で済みますが、処理は共通鍵暗号より格段に遅いという弱点があります。

公開鍵暗号の使い分けは、この分野で最も間違えやすいところです。秘密にして送りたい(機密性)ときは、受信者の公開鍵で暗号化します。復号できるのは対になる秘密鍵をもつ受信者だけなので、盗聴されても読まれません。この向きを逆にして送信者の秘密鍵で暗号化すると、公開鍵は誰でも入手できるため誰でも復号でき、秘密は守れません。そのかわり「その人しか作れなかった」ことが証明できるので、これがディジタル署名になります。なお、公開鍵暗号は遅いので、実際の通信では、本文は共通鍵暗号で暗号化し、その共通鍵だけを受信者の公開鍵で暗号化して送るハイブリッド暗号方式が使われます。TLSもこの考え方です。

ハッシュ関数は、任意の長さの入力から固定長のハッシュ値(メッセージダイジェスト)を作る一方向の関数です。代表はSHA-256で、同じ入力からは必ず同じ値が得られ、入力が1ビットでも違えば値は大きく変わります。ハッシュ値から元の入力を求めることが計算量的に困難であること(一方向性)と、同じハッシュ値になる別の入力を見つけることが困難であること(衝突発見困難性)が求められます。ファイルの改ざん検出やパスワードの保存に使われますが、鍵を使わないので、それだけでは「誰が作ったか」は分かりません。

ディジタル署名は、送信者が文書のハッシュ値を自分の秘密鍵で暗号化したものです。受信者は、署名を送信者の公開鍵で復号して得た値と、受け取った文書から自分で計算したハッシュ値を比べます。一致すれば、文書が改ざんされていないこと(完全性)と、送信者の秘密鍵をもつ本人が作ったこと(真正性)が確認でき、送信者は後から「自分は送っていない」と言えなくなります(否認防止)。文書自体は暗号化されないので、署名だけでは機密性は得られない点に注意します。似たしくみにメッセージ認証符号(MAC)があり、共通鍵を使って改ざんを検出しますが、同じ鍵を双方がもつため、第三者に対する否認防止にはなりません。

公開鍵が本当に相手のものかを保証するしくみがPKI(公開鍵基盤)です。認証局(CA)は、申請者の公開鍵と所有者情報をまとめ、そこにCA自身のディジタル署名を付けたディジタル証明書(X.509)を発行します。利用者はCAの公開鍵で証明書の署名を検証し、鍵の持ち主を確認します。鍵が漏えいするなどして有効期限前に無効化された証明書は、証明書失効リスト(CRL)や、その都度問い合わせるOCSPで確認します。TLSでは、サーバ証明書でサーバの真正性を確かめ、ハンドシェイクで共通鍵を安全に共有してから本文の通信を暗号化します。なお、大規模な量子コンピュータが実現するとRSAや楕円曲線暗号の安全性の根拠が崩れるとされ、それでも解読が難しいとされる耐量子計算機暗号(PQC)への移行が進められています。

共通鍵暗号方式と公開鍵暗号方式の比較(鍵の向きに注意)
比較の観点共通鍵暗号方式公開鍵暗号方式
鍵の持ち方送信者と受信者が同じ鍵を共有する公開鍵と秘密鍵の対を各自がもつ
秘密にして送るとき暗号化に使う鍵共有している共通鍵受信者の公開鍵
秘密にして送るとき復号に使う鍵同じ共通鍵受信者の秘密鍵
署名の作成に使う鍵署名には使えない(MACは共通鍵で作る)送信者の秘密鍵
署名の検証に使う鍵同じ鍵をもつ者なら誰でも作れてしまう送信者の公開鍵
n人が相互に通信するときの鍵n(n−1)/2 個の共通鍵2n個(各自が公開鍵と秘密鍵を1組)
処理速度速い(大きなデータ向き)遅い(小さなデータ向き)
鍵の配送相手ごとに安全に配る必要がある公開鍵はそのまま配ってよい
代表的な方式AES、3DESRSA、楕円曲線暗号(ECC)
主な用途通信本文やファイルの暗号化共通鍵の受渡し、ディジタル署名
共通鍵暗号方式
暗号化と復号に同じ鍵を使う方式。AESが代表。処理が高速で大きなデータ向きだが、相手ごとに鍵を安全に配る必要があり(鍵配送問題)、n人ではn(n−1)/2個の鍵がいる。
公開鍵暗号方式
対になる公開鍵と秘密鍵を使う方式。片方で暗号化したものはもう片方でしか戻せない。RSAや楕円曲線暗号が代表。鍵配送問題がない代わりに処理は遅い。
楕円曲線暗号
楕円曲線上の離散対数問題の難しさを根拠とする公開鍵暗号。RSAより短い鍵で同等の強度が得られ、処理も軽いため携帯端末やICカードで広く使われる。
ハイブリッド暗号方式
本文は高速な共通鍵暗号で暗号化し、その共通鍵だけを受信者の公開鍵で暗号化して渡す方式。速度と鍵配送のしやすさを両立する。TLSがこの方式を用いる。
ハッシュ関数
任意長の入力から固定長のハッシュ値を作る一方向の関数。SHA-256が代表。ハッシュ値から入力を求めることと、同じ値になる別の入力を見つけることが困難であることが求められる。
ディジタル署名
文書のハッシュ値を送信者の秘密鍵で暗号化したもの。受信者は送信者の公開鍵で検証する。完全性・真正性・否認防止が得られるが、文書自体は暗号化されない。
メッセージ認証符号(MAC)
共通鍵とメッセージから作る改ざん検出用の値。鍵を共有する当事者間では改ざんを検出できるが、双方が同じ鍵をもつため第三者に対する否認防止にはならない。
認証局(CA)
申請者の公開鍵と所有者情報に自らのディジタル署名を付けたディジタル証明書を発行する第三者機関。証明書の失効管理も行う。
ディジタル証明書
所有者情報と所有者の公開鍵に、認証局のディジタル署名を付けたデータ。X.509形式が標準。これにより公開鍵が本当に本人のものだと確認できる。
CRLとOCSP
有効期限前に失効させられた証明書を確認するしくみ。CRLは失効した証明書の一覧を配布する方式、OCSPは検証のたびに応答サーバへ個別に問い合わせる方式。
TLS
通信路を暗号化するプロトコル。サーバ証明書でサーバの真正性を確かめ、ハンドシェイクで共通鍵を安全に共有してから、本文を共通鍵暗号で暗号化する。
ソルト
パスワードをハッシュ化する前に付け加える利用者ごとに異なるランダムな文字列。同じパスワードでもハッシュ値が変わるため、事前計算したレインボーテーブルが効かなくなる。
ストレッチング
ハッシュ計算を数千回から数万回繰り返して、1回の検証にわざと時間をかける手法。総当たり攻撃に必要な時間を大幅に増やす。
耐量子計算機暗号(PQC)
大規模な量子コンピュータでも解読が難しいと考えられている暗号方式の総称。素因数分解や離散対数の困難性に頼るRSA・楕円曲線暗号の後継として標準化が進んでいる。

例題 AさんがBさんへ文書を送る。Bさんだけが読めるようにし、かつ差出人が確かにAさんであることをBさんが確認できるようにしたい。どの鍵をどう使えばよいか。

二つのことを別々に行う。機密性のためには、本文を共通鍵で暗号化し、その共通鍵をBさんの公開鍵で暗号化して一緒に送る(ハイブリッド暗号)。Bさんは自分の秘密鍵で共通鍵を取り出し、本文を復号する。真正性のためには、本文のハッシュ値をAさんの秘密鍵で暗号化した署名を添える。BさんはAさんの公開鍵で署名を検証し、自分で計算したハッシュ値と一致するかを確かめる。要点は、秘密にしたいときは相手の公開鍵、署名したいときは自分の秘密鍵、という向きである。

例題 共通鍵暗号方式で20人が互いに通信するには鍵が何個必要か。公開鍵暗号方式ではどうか。

共通鍵暗号方式では、2人の組合せの数だけ鍵がいるので 20×19÷2=190個。公開鍵暗号方式では各自が公開鍵と秘密鍵を1組もつだけなので 2×20=40個で済む。人数が増えるほど差は開き、100人では共通鍵が4,950個、公開鍵が200個となる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類11:セキュリティ(情報セキュリティ)/暗号技術・PKIの一般的な定義

認証・アクセス制御と境界の防御

本人確認のしかたと権限の絞り方、そしてファイアウォールからEDRまでの守備範囲の違いが分かります。

利用者認証は、本人だけが知っていること(知識)、本人だけが持っていること(所持)、本人自身の特徴(生体)の三つの要素のいずれかを確かめることで行います。パスワードや暗証番号、秘密の質問は知識、ICカードやハードウェアトークン、スマートフォンは所持、指紋や虹彩、静脈、声紋は生体です。このうち異なる二つ以上の要素を組み合わせるのが多要素認証で、パスワードとスマートフォンに届く確認コードの組合せが典型です。パスワードを二つ聞くのは要素が一つ(知識)だけなので多要素認証にはなりません。パスワードだけの認証はパスワードリスト攻撃に弱いため、多要素認証の導入が最も効果の大きい対策です。

生体認証は「持ち歩く必要も覚える必要もない」利点がありますが、判定は必ず似ている度合いのしきい値で行うため、誤りをゼロにはできません。本人なのに拒否してしまう割合が本人拒否率(FRR)、他人なのに受け入れてしまう割合が他人受入率(FAR)です。しきい値を厳しくすればFARは下がりますがFRRは上がり、緩めればその逆になるというトレードオフの関係にあり、両者が等しくなる点を等誤り率(EER)と呼んで装置の精度比較に使います。用途によってどちらを重視するかは変わり、機密区画の入退室ではFARを、多数の人がすばやく通る場面ではFRRを小さくする設定にします。

パスワードを毎回同じ文字列のまま送ると、盗聴されて再送されるリプレイ攻撃を受けます。これを防ぐのがワンタイムパスワードで、時刻から生成する時刻同期方式や、サーバから送られた乱数(チャレンジ)を鍵やパスワードで加工して返すチャレンジレスポンス方式があります。チャレンジレスポンス方式では、パスワードそのものは経路に流れません。さらに、普段と異なる場所や端末からのログインだけ追加の確認を求めるリスクベース認証も使われます。

利用者が一度の認証で複数のサービスを使えるようにするしくみがシングルサインオン(SSO)です。実現方式として、認証結果をXML形式のアサーションでやり取りするSAML、認証と認可を分けて考えるOAuth 2.0とOpenID Connectがあります。ここで大切なのは、認証(誰であるかを確かめること)と認可(何をしてよいかを許すこと)の区別です。OAuth 2.0は、利用者のIDとパスワードを渡すことなく、あるサービスに別のサービスの資源へのアクセスを許可するための「認可」の枠組みで、その上に本人確認を載せて「認証」まで扱えるようにしたものがOpenID Connectです。

アクセス制御には方式の違いがあります。任意アクセス制御(DAC)は、資源の所有者が自分の裁量で誰に何を許すかを決める方式で、一般的なファイルシステムの権限設定がこれに当たります。強制アクセス制御(MAC)は、資源と利用者にラベル(機密区分)を付け、組織の定めた規則に従って許可を決める方式で、所有者でも勝手に権限を広げられません。ロールベースアクセス制御(RBAC)は、個人ではなく「経理担当」「システム管理者」といった役割に権限を与え、利用者を役割に割り当てる方式で、人事異動に強く運用しやすいのが利点です。運用の原則としては、業務に必要な最小限の権限しか与えない最小権限の原則と、申請する人と承認する人を分ける職務分離が基本になります。近年は、社内ネットワークだからといって信用せず、すべてのアクセスをその都度検証するゼロトラストの考え方が広がっています。

ネットワークの境界を守る中心はファイアウォールです。パケットフィルタリング型は、パケットの送信元・宛先IPアドレス、ポート番号、プロトコルを見て、あらかじめ決めた規則で通過の可否を判断します。ステートフルインスペクション型は、これに加えて通信の状態(コネクションの確立状況)を記憶し、内部から出した要求に対応する戻りのパケットだけを通します。公開サーバは、インターネットからも内部ネットワークからも切り離した区画であるDMZ(非武装地帯)に置きます。こうしておけば、公開サーバが侵入されても、そこから内部の重要なサーバへ直接は到達できません。プロキシサーバを経由させれば、内部端末を直接インターネットに出さずに済み、URLフィルタリングやアクセスログの取得もできます。

ファイアウォールは通信の中身までは判断しないので、HTTPの上を通ってくるWeb攻撃は止まりません。そこで、HTTPの要求内容を検査してSQLインジェクションやクロスサイトスクリプティングらしい要求を遮断するWAFを組み合わせます。IDSは不正侵入の兆候を検知して管理者に通知するしくみ、IPSは検知に加えてその通信の遮断まで行うしくみです。侵入を完全には防げない前提で、端末上の挙動を記録して不審な動作を検知・隔離するEDR、各機器のログを集めて相関分析するSIEM、社内ネットワークへ接続する端末の状態を検査して基準を満たさなければ隔離する検疫ネットワークなどを重ね、いずれかで食い止める多層防御の考え方が主流です。

ファイアウォール・WAF・IDS/IPSなどの守備範囲の違い
機器・機能主に見るもの判断の材料止められる攻撃の例苦手なこと
パケットフィルタリング型FWIPヘッダとTCP/UDPヘッダ送信元・宛先IPアドレス、ポート番号、プロトコル公開していないポートへの接続許可したポートを通る攻撃(中身は見ない)
ステートフルインスペクション型FWヘッダ+通信の状態コネクションの確立状況と要求・応答の対応内部からの通信に見せかけた戻りパケットアプリケーションデータの中身の判断
WAFHTTP/HTTPSの中身URL、パラメータ、本文のパターンSQLインジェクション、XSS、CSRFなどWeb攻撃Web以外の通信
IDS通信やホストの挙動シグネチャ、平常時との差(アノマリ)不正侵入の兆候の検知と管理者への通知遮断はしない(検知と通知だけ)
IPS通信やホストの挙動IDSと同じ判断材料検知した通信をその場で遮断誤検知のときに正常な通信も止めてしまう
プロキシHTTP要求の宛先と内容URLのカテゴリ、ブラックリスト不正サイトへの接続、情報の持ち出し許可したサイトを悪用した攻撃
EDR端末上の挙動プロセスの起動、ファイル操作、通信の記録侵入後のマルウェアの動作の検知と隔離侵入そのものの予防
SIEM各機器のログを横断して相関分析単体のログでは見えない一連の攻撃の発見ログを出さない事象
検疫ネットワーク接続しようとする端末の状態修正プログラムやウイルス定義の適用状況対策不十分な端末の持ち込みによる感染拡大基準を満たした端末が起こす攻撃
認証の三要素
本人だけが知っていること(知識)、持っていること(所持)、本人自身の特徴(生体)。異なる要素を二つ以上組み合わせるのが多要素認証で、パスワードを二つ使っても多要素にはならない。
本人拒否率(FRR)
生体認証で、本人であるのに拒否してしまう割合。判定のしきい値を厳しくすると上がる。利便性に直結する指標。
他人受入率(FAR)
生体認証で、他人であるのに本人として受け入れてしまう割合。判定のしきい値を厳しくすると下がる。安全性に直結し、FRRとはトレードオフの関係にある。
等誤り率(EER)
しきい値を変えたときにFRRとFARが等しくなる点の値。値が小さいほど装置の精度が高く、生体認証装置の比較に使われる。
ワンタイムパスワード
一度しか使えないパスワード。時刻から生成する時刻同期方式などがあり、盗聴した認証データを再送するリプレイ攻撃を無効にする。
チャレンジレスポンス方式
サーバが送った乱数(チャレンジ)を、利用者側がパスワードや鍵で加工して返す認証方式。パスワードそのものが通信経路に流れないため盗聴に強い。
シングルサインオン
一度の認証で複数のサービスを利用できるようにするしくみ。SAMLやOpenID Connectなどの方式がある。利便性は上がるが、認証情報が漏れたときの影響も大きい。
OAuth 2.0
利用者のIDとパスワードを渡すことなく、あるサービスに対して別のサービスの資源へのアクセスを許可するための認可の枠組み。認証そのものの規格ではない。
OpenID Connect
OAuth 2.0の上に本人確認(認証)のしくみを載せた規格。誰であるかを表すIDトークンをやり取りする。
任意アクセス制御(DAC)
資源の所有者が自らの裁量でアクセス権を設定する方式。一般的なファイルシステムの権限設定がこれに当たる。
強制アクセス制御(MAC)
資源と利用者にラベル(機密区分)を付け、組織が定めた規則に従って可否を決める方式。所有者であっても勝手に権限を広げられない。
ロールベースアクセス制御(RBAC)
個人ではなく業務上の役割に権限を与え、利用者を役割に割り当てる方式。人事異動のたびに個別設定を直す必要がなく、運用しやすい。
最小権限の原則
利用者やプログラムには、業務の遂行に必要な最小限の権限だけを与えるという原則。事故や不正が起きたときの被害範囲を小さくできる。
ゼロトラスト
社内ネットワークの内側だからという理由で信用せず、すべてのアクセスを利用者・端末・文脈から都度検証する考え方。境界防御だけに頼らない設計になる。
DMZ
インターネットからも内部ネットワークからも分離した中間の区画。公開Webサーバやメールサーバを置き、侵入されても内部へ直接到達させないようにする。
ステートフルインスペクション
パケットのヘッダだけでなく、通信の状態(コネクションの確立状況)を記憶して可否を判断するファイアウォールの方式。内部から出した要求への戻りだけを通せる。
WAF
HTTP/HTTPSの要求内容を検査し、SQLインジェクションやクロスサイトスクリプティングなどWebアプリケーションへの攻撃を遮断する装置・ソフトウェア。
IDSとIPS
IDSは不正侵入の兆候を検知して通知するしくみ、IPSは検知に加えて該当する通信の遮断まで行うしくみ。IPSは誤検知で正常な通信を止めるおそれもある。
EDR
端末上のプロセス起動や通信の記録を収集し、不審な挙動を検知して隔離・調査を支援するしくみ。侵入を防ぎきれない前提で、侵入後の被害拡大を抑える。
SIEM
サーバやネットワーク機器のログを一か所に集め、相関分析して脅威の兆候を見つけ出すしくみ。単体の機器のログだけでは見えない一連の攻撃を検知できる。
検疫ネットワーク
社内ネットワークへ接続しようとする端末を、いったん隔離した区画で検査し、修正プログラムの適用状況などが基準を満たした場合だけ接続を許すしくみ。

例題 ある生体認証装置で、判定のしきい値を厳しくした。FRRとFARはそれぞれどう変化するか。

しきい値を厳しくすると、本人でも「似ていない」と判断されやすくなるのでFRR(本人拒否率)は上がり、他人が誤って受け入れられることは減るのでFAR(他人受入率)は下がる。両者はトレードオフで同時にゼロにはできない。研究室や金庫室のようにセキュリティを優先する場所ではFARが小さくなるよう厳しめに、多数の人が短時間で通る場所では利便性のためFRRが小さくなるよう緩めに設定する。

例題 あるWebサービスに、写真共有サービスの自分のアルバムを読み出させたい。ID・パスワードを渡さずに実現する枠組みは何か。

OAuth 2.0である。利用者は写真共有サービス側で「このサービスにアルバムの読取りを許す」と同意し、Webサービスにはアクセストークンだけが渡される。渡されるのは権限であって本人確認の結果ではない点が要点で、これは「認可」の枠組みである。本人が誰かを伝えたい場合は、OAuth 2.0の上に認証を載せたOpenID Connectを使う。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類11:セキュリティ(情報セキュリティ対策・セキュリティ技術評価)

情報セキュリティ管理と実装上の対策

ISMSとリスクの扱い方、組織的な体制、そして脆弱性を作り込まない書き方までを押さえます。

組織として情報セキュリティを維持する枠組みがISMS(情報セキュリティマネジメントシステム)で、要求事項をまとめた規格がJIS Q 27001(ISO/IEC 27001に対応)、実践のための管理策の手引がJIS Q 27002です。ISMSでは、まず適用範囲と情報セキュリティ方針を定め、守るべき情報資産を洗い出して台帳にし、リスクを評価して対応を決め、実施して監視し、内部監査とマネジメントレビューを経て見直す、という計画・実施・評価・改善のサイクルを回します。重要なのは、リスクをゼロにすることが目的ではなく、組織が決めた基準まで下げて管理し続けることが目的だという点です。認証を取得した後も、定期的な審査と継続的な改善が求められます。

リスクアセスメントは、リスク特定・リスク分析・リスク評価の三つのプロセスから成ります。リスク特定では、どんな資産にどんな脅威と脆弱性があるかを洗い出します。リスク分析では、その発生確率と影響の大きさを見積もってリスクの大きさを求めます。金額で表す定量的分析と、大・中・小のような段階で表す定性的分析があります。リスク評価では、求めた大きさをあらかじめ定めたリスク基準と比べ、対応が必要かどうか、どれから手を付けるかの優先順位を決めます。この順序を入れ替えた選択肢がよく出るので、特定→分析→評価の並びで覚えます。

評価の結果を受けて行うのがリスク対応で、四つに分類されます。リスク回避は、リスクの原因となる活動そのものをやめること。リスク移転(リスク共有)は、保険への加入や専門業者への委託によって、損失の負担を第三者と分け合うこと。リスク低減(軽減)は、暗号化や多要素認証、バックアップなどの対策で発生確率や損失の大きさを小さくすること。リスク保有(受容)は、損失が小さく対策費用に見合わないなどの理由で、対策せずに受け入れることです。対策を打った後にも残るリスクを残留リスクといい、これを認識して受容するかどうかを経営層が判断します。

組織の決まりごとは、情報セキュリティポリシとして三階層に整理するのが一般的です。最上位の基本方針(ポリシ)は、なぜ取り組むのかという目的、適用範囲、経営者の責任を示した宣言で、経営層が承認します。中位の対策基準(スタンダード)は、何をしなければならないかという組織共通のルールで、パスワードの条件や持出しの申請といった具体的な決まりを書きます。最下位の実施手順(プロシージャ)は、どうやるのかという作業レベルの手順書やマニュアルです。上位ほど変更の頻度が低く、下位ほど現場に近く具体的になります。

運用の体制としては、インシデントが起きたときの窓口となり、検知・封じ込め・根絶・復旧と再発防止を指揮するCSIRTと、セキュリティ機器のログを常時監視して異常を見つけるSOCが代表的です。事前の点検には、既知の脆弱性が残っていないかを網羅的に調べる脆弱性診断と、実際に攻撃者と同じ手口で侵入を試みて防御が突破できるかを確かめるペネトレーションテストがあります。脆弱性の情報は、個々の脆弱性に付ける共通の識別子であるCVE、深刻度を共通の基準で数値化するCVSS、日本国内向けに対策情報を提供するポータルであるJVNなどで共有されており、修正プログラムが出る前に攻撃されるゼロデイ攻撃に備えて、日ごろから更新の適用手順を整えておくことが必要です。

実装の段階で脆弱性を作り込まないための考え方がセキュアプログラミングです。基本は、外部から来る値をすべて信用せず、想定する形式・長さ・文字種に合っているかを検査すること(入力値検証)です。そのうえで、データベースへの問合せはプレースホルダ(バインド機構)で組み立てて入力値を値としてのみ渡し、HTMLへの出力は直前にエスケープ処理を行い、ファイル名やOSコマンドは利用者の入力からそのまま組み立てないようにします。さらに、エラーメッセージに内部の構造やSQL文をそのまま出さない、アプリケーションが使うデータベースの利用者には必要最小限の権限しか与えない、配列やバッファは境界を検査する、といった配慮を重ねます。対策は「攻撃の種類ごとに正しい対策が違う」という点が要で、XSS対策のエスケープをSQLインジェクション対策と取り違える誤りは典型的な誤答パターンです。

法規も押さえておきます。不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)は、他人の識別符号を無断で用いてアクセス制御されたコンピュータを利用できる状態にする行為や、セキュリティホールを突いて同様の状態にする行為、他人の識別符号を不正に取得・保管したり不正に取得を助長したりする行為を禁じています。刑法の不正指令電磁的記録に関する罪(いわゆるウイルス作成罪)は、正当な理由なくマルウェアを作成・提供・供用・取得・保管する行為を処罰します。個人情報保護法は、個人情報の取得・利用・提供のルールを定め、要配慮個人情報の取得には原則として本人の同意を必要とし、漏えい等が生じて個人の権利利益を害するおそれが大きい場合には個人情報保護委員会への報告と本人への通知を義務付けています。

SQLインジェクションに対して脆弱なコードと、プレースホルダを使った対策後のコード

/* 脆弱な例:入力値をそのままSQL文へ連結している */
○会員検索(文字列型: 入力ID)
  文字列型: sql
  sql ← "SELECT * FROM 会員 WHERE 会員ID = '" + 入力ID + "'"
  結果表示(DB問合せ(sql))

/* 対策後:プレースホルダに値として渡している */
○会員検索2(文字列型: 入力ID)
  文字列型: sql
  sql ← "SELECT * FROM 会員 WHERE 会員ID = ?"
  結果表示(DB問合せ(sql, 入力ID))
リスク対応の4分類と、情報セキュリティポリシの3階層
区分名称内容
リスク対応リスク回避リスクの原因となる活動そのものをやめる個人情報を預かる業務から撤退する
リスク対応リスク移転(共有)損失の負担を第三者と分け合うサイバー保険に加入する、専門業者へ委託する
リスク対応リスク低減(軽減)発生確率や損失の大きさを小さくする暗号化、多要素認証、バックアップ、教育
リスク対応リスク保有(受容)対策せずにそのまま受け入れる損失が小さく、対策費用に見合わない場合
ポリシ3階層基本方針(ポリシ)なぜ取り組むのか。目的・適用範囲・経営者の責任経営者が承認し公表する情報セキュリティ基本方針
ポリシ3階層対策基準(スタンダード)何をするのか。組織共通の守るべきルールパスワードの条件、記憶媒体の持出しは申請制
ポリシ3階層実施手順(プロシージャ)どうやるのか。具体的な作業手順サーバ設定手順書、マルウェア感染時の連絡手順
ISMS
情報セキュリティを組織的に管理し継続的に改善する枠組み。要求事項はJIS Q 27001が、実践のための管理策の手引はJIS Q 27002が示す。リスクをゼロにするのではなく、決めた基準まで下げて管理し続けることが目的。
リスクアセスメント
リスク特定・リスク分析・リスク評価の三つのプロセスの総称。何が起こりうるかを洗い出し、大きさを見積もり、リスク基準と比べて対応の要否と優先順位を決める。
定量的分析と定性的分析
リスクの大きさを金額など数値で見積もるのが定量的分析、大・中・小のような段階で表すのが定性的分析。数値化が難しい資産では定性的分析が使われる。
リスク回避
リスクの原因となる活動そのものをやめて、リスクを断つ対応。たとえば個人情報を扱う業務を廃止する、危険なサービスの提供をやめる、など。
リスク移転(リスク共有)
保険への加入や専門業者への委託によって、損失の負担を第三者と分け合う対応。リスクそのものが消えるわけではない点に注意する。
リスク低減(軽減)
対策を実施して発生確率や損失の大きさを小さくする対応。暗号化、多要素認証、バックアップ、教育など、いわゆるセキュリティ対策の多くがこれに当たる。
リスク保有(受容)
損失が小さい、対策費用が損失額に見合わないなどの理由で、対策せずにそのまま受け入れる対応。受容する判断は記録に残す。
残留リスク
対策を実施した後にも残るリスク。すべてのリスクを消すことはできないため、残留リスクを把握して受容するかどうかを経営層が判断する。
情報セキュリティポリシ3階層
上から、目的と適用範囲と経営者の責任を示す基本方針、組織共通のルールを定める対策基準、具体的な作業手順を書く実施手順の三段構成。上位ほど変更頻度が低い。
CSIRT
インシデントが起きたときの窓口となり、検知・封じ込め・根絶・復旧と再発防止を指揮する組織。社内に常設する場合と、必要時に招集する場合がある。
SOC
セキュリティ機器やサーバのログを常時監視し、攻撃の兆候をいち早く見つける専門組織。検知した事象はCSIRTへ引き継がれる。
ペネトレーションテスト
実際に攻撃者と同じ手口で侵入を試み、防御を突破できるかどうかを確かめる検査。網羅的に既知の弱点を洗い出す脆弱性診断とは目的が異なる。
CVE
個々の脆弱性に付けられる共通の識別子。CVE-西暦-通番の形式で表され、これを使うことで組織や製品をまたいで同じ脆弱性を指せる。
CVSS
脆弱性の深刻度を、攻撃のしやすさや影響の大きさなど共通の観点から数値化する評価手法。基本評価基準・現状評価基準・環境評価基準がある。
JVN
日本国内向けに脆弱性対策情報を提供するポータルサイト。国内で使われる製品の脆弱性と、その対策情報がまとめられている。
プレースホルダ(バインド機構)
SQL文の中で値を入れる場所を「?」などの記号で先に示し、後から値そのものとして与えるしくみ。値がSQLの構文として解釈されないため、SQLインジェクションを根本的に防げる。
エスケープ処理
出力先で特別な意味をもつ文字を、意味をもたない表記へ置き換える処理。HTMLへ出力する直前に「<」「>」などを変換することがクロスサイトスクリプティングの対策になる。
不正アクセス禁止法
他人の識別符号を無断で用いる、あるいはセキュリティホールを突くなどして、アクセス制御されたコンピュータを利用できる状態にする行為などを禁じる法律。識別符号の不正取得や助長行為も対象。
不正指令電磁的記録に関する罪
刑法に定められた、いわゆるウイルス作成罪。正当な理由なくマルウェアを作成・提供・供用・取得・保管する行為を処罰する。

例題 ある業務システムの停止による損失は年間で最大10万円と見積もられたが、対策の導入と運用には年間200万円かかることが分かった。どのリスク対応を選ぶのが妥当か。

リスク保有(受容)である。損失額に対して対策費用が大きく見合わないため、対策せずに受け入れるという判断が合理的になる。ただし、受容したという判断と根拠は記録に残し、前提(損失額や発生確率)が変わったときに見直せるようにしておく。なお、保険を掛けて損失の負担を移すならリスク移転、その業務自体をやめるならリスク回避になる。

例題 上のコードで、利用者が入力IDに「' OR '1'='1」と入力した場合、脆弱な例では何が起きるか。

組み立てられるSQL文が WHERE 会員ID = '' OR '1'='1' となり、条件が常に真になって会員表の全行が読み出されてしまう。入力値がSQLの構文の一部として解釈されてしまうことが原因である。対策後のコードでは、入力値は「?」の位置に値としてだけ渡され、構文としては解釈されないため、同じ文字列を入力しても単に「そういう会員IDの会員はいない」という結果になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類3:技術要素 中分類11:セキュリティ(情報セキュリティ管理・情報セキュリティ対策)/JIS Q 27001(情報セキュリティマネジメントシステム-要求事項)

開発技術

システム開発技術と設計技法

要件定義から実装までの流れとV字モデル、モジュール分割の良し悪しを測るものさし、UMLとオブジェクト指向の考え方が分かります。

システム開発は、いきなりプログラムを書き始めるのではなく、決まった順序で少しずつ具体化していきます。まずシステム全体で何を実現するかを決めるシステム要件定義、次にその機能をハードウェア・ソフトウェア・手作業のどれに割り当てるかを決めるシステム方式設計、続いてソフトウェアが何をするかを決めるソフトウェア要件定義、ソフトウェアの内部をどんなモジュールに分けてどうつなぐかを決めるソフトウェア方式設計、各モジュールの中身を決めるソフトウェア詳細設計、そして実装(プログラミング)へと進みます。「何をするか」を決めてから「どう作るか」を決める、全体から部分へ詳細化する、という二つの向きを守るのが基本です。

この流れを図にすると、左側に設計の工程が下りていき、右側にテストの工程が上がっていくV字の形になります。これがV字モデルで、左右で向かい合う工程どうしが対応関係を持ちます。ソフトウェア詳細設計に対応するのが単体テスト、ソフトウェア方式設計に対応するのが結合テスト、システム方式設計に対応するのがシステムテスト、システム要件定義(要件定義)に対応するのが運用テスト(受入テスト)です。つまり各テストは「対応する設計工程で決めたことが実現できているか」を確かめる場であり、テスト設計は対応する設計工程の成果物を根拠に作ります。この対応を意識すると、テストで見つかった不具合がどの工程の誤りかを追いやすくなります。

要件定義では、要件を機能要件と非機能要件に分けて整理します。機能要件は「受注を登録できる」「請求書を出力する」のように、システムが提供する処理そのものです。非機能要件は「検索結果を3秒以内に表示する」「24時間365日稼働する」「通信を暗号化する」のように、機能をどの程度の性能・可用性・セキュリティ・運用性・拡張性で実現するかを定めたものです。非機能要件は後から変えると全体の作り直しになりやすいため、早い段階で数値を伴った形で決めておくことが重要です。

設計技法のうち、処理の手順を中心に考えるのが構造化設計です。データの流れに着目してシステムを表すデータフロー図(DFD)では、プロセス(円または角丸四角)、データフロー(矢印)、データストア(2本の平行線)、外部実体(四角形)の四つの記号を使い、制御の流れではなくデータの流れだけを描きます。イベントによって振る舞いが変わる対象は状態遷移図で、状態と、状態を移らせるイベントの組合せとして表します。プログラム全体は、機能のまとまりごとにモジュールへ分割します。

モジュール分割の良し悪しは、モジュールの独立性で測ります。ものさしは二つあり、一つはモジュール同士のつながりの弱さを見る結合度で、弱いほど(データ結合に近いほど)よいとされます。弱い順にデータ結合、スタンプ結合、制御結合、外部結合、共通結合、内容結合です。もう一つはモジュールの中身のまとまりの良さを見るモジュール強度(凝集度)で、強いほど(機能的強度に近いほど)よいとされます。弱い順に暗号的強度、論理的強度、時間的強度、手順的強度、連絡的強度、情報的強度、機能的強度です。「結合度は弱く、強度は強く」が合言葉で、この二つの順序は試験で頻出です。

現在の主流であるオブジェクト指向では、データ(属性)とそれを操作する手続(メソッド)を一つにまとめたクラスを単位に考えます。クラスから実際に生成した実体がインスタンスです。内部のデータを外から直接触れないようにして、決められたメソッド経由でだけ操作させるのがカプセル化、上位クラスの属性や操作を下位クラスが受け継いで差分だけ書けるようにするのが継承(汎化・特化の関係)、同じメッセージでも受け手のクラスによって異なる動作をするのが多相性(ポリモーフィズム)です。全体と部分の関係を表すのが集約です。よく現れる設計の型をまとめたものがデザインパターンです。

オブジェクト指向の設計を図で表す共通の記法がUMLです。クラスの属性・操作と、汎化や集約といったクラス間の静的な関係を表すクラス図、利用者(アクター)とシステムの機能の関係を表すユースケース図、オブジェクト間のメッセージのやり取りを時間順に表すシーケンス図、処理の流れや分岐・並行処理を表すアクティビティ図、一つのオブジェクトの状態遷移を表す状態マシン図などがあり、表したいものによって使い分けます。

利用者が実際に触れる部分の設計も開発技術の一部です。ユーザビリティは、指定された利用者が特定の状況で目的を達成する際の有効さ・効率・満足度の度合いを指し、見た目の良し悪しだけを言うものではありません。UI設計では、操作の一貫性を保つ、押せるものと押せないものを見た目で区別する、誤操作を取り消せるようにする、エラーメッセージで次にすべきことを示す、といった配慮が求められます。年齢や障害の有無にかかわらず使えるようにする考え方がアクセシビリティです。

データ結合と制御結合の違い(同じ引数渡しでも意味が違う)

/* データ結合の例:必要な値だけを引数で渡している */
○実数型: 税込金額(整数型: 本体価格, 実数型: 税率)
  return 本体価格 × (1 + 税率)

/* 制御結合の例:引数で相手の処理内容を切り替えている */
○整数型: 計算(整数型: a, 整数型: b, 整数型: 種別)
  if (種別 = 1)
    return a + b
  else
    return a - b
  endif
V字モデルの対応・UML図の使い分け・結合度と強度の順序(まとめ)
区分項目内容
V字モデルシステム要件定義運用テスト(受入テスト)で検証する
V字モデルシステム方式設計システムテストで検証する
V字モデルソフトウェア要件定義ソフトウェア適格性確認テストで検証する
V字モデルソフトウェア方式設計結合テストで検証する
V字モデルソフトウェア詳細設計単体テストで検証する
UMLクラス図クラスの属性・操作と、汎化・集約・関連といったクラス間の静的な関係を表す
UMLユースケース図利用者(アクター)とシステムが提供する機能の関係を表す
UMLシーケンス図オブジェクト間のメッセージのやり取りを、上から下への時間の流れに沿って表す
UMLアクティビティ図処理の流れ、分岐と合流、並行処理を表す。業務フローの記述にも使う
UML状態マシン図一つのオブジェクトが取る状態と、イベントによる状態の遷移を表す
結合度(弱いほどよい)1 データ結合(最も弱い=最良)必要なデータ項目だけを引数として受け渡す
結合度(弱いほどよい)2 スタンプ結合レコードなどのデータ構造をまとめて引数で渡し、その一部だけを使う
結合度(弱いほどよい)3 制御結合処理の切替えを指示する制御用の引数を渡し、相手の動きを決める
結合度(弱いほどよい)4 外部結合必要なモジュールだけが共有する、外部宣言された単一のデータを参照する
結合度(弱いほどよい)5 共通結合共通のグローバル領域(共通域)のデータを互いに参照・更新する
結合度(弱いほどよい)6 内容結合(最も強い=最悪)相手モジュールの内部を直接参照したり、途中へ飛び込んだりする
モジュール強度(強いほどよい)1 暗号的強度(最も弱い=最悪)互いに関係のない処理を、単に寄せ集めただけ
モジュール強度(強いほどよい)2 論理的強度関連する複数の機能をまとめ、引数で指定された一つだけを実行する
モジュール強度(強いほどよい)3 時間的強度初期化処理など、実行される時点が同じ処理をまとめた
モジュール強度(強いほどよい)4 手順的強度決まった順序で実行する処理をまとめた(扱うデータの関連は問わない)
モジュール強度(強いほどよい)5 連絡的強度順序に加えて、同じデータを扱うという関連のある処理をまとめた
モジュール強度(強いほどよい)6 情報的強度同じデータ構造を扱う複数の機能を、入口を分けて一つにまとめた
モジュール強度(強いほどよい)7 機能的強度(最も強い=最良)一つの明確な機能だけを実行し、余計な処理を含まない
V字モデル
左に設計工程、右にテスト工程を並べてV字に描き、向かい合う工程を対応付けた開発の進め方。詳細設計と単体テスト、方式設計と結合テストのように、各テストが何を検証するかを明確にする。
機能要件
システムが提供する処理そのものを定めた要件。受注を登録する、請求書を出力するなど「何をするか」を表す。
非機能要件
機能をどの程度の品質で実現するかを定めた要件。応答時間などの性能、稼働率などの可用性、セキュリティ、運用・保守性、拡張性が含まれ、数値で決めておくことが望ましい。
DFD
データフロー図。プロセス、データフロー、データストア、外部実体の四つの記号でデータの流れを表す図。制御の流れや実行順序は表さない。
結合度
モジュール同士のつながりの強さ。弱いほど独立性が高く保守しやすい。弱い順にデータ結合、スタンプ結合、制御結合、外部結合、共通結合、内容結合。
データ結合
必要なデータ項目だけを引数として受け渡す結合。結合度が最も弱く、最も望ましい形とされる。
共通結合
複数のモジュールが共通のグローバル領域に置いたデータを互いに参照・更新する結合。どこで値が変わるか追いにくく、結合度が強い。
内容結合
相手モジュールの内部を直接参照したり途中に飛び込んだりする結合。結合度が最も強く、避けるべき形とされる。
モジュール強度
凝集度ともいう。モジュール内のまとまりの良さ。強い順に機能的強度、情報的強度、連絡的強度、手順的強度、時間的強度、論理的強度、暗号的強度。
機能的強度
一つの明確な機能だけを実行するモジュールの状態。モジュール強度の中で最も強く、最も望ましい。
カプセル化
データとそれを操作する手続を一つにまとめ、内部の構造を外から隠すこと。外部は決められたメソッドを通じてだけ操作できるため、内部を変更しても影響が広がらない。
継承
上位クラスの属性や操作を下位クラスが受け継ぐ仕組み。下位クラスは差分だけを定義すればよい。クラス間の汎化・特化の関係を実装したもの。
多相性
ポリモーフィズム。同じメッセージを送っても、受け取るオブジェクトのクラスによって異なる動作をする性質。呼び出す側は相手のクラスを意識しなくてよい。
集約
複数のオブジェクトを部分としてまとめ、全体と部分の関係を表すもの。汎化(〜は〜の一種である)とは区別する。
ユーザビリティ
指定された利用者が特定の状況で目的を達成する際の、有効さ・効率・満足度の度合い。見た目の美しさだけを指す言葉ではない。

例題 例題:単体テストで見つかった不具合の原因を探すとき、まず疑うべき設計工程の成果物はどれか。

ソフトウェア詳細設計の成果物。V字モデルでは単体テストがソフトウェア詳細設計と向かい合っており、単体テストはモジュール内部の処理が詳細設計どおりに作られているかを確かめる場だから。モジュール同士のつなぎ目の不具合なら結合テストとソフトウェア方式設計、業務全体の流れの不具合なら運用テストと要件定義、というように対応関係をたどって原因工程を絞り込む。

例題 例題:あるモジュールが、呼び出し元と共通のグローバル変数WORKを介して値をやり取りしている。結合度は何か。また改善するとどうなるか。

共通結合。共通域のデータを互いに参照・更新しているためで、どのモジュールがいつ値を変えたのか追えず、片方を直すと他方が壊れやすい。WORKをやめて、必要なデータ項目だけを引数と戻り値で受け渡すように直せばデータ結合になり、結合度が最も弱い(独立性が最も高い)状態になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類4:開発技術 中分類12:システム開発技術

テストと品質の確認

ホワイトボックステストの網羅基準の違い、同値分割と境界値分析、テスト工程とレビューの進め方が分かります。

テストは、作ったものが仕様どおりに動くことを確かめる作業です。大きく二つの立場があります。プログラムの内部構造を見て、どの経路を通るかを根拠にテストケースを作るのがホワイトボックステスト、内部構造は見ずに仕様上の入力と出力の関係だけからテストケースを作るのがブラックボックステストです。前者は主に単体テストで、後者は主に結合テスト以降で使われます。両方を組み合わせないと、通っていない経路や、仕様に対する考え違いを見落とします。

ホワイトボックステストでは、どこまで網羅すれば十分と考えるかの基準(網羅基準、カバレッジ)を決めます。命令網羅は、すべての命令を少なくとも1回実行すればよいという最も弱い基準です。判定条件網羅(分岐網羅)は、それぞれの判定の結果が真と偽の両方になるようにします。条件網羅は、判定の中に複数の条件があるとき、個々の条件がそれぞれ真と偽の両方になるようにします。判定条件/条件網羅は、判定条件網羅と条件網羅の両方を同時に満たします。複数条件網羅は、判定に含まれる個々の条件の真偽の全組合せを実行する最も強い基準です。

ここで注意したいのは、条件網羅を満たしても判定条件網羅を満たすとは限らない、という点です。たとえば if (A or B) に対して(A=真, B=偽)と(A=偽, B=真)の2件を実行すると、AもBも真と偽の両方を取るので条件網羅は満たしますが、判定の結果はどちらも真のままなので判定条件網羅は満たしません。逆に if (A and B) に対して(真,真)と(偽,真)の2件では、判定は真と偽の両方になりますが、Bが真のままなので条件網羅を満たしません。一方、複数条件網羅を満たせば、個々の条件も判定全体も必ず真と偽の両方を取るので、条件網羅と判定条件網羅の両方を含みます。条件の数がn個なら組合せは2のn乗通りで、条件が増えると急に件数が増えるのが弱点です。

ブラックボックステストの代表がまず同値分割です。同じ結果になる入力の範囲を同値クラスに分け、各クラスから代表値を一つずつ選びます。「1以上100以下なら有効」という仕様なら、有効クラス(1〜100)、無効クラス(1未満)、無効クラス(100より大きい)の三つに分かれ、たとえば50、-5、150の3個を選びます。次に境界値分析は、誤りは境目で起きやすいという経験に基づき、同値クラスの境目とその隣の値を選びます。同じ仕様なら0、1、100、101の4個です。判定式の不等号や等号の付け間違いは、まさにこの4個で見つかります。入力と出力の論理関係を図にして決定表に直し、組合せのテストケースを作るのが原因結果グラフです。

テストは工程としても段階を踏みます。単体テストはモジュール一つずつの内部を確認し、結合テストはモジュールをつないだときのインタフェースを確認します。結合の進め方には、上位から順につないでいくトップダウンテストと、下位から順につないでいくボトムアップテストがあります。トップダウンでは、まだできていない下位モジュールの代わりに決められた値を返すスタブを用意し、ボトムアップでは、上位モジュールの代わりにテスト対象を呼び出すドライバを用意します。その後、システム全体を確認するシステムテスト、利用者が実際の業務の流れで確認する運用テスト(受入テスト)へと進みます。

そのほか、修正した箇所以外に悪影響が出ていないかを、過去のテストケースを再実行して確認するのが回帰テスト(リグレッションテスト)です。想定した応答時間やスループットが出るかを見るのが性能テスト、想定を超える負荷をかけて限界や挙動を見るのが負荷テスト(ストレステスト)です。テストの進み具合と品質は、テスト項目の消化件数と検出バグ件数を時間の経過に沿って描いたバグ管理図(信頼度成長曲線)で管理します。検出バグの累積件数はふつうS字を描き、終盤で増加が鈍って水平に近づくと収束したと判断します。

プログラムを動かさずに人の目や道具で確認する方法もあります。関係者が集まって成果物の誤りを見つけるのがレビューで、作成者が主催して非公式に行うウォークスルー、モデレーター(進行役)が主催し役割と手順を定めて公式に行うインスペクション、参加者が持ち回りで司会や説明を担当するラウンドロビンなどがあります。ソースコードを実行せずに構文や規約違反、危険な記述を機械的に調べるのが静的解析です。加えて、回帰テストのように何度も繰り返すテストはツールで自動化しておくと、修正のたびに安心して確認できます。

同じ2件でも、選び方で満たす網羅基準が変わる

○整数型: 判定(整数型: a, 整数型: b)
  整数型: x
  if (a > 0 and b > 0)
    x ← 1
  else
    x ← 2
  endif
  return x

/* (a,b)=(1,1) と (-1,-1) の2件 : 判定条件網羅も条件網羅も満たす */
/* (a,b)=(1,1) と (-1,1)  の2件 : 判定条件網羅のみ(bが真のまま)*/
/* (a,b)=(1,-1) と (-1,1) の2件 : 条件網羅のみ(判定はどちらも偽)*/
/* 上記4組合せすべてを実行して初めて複数条件網羅(4件)*/
ホワイトボックスの網羅基準・ブラックボックスの技法・レビュー技法の比較
区分名称内容(満たすべきこと)件数の目安・注意点
ホワイトボックス命令網羅すべての命令を少なくとも1回実行する最も弱い。else側に命令がなければ判定を偽にしなくても満たせる
ホワイトボックス判定条件網羅(分岐網羅)それぞれの判定の結果が真と偽の両方になるif (A and B) … else … なら最小2件。個々の条件の真偽は問わない
ホワイトボックス条件網羅個々の条件がそれぞれ真と偽の両方の値を取る最小2件。判定全体が真と偽の両方になるとは限らない
ホワイトボックス判定条件/条件網羅判定条件網羅と条件網羅を同時に満たす条件2個なら(真,真)と(偽,偽)の2件で満たせる
ホワイトボックス複数条件網羅個々の条件の真偽の全組合せを実行する条件がn個なら2のn乗件。条件2個で4件、3個で8件。最も強い
ブラックボックス同値分割同じ結果になる入力の範囲に分け、各クラスから代表値を1個選ぶ1〜100が有効なら、有効1クラス+無効2クラスで計3個
ブラックボックス境界値分析同値クラスの境目と、その隣の値を選ぶ1〜100が有効なら0・1・100・101の4個
ブラックボックス原因結果グラフ入力と出力の論理関係を図にし、決定表に変換して組合せを作る条件の組合せ漏れを防ぐ。件数は組合せ数による
レビューウォークスルー作成者が主催し、参加者と成果物を追いながら非公式に誤りを指摘する管理者は原則参加しない。評価の場にしない
レビューインスペクションモデレーター(進行役)が主催し、役割と手順を定めて公式に行う事前準備・記録・是正確認まで手順化する
レビューラウンドロビン参加者が持ち回りで司会や説明を担当する全員が均等に関与できる
ホワイトボックステスト
プログラムの内部構造(分岐や経路)を見て、どこを通るかを根拠にテストケースを作る技法。網羅基準を決めて、どこまで確認したかを測る。主に単体テストで使う。
ブラックボックステスト
内部構造を見ずに、仕様上の入力と出力の関係だけからテストケースを作る技法。同値分割、境界値分析、原因結果グラフが代表例。
命令網羅
すべての命令を少なくとも1回実行することを求める、最も弱い網羅基準。else側に命令がなければ判定を偽にしなくても満たせてしまう。
判定条件網羅
分岐網羅ともいう。それぞれの判定の結果が真と偽の両方になるようテストケースを作る基準。個々の条件の真偽までは問わない。
条件網羅
判定に含まれる個々の条件が、それぞれ真と偽の両方の値を取るようにする基準。判定全体の結果が真と偽の両方になるとは限らない点に注意する。
判定条件/条件網羅
判定条件網羅と条件網羅の両方を同時に満たす基準。個々の条件も判定全体も真と偽の両方を取る。
複数条件網羅
判定に含まれる個々の条件の真偽の全組合せを実行する、最も強い網羅基準。条件がn個なら2のn乗通りが必要で、条件網羅と判定条件網羅を包含する。
同値分割
同じ結果になる入力の範囲(同値クラス)に分け、有効クラスと無効クラスのそれぞれから代表値を一つずつ選ぶブラックボックステストの技法。
境界値分析
同値クラスの境目とその隣の値をテストデータに選ぶ技法。1以上100以下が有効なら0・1・100・101を選ぶ。不等号や等号の付け間違いを見つけやすい。
原因結果グラフ
入力(原因)と出力(結果)の論理的な関係を図に表し、決定表に変換して組合せのテストケースを作る技法。
スタブ
トップダウンテストで、まだできていない下位モジュールの代わりに用意する仮のモジュール。呼び出されると決められた値を返す。
ドライバ
ボトムアップテストで、まだできていない上位モジュールの代わりに用意する仮のモジュール。テスト対象を呼び出して結果を受け取る。
回帰テスト
リグレッションテスト。修正した箇所以外に悪影響が出ていないかを、過去のテストケースを再実行して確認するテスト。自動化の効果が大きい。
バグ管理図
テスト項目の消化件数と検出バグ件数を時間の経過に沿って描いた図。検出バグの累積件数がS字を描いて水平に近づいたとき収束と判断する(信頼度成長曲線)。
インスペクション
モデレーター(進行役)が主催し、参加者の役割と手順をあらかじめ定めて公式に行うレビュー。事前準備と指摘の記録、是正の確認までを手順化する。
ウォークスルー
作成者が主催し、参加者と一緒に成果物を追いながら誤りを指摘し合う非公式なレビュー。管理者は原則参加せず、評価の場にしないのが原則。
静的解析
プログラムを実行せずに、ソースコードの構文・コーディング規約違反・危険な記述などを機械的に検査すること。

例題 例題:判定が if (A or B) のとき、(A=真, B=偽)と(A=偽, B=真)の2件は、条件網羅と判定条件網羅のどちらを満たすか。

条件網羅だけを満たす。Aは真と偽、Bも真と偽の両方を取るので条件網羅は成立するが、orなので判定結果はどちらも真になり、偽のケースがないため判定条件網羅は成立しない。判定条件網羅も満たすには、たとえば(真,真)と(偽,偽)を選ぶ。

例題 例題:「入力が18以上65未満なら受付、それ以外はエラー」という仕様に対し、境界値分析で選ぶテストデータを挙げよ。

17、18、64、65の4個。境目は18と65で、18は有効側の下限、17はその一つ外側、64は有効側の上限(65未満なので有効な最大は64)、65は無効側の入口である。「65以下」と書き間違えたり「18より大きい」と書き間違えたりする誤りは、この4個で検出できる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類4:開発技術 中分類12:システム開発技術(ソフトウェア構築・ソフトウェア結合・ソフトウェア導入)

開発モデルと開発管理

ウォーターフォールからアジャイルまでの進め方の違い、スクラムの役割・イベント・成果物、CI/CDや構成管理の考え方が分かります。

開発の進め方(開発モデル)にはいくつかの型があります。ウォーターフォールモデルは、要件定義から順に工程を下流へ一度だけ流し、原則として前の工程には戻りません。工程ごとに成果物を確定させるため管理しやすい反面、後の工程で要件の誤りが見つかると手戻りが大きくなります。プロトタイピングモデルは、早い段階で試作品を作って利用者に触ってもらい、その評価をもとに要求を固めます。スパイラルモデルは、システムを独立性の高い部分に分け、設計・実装・評価という流れを部分ごとに繰り返して渦を描くように全体を完成させます。RADは、少人数のチームと開発支援ツールを使い、期間を区切って短期間で開発を終えることを重視します。

アジャイル開発は、1〜4週間程度の短い反復(イテレーション)を繰り返し、反復ごとに動くソフトウェアを作りながら進める考え方の総称です。アジャイルソフトウェア開発宣言では、プロセスやツールよりも個人と対話を、包括的なドキュメントよりも動くソフトウェアを、契約交渉よりも顧客との協調を、計画に従うことよりも変化への対応を重視するとしています。ただし右側に書かれたことに価値がないという意味ではなく、より価値を置くという相対的な表明です。代表的な手法にスクラム、XP(エクストリームプログラミング)、かんばん(作業を見える化し、仕掛かり中の作業量を制限して流れを良くする)があります。

スクラムは、役割・イベント・成果物を定めた枠組みです。役割は三つで、何を作るかを決めてプロダクトバックログの内容と優先順位に責任を持つプロダクトオーナー、スクラムが正しく実践されるよう支援し妨げを取り除くスクラムマスター、実際に作るとともに誰が何をするかを自分たちで決める開発者です。スクラムマスターは指示を出す管理者ではありません。

イベントは、固定長の期間であるスプリント(1か月以内)と、その中で行う四つです。スプリントプランニングで今回何を作るかを決めてスプリントバックログを作り、デイリースクラムで開発者が毎日15分程度、進捗と妨げを確認してその日の計画を調整し、スプリントレビューで完成したインクリメントを関係者に見せてフィードバックを得て、スプリントレトロスペクティブでチームの進め方そのものを振り返って次の改善策を決めます。レビューが「作ったもの」を見るのに対し、レトロスペクティブは「作り方」を見る点が違いです。成果物は、プロダクトに必要なものを優先順位付きで並べたプロダクトバックログ、そのスプリントで実現する項目と作業をまとめたスプリントバックログ、そのスプリントで完成し積み上がった動くインクリメントの三つです。

XPは、開発者側の具体的な実践(プラクティス)を重視します。2人が1台の端末を共有し、書き手と確認役を交代しながら進めるペアプログラミング、実装より先にテストコードを書いてそれが通るようにコードを書くテスト駆動開発、外部から見た振る舞いを変えずに内部構造を分かりやすく作り直すリファクタリング、変更をこまめに共有リポジトリへ反映してその都度自動でビルドとテストを行う継続的インテグレーションなどが代表です。ほかに、コードは全員のものとする共同所有、シンプルな設計、小まめなリリースといった実践もあります。

開発を組織として管理するための共通の物差しが共通フレーム(SLCP)です。取得者と供給者が同じ用語と作業の枠組みで話せるように、企画から開発、運用、保守、廃棄までのプロセスを定義したもので、そのまま使う手順書ではなく、必要な作業を選んで修正(テーラリング)して使います。開発コストを下げる工夫としてはソフトウェアの再利用があり、部品化したモジュールやライブラリ、フレームワークを活用します。既存のプログラムを解析して仕様や設計情報を導き出すのがリバースエンジニアリング、そこから得た情報をもとに新しいシステムを作るのがフォワードエンジニアリング、両者を合わせて既存システムを作り直すのがリエンジニアリングです。公開された複数のサービス(API)を組み合わせて新しいサービスを作るのがマッシュアップです。なお、再利用や解析にあたっては、著作権やライセンス条件、OSSの利用条件など知的財産の適用範囲を必ず確認します。

開発と運用を分断せず、協力して速く安全に価値を届けようという考え方がDevOpsです。これを支えるのが自動化で、変更を共有リポジトリへ頻繁に反映しそのたびに自動でビルドとテストを行う継続的インテグレーション(CI)と、そこからリリース可能な状態の用意や本番環境への配置までを自動化する継続的デリバリー/継続的デプロイメント(CD)が代表です。土台となるのが構成管理で、ソースコード・設計書・設定ファイル・環境の状態といった構成要素を識別し、変更を記録して、いつでも特定時点の状態を再現できるようにします。その中でソースコードの版を管理するのがバージョン管理です。開発環境・試験環境・本番環境は分けたうえで、構成管理によって同じ状態を再現できるようにしておくのが基本です。

ウォーターフォールとアジャイルの比較/スクラムの役割・イベント・成果物
区分項目内容
開発モデルの比較進め方ウォーターフォール:工程を上流から下流へ一度だけ順に進める/アジャイル:短い反復を繰り返す
開発モデルの比較要件の扱いウォーターフォール:最初に固めて凍結する/アジャイル:反復ごとに見直し、変化を受け入れる
開発モデルの比較動くものが出る時期ウォーターフォール:終盤(結合以降)/アジャイル:反復ごとに毎回出る
開発モデルの比較文書ウォーターフォール:工程ごとに正式な文書で引き継ぐ/アジャイル:動くソフトウェアと対話を重視し、文書は必要な分だけ
開発モデルの比較テストの位置ウォーターフォール:実装後にまとめて行う/アジャイル:反復の中で継続的に行う
開発モデルの比較向く案件ウォーターフォール:要件が安定し規模が大きい/アジャイル:要件が変わりやすく利用者と密に進められる
スクラムの役割プロダクトオーナープロダクトバックログの項目と優先順位に責任を持ち、プロダクトの価値を最大化する
スクラムの役割スクラムマスタースクラムが正しく実践されるよう支援し、妨げを取り除く。作業を割り当てて指示はしない
スクラムの役割開発者スプリントごとにインクリメントを作る。誰が何をするかは自分たちで決める(自己管理)
スクラムのイベントスプリント1か月以内の固定長の期間。この中で他のイベントが行われる
スクラムのイベントスプリントプランニングこのスプリントで何を作るかを決め、スプリントバックログを作る
スクラムのイベントデイリースクラム開発者が毎日15分程度で進捗と妨げを共有し、その日の計画を調整する
スクラムのイベントスプリントレビュー完成したインクリメントを関係者に示し、フィードバックを得る(成果物を見る)
スクラムのイベントスプリントレトロスペクティブチームの進め方そのものを振り返り、次のスプリントの改善策を決める(作り方を見る)
スクラムの成果物プロダクトバックログプロダクトに必要なものを優先順位を付けて並べた一覧。常に見直される
スクラムの成果物スプリントバックログそのスプリントで実現する項目と、それを達成するための作業の一覧
スクラムの成果物インクリメントそのスプリントで完成し、これまでの成果に積み上がった動作するソフトウェア
ウォーターフォールモデル
工程を上流から下流へ一度だけ順に進め、原則として前工程に戻らない開発モデル。管理しやすいが、後半で要件の誤りが判明したときの手戻りが大きい。
プロトタイピングモデル
早い段階で試作品を作って利用者に評価してもらい、その結果をもとに要求を固めていく開発モデル。認識の食い違いを早期に発見できる。
スパイラルモデル
システムを独立性の高い部分に分け、設計・実装・評価の流れを部分ごとに繰り返して、渦を描くように全体を作り上げる開発モデル。
アジャイル開発
短い反復を繰り返し、反復ごとに動くソフトウェアを作りながら要求の変化を取り込む開発の考え方の総称。スクラム、XP、かんばんなどが含まれる。
プロダクトオーナー
スクラムの役割の一つ。何を作るかを決め、プロダクトバックログの項目と優先順位に責任を持ち、プロダクトの価値を最大化する。
スクラムマスター
スクラムの役割の一つ。スクラムが正しく実践されるようチームを支援し、進行の妨げを取り除く。作業を割り当てて指示を出す管理者ではない。
スプリント
スクラムにおける1か月以内の固定長の反復期間。この中でプランニング、デイリースクラム、レビュー、レトロスペクティブが行われる。
デイリースクラム
開発者が毎日15分程度で進捗と妨げを共有し、その日の計画を調整するイベント。問題の解決そのものは別の場で行う。
スプリントレトロスペクティブ
スプリントの最後に、成果物ではなくチームの進め方(プロセス・道具・協働)を振り返り、次のスプリントで試す改善策を決めるイベント。
プロダクトバックログ
プロダクトに必要なものを優先順位を付けて並べた一覧。プロダクトオーナーが管理し、状況に応じて常に見直される。
インクリメント
そのスプリントで完成し、これまでの成果に積み上がった動作するソフトウェア。完成の定義を満たしたものだけがインクリメントになる。
テスト駆動開発
XPのプラクティスの一つ。実装するコードより先にテストコードを書き、それが通るようにコードを書いてから整理する(リファクタリングする)手法。
リファクタリング
外部から見た振る舞いを変えずに、プログラムの内部構造を分かりやすく整理し直すこと。機能追加とは分けて行うのが原則。
共通フレーム(SLCP)
取得者と供給者が共通の用語と枠組みで話せるように、企画から開発・運用・保守・廃棄までのプロセスを定義したもの。必要な作業を選んで修正(テーラリング)して使う。
リバースエンジニアリング
既存のプログラムやオブジェクトコードを解析して、仕様や設計情報を導き出すこと。得た情報から新システムを作るのがフォワードエンジニアリング。
マッシュアップ
公開された複数のサービス(API)を組み合わせ、新しい一つのサービスを作り上げる手法。地図サービスと店舗情報を組み合わせる例が典型。
継続的インテグレーション
CI。変更したソースコードを共有リポジトリへ頻繁に反映し、その都度自動でビルドとテストを実行して、統合時の問題を早期に発見する仕組み。
構成管理
ソースコード・設計書・設定・環境などの構成要素を識別し、変更を記録して、いつでも特定時点の状態を再現できるようにする管理。版を管理するバージョン管理を含む。

例題 例題:スプリントレビューとスプリントレトロスペクティブは何が違うか。

見る対象が違う。スプリントレビューは、そのスプリントで完成したインクリメント(作ったもの)を関係者に示し、次に何を作るべきかのフィードバックを得る場である。スプリントレトロスペクティブは、チームの進め方(作り方)を振り返り、次のスプリントで試す改善策を決める場である。順序はレビューが先、レトロスペクティブが後で、どちらもスプリントの終わりに行う。

例題 例題:既存の販売管理システムのソースコードを解析して仕様書を復元し、その内容をもとに新しいシステムを設計・構築した。この一連の作業を何と呼ぶか。

全体としてはリエンジニアリング。前半のソースコードを解析して仕様や設計情報を取り出す作業がリバースエンジニアリング、後半の取り出した情報をもとに新しいシステムを作る作業がフォワードエンジニアリングである。なお解析対象のソフトウェアには著作権があるため、ライセンス条件で解析が認められているかを事前に確認する必要がある。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類4:開発技術 中分類13:ソフトウェア開発管理技術(システム開発技術)

プロジェクトとサービスの管理

プロジェクトマネジメント

プロジェクトの進め方の型と、日程・見積り・コストの計算のやり方が分かります。

プロジェクトとは、決められた期間の中で、これまでにない成果物やサービスを作り出すために行う活動のことです。特徴は二つあります。一つは有期性で、明確な始まりと終わりがあり、目的を達成すれば解散します。もう一つは独自性で、作るものが毎回どこか違います。毎日同じ手順で回し続ける定常業務(運用)とは、この二点ではっきり区別されます。プロジェクトの目的・成果物・体制・制約などを最初に文書化して正式に立ち上げるための文書をプロジェクト憲章といいます。

国際的な進め方の枠組みをまとめた規格がJIS Q 21500(プロジェクトマネジメントの手引)です。ここでは活動を、立上げ・計画・実行・管理・終結という五つの対象群(プロセス群)に分けて考えます。そして管理する側面を、統合・ステークホルダ・スコープ・資源・時間・コスト・リスク・品質・調達・コミュニケーションという十の対象群(知識エリアに相当)に整理しています。統合は全体のつじつまを合わせる要、ステークホルダは利害関係者の把握と関与、スコープは作る範囲の確定、資源は要員と設備、時間は日程、コストは予算、リスクは不確実性、品質は要求水準、調達は外部からの購入、コミュニケーションは情報の流れを扱います。

スコープを固めたら、成果物や作業を大きいものから小さいものへ階層的に分解します。これがWBS(Work Breakdown Structure:作業分解構成図)です。分解の最小単位をワークパッケージといい、ここまで細かくして初めて工数・期間・担当者を具体的に決められます。各ワークパッケージの作業内容・成果物・完了条件などを説明した文書がWBS辞書です。WBSに載っていない作業は実施しないという取り決め方をすることで、スコープが際限なく膨らむこと(スコープクリープ)を防げます。

日程の管理にはアローダイアグラム(PERT図)を使います。作業を矢印、作業の結合点を丸で表し、作業の前後関係と所要日数を書き込みます。ここから、最も早く始められる時点(最早開始日)と、全体を遅らせずに済む範囲で最も遅く始めてよい時点(最遅開始日)を計算します。この差がトータルフロート(余裕日数)で、これが0の作業をつないだ経路がクリティカルパスです。クリティカルパスの長さがプロジェクト全体の最短所要日数になり、この経路上の作業が1日遅れれば全体も1日遅れます。逆に全体を短縮したいときは、まずクリティカルパス上の作業を縮めます。ただし縮めすぎると別の経路のほうが長くなり、クリティカルパスが移るので、短縮した分だけ全体が縮むとは限りません。作業の予定と実績を横棒で並べて進捗を見るのがガントチャートで、重要な節目の日付を置いたものがマイルストーンです。

規模と工数の見積りにはいくつかの手法があります。ファンクションポイント法は、外部入力・外部出力・外部照会・内部論理ファイル・外部インタフェースファイルといった利用者から見える機能の数と複雑度に点数を付けて規模を出す手法で、使用する言語に左右されないのが利点です。LOC法は想定ソースコード行数から見積もる方法、COCOMOは規模から工数と期間を求める数式モデル、類推見積法は過去の似たプロジェクトの実績から見積もる方法、ボトムアップ見積法(積算法)はWBSの末端ごとに見積もって足し上げる方法、標準値法は作業の種類ごとに定めた標準工数を積み上げる方法です。工数はよく人月で表しますが、10人月は「1人で10か月」とも「10人で1か月」とも読めるだけで、実際には後者が成り立つとは限りません。ブルックスの法則が言うとおり、遅れているソフトウェアプロジェクトに人員を追加しても、教育や意思疎通の手間が増えるため、かえって遅れることがあります。

リスクマネジメントでは、まずリスクを洗い出して、発生確率と影響度から評価し、対応方針を決めます。対応は大きく四つです。リスクの原因となる作業自体をやめる回避、保険や外部委託で他者に移す転嫁(共有)、発生確率や影響を小さくする軽減(低減)、影響が小さいので対策せず受け入れる受容です。コストとスケジュールをまとめて管理する手法がEVM(Earned Value Management)で、PV(計画価値)・EV(出来高、達成価値)・AC(実コスト)の三つを金額に換算して比べます。SV=EV−PVが正なら進捗は先行、負なら遅れ。CV=EV−ACが正なら予算内、負なら超過。比率で見るときはSPI=EV÷PV、CPI=EV÷ACを使い、1より大きければ良好、小さければ問題ありと判断します。

主な見積手法とリスク対応の4分類
区分名称内容
見積手法ファンクションポイント法利用者から見える機能の数と複雑度に点数を付けて規模を求める。開発言語に依存しない
見積手法LOC法想定するソースコードの行数から規模と工数を見積もる。言語によって値が変わる
見積手法COCOMO規模(行数など)を入力として、工数と期間を数式モデルで算出する
見積手法類推見積法過去の似たプロジェクトの実績から推定する。情報が少ない企画段階でも使える
見積手法ボトムアップ見積法WBSの末端作業ごとに見積もって積み上げる。積算法ともいい、詳細化後は精度が高い
見積手法標準値法作業の種類ごとに定めた標準工数を、作業量に掛けて積み上げる
リスク対応回避リスクの原因となる作業や方式そのものをやめ、リスクが起こらないようにする
リスク対応転嫁(共有)保険や外部委託などによって、損失の負担を他者に移す
リスク対応軽減(低減)発生確率を下げる、または起きたときの影響を小さくする対策を打つ
リスク対応受容影響が小さい、または対策費用が見合わないため、対策せずに受け入れる
プロジェクト
決められた期間内に、これまでにない独自の成果物やサービスを作り出すために行う活動。有期性と独自性を持つ点で、繰り返し続ける定常業務と区別される。
プロジェクト憲章
プロジェクトの目的、成果物、主要な関係者、体制、制約条件などを記し、プロジェクトを正式に立ち上げることを承認する文書。プロジェクトマネージャの権限もここで示される。
WBS
作業分解構成図。成果物や作業を大きいものから小さいものへ階層的に分解した図。最小単位をワークパッケージといい、ここまで分解して工数・期間・担当を決める。
ワークパッケージ
WBSで分解した最小単位の作業。これ以上分けずに、責任者・所要工数・完了条件を決められる大きさにする。内容を説明した文書がWBS辞書。
アローダイアグラム
作業を矢印、結合点を丸で表し、作業の前後関係と所要日数を示した図。PERT図ともいう。最早開始日・最遅開始日を計算してクリティカルパスを求める。
クリティカルパス
アローダイアグラムの中で所要日数の合計が最も長くなる経路。その長さが全体の最短所要日数になり、経路上の作業には余裕がまったくない。
トータルフロート
その作業の最遅開始日と最早開始日の差。全体の完了を遅らせずに、その作業を何日遅らせてよいかを表す余裕日数。クリティカルパス上の作業では0になる。
ガントチャート
作業名を縦に、日付を横に取り、各作業の予定期間と実績を横棒で表した図。誰が何をいつまでにやるかと進み具合が一目で分かるが、作業間の前後関係は表しにくい。
ファンクションポイント法
外部入力・外部出力・外部照会・内部論理ファイル・外部インタフェースファイルという利用者から見える機能の数と複雑度に点数を付けて規模を見積もる手法。開発言語に左右されない。
類推見積法
過去に実施した似たプロジェクトの実績値をもとに、規模や工数を推定する手法。企画段階など情報が少ない時期でも使えるが、精度は過去実績の類似度に依存する。
ボトムアップ見積法
WBSの末端の作業ごとに工数を見積もり、それを積み上げて全体を求める手法。積算法ともいう。作業が具体化した後ほど精度が高いが、見積り自体に手間がかかる。
ブルックスの法則
遅れているソフトウェアプロジェクトに人員を追加すると、教育や意思疎通の負担が増えるため、かえって完了がさらに遅れるという経験則。
EVM
アーンドバリューマネジメント。PV(計画価値)・EV(出来高)・AC(実コスト)を金額に換算して比較し、進捗の遅れとコスト超過を同じ物差しで管理する手法。
SPIとCPI
SPI(スケジュール効率指数)=EV÷PV、CPI(コスト効率指数)=EV÷AC。どちらも1を超えれば良好、1を下回れば遅れ・コスト超過を意味する。

例題 作業A(4日)は開始直後に着手でき、作業B(2日)と作業C(5日)はAの完了後、作業D(3日)はBとCの両方の完了後に着手できる。全体の最短所要日数とクリティカルパスは。

経路はA→B→D=4+2+3=9日と、A→C→D=4+5+3=12日の二つ。長いほうが全体を決めるので最短所要日数は12日、クリティカルパスはA→C→D。作業Bの最早開始日は4日後、最遅開始日は7日後なので、Bのトータルフロートは3日ある。

例題 PVが600万円、EVが540万円、ACが500万円のとき、SV・CV・SPI・CPIはいくつか。

SV=EV−PV=540−600=−60万円で進捗は遅れ。CV=EV−AC=540−500=+40万円でコストは予算内。SPI=540÷600=0.9で1未満、CPI=540÷500=1.08で1超。つまり「遅れているが安く進んでいる」状態。SVとCVで引く相手を取り違えないことが要点。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類5:プロジェクトマネジメント 中分類14:プロジェクトマネジメント/JIS Q 21500(プロジェクトマネジメントの手引)

サービスマネジメント

作ったシステムを安定して使い続けるための約束事と運用のしくみが分かります。

ITサービスマネジメントとは、利用者にとっての価値を継続的に届けるために、ITサービスの提供を計画・実行・監視・改善するしくみのことです。開発が「作って終わり」なのに対し、サービスマネジメントは「使い続けられる状態を保つ」ことを目的にします。実務でよく参照される事実上の標準がITILで、サービス提供と支援の進め方を体系化したベストプラクティス集です。国際規格としてはISO/IEC 20000(国内ではJIS Q 20000)があります。

提供者と利用者の間で、サービスの品質をあらかじめ数値で約束した合意文書がSLA(Service Level Agreement:サービスレベル合意書)です。サービス時間帯、稼働率、障害からの復旧時間、応答時間、問合せへの一次回答時間などのサービスレベル項目ごとに目標値を決め、達成できなかった場合の対応も定めます。SLAを決めて終わりにせず、実績を測定して報告し、見直して改善していく一連の活動をSLM(サービスレベル管理)といいます。目標値は高いほどよいとは限らず、水準を上げれば費用も上がるため、必要な水準と費用の釣り合いで決めます。

利用者からの問合せや障害連絡を受け付ける単一の窓口がサービスデスクです。ここで解決できないものは、より専門的な担当へ引き継ぎます。この引継ぎをエスカレーションといい、技術力の高い担当に引き渡す機能的エスカレーションと、権限を持つ上位者に判断を仰ぐ階層的エスカレーションがあります。日々の管理活動は役割が分かれています。インシデント管理はサービスの中断や品質低下(インシデント)に対し、原因が分からなくても回避策を含めてとにかく早くサービスを復旧させることが目的です。問題管理はインシデントの根本原因を突き止め、再発を防ぐことが目的です。変更管理は変更の影響を評価して承認・却下を判断し、リリース管理は承認された変更を本番環境へ確実に移します。構成管理はハードウェア・ソフトウェア・文書などの構成品目とその関係をCMDB(構成管理データベース)で正確に把握します。可用性管理は使いたいときに使える状態を、容量・キャパシティ管理は将来の需要に見合った処理能力と資源を確保します。

災害や大規模障害に備えるのがサービス継続管理です。ここで重要な二つの目標値がRTOとRPOです。RTO(Recovery Time Objective:目標復旧時間)は、障害発生からサービスを復旧させるまでにかけてよい時間の目標です。RPO(Recovery Point Objective:目標復旧時点)は、どの時点のデータまで戻せればよいかという目標で、言い換えれば失ってもよいデータの最大時間幅です。RTOを短くするには待機系や切替のしくみに投資が必要で、RPOを短くするにはバックアップの間隔を詰めるか常時複製する必要があり、それぞれ費用の掛かる場所が違います。

日々の運用管理では、一連の処理をあらかじめ定義した手順に従って自動実行させるジョブ管理、障害に備えて定期的に複製を取るバックアップがあります。バックアップは、毎回すべてを取るフルバックアップ、前回のバックアップ以降の変更分だけを取る差分バックアップや増分バックアップを組み合わせ、取得時間と復旧手順の手間の釣り合いで方式を決めます。新しいシステムへの移行方式には、決めた日にいっせいに切り替える一斉移行(ビッグバン移行)、業務や拠点ごとに少しずつ切り替える段階移行、新旧を一定期間同時に動かして結果を突き合わせる並行運用があります。一斉移行は費用と期間が小さい代わりに失敗したときの影響が大きく、並行運用は安全ですが二重に運用する費用と手間がかかります。

設備面を管理するのがファシリティマネジメントです。停電に備えて短時間の電力を供給し安全に停止させるためのUPS(無停電電源装置)、長時間の停電に備える自家発電装置、地震の揺れを建物に伝えにくくする免震構造や機器の固定(耐震)、入退室管理やサーバラックの施錠といった物理的セキュリティ、消火設備などが対象です。あわせて、消費電力の削減や機器の適切な廃棄など、環境に配慮してIT機器を使う取組みをグリーンITといいます。

SLAの主な項目、インシデント管理と問題管理の違い、RTOとRPO
区分項目内容
SLAの項目サービス提供時間帯サービスを利用できる曜日と時間帯(例:平日8時〜20時)
SLAの項目稼働率提供時間帯のうち実際に使えた時間の割合の目標値(例:月間99.5%以上)
SLAの項目障害復旧時間障害発生からサービスを復旧させるまでの目標時間(例:4時間以内)
SLAの項目オンライン応答時間画面操作に対する応答時間の目標値(例:3秒以内)
SLAの項目問合せ一次回答時間サービスデスクへの問合せに最初の回答を返すまでの目標時間
管理活動の違いインシデント管理目的は復旧の早さ。原因が分からなくても回避策で構わないので早くサービスを戻す
管理活動の違い問題管理目的は再発防止。根本原因を調べて恒久対策を打つ。急ぐより正確さを優先する
継続管理の目標値RTO(目標復旧時間)いつまでに復旧させるか。時間軸は「障害発生から復旧まで」。短縮には待機系への投資
継続管理の目標値RPO(目標復旧時点)どの時点のデータまで戻すか。失ってよいデータ量の目標。短縮にはバックアップ間隔短縮
SLA
サービスレベル合意書。提供者と利用者の間で、稼働率や復旧時間などのサービスレベル項目ごとに目標値と測定方法、未達時の対応をあらかじめ取り決めた文書。
SLM
サービスレベル管理。SLAで定めた項目の実績を測定・報告し、レビューして改善につなげる一連の活動。PDCAを回してサービス品質を維持・向上させる。
サービスデスク
利用者からの問合せや障害連絡を受け付ける単一の窓口。記録・一次対応を行い、必要に応じて専門部門へ引き継ぐ。利用者満足度に直結する接点になる。
インシデント管理
サービスの中断や品質低下に対し、原因が特定できていなくても回避策を含めてできるだけ早くサービスを復旧させることを目的とする活動。
問題管理
インシデントの根本原因を調査・特定し、恒久的な対策を打って再発を防ぐことを目的とする活動。復旧を急ぐインシデント管理とは目的が異なる。
変更管理
サービスへの変更要求について、影響とリスク、費用を評価したうえで承認・却下を判断し、記録する活動。承認された変更を本番へ反映するのはリリース管理。
構成管理
ハードウェア、ソフトウェア、文書などの構成品目とその相互関係を識別し、CMDB(構成管理データベース)で最新かつ正確な状態に保つ活動。
エスカレーション
サービスデスクで解決できない案件を引き継ぐこと。専門技術を持つ担当へ渡す機能的エスカレーションと、権限のある上位者へ上げる階層的エスカレーションがある。
RTO
目標復旧時間。障害や災害の発生からサービスを復旧させるまでに許容する時間の目標値。短くするには待機系や自動切替などの投資が必要になる。
RPO
目標復旧時点。復旧時にどの時点のデータまで戻せればよいかを示す目標値で、失ってもよいデータの最大時間幅を表す。短くするにはバックアップ間隔を詰める。
システム移行方式
一斉移行(決めた日に全面切替)、段階移行(業務や拠点ごとに順次切替)、並行運用(新旧を一定期間同時稼働させ結果を照合)の三つが基本形。
UPS
無停電電源装置。停電が起きたとき内蔵電池から短時間だけ電力を供給し、その間にデータを保存して安全にシステムを停止させる、または自家発電に切り替える。
グリーンIT
IT機器の消費電力削減、仮想化による機器台数の削減、適切な廃棄やリサイクルなど、環境負荷を抑えながらITを利用・提供する取組みの総称。

例題 毎日0時にだけバックアップを取っているシステムで、10時に障害が起き、14時に復旧した。このときのRPOとRTOの考え方は。

実際に戻せたデータは当日0時時点のものなので、失われたのは0時から10時までの10時間分。RPOはこの「失ってよいデータの時間幅」に対する目標値であり、10時間より短くしたければバックアップの間隔を詰めるしかない。一方、10時の障害発生から14時の復旧まで4時間かかったので、RTOはこの復旧までの時間に対する目標値。RTOを縮めたければ待機系や自動切替に投資する。目的も対策も別物である。

例題 月間(30日=720時間)の稼働率目標が99.9%のとき、許容される停止時間は何時間か。

720×(1−0.999)=720×0.001=0.72時間、およそ43分。目標値を99.5%に緩めると720×0.005=3.6時間まで許容される。わずか0.4ポイントの差で許容停止時間が5倍になるため、SLAの稼働率は0.1ポイント単位で費用が大きく変わる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類6:サービスマネジメント 中分類15:サービスマネジメント/JIS Q 20000(ISO/IEC 20000)

システム監査と内部統制

情報システムを第三者の目で点検するやり方と、組織を統制するしくみが分かります。

システム監査とは、情報システムやその管理体制が、信頼性・安全性・効率性の観点から適切に整備・運用されているかを、独立した立場の監査人が点検・評価し、改善のための助言や勧告を行うことです。目的は不正を見つけて誰かを罰することではなく、組織の情報システムに関わるリスクを適切に管理させ、経営に役立つ状態にすることにあります。参考にされる基準として、経済産業省が公表しているシステム監査基準とシステム管理基準があります。

監査は決まった手順で進みます。まず監査計画を立て、対象・目的・範囲・時期・体制を決めます。次に予備調査で、資料の閲覧や関係者への聞き取りによって対象業務の全体像とリスクの当たりを付けます。続いて本調査で、実際に証拠を集めて事実を確かめます。集めた事実をもとに評価・結論をまとめ、監査報告書として監査依頼者(多くは経営者)に報告します。報告して終わりではなく、指摘した事項について改善が実際に行われているかを確かめるフォローアップまでが監査です。フォローアップで監査人が行うのは改善状況の確認と助言であって、監査人自身が改善作業をしてしまうと独立性を失います。

監査人には独立性と客観性が求められます。外観上の独立性とは、監査対象の部門から組織上分離していて、その業務に対する責任や利害を持たないことです。精神上の独立性とは、偏りのない公正な態度で判断することです。したがって、自分が開発や運用に関わったシステムを自分で監査することはできません。監査人が意見の裏付けとして集めた資料が監査証拠で、監査手続の実施内容と結論の根拠を記録した文書が監査調書です。また、取引や処理が発生から最終結果まで、記録によってさかのぼって追跡できる状態や、そのための記録の連なりを監査証跡といいます。監査証跡が残るように設計されていること、つまり監査しやすいシステムであることを可監査性といいます。

本調査では目的に応じて技法を使い分けます。チェックリスト法は、あらかじめ用意した質問項目に沿って回答を得る方法。ドキュメントレビュー法は、規程・設計書・運用記録などの文書を閲覧して整合性を確かめる方法。インタビュー法は関係者に直接聞き取る方法です。ウォークスルー法は、データの発生から入力・処理・出力・保管に至るまでの流れを、実際の書類や画面をたどって追跡し、統制が意図どおり働いているかを確認する方法です。突合法(照合法)は、記録どうしや記録と現物を突き合わせて一致を確かめる方法。テストデータ法は、監査人が用意した検証用データを実際のプログラムに処理させ、出てきた結果が正しいかを確かめる方法です。監査モジュール法は、監査用の処理を組み込んだプログラムを本番で動かし、条件に当てはまる取引を継続的に抽出・記録させる方法。ITF法(組込み監査法)は、本番のファイルの中に監査用のダミーの口座や部門をあらかじめ設けておき、そこへ監査用データを実際の処理と一緒に流して結果を確かめる方法です。

監査の結果は監査報告書にまとめます。監査報告書には、実施した監査の概要、確認された事実に基づく監査人の意見、指摘事項と改善のための勧告を書きます。監査人には改善を命じる権限はなく、勧告するところまでが役割です。実際に改善するかどうかを決めて実行するのは、監査を受けた部門とその責任者です。

内部統制とは、業務の有効性と効率性、財務報告の信頼性、法令等の遵守、資産の保全という目的を達成するために、組織の中に組み込んで全員で運用するしくみのことです。基本的要素は六つあり、組織の気風を決める統制環境、目的達成を阻む要因を識別・分析するリスクの評価と対応、方針や手続を定める統制活動、必要な情報が関係者に正しく伝わる情報と伝達、統制が有効に機能しているか継続的に評価するモニタリング、そしてITへの対応(IT統制)です。統制活動の代表例が職務分掌で、承認する人と実行する人、記録する人を別々にして、一人だけでは不正を実行して隠しきれないようにします。IT統制はさらに、システム全体の基盤に関わるIT全般統制と、個々の業務処理の中に組み込むIT業務処理統制に分けられます。組織全体としてITの活用方針を定め、その実行を監督する経営者側のしくみをITガバナンスといいます。

システム監査の手順と主な監査技法
区分名称内容
手順1監査計画の策定監査の目的・対象・範囲・時期・体制を定め、監査計画書にまとめる
手順2予備調査資料閲覧や聞き取りで対象業務の全体像とリスクを把握し、本調査の重点を絞る
手順3本調査各種の監査技法を用いて監査証拠を収集し、事実を確かめて監査調書に記録する
手順4評価・結論収集した監査証拠に基づいて事実を評価し、監査人としての意見をまとめる
手順5監査報告監査報告書を作成し、指摘事項と改善勧告を監査依頼者(経営者)へ報告する
手順6フォローアップ改善が実施されているかを確認し、必要な助言を行う。監査人自身は改善作業をしない
技法チェックリスト法あらかじめ用意した質問項目に沿って回答を得て、整備状況を確かめる
技法ドキュメントレビュー法規程・設計書・運用記録などの文書を閲覧し、内容と整合性を確かめる
技法インタビュー法監査対象の関係者に直接聞き取りを行って、事実や運用の実態を確かめる
技法ウォークスルー法データの発生から入力・処理・出力・保管までの流れを実際にたどって追跡する
技法突合法(照合法)記録どうし、または記録と現物を突き合わせて一致を確かめる
技法テストデータ法監査人が用意した検証用データを実際のプログラムに処理させ、結果の正しさを確かめる
技法監査モジュール法監査用処理を組み込んだプログラムを本番稼働させ、条件に合う取引を継続的に抽出・記録する
技法ITF法(組込み監査法)本番ファイル内に監査用のダミー口座や部門を設け、監査用データを実取引と一緒に処理させる
システム監査
情報システムとその管理体制が信頼性・安全性・効率性の観点から適切かを、独立した監査人が点検・評価し、改善に向けた助言や勧告を行うこと。
監査人の独立性
監査対象の部門から組織上分離し利害を持たない外観上の独立性と、偏りなく公正に判断する精神上の独立性。自分が関与したシステムは監査できない。
監査証拠
監査人が監査意見を裏付けるために収集した資料や記録。十分かつ適切な監査証拠がなければ、監査報告書に意見を記載することはできない。
監査証跡
取引や処理を発生から最終結果まで記録によってさかのぼって追跡できる状態、またはそのための一連の記録。これが残る設計であることを可監査性という。
監査調書
実施した監査手続の内容、収集した監査証拠、そこから導いた結論を記録した文書。監査意見の根拠となり、一定期間保管される。
ウォークスルー法
データの発生から入力・処理・出力・保管に至る流れを、実際の書類や画面をたどって追跡し、統制が意図どおり機能しているかを確認する監査技法。
テストデータ法
監査人が用意した検証用データを実際のプログラムに処理させ、出力結果が期待どおりかを確かめる監査技法。プログラムが正しく処理するかを直接確かめられる。
監査モジュール法
監査用の処理を組み込んだプログラムを本番稼働させ、あらかじめ決めた条件に当てはまる取引を継続的に抽出・記録させて調べる監査技法。
ITF法
組込み監査法。本番のファイルの中に監査用のダミーの口座や部門を設けておき、監査用データを実際の取引と一緒に処理させて結果を確認する監査技法。
突合法
照合法ともいう。関連する複数の記録どうし、または記録と現物を突き合わせて、一致しているかを確かめる監査技法。
内部統制
業務の有効性と効率性、財務報告の信頼性、法令等の遵守、資産の保全を達成するために組織に組み込まれ、全員によって運用されるしくみ。
職務分掌
承認・実行・記録といった役割を別々の担当者に分ける統制活動。一人で不正を実行し、かつ隠すことができないようにして、誤りや不正を防ぐ。
ITガバナンス
組織のITの活用方針を経営者が定め、その計画・実行・評価を監督して、ITが経営目標の達成に貢献する状態を維持するためのしくみ。

例題 情報システム部門の課長が、自部門が開発・運用している販売管理システムのシステム監査を担当することになった。何が問題か。

外観上の独立性を欠いている。監査人は監査対象の部門から組織上分離し、その業務に対する責任や利害を持たない立場でなければならない。自分たちが作って動かしているものを自分で評価すれば、指摘しにくい事項が出て評価が甘くなるおそれがある。監査を担当するのは、内部監査部門など対象部門から独立した組織か、外部の監査人である。

例題 テストデータ法・監査モジュール法・ITF法は、どこが違うのか。

テストデータ法は、監査人が作った検証用データを対象プログラムに処理させ、出力が期待どおりかを確かめる。プログラムの処理そのものが正しいかを直接調べる方法である。監査モジュール法は、監査用の処理を組み込んだプログラムを本番で動かし、決めた条件に当てはまる取引を継続的に抽出・記録させる。ITF法は本番ファイルの中に監査用のダミー口座や部門を用意し、そこへ監査用データを実際の取引と一緒に流して結果を確かめる。「検証用データを流す」がテストデータ法、「継続的に抽出させる」が監査モジュール法、「本番ファイルにダミーを仕込む」がITF法、と対応で覚える。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類6:サービスマネジメント 中分類16:システム監査/システム監査基準・システム管理基準(経済産業省)

システム戦略と企画

情報システム戦略とDX

経営戦略から情報システムのあるべき姿を描く手順と、EA・クラウド・DXの用語の使い分けが分かります。

情報システム戦略とは、経営戦略を実現するために、組織全体の情報システムがどうあるべきかと、そこへ至る道筋を中長期の計画としてまとめたものです。部門ごとに欲しいものを作る個別最適ではなく、組織全体で重複や無駄をなくす全体最適を目指す点が特徴で、全体最適化方針・全体最適化計画といった文書に落とし込みます。この責任を負う経営層がCIO(最高情報責任者)です。情報システム戦略は経営戦略の下に位置づけられるものであり、逆に情報システムの都合で経営戦略を決めるものではありません。

全体最適を figure のように体系立てて整理する手法がEA(エンタープライズアーキテクチャ)です。EAは組織を四つの体系(アーキテクチャ)に分けて記述します。業務の目標や手順を表すビジネスアーキテクチャ、業務が扱うデータの内容と関連を表すデータアーキテクチャ、業務を支えるシステムの機能構成を表すアプリケーションアーキテクチャ、それらを動かす技術基盤を表すテクノロジアーキテクチャの四つです。進め方は、まず現状の姿であるAs-Isモデルを描き、次にあるべき姿であるTo-Beモデルを描き、その差(ギャップ)を分析して、埋めるための移行計画を作るという順になります。いきなり理想像だけを描いても、現状との差が見えなければ計画は立てられません。

業務プロセスを目に見える形にする表記法もいくつか押さえます。DFD(データフロー図)は、データの流れを矢印、処理をまるや角丸、データの蓄積場所(データストア)を二重線、外部との出入口(源泉と吸収)を四角で表し、データがどこからどこへ流れて何に加工されるかを示します。E-R図は実体(エンティティ)と実体間の関連(リレーションシップ)でデータの構造を表します。UMLはクラス図・ユースケース図・アクティビティ図などをまとめたモデリング言語で、BPMNは業務の流れそのものを記号で書き表すための表記法です。業務そのものを見直す取組みでは、既存のやり方を白紙に戻して抜本的に設計し直すのがBPR、業務プロセスをPDCAで回して継続的に改善し続けるのがBPM、業務プロセスの一部を企画から運用まで一括して外部の専門業者に任せるのがBPOです。

実現手段を提供する側の商売がソリューションビジネスです。クラウドサービスは、利用者がどこまで自分で管理するかで三つに分かれます。IaaSはハードウェアと仮想化基盤だけを借り、OS・ミドルウェア・アプリケーション・データを利用者が管理します。PaaSはOSとミドルウェアまでを事業者が用意し、利用者は自分が作ったアプリケーションとそのデータを管理します。SaaSは完成したアプリケーションを使う形で、利用者が管理するのは設定と自分のデータだけです。自社の設備で全部持つのがオンプレミスです。設備を貸す形態には、利用者の機器を事業者の施設に置かせてもらうハウジングと、事業者の機器を借りるホスティングがあります。ソフトウェアを機能単位の部品にして組み合わせる考え方がSOAで、これをさらに小さく独立させ、サービスごとに開発・配置・拡張できるようにした構成がマイクロサービスアーキテクチャです。

作っただけでは戦略は実を結びません。利用実態を調べて、使われていない機能や重複したシステムを見つけ、次の投資の判断に生かすのが情報システムの評価です。利用者側の力を高める取組みも欠かせず、情報を選び活用する能力を情報リテラシー、コンピュータを使いこなす能力をコンピュータリテラシーといいます。情報通信技術を使える人と使えない人の間に生じる待遇や機会の格差はデジタルディバイド(情報格差)と呼ばれ、高齢者や地域による差をどう埋めるかが課題になります。大量のデータを統計や機械学習の知識で分析し、経営の判断材料に変える専門人材がデータサイエンティストです。

近年の中心テーマがDX(デジタルトランスフォーメーション)です。デジタル化は三つの段階で説明されます。紙の書類をPDFにするなど、個別の作業のアナログ情報をデジタルに置き換えるのがデジタイゼーション。申請から承認までの流れごとデジタル前提に作り替えるなど、業務プロセス全体を変えるのがデジタライゼーション。そしてデータとデジタル技術で製品・サービス・ビジネスモデルそのものと、組織や企業文化まで変革し、競争上の優位を確立するのがDXです。DXの取組み状況を経営者が自己診断するための指標としてDX推進指標が公表されています。DXを阻む要因としてよく挙げられるのがレガシーシステムで、長年の改修で複雑化・ブラックボックス化し、仕様が分かる技術者もいなくなり、維持に費用と人手が取られて新しい投資に回せないという問題を抱えます。

EAの4体系/クラウドの責任分界/DXの3段階
区分項目内容・要点
EAの4体系ビジネスアーキテクチャ組織の目標・業務内容・手順・組織構造を体系化する。業務説明書や業務フロー、DFDで表す
EAの4体系データアーキテクチャ業務が扱うデータの内容とデータ間の関連を体系化する。E-R図やデータ定義表で表す
EAの4体系アプリケーションアーキテクチャ業務を支える情報システムの機能構成とシステム間の連携を体系化する。情報システム関連図で表す
EAの4体系テクノロジアーキテクチャハードウェア・ネットワーク・ミドルウェアなどの技術基盤を体系化する。ネットワーク構成図で表す
EAの進め方As-Is → To-Be現状(As-Is)とあるべき姿(To-Be)を描き、その差をギャップ分析して移行計画を作る
責任分界オンプレミスハードウェア・OS・ミドルウェア・アプリケーション・データの全てを利用者が保有し管理する
責任分界IaaS利用者が管理=OS・ミドルウェア・アプリケーション・データ/事業者=ハードウェアと仮想化基盤
責任分界PaaS利用者が管理=自作アプリケーションとデータ/事業者=ハードウェア・OS・ミドルウェア
責任分界SaaS利用者が管理=利用設定と自分のデータ/事業者=アプリケーションを含むそれ以外すべて
DXの3段階デジタイゼーション個別の作業や情報をアナログからデジタルに置き換える(例:紙の書類をPDF化する)
DXの3段階デジタライゼーション業務プロセス全体をデジタル前提で作り替え、価値の提供方法を変える(例:申請から承認まで一貫して電子化する)
DXの3段階DXデータとデジタル技術で製品・サービス・ビジネスモデルと組織・文化まで変革し、競争上の優位を確立する
情報システム戦略
経営戦略を実現するために、組織全体の情報システムのあるべき姿と実現までの道筋を中長期でまとめた計画。部門単位の個別最適ではなく全体最適を目指し、CIOが責任を負う。
CIO
最高情報責任者。最高情報責任者の略。経営戦略と情報システム戦略を結び付け、情報化投資の方針決定と全体最適化、情報システム部門の統括に責任を持つ経営層の役職のこと。
EA
エンタープライズアーキテクチャ。組織の業務とシステムを、ビジネス・データ・アプリケーション・テクノロジの四つの体系で整理し、全体最適化を進める手法。
As-Isモデル
EAで最初に描く現状の姿のモデル。現在の業務の手順やシステムの構成をありのままに記述し、あるべき姿との差を測るための基準として用いる。
To-Beモデル
EAで描く、将来こうありたいという姿のモデル。現状のAs-Isとの差をギャップ分析で明らかにし、その差を埋めるための移行計画を作る土台として用いる。
DFD
データフロー図。データの流れ、処理、データストア、源泉と吸収の記号で、データがどこから来て何に加工されどこへ蓄えられるかを表す図。
BPMN
業務プロセスを図で表すための国際的な表記法。開始・終了、作業、分岐、担当者の区分などを決まった記号で書き、関係者間で業務の流れの認識をそろえる。
BPR
ビジネスプロセスリエンジニアリング。既存の手順を前提にせず、業務プロセスを白紙から抜本的に設計し直して大幅な改善を狙う取組み。
BPM
ビジネスプロセスマネジメント。業務プロセスをPDCAサイクルで回し、継続的に改善し続ける管理手法。一度きりの改革であるBPRと対比される。
BPO
ビジネスプロセスアウトソーシング。自社の業務プロセスの一部を、その企画・設計から運用まで一括して外部の専門業者に委託すること。
IaaS
ハードウェアと仮想化基盤だけを提供するクラウドサービス。利用者はOS・ミドルウェア・アプリケーション・データを自分で選び管理できるため自由度が高い。
PaaS
OSとミドルウェアまでを事業者が用意し、利用者は自作のアプリケーションとデータを載せて管理するクラウドサービス。開発環境や実行基盤を借りる形態。
SaaS
完成したアプリケーションをネットワーク経由で提供するクラウドサービス。利用者が管理するのは利用設定と自分のデータだけで、ソフトの導入や更新は事業者が行う。
ハウジング
利用者が所有するサーバなどの機器を事業者の施設に設置し、電源・空調・回線・耐震設備などを提供するサービス。機器そのものは利用者の資産である。
ホスティング
事業者が所有するサーバやその一部を利用者に貸し出すサービス。機器は事業者の資産で、利用者は借りた範囲を使う。レンタルサーバもこれに当たる。
SOA
サービス指向アーキテクチャ。業務上の機能をサービスという部品として独立させ、それらを組み合わせてシステムを構築する考え方。
マイクロサービス
システムを小さく独立したサービスの集まりとして構成し、サービスごとに個別の開発・配置・拡張ができるようにしたアーキテクチャ。
デジタルディバイド
情報通信技術を使える人と使えない人の間に生じる、得られる情報や機会、待遇の格差。年齢・地域・所得などが要因となる情報格差のこと。
データサイエンティスト
統計や機械学習の知識と対象業務の理解を併せ持ち、大量のデータを収集・分析して、経営や業務の判断材料となる知見を導き出し、関係者に説明する専門人材。
デジタイゼーション
紙の書類をPDFにするなど、個別の作業や情報をアナログからデジタルに置き換える段階。DXに至る三段階のうち最初の段階に当たる。
デジタライゼーション
個別の置き換えにとどまらず、業務プロセス全体をデジタル前提で作り替え、新しい価値の提供方法に変える段階。DXの三段階の二番目。
レガシーシステム
長年の改修で複雑化・ブラックボックス化し、仕様を把握する技術者も減った旧来のシステム。維持に費用と人手を取られ、DXを妨げる要因とされる。

例題 社内の稟議書を紙からPDFに置き換えて共有フォルダに保存するようにした。これはDXの3段階のどれか。

デジタイゼーション。書類という個別の情報をアナログからデジタルに置き換えただけで、承認の流れそのものは紙のときと変わっていない。流れごとワークフローシステムに載せ替えればデジタライゼーション、それを土台に新しい事業の形まで変えればDXになる。

例題 OSのバージョンを自社の都合で選び、ミドルウェアも自分で入れたい。ただしサーバ機器は持ちたくない。どのクラウドサービスを選ぶか。

IaaS。IaaSは事業者がハードウェアと仮想化基盤だけを提供し、OSから上は利用者が管理するので条件に合う。PaaSはOSとミドルウェアが事業者側の管理なので選べず、SaaSはアプリケーションまで決まっているのでさらに選べない。

例題 EAで、現状のシステム構成図だけを作って終わりにしてはいけないのはなぜか。

現状(As-Is)はあくまで出発点で、あるべき姿(To-Be)と比べて初めて何が足りないかというギャップが分かるから。ギャップが分からなければ、どこにいくら投資して何年で移行するかという移行計画が立てられない。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類7:システム戦略 中分類17:システム戦略

システム企画と調達・契約

システム化構想から要件定義、RFI・RFPによる調達、請負と準委任と派遣の違いまでを順を追って押さえます。

情報システムを作ると決めてから発注するまでには、決まった順番があります。まず経営上の課題からシステムで何を解決するかという方向性を定めるのがシステム化構想の立案です。ここでは対象業務の範囲、期待する効果、実現までのおおまかな方針を決めます。次にシステム化計画の立案で、対象業務の内容を具体化し、開発スケジュール、体制、概算費用、費用対効果、リスクなどを詰めて、投資として実行してよいかを判断できる形にします。構想が「何のために、どの方向へ」を決める段階、計画が「いつ、いくらで、どうやって」を詰める段階だと考えると順番を取り違えません。その後に要件定義があり、それを持って調達に進みます。

要件定義は、作るものに求めることを漏れなく文書にする作業です。要件は三つの層で整理します。業務要件は、新しい業務をどう回すかという業務側の要求です。機能要件は、システムが何をするかを表すもので、画面や帳票、処理の内容、扱うデータ項目などが該当します。非機能要件は、機能以外に求める品質や条件で、応答時間や同時利用者数といった性能、稼働率や障害時の復旧時間といった可用性、運用・保守のしやすさ、移行のしやすさ、セキュリティ、設置環境などが該当します。IPAが公開する非機能要求グレードでは、可用性・性能拡張性・運用保守性・移行性・セキュリティ・システム環境/エコロジーの六つの大項目に整理されています。ここで重要なのは、要件定義の主体は発注側(利用者側)だという点です。何が必要かを決められるのは業務を行っている側であり、ベンダに丸投げすると、できあがってから「頼んだものと違う」という食い違いが起きます。

要求を引き出す技法もいくつかあります。ヒアリングは利用者に直接聞き取る基本の方法、ユースケースは利用者(アクター)とシステムのやり取りを場面ごとに書き出す方法、ペルソナは典型的な利用者像を具体的な一人の人物として作り込み、その人ならどう使うかを考える方法です。実際に動く試作品を早めに見せて反応をもらうプロトタイピングも、言葉では出てこない要求を引き出すのに有効です。

調達は figure の流れで進みます。最初にRFI(情報提供依頼書)を出します。これは、どんな実現手段があるのか、技術動向はどうかといった情報の提供をベンダに求める文書で、提案を求める段階ではありません。次に、集めた情報を踏まえてRFP(提案依頼書)を出します。RFPには、調達の目的、必要な機能要件と非機能要件、前提条件、納期、契約条件、そして提案をどう評価するかという選定基準を書きます。ベンダはこれに答える形で提案書と見積書を出し、発注側はあらかじめ定めた基準で評価してベンダを選定し、契約を結びます。RFIとRFPは順序が固定で、情報を集めるRFIが先、提案を求めるRFPが後です。自社で作るか外部に出すかを決めることを内外作の決定といい、コスト・技術力・納期・自社に残すべきノウハウなどから判断します。調達では、環境負荷の小さい製品やサービスを優先して選ぶグリーン調達や、人権や法令順守など社会的責任の観点を加えるCSR調達も求められます。

外部に頼むときの契約形態は三つを区別します。請負契約は、仕事の完成を約束する契約です。受注者は完成責任を負い、引き渡したものが契約の内容に適合しなければ契約不適合責任(旧来の瑕疵担保責任に当たるもの)を負います。作業者への指揮命令は受注者が行い、発注者が直接指示を出すことはできません。準委任契約は、一定の業務を行うことを約束する契約で、仕事の完成までは約束しません。受注者は善良な管理者の注意をもって業務を遂行する義務(善管注意義務)を負います。指揮命令はやはり受注者が行います。労働者派遣契約は、派遣元と雇用関係にある労働者を派遣先で働かせる契約で、大きな違いは指揮命令権が派遣先(発注側)にあることです。完成責任はありません。請負や準委任の形で契約しておきながら発注側が作業者に直接指示を出す状態は偽装請負と呼ばれ、法令違反となります。

開発の作業内容を関係者間で共通に理解するための取決めが共通フレーム(SLCP)です。企画から要件定義、開発、運用、保守、廃棄までのソフトウェアライフサイクル全体について、どんな作業(プロセス・アクティビティ・タスク)があるかを整理した「共通の物差し」で、取得者(発注側)と供給者(受注側)が同じ言葉で話せるようにすることを目的とします。作業の名前と範囲をそろえるためのものであって、開発方法論や標準的な開発手順を強制するものではない点に注意してください。また、組織が保有するソフトウェアのライセンス数や導入状況を把握し、過不足なく適正に使うよう管理する活動をソフトウェア資産管理(SAM)といい、ライセンス違反の防止と無駄な購入の削減の両方に効きます。

調達の流れ(RFI→RFP→…)と契約形態の比較
区分項目内容・要点
調達の流れ①RFI(情報提供依頼書)発注側が、実現手段の候補・技術動向・費用感などの情報提供をベンダに依頼する。提案を求める段階ではない
調達の流れ②RFP(提案依頼書)発注側が、目的・機能要件・非機能要件・前提条件・納期・契約条件・選定基準を示し、提案書の提出を依頼する
調達の流れ③提案書・見積書ベンダが実現方式・体制・スケジュール・価格を示して提出する
調達の流れ④ベンダ選定RFPで示した評価基準に沿って提案内容と価格を評価し、発注先を決める
調達の流れ⑤契約締結業務範囲・成果物・責任分担・検収条件・支払条件を定めて契約する
契約形態請負契約完成責任=あり/指揮命令権=受注者/成果物が契約内容に適合しなければ契約不適合責任を負う
契約形態準委任契約完成責任=なし(善管注意義務を負う)/指揮命令権=受注者/業務の遂行そのものが目的
契約形態労働者派遣契約完成責任=なし/指揮命令権=派遣先(発注側)/雇用関係は派遣元と労働者の間にある
注意偽装請負請負・準委任の契約なのに発注側が作業者へ直接指揮命令している状態。実態が派遣に当たり法令違反
システム化構想の立案
経営上の課題を踏まえ、システムで何を解決するか、対象業務の範囲と期待効果、おおまかな実現方針を定める段階。システム化計画より前に行う。
システム化計画の立案
システム化構想を受けて、開発スケジュール・体制・概算費用・費用対効果・リスクなどを具体化し、投資判断ができる形にまとめる段階。
業務要件
新しい業務をどのような手順と役割分担で回すかという、業務側から見た要求のこと。これを土台にして、システムに求める機能要件と非機能要件を導き出す。
機能要件
システムが何をするかを表す要件のこと。画面や帳票の内容、処理の手順、扱うデータ項目、他システムとの連携内容などが該当し、非機能要件と対にして整理する。
非機能要件
機能以外に求める要件。応答時間や同時利用者数などの性能、稼働率や復旧時間などの可用性、運用保守性、移行性、セキュリティ、設置環境などが該当する。
ペルソナ
年齢・職業・生活習慣まで作り込んだ典型的な利用者像を一人の人物として設定し、その人ならどう使うかを考えて要求を引き出す技法。
ユースケース
利用者や外部システム(アクター)とシステムとのやり取りを、目的を果たす一つの場面としてまとめて記述したもの。機能要件の洗い出しに使う。
RFI
情報提供依頼書。調達に先立ち、実現手段の候補や技術動向、おおよその費用感などの情報提供をベンダに依頼する文書。提案を求めるRFPより前に出す。
RFP
提案依頼書。調達の目的、機能要件・非機能要件、前提条件、納期、契約条件、選定基準を示し、ベンダに提案書の提出を依頼する文書。RFIの後に出す。
内外作の決定
必要な作業を自社で行うか外部に委託するかを決めること。コスト、技術力、納期、社内に残すべきノウハウなどを比較して判断する。
請負契約
仕事の完成を約束する契約。受注者が完成責任を負い、成果物が契約内容に適合しなければ契約不適合責任を負う。作業者への指揮命令は受注者が行う。
準委任契約
一定の業務を遂行することを約束する契約で、仕事の完成までは約束しない。受注者は善良な管理者の注意をもって業務を行う義務を負い、指揮命令は受注者が行う。
労働者派遣契約
派遣元と雇用関係にある労働者を派遣先で働かせる契約。指揮命令権が派遣先(発注側)にある点が請負・準委任と決定的に異なり、完成責任はない。
偽装請負
請負や準委任の契約でありながら、発注側が受注側の作業者に直接指揮命令を行っている状態。実態が労働者派遣に当たるため法令違反となる。
契約不適合責任
引き渡した目的物が種類・品質・数量について契約の内容に適合しない場合に、売主や請負人が負う責任。従来の瑕疵担保責任に相当する。
共通フレーム
企画から開発・運用・保守・廃棄までのソフトウェアライフサイクルの作業内容を整理した共通の物差し。取得者と供給者が同じ言葉で認識を合わせるために使う。
グリーン調達
製品やサービスを購入する際に、環境への負荷が小さいものや、環境に配慮した取組みを行う企業のものを優先して選ぶ調達の考え方。
ソフトウェア資産管理
SAM。組織が保有するソフトウェアのライセンス数と導入状況を把握し、過不足なく適正に使えるよう管理する活動。ライセンス違反と無駄な購入の両方を防ぐ。

例題 発注側が「詳しいことは分からないので要件はベンダに決めてもらう」とした。何が問題か。

要件定義の主体は発注側(利用者側)である。何が必要かを判断できるのは業務を行っている側であり、ベンダに丸投げすると業務の実態に合わないものができ、受入検査の段階で「頼んだものと違う」という食い違いが表面化する。ベンダは技術的な実現方法を支援する立場にとどまる。

例題 「1秒以内に検索結果を表示すること」「月間の稼働率を99.9%以上とすること」は機能要件と非機能要件のどちらか。

どちらも非機能要件。前者は性能、後者は可用性に関する要件で、システムが何をするかではなく、どの程度の品質で行うかを定めている。「検索条件を入力して該当する商品の一覧を表示する」であれば機能要件になる。

例題 請負契約でシステム開発を委託した。発注側の担当者が、受注側の技術者に直接毎日の作業指示を出してよいか。

出してはならない。請負契約では作業者への指揮命令は受注者が行う。発注側が直接指示を出すと実態が労働者派遣となり、偽装請負として法令違反になる。発注側が求めるものは要件や仕様として文書で伝え、進捗は受注側の責任者を通じて確認する。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類7:システム戦略 中分類18:システム企画

データ利活用と業務分析の手法

ビッグデータの置き場所とBIの使い方、QC七つ道具、そして線形計画法・在庫管理・需要予測・意思決定の計算をまとめて身に付けます。

ビッグデータとは、従来の仕組みでは扱いきれないほど量が多く、種類が多様で、発生や更新の速度が速いデータの総称です。表形式で整理された構造化データだけでなく、文章・画像・音声・ログのような非構造化データも含みます。国や自治体が誰でも自由に使える形で公開するデータはオープンデータと呼ばれ、機械判読しやすい形式で、二次利用の条件を明示して公開することが求められます。こうしたデータを分析して経営判断に生かす専門人材がデータサイエンティストです。

データの置き場所は三つを区別します。データウェアハウス(DWH)は、業務システムから集めたデータを、分析の主題ごとに整理し、表記をそろえて統合し、時刻の情報を持たせて時系列に蓄え、いったん入れたら書き換えない形で保管する倉庫です。ここから特定の部門や用途に必要な部分だけを切り出した小さな倉庫がデータマートです。これに対してデータレイクは、加工せず生のままの形式でとにかく蓄えておく場所で、後から用途が決まったときに好きな形に加工して使えます。業務システムからDWHへ入れる際に、抽出・変換・格納を行う処理をETLといいます。蓄えたデータを経営判断に役立てる仕組みや道具がBI(ビジネスインテリジェンス)で、集計軸を切り替えながら多次元に集計・分析する操作をOLAPといいます。さらに、大量のデータから統計や機械学習の手法で人が気付かなかった規則性や相関を掘り出すのがデータマイニング、文章のような文字データを対象に同じことを行うのがテキストマイニングです。BIが「知りたいことを見に行く」道具なのに対し、データマイニングは「知らなかったことを見つける」手法だと考えると区別できます。

現場の改善では、数値をまとめて見せる道具としてQC七つ道具を使います。中身は figure のとおりで、パレート図・特性要因図・チェックシート・ヒストグラム・散布図・管理図・グラフ(層別)です。とくにパレート図は、項目を件数や金額の多い順に棒グラフで並べ、その累積比率を折れ線で重ねた図で、上位のわずかな項目が全体の大部分を占めるという傾向を見つけるのに使います。この考え方で対象を上位からA・B・Cの三群に分け、重点的に管理する対象を絞る手法がABC分析です。累積構成比は、金額の大きい順に並べて上から順に足し上げ、それを合計で割って求めます。言葉で表される情報を整理する道具としては新QC七つ道具があり、親和図法・連関図法・系統図法・マトリックス図法・アローダイアグラム法・PDPC法・マトリックスデータ解析法の七つです。

限られた資源をどう配分すれば利益が最大になるかを求める手法が線形計画法です。目的関数(最大化したい利益など)と制約条件(原料や時間の上限)をすべて一次式で表し、制約を満たす範囲(実行可能領域)の中で目的関数が最大になる点を探します。制約が一次式のときは、最大値は実行可能領域の頂点のいずれかで必ず得られるので、頂点の座標をすべて求めて目的関数の値を比べれば答えが出ます。二つの制約式が交わる点は、連立方程式を解いて求めます。

在庫管理では、持ちすぎれば保管費が増え、少なすぎれば品切れになるという相反する費用の合計が最小になる点を探します。1回あたりの発注費用と、在庫の保管費用の合計が最小になる発注量が経済的発注量(EOQ)で、年間需要量をD、1回あたりの発注費用をS、1個あたりの年間保管費用をHとすると、EOQ=√(2DS÷H) で求まります。発注のやり方には二つあり、定量発注方式は在庫が発注点まで減ったら決まった量を発注する方式で、発注点=1日あたりの平均使用量×調達期間(リードタイム)+安全在庫 です。定期発注方式は決まった周期ごとに発注し、そのつど必要量を計算する方式で、発注量=(発注間隔+調達期間)×1日あたりの平均使用量+安全在庫−現在の在庫量−発注済みの未入荷量 となります。在庫の効率を測る指標が在庫回転率で、年間の売上原価(または売上高)を平均在庫高で割って求め、値が大きいほど在庫が短い期間で入れ替わっていることを表します。

将来の需要を見積もる代表的な方法が移動平均法と指数平滑法です。移動平均法は直近n期の実績の単純平均を次期の予測値とする方法で、3か月移動平均なら直近3か月の実績を足して3で割ります。指数平滑法は、次期の予測値=α×前期の実績値+(1−α)×前期の予測値 で求める方法で、平滑化係数αを大きくするほど直近の実績を重く見た予測になります。不確実な状況での選択には、選択肢と起こりうる状況を枝分かれの図に描くデシジョンツリーを使い、各状況の確率が分かっているときは(利得×確率)の合計である期待値が最大の案を選びます。確率が分からないときは、各案の最悪の結果を比べて、その中で最も良い案を選ぶマクシミン原理(悲観的・保守的な選び方)や、各案の最良の結果を比べて、その中で最も良い案を選ぶマクシマックス原理(楽観的な選び方)を使います。名前は「最小値の中の最大」「最大値の中の最大」と読めばそのまま手順になります。

QC七つ道具の用途と発注方式の比較
区分項目用途・計算式
QC七つ道具パレート図項目を多い順に棒で並べ累積比率を折れ線で重ねる。重点管理すべき上位項目を絞る(ABC分析)
QC七つ道具特性要因図結果に影響する要因を魚の骨の形に整理する。原因の洗い出しに使う
QC七つ道具チェックシート確認項目をあらかじめ並べておき、記録や点検の漏れ・数え落としを防ぐ
QC七つ道具ヒストグラム測定値を区間ごとの度数の柱で表し、ばらつきの分布の形と中心を見る
QC七つ道具散布図二つの項目の値を点で打ち、相関関係の有無と向きを見る
QC七つ道具管理図時系列の値に上下の管理限界線を引き、工程が安定しているかを判断する
QC七つ道具グラフ・層別データを機械別・時間別などに分けて比べ、傾向の違いを見つける
発注方式定量発注方式在庫が発注点まで減ったら一定量を発注。発注点=1日平均使用量×調達期間+安全在庫
発注方式定期発注方式一定周期で発注。発注量=(発注間隔+調達期間)×1日平均使用量+安全在庫−現在庫−発注残
発注方式経済的発注量(EOQ)発注費用と保管費用の合計が最小になる発注量。EOQ=√(2×年間需要量×1回の発注費用÷1個の年間保管費用)
在庫の指標在庫回転率年間売上原価÷平均在庫高。大きいほど在庫が短期間で入れ替わっている
需要予測移動平均法/指数平滑法移動平均=直近n期の実績の平均/指数平滑=α×前期実績+(1−α)×前期予測
意思決定期待値/マクシミン/マクシマックス期待値=Σ(利得×確率)で最大の案/各案の最小値の中で最大/各案の最大値の中で最大
ビッグデータ
従来の仕組みでは扱いきれないほど量が多く、種類が多様で、発生・更新の速度が速いデータの総称。表形式の構造化データと、文章や画像などの非構造化データを含む。
オープンデータ
国や自治体などが、誰でも二次利用できる条件を明示し、機械判読しやすい形式で公開するデータ。行政の透明性向上と新たなサービス創出を目的とする。
データウェアハウス
業務システムから集めたデータを主題ごとに整理し、表記をそろえて統合し、時系列に蓄え、書き換えずに保管する分析用の倉庫。DWHともいう。
データマート
データウェアハウスから、特定の部門や用途に必要な部分だけを切り出して作った小規模なデータの集まり。目的が絞られる分、利用しやすく高速に扱える。
データレイク
加工せずに生のままの形式でデータを蓄えておく場所。構造化・非構造化を問わず取り込み、用途が決まってから必要な形に加工して使う。
BI
ビジネスインテリジェンス。蓄積したデータを集計・可視化し、経営や業務の意思決定に役立てる仕組みや道具の総称。集計軸を切り替える分析操作をOLAPという。
データマイニング
大量のデータに統計や機械学習の手法を適用し、人が気付いていなかった規則性や相関関係を掘り出す手法。文字データを対象にするものをテキストマイニングという。
パレート図
項目を件数や金額の多い順に棒グラフで並べ、累積比率を折れ線で重ねた図。全体に対する影響が大きい上位項目を見つけ、重点管理の対象を絞るのに使う。
ABC分析
項目を金額などの大きい順に並べ、累積構成比を基準にA・B・Cの三群に分け、重要度に応じて管理の手間を変える手法。パレート図とともに用いる。
特性要因図
結果(特性)に影響を与える要因を、魚の骨のような形に大分類から小分類へ枝分かれさせて整理する図。原因の洗い出しと関係の整理に使う。
管理図
時系列に並べた測定値と、上下の管理限界線を引いた図。点が限界線を外れたり偏った並びになったりしていないかで、工程が安定しているかを判断する。
層別
データを機械別・作業者別・時間帯別・材料別などの共通点でグループに分けて比べることで、傾向の違いをはっきりさせ、不良の原因を見つけやすくする整理の仕方。
新QC七つ道具
親和図法・連関図法・系統図法・マトリックス図法・アローダイアグラム法・PDPC法・マトリックスデータ解析法の七つ。主に言葉で表される情報の整理に使う。
線形計画法
目的関数と制約条件をすべて一次式で表し、制約を満たす範囲の中で目的関数を最大(または最小)にする解を求める手法。最適解は実行可能領域の頂点で得られる。
経済的発注量
EOQ。1回あたりの発注費用と在庫の保管費用の合計が最小になる発注量。年間需要量D・発注費用S・1個あたり年間保管費用Hから √(2DS÷H) で求まる。
定量発注方式
在庫量が発注点まで減った時点で、あらかじめ決めた一定量を発注する方式。発注点は「1日平均使用量×調達期間+安全在庫」で求める。
定期発注方式
あらかじめ決めた周期ごとに発注し、発注量をそのつど計算する方式。単価が高く重要な品目に向く。発注量は将来の必要量から在庫と発注残を差し引いて求める。
在庫回転率
年間の売上原価(または売上高)を平均在庫高で割った値。1年に在庫が何回入れ替わったかを表し、値が大きいほど在庫が滞留せず効率よく回っている。
移動平均法
直近n期の実績値の単純平均を、そのまま次期の予測値とする需要予測の方法。平均をとる期数を多くするほど短期の変動がならされ、予測値の動きが滑らかになる。
指数平滑法
次期予測値=α×前期実績値+(1−α)×前期予測値 で求める需要予測の方法。平滑化係数αを大きくするほど直近の実績を重く反映した予測になる。
デシジョンツリー
選択できる案と、その後に起こりうる状況を枝分かれの図で表したもの。各状況の確率が分かるときは期待値を計算し、最も有利な案を選ぶ。
マクシミン原理
各案について起こりうる最悪の結果(最小値)を求め、その中で最も良い案を選ぶ考え方。最悪の事態を避けたい保守的・悲観的な意思決定に用いる。
マクシマックス原理
各案について起こりうる最良の結果(最大値)を求め、その中で最も良い案を選ぶ考え方。うまくいく場合を期待する楽観的な意思決定に用いる。

例題 不良の原因を洗い出す会議で使う図と、不良の件数が多い項目を絞り込むときに使う図は、それぞれどれか。

原因の洗い出しは特性要因図。結果に影響する要因を大分類から小分類へ枝分かれさせ、思い付きの漏れを防ぐ。件数の多い項目の絞り込みはパレート図。多い順の棒と累積比率の折れ線から、上位のどこまで手を打てば全体の大部分をカバーできるかが読み取れる。

例題 年間需要量が3,600個、1回あたりの発注費用が200円、1個あたりの年間保管費用が4円のとき、経済的発注量(EOQ)はいくつか。

EOQ=√(2×3,600×200÷4)=√360,000=600個。年間の発注回数は3,600÷600=6回となる。式の分子に年間需要量と発注費用、分母に保管費用が入る形を覚えておけば、保管費用が高いほど1回の発注量が小さくなるという直感とも一致する。

例題 1日平均使用量が50個、調達期間が6日、安全在庫が80個のとき、定量発注方式の発注点は何個か。

発注点=1日平均使用量×調達期間+安全在庫=50×6+80=380個。発注してから届くまでの6日間に使う300個を切らさないようにし、さらに使用量のぶれに備えて安全在庫80個を上乗せする、と読める。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類9:企業と法務 中分類22:企業活動(業務分析・データ利活用)

経営戦略とビジネスインダストリ

経営戦略マネジメント

競争戦略の型と、SWOT・PPM・3C・4P・バリューチェーン・ファイブフォースといった分析手法の違い、そしてKGI・CSF・KPIの関係が分かります。

経営戦略とは、限られた経営資源(ヒト・モノ・カネ・情報)をどこに投じて、どうやって他社より選ばれる存在になるかを決めた方針のことです。戦略は階層に分かれます。どの事業をやり、どの事業から手を引くかという全社戦略(企業戦略)、個々の事業でどう競争に勝つかという事業戦略(競争戦略)、生産・販売・人事・研究開発など機能ごとにどう動くかという機能別戦略の三つです。上の階層で決めたことが下の階層の前提になるので、順番を逆にすると、部門ごとに頑張っているのに全社としてはちぐはぐ、という状態になります。

事業戦略の基本形として有名なのが、ポーターが示した三つの基本戦略です。コストリーダーシップ戦略は、規模の経済や工程の改善によって業界で最も低い原価を実現し、価格で優位に立つやり方。差別化戦略は、品質・機能・ブランド・サービスなど価格以外の価値で他社にない魅力を作り、価格競争から抜け出すやり方。集中戦略は、市場全体を狙わず、特定の顧客層・地域・製品分野に経営資源を絞り込み、その狭い範囲でコスト優位または差別化を実現するやり方です。似た考え方に、大手が手を出さない小さな市場を狙うニッチ戦略や、競争の激しい既存市場(レッドオーシャン)を避け、まだ競争相手のいない新しい市場(ブルーオーシャン)を切り開くブルーオーシャン戦略があります。また、他社がまねできない自社独自の中核的な強みをコアコンピタンスといい、これを軸に戦略を組み立てるのが基本です。

戦略を立てる前に、自社と環境を整理する分析手法があります。名前が似ていて取り違えやすいので、何を軸に切るのかで覚えます。SWOT分析は、強み(Strength)・弱み(Weakness)という自社内部の要因と、機会(Opportunity)・脅威(Threat)という外部環境の要因を四つのマスに整理します。3C分析は、顧客(Customer)・競合(Competitor)・自社(Company)の三つの視点から市場での立ち位置を見ます。4P(マーケティングミックス)は、売り手の視点で製品(Product)・価格(Price)・流通(Place)・販売促進(Promotion)を組み立てる枠組みで、これを買い手の視点に置き換えたのが4C(顧客価値・顧客の負担・利便性・対話)です。バリューチェーン分析は、自社の事業活動を主活動(購買物流・製造・出荷物流・販売とマーケティング・サービス)と支援活動(全般管理・人事労務管理・技術開発・調達活動)に分け、どこで価値が生まれ、どこにコストがかかっているかを見ます。ファイブフォース分析は、業界の収益性を、新規参入の脅威・代替品の脅威・買い手の交渉力・売り手の交渉力・既存企業間の敵対関係という五つの力で説明します。

複数の事業を抱える会社が、どの事業にお金を回すかを決める道具がPPM(プロダクトポートフォリオマネジメント)です。縦軸に市場成長率、横軸に相対的市場シェアを取り、四つの象限に分けます。市場成長率が高くシェアも高いのが花形で、資金の流入も大きいが競争に勝ち続けるための投資も大きく、差引きはあまり残りません。市場成長率が低くシェアが高いのが金のなる木で、市場が伸びない分だけ投資が少なくて済み、安定した資金を生みます。ここが会社の資金源になります。市場成長率が高くシェアが低いのが問題児で、資金の持ち出しが大きく、市場が伸びているうちに投資してシェアを高めれば花形に育ちますが、育たなければ負け犬になります。市場成長率もシェアも低いのが負け犬で、撤退や縮小を検討します。基本の資金の流れは、金のなる木で稼ぎ、問題児と花形に回す、という形です。成長の方向を決めるときはアンゾフの成長マトリクスを使い、市場と製品をそれぞれ既存・新規に分けて、市場浸透(既存×既存)・新市場開拓(既存製品×新市場)・新製品開発(新製品×既存市場)・多角化(新×新)の四つから選びます。

自社だけで全部やらない選択肢もあります。M&Aは他社を買収・合併して事業や技術を一気に手に入れる方法、アライアンスは資本関係によらず提携して協力する方法です。OEMは相手先のブランドで製造して供給すること、ファブレスは自社では工場を持たず企画・設計・開発に特化し、生産は外部に任せる形態、ファウンドリは逆に他社から受託して製造に専念する形態です。アウトソーシングは業務を外部の専門企業に委託すること、その中でも人事・経理・コールセンターなど業務プロセスを丸ごと委託するものをBPOといいます。いずれも、自社のコアコンピタンスに資源を集中させるための手段です。

戦略を日々の活動に落とし込むのが経営管理システムです。CRMは顧客との関係を管理して顧客満足と長期的な取引を高める仕組み、SFAは商談や案件の進捗など営業活動そのものを支援する仕組み、SCMは調達・生産・物流・販売という供給連鎖の情報を取引先も含めて共有し、在庫と納期を全体最適にする仕組み、ERPは会計・人事・生産・販売など社内の基幹業務のデータを一つに統合して経営資源を全社最適で運用する仕組みです。CRMとSFAは顧客・営業まわり、SCMは企業をまたぐ供給の流れ、ERPは社内の基幹業務全体、と守備範囲で区別します。ほかに、全社で品質の向上に取り組むTQM、個人の知識や経験を組織で共有して活用するナレッジマネジメント、従業員が上司と合意した目標に基づいて自ら管理し評価するMBO(目標による管理)があります。

目標が達成できているかを測るときは、KGI・CSF・KPIをセットで使います。KGI(重要目標達成指標)は「売上高を前年比20%増やす」のような最終的なゴールの指標、CSF(重要成功要因)はそのゴールを達成するうえで決定的に重要な要因、KPI(重要業績評価指標)はCSFが実行できているかを日々測る中間指標です。ゴール(KGI)→ 決め手(CSF)→ 途中の物差し(KPI)という順で並べると取り違えません。財務の数字だけで会社を見ると将来が見えないため、バランススコアカード(BSC)では、財務の視点・顧客の視点・業務プロセスの視点・学習と成長の視点という四つの視点で目標と指標を置き、バランスを取って戦略を管理します。また、企業は利益だけでなく社会的責任(CSR)を負い、SDGs(持続可能な開発目標)への貢献が求められます。経営が適切に行われているかを監視し、不正を防ぐ仕組みづくりをコーポレートガバナンス(企業統治)といいます。

分析手法・目標指標・経営管理システムの早見表(取り違えやすいものを並べて比較)
区分名称何を見るか・何をするか
分析手法SWOT分析内部の強み・弱みと、外部の機会・脅威。内部要因と外部要因を分けて整理する
分析手法3C分析顧客・競合・自社の三つの視点から市場での立ち位置を見る
分析手法4P(4C)売り手視点の製品・価格・流通・販売促進。買い手視点では顧客価値・顧客の負担・利便性・対話
分析手法バリューチェーン分析主活動(購買物流・製造・出荷物流・販売とマーケティング・サービス)と支援活動(全般管理・人事労務管理・技術開発・調達)に分け、価値の源泉を見る
分析手法ファイブフォース分析新規参入の脅威・代替品の脅威・買い手の交渉力・売り手の交渉力・既存企業間の敵対関係で業界の収益性を見る
分析手法PPM市場成長率(縦軸)と相対的市場シェア(横軸)で事業を4分類し、資金配分を決める
PPMの象限花形(高成長・高シェア)資金の流入も流出も大きい。シェアを守る投資を続け、将来の金のなる木にする
PPMの象限金のなる木(低成長・高シェア)追加投資が少なくて済み、安定した資金を生む。資金源として他の事業に回す
PPMの象限問題児(高成長・低シェア)資金の持ち出しが大きい。投資してシェアを高め花形を目指すか、見込みがなければ撤退
PPMの象限負け犬(低成長・低シェア)資金を生まず成長も見込めない。撤退・縮小を検討する
分析手法成長マトリクス(アンゾフ)市場×製品を既存・新規で分け、市場浸透・新市場開拓・新製品開発・多角化を選ぶ
目標指標KGI重要目標達成指標。売上高や利益率など、最終的なゴールが達成できたかを測る
目標指標CSF重要成功要因。KGIを達成するうえで決定的に重要な要因(何をやり遂げるか)
目標指標KPI重要業績評価指標。CSFが実行できているかを日々測る中間指標(訪問件数、解約率など)
経営管理システムCRM顧客の情報を一元管理し、顧客満足と長期的な関係の維持・向上を図る
経営管理システムSFA商談・案件・日報など営業活動そのものを支援し、営業の質と効率を高める
経営管理システムSCM調達・生産・物流・販売の情報を取引先も含めて共有し、在庫と納期を全体最適にする
経営管理システムERP会計・人事・生産・販売など社内の基幹業務データを統合し、経営資源を全社最適で運用する
コストリーダーシップ戦略
規模の経済や工程の改善によって業界で最も低い原価を実現し、価格競争力で優位に立つ戦略。値下げに耐えられる原価構造そのものが強みになる。
差別化戦略
品質・機能・ブランド・サービスなど、価格以外の価値で他社にない魅力を作り、価格競争から抜け出す戦略。顧客がその違いに対価を払うことが前提となる。
集中戦略
市場全体を狙わず、特定の顧客層・地域・製品分野に経営資源を絞り込み、その狭い範囲でコスト優位または差別化を実現する戦略。
コアコンピタンス
他社がまねできない、自社の中核となる独自の強み。技術力や独自の生産方式などを指し、複数の事業に展開できる点が特徴。
SWOT分析
自社内部の強み(S)・弱み(W)と、外部環境の機会(O)・脅威(T)を四つのマスに整理して戦略を考える手法。内部要因と外部要因を分けるのがポイント。
3C分析
顧客(Customer)・競合(Competitor)・自社(Company)の三つの視点から市場と自社の立ち位置を分析する手法。
4Pと4C
4Pは売り手の視点で製品・価格・流通・販売促進を組み立てる枠組み。4Cはこれを買い手の視点に置き換えたもので、顧客価値・顧客の負担・利便性・対話が対応する。
バリューチェーン分析
事業活動を主活動(購買物流・製造・出荷物流・販売とマーケティング・サービス)と支援活動(全般管理・人事労務管理・技術開発・調達活動)に分け、価値とコストの源泉を見る手法。
ファイブフォース分析
業界の収益性を、新規参入の脅威・代替品の脅威・買い手の交渉力・売り手の交渉力・既存企業間の敵対関係という五つの力で分析する手法。
PPM
プロダクトポートフォリオマネジメント。市場成長率と相対的市場シェアの二軸で事業を花形・金のなる木・問題児・負け犬に分類し、資金の配分を決める手法。
金のなる木
PPMで市場成長率が低く相対的市場シェアが高い事業。追加投資が少なくて済み安定した資金を生むので、その資金を問題児や花形に回す。
問題児
PPMで市場成長率が高く相対的市場シェアが低い事業。資金の持ち出しが大きく、投資してシェアを高めれば花形に育つが、育たなければ負け犬になる。
成長マトリクス
アンゾフが示した成長戦略の枠組み。市場と製品をそれぞれ既存・新規に分け、市場浸透・新市場開拓・新製品開発・多角化の四つを示す。
ファブレス
自社では生産設備(工場)を持たず、企画・設計・開発と販売に特化し、製造は外部に委託する事業形態。逆に製造を受託して専念する形態をファウンドリという。
OEM
相手先のブランド名で製品を製造して供給すること。委託側は設備を持たずに品ぞろえを増やせ、受託側は設備の稼働率を高められる。
BPO
ビジネスプロセスアウトソーシング。人事・経理・コールセンターなど、業務プロセスを丸ごと外部の専門企業に委託すること。自社は中核業務に集中できる。
CRM
顧客関係管理。顧客の属性や購買履歴、問合せ履歴を一元管理し、顧客満足度と長期的な関係の維持・向上を図る仕組み。
SCM
供給連鎖管理。調達・生産・物流・販売の情報を取引先を含めて共有し、供給連鎖全体で在庫の削減と納期の短縮を図る仕組み。
ERP
企業資源計画。会計・人事・生産・販売などの基幹業務のデータを一つに統合し、経営資源を全社最適の視点で計画・運用する仕組み。
SFA
営業支援システム。商談の進捗、案件情報、日報などを共有して営業活動を支援し、属人化を防いで営業の質と効率を高める仕組み。
KGI・CSF・KPI
KGIは達成すべき最終目標の指標、CSFはその達成に決定的に重要な要因、KPIはCSFが実行できているかを測る中間指標。ゴール→決め手→途中の物差しの順で対応する。
バランススコアカード
財務・顧客・業務プロセス・学習と成長という四つの視点で目標と指標を置き、財務の数字だけに偏らずに戦略を管理する手法。
コーポレートガバナンス
企業統治。経営が株主などの利害関係者の利益にかなって適切に行われているかを監視し、不正を防ぐための仕組みづくり。

例題 自社の分析結果が「①国内で高いシェアをもつが、②主力工場が老朽化している。③海外で同種製品の需要が伸びている。④原材料の価格が高騰している」であった。SWOT分析ではそれぞれどこに入るか。

①強み(内部・有利)、②弱み(内部・不利)、③機会(外部・有利)、④脅威(外部・不利)。自社が自分で変えられることか、環境として与えられることかで内部・外部を分けるのがコツ。

例題 「解約率を年12%から8%に下げる」ことを目標とし、そのためには初回利用後1か月のフォロー連絡が決め手だと考えて、フォロー連絡の実施率を毎週測ることにした。KGI・CSF・KPIはそれぞれどれか。

KGIは「解約率8%」、CSFは「初回利用後1か月のフォロー連絡」、KPIは「フォロー連絡の実施率」。最終ゴールがKGI、決め手がCSF、途中経過を測る物差しがKPI。

例題 PPMで、市場成長率が高く相対的市場シェアが低い事業がある。取り得る方針を二つ挙げよ。

この事業は問題児。市場が伸びているうちに集中的に投資してシェアを高め花形に育てるか、育つ見込みがないと判断して撤退・売却するか、のいずれか。中途半端に資金を出し続けると負け犬になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類8:経営戦略 中分類19:経営戦略マネジメント(経営戦略手法・マーケティング・ビジネス戦略と目標・評価・経営管理システム)

技術戦略マネジメント

技術を事業に結び付けるMOTの考え方と、イノベーションの種類、魔の川・死の谷・ダーウィンの海・キャズムという四つの壁の位置が分かります。

技術戦略マネジメント(MOT:Management of Technology、技術経営)とは、技術を持っているだけで終わらせず、事業の価値と競争力に結び付けるための経営のやり方です。研究開発に投じたお金が売上と利益になって初めて意味があるので、どの技術に、いつ、いくら投じ、いつ製品にするのかを計画します。その計画を関係者で共有するために、技術の動向と自社の開発計画・製品計画を時間軸に沿って一枚の図に表したものを技術ロードマップといいます。将来の目標時点から逆算して今やるべきことを決める考え方(バックキャスティング)と相性がよく、投資判断の根拠にもなります。

イノベーションは、切り口によって呼び分けます。新しい製品やサービスそのものを生み出すのがプロダクトイノベーション、製造工程や業務の進め方を変えてコスト削減・品質向上・納期短縮を実現するのがプロセスイノベーションです。自社だけで抱え込まず、社外の企業・大学・研究機関の技術やアイデア、人材を組み合わせて革新を起こす考え方をオープンイノベーションといい、その反対が自前主義(クローズドイノベーション)です。また、既存製品の性能を着実に高めて主要顧客の要求に応え続けるものを持続的イノベーション、当初は性能が低く既存顧客には評価されないものの、低価格や手軽さなど別の価値軸で新しい顧客に受け入れられ、やがて既存市場を置き換えるものを破壊的イノベーションといいます。優良企業ほど既存の主要顧客の声を優先するため破壊的イノベーションへの対応が遅れ、地位を失うことがあり、これをイノベーションのジレンマといいます。

技術が事業として立ち上がるまでには、いくつもの壁があります。順番に並べると分かりやすくなります。基礎研究の成果を、製品化を目指す開発の段階に進められない壁が魔の川。開発した技術を、量産や販売の体制が整わず事業化できない壁が死の谷。事業化した製品が、既存企業や競合との激しい競争を生き抜いて産業として定着できない壁がダーウィンの海です。研究→開発→事業化→産業化の順に、魔の川・死の谷・ダーウィンの海が並ぶ、と覚えます。これらとは別に、市場に出た後の普及の壁がキャズムです。新製品の購入者を、イノベータ(革新者)・アーリーアダプタ(初期採用者)・アーリーマジョリティ(前期追随者)・レイトマジョリティ(後期追随者)・ラガード(遅滞者)の五つに分けたとき、新しさ自体に価値を見いだすアーリーアダプタまでの初期市場と、実績や安心を重んじるアーリーマジョリティ以降の大衆市場の間には、判断基準の大きな違いによる深い溝があります。この溝がキャズムで、越えられるかどうかが本格的な普及の分かれ目になります。

技術で稼ぐには、権利と標準の設計も要ります。特許戦略では、自社技術を出願して独占的に使うだけでなく、他社に使わせて実施料を得る、あるいは相手の特許と使い合うクロスライセンスで開発の自由度を確保する、といった選択肢があります。ある技術分野に必要な特許を複数の企業が持ち合っていると誰も製品を作れなくなるため、関係する特許をまとめて一括で許諾できるようにした仕組みがパテントプールです。標準化戦略では、規格の作られ方を区別します。公的な標準化機関が定められた手続を経て制定するのがデジュールスタンダード、市場での競争と普及の結果、事実上の業界標準になったものがデファクトスタンダード、関心のある企業が集まって短期間で策定するのがフォーラム標準です。自社技術を標準にできれば市場を広げられますが、標準にした部分は他社も使えるので、どこを公開しどこを自社の強みとして残すかの設計が重要になります。

新しい事業を立ち上げる進め方にも定石があります。デザイン思考は、利用者を観察して共感するところから始め、本当の課題を定義し、アイデアを出し、試作(プロトタイプ)と検証を繰り返して解決策を作り上げる発想法です。リーンスタートアップは、必要最小限の機能だけを備えた製品(MVP)を素早く出し、構築→計測→学習のサイクルを回して、続けるか方向転換(ピボット)するかを早く判断する手法で、大きく作り込んでから外すという失敗を避けます。新技術やアイデアが実際に目的を果たせるかを、小規模な試作や試行で確かめる取組みがPoC(概念実証)です。ほかに、技術者が短期間集中して開発を競うイベントであるハッカソン、アイデア出しに主眼を置くアイデアソン、自社の機能をAPIとして公開し他社サービスと組み合わせて新しい価値と経済圏を作るAPIエコノミーも、技術戦略の実践手段として押さえておきます。

イノベーションの四つの壁の位置づけと、種類・進め方の整理
区分名称位置づけ・内容
四つの壁魔の川研究 → 開発 の間。基礎研究の成果を、製品化を目指す開発段階に進められない壁
四つの壁死の谷開発 → 事業化 の間。資金不足や量産・販売体制の未整備で事業化できない壁
四つの壁ダーウィンの海事業化 → 産業化 の間。競合との激しい競争を勝ち抜いて市場に定着できない壁
四つの壁キャズム初期市場 → 大衆市場 の間。アーリーアダプタとアーリーマジョリティの間にある普及の溝
普及の5分類イノベータ/アーリーアダプタ新しさ自体に価値を見いだす層。ここまでが初期市場(キャズムの手前)
普及の5分類アーリーマジョリティ以降実績と安心を重んじる層。アーリーマジョリティ・レイトマジョリティ・ラガードが大衆市場
種類プロダクトイノベーション新しい製品・サービスそのものを生み出す
種類プロセスイノベーション作り方・進め方を変えて、コスト・品質・納期を改善する
種類オープンイノベーション社外の技術・アイデア・人材を取り込んで革新を起こす
種類持続的イノベーション既存製品の性能を着実に高め、主要顧客の要求に応え続ける
種類破壊的イノベーション当初は低性能でも別の価値軸で新しい顧客に広がり、やがて既存市場を置き換える
進め方デザイン思考利用者の観察と共感から課題を定義し、試作と検証を繰り返す
進め方リーンスタートアップMVPを素早く出し、構築→計測→学習で継続かピボットかを判断する
進め方PoC(概念実証)本格導入の前に、小規模な試行で実現可能かを確かめる
進め方技術ロードマップ技術と製品の計画を時間軸で図示し、投資判断と関係者の共有に使う
権利・標準パテントプール必要な特許をまとめ、一括で許諾できるようにして普及を促す
権利・標準デジュール/デファクト/フォーラム公的機関の制定/市場での普及の結果/関心企業の集まりによる策定
MOT
技術経営。技術を事業の価値と競争力に結び付けるための経営手法。研究開発への投資判断、製品化の時期、技術者の育成などを経営の視点で計画・管理する。
技術ロードマップ
技術の動向と自社の開発計画・製品計画を時間軸に沿って一枚の図に表したもの。将来の目標から逆算して今やるべきことを決め、関係者で共有し投資判断に使う。
プロダクトイノベーション
これまでにない新しい製品やサービスそのものを生み出す革新。市場に新しい価値をもたらす。
プロセスイノベーション
製造工程や業務の進め方を変えて、コスト削減・品質向上・納期短縮などを実現する革新。作るものは同じでも作り方を変える点が特徴。
オープンイノベーション
社外の企業・大学・研究機関がもつ技術・アイデア・人材を積極的に取り込み、組み合わせて革新を起こす考え方。自前主義に比べ、速度と選択肢で優位に立てる。
破壊的イノベーション
当初は性能が低く既存の主要顧客には評価されないが、低価格や手軽さなど別の価値軸で新しい顧客に広がり、やがて既存市場を置き換える革新。
イノベーションのジレンマ
優良企業ほど既存の主要顧客の要求への対応を優先するため、破壊的イノベーションへの着手が遅れ、結果として市場での地位を失ってしまう現象。
魔の川
基礎研究の成果を、製品化を目指す開発の段階に進められない壁。研究と開発の間にある。
死の谷
開発した技術を事業化できない壁。資金の不足や量産体制・販売体制の未整備が主な原因で、開発と事業化の間にある。
ダーウィンの海
事業化した製品が、競合との激しい競争を勝ち抜いて産業として定着できない壁。事業化と産業化の間にある。
キャズム
新製品が、新しさを重んじるアーリーアダプタまでの初期市場から、実績と安心を求めるアーリーマジョリティ以降の大衆市場へ移るときに立ちはだかる深い溝。
パテントプール
ある技術分野に必要な複数企業の特許をまとめて管理し、利用したい企業が一括で許諾を受けられるようにした仕組み。権利が分散して製品化できなくなる事態を防ぐ。
デファクトスタンダード
公的な制定手続によらず、市場での競争と普及の結果、事実上の業界標準として広く使われるようになった規格。
デジュールスタンダード
ISOやJISなど公的な標準化機関が、定められた手続を経て制定した規格。関心企業が集まって短期間で作るものはフォーラム標準という。
デザイン思考
利用者の観察と共感から出発して真の課題を定義し、アイデア出し・試作・検証を繰り返して解決策を作り上げる発想法。作り手の思い込みで進めないことが要点。
リーンスタートアップ
必要最小限の機能をもつ製品(MVP)を素早く出し、構築→計測→学習のサイクルを回して、事業を継続するか方向転換(ピボット)するかを早く判断する手法。
PoC
概念実証。新しい技術やアイデアが目的を果たせるかどうかを、小規模な試作や試行によって本格導入の前に確かめる取組み。
APIエコノミー
自社の機能やデータをAPIとして公開し、他社のサービスと組み合わせることで、単独では作れない価値と経済圏を生み出す考え方。
ハッカソン
hack(ハック)とmarathon(マラソン)を合わせた語。技術者や企画者が短期間集中して開発に取り組み、成果を競うイベント。アイデア出しに主眼を置くものはアイデアソンという。

例題 ある企業が新素材の基礎研究に成功したが、量産する設備への投資のめどが立たず、製品として世に出せないまま止まっている。これは四つの壁のどれか。

死の谷。開発された技術を事業化する段階で、資金や量産体制が整わずに越えられない壁である。研究から開発に進めないなら魔の川、発売後に競合に敗れて定着できないならダーウィンの海。

例題 新サービスが、新しいもの好きの利用者には好評で順調に伸びていたが、一般の利用者に広げようとした途端に契約が伸びなくなった。何が起きているか。

キャズムに直面している。初期市場の利用者は新しさ自体を評価するが、大衆市場の利用者は導入事例・サポート・安心を求める。訴求点と提供体制を大衆市場向けに変える必要がある。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類8:経営戦略 中分類20:技術戦略マネジメント

ビジネスインダストリ

e-ビジネスの用語、生産方式の違い、IoTの使われ方、そして生成AIを業務で使うときのリスクと対策が分かります。

e-ビジネスは、取引の当事者で分類すると整理しやすくなります。企業間の取引がBtoB、企業と一般消費者の取引がBtoC、消費者どうしの取引がCtoC(ネットオークションやフリマアプリ)、企業と自社の従業員の取引がBtoE(社内向け通販や福利厚生サービス)です。決済まわりでは、あらかじめ金銭的価値を電子的に記録して支払いに使う電子マネー、金融(Finance)と技術(Technology)を組み合わせて新しい金融サービスを生み出すフィンテック、法定通貨ではなくインターネット上でやり取りされる財産的価値である暗号資産があります。暗号資産の基盤技術がブロックチェーンで、取引記録をまとめたブロックに直前のブロックのハッシュ値を含めて連鎖させ、同じ台帳を多数の参加者がP2Pで分散して保持し、相互に検証します。過去の記録を書き換えると以降のハッシュ値が合わなくなるうえ、多数の参加者の台帳も同時に書き換えなければならないため、改ざんが極めて困難になります。

販売のやり方にも名前が付いています。実店舗ではそろえられないニッチな商品を大量に扱い、その売上の合計が全体の大きな割合を占める現象がロングテールです。Webサイトやブログで商品を紹介し、そこから成約したら紹介者に報酬を払う広告手法がアフィリエイト。実店舗・EC・アプリ・SNSといったあらゆる販売接点を在庫や顧客情報まで含めて統合し、顧客がどの経路でも同じように買えるようにするのがオムニチャネルで、これに対してオンラインの広告やクーポンから実店舗への来店を促すのがO2O(Online to Offline)です。ほかに、商品を買い取るのではなく定額で一定期間利用できるようにするサブスクリプション、個人が持つ資産や技能をインターネット経由で他の人と共有・貸借するシェアリングエコノミー、インターネットで不特定多数から資金を集めるクラウドファンディング、第三者が代金を預かり商品の受渡しを確認してから売り手に渡すことで個人間取引のリスクを減らすエスクローがあります。

ものづくりを支える仕組みがエンジニアリングシステムです。CADはコンピュータで設計や製図を行う仕組み、CAMは設計データからNCプログラムを作り工作機械の加工を制御する仕組み、CAEは強度・振動・熱・流体などをコンピュータ上で解析して試作の前に妥当性を確かめる仕組みです。工場全体の作業を自動化することをFA(ファクトリオートメーション)といいます。生産計画では、基準生産計画と部品表(BOM)・在庫量から、必要な部品の量と発注時期を計算するMRP(資材所要量計画)が使われます。生産方式では、コンベアなどで製品を流し工程ごとに担当者が分担するライン生産方式と、1人または少人数がセルと呼ぶ作業台で組立の全工程を担当するセル生産方式を対比して覚えます。ライン生産方式は少品種大量生産に向き、作業が単純で習熟が速い反面、1工程が止まると全体が止まり、生産量の変動にも弱い。セル生産方式は多品種少量生産や生産量の変動に強く、担当範囲が広いので作業者の意欲も高まりやすい反面、作業者の多能工化が欠かせません。在庫を減らす仕組みがかんばん方式で、後工程が使った分だけかんばんを添えて前工程に引き取りに行き、前工程は引き取られた分だけ作ることで、必要なものを必要なときに必要な量だけ作るJIT(ジャストインタイム)を実現します。

IoT(Internet of Things)は、あらゆるものをネットワークにつなぐ考え方です。温度・振動・位置などを測って電気信号に変えるのがセンサ、電気信号を受けて物を動かす(回す・押す・開ける)のがアクチュエータで、「測って、判断して、動かす」の入口と出口を担います。集めたデータをすべてクラウドに送ると通信量も遅延も大きくなるため、端末に近い場所で処理して必要な分だけ送る方式をエッジコンピューティングといい、全体をまとめて分析するクラウドと役割を分担します。工場の設備をつないで見える化し、自律的な制御まで進めた工場をスマートファクトリー、農業に適用して生育や水管理を自動化する取組みをスマート農業といいます。現実の設備や製品をセンサデータに基づいて仮想空間に再現し、その上で故障の予測や工程の改善をシミュレーションする仕組みがデジタルツインです。移動の分野では、複数の交通手段を一つのサービスとして検索・予約・決済できるようにするMaaS、無人航空機であるドローンの物流や点検への活用が広がっています。自動車の運転自動化はレベル0からレベル5までの6段階で表され、レベル2までは運転者が常に監視する運転支援、レベル3は限定された条件下でシステムが運転を担うが作動継続が難しい場合には運転者が対応する段階、レベル4は限定された条件下で運転者の対応を必要としない段階、レベル5は条件を限定しない完全な自動運転です。定型的な事務作業をソフトウェアロボットに代行させるRPAも、業務の自動化を担う仕組みとしてよく問われます。

生成AIは、大量のデータで学習したモデルを使って文章・画像・プログラムなどを作り出す技術で、企画書やメールの下書き、要約、翻訳、コードの生成、問合せ対応の下書きなどに活用されています。ただし業務で使うには留意点があります。第一にハルシネーションです。生成AIは言葉のつながりやすさに基づいて文章を作るため、事実に基づかない内容をもっともらしく出力することがあり、出力は必ず一次情報で裏取りしてから使います。第二に情報漏えいです。社外のサービスに入力した内容は事業者側に保存されたり学習に使われたりするおそれがあるため、入力してよい情報の範囲を社内規程で定め、機密情報や個人情報は入力しない、学習に使わせない設定や閉域の環境を使うといった対策を取ります。第三に著作権です。生成物が既存の著作物と同一・類似になることがあるため、公開前に類似性を確認し、サービスの利用規約や生成物の利用条件を確かめます。第四に誤用・悪用で、偽情報やディープフェイクの作成、指示文に細工をして本来禁止された動作をさせるプロンプトインジェクションといった問題があります。望む出力を得るために、役割・前提・出力形式・制約・例を具体的に指示する工夫をプロンプトエンジニアリングといいます。

AIを社会で使うための考え方として、内閣府(統合イノベーション戦略推進会議)が「人間中心のAI社会原則」を示しています。人間中心、教育・リテラシー、プライバシー確保、セキュリティ確保、公正競争確保、公平性・説明責任及び透明性、イノベーションの七つで、AIは人間の能力を拡張するものであって人間の尊厳を損なってはならないこと、学習データの偏りによって不当な差別が生じないようにすること、判断の根拠を説明できるようにすること、最終的な判断と責任は人間が担うことなどが求められます。採用や与信のように人の権利に大きく関わる判断をAIの出力だけで決めてしまわない、という運用上の歯止めが重要です。

生産方式の比較と、生成AIのリスク・対策
区分名称内容(特徴・対策)
生産方式ライン生産方式コンベアで製品を流し工程ごとに分担。少品種大量生産に向き習熟が速いが、1工程の停止や生産量の変動に弱い
生産方式セル生産方式1人または少人数がセルで組立の全工程を担当。多品種少量生産や変動に強いが、作業者の多能工化が必要
生産方式かんばん方式(JIT)後工程が使った分だけ前工程に引き取りに行き、前工程はその分だけ作る。中間在庫を減らす
生産方式MRP基準生産計画と部品表・在庫量から、必要な部品の量と発注時期を計算する
生成AIのリスクハルシネーション事実でない内容をもっともらしく出力する。→ 一次情報で裏取りし、そのまま使わない。用途を限定する
生成AIのリスク情報漏えい入力した機密情報・個人情報が保存・学習に使われるおそれ。→ 入力可否を社内規程で定め、学習させない設定や閉域環境を使う
生成AIのリスク著作権侵害生成物が既存の著作物と同一・類似になるおそれ。→ 公開前に類似性を確認し、利用規約と生成物の利用条件を確かめる
生成AIのリスク誤用・悪用偽情報やディープフェイクの作成、プロンプトインジェクションによる不正操作。→ 用途の限定、人による最終確認、入出力のフィルタリング
生成AIの使い方プロンプトエンジニアリング役割・前提・出力形式・制約・例を具体的に指示し、望む出力を安定して引き出す
AI利活用の原則人間中心のAI社会原則人間中心/教育・リテラシー/プライバシー確保/セキュリティ確保/公正競争確保/公平性・説明責任及び透明性/イノベーションの七つ
BtoE
企業(Business)と自社の従業員(Employee)との間の取引。社内向け通販サイトや福利厚生サービスの提供などが該当する。企業間はBtoB、企業対消費者はBtoC、消費者間はCtoC。
エスクロー
取引の当事者以外の第三者が買い手から代金を預かり、買い手が商品の受取りを確認した後に売り手へ支払う仕組み。個人間取引の代金未払いや商品未着のリスクを減らす。
ロングテール
実店舗では扱いにくいニッチな商品を大量に品ぞろえし、それら少量ずつしか売れない商品の売上合計が全体の大きな割合を占める現象。在庫制約の小さいECで顕著になる。
オムニチャネル
実店舗・EC・アプリ・SNSなどあらゆる販売接点を、在庫や顧客情報まで含めて統合し、顧客がどの経路でも同じように買い、受け取れるようにする考え方。
O2O
Online to Offline。Web広告やクーポン、アプリなどオンラインの接点から、実店舗というオフラインの来店・購買につなげる施策。
ブロックチェーン
取引記録をまとめたブロックに直前のブロックのハッシュ値を含めて連鎖させ、同じ台帳を多数の参加者がP2Pで分散保持して相互に検証する技術。改ざんが極めて困難になる。
フィンテック
金融(Finance)と技術(Technology)を組み合わせた造語。スマートフォン決済、家計簿の自動作成、少額投資など、ITを使った新しい金融サービスを指す。
ライン生産方式
コンベアなどで製品を流し、工程ごとに担当者が決められた作業を繰り返す方式。少品種大量生産に向き習熟が速い反面、1工程の停止や生産量の変動に弱い。
セル生産方式
1人または少人数が、部品や工具をそろえたセルと呼ぶ作業台で組立の全工程を担当する方式。多品種少量生産や生産量の変動に強いが、作業者の多能工化が必要。
かんばん方式
後工程が使った分だけかんばんを添えて前工程に引き取りに行き、前工程は引き取られた分だけ作る仕組み。JIT(必要なものを必要なときに必要な量だけ)を実現し、中間在庫を減らす。
MRP
資材所要量計画。基準生産計画と部品表(BOM)、在庫量をもとに、必要な部品の種類と量、発注や製造の時期を計算する手法。
CAD・CAM・CAE
CADはコンピュータによる設計・製図、CAMは設計データからNCプログラムを作り加工を制御する仕組み、CAEは強度や流体などを解析して試作前に妥当性を検証する仕組み。
アクチュエータ
電気信号を受けて、回す・押す・開けるといった物理的な動きを生み出す部品。測って信号に変えるセンサと対になり、IoTの出口を担う。
エッジコンピューティング
データを生む端末の近くで処理を行い、必要な分だけをクラウドに送る方式。応答時間の短縮と通信量の削減ができ、全体の分析はクラウドが担う。
デジタルツイン
現実の設備や製品を、IoTで集めたデータに基づいて仮想空間に再現したもの。実物を止めずに故障予測や工程改善のシミュレーションができる。
MaaS
Mobility as a Service。鉄道・バス・タクシー・シェアサイクルなど複数の交通手段を一つのサービスとして統合し、検索・予約・決済をまとめて行えるようにする考え方。
運転自動化レベル
レベル0〜5の6段階。レベル2までは運転者が監視する運転支援、レベル3は限定条件下でシステムが運転し継続困難時に運転者が対応、レベル4は限定条件下で運転者の対応が不要、レベル5は条件を限定しない完全自動運転。
RPA
パソコン上の定型的な操作手順をソフトウェアロボットに実行させ、データ入力・転記・照合・帳票作成などの事務作業を自動化する仕組み。
ハルシネーション
生成AIが、事実に基づかない内容をもっともらしい文章として出力してしまう現象。言葉のつながりやすさから文章を作る仕組みに起因し、出力の裏取りが欠かせない。
プロンプトエンジニアリング
生成AIへの指示文に、役割・前提・出力形式・制約・例などを具体的に与えて、望む出力を安定して引き出す工夫。モデル自体は変更しない点がファインチューニングと異なる。
プロンプトインジェクション
生成AIへの入力に細工をして、本来の指示や制限を無視させ、禁止された出力や不正な動作をさせる攻撃。入出力のフィルタリングや権限の制限で備える。
人間中心のAI社会原則
内閣府が示したAI利活用の基本方針。人間中心、教育・リテラシー、プライバシー確保、セキュリティ確保、公正競争確保、公平性・説明責任及び透明性、イノベーションの七つから成る。

例題 注文が入るたびに仕様が異なる製品を、月ごとに大きく変動する数量で作らなければならない。ライン生産方式とセル生産方式のどちらが向くか。

セル生産方式。1人または少人数が全工程を担当するため、仕様が変わっても段取りの切替えがしやすく、生産量の変動にはセルの数を増減して対応できる。ただし作業者の多能工化に時間がかかる点は覚悟が要る。

例題 社外の生成AIサービスで、顧客からの問合せメールへの返信文の下書きを作ることにした。運用上、必ず決めておくべきことを三つ挙げよ。

①入力してよい情報の範囲(顧客名や契約情報などの個人情報・機密情報は入力しない)、②出力の確認手順(事実関係を一次情報で裏取りし、人が最終確認してから送信する)、③利用するサービスの条件(入力データを学習に使わせない設定、利用規約と生成物の利用条件の確認)。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類8:経営戦略 中分類21:ビジネスインダストリ(e-ビジネス・エンジニアリングシステム・IoTを利用したシステム・民生機器/産業機器)/人間中心のAI社会原則(内閣府 統合イノベーション戦略推進会議)

企業活動と法務

企業活動と組織

会社がどんな仕組みで動き、誰がどんな責任を持ち、人をどう育て評価するのかが分かります。

企業は、人・物・金・情報という経営資源を組み合わせて、社会に価値を提供し続ける組織です。経営資源には限りがあるので、どこに重点を置くかを決めることが経営です。その活動を回すための基本の型がPDCAサイクルです。Plan(計画)で目標と手順を決め、Do(実行)で計画どおりに実施し、Check(評価)で目標と実績を比べて差の原因を調べ、Act(改善)でやり方や計画そのものを見直します。これを一周して終わりにせず、次のPlanにつなげて回し続けることで、業務の質が少しずつ上がっていきます。PDCAは業務改善だけでなく、品質管理や情報セキュリティマネジメントなど、多くの管理の仕組みの土台になっています。

会社の中の人の集まり方、つまり組織形態にはいくつかの型があります。職能別組織(機能別組織)は、開発・製造・販売・経理といった仕事の種類ごとに部門を作る形です。同じ専門の人が集まるので技術やノウハウが蓄積しやすい一方、部門をまたぐ調整が必要で、判断は上位に集まりがちです。事業部制組織は、製品別・地域別・顧客別といった単位で事業部を作り、それぞれに売上と利益の責任を持たせて大きな権限を委ねる形です。市場の変化に素早く対応できますが、事業部ごとに似た機能を持つため重複が生じやすく、事業部の間で協力しにくくなることもあります。

マトリックス組織は、職能別の軸と製品・プロジェクトの軸を掛け合わせ、一人の構成員が二つの部門に同時に所属する形です。専門性と機動力の両方を得られますが、上司が二人いることになるため、指示が食い違ったときの調整の仕組みをあらかじめ決めておかないと現場が混乱します。プロジェクト組織は、特定の目的のために各部門から人を集め、目的を達成したら解散する一時的な組織です。カンパニー制は、社内の事業単位に資本や資産まで割り当て、あたかも独立した会社のように運営させる社内制度で、法人格はあくまで一つです。これに対して持株会社は、他の会社の株式を保有して支配することを目的とした別法人で、自らは事業を行わないものを純粋持株会社、自分でも事業を行いながら子会社を支配するものを事業持株会社といいます。

経営の責任者には役割ごとの呼び名があります。CEOは最高経営責任者で経営全体の最終責任を負い、COOは最高執行責任者として日々の業務執行を統括します。CFOは最高財務責任者で資金調達や財務戦略を、CTOは最高技術責任者で製品や研究開発など技術面の戦略を担当します。そしてCIOは最高情報責任者で、経営戦略に沿った情報化戦略を立案し、情報システム全体と情報資産の活用に責任を持ちます。CIOは技術の担当者ではなく、経営と情報化を橋渡しする立場である点が重要です。

人材育成の方法も押さえておきましょう。OJT(On the Job Training)は職場で実際の仕事を通じて上司や先輩が指導する方法で、実務に直結しますが指導者の力量に左右されます。Off-JTは職場を離れて集合研修やセミナーで体系的に学ぶ方法です。e-ラーニングはコンピュータやネットワークを使って時間や場所に縛られず学ぶ形態で、その中でも学習者一人ひとりの理解度や解答の傾向に応じて出す教材や難易度を変えていくものをアダプティブラーニングといいます。評価の面では、本人が上司と話し合って目標を設定し、期末にその達成度で評価するMBO(目標管理制度)や、上司だけでなく同僚・部下・本人など複数の立場から評価する360度評価(多面評価)があります。

働き方に関する言葉も出題されます。テレワークは情報通信技術を使って場所や時間にとらわれずに働く形態で、在宅勤務やモバイルワーク、サテライトオフィス勤務が含まれます。BYOD(Bring Your Own Device)は従業員が私物の情報端末を業務に使うことで、費用や利便性の利点がある一方、情報漏えいや管理面のリスクがあるため利用ルールの整備が欠かせません。ワークライフバランスは仕事と生活の調和、ダイバーシティは性別・年齢・国籍・障害の有無などの多様性を受け入れて生かす考え方です。

災害や事故が起きても事業を止めない備えがBCP(事業継続計画)です。あらかじめ重要な業務を選び、それを復旧させるまでに許容できる時間の目標であるRTO(目標復旧時間)と、どの時点のデータまで戻して再開するかの目標であるRPO(目標復旧時点)を決め、代替設備や連絡体制を用意します。このBCPを策定し、訓練や見直しを通じて継続的に運用していく一連の活動をBCM(事業継続管理)といいます。企業の社会的責任をCSRといい、環境や人権への配慮、法令遵守、情報開示などが含まれます。国連が定めた持続可能な開発目標がSDGsで、ITの分野では省電力の機器や仮想化によって環境負荷を減らす取組みをグリーンITと呼びます。

生産や事務の現場を数字で改善する技術がIE(インダストリアルエンジニアリング)です。作業の実態を測る方法として、ストップウォッチで各要素作業の時間を直接測る時間研究(ストップウォッチ法)、動作を撮影・分析して無駄を省く動作研究、あらかじめ定められた基本動作ごとの標準時間値を積み上げるPTS法があります。そしてワークサンプリング法は、無作為に選んだ時点で瞬間的に観測することを何度も繰り返し、各作業に費やされた時間の割合を統計的に推定する方法です。連続して張り付いて測る必要がないため、複数の作業者や間接業務の実態を調べるのに向いています。

主な組織形態の比較(編成の基準・指揮命令・特徴)
組織形態編成の基準指揮命令特徴
職能別(機能別)組織開発・製造・販売など仕事の種類一本(上位に集中)専門性が蓄積しやすいが、部門間の調整が必要
事業部制組織製品別・地域別・顧客別の事業単位事業部長に大幅に委譲利益責任が明確で市場の変化に速く対応できるが、機能が重複しやすい
マトリックス組織職能の軸と製品・プロジェクトの軸二系統(上司が二人)専門性と機動性を両立できるが、指示の食い違いの調整が必要
プロジェクト組織特定の目的(期間限定)プロジェクトマネージャ各部門から要員を集め、目的を達成すると解散する
カンパニー制社内の事業単位(資本・資産まで割当て)カンパニー長擬似的な独立採算で運営する社内制度。法人格は一つのまま
持株会社株式の保有による企業グループ各子会社は別法人として独立純粋持株会社は自ら事業を行わず、子会社の支配・管理に専念する
経営資源
企業が事業を行うために使う資源のこと。人(ヒト)、物(モノ)、金(カネ)、情報の四つに分けて考えるのが一般的で、限りある資源をどこに配分するかを決めることが経営の基本になる。
PDCAサイクル
Plan(計画)、Do(実行)、Check(評価)、Act(改善)の四段階を繰り返して業務の質を高める管理の型。Checkは計画と実績を比べて差の原因を調べる段階、Actはその結果を受けてやり方や計画を見直す段階。
職能別組織
機能別組織ともいう。開発・製造・販売・経理など仕事の種類ごとに部門を編成した組織。専門知識が蓄積しやすい反面、部門間の調整が必要で意思決定が上位に集中しやすい。
事業部制組織
製品別・地域別・顧客別などに事業部を編成し、各事業部に利益責任と大幅な権限を委譲した組織。市場の変化に速く対応できるが、事業部ごとに機能が重複しやすい。
マトリックス組織
職能別の軸と製品・プロジェクトの軸を組み合わせ、構成員が二つの部門に同時に所属する組織。専門性と機動性を両立できるが、二人の上司から指示を受けるため命令系統の調整が必要になる。
プロジェクト組織
特定の目的を達成するために各部門から要員を集めて編成する一時的な組織。目的を達成すると解散し、要員は元の部門に戻る。
カンパニー制
社内の事業単位に資本や資産まで割り当て、独立した会社であるかのように擬似的な独立採算で運営する社内制度。法人格は分かれておらず、あくまで一つの会社の中の仕組みである。
純粋持株会社
他の会社の株式を保有してその会社の事業活動を支配することを主な事業とし、自らは事業を行わない会社。自社でも事業を行いながら子会社を支配する会社は事業持株会社という。
CIO
最高情報責任者(Chief Information Officer)。経営戦略に沿って情報化戦略を立案し、情報システムと情報資産の活用に責任を持つ役員。技術単独ではなく経営と情報化を結び付ける役割を担う。
OJT
職場で実際の業務を通じて上司や先輩が知識・技能を指導する教育方法。実務に直結する反面、指導者の力量や職場の忙しさに成果が左右されやすい。職場を離れて行う研修はOff-JT。
アダプティブラーニング
学習者一人ひとりの理解度や解答の傾向に応じて、提示する教材の内容や難易度、順序を変えながら進める学習方式。e-ラーニングの仕組みと学習履歴の分析によって実現される。
MBO
目標管理制度。従業員が上司と話し合って個人目標を設定し、期末にその達成度によって評価する仕組み。目標を自分で設定させることで動機付けを高めるねらいがある。
360度評価
多面評価ともいう。直属の上司だけでなく、同僚・部下・本人など複数の立場の人が評価を行う仕組み。評価の偏りを減らし、本人が気付きにくい面を把握できる。
BYOD
Bring Your Own Device。従業員が私物の情報端末を業務に使うこと。導入費用の削減や利便性の向上が期待できる一方、情報漏えいや端末管理のリスクがあり、利用ルールと技術的対策が必要になる。
BCP
事業継続計画。災害や事故が起きても重要な業務を中断させない、または短時間で復旧させるために、あらかじめ手順や体制を定めた計画。復旧時間の目標をRTO、復旧時点の目標をRPOという。
BCM
事業継続管理。BCPを策定するだけで終わらせず、教育や訓練、点検、見直しを通じて継続的に運用・改善していくマネジメント活動全体を指す。
グリーンIT
省電力の機器の採用、サーバの仮想化・集約、適切な冷却などによって、IT機器の利用や製造に伴う環境負荷を減らす取組み。企業の社会的責任(CSR)やSDGsへの対応の一つとして位置付けられる。
ワークサンプリング法
無作為に選んだ時点で作業の状態を瞬間的に観測することを多数回繰り返し、各作業に費やされた時間の割合を統計的に推定するIEの手法。連続測定が不要で、複数の作業者や間接業務の調査に向く。

例題 職能別組織と事業部制組織のどちらが、新製品を市場に出すまでの意思決定が速いか。理由も述べよ。

事業部制組織。事業部に利益責任と大幅な権限が委譲されているため、事業部の中で企画から製造・販売までの判断を完結できる。職能別組織では部門をまたぐ調整と上位者の承認が必要になり、その分だけ時間がかかる。ただし事業部制は事業部ごとに似た機能を抱えるため、全社で見ると重複投資になりやすい。

例題 PDCAサイクルで、月次の売上目標と実績の差を分析し「広告の出稿時期が遅れたことが原因」と突き止めた。これはどの段階か。また次に行うのはどの段階か。

差の大きさと原因を調べる活動なのでCheck(評価)に当たる。次はAct(改善)で、広告の出稿手順を前倒しにするなど、やり方や計画そのものを見直す。見直した内容は次のPlanに反映して、サイクルを回し続ける。

例題 ある工場で、5人の作業者が1日のうちどれだけの時間を運搬に使っているかを調べたい。ストップウォッチ法とワークサンプリング法のどちらが適しているか。

ワークサンプリング法。無作為な時点での瞬間観測を繰り返して時間の割合を統計的に推定するので、5人を同時に、しかも観測者が張り付かずに調べられる。ストップウォッチ法は一つの要素作業の所要時間を正確に測るのには向くが、複数の作業者を長時間追い続けるには手間がかかりすぎる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類9:企業と法務 中分類22:企業活動

会計と財務

決算書の読み方と、損益分岐点・財務指標・減価償却・投資評価の計算のやり方が分かります。

企業の成績表が財務諸表です。中心になるのは三つで、一定期間にどれだけもうけたかを表す損益計算書(P/L)、ある時点でどんな財産と借金を持っているかを表す貸借対照表(B/S)、現金の増減の内訳を表すキャッシュフロー計算書です。損益計算書は利益を五段階に分けて示します。まず売上高から売上原価を引いた売上総利益(粗利益)。ここから販売費及び一般管理費を引いた営業利益は、本業でのもうけを表します。営業利益に受取利息などの営業外収益を足し、支払利息などの営業外費用を引いた経常利益は、本業に財務活動を加えた、毎期繰り返される活動全体のもうけです。さらに固定資産売却益などの特別利益を足し、災害損失などの特別損失を引くと税引前当期純利益、そこから法人税等を引くと最終的な当期純利益になります。どの利益を問われているのかを取り違えないことが計算問題を解く鍵です。

貸借対照表は左側に資産、右側に負債と純資産を並べ、資産の合計と負債・純資産の合計が必ず一致します。資産は1年以内に現金化される流動資産と、建物や機械のように長く使う固定資産に分かれます。負債も1年以内に返す流動負債と、それより長い固定負債に分かれます。資産から負債を引いた残りが純資産で、株主が出したお金と過去のもうけの蓄積からなり、返す必要のない自己資本に当たります。キャッシュフロー計算書は現金の動きを営業活動・投資活動・財務活動の三つの区分に分けて示します。本業で稼いだ現金が営業活動によるキャッシュフロー、設備や有価証券の取得・売却が投資活動、借入れや返済、増資や配当が財務活動です。利益が出ていても現金が足りずに倒産する黒字倒産があるため、利益と現金の動きは分けて見る必要があります。

費用を、売上に比例して増える変動費と、売上に関係なく一定額かかる固定費に分けて考えると、もうけの構造が見えてきます。売上高に対する変動費の割合が変動費率で、1から変動費率を引いた値が限界利益率です。売上高から変動費を引いた限界利益がちょうど固定費と等しくなり、利益が0になる売上高が損益分岐点売上高で、固定費÷(1−変動費率)で求めます。実際の売上高が損益分岐点をどれだけ上回っているかの割合が安全余裕率で、(売上高−損益分岐点売上高)÷売上高で計算します。この値が大きいほど、売上が落ちても赤字になりにくい体質だといえます。目標利益を達成する売上高は、(固定費+目標利益)÷(1−変動費率)で求められます。

経営の状態を比率で見るのが財務指標です。ROE(自己資本利益率)は当期純利益÷自己資本で、株主が出したお金をどれだけ効率よく利益に変えたかを表します。ROA(総資産利益率、総資本利益率)は利益÷総資産で、資金の出どころを問わず、持っている資産全体でどれだけ利益を上げたかを表します。自己資本比率は自己資本÷総資産で、返さなくてよいお金の割合を示し、高いほど財務が安定しています。流動比率は流動資産÷流動負債で、1年以内に返すお金に対して1年以内に現金化できる資産がどれだけあるかを示し、短期の支払能力の目安になります。総資本回転率は売上高÷総資本で、資産をどれだけ効率よく売上に結び付けたかを回数で表します。分母と分子に何を置くのかを覚えておけば、数値を当てはめるだけで解けます。

製品を作るのにかかった原価は、材料費・労務費・経費の三つに分類します。同時に、特定の製品に直接ひも付けられる直接費と、複数の製品に共通してかかり配賦が必要な間接費にも分けます。この二つの分け方を組み合わせて、直接材料費・直接労務費・直接経費・間接材料費などに整理し、合計したものが製造原価です。長く使う固定資産は、買った年に全額を費用にせず、使用できる期間(耐用年数)にわたって少しずつ費用にします。これが減価償却です。定額法は取得原価を耐用年数で割った一定額を毎年計上する方法で、定率法は未償却残高(帳簿価額)に一定の償却率を掛ける方法です。定率法は初期の償却費が大きく、年々小さくなっていきます。設備を持たずに使う方法としては、比較的長期にわたり特定の物件を借りるリースと、短期間で不特定の物件を借りるレンタルがあります。

同じ商品を違う単価で仕入れた場合、売れた分の原価をいくらとみなすかを決めるのが在庫評価の方法です。先入先出法は、先に仕入れたものから先に払い出したとみなす方法で、売上原価には古い(先に仕入れた)単価が、期末棚卸高には新しい単価が反映されます。移動平均法は、仕入れのたびに在庫全体の平均単価を計算し直し、その時点の平均単価で払い出す方法です。設備投資などの判断には投資評価の手法を使います。回収期間法は、投資額を毎年のキャッシュフローで回収し終えるまでの期間を求め、短いほど有利と判断する分かりやすい方法ですが、回収後のもうけや金利を考えない弱点があります。正味現在価値法(NPV)は、将来のキャッシュフローを一定の割引率で現在の価値に割り引いて合計し、そこから投資額を引いた値がプラスなら投資する価値があると判断する方法です。

損益計算書の5段階利益と主な財務指標の計算式
区分項目計算式・意味
5段階利益売上総利益売上高 − 売上原価(商品そのものの利幅)
5段階利益営業利益売上総利益 − 販売費及び一般管理費(本業のもうけ)
5段階利益経常利益営業利益 + 営業外収益 − 営業外費用(本業+財務活動)
5段階利益税引前当期純利益経常利益 + 特別利益 − 特別損失
5段階利益当期純利益税引前当期純利益 − 法人税等(最終的なもうけ)
損益分岐変動費率変動費 ÷ 売上高(1−変動費率が限界利益率)
損益分岐損益分岐点売上高固定費 ÷ (1 − 変動費率)
損益分岐安全余裕率(売上高 − 損益分岐点売上高) ÷ 売上高
財務指標ROE(自己資本利益率)当期純利益 ÷ 自己資本(純資産)
財務指標ROA(総資産利益率)利益 ÷ 総資産(総資本)
財務指標自己資本比率自己資本 ÷ 総資産(高いほど安定)
財務指標流動比率流動資産 ÷ 流動負債(短期の支払能力)
財務指標総資本回転率売上高 ÷ 総資本(資産が売上を生む効率、単位は回)
売上総利益
粗利益ともいう。売上高から売上原価を差し引いた利益で、商品そのものの利幅を表す。ここから販売費及び一般管理費を引くと営業利益になる。
営業利益
売上総利益から販売費及び一般管理費を差し引いた利益。本業でどれだけ稼いだかを示す。受取利息や支払利息といった財務活動の損益はまだ含まない。
経常利益
営業利益に受取利息などの営業外収益を加え、支払利息などの営業外費用を差し引いた利益。本業と財務活動を合わせた、毎期繰り返される活動全体のもうけを表す。
当期純利益
経常利益に特別利益を加え特別損失を引いた税引前当期純利益から、法人税等を差し引いた最終的な利益。株主に帰属する利益であり、ROEの分子に使われる。
貸借対照表
ある時点の財政状態を、左側の資産と右側の負債・純資産で表した表。資産合計と負債・純資産の合計は必ず一致する。資産・負債は1年基準で流動と固定に分けられる。
キャッシュフロー計算書
一会計期間の現金の増減を、営業活動・投資活動・財務活動の三つの区分に分けて示した書類。利益が出ていても現金が不足する黒字倒産を見抜くために使われる。
変動費率
売上高に対する変動費の割合(変動費÷売上高)。1から変動費率を引いた値が限界利益率で、損益分岐点売上高=固定費÷(1−変動費率)の分母になる。
損益分岐点売上高
売上高と費用(固定費+変動費)がちょうど等しくなり、利益が0になる売上高。固定費÷(1−変動費率)で求める。これを上回れば黒字、下回れば赤字になる。
安全余裕率
実際の売上高が損益分岐点売上高をどれだけ上回っているかの割合。(売上高−損益分岐点売上高)÷売上高で求め、値が大きいほど売上が落ちても赤字になりにくい。
ROE
自己資本利益率。当期純利益÷自己資本で求め、株主が出資したお金をどれだけ効率よく利益に変えたかを表す。分母が自己資本(純資産)である点がROAとの違い。
ROA
総資産利益率(総資本利益率)。利益÷総資産で求め、負債も含めた資産全体をどれだけ効率よく利益に結び付けたかを表す。
自己資本比率
自己資本÷総資産で求める比率。返済の必要がない資金の割合を示し、高いほど財務の安定性が高いと判断される。
流動比率
流動資産÷流動負債で求める比率。1年以内に返済すべき負債に対して、1年以内に現金化できる資産がどれだけあるかを示し、短期の支払能力の目安になる。
総資本回転率
売上高÷総資本で求め、資産をどれだけ効率よく売上に結び付けたかを回数で表す指標。値が大きいほど資産が有効に使われている。
定額法
減価償却の方法の一つ。(取得原価−残存価額)÷耐用年数で求めた一定額を毎年計上する。計算が簡単で、毎年の費用が同額になる。
定率法
減価償却の方法の一つ。未償却残高(取得原価−償却累計額)に一定の償却率を掛けて計上する。初期の償却費が大きく、年を追うごとに小さくなる。
先入先出法
先に仕入れたものから先に払い出したとみなして在庫を評価する方法。売上原価には古い単価、期末棚卸高には新しい単価が反映される。
移動平均法
仕入れのたびに、それまでの在庫と新しい仕入れを合わせた平均単価を計算し直し、その平均単価で払い出したとみなす在庫評価の方法。
回収期間法
投資額を毎年のキャッシュフローで回収し終えるまでの期間を求め、期間が短い案を有利と判断する投資評価の手法。回収後の利益や金利(時間価値)を考慮しない。
正味現在価値法
NPV。将来得られるキャッシュフローを一定の割引率で現在価値に割り引いて合計し、投資額を差し引いた値で評価する手法。値が正なら投資する価値があると判断する。

例題 売上高2,000万円、売上原価1,200万円、販売費及び一般管理費500万円、営業外収益30万円、営業外費用80万円のとき、売上総利益・営業利益・経常利益はそれぞれいくらか。

売上総利益=2,000−1,200=800万円。営業利益=800−500=300万円。経常利益=300+30−80=250万円。営業外収益は足し、営業外費用は引くことに注意する。ここから特別損益と法人税等を差し引くと当期純利益になる。

例題 固定費900万円、変動費率0.4の企業が、利益300万円を達成するために必要な売上高はいくらか。

目標利益を達成する売上高=(固定費+目標利益)÷(1−変動費率)=(900+300)÷0.6=2,000万円。ちなみに損益分岐点売上高は900÷0.6=1,500万円なので、そこから500万円多く売れば、限界利益率0.6の分だけ利益が300万円積み上がる。

例題 取得原価800,000円、耐用年数4年、残存価額0の設備を定額法と定率法(償却率0.5)で償却した場合、1年目の減価償却費はそれぞれいくらか。

定額法=800,000÷4=200,000円。定率法=800,000×0.5=400,000円。定率法の2年目は未償却残高400,000円に0.5を掛けて200,000円となり、年々小さくなる。定額法は毎年200,000円で変わらない。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類9:企業と法務 中分類22:企業活動(会計・財務)

法務

知的財産権・セキュリティ関連法規・労働関連法規・取引関連法規と標準化の要点が分かります。

知的財産権は大きく、著作権法が守る著作権と、特許庁への出願・登録によって発生する産業財産権に分かれます。著作権はプログラム、文章、写真、音楽などの著作物を保護する権利で、創作した時点で自動的に発生し、登録などの手続は要りません(無方式主義)。保護期間は原則として著作者の死後70年ですが、法人その他の団体が著作者である著作物は公表後70年です。ここで重要なのが、著作権法はプログラムを保護する一方で、プログラム言語、規約(プロトコルやインタフェースの取決め)、解法(アルゴリズム)は保護の対象から除外している点です。つまり同じアルゴリズムを自分で書き直したプログラムは、他人のソースコードを複製していない限り著作権侵害にはなりません。著作権には、コピーを作る複製権、翻訳・改変して別の著作物にする翻案権、公衆送信権などが含まれ、これらとは別に、著作者の人格的な利益を守る著作者人格権(公表権・氏名表示権・同一性保持権)があり、こちらは他人に譲渡できません。

会社の中で作られた著作物の扱いが職務著作(法人著作)です。法人等の発意に基づき、その従業者が職務上作成した著作物で、契約や勤務規則に別段の定めがない場合、著作者は法人等になります。プログラムの著作物については、法人名義で公表することは条件になっていません。法人が著作者になる著作物の保護期間は公表後70年です。なお、外部の会社にソフトウェアの開発を委託した場合は職務著作には当たらず、著作権は原則として実際に開発した受託者側に帰属するため、発注者に権利を移したいのであれば契約で著作権の譲渡を明記しておく必要があります。

産業財産権は四つあります。特許権は自然法則を利用した高度な技術的思想の創作である発明を保護し、存続期間は出願の日から20年です。実用新案権は物品の形状・構造・組合せに関する考案を保護し、出願の日から10年です。意匠権は物品などのデザインを保護し、出願の日から25年です。商標権は商品やサービスの目印であるマークや名称を保護し、登録の日から10年ですが、更新の登録を繰り返すことで半永久的に権利を持ち続けられる点が他と大きく異なります。これらはいずれも出願と登録が必要で、著作権のように創作しただけでは発生しません。営業秘密を保護するのは不正競争防止法で、秘密として管理されていること(秘密管理性)、事業活動に有用な技術上・営業上の情報であること(有用性)、公然と知られていないこと(非公知性)の三つを満たす情報が営業秘密として保護されます。

情報セキュリティに関わる法律も押さえます。不正アクセス禁止法は、他人の識別符号(利用者IDとパスワードなど)を無断で使ってアクセス制御された機能を利用できる状態にする行為(なりすまし)や、セキュリティホールを突く侵入行為を禁じており、他人のIDとパスワードを無断で第三者に提供する行為も対象です。コンピュータウイルスの作成・提供・供用・取得・保管は、刑法の不正指令電磁的記録に関する罪で処罰されます。サイバーセキュリティ基本法は国のサイバーセキュリティ戦略の基本方針や国・地方公共団体の責務を定めた法律です。個人情報保護法は、個人情報を扱う事業者の義務を定めています。人種、信条、社会的身分、病歴、犯罪の経歴など、取扱いに特に配慮を要する情報は要配慮個人情報とされ、取得には原則として本人の同意が必要です。特定の個人を識別できず、かつ元の個人情報を復元できないように加工した匿名加工情報は、所定の公表などの措置を講じれば本人の同意なく第三者に提供できます。一方、他の情報と照合しない限り個人を識別できないように加工した仮名加工情報は、社内での分析などに使うもので、原則として第三者に提供できません。

労働に関する法律では、労働基準法が労働条件の最低基準を定めており、労働時間は原則として1日8時間・週40時間が上限です。これを超えて時間外労働や休日労働をさせるには、労働者の過半数で組織する労働組合などとの間で協定(労働基準法第36条にちなんで36協定と呼ばれます)を結び、労働基準監督署長に届け出なければなりません。裁量労働制は、業務の進め方や時間配分を労働者の裁量に委ね、あらかじめ労使で定めた時間を働いたものとみなす制度で、対象になる業務は法令で限定されています。フレックスタイム制は、一定期間(清算期間)の総労働時間だけを決めておき、日々の始業・終業時刻を労働者が自分で決められる制度です。このほか、一定の期間を平均して1週間当たりの労働時間が法定労働時間を超えなければ、特定の日や週に法定労働時間を超えて働かせることができる変形労働時間制や、事業場外で働いたために労働時間の算定が難しい場合に所定労働時間を働いたものとみなす事業場外みなし労働時間制もあります。労働者派遣法は派遣のルールを定めた法律で、派遣労働者の雇用契約の相手は派遣元ですが、業務上の指揮命令は派遣先が行います。これに対して請負は仕事の完成を目的とする契約で、注文者は請負業者の労働者に直接指揮命令できません。請負や準委任の契約でありながら、実際には注文者が労働者に直接指示を出している状態は偽装請負と呼ばれ、法令違反となります。

取引に関する法律では、2026年1月1日に下請法から名称を改めて施行された中小受託取引適正化法(取適法)が重要です。従来の親事業者・下請事業者は委託事業者・中小受託事業者と呼ばれ、委託事業者には発注内容を記した書面の交付義務があり、代金は給付を受領した日から起算して60日以内のできる限り短い期間内に支払わなければなりません。受託事業者に責任がないのに受領を拒んだり代金を減額したりする行為は禁止され、改正では手形による支払の禁止や、協議に応じない一方的な代金の決定の禁止、資本金基準に加えた従業員数基準の追加なども盛り込まれました。このほか、公正な競争を守る独占禁止法、製品の欠陥によって生じた損害について製造業者の無過失責任を定めた製造物責任法(PL法)、訪問販売や通信販売などでのクーリングオフを定めた特定商取引法、電子署名に手書き署名や押印と同等の効力を認める電子署名法、前払式支払手段や資金移動業を規定する資金決済法などがあります。

標準化は、規格を定めて品質や互換性をそろえる活動です。国際標準ではISO(国際標準化機構)、IEC(国際電気標準会議)、ITU(国際電気通信連合)があり、電気・電子分野の学会規格としてIEEE、Web技術の標準化団体としてW3Cがあります。国内の規格はJIS(日本産業規格)です。代表的なマネジメントシステム規格として、品質のISO 9000シリーズ、環境のISO 14000シリーズ、情報セキュリティのISO/IEC 27000シリーズがあり、個人情報保護マネジメントシステムの要求事項を定めたJIS Q 15001はプライバシーマーク制度の審査基準として使われています。コードの標準では、商品識別に使われるJANコード(標準タイプ13桁、短縮タイプ8桁)や、縦横の二方向に情報を持たせて誤り訂正機能も備えた二次元コードであるQRコードなどがあります。

知的財産権の比較と、労働者派遣・請負の違い
区分対象/項目権利の発生・指揮命令存続期間・特徴
著作権プログラム、文章、写真、音楽などの著作物創作した時点で自動的に発生(登録不要)原則として著作者の死後70年(法人が著作者の場合は公表後70年)
著作権プログラム言語・規約・解法(アルゴリズム)著作権法の保護の対象外。独自に実装すれば侵害にならない
産業財産権特許権(発明)出願・審査を経て登録出願の日から20年
産業財産権実用新案権(物品の形状・構造の考案)出願・無審査で登録出願の日から10年
産業財産権意匠権(物品などのデザイン)出願・審査を経て登録出願の日から25年
産業財産権商標権(商品・サービスのマーク)出願・審査を経て登録登録の日から10年(更新を繰り返せば半永久)
その他営業秘密(不正競争防止法)秘密管理性・有用性・非公知性の3要件登録不要。要件を満たす限り保護される
契約形態労働者派遣雇用は派遣元、指揮命令は派遣先が行う労働者派遣法の規制を受ける
契約形態請負雇用も指揮命令も請負業者が行う仕事の完成が目的。注文者が直接指揮命令すると偽装請負になる
著作権
プログラム、文章、写真などの著作物を保護する権利。創作した時点で自動的に発生し、登録は不要(無方式主義)。保護期間は原則として著作者の死後70年、法人が著作者の場合は公表後70年。
著作者人格権
公表権・氏名表示権・同一性保持権からなる、著作者の人格的利益を守る権利。財産権としての著作権と異なり、他人に譲渡することができない。
職務著作
法人著作ともいう。法人等の発意に基づき従業者が職務上作成した著作物について、契約や勤務規則に別段の定めがなければ法人等が著作者となる制度。プログラムの著作物では法人名義での公表は要件とされない。
保護対象外(著作権法)
著作権法はプログラムを保護するが、プログラム言語、規約(プロトコルなどの取決め)、解法(アルゴリズム)は保護の対象から除外されている。同じ解法を独自に実装しても著作権侵害にはならない。
特許権
自然法則を利用した高度な技術的思想の創作である発明を保護する権利。出願と審査を経て登録され、存続期間は出願の日から20年。
実用新案権
物品の形状・構造・組合せに関する考案を保護する権利。無審査で登録され、存続期間は出願の日から10年。
意匠権
物品・建築物・画像などのデザイン(意匠)を保護する権利。出願し審査を経て登録される。存続期間は意匠登録出願の日から25年で、2020年4月1日より前の出願は登録の日から20年であった。
商標権
商品やサービスの目印となるマーク・名称を保護する権利。存続期間は登録の日から10年だが、更新の登録を繰り返すことで半永久的に維持できる。
営業秘密
不正競争防止法で保護される情報。秘密として管理されていること(秘密管理性)、事業活動に有用であること(有用性)、公然と知られていないこと(非公知性)の三つの要件をすべて満たす必要がある。
不正アクセス禁止法
他人の識別符号を無断で用いたなりすましログインや、セキュリティホールを突く侵入を禁じる法律。他人のID・パスワードを無断で第三者に提供する行為も処罰の対象となる。
不正指令電磁的記録に関する罪
コンピュータウイルスの作成・提供・供用・取得・保管を処罰する刑法の罪。いわゆるウイルス作成罪で、不正アクセス禁止法ではなく刑法が根拠となる。
要配慮個人情報
人種、信条、社会的身分、病歴、犯罪の経歴、犯罪により害を被った事実など、不当な差別や偏見が生じないよう取扱いに特に配慮を要する個人情報。取得には原則として本人の同意が必要。
匿名加工情報
特定の個人を識別できないように加工し、かつ元の個人情報を復元できないようにした情報。所定の公表などの措置を講じれば、本人の同意なく第三者に提供できる。
仮名加工情報
他の情報と照合しない限り特定の個人を識別できないように加工した情報。事業者内部での分析などでの利用を想定しており、原則として第三者への提供はできない。
36協定
法定労働時間を超える時間外労働や休日労働をさせるために、労働者の過半数で組織する労働組合等と締結し、労働基準監督署長に届け出る必要がある協定。労働基準法第36条に由来する。
裁量労働制
業務の進め方や時間配分を労働者の裁量に委ね、あらかじめ労使で定めた時間を労働したものとみなす制度。対象となる業務は法令で限定されている。
フレックスタイム制
清算期間の総労働時間だけを定めておき、日々の始業・終業の時刻を労働者自身が決められる制度。必ず勤務する時間帯をコアタイムとして設けることもある。
偽装請負
請負や準委任の契約であるにもかかわらず、注文者が請負業者の労働者に直接指揮命令を行っている状態。実質的に労働者派遣に当たり、労働者派遣法などに違反する。
中小受託取引適正化法
取適法。2026年1月1日に下請法から名称を改めて施行された法律。委託事業者に書面交付義務と60日以内の代金支払を課し、受領拒否や不当な減額、手形による支払などを禁止している。
製造物責任法
PL法。製造物の欠陥によって人の生命・身体・財産に損害が生じた場合に、製造業者等に過失がなくても損害賠償責任を負わせる法律。
JIS Q 15001
個人情報保護マネジメントシステム(PMS)の要求事項を定めた日本産業規格。プライバシーマーク制度の審査基準として用いられる。
JANコード
商品を識別するためのバーコード規格。標準タイプは13桁、短縮タイプは8桁で、先頭に国コードを持つ。二次元コードであるQRコードは誤り訂正機能を備え、縦横の両方向に情報を持たせる。

例題 A社の社員が、他社製ソフトウェアの動作を観察してアルゴリズムを理解し、同じ機能を持つプログラムをすべて自分で書き起こした。著作権侵害になるか。

他人のソースコードを複製・翻案していないのであれば、著作権侵害にはならない。著作権法はプログラムを保護するが、解法(アルゴリズム)、プログラム言語、規約は保護の対象から除外されているためである。ただし、そのアルゴリズムが特許として登録されている場合は特許権の侵害になり得るし、不正に持ち出した営業秘密に基づくのであれば不正競争防止法の問題になる。

例題 B社が外部のC社にシステム開発を委託した。完成したプログラムの著作権は、契約に定めがない場合どちらに帰属するか。

原則として実際に開発したC社に帰属する。職務著作の規定は、あくまで法人と、その法人の従業者との関係についてのものであり、委託先の会社には適用されないためである。発注者であるB社が著作権を得たいのであれば、契約で著作権の譲渡を明記しておく必要がある。

例題 D社がE社と請負契約を結び、E社の社員が常駐して作業している。D社の管理者がE社の社員に対して直接作業指示や勤怠管理を行うことは適切か。

適切ではない。請負では注文者が請負業者の労働者に直接指揮命令できず、指示はE社の責任者を通じて行う必要がある。直接指揮命令している実態があると、契約は請負でも実質は労働者派遣とみなされ、偽装請負として労働者派遣法などに違反することになる。派遣として行うのであれば、労働者派遣契約を結び直す必要がある。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類9:企業と法務 中分類23:法務

擬似言語の読み方

擬似言語の書き方をおぼえる

科目Bのプログラムは「擬似言語」という共通の書き方で出される。まずは記号と宣言の形を丸ごと覚えてしまおう。

科目Bで出てくるプログラムは、C言語でもPythonでもなく、IPAが決めた「擬似言語」で書かれている。文法はとても少なく、覚えることは1ページに収まる。逆に言うと、この1ページを覚えていないと問題文がまったく読めない。まずここを固めるのが最短ルートになる。

いちばん大事なのは代入の記号だ。擬似言語では代入を矢印 ← で書く。x ← 1 は「変数 x に 1 を入れる」という意味で、右辺を計算してから左辺の変数に格納する。プログラミング経験がある人ほど = を代入と読みたくなるが、擬似言語の = は「等しい」という比較の意味しかない。== という書き方は擬似言語には存在しない。

変数は使う前に「型: 名前」の形で宣言する。整数型: i、実数型: x、文字列型: s、論理型: flag のように書く。論理型に入るのは true と false の2つだけだ。値がまだ入っていない状態は「未定義の値」と表される。

比較は数学の記号をそのまま使う。等しいは =、等しくないは ≠、以下は ≦、以上は ≧、大小は > と <。条件をつなぐときは and(かつ)、or(または)、not(否定)を使う。文字列どうしの連結は + で書く。

手続と関数の宣言は ○ で始まる。戻り値がある関数は ○戻り値の型: 関数名(型: 引数, 型: 引数) と書き、戻り値がない手続は ○関数名(型: 引数) と書く。関数の中で return 値 を実行すると、その値を返してその場で関数を終える。注釈を書きたいときは /* コメント */ か // コメント を使う。

本文の途中に出てくるプログラムは、行番号つきで表示される。設問が「3行目の…」と指すことが多いので、読むときは必ず行番号を意識する習慣をつけておくとよい。

宣言・代入・比較・論理演算・関数宣言・return がひととおり入った例

// 2つの整数のうち大きいほうを返す関数
○整数型: larger(整数型: a, 整数型: b)
  if (a ≧ b)
    return a
  endif
  return b

○main()
  整数型: x
  整数型: y
  文字列型: s
  論理型: flag
  x ← 3
  y ← x + 4      /* y は 7 になる */
  flag ← (x ≠ y) and not (x > y)
  s ← "答えは" + "7"
  出力(larger(x, y))
擬似言語の記述形式(これだけ覚えれば読める)
種類書き方
手続・関数の宣言○戻り値の型: 関数名(型: 引数, 型: 引数) / 戻り値なしは ○関数名(型: 引数)
変数宣言整数型: i / 実数型: x / 文字列型: s / 論理型: flag
配列宣言整数型の配列: a / 整数型の二次元配列: m
代入x ← 1 / 配列リテラルは a ← {1, 2, 3}
条件分岐if (条件) … elseif (条件) … else … endif
繰返し(回数)for (i を 1 から 10 まで 1 ずつ増やす) … endfor
繰返し(条件)while (条件) … endwhile / do … while (条件)
戻り値return 値
論理演算and / or / not
比較= / ≠ / ≦ / ≧ / > / <
コメント/* コメント */ / // コメント
未定義未定義の値
擬似言語
IPAが試験用に定めた、特定のプログラミング言語に依存しない記述形式。宣言・代入・分岐・繰返し・関数呼出しだけの少ない文法でできており、科目Bのアルゴリズム問題はすべてこの形式で出題される。
代入(←)
右辺の式を計算した結果を左辺の変数に格納する操作。x ← x + 1 のように、同じ変数を右辺と左辺の両方に書くこともでき、この場合は「今のxに1を足した値を新しいxにする」という意味になる。
変数宣言
使う変数の型と名前を「整数型: i」のように書いて用意すること。型には整数型・実数型・文字列型・論理型などがあり、配列は「整数型の配列: a」、二次元配列は「整数型の二次元配列: m」と書く。
論理型
true(真)と false(偽)の2つの値だけをとる型。比較式の結果は論理型になるので、flag ← (x > 5) のように比較結果をそのまま変数に入れられる。ifの条件に書けるのは論理型の値だけである。
比較演算子
2つの値の関係を調べて true か false を返す記号。等しい=、等しくない≠、以下≦、以上≧、より大きい>、より小さい<の6種類。C言語のような != や <> や == は擬似言語では使わない。
手続と関数
処理に名前をつけてまとめたもの。戻り値があるものを関数といい ○整数型: f(整数型: n) のように戻り値の型を書く。戻り値がないものを手続といい ○出力(整数型: n) のように型を書かない。
return
関数の中で「この値を呼び出し元に返して関数を終える」ことを表す文。return より後ろの行は実行されない。分岐の中に複数のreturnがあるプログラムでは、最初に到達したreturnだけが実行される。

例題 上のプログラムの14行目で y の値はいくつになるか。

7 になる。← は右辺を先に計算してから左辺に入れる記号なので、x + 4 = 3 + 4 = 7 が y に格納される。13行目で x に 3 が入っていることを見落とさないこと。

例題 flag ← (x ≠ y) and not (x > y) を x が 3、y が 7 のときに評価するとどうなるか。

true になる。x ≠ y は 3 ≠ 7 なので true、x > y は 3 > 7 なので false で、not false は true。true and true なので flag は true。and は両方が true のときだけ true になる。

例題 次のプログラムで、a が 5、b が 5 のとき return されるのはどちらか。

a のほう(5)が返る。a ≧ b は 5 ≧ 5 で true なので return a が実行され、そこで関数は終わる。return より後ろの return b には決して到達しない。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング/IPA「試験で使用する情報技術に関する用語・プログラム言語など」Ver.5.1 別紙2 擬似言語の記述形式

分岐と繰返しを追う

if・for・while・do while の4つを覚え、変数の値を1行ずつ紙に書き出す「トレース」を身につける。

分岐は if (条件) で始まり endif で終わる。条件が成り立たないときの別の条件は elseif (条件)、どれにも当てはまらない場合は else に書く。elseif と else は省略できるが、endif は必ず必要だ。上から順に条件を調べ、最初に true になった枝だけを実行して endif の後ろへ飛ぶ。だから if (x > 10) の次に elseif (x > 5) と書いてあれば、後者は「10以下で5より大きい」ときにだけ実行される。

回数が決まっている繰返しは for (i を 1 から 10 まで 1 ずつ増やす) … endfor と書く。この for は終わりの値10を含むので、10回まわる。増やす量は 1 でなくてもよく、「1 から 10 まで 3 ずつ増やす」なら i は 1, 4, 7, 10 の4回になる。逆向きに数えるときは「10 から 1 まで 1 ずつ減らす」と書く。

条件で回る繰返しは while (条件) … endwhile と do … while (条件) の2つがある。while は先に条件を調べる前判定なので、最初から条件が false なら本体は1回も実行されない。do while は本体を実行してから条件を調べる後判定なので、必ず1回は実行される。この違いを問う問題は頻出なので、どちらの形かを最初に確認する。

繰返しから途中で抜けたいときは、擬似言語に break のような専用の文が用意されていないことが多い。代わりに「見つけたら true にする論理型の変数」や「見つけた位置を入れる変数」を用意し、while (i ≦ 上限 and 見つかっていない) のように条件へ組み込むのが定番の書き方になる。

プログラムを読むコツは、頭の中で追わずに紙に表を書くことだ。表の列に変数名を並べ、1行実行するごとに変わった変数の値だけを書き足していく。これをトレースという。特に繰返しでは、ループに入る直前の値・1回目終了時の値・2回目終了時の値…と機械的に並べると、間違いがはっきり見える。

トレースで事故が起きやすいのは3か所ある。ループ本体を最後に何回実行したか(終わりの値を含むか)、条件を調べるのが本体の前か後か、そして代入の順序だ。x ← y の直後に y ← x と書いても値は入れ替わらない。入替えには一時変数がいる。

for と if を組み合わせた例(sum の最終値をトレースで求める)

整数型: i
整数型: sum
sum ← 0
for (i を 1 から 5 まで 1 ずつ増やす)
  if (i > 3)
    sum ← sum + i × 2
  else
    sum ← sum + i
  endif
endfor
繰返し3種類の違い(同じ条件でも回数が変わる)
書き方条件を調べる位置最小の実行回数向いている場面
for (i を a から b まで n ずつ増やす)本体の前(回数は最初に決まる)0回(aがbを超えていれば)回数が分かっている繰返し
while (条件) … endwhile本体の前(前判定)0回条件が成り立つ間だけ続ける
do … while (条件)本体の後(後判定)1回まず1回やってから続けるか決める
if / elseif / else / endif
条件分岐の構文。上から順に条件を評価し、最初に true になった枝だけを実行して endif の後ろへ進む。どの条件も false で else があれば else の中を実行し、else がなければ何も実行しない。
for(回数繰返し)
「for (i を 1 から 10 まで 1 ずつ増やす)」の形で、繰返しの回数があらかじめ決まっている構文。終わりの値も含めて実行されるので、1から10までなら10回まわる。増分を変えたり「1 ずつ減らす」と書いて逆順にもできる。
while(前判定)
条件を先に調べてから本体を実行する繰返し。条件が最初から false なら本体は0回しか実行されない。本体の中で条件に使う変数を必ず変化させないと、無限ループになる点に注意する。
do while(後判定)
本体を実行してから条件を調べる繰返し。条件の成否にかかわらず本体は最低1回実行される。同じ条件でも while より実行回数が1回多くなることがあり、その差が設問になりやすい。
トレース
プログラムを1行ずつ実行したつもりで、変数の値の変化を表に書き出す作業。ループ1周ごとに値を並べると、境界での回数のずれや条件の判定ミスが目に見える形で分かる。科目Bで最も確実な解き方である。
多重ループ
繰返しの中に別の繰返しが入っている構造。内側は外側が1周するたびに最初からやり直される。外側がm回、内側がn回なら本体は m×n 回実行されるが、内側の回数が外側の変数に依存する場合は回数を足し上げる必要がある。
ループの脱出
条件を満たした時点で繰返しを終える書き方。擬似言語では専用の文を使わず、論理型の見つけたフラグや位置を表す変数を用意し、while の条件に and で組み込んで抜けるのが一般的である。

例題 上のプログラムを1周ずつトレースすると sum はどう変化するか。

ループ前 sum=0。i=1: 1>3 は false なので sum=0+1=1。i=2: false なので sum=1+2=3。i=3: false なので sum=3+3=6。i=4: 4>3 は true なので sum=6+8=14。i=5: true なので sum=14+10=24。最終値は 24。表にすると (i, sum) = (1,1) (2,3) (3,6) (4,14) (5,24) となる。

例題 次の2つのプログラムで、cnt の最終値はそれぞれいくつか。

左(while)は 0、右(do while)は 1。while は先に x < 10 を調べるが x は 100 なので本体に入らない。do while は本体を先に実行するので cnt が 1 になり、その後で条件を調べて終わる。前判定と後判定の差がそのまま1回分の差になる。

例題 次の多重ループで、5行目は何回実行されるか。

6回。外側の i が 1 のとき内側の j は 1 の1回、i が 2 のとき j は 1, 2 の2回、i が 3 のとき j は 1, 2, 3 の3回まわるので、1+2+3 = 6 回になる。内側の終わりの値が外側の変数 i なので、単純な掛け算(3×3=9)にはならない点に注意する。

例題 配列から最初に 4 が現れる位置を求めたい。break を使わずにどう書くか。

見つけた位置を入れる変数 pos を 0 で初期化し、while の条件に「pos = 0」を and でつなぐ。4 を見つけると pos に位置が入り、次の条件判定で pos = 0 が false になるのでループが終わる。これが擬似言語での途中脱出の定番の形である。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング/IPA「試験で使用する情報技術に関する用語・プログラム言語など」Ver.5.1 別紙2 擬似言語の記述形式

配列と関数を読む

擬似言語の配列は要素番号が1から始まる。配列の走査と関数呼出し、値渡しまでを一気に押さえる。

配列は「整数型の配列: a」と宣言し、a ← {4, 9, 2, 7} のように波かっこで中身をまとめて入れられる。ここでいちばん重要なのは、擬似言語の要素番号が1から始まることだ。a[1] が先頭の 4 で、a[4] が末尾の 7 になる。多くのプログラミング言語は0から始まるので、経験者ほど1つずれる間違いをしやすい。

配列の長さは「aの要素数」と書く。この書き方を使うと、for (i を 1 から aの要素数 まで 1 ずつ増やす) と書くだけで、要素の個数が変わっても全部の要素を先頭から順に処理できる。この形が配列の走査の基本形で、科目Bのほとんどの配列問題はこの形の変形にすぎない。

二次元配列は「整数型の二次元配列: m」と宣言し、m ← {{1, 2, 3}, {4, 5, 6}} のように行を並べて書く。要素は m[行][列] の順で指定し、こちらも行・列とも1から数える。この例では m[1][3] が 3、m[2][1] が 4 になる。表を上から下へ、左から右へ読むイメージで添字を追うとよい。

関数は ○整数型: total(整数型の配列: a) のように、引数にも型を書いて宣言する。配列も引数として渡せる。呼び出す側は total(x) のように書き、return で返ってきた値をそのまま式の中で使える。戻り値のない手続は値を返さないので、代入の右辺には書けない。

関数の中で宣言した変数は、その関数の中でしか使えない。これを変数のスコープという。別の関数に同じ名前の変数があっても、それらは無関係の別物として扱われる。だから関数の中身を読むときは、その関数の中だけを見ればよい。

引数の渡し方は値渡しが基本だ。呼び出すときに引数の値がコピーされて関数に渡されるので、関数の中で引数の変数を書き換えても、呼び出した側の変数は変わらない。ただし配列を渡した場合は、配列そのもの(の参照)が共有され、関数の中で a[1] ← 0 のように要素を書き換えると呼び出し元にも影響することがある。設問では「配列の要素を書き換えているか」を必ず確認する。

配列の走査と、配列を引数に取る関数の呼び出し

// 配列の中で 3 より大きい要素だけを合計する関数
○整数型: total(整数型の配列: a)
  整数型: i
  整数型: s
  s ← 0
  for (i を 1 から aの要素数 まで 1 ずつ増やす)
    if (a[i] > 3)
      s ← s + a[i]
    endif
  endfor
  return s

○main()
  整数型の配列: x
  x ← {2, 5, 3, 8}
  出力(total(x))    /* 5 + 8 = 13 が出力される */
配列 a ← {4, 9, 2, 7} の要素番号と値
書き方指すもの
a[1]先頭の要素4
a[2]2番目の要素9
a[3]3番目の要素2
a[4]末尾の要素7
aの要素数要素の個数4
a[aの要素数]末尾の要素(長さが変わっても正しい)7
a[0]存在しない(0から始まらない)
配列
同じ型の値を並べて番号で取り出せるようにしたもの。擬似言語では「整数型の配列: a」と宣言し、a ← {4, 9, 2, 7} と初期化する。要素の取り出しは a[i] と書き、番号は1から始まる。
要素番号は1から
擬似言語の配列は先頭が a[1]、末尾が a[要素数] である。C言語やPythonのように0から始まるわけではないので、a[0] は存在しない。走査のループも 1 から始めるのが基本形になる。
aの要素数
配列 a に入っている要素の個数を表す書き方。for (i を 1 から aの要素数 まで 1 ずつ増やす) と書けば、配列の長さに依存しない走査ができる。末尾の要素は a[aの要素数] で取り出せる。
二次元配列
行と列の2つの番号で要素を指定する配列。「整数型の二次元配列: m」と宣言し、m ← {{1, 2, 3}, {4, 5, 6}} のように書く。m[i][j] は i 行 j 列の要素で、行も列も1から数える。
走査
配列の要素を先頭から順に1つずつ調べていくこと。合計を求める、最大値を探す、条件に合う個数を数えるといった処理は、すべて走査の中で変数を更新する形で書ける。科目Bの基本パターンである。
スコープ
変数が使える範囲のこと。関数の中で宣言した変数はその関数の中だけで有効で、関数を抜けると消える。別の関数に同名の変数があっても互いに影響しないので、関数は独立した部品として読める。
値渡し
呼び出し時に引数の値をコピーして関数に渡す方式。関数の中でその引数を書き換えても、呼び出した側の変数の値は変わらない。整数や文字列を渡した場合の基本の考え方である。

例題 上の total を a ← {2, 5, 3, 8} で呼んだとき、8行目は何回実行されるか。

2回。i=1 は 2 > 3 が false、i=2 は 5 > 3 が true で s=5、i=3 は 3 > 3 が false(3は3より大きくない)、i=4 は 8 > 3 が true で s=13。条件が true になるのは i=2 と i=4 の2回だけである。3 が含まれないことに注意する。

例題 m ← {{1, 2, 3}, {4, 5, 6}} のとき、m[1][3] + m[2][1] はいくつか。

7 になる。m[1] は1行目の {1, 2, 3} なので m[1][3] はその3番目で 3。m[2] は2行目の {4, 5, 6} なので m[2][1] はその1番目で 4。3 + 4 = 7。行も列も1から数えるので、m[0][0] のような書き方はしない。

例題 次のプログラムで出力される値は何か。値渡しの意味を考えて答えること。

5 と 10 の順で出力される。twice に渡されるのは v の値のコピーなので、関数の中で n ← n × 2 としても呼び出し元の v は 5 のままである。関数が返した値を受け取った w だけが 10 になる。引数を書き換えても呼び出し元に伝わらないのが値渡しである。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング/IPA「試験で使用する情報技術に関する用語・プログラム言語など」Ver.5.1 別紙2 擬似言語の記述形式

データ構造とアルゴリズム(科目B)

リスト・スタック・キューを擬似言語で扱う

科目Bで最も出題が多い「つながりをたどるデータ構造」を、擬似言語のコードとして読めるようにします。

単方向リストは「値」と「次にどこへ行くか」を1組にしたノードをつないだ構造です。科目Bの問題では、ノードを二つの配列で表す書き方がよく使われます。値[i] に i 番目のノードが持つ値を入れ、次[i] に「i の次のノードの添字」を入れます。次[i] が 0 のときはそこがリストの終わりです。配列の添字の順番とリストの順番は一致しないのが普通で、先頭 という変数が「どの添字から読み始めるか」を持ちます。走査は 整数型: p ← 先頭 としてから while (p ≠ 0) の中で p ← 次[p] を繰り返す、という形が定型です。この p ← 次[p] を書けるかどうかが第一関門です。

挿入と削除は「つなぎ替えの順番」がすべてです。添字 p のノードの直後に新しいノード q を入れるなら、先に 次[q] ← 次[p] として新ノードの行き先を確保し、そのあとで 次[p] ← q とします。逆の順で書くと 次[p] が上書きされてしまい、p の後ろにつながっていたノードへ二度とたどり着けなくなります。削除は逆で、p の直後のノード q を外すには 次[p] ← 次[q] とします。配列の要素を実際に消す必要はなく、たどれなくなればリストからは外れたことになります。配列と違って途中への挿入・削除が要素の移動なしにできる反面、n 番目の要素を取り出すには先頭から順にたどるしかない、というのがリストの性質です。

スタックは後入れ先出し(LIFO)、キューは先入れ先出し(FIFO)です。スタックは配列 st と「今どこまで積んだか」を表す sp の組で書きます。push は sp ← sp + 1 のあと st[sp] ← x、pop は v ← st[sp] のあと sp ← sp - 1 で、push と pop で sp の増減と代入の順が逆になる点に注意してください。キューは取り出し位置 head と入れる位置 tail の二つを持ちます。単純に増やし続けると配列の末尾で行き止まりになるので、実際には末尾まで来たら先頭に戻る環状キュー(リングバッファ)にします。1始まりの配列で n 個ぶんを一周させるときの戻し方は、添字が n を超えたら n を引く、と書くのが確実です。

リストを先頭からたどって値を合計する(戻り値は 10+20+30+50 = 110)

整数型の配列: 値 ← {30, 10, 20, 50}
整数型の配列: 次 ← {4, 3, 1, 0}
整数型: 先頭 ← 2

○整数型: 合計()
  整数型: s ← 0
  整数型: p ← 先頭
  while (p ≠ 0)
    s ← s + 値[p]
    p ← 次[p]
  endwhile
  return s
配列2本で単方向リストを表す(先頭 ← 2 のとき 10 → 20 → 30 → 50 と並ぶ)
添字 i値[i]次[i]リスト上の位置
13043番目
21031番目(先頭)
32012番目
45004番目(終端)
単方向リスト
各ノードが値と「次のノードを指す情報」だけを持つ線形リスト。先頭から順方向にしかたどれない。途中への挿入や削除はつなぎ替えだけで済むが、k番目の要素を得るには先頭からk回たどる必要がある。
番兵
リストや配列の終わりを表すために置く特別な値。配列でリストを表すときは、次の添字として存在しない値0を入れて終端を示すことが多い。終端判定の条件式を単純にできるのが利点である。
スタック
最後に入れたものを最初に取り出す後入れ先出し(LIFO)のデータ構造。積む操作をプッシュ、取り出す操作をポップと呼ぶ。関数呼出しの戻り先の管理や、式の評価、深さ優先の探索に使われる。
キュー
最初に入れたものを最初に取り出す先入れ先出し(FIFO)のデータ構造。入れる操作をエンキュー、取り出す操作をデキューと呼ぶ。処理待ち行列や幅優先の探索に使われる。
リングバッファ
固定長の配列の末尾と先頭を論理的につないで環状に使うキューの実装。添字が配列の末尾を超えたら先頭へ戻す。要素の移動なしに一定の領域を再利用できるため、入出力の緩衝領域などに使われる。

例題 添字1のノードの直後に、添字5のノード(値60)をつなぎたい。どう書けばよいか。

次[5] ← 次[1] を先に書き、そのあと 次[1] ← 5 と書く。配列は5要素ぶん用意されているものとする。上の表では 次[1] は 4 なので、次[5] ← 4、次[1] ← 5 となり、リスト全体は 10 → 20 → 30 → 60 → 50 の順になる。順序を逆にして 次[1] ← 5 を先に書くと、もとの 次[1](=4)が失われ、添字4のノードにたどり着けなくなる。

例題 空のスタックに 4, 8, 2 の順にプッシュし、ポップを2回行うと何が取り出されるか。

後入れ先出しなので、最後に入れた2が先に出て、次に8が出る。取り出す順は 2, 8。同じ操作をキューで行うと先入れ先出しなので 4, 8 の順になる。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(データ構造)

探索と整列を擬似言語で読む

線形探索・2分探索と、バブル・選択・挿入の3つの整列を、コードの動きとして追えるようにします。

線形探索は先頭から順に比べていくだけの探索です。for (i を 1 から xの要素数 まで 1 ずつ増やす) の中で if (x[i] = k) なら return i、最後まで見つからなければ return -1 とするのが定型です。見つかった時点で return するか、変数に控えて最後まで回すかで意味が変わり、前者は最初に現れた位置、後者は最後に現れた位置を返します。平均比較回数は要素数の約半分、最悪は要素数と同じで、計算量は O(n) です。整列されていなくても使える点が長所です。

2分探索は整列済みの配列にしか使えませんが、1回の比較で候補を半分に減らせます。lo(範囲の下端)と hi(範囲の上端)を持ち、mid ← (lo + hi) ÷ 2 の商 として真ん中を見ます。x[mid] が目的の値なら終了、x[mid] が小さければ答えは右半分にあるので lo ← mid + 1、大きければ左半分なので hi ← mid - 1 とします。ここで lo ← mid や hi ← mid と書いてしまうと範囲が縮まらず、無限ループになることがあるので、必ず mid を範囲から外す +1 / -1 が要ります。lo > hi になったら見つからなかったということです。最悪比較回数は要素数 n に対して 2 のべき乗で n を超える最小の指数、つまり log2(n) の切捨てに1を足した値になります。

基本的な整列は3つ押さえます。バブルソートは隣り合う2要素を比べて逆順なら交換することを繰り返し、1回のパスで最大値が右端に確定します。選択ソートは未整列部分の最小値の位置をまず探し、その要素と未整列部分の先頭を交換します。挿入ソートは、すでに整列済みの左側へ次の要素を差し込む方式で、差し込む場所が見つかるまで要素を1つずつ右へずらします。3つとも比較回数はおよそ n(n-1)/2 回で計算量は O(n^2) ですが、挿入ソートはほぼ整列済みのデータで速く、選択ソートは交換回数が n-1 回以下で済む、といった違いがあります。整列済みの列を2本つなぐマージは、両方の先頭を比べて小さいほうを取り出し、取り出したほうの添字だけを進める、という手順です。

2分探索の定型。mid を範囲から必ず外すのがポイント

○整数型: 2分探索(整数型の配列: x, 整数型: k)
  /* x は昇順に整列済み */
  整数型: lo ← 1
  整数型: hi ← xの要素数
  整数型: mid
  while (lo ≦ hi)
    mid ← (lo + hi) ÷ 2 の商
    if (x[mid] = k)
      return mid
    elseif (x[mid] < k)
      lo ← mid + 1
    else
      hi ← mid - 1
    endif
  endwhile
  return -1
整列済み配列 {2, 5, 8, 11, 14, 17, 21, 26} から 21 を2分探索する
lohimidx[mid]判定と次の動き
11841111 < 21 なので lo ← 5
25861717 < 21 なので lo ← 7
378721一致したので 7 を返す
線形探索
配列の先頭から順に目的の値と比較していく探索法。整列されていなくても使える。要素数nに対して最悪n回、平均で約n/2回の比較が必要で、計算量はO(n)である。
2分探索
整列済みの配列に対し、範囲の中央の要素と比較して探索範囲を半分ずつ狭めていく探索法。計算量はO(log n)。整列されていることが前提で、要素の挿入や削除が多いデータには向かない。
バブルソート
隣り合う2つの要素を比較し、順序が逆なら交換する操作を繰り返す整列法。1回の走査ごとに未整列部分の最大値が末尾に確定する。比較回数は約n(n-1)/2回で計算量はO(n^2)である。
選択ソート
未整列部分から最小(または最大)の要素を選び、未整列部分の先頭と交換することを繰り返す整列法。比較回数は約n(n-1)/2回だが、交換回数はn-1回以下に抑えられる。
挿入ソート
整列済みの部分に対して次の要素を正しい位置へ差し込む整列法。差し込み位置より後ろの要素を1つずつずらす。ほぼ整列済みのデータでは比較・移動が少なく、最良の場合O(n)で済む。
マージ
整列済みの二つの列の先頭どうしを比較し、小さいほうを取り出して新しい列に並べる併合処理。取り出した側の添字だけを進める。二つの列の要素数の和に比例する時間で済み、マージソートの中核となる。

例題 {5, 3, 8, 1, 9, 2} をバブルソートしたとき、外側のループを1回終えた時点の並びは。

隣どうしを左から比べて逆順なら交換する。5と3を交換して {3,5,8,1,9,2}、5と8はそのまま、8と1を交換して {3,5,1,8,9,2}、8と9はそのまま、9と2を交換して {3,5,1,8,2,9}。最大値9が右端に確定している。

例題 要素数1,000の整列済み配列を2分探索するとき、比較は最大で何回か。

1回の比較で候補が半分以下になるので、2の9乗=512では足りず、2の10乗=1,024で1,000を上回る。したがって最大10回。要素数が2倍になっても1回しか増えないのが2分探索の強みである。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(アルゴリズム)

木と再帰

2分木の3つの走査順と、再帰関数がどの順に呼ばれてどこまで深くなるかを読み解きます。

2分木は、各節が高々2つの子(左と右)を持つ木構造です。科目Bでは配列2本で表すことが多く、L[p] に節 p の左の子の添字、R[p] に右の子の添字を入れ、子がないときは 0 とします。走査(トラバーサル)は3種類あり、自分自身を出力するタイミングだけが違います。前順(行きがけ順)は「自分・左・右」、中順(通りがけ順)は「左・自分・右」、後順(帰りがけ順)は「左・右・自分」です。2分探索木を中順で走査すると値が昇順に並ぶこと、後順は部分木の結果を集めてから自分を処理するので式の計算や領域の解放に向くこと、を合わせて覚えておくと選択肢を絞りやすくなります。

再帰関数は「終了条件」と「自分より小さい問題への呼び出し」の二つでできています。終了条件がないか、引数が小さくならないと、呼び出しが戻ってこず無限再帰になります。空欄補充では 階乗(n - 1) を 階乗(n) と書いた選択肢、最大(x, mid + 1, hi) を 最大(x, mid, hi) と書いた選択肢がよく並びますが、これらは範囲が縮まらないため誤りです。呼び出しの途中の状態(戻り先や局所変数)はスタックに積まれるので、再帰の深さがそのままスタックの深さになります。階乗のように一直線に呼ぶ再帰は深さ n、2分木の走査は木の高さぶんの深さになります。

再帰の呼び出し回数は、木の形を思い浮かべて数えます。フィボナッチを fib(n) = fib(n-1) + fib(n-2) と素直に再帰で書くと、同じ値が何度も計算されるため呼び出し回数が急激に増えます。呼び出し総数を C(n) とすると C(1) = C(2) = 1、C(n) = 1 + C(n-1) + C(n-2) となり、C(6) は15回にもなります。これを避けるには、前の2つの値だけを変数で持ち回る反復版に書き換えるか、計算済みの値を配列に覚えておきます。一方、分割統治は問題を半分ずつに割ってから合わせる方式で、割るたびに大きさが半分になるので深さは log2(n) 程度にとどまり、マージソートや2分探索の考え方の土台になります。

前順(1) は A B D E C、中順(1) は D B E A C の順に出力する

文字列型の配列: v ← {"A", "B", "C", "D", "E"}
整数型の配列: L ← {2, 4, 0, 0, 0}
整数型の配列: R ← {3, 5, 0, 0, 0}

○前順(整数型: p)
  if (p ≠ 0)
    出力(v[p])
    前順(L[p])
    前順(R[p])
  endif

○中順(整数型: p)
  if (p ≠ 0)
    中順(L[p])
    出力(v[p])
    中順(R[p])
  endif
配列2本で表した2分木(節1が根)と3つの走査結果
添字 pv[p]L[p]R[p]
1A23
2B45
3C00
4D00
5E00
前順(行きがけ順)
2分木の走査順の一つで、節自身を処理してから左部分木、右部分木の順にたどる。木構造をそのままの形で書き出したいときや、木の複製を作るときに使われる。preorderともいう。
中順(通りがけ順)
左部分木、節自身、右部分木の順にたどる走査。2分探索木を中順で走査すると、格納された値が昇順に取り出せる。inorderともいう。
後順(帰りがけ順)
左部分木、右部分木をたどってから最後に節自身を処理する走査。部分木の結果を使って自分の値を決める処理、たとえば木の高さの計算や式の値の計算に適する。postorderともいう。
再帰
関数や手続が自分自身を呼び出す書き方。必ず終了条件を持ち、呼び出しのたびに問題が小さくなる必要がある。呼び出しごとの戻り先や局所変数はスタックに積まれるため、深さに比例した記憶域を消費する。
分割統治法
問題を同じ形の小さい部分問題に分割し、それぞれを解いてから結果を統合する設計手法。2分探索、マージソート、クイックソートが代表例で、分割のたびに大きさが半分になるものは深さがlog nに収まる。

例題 上の木を後順(帰りがけ順)で走査すると、どの順に出力されるか。

左部分木、右部分木、自分の順なので、節2の下から D、E、続いて節2の B、次に右部分木の C、最後に根の A。すなわち D E B C A となる。前順の A B D E C、中順の D B E A C と比べると、自分を出す位置だけが違うことが分かる。

例題 fib(n) = fib(n-1) + fib(n-2)(fib(1) = fib(2) = 1)を素直に再帰で書いたとき、fib(5) を求めるのに fib は何回呼び出されるか。

呼び出し総数を C(n) とすると C(1) = C(2) = 1、C(n) = 1 + C(n-1) + C(n-2)。C(3) = 3、C(4) = 5、C(5) = 9 回となる。n が1増えるごとに回数がおよそ1.6倍になるため、n が大きいと実用にならない。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング

プログラムの設計と読解

文字列とデータの加工

文字の並びや表(二次元配列)を1つずつ見ていって、数える・比べる・作り替える型が読めるようになります。

科目Bの擬似言語では、配列の要素番号(添字)が1から始まります。先頭が a[1] で、最後が a[aの要素数] です。多くのプログラミング言語が0から始まるので、ここを取り違えると答えがすべてずれます。まず「1から要素数まで」が全要素を1回ずつ見る書き方だと体に入れてください。for (i を 1 から aの要素数 まで 1 ずつ増やす) は、終わりの値である aの要素数 も含めて実行されます。逆に for (i を 1 から 0 まで 1 ずつ増やす) のように、始まりが終わりより大きいときは1回も実行されません。要素数が0の配列を渡したときにこの形になるので、空の配列の扱いを考えるときの手がかりになります。

文字列は、文字型の配列として扱われることがよくあります。s[1] が1文字目、s[sの要素数] が最後の文字です。文字どうしを比べるときは = と ≠ を使います(多くの言語で使う二重の等号は、擬似言語では使いません)。文字列をつなぐときは + を使います。文字の並びを1つずつ見ていく処理を走査(トラバース)といい、「特定の文字を数える」「最初に現れる位置を探す」「条件に合う文字だけを取り出す」といった処理は、すべてこの走査の上に作られています。

走査には型があります。1つ目は累算です。cnt ← 0 や sum ← 0 のように結果をためる変数を先に用意し、繰返しの中で少しずつ足していきます。この変数を累算変数といいます。初期値を何にするかが要注意で、合計なら0、積なら1、最大値なら「先頭の要素」にするのが安全です。最大値の初期値を0にしてしまうと、すべての要素が負のときに0という存在しない値を返してしまいます。2つ目は状態の記憶です。論理型の変数(フラグ)に「いま単語の途中かどうか」「まだ条件を満たしているか」を覚えさせ、繰返しの外で最終判断をします。3つ目は2本の添字です。先頭から進む i と末尾から戻る j を同時に動かし、i < j の間だけ繰り返せば、回文の判定や配列の反転が書けます。

回文とは、前から読んでも後ろから読んでも同じ並びのことです。s[i] と s[n - i + 1] が対になります。n - i + 1 という式は、i = 1 のとき n、i = n のとき 1 になる「折り返しの式」で、反転でも頻出します。反転を破壊的に行うときは、必ず作業用の変数を1つ用意して三角形に値を移します。tmp を使わずに a ← b、b ← a と書くと、1行目で a の元の値が消えてしまい、両方が b の値になります。これは科目Bで実際によく出るバグです。

数値と文字の変換もよく出ます。文字の "7" と数値の 7 は別物なので、そのままでは計算できません。数字の並びを数値にするときは、v ← v × 10 + その桁の数値 を先頭の桁から繰り返します。"2047" なら 0→2→20→204→2047 と育っていきます。逆に数値を文字にするときは、10 で割った余りを取り出して対応する文字に置き換え、商が0になるまで繰り返します(この場合は下の桁から出てくるので、最後に反転が要ります)。

二次元配列は表です。m[i][j] は i 行目 j 列目を指します。行数は mの要素数、i 行目の列数は m[i]の要素数 で表します。外側の繰返しで行を、内側の繰返しで列を回すのが基本形で、これを行優先の走査といいます。外と内を入れ替えれば列優先になります。行ごとの合計を出してから、その中の最大や最小を求めるといった二段構えの集計は定番です。このとき、行の集計用変数を内側の繰返しに入る直前で必ず初期化しないと、前の行の値が残って誤った結果になります。初期化の位置が繰返しの内か外かは、必ず行番号で確かめてください。

走査の3つの型(数える/2本の添字/二次元)

/* 例1: 文字型の配列 s の中の文字 c の個数を数える */
○整数型: countChar(文字型の配列: s, 文字型: c)
  整数型: i
  整数型: cnt ← 0
  for (i を 1 から sの要素数 まで 1 ずつ増やす)
    if (s[i] = c)
      cnt ← cnt + 1
    endif
  endfor
  return cnt

/* 例2: 2本の添字で配列を反転する(tmp が必須) */
○reverse(文字型の配列: s)
  整数型: i ← 1
  整数型: j ← sの要素数
  文字型: tmp
  while (i < j)
    tmp ← s[i]
    s[i] ← s[j]
    s[j] ← tmp
    i ← i + 1
    j ← j - 1
  endwhile

/* 例3: 二次元配列を行優先で走査して全体の合計を出す */
○整数型: total(整数型の二次元配列: m)
  整数型: i, j
  整数型: s ← 0
  for (i を 1 から mの要素数 まで 1 ずつ増やす)
    for (j を 1 から m[i]の要素数 まで 1 ずつ増やす)
      s ← s + m[i][j]
    endfor
  endfor
  return s
科目Bで頻出する走査の型(nは要素数)
書き方の骨格初期値の決め方要素数0のときの動き
個数を数えるfor (i を 1 から n まで) の中で cnt ← cnt + 1cnt ← 0繰返しが実行されず0が返る
合計・平均sum ← sum + a[i]sum ← 0合計は0。平均は0除算になるので分岐が必要
最大・最小if (a[i] > mx) mx ← a[i]mx ← a[1](0にしない)a[1] が無いので事前の分岐が必要
探索(見つけたら終わり)if (a[i] = x) return i見つからないときの戻り値を決める繰返しが実行されず「なし」が返る
2本の添字(反転・回文)i ← 1、j ← n、while (i < j)i は先頭、j は末尾条件が成り立たず何もしない
二次元の集計外で行、内で列を回す行ごとの変数は内側に入る直前で初期化行が無いので初期値がそのまま残る
添字(そえじ)
配列の何番目かを表す番号。擬似言語では1から始まり、a[1] が先頭、a[aの要素数] が末尾。0から始まる言語の感覚のまま読むと、答えが1つずれる原因になる。
走査(トラバース)
配列や文字列の要素を先頭から末尾まで1つずつ順に見ていくこと。数える、探す、集計する、作り替えるといった処理は、ほとんどがこの走査を土台にして書かれている。
累算変数
繰返しの中で結果をためていく変数。合計なら0、積なら1、最大値なら先頭の要素で初期化するのが安全。初期値の選び方を誤ると、要素がすべて負のときなどに誤った値を返す。
フラグ変数
論理型の変数で、処理の途中の状態(見つかったか、単語の途中か など)を覚えておくために使う。繰返しの中で true や false を設定し、繰返しを抜けた後で最終判断をする。
回文
前から読んでも後ろから読んでも同じになる並び。s[i] と s[n - i + 1] を対にして比べる。要素数が0や1のときは比較が1回も起きず、定義上は回文として扱われる。
折り返しの式 n - i + 1
要素数 n の配列で、先頭から i 番目に対応する末尾からの位置を表す式。i が1のとき n、i が n のとき1になる。反転・回文・左右対称の判定でくり返し登場する。
二次元配列
行と列をもつ表の形のデータ。m[i][j] が i 行 j 列の要素。行数は mの要素数、i 行目の列数は m[i]の要素数 で表す。外側で行、内側で列を回すのが行優先の走査。
破壊的な入替え
配列の要素そのものを書き換えて並びを変えること。a[i] と a[j] を入れ替えるには作業用変数 tmp が必須で、tmp を使わないと片方の値が上書きされて消える。

例題 s ← {"a", "b", "r", "a", "c", "a"} のとき、上の countChar(s, "a") はいくつを返すか。

3。i を1から6まで動かし、s[1]、s[4]、s[6] が "a" と一致するので cnt が3回増える。要素数6の配列に対して繰返しは6回であり、5回でも7回でもないことを、繰返しの終わりが「6を含む」ことから確認しておく。

例題 反転の手続きで tmp を使わず、s[i] ← s[j]、s[j] ← s[i] と2行だけ書くとどうなるか。

1行目で s[i] に s[j] の値が入り、s[i] の元の値は失われる。2行目の s[i] はすでに書き換わった値なので、s[j] にも同じ値が入り、両方が元の s[j] の値になってしまう。{a, b} を渡すと {b, b} になる。入替えには必ず作業用変数が要る。

例題 行ごとの合計を求めるとき、s ← 0 を外側の繰返しの外に置いてしまうと何が起こるか。

1行目の合計に2行目の値が足し込まれ、行ごとの合計ではなく先頭からの累計になる。行ごとの値を出したいなら、s ← 0 は外側の繰返しに入った直後、内側の繰返しの手前に置く。初期化の位置は行番号で必ず確認する。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング/IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング

オブジェクト指向の擬似言語

クラス定義の擬似言語を、メンバ変数・コンストラクタ・メソッド・継承の順に落ち着いて読めるようになります。

科目Bでは、手続きだけでなくクラスの形で書かれたプログラムも出ます。クラスとは、データ(メンバ変数)と、そのデータを扱う操作(メソッド)をひとまとめにした型の定義です。設計図にあたるものなので、それ自体は値を持ちません。設計図から実際に値をもつ実体を作ったものがインスタンス(オブジェクト)で、作る操作をインスタンス化といいます。1つのクラスから、値の違うインスタンスをいくつでも作れます。データと操作をまとめて外から中身を直接いじれないようにする考え方をカプセル化といい、外に見せる操作の入口をインタフェースといいます。

クラス定義の書き方は問題ごとに冒頭で説明されるので、その場で読み取るのが基本です。この教材では、クラス: クラス名 で定義を始め、その中に メンバ変数の宣言、クラス名と同じ名前の手続き(コンストラクタ)、そのほかの手続き(メソッド)を字下げして並べる形で書きます。コンストラクタはインスタンスを作るときに1回だけ自動で呼ばれる特別なメソッドで、メンバ変数に初期値を入れる役目を持ちます。戻り値の型は書きません。c ← Counter(10) と書けば、Counter のコンストラクタに10が渡され、できたインスタンスが c に入ります。

メソッドの中では、自分のインスタンスのメンバ変数を名前だけで参照できます。ただし引数の名前がメンバ変数と同じだと、どちらを指すのか分からなくなります。そこで「自分自身」を表す this を付けて this.price と書き、引数のほうは price と書いて区別します。this.price ← price は「メンバ変数の price に、引数の price の値を代入する」という意味で、逆ではありません。この向きを取り違えると、メンバ変数がいつまでも初期値のままになります。インスタンスのメソッドを外から呼ぶときは、c.add(5) のように インスタンス名.メソッド名(引数) と書きます。

変数にインスタンスを代入したときの動きにも注意が要ります。p ← Box(3) の後に q ← p と書くと、インスタンスがもう1つ複製されるのではなく、p と q が同じ1つのインスタンスを指すようになります。この状態で q.set(8) を呼ぶと、p から見た値も8に変わります。別の実体が欲しいなら、q ← Box(3) のようにもう一度コンストラクタを呼ばなければなりません。配列やインスタンスは参照として渡されるという前提は、科目Bの引っ掛けどころです。

継承は、既にあるクラスの性質を引き継いで新しいクラスを作る仕組みです。引き継がれる側をスーパクラス(親クラス)、引き継ぐ側をサブクラス(子クラス)といいます。サブクラスは、スーパクラスのメンバ変数とメソッドをそのまま使えるうえに、自分だけの追加もできます。スーパクラスと同じ名前・同じ引数のメソッドをサブクラスで定義し直すことを、オーバーライド(上書き)といいます。名前が同じでも引数の並びが違うものを用意するオーバーロード(多重定義)とは別物なので、混同しないでください。

オーバーライドがあると、同じ呼出しの書き方でも、実際に動くメソッドはインスタンスの本当のクラスによって決まります。これが多相性(ポリモーフィズム)です。スーパクラス Animal に show() があり、その中から name() を呼んでいるとき、サブクラス Dog のインスタンスに対して show() を呼ぶと、中の name() は Dog のほうが動きます。show() 自体は Dog で上書きしていなくても、呼ばれる name() は上書きされたものになるという点が要注意です。逆に、サブクラスで上書きしていないメソッドは、スーパクラスのものがそのまま使われます。Animal 型の配列に Animal と Dog と Cat を混ぜて入れ、同じ書き方で回すだけで、それぞれに応じた結果が並ぶのが多相性の効き目です。

クラス定義・コンストラクタ・this・継承とオーバーライド

クラス: Counter
  /* メンバ変数 */
  整数型: value
  /* コンストラクタ(クラスと同名・戻り値の型を書かない) */
  ○Counter(整数型: value)
    this.value ← value
  /* メソッド */
  ○add(整数型: d)
    value ← value + d
  ○整数型: get()
    return value

クラス: TwiceCounter(Counter を継承する)
  ○TwiceCounter(整数型: value)
    this.value ← value
  /* add を上書きする(オーバーライド) */
  ○add(整数型: d)
    value ← value + d × 2

○整数型: main()
  Counter: a
  TwiceCounter: b
  a ← Counter(10)
  b ← TwiceCounter(10)
  a.add(3)
  b.add(3)
  return a.get() + b.get()
クラス定義の擬似言語の読み方(本教材の表記)
書き方意味読むときの注意
クラス: CounterCounter という名前のクラス定義の始まりこの行より下の字下げ部分が中身
整数型: valueメンバ変数 value の宣言インスタンスごとに別の値を持つ
○Counter(整数型: v)コンストラクタクラスと同名。戻り値の型を書かない
○add(整数型: d)戻り値のないメソッド呼出しは インスタンス.add(5)
○整数型: get()整数型を返すメソッド○の後ろが戻り値の型
this.value ← valueメンバ変数に引数を代入左がメンバ変数、右が引数。向きに注意
c ← Counter(10)インスタンス化コンストラクタに10が渡される
クラス: Dog(Animal を継承する)Dog は Animal のサブクラス同名メソッドを書けばオーバーライド
クラス
データ(メンバ変数)と操作(メソッド)をひとまとめにした型の定義。設計図にあたり、それ自体は値を持たない。同じクラスから値の異なるインスタンスをいくつでも作れる。
インスタンス(オブジェクト)
クラスから作られた、実際に値をもつ実体。作る操作をインスタンス化という。同じクラスの別インスタンスどうしは、メンバ変数の値を独立に持つ。
メンバ変数
クラスが持つデータを入れる変数。インスタンスごとに別の値を保持する。メソッドの中からは名前だけで参照でき、引数と名前が重なるときは this を付けて区別する。
コンストラクタ
インスタンスを作るときに1回だけ自動で呼ばれる特別なメソッド。クラスと同じ名前で、戻り値の型を書かない。メンバ変数に初期値を設定するのが主な役目。
this(自分自身)
メソッドの中で、そのメソッドが動いているインスタンス自身を指す書き方。this.x ← x は「メンバ変数 x に引数 x の値を入れる」意味で、代入の向きを逆に読まないよう注意する。
継承
既存のクラス(スーパクラス)の性質を引き継いで新しいクラス(サブクラス)を作る仕組み。共通部分を親にまとめられるので、同じ記述の重複を減らせる。
オーバーライド(上書き)
スーパクラスと同じ名前・同じ引数のメソッドを、サブクラスで定義し直すこと。呼び出したときはサブクラスのほうが動く。引数の並びを変えて別に定義するオーバーロードとは異なる。
多相性(ポリモーフィズム)
同じ呼出しの書き方でも、インスタンスの実際のクラスに応じて動くメソッドが変わる性質。スーパクラス型の配列に子クラスを混ぜても、同一の記述でそれぞれの動作をさせられる。
カプセル化
データと、それを扱う操作を1つにまとめ、外部からはメソッドを通じてしか触れないようにすること。内部の作りを変えても外側に影響が出にくくなる。

例題 上の main() の戻り値はいくつか。

29。a は Counter なので add(3) で 10 + 3 = 13。b は TwiceCounter で add が上書きされているので 10 + 3 × 2 = 16。get() は上書きしていないので Counter のものがそのまま使われ、16 を返す。13 + 16 = 29 になる。

例題 5行目の ○Counter(整数型: value) の中で、this を付けずに value ← value と書くとどうなるか。

左右とも引数の value を指すことになり、メンバ変数には何も入らない。メンバ変数は初期値のまま(未定義の値)で残る。名前が重なるときに、どちらを指すのかをはっきりさせるのが this の役目である。

例題 p ← Counter(5) の後に q ← p と書き、q.add(1) を呼んだとき、p.get() は何を返すか。

6を返す。q ← p はインスタンスの複製ではなく、p と q が同じ1つのインスタンスを指す状態になる。したがって q への操作は p からも見える。別の実体が欲しければ q ← Counter(5) のようにコンストラクタをもう一度呼ぶ必要がある。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類4:開発技術 中分類12:システム開発技術(オブジェクト指向設計)/IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング

仕様から手続きを組み立てる

仕様どおりに動くかを机上で確かめ、境界と計算量を押さえ、バグの位置を突き止める手順が身につきます。

科目Bの問題文には、たいてい「この手続きは何をするものか」という仕様が日本語で書かれています。まずこの仕様を、入力・出力・前提条件の3つに分けて書き出してください。入力は引数の型と意味、出力は戻り値の型と意味、前提条件は「要素数は1以上とする」「配列は昇順に整列済みとする」といった、成り立っていることにしてよい条件です。前提条件が書かれていない部分は、こちらで守らなければならない部分です。たとえば「要素数が0のときは0を返す」と仕様に書いてあるのに、手続きにその分岐が無ければ、それだけで仕様違反になります。

次に、実際に値を入れて手で動かします。これをトレースといいます。おすすめは表を作る方法です。左端に行番号または繰返しの回数、その右に変数を1列ずつ並べ、値が変わったところだけ書き込みます。頭の中だけで追うと必ずどこかで取り違えるので、面倒でも書くほうが速くて確実です。トレースする値の選び方にはこつがあり、答えが一目で分かる小さな入力(要素数3程度)と、境界の入力の2種類を用意します。

境界とは、動きが切り替わる境目のことです。科目Bで問われる境界はだいたい決まっています。要素数が0のとき、要素数が1のとき、探しているものが先頭にあるとき、末尾にあるとき、まったく無いとき、同じ値が複数あるとき、値がすべて負のとき、の7つです。要素数が0なら for (i を 1 から 0 まで 1 ずつ増やす) となって繰返しは1回も実行されず、累算変数の初期値がそのまま返ります。合計なら0で正しくても、平均なら0による除算になって破綻します。要素数が1なら、隣どうしを比べる繰返し(1 から n - 1 まで)はやはり0回です。探しているものが先頭にあるときは、繰返しの1回目で return できるか、末尾にあるときは最後の要素まで届くかを確かめます。同じ最大値が複数あるときは、比較に > を使うか ≧ を使うかで「最初の位置」か「最後の位置」かが変わります。この1文字が正解と誤答を分けます。

計算量は、入力の大きさ n が増えたときに手間がどう増えるかの見積りです。繰返しが1重なら n に比例して O(n)、二重で内側が n 回なら O(n^2)、二重でも内側が i + 1 から n までなら回数は n(n - 1) / 2 なので、やはり O(n^2) です。半分ずつ候補を捨てていく二分探索は O(log n) で、要素数1000なら最悪10回の比較で終わります(2の9乗が512、2の10乗が1024なので、1024以下なら10回で足りる)。整列は、単純な交換法(バブルソート)や選択法・挿入法が O(n^2)、クイックソートやマージソート、ヒープソートが平均 O(n log n) です。定数倍は無視して、n が大きくなったときの増え方だけを見るのが計算量の考え方です。

バグを直すときは、当てずっぽうに書き換えず、位置を絞ってから直します。手順は3段階です。1つ目は、仕様どおりの結果と実際の結果が食い違う最小の入力を見つけること。2つ目は、その入力でトレースし、変数の値が初めておかしくなる行を特定すること。3つ目は、その行だけを仕様に照らして直すことです。頻出のバグは型が決まっていて、添字の1ずれ(n と n - 1、i と i + 1 の取り違え)、初期化の位置ずれ(内側の繰返しに入る前で初期化すべき変数を外に置いた)、最大値の初期値を0にした、入替えで作業用変数を使わなかった、境界の分岐が抜けている、比較演算子の > と ≧ の取り違え、の6つです。選択肢に行番号が書いてあるときは、必ずその行を目で追って、書いてあるとおりの記述かどうかを先に確かめてください。

二分探索の本体とトレース表、そして要素数0の境界

/* 仕様: 昇順に整列済みの配列 a から値 x を二分探索する。 */
/*       見つかればその添字、見つからなければ0を返す。   */
○整数型: bsearch(整数型の配列: a, 整数型: x)
  整数型: lo ← 1
  整数型: hi ← aの要素数
  整数型: mid
  while (lo ≦ hi)
    mid ← (lo + hi) ÷ 2 の商
    if (a[mid] = x)
      return mid
    elseif (a[mid] < x)
      lo ← mid + 1
    else
      hi ← mid - 1
    endif
  endwhile
  return 0

a ← {2, 5, 8, 11, 14, 17, 20}、x ← 17 のトレース
  回  lo  hi  mid  a[mid]  判定
  1    1   7    4     11    11 < 17 なので lo ← 5
  2    5   7    6     17    一致するので 6 を返す

境界: aの要素数 が0のとき lo ← 1、hi ← 0 となり、
      7行目の lo ≦ hi が最初から成り立たないので0が返る
境界のチェックリストと、そこで起きやすい不具合
境界そこで何が起きるか確かめ方
要素数が0for (i を 1 から 0 まで) となり繰返しが0回。初期値がそのまま返る合計は0で正しいが、平均は0除算、最大値はa[1]の参照で破綻する
要素数が1隣どうしを比べる 1 から n - 1 までの繰返しが0回戻り値が初期値のままでよいかを仕様と照合する
目的の値が先頭繰返しの1回目で見つかる初期値やループ前の処理を飛ばしていないか
目的の値が末尾繰返しの最終回で見つかる終わりが n か n - 1 か。1つ手前で止まっていないか
該当なし繰返しを抜けた後の処理に進む見つからないときの戻り値が仕様どおりか
同じ最大値が複数> なら最初の位置、≧ なら最後の位置になる仕様がどちらを求めているかを読む
すべて負の値最大値の初期値を0にすると、存在しない0を返す初期値を a[1] にしているか
仕様
その手続きが何を受け取り、何を返し、どんな条件のもとで動くかを定めたもの。入力・出力・前提条件の3つに分けて読むと、確かめるべき点がはっきりする。
トレース(机上実行)
実際に値を入れて、プログラムを1行ずつ手で追いかけること。行番号と変数を表にして、値が変わったところだけ書き込むと、取り違えが起きにくい。
境界値
動きが切り替わる境目の入力。要素数0、要素数1、先頭・末尾に目的の値がある場合、該当なし、同じ値が複数ある場合などが代表例で、バグはここに集中する。
0による除算
0で割ろうとして処理が破綻すること。合計を要素数で割って平均を出す手続きでは、要素数が0のときに起きるため、割る前に要素数を調べる分岐が必要になる。
添字の1ずれ
n と n - 1、i と i + 1 のように、繰返しの範囲や参照位置が1つずれるバグ。末尾の要素を見落とす、または範囲外を参照する形で表れる。境界の入力で見つかりやすい。
計算量
入力の大きさ n に対して処理の手間がどう増えるかの見積り。1重の繰返しは O(n)、二重は O(n^2)、半分ずつ絞る二分探索は O(log n)。定数倍は無視して増え方だけを見る。
二分探索
昇順に整列済みの配列で、真ん中と比べて候補を半分ずつ捨てていく探索。1回の比較で候補が半減するので、要素数 n に対し最悪でも約 log2(n) 回の比較で終わる。
参照渡し
配列やインスタンスを引数として渡すとき、値の複製ではなく実体そのものを指す情報が渡されること。呼ばれた側で書き換えると、呼んだ側の配列も変わる。

例題 要素数1000の整列済み配列に対して二分探索を行うと、最悪で何回の比較が必要か。

10回。1回の比較で候補が半分以下になるので、1000→500→250→125→62→31→15→7→3→1→0 と10回で候補が尽きる。2の9乗が512で1000に足りず、2の10乗が1024で1000を超えるため、最悪10回という見方でもよい。線形探索なら最悪1000回である。

例題 「配列の最大値をもつ要素のうち最も前にあるものの添字を返す」仕様で、比較に ≧ を使うと何が起こるか。

同じ最大値が複数あるとき、後ろの要素でも条件が成り立って添字が更新され続けるため、最も後ろの位置を返してしまう。{4, 7, 7, 2} なら仕様上の答えは2だが3が返る。最も前を返したいなら > を使う。逆に最も後ろを返す仕様なら ≧ が正しい。

例題 二重の繰返しで、外側が i を 1 から n - 1、内側が j を i + 1 から n まで回るとき、内側の本体は何回実行されるか。

n(n - 1) / 2 回。i = 1 のとき n - 1 回、i = 2 のとき n - 2 回…と減っていく和になる。n = 100 なら 100 × 99 ÷ 2 = 4950 回である。二重の繰返しでも n^2 回ではないが、n が大きくなったときの増え方は n^2 に比例するので、計算量は O(n^2) と表す。

出典:IPA 基本情報技術者試験 シラバス Ver.9.2 大分類1:基礎理論 中分類2:アルゴリズムとプログラミング(アルゴリズムの設計・計算量)/IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アルゴリズムとプログラミング

情報セキュリティ(科目B)

場面で考える情報セキュリティ(インシデント対応・運用)

「こんなことが起きた。さあどうする」と問われたときに、迷わず正解の手順を選べるようになります。

科目Bの情報セキュリティは、用語の意味をそのまま尋ねる問題ではありません。職場で実際に起こりそうな場面が数行から十数行の文章で示され、「このとき最初に行うべきことはどれか」「原因として最も考えられるものはどれか」と問われます。知識そのものより、示された条件を読み取って、決められた手順のどこに当てはまるかを判断する力が問われます。逆に言えば、正しい手順を一度覚えてしまえば、場面が変わっても同じ考え方で解けます。

情報セキュリティインシデントとは、情報の機密性・完全性・可用性を損なう、または損なうおそれのある出来事のことです。マルウェア感染、不正アクセス、情報の紛失や誤送信、Webサイトの改ざんなどが該当します。対応は、検知(気付く)→初動(被害の拡大を止める)→分析(原因と影響範囲を調べる)→復旧(業務を元に戻す)→再発防止(原因を取り除き手順を直す)という流れで進みます。この順番が頭に入っていれば、「最初に行うべきこと」は初動の話だと分かります。

初動でいちばん大事なのは、被害を広げないことと、証拠を壊さないことです。マルウェア感染が疑われる端末は、まずネットワークから切り離します。有線ならLANケーブルを抜き、無線なら無線LANをオフにします。これで、ほかの端末への感染拡大や、外部への情報送信を止められます。一方で、電源は切りません。電源を切ると、メモリ上にしか存在しない実行中のプロセスや通信の状態といった揮発性の情報が消えてしまい、あとから原因を分析できなくなるからです。同じ理由で、自分の判断でウイルス対策ソフトの駆除を実行したり、ファイルを削除したり、端末を初期化したりしてはいけません。切り離したら、直ちに上長と情報システム部門、社内にCSIRT(シーサート:インシデント対応の専門チーム)があればCSIRTへ報告します。報告が遅れるほど被害は広がるので、「大したことではないかもしれない」と自分で判断して黙っていることが最悪の対応です。

対応と並行して、記録を残します。いつ何に気付いたか、どの端末で誰が使っていたか、何をしたか、その時刻はいつかを、時系列で書き留めます。記憶に頼って後からまとめると、時刻や順序が曖昧になり、原因の分析にも、監督官庁や取引先への報告にも使えません。記録は再発防止策を考えるときの材料にもなります。

人をだます攻撃も、場面問題の定番です。標的型攻撃メールは、業務に関係のありそうな件名や取引先を装った差出人で送られ、添付ファイルやリンクからマルウェアに感染させます。フィッシングは、銀行や通販サイトを装ったメールから偽サイトへ誘導し、IDやパスワードを入力させます。差出人の表示名やメールアドレスは簡単に詐称できるので、それらは本物である根拠になりません。判断の手掛かりになるのは、リンク先の実際のURLのドメインが正規のものと違う、といった詐称しにくい事実です。電話で情報システム部門を名乗ってパスワードを聞き出す、背後から画面をのぞき見る、ごみ箱の書類をあさるといった、技術ではなく人の隙を突く手口をソーシャルエンジニアリングといいます。共通の対処は、その場で答えず、いったん切って、社内の名簿にある正規の連絡先へ自分から掛け直して確認することです。

日々の運用にも決まりごとがあります。パスワードは使い回さないこと。ほかのサイトから流出したIDとパスワードの組合せをそのまま試すパスワードリスト攻撃が成立してしまうためです。退職者のアカウントは、人事の退職手続と連動させ、退職日をもって速やかに利用停止にします。離席するときは画面をロックし(クリアスクリーン)、机の上に書類や記録媒体を放置せず施錠できる場所にしまいます(クリアデスク)。会社が許可していない個人向けクラウドサービスや私物機器を業務に使うシャドーITは、会社が保護の状況を確認できないため禁止され、私物端末の業務利用(BYOD)を認める場合も、利用条件を定めた規程と管理のしくみが前提になります。業務を外部に委託するときは、契約に安全管理措置と再委託の条件を定め、委託先での実施状況を定期的に確認する責任が委託元に残ります。社外で公衆無線LANを使うときは、会社が用意したVPNで通信を暗号化してから社内システムに接続します。

選択肢を選ぶときのコツを挙げておきます。まず、被害の拡大を止める→証拠を残す→報告する、の順に考えます。次に、自分ひとりの判断で処理を完結させる選択肢、証拠を消す選択肢、相手の言い分をそのまま信じる選択肢は、ほぼ誤りです。「不審なメールの送信元に返信して確認する」「感染が疑われる端末の電源を切って再起動する」「気付いたファイルを削除して様子を見る」は、いずれもやってはいけない対応の代表例です。

インシデント記録は「時刻・事実・実施した措置」を時系列で残す

【インシデント記録の例】
10:12  営業部Aが取引先を装ったメールの添付ファイル(見積書.xlsm)を開いた
10:14  画面が一瞬暗転し、見覚えのないウィンドウが表示された
10:15  Aが端末PC-0412のLANケーブルを抜いた(電源は入れたまま)
10:17  Aが上長Bへ口頭で報告、BがCSIRTへ電話連絡
10:30  CSIRTが現地確認を開始(端末はそのまま、Aの操作は中止)
10:45  同一メールが営業部の12名へ届いていることをメールログから確認
11:00  該当メールの受信者へ、開かないよう全社周知
インシデント対応の流れと、各段階でやってはいけないこと
段階やることやってはいけないこと
検知異常に気付いたら事実を確認し、直ちに上長・情報システム部門(CSIRT)へ報告する自分で「大したことはない」と判断して報告しない、様子を見る
初動(封じ込め)感染が疑われる端末をネットワークから切り離す(LANケーブルを抜く、無線をオフ)。不正利用が疑われるアカウントを停止する電源を切る、再起動する、初期化する、ファイルを削除する、自分の判断で駆除を実行する
分析CSIRTや専門業者が、ログと端末の状態から侵入経路・影響範囲・持ち出された情報を調べる調査前に端末を使い続ける、ログを消す、時刻のずれた記録を放置する
復旧原因を取り除いたうえで、安全と確認できたバックアップから業務を戻し、パスワードを変更する原因が分からないまま元の状態に戻す、感染源と同じバックアップから復元する
再発防止記録をもとに原因を分析し、設定・手順・教育を見直して関係者へ共有する個人の不注意として片付け、手順もしくみも変えない
記録(全段階)気付いた時刻、経緯、対象の機器と利用者、実施した措置とその時刻を時系列で残す対応後に記憶を頼りに概要だけまとめる、記録を対象端末上だけに保存する
情報セキュリティインシデント
情報の機密性・完全性・可用性を損なう、または損なうおそれのある出来事。マルウェア感染、不正アクセス、情報の紛失・誤送信、Webサイトの改ざんなどが含まれる。
CSIRT
Computer Security Incident Response Team。インシデントの報告を受け付け、初動の指示、原因分析、関係先への連絡を担う専門チーム。利用者はまずここへ報告する。
初動対応(封じ込め)
被害の拡大を止めるための最初の措置。感染が疑われる端末をネットワークから切り離す、不正利用が疑われるアカウントを停止するなど。復旧より先に行う。
証拠保全
原因分析や報告のために、機器やログの状態を変えずに残すこと。感染端末の電源を落とさない、ファイルを削除しない、初期化しないといった行動がこれに当たる。
揮発性情報
電源が切れると失われる情報。実行中のプロセス、メモリ上のデータ、確立中の通信の状態などが該当し、これらが消えると感染の経路や動作を追えなくなる。
標的型攻撃メール
特定の組織や担当者を狙い、業務に関係がありそうな件名や実在の取引先を装って送るメール。添付ファイルやリンクを開かせてマルウェアに感染させることを狙う。
フィッシング
金融機関や通販サイトを装ったメールやSMSから偽サイトへ誘導し、IDやパスワード、カード番号を入力させて盗む手口。差出人表示やメール本文は容易に偽装できる。
ソーシャルエンジニアリング
技術ではなく人の心理や行動の隙を突いて情報を得る手口。電話でのなりすまし、肩越しに画面をのぞくショルダーハッキング、ごみをあさるトラッシングなど。
クリアデスク・クリアスクリーン
離席や退社の際に、机の上に書類や記録媒体を放置せず施錠保管すること(クリアデスク)と、画面をロックして内容を見られないようにすること(クリアスクリーン)。
シャドーIT
会社が把握・許可していない機器やクラウドサービスを、従業員が業務に使うこと。会社が保護の状況を確認できず、退職時の回収や漏えい時の追跡もできない。
BYOD
Bring Your Own Device。私物の端末を業務に使うこと。認める場合は、利用条件を定めた規程、端末管理のしくみ、紛失時の対応手順を整えたうえで運用する。
委託先の監督
業務を外部に委託しても、情報を守る責任は委託元に残るという考え方。契約に安全管理措置と再委託の条件を定め、実施状況を定期的に確認する必要がある。
パスワードリスト攻撃
ほかのサイトから流出したIDとパスワードの組合せを、そのまま別のサイトで試す攻撃。正しいパスワードで一度で成功するため、使い回しをやめることが最大の対策になる。
内部不正
従業員や委託先の関係者が、権限を悪用して情報を持ち出したり改ざんしたりすること。最小限の権限付与、操作ログの取得、持出しの制限で機会を減らす。

例題 社内の共有端末を使っていたところ、ウイルス対策ソフトが「駆除できない脅威を検出しました」と表示した。周囲に情報システム部門の担当者はいない。最初に行うべきことは何か。

端末をネットワークから切り離し(LANケーブルを抜く、無線LANをオフにする)、電源は入れたまま、上長と情報システム部門(CSIRT)へ報告する。ネットワークからの切離しは他端末への感染拡大と外部への情報送信を止めるためであり、電源を切らないのはメモリ上の揮発性情報という証拠を残すためである。自分でスキャンや削除、初期化を行うと、証拠が消えて原因を追えなくなる。

例題 取引先の担当者名で「請求書の件、添付をご確認ください」というメールが届いた。文面に不自然な点はないが、その取引先とは請求書のやり取りをした覚えがない。どう確認すればよいか。

そのメールに返信したり、本文中の連絡先へ問い合わせたりしてはいけない。差出人アドレスも本文も攻撃者が自由に書けるため、返信先が攻撃者になっている可能性がある。名刺や社内の取引先台帳など、そのメール以外の手段で調べた正規の電話番号へ自分から掛けて確認する。確認が取れるまで添付ファイルとリンクは開かず、情報システム部門にも共有する。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)インシデント対応・情報セキュリティ啓発/JIS Q 27002(情報セキュリティ管理策の実践)

設定と設計で守る(アクセス権・ログ・脆弱性)

アクセス権の表やファイアウォールのルール表を読んで、危ない設定を見つけられるようになります。

場面問題のもう一つの型が、設定の表を見せて「この中で見直すべきものはどれか」「この通信は許可されるか」と問うものです。表は難しく見えますが、読み方の型が決まっています。アクセス権の表なら「誰に」「どの資源に」「どこまでの権限を」与えているかを一行ずつ確かめ、ファイアウォールのルール表なら「送信元」「宛先」「プロトコルとポート」「許可か拒否か」を上から順に照合します。

アクセス権を設計するときの原則は三つです。第一に最小権限の原則で、業務に必要な最小限の権限だけを与えます。「念のため全社員に読み書きを与える」は原則違反です。第二に知る必要性(need-to-know)で、給与や人事評価のように、担当者以外が見る必要のない情報は、担当部門だけに限定します。第三に職務分掌(職務分離)で、不正が成立しないように、一連の処理を一人に完結させません。発注の登録と承認、伝票の起票と承認、プログラムの開発と本番環境への適用は、それぞれ別の人が行います。加えて、誰が使ったか分からなくなる共有アカウントは使わず、人事異動や退職に合わせて権限を棚卸しします。

ファイアウォールの通信許可ルールは、表の上から順に照合し、最初に一致した行の動作を適用して、そこで判定を終えます。最後の行に「すべて→すべて→拒否」を置き、明示的に許可した通信だけを通す方式(ホワイトリスト方式、暗黙の拒否)が基本です。設計の要点は、インターネットから内部LANへの通信を直接許可しないことです。外部に公開するサーバはDMZ(非武装地帯)に置き、インターネットからはDMZまで、DMZから内部へは必要な相手と必要なポートだけを許可します。もし「インターネット→内部のファイルサーバ」を許可する行があれば、それは直ちに削除すべき危険な設定です。

ログは、何かが起きた後に事実を再現するための唯一の手掛かりです。取得しているだけでは足りず、突き合わせられる状態と、消されない状態が要ります。複数の機器のログを時系列に並べるには、NTPで各機器の時計を同期させておく必要があります。時刻がずれていると、同じ通信が別々の時刻で記録され、前後関係が分からなくなります。また、ログが対象機器の中にだけあり、その機器の管理者が自由に消せる状態では、監査証跡(誰が何をしたかを後から追える記録)として信頼できません。ログは別のログ管理サーバへ随時転送し、運用担当者には変更・削除の権限を与えない、という権限の分離が有効です。保存期間もあらかじめ決めておきます。

脆弱性への対応は、優先順位の付け方が問われます。判断材料は、危険度・公開範囲・悪用の有無の三つです。危険度の目安になるのがCVSS(共通脆弱性評価システム)の基本値で、0.0〜10.0の数値で表し、9.0以上が緊急、7.0以上が重要、4.0以上が警告とされます。ただし数値だけで決めません。インターネットに公開しているサーバの脆弱性は、社内からしか触れないサーバより危険ですし、実際に悪用が確認されている脆弱性は最優先です。パッチはできれば検証環境で確認してから適用し、すぐ適用できない場合は、通信の制限や機能の停止といった暫定の回避策で危険をいったん下げます。

バックアップはランサムウェア対策の要です。指針としてよく使われるのが3-2-1ルールで、原本を含めてデータを3つ(原本と複製2つ)持ち、2種類の異なる媒体に保存し、そのうち1つは別の場所に置く、というものです。ここで重要なのは、常時ネットワークにつながったバックアップだけでは足りないという点です。ランサムウェアは接続されている共有フォルダやNASもまとめて暗号化するため、少なくとも一つはネットワークから切り離したオフラインの媒体、または書換えができないイミュータブルな保管にします。世代管理をして複数時点に戻せるようにし、実際に復元できるかを定期的に試すところまでが対策です。

残る守りは、暗号化と認証と作り方です。通信はTLSで暗号化し、持ち出す端末や媒体はストレージ全体を暗号化しておきます。OSのログインパスワードだけでは、ディスクを取り外して別の機器につながれると読まれてしまいます。認証は、パスワードに加えて所持(ワンタイムパスワードやICカード)や生体情報を組み合わせる多要素認証が有効で、パスワードが流出しても不正ログインを防げます。プログラムを作るときは、入力値の検査を必ずサーバ側でも行うこと(画面側の検査は迂回できます)、SQLはプレースホルダに値として渡すこと、画面に出す値はエスケープ処理をすること、エラー画面に内部の情報を出さないことを守ります。

ファイアウォールの通信許可ルールの例(上から順に照合し、最初に一致した行の動作を適用する)

No  送信元          宛先           プロトコル/ポート  動作
----------------------------------------------------------
1   インターネット  DMZ:Webサーバ  TCP/443            許可
2   内部LAN         DMZ:Webサーバ  TCP/443            許可
3   DMZ:Webサーバ   内部:DBサーバ  TCP/1521           許可
4   すべて          すべて         すべて             拒否
アクセス権の設計原則と、バックアップの3-2-1ルール
区分項目内容と、守られていない例
アクセス権最小権限の原則業務に必要な最小限の権限だけを与える。悪い例:念のため全社員に読み書きを許可する
アクセス権知る必要性業務上知る必要がある人だけに開示する。悪い例:給与明細のフォルダを全社員が閲覧できる
アクセス権職務分掌登録と承認、開発と本番適用を別の人が行う。悪い例:発注の登録者が承認もできる
アクセス権個人単位の識別利用者ごとにアカウントを分ける。悪い例:部内で一つの共有アカウントを使い回す
アクセス権定期的な棚卸し異動・退職に合わせて権限を見直し、不要な権限を外す。悪い例:退職者のアカウントが有効のまま
バックアップ3(データを3つ)原本のほかに複製を2つ持ち、1か所の障害で全滅しないようにする
バックアップ2(2種類の媒体)ディスクとテープ、社内ストレージとクラウドのように、異なる種類の媒体に保存する
バックアップ1(1つは別の場所)1つは遠隔地に置く。火災・水害・盗難で同時に失われないようにする
バックアップオフライン保管少なくとも1つはネットワークから切り離す、または書換え不可の形式にする。常時接続のNASだけではランサムウェアに一緒に暗号化される
バックアップ世代管理と復元テスト複数時点に戻せるよう世代を残し、実際に復元できるかを定期的に確認する
最小権限の原則
利用者やプログラムに、業務の遂行に必要な最小限の権限だけを与える考え方。余分な権限は、誤操作による事故と、内部不正や乗っ取り時の被害範囲を広げる。
知る必要性
need-to-know。その情報を業務上知る必要がある人だけに開示するという原則。給与や人事評価などは、権限があっても必要のない者には見せない。
職務分掌
職務分離ともいう。一連の処理を一人で完結させず、登録と承認、開発と本番適用のように担当を分けること。不正やミスが一人の操作だけでは成立しなくなる。
アクセス権の棚卸し
現在誰にどの権限が付いているかを定期的に洗い出し、異動や退職で不要になった権限を外す作業。放置すると権限が積み上がり、最小権限が崩れる。
暗黙の拒否
ファイアウォールで、明示的に許可していない通信をすべて拒否する方式。ルール表の最後に「すべて→すべて→拒否」を置いて実現する。ホワイトリスト方式ともいう。
DMZ
非武装地帯。インターネットと内部LANのどちらからも切り離して設ける中間の区画。公開サーバをここに置き、インターネットから内部LANへ通信が直接届かないようにする。
NTP
Network Time Protocol。機器の時計をネットワーク越しに合わせるプロトコル。複数機器のログを時系列で突き合わせるには、時刻の同期が前提になる。
監査証跡
いつ誰が何をしたかを後から追跡できる記録。取得していることに加え、当事者が改ざん・削除できないよう保護されていて初めて証跡として信頼できる。
CVSS
共通脆弱性評価システム。脆弱性の深刻度を0.0〜10.0の数値で表す指標で、9.0以上が緊急、7.0以上が重要、4.0以上が警告の目安。公開範囲や悪用の有無と併せて判断する。
パッチ管理
脆弱性情報を収集し、対象資産を特定し、検証してから修正プログラムを適用する一連の運用。すぐ適用できないときは通信制限などの暫定的な回避策を取る。
3-2-1ルール
バックアップの指針。原本を含めてデータを3つ(原本と複製2つ)持ち、2種類の異なる媒体に保存し、そのうち1つは別の場所(遠隔地)に置く、という考え方。
オフラインバックアップ
取得後にネットワークや機器から切り離して保管するバックアップ。常時接続のNASはランサムウェアに一緒に暗号化されるため、切り離した複製が必要になる。
世代管理
複数の時点のバックアップを残しておくこと。最新の1本だけだと、改ざんや暗号化に気付く前に上書きしてしまい、正常な状態に戻せなくなる。
多要素認証
知識(パスワード)、所持(ワンタイムパスワード、ICカード)、生体(指紋、顔)のうち2種類以上を組み合わせる認証。パスワードが流出しても不正ログインを防げる。
サーバ側の入力値検証
利用者から届いた値を、サーバ側の処理でも必ず検査すること。画面側(ブラウザ)の検査は、攻撃者が直接リクエストを送れば迂回されるため、単独では対策にならない。
プレースホルダ
SQL文の値の部分を記号で置いておき、実行時に値として渡すしくみ(バインド機構)。入力値がSQL文の一部として解釈されなくなり、SQLインジェクションを防げる。

例題 上のルール表のとき、インターネット上のPCから内部:DBサーバへのTCP/1521の通信はどう扱われるか。

拒否される。No.1は宛先がDMZのWebサーバなので一致しない。No.2は送信元が内部LANなので一致しない。No.3は送信元がDMZのWebサーバなので一致しない。結局、最後のNo.4「すべて→すべて→拒否」に一致して拒否される。インターネットから内部LANへ直接届く経路を作らないのが、この設計の狙いである。

例題 毎晩、ファイルサーバの内容を常時接続のNASへ自動コピーしている。これで十分といえるか。

十分ではない。ランサムウェアに感染すると、端末から書き込める共有フォルダやNASもまとめて暗号化されるため、バックアップごと使えなくなる。少なくとも一つは、取得後にネットワークから切り離したオフラインの媒体か、書換えができない保管方式にし、複数世代を残す。さらに別の場所にも置けば3-2-1ルールを満たす。復元できることの定期確認も欠かせない。

出典:IPA 基本情報技術者試験 試験要綱 Ver.5.6 出題範囲(科目B試験)アクセス制御・ログ管理・脆弱性管理・バックアップ/JIS Q 27002(情報セキュリティ管理策の実践)