通信に関する理論

高速通信回線を支える多重化方式

高速の通信回線を同時に複数の利用者で使用できるようにする技術。

  • 周波数分割多重化方式(FDM: Frequency Division Multiplex)
    • アナログ回線で用いられる
    • 複数利用者の信号を異なる周波数の信号に変調して、同時に送信する
  • 時分割多重化方式(TDM: Time Division Multiplex)
    • デジタル回線で用いられる
    • 時間を細かく分割して、それぞれの信号に一定の時間を割り当て(タイムスロット)、これを規則的に繰り返しながら送信する
  • 符号分割多重化方式(CDM: Code Division Multiplex)
    • 携帯電話などで用いられる
    • 全ての利用者は同じ周波数を使用するが、利用者ごとに異なるコードを割り当てて識別する
    • 送信時と同じコードを用いなければ復調できないため機密性に優れ、周波数帯域を有効利用できる

送受信のタイミングを合わせる同期方式

データの送受信を行うには、送信側と受信側でお互いにタイミングを合わせてやり取りを行う必要がある。これを「同期をとる」という。

  • 調歩同期方式(非同期方式)
    • 送信データ1文字ごとに、スタートビット: 0とストリップビット: 1をつけて送る方式
      • スタートビットにより同期をとる
      • 送信データがないときはストップビットが連続して送信される。
    • 低速回線用
      • 1文字が8ビットの場合、1文字の送信に最低10ビット必要なため伝送効率が悪く、低速の回線(1200bps)で使用する。
  • SYN同期方式(キャラクタ同期方式)
    • 中速回線用
    • 送信するデータ文字列の前に同期用の符号(SYN符号)をいくつか送信し、この符号によって同期を取った後、データを連続送信する
      • 受信側では同期がとれた後、1文字分に対応したビット数ごとに文字の区切りとみなして文字を組み立てるので、文字間が時間的に開くことは許されない
  • フレーム(フラグ)同期方式
    • データをフレーム単位で送信する方式
      • 送信するデータの前後にフラグパターン(01111110)がつけられ、このパターンに囲まれた部分(フレーム)を単位として同期をとる。
      • 送信データがないときは絶えずフラグパターンが送られる。受信側ではそれ以外の信号を受信するとデータが送られてきたと判断し、再びフラグパターンが現れるまでをデータとして受信する。
    • 高速回線用
      • データの長さに制約がなく、高速で大量なデータ送信に向いている。

情報に関する理論

文字コード体系

1. ASCII(アスキー)コード
  • アメリカ規格協会(ANSI)が制定した文字コード
  • 1文字を7ビットの符号とバリディティビット(誤り検出用ビット)の8ビットで表す。
  • 128種類(0~127=7ビット)の文字(0~9, A~Z, a~z, 各記号, 制御文字)が収録されている。
2. EUCコード(拡張UNIXコード)
  • UNIX上で2バイトコードを扱うためのコード体系
  • 決められた範囲内に各国独自の文字を定義することで世界各国の異なった言語にも対応できる
3. JISコード
  • ISOコードにカタカナや漢字を加えた日本工業規格の情報交換用符号
  • 漢字一文字は2バイトで表す
4. シフトJISコード
5. Unicode
  • 世界各国の主な文字体系に全て対応させるため、各文字を2バイトで表し、アルファベットや漢字などを統一的に取り扱う文字コードセット
  • UTFはUnicodeを2進数に変換する方式
    • UTF-8は8ビット単位の不定長で文字が表現され、漢字や仮名1文字は3バイトになる
    • UTF-16は16ビット単位で文字を表現

自然言語を定義する形式言語

人が使っている自然言語に対してコンピュータなどで情報として扱うために曖昧さを排除した言語を形式言語という。
形式言語の構文を形式的に定義するための言語に正規言語があり、その表現方法を正規表現という。

逆ポーランド記法

演算子を被演算子の後ろに置いて表す。
括弧を使わずに演算の優先順位を表せるため、コンピュータで扱いやすい。

逆ポーランド記法から通常の指揮に直す手順
  1. ABCD÷+-
  2. AB(C÷D)+-
  3. A(B+(C÷D))-
  4. A-(B+(C÷D))

