コンピュータサイエンス 基礎知識（データベース，ネットワーク，セキュリティ，システム開発，プログラムの作り方，システム構成と故障対策）

# はじめに
コンピュータサイエンスの基礎について，「[きたみりゅうじ．キタミ式イラストIT塾 基本情報技術者 令和04年．](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513/ref=sr_1_1?crid=OQ1P17GFX089&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88it%E5%A1%BE+%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E4%BB%A4%E5%92%8C02%E5%B9%B4+%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93&qid=1660449303&sprefix=%E3%81%8D%E3%81%9F%E3%81%BF%2Caps%2C274&sr=8-1)」で学習した基礎知識のまとめ．
今回の内容は，「データベース，ネットワーク，セキュリティ，システム開発，プログラムの作り方，システム構成と故障対策」．

# データベース
**DBMS[Data Base Management System]**：データベース管理システム．アプリケーションにデータベース機能を提供するミドルウェア

**スキーマ**：データベースの構造や仕様を定義するもの．
*　外部スキーマ：ビュー表．
*　概念スキーマ：表の定義．データベース本体．ハードウェア，プログラムに依存せず，データの独立性が保たれている．
*　内部スキーマ：ハードウェア等に物理的にどう記憶させるかを定義．

**正規化**：データに矛盾や重複をさせないことが．
*　非正規形：繰り返し部分を持つ．
*　第1正規形：繰り返し部分を除いた形．
関数従属：主キーが決まれば一意に決まる関係．
部分関数従属：複合キーの一部の項目だけで一意に決まる関係．
*　第2正規系：第1正規形の表から部分関数従属した列を切り出したもの．
*　第3正規形：第2正規形の表から主キー以外の列に関数従属している列を切り出したもの．

**SQL[Structured Query Language]**：DBMSへ指示を伝えるために用いる言語．
*　DDL[Data Definition Language]：データ定義言語．スキーマの定義や表の作成といった定義．
*　DML[Data Manipulation Language]：データ操作言語．データの抽出，更新，削除を操作．

**トランザクション管理と排他制御**
*　トランザクション：一連の処理のひとかたまり．
*　ACID特性：Atomicity(原子性：全て実行されるか，全く実行されないか),Consistency(一貫性：矛盾がない状態か),Isolation(隔離性：排他処理されているか),Surability(耐久性：復旧手段が保証されているか)
*　排他制御：処理中のデータをロックし，他者が読み書きできないようにする制御．
*　ストアドプロシージャ：SQL文を一つのプログラムにまとめDBMS側に予め保存しておくこと．ネットワークの負荷が軽減され，処理速度の向上も見込める．

**データベースの障害管理**
*　バックアップ：データベースを丸ごと他のファイルにコピーして保管すること．定期的に実行する．
*　ジャーナル：ログファイル．バックアップ後に，更新前ジャーナルと更新後ジャーナル逐一記録してデータベースの更新履歴を管理する．
*　コミット：トランザクションの処理を確定させ，データベースへ更新内容を反映させること．

**ロールバック**：トランザクション処理が失敗した場合に，更新前ジャーナルからデータを取得してデータベースをトランザクション開始直前の状態に戻すこと．

**ロールフォワード**：トランザクション処理中でなく，突然データベースが故障した際に，バックアップ後の更新後ジャーナルからデータを取得してデータベースを障害発生直前の状態に復旧させること．

# ネットワーク
**WAN[Wide Area Network]**：LAN同士を結ぶ広域ネットワーク．
*　回線固定方式：送信元から送信先にまで至る経路を交換機がつなぎ，通信路として肯定する方式．通信路に選ばれた回線は使用中のペアに占有されるため，他の端末がその回線を使用することができない．アナログ電話がこの方式．
*　パケット交換方式：パケットという単位に分割された通信データを交換機が適切な回線へと送り出すことで通信路を形成する方式．回線が使用中になるのはパケットが送られている時間だけであり，その間次のパケットを交換機が蓄積できるため，複数の端末で回線を共有して使用することができる．現在のコンピュータネットワークの基本方式．

**LAN[Local Area Network]**：局所的な狭い範囲のネットワーク．
*　イーサネット(Ethernet)：LANのスタンダード規格．接続形態や伝送速度ごとに規格分けされている．
CSMA/CD[Carrier Sense Multiple Access/Collision Detection]方式：アクセス制御方式．ネットワークの通信状況を監視して，他に送信を行っているものがいない場合に限りデータの送信を開始する．同時送信により通信パケットの衝突（コリジョン）が発生した場合は，各々ランダムに求めた時間分待機してから，再度送信を行う．
*　トークンリング：LANの規格の一つ．接続形態や伝送速度ごとに規格分けされている．
トークンパッシング方式：アクセス制御方式．トークン（送信の権利）というデータをリング上のネットワークを一方通行で流す．
*　無線LAN：電波などを使って無線で通信を行う．

**処理形態**
*　集中処理：ホストコンピュータが集中的に処理．
*　分散処理：複数のコンピュータに負荷を分散させ処理．
*　クライアントサーバシステム：集中管理した方が良い資源やサービスを提供するサーバと必要に応じてリクエストを投げるクライアントという2種類のコンピュータで処理を行う．サーバ自体がクライアントとして他のサーバにリクエストを出すこともある．1台のコンピュータに複数のサーバ機能を兼任させることもある．

**プロトコル**：ネットワークを通じてコンピュータ同士がやり取りするための約束事．
**OSI基本参照モデル**：プロトコルの詳細モデル．
*　第7層：アプリケーション層．具体的にどのようなサービスを提供するか．
*　第6層：プレゼンテーション層．データはどの形式にするか．
*　第5層：セッション層．通信の開始から終了までをどのように管理するか．
*　第4層：トランスポート層．通信の信頼性をどう確保するか．
*　第3層：ネットワーク層．ネットワーク同士をどう中継するか．
*　第2層：データリンク層．同一ネットワーク内でどう通信するか．
*　第1層：物理層．物理的にどう繋ぐか．

**ネットワークを構成する装置**
*　NIC[Network Interface Card]：コンピュータをネットワークに接続するためのカード．LANボードとも呼ばれる．データを電気信号に変換してケーブル上に流し，受け取る．製造段階でMACアドレスという番号が割り当てられていて，世界中で重複しない一意の番号．イーサネットではMACアドレスを使って各機器を識別する．
*　リピータ：第1層の物理層の中継機能を提供する装置．ケーブルを流れる電気信号を増幅してLANの総延長距離を伸ばします．
*　ブリッジ：第2層のデータリンク層の中継機能を提供する装置．セグメント（無条件でデータが流される範囲）間の中継役．流れてきたパケットのMACアドレス情報をかくにん，必要であれば他方のセグメントへパケットを流す．
*　ハブ：LANケーブルの接続口（ポート）を複数持つ集線装置．リピータハブは無条件いすべてのポートへパケットを送出する．スイッチングハブは宛先MACアドレスに該当するコンピュータにだけパケットを送出する．
*　ルータ：第3層のネットワーク層の中継役．異なるLAN同士の中継役として，IPアドレス情報を確認した後に，最適な経路へパケットを転送する．
*　ゲートウェイ：第4層のトランスポート層以上が異なるネットワーク間で，プロトコル変換による中継機能を提供する装置．

**データの誤り制御**
*　パリティチェック：パリティビットと呼ばれる検査用のビットを付加することでデータの誤りを検出する．ビット列の先頭に0,1を付加して1の数が偶数又は奇数になるようにセット．誤りが生じた場合は1ビットの誤りのみ受信側で検出できる．1ビットの誤りの位置を特定するには水平垂直パリティチェックを行う．
*　CRC[Cyclic Redundancy Check]（循環冗長検査）：ビット列を生成多項式で割り，その余をチェック用のデータとして付加す
る方法．受診側は生成多項式で割って余りがあれば誤りがあると判断できる．

**TCP/IPを使ったネットワーク**：インターネットのデファクトスタンダード（事実上の標準）
*　IP[Internet Protocol]：第3層のネットワーク層のプロトコル．経路制御を行い，ネットワークからネットワークへパケットを運ぶ仕組み．IPアドレスを用いて，コンピュータやネットワーク機器の識別を行う．
*　IPアドレス：コンピュータの住所．ネットワークアドレス部24ビット（どのネットワークか）＋ホストアドレス部8ビット（どのコンピュータか）．
*　MACアドレス：IPアドレス間の各ネットワーク機器の送受信に使われるアドレス．
*　ドメイン名：IPアドレスの別名．DNS[Domain Name System]サーバで，IPアドレスとドメイン名の対応を調べることができる．
*　TCP[Transmission Control Protocol]：第4層のトランスポート層のプロトコル．通信相手とのコネクションを確立してから，データを送受信する仕組み．パケットの順序や送信エラー時の再送などを制御して送受信するデータの信頼性を保証する．
*　UDP[User Database Protocol]：第4層のトランスポート層のプロトコル．事前に送信相手と接続確認を取ったりせず，一方的にパケットを送りつける仕組み．パケット再送制御などを一切行わないため信頼性に欠けるが高速な通信．