AI

人間の判断を模したAI

AIとは、人間の頭脳の振る舞いを模倣したシステムを指す。
現在のAI以前には専門知識などを蓄積した知識ベースとそれを使って推論を行う推論エンジンから構成されるエキスパートシステムが作られ、特定範囲における専門的な意思決定に利用された。
AIでは、さらに統計的な判断機能や学習機能を持つことで、より人間の判断に近い結果を導き出すことができる。

機械学習

人間が経験によって得る知識の過程をコンピュータによって実現する手法。与えられたデータをもとに反復学習を行なって特徴や法則をも見つけ出し、その後に与えられる未知のデータについて推論を行う。

機械学習の方法
  • 教師あり学習:入力に対する正解をデータとして与えることで、未知のデータに対する判断や推論に結びつける。
  • 教師なし学習:正解を与えない方法。データを蓄積することで出現頻度を分析したり、規則性によりグルーピングしたりすることで解答を導き出す。
  • 強化学習:行動及びその善し悪しを得点として与え、最適な解を試行させる。
ディープラーニング(深層学習)

多層化したニューラルネットワークを使った機械学習の方法。
あらかじめ人間が方向性を与えなくても、多方面のデータをもとにコンピュータが自律的に学習を進め、高度な情報を導き出せる。

AIを活用するためのガイドライン

AI開発ガイドライン
  • 透明性の原則:システムが行なった動作を後から調査・検証できるようにデータを残しておく。
  • 制御可能性の原則:必要に応じて人間がAIシステムを制御できるようにしておく。
  • セキュリティ確保の原則:AIシステムが書き換えられることなどがないようにセキュリティを整える。
  • 安全保護の原則:AIシステムは人の生命・身体の安全に危害を及ぼさない。
  • プライバシー保護の原則:AIシステムは利用者や第三者のプライバシーを侵害しない。
  • 倫理の原則:AIシステムの研究開発においては、人間の尊厳と自立を尊重する。

【離散数学】シフト演算

シフト演算

シフト演算は、桁を左右にずらすことでべき乗の計算をする方法。ひいては乗算や除算を行うことができる。

2進数のシフト演算
  • 左にnビットシフト:元の数値の2n倍になる
  • 右にnビットシフト:元の数値の2-n倍になる

論理シフトと算術シフト

シフトには論理シフトと算術シフトがあり、違いは左端の1ビットを符号として扱うかどうか。論理シフトは全ビットを対象とするので負の数を扱うことはできないが、算術シフトは符号ビットを固定するので負の数を扱える。

論理シフト
論理右シフト
  • 2進数の全ビットをそのまま右へ移動する。
  • 空いた左端のビットには0が入る。
論理左シフト
  • 2進数の全びっとをそのまま左へ移動する。
  • 空いた右端のビットには0が入る。
算術シフト
算術右シフト
  • 符号ビット以外の全てのビットをそのまま右へ移動する。
  • 左の空いたビットには符号ビットと同じ値が入る。
算術左シフト
  • 符号ビット以外の全てのビットをそのまま左へ移動する。
  • 空いた右端のビットには0が入る。

シフト演算と乗除算

例1:10進数の演算式7/32の結果を2進数で表す

  • 10進数32は25で表せるので、元の数を5ビット右シフトすれば求める結果になる。

例2:2進数で表された正の整数xを10倍する。ただし、桁あふれは起こらないものとする。

  • 元の値が整数であれば、必ず2nの和に分解できる。
    • 12倍 = 8倍+4倍 = 23 + 22
    • 18倍 = (8倍+1倍)*2倍 = (23 + 20)*21
    • 20倍 = (4倍+1倍)*4倍 = (22 + 20)*22

【離散数学】2進数による文字としての数字の表現

文字としての数字

キーボードから入力した数字は10進数の文字として扱われる。これは表示用途としての10進数であり、10進数の体系を残したままのコード形式で記録される。なお、計算用途では内部で2進数に変換される。

10進数を表すコード体系

1. BCDコード(2進化10進コード)
  • 10進数の1桁を4ビットで表現したもの。
  • どの文字コード体系においても下位4ビットはBCDコードと同じになるよう定義されている。