**WWW[World Wide Web]**：インターネットで標準的に使われているドキュメントシステム．サービス．
*　Webブラウザ：Webサーバから文字や画像，音声などの情報を取得．
*　HTML[HyperText Markup Language]：Webページを記述するための言語．
*　URL[Uniform Resource Locator]：Web上で取得したいファイルの場所を指し示す表記方法．
*　CGI[Common Gateway Interface]：Webブラウザからの要求に応じて，Webサーバ側で外部プログラムを実行するために用いる仕組み．

# セキュリティ
**セキュリティマネジメントの3要素**
*　機密性（許可された人だけが情報にアクセスできる）
*　完全性（情報が書き換えられることなく完全な状態を保つ）
*　可用性（必要な時に必要な情報資産を使用できる）

**ソーシャルエンジニアリング**：コンピュータシステムとは関係のないところで，人の心理的不注意をついて情報資産を盗み出す行為．

**コンピュータのウィルス対策**
*　ウィルス定義ファイル（シグネチャファイル）：既知のウィルスの特徴を記録したファイル．ウィルス検出に用いる．
*　ビヘイビア法（動的ヒューリスティック法）：実行中のプログラムの挙動を監視して，不審な処理が行われていないか検査する方法．

**ネットワークのセキュリティ対策**
*　ファイアウォール：LANの内外を区切る壁．実現方法は以下．
*　パケットフィルタリング：予め指定されたルールに則りパケットを通過させる．
*　アプリケーションゲートウェイ：プロキシサーバ（代理サーバ）とも．LANの内外の間に位置して，外部とのやりとりを代行して行う機能．
*　ペネトレーションテスト：既知の手法を用いて実際に攻撃を行いシステムのセキュリティホールや設定ミスといった脆弱性の有無を確認するテスト．

**暗号化技術**
*　共通鍵暗号方式（秘密鍵暗号方式）：送受信側が同じ鍵を用いる．通信相手の数だけ秘密鍵を管理しなければならない．
*　公開鍵暗号方式：暗号化に使う公開鍵と復号に使う秘密鍵が別物．受信者側が公開鍵と秘密鍵のペアを準備し，送信側が公開されている鍵で暗号化し送信する．暗号化，復号処理に時間がかかる．

**ディジタル署名**：公開鍵暗号方式の応用により，改ざんを防ぎ，誰が送信したものかを確認できる．送信側が秘密鍵で暗号化し，送信することで送信したのが秘密鍵を持っている者ということが確認される．

**CA[Certificate Authority]（認証局）**：公開鍵が誰のものかを証明する機構．

# システム開発
**システム開発の流れ**
1. 要件定義：利用者の求める機能，性能の洗い出し
2. システム設計：要件定義の結果に基づいてシステムの詳細な仕様を固める．
*　単体部設計：ユーザインターフェースの設計．利用者から見える部分の設計．
*　内部設計：外部設計を実現するための実装方法や物理データ設計．
*　プログラム設計：プログラムの構造化設計，モジュール同士のインタフェース仕様を設計．
3. プログラミング：プログラミング言語を用いて，プログラミングを実施．
3. テスト：プログラムにミスがないか検証する．作成したプログラムのバグを洗い出し，改修する．
*　単体テスト：モジュール単位の動作確認．入出力のみを確認するブラックボックステスト，モジュールの内部構造が正しく作られているか検証するホワイトボックステストがある．
*　結合テスト：モジュールを結合させた状態での動作確認．トップダウンテスト，ボトムアップテストがある．
*　システムテスト：システム全体を稼働させた動作確認．
*　運用テスト：実際の運用と同じ条件下での動作確認．
3. 導入，運用

**システム開発手法**
*　ウォータフォールモデル：各工程を完了させてから次の工程に進む．進捗管理がしやすい反面，利用者と仕様に関する認識齟齬があると，手戻りの負荷が大きい．
*　プロトタイピングモデル：開発初期にプロトタイプを作って，利用者と仕様の摺り合わせを行うため，手戻りが起こりにくい．ただし，プロトタイプを作るにも手間がかかるため大規模なシステム開発には不向き．
*　スパイラルモデル：複数のサブシステムを作って，各々開発を進めていく手法．個々のサブシステムはウォータフォールモデルで進めていく．
*　アジャイル：スパイラルモデルの派生．サブシステムの開発が完了したらその部分をリリースする．代表例がXP(eXtreme Programming)．XPは既存手法と異なり仕様変更を許容する柔軟性を実現している．開発スピードを重視した手法．Webサービスの構築でよく取り沙汰される．
*　リバースエンジニアリング：既存ソフトウェアの動作解析を行うことで，仕様やソースコードを導き出す手法．仕様書が所在不明になっているような旧来システムの保守を手助けする．
*　フォワードエンジニアリング：既存ソフトウェアの動作解析を行うことで，仕様やソースコードを導き出し，ソフトウェアの新規開発に利用する．ただし，ソフトウェアの権利者の許可なく行うと知的財産権の侵害になる恐れがある．
*　マッシュアップ：公開されている複数のサービスを組み合わせることで新しいサービスを作り出す手法．

**レビュー**：各工程完了時に，成果物を検証し問題発見に努める．

**業務のモデル化**：システムに対する要求を明確にするためには，対象となる業務をモデル化して分析することが重要．
*　DFD[Data Flow Diagram]：データの流れを表した図．
*　E-R[Entity-Relationship]図：データの構造を表した図．

**ユーザインタフェース**：システムの人が触れる部分．
*　CUI[Character User Interface]：入力，表示が文字だけ．
*　GUI[Graphical User Interface]：画面にアイコン，ボタン等のグラフィカルな操作ができる．

**コード設計**：コードとは識別番号のこと．

**チェックディジット**：誤入力を判定するためにコードに付加された数．

**プログラムの構造化設計**：モジュールを分割・階層化すること．作業分担，再利用，修正負荷の軽減ができる．

# プログラムの作り方
**プログラミング言語**：コンピュータに作業指示を与えるための言葉．
*　インタプリタ方式：ソースコードの命令を一つずつ機械語に翻訳しながら実行する方式．動作を確認しながら作っていく方式．
*　コンパライ方式：ソースコードの内容を最初に全て反訳して，機械語のプログラムを作成するため，効率はいいが，途中確認ができない．コンパイラは字句解析，構文解析，意味解析，最適化，コード生成を行う．
リンカ：実行可能ファイルを生成するプログラム．実行に必要なファイルを繋ぐ（連係編集する）．
ローダ：ロードモジュール（実行可能ファイル）を主記憶装置に読み込ませるプログラム．読み込み作業のことをロードという．

**構造化プログラミング**：プログラムを機能単位に分けてその組み合わせによって全体を形作る考え方．
*　3つの制御構造：順次構造（上から順に処理），選択構造（条件分岐でいずれかを処理），繰返構造（条件が満たされるまで一定処理を繰り返す処理）

**アルゴリズム**：コンピュータの処理手順のこと．アルゴリズムを記述するためにフローチャートが使われる．