10進数 BCDコード
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
2. ゾーン10進数(アンバック10進数)
  • 10進数の1桁を8ビットで表現。
  • 下位4ビットで数字を表し、上位4ビットで文字コードを表す。
  • 符号は最下位バイトの上位4ビットで表す。

例 +6078(文字コード:JISコード(0011))

6 0 7 8
0011 0110 0011 0000 0011 0111 1100 1000
JIS 数字 JIS 数字 JIS 数字 + 数字
3. パック10進数
  • 10進数1桁を4ビットで表現。
  • 符号を最下位の4ビットで表す。
  • 必ず1バイト単位にするため、4ビット足りない場合は先頭に0000を入れる。

例 -6078

0000 0110 0000 0111 1000 1101
数字 数字 数字 数字 -

【離散数学】2進数によるさまざまな数値の表現

ビットとバイト

コンピュータが処理を行うときのデータの最小単位をビットという。ビットは2進数1桁を表すbinary digitの略。
さらに8ビットをひとまとまりとして扱う単位がバイトという。

固定小数点数形式

2進数を使った数値の表現方法の一つ。 - 表現する数値の大きさによって8ビット、16ビット、32ビットなどを使い分ける。
- たとえば8ビットの固定小数点数形式は0~255の範囲の数値が表現できる - 小数点を最下位ビット(LSB: Least Significant Bit)に固定し整数を表す - 最上位ビット(MSB: Most Significant Bit)で符号を表すことで、負数を表現することもできる - 符号ビットは0ならば正、1ならば負の数を表す

補数表現

ある数nに足すと1.0*10mになる数を、nの補数という。
例:10進数の530は470を足すと1000になるため、470は530の3桁の補数

補数のメリット

補数を使うメリットは「足し算で引き算ができる」ことである。

980 - 530 = 450
980 + 470 = 1450

530の補数470を用いて加算を行い、最上位桁の1を省くと、530による減算の結果と同じになる。

補数の求め方

2の補数は2進数において負の数を表現する際に用いられる。
求め方は符号ビットも含めた全てのビットを反転したもの(1の補数)に1を加算する。

# +2
00000010
# -2
11111110

# +126
01111110
# -126
10000010

10進数の100-17を8ビットの固定小数点数で計算してみる。
まずは-17(17の2の補数)を求める。

# +17
00010001
# -17
11101111

100+(-17)を行い、桁溢れを無視する。

  01100100 # 100
+ 11101111 # -17
---------------
 101010011

01010011(10進数の83)が求められる。

浮動小数点数形式

数値 = 仮数 * 基数と表す形式。

例:11000000 = 0.11*2^8

仮数部で有効桁数を確保し、指数部で数の大きさを表すことで、限られたビット数でとても大きい数値や小さい数値を表現できる。

浮動小数点数形式への格納

単精度形式(32ビット)

SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM

S: 仮数部の符号ビット(1ビット)
E: 指数部(8ビット)
M: 仮数部(23ビット)

仮数部を有効に使う(切り捨てをなくす)ため、仮数部の最上位ビットが0にならないよう、仮数部と指数部を調整する(正規化)。

誤差

仮数部で発生する誤差
1. 丸め誤差

浮動小数点数では仮数部の桁数が有限なので、無限小数は四捨五入、切り上げ、切り捨てなどによる誤差が発生する。

2. 桁落ち

絶対値のほぼ等しい2つの数値を減算したときに、有効数字の桁数が急激に減少することで誤差が発生する。

1.110100101*2^3 - 1.110100010*2^3 = 0.000000011*2^3

正規化すると

1.100000000*2^(-5)

となり、有効数字の桁数は10桁→2桁に減少する。

3. 情報落ち

絶対値の差が非常に大きい2つの数値の加減算を行ったときに、絶対値の小さい方の値が有効桁数内に収まらず演算結果に反映されないために発生する。

2^600 - 2^(-600) = 2^600
4. 打ち切り誤差

ある程度の値で収束が確認できたところで処理を打ち切ることで生じる誤差。演算結果が有効桁数では表現できない場合などに発生する。

指数部で発生する誤差
1. オーバーフロー