**データ構造**：データを配置する方法．
*　配列：メモリ上の連続した領域にデータを並べて管理する．添字を使うことで，配列内の各データに直接アクセスすることができる．
*　リスト：データ同士を数珠繋ぎにして管理する．リストの扱うデータにはポインタと呼ばれるメモリ上の位置を表す番号がセットでつく．ポイントをたどって目的のデータにアクセスする．直接アクセスはできない．
*　キュー：待ち行列．最初に格納したデータから順に処理をおこなう，先入先出(FIFO{First In First Out)方式のデータ構造．
*　スタック：キューの逆．最後に格納したデータから順に処理を行う，後入先出(LIFO{Last In First Out)方式のデータ構造．
*　ツリー構造：階層構造を持ち，データ探索や整列などの用途にも使われる．ルート（最上位の節点が「根」），ブランチ（節点同士の繋ぎ），ノード（節点のこと），リーフ（末端の「葉」）
・完全2分木：葉以外の節が全て2つの子を持ち，根からはまでの深さが一様に等しい2分木．
・2分探索木：親に対する左部分木と右部分木のデータ量の関係が，「左の子＜親＜右の子」となる2分木．

**データ探索のアルゴリズム**
*　線形探索法：先頭から順に探索していく方法．
*　2分探索法：データの集合を2つに分けながら対象を絞り込んでいく方法．昇順，または降順に並んでいるデータ群に対して，効率の良い探索法．
*　ハッシュ法：一定の計算式を用いて，データの格納位置を算出する方法．

**データ整列のアルゴリズム**
*　基本交換法（バブルソート）：隣接するデータの大小を比較，必要に応じて入れ替える方法．
*　基本選択法（選択ソート）：対象とするデータの中から最小値もしくは最大値のデータをとりだして先頭データと交換するのを繰り返す方法．
*　基本挿入法（挿入ソート）：対象とするデータを整列ずみと未整列にわけ，未整列データを整列済みデータの適切な位置に挿入していく方法．
*　シェルソート，クイックソート，ヒープソートというより高速な整列アルゴリズムがある．

**オーダ記法**：アルゴリズムの計算量（実行時間）をO（式）の形で表すもの．

**オブジェクト指向**：処理の対象をオブジェクトという概念で捉えてモジュール化していくことで全体を構成すること．
*　オブジェクト：データ（属性）とそれに対するメソッド（手続き）をひとまとめにした概念．
*　カプセル化：オブジェクトの内部構造を外部から知られないようにすること．内部を修正しても影響を最小限にすることができる．
*　クラス：オブジェクトの持つ性質を定義したもの．仕様を定義したもの．
*　インスタンス：クラスに対して具体的な属性値を与え，メモリ上に生成して実体化させたもの．
*　汎化：下位クラスが持つ共通の性質を抽出して上位クラスとして定義すること．
*　特化：汎化の逆．抽象的な上位クラスを具体的なクラスとして定義すること．
*　集約：下位クラスは上位クラスの性質を分解して定義したもの．
*　分解：上位クラスは複数の下位クラスを集約して定義したもの．

# システム構成と故障対策
**シンクライアント**：サーバ側への依存度を高くしたもの．クライアント側の端末は入力や表示部分を担当するだけで，情報処理や保管機能はサーバ側が担う．

**ピアツーピア**：完全な分散処理型のシステム．サーバなどの一元管理する存在を必要としない．

**3層クライアントサーバシステム**
*　プレゼンテーション層：ユーザインタフェース部分の提供．クライアント側．
*　ファンクション（アプリケーション）層：業務そ実現するための処理を提供．サーバ側．
*　データ層：データ管理機能を提供．サーバ側．

**オンライントランザクション処理**：要求に対して即座に処理を行い結果を反映．

**バッチ処理**：一定期間ごとに処理を取りまとめて実行．

**システムの性能指標**
*　スループット：単位時間あたりに処理できる仕事量．
*　レスポンスタイム：コンピュータに処理依頼をし終えてから，実際に何かの応答が返されるまでの時間．
*　ターンアラウンドタイム：コンピュータに処理を依頼し始めてから，その応答が全て返されるまでの時間．

**システムを止めない工夫**
*　デュアルシステム：2つのシステムに全く同じ処理をさせるシステム．処理結果を互いに突き合わせて誤動作がないか監視．いずれかが故障した場合には一方で処理を継続できる．
*　デュプレックスシステム：2つのシステムを用意して，片方を待機状態にしておくシステム．デュアルシステムよりコストがかからない．ホットスタンバイ，コールドスタンバイと2つの待機状態がある．

**システムの信頼性と稼働率**
*　RASIS：Reliability, Availability, Serviceability, Integrity, Securityの頭文字．
*　MTBF[Mean Time Between Failure]（平均故障間隔）：故障指定な時間の平均
*　MTTR[Mean Time To Repaire]（平均修理時間）：修理にかかる時間．
*　稼働率：稼働時間／全運転時間＝MTBF/(MTBF+MTTR)
*　フェールセーフ：安全性を最優先にする考え方．
*　フェールソフト：継続性を最優先にする考え方．
*　フールプルーフ：意図しない使い方をしても故障しないようにする考え方．

**バックアップ**
*　フルバックアップ：全てをバックアップ
*　差分バックアップ：フルバックアップ以降に変更された分全てをバックアップ．
*　増分バックアップ：バックアップの種類に関係なく，前回バックアップ以降の変更分をバックアップ．データ量や処理時間が最も少ない．

# 参考
>[きたみりゅうじ．キタミ式イラストIT塾 基本情報技術者 令和04年．](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C04%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF-%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297124513/ref=sr_1_1?crid=OQ1P17GFX089&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88it%E5%A1%BE+%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E4%BB%A4%E5%92%8C02%E5%B9%B4+%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93&qid=1660449303&sprefix=%E3%81%8D%E3%81%9F%E3%81%BF%2Caps%2C274&sr=8-1)
>[Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)