非常に絶対値の大きな値同士の乗算を行った指数部が表現しうる正の最大値を超えることがあり、このときに誤差が発生する。

2^600 * 2^600 = 2^1200 

指数部が8ビット=1024までしか格納できないため誤差が発生する。

2. アンダーフロー

非常に絶対値の小さな値同時の乗算を行った場合。オーバーフローの逆。

【離散数学】コンピュータで扱う「数」の工夫

コンピュータの個々の回路自体は電流が流れていない流れているの二つの状態しか持たない。そこで、全てのデータを0と1の二つの数字のみで扱う2進数に置き換えている。

2進数

0と1の2種類の数字を使い、1の次に桁上がりをする。

基数

1つの桁が取りうる値の個数。2進数の基数は2、10進数の基数は10。

桁の重み

n進数において、ある桁の重みは右隣の桁のn倍、左隣の桁の1/n倍になる。

基数変換

ある基数の値を別の基数の値に変換すること。

2進数→10進数

各桁における値×桁の重みを合計した値が10進数における値になる。

# 2進数の10101
1*16 + 0*8 + 1*4 + 0*2 + 1*1 = 21

# 2進数の0.11
0*1 + 1*1/2 + 1*1/4 = 0.75
10進数→2進数

整数部は基数2で割った余りを順に求め、商が0になるまで繰り返し、余りの数を計算順と逆に並べる。

# 10進数の100
100%2 = 0
50%2 = 0
25%2 = 1
12%2 = 0
6%2 = 0
3%2 = 1
1%2 = 1

1100100

小数部は基数2を掛け、小数部が0になるまで繰り返し、積の整数部分を計算順に並べる。

# 10進数の0.625
0.625*2 = 1+0.25
0.25*2 = 0+0.5
0.5*2 = 1+0

101
2進数→8進数, 16進数

8進数は2進数を3桁ごと16進数は4桁ごとに区切って読み替える。桁数が足りない場合は0で補う。

# 2進数の1001011101
# 8進数
001 = 1
001 = 1
011 = 3
101 = 5

1135

# 16進数
0010 = 2
0101 = 5
1101 = D

25D

【AWS】仮想マシン: EC2インスタンスの起動と接続

仮想マシンについて

  • 仮想マシンVM)は物理マシンの一部であり、ソフトウェアによって同じ物理マシン上のほかの仮想マシンから切り離されている。
  • CPU, メモリ, ネットワークインターフェース, ストレージで構成されている。
  • 物理マシンはホストマシン、ホストマシン上で動作している仮想マシンはゲストマシンと呼ばれる。
  • AWS仮想マシンはEC2というサービスによって提供される。EC2インスタンスと呼ばれる。

OSの選択

AMI

インスタンスタイプの選択

EC2インスタンスの性能を表す。

インスタンスファミリ
  • Tファミリ
    • 安価でベースラインパフォーマンスはそれほど高くなく、短期的にパフォーマンスを向上させるためにバーストすることが可能。
  • Mファミリ
  • Cファミリ
    • CPUパフォーマンスの高いコンピューティング最適化インスタンス
  • Rファミリ
  • Dファミリ
  • Iファミリ
  • 等々
インスタンスサイズ

CPU、メモリ、ストレージ、ネットワークのキャパシティの大きさ。

インスタンスタイプの名前

t2.micro = Tファミリの第2世代、インスタンスサイズ小

ファイアウォールの設定

  • 新しい、または既存のセキュリティグループ(別記事)を割り当てる
  • セキュリティグループを新規作成する場合、起動する段階ではルールはデフォルトで可。

キーペアの選択

インスタンスSSH接続できるよう、新しい、または既存のキーペアを割り当てる。

その他の設定

起動する段階では、以下はデフォルトの設定で可。 - インスタンスの詳細設定 - ストレージの追加

インスタンスへの接続

キーペアへの権限を設定する。

% chmod 400 キーペアのパス

以下のコマンドで接続。

% ssh -i キーペアのパス AMIユーザー名@パブリックIPv4DNS
デフォルトAMIユーザー名
パブリックIPv4DNS

インターネットから到達可能な、インスタンスIPv4 アドレス。インスタンス詳細画面で確認できる。