知識ゼロから始めるソフトウェア ～ コンピュータの基礎の基礎【非エンジニア向け】

[【目次】知識ゼロからコンピュータとソフトウェアの概要を理解する【作成中】](https://qiita.com/kob58im/items/4308cdb2d722db524668)

# 記載内容

この記事では、コンピュータが処理している情報はどういう表現形態なのかを説明しています。

<font color="lightgray">
この記事を書き始めたときは、組み込み系向けに考えてましたが、風呂敷を広げすぎて収拾がつかなくなってきたので一旦現状の記事内容でクローズして、下記は別記事で、そのうち作りたいと思います。ハードル高い・・
・ソフトウェアの詳細な話
・組み込み系ソフト屋に必要なECUの取り扱いに必要な知識

</font>

# 誰向け？

主に非エンジニアの方々への教育の導入資料として使われれば幸いです。
※内容の保証はいたしかねますので、内容をご確認頂いた上で使用可否をご判断ください。

目的の達成のため、「とっつきやすさ」と「わかりやすさ」を重視します。
（結果として、厳密さを犠牲にしていますので、コンピュータやマイコンのアーキテクチャを復習したい人には向かないです。）

# 入門編 ～ コンピュータの世界
## 1. 「〇〇進数」ってなんなん？ ～ 16進数ってナニモノ？

普段の生活で使っているのは<b>10進数</b>表記ですが、ソフトウェアの世界では<b>2進数</b>や<b>16進数</b>表記というものをよく使います。
まずは、「2進数ってなんだっけ？」から。例を見たほうが早いと思うので、下表に対応関係を示します。

| 10進数 | 2進数 |
|---:|-----:|
|  0 |    0 |
|  1 |    1 |
|  2 |   10 |
|  3 |   11 |
|  4 |  100 |
|  5 |  101 |
|  6 |  110 |
|  7 |  111 |
|  8 | 1000 |
|  9 | 1001 |
| 10 | 1010 |
| 11 | 1011 |
| 12 | 1100 |
| 13 | 1101 |
| 14 | 1110 |
| 15 | 1111 |
| : | : |

<b>〇〇進数</b>は、各桁に使える<b>数字の種類</b>が〇〇個である表記のことです。
式で例示すると下記のようになります。

```math

13 = 1×10^1 + 3 = 1×2^3+1×2^2+0×2^1+1 = 1101 (2進数表記)

```

- 10進数で使うのは、`0,1,2,3,4,5,6,7,8,9` の10個
- 2進数で使うのは、`0,1` の2個
- <b>16進数</b>では、数字だけだと10個しかなく16個には足りないので、<b>`10,11,12,13,14,15`の代わりに`A,B,C,D,E,F`を割り当てることになっています。</b>
`0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F`の16個を使います。[^1]<br>
<b>16進数表記であることを明示するために、頭に0xを付けたり、</b>末尾にhを付けたりします。これ以外にも、頭に$を付けたりすることもあります。

| 10進数 | 2進数 | 16進数 |
|---:|-----:|-----:|
|  0 | 0000 0000 | 0x00 |
|  1 | 0000 0001 | 0x01 |
|  2 | 0000 0010 | 0x02 |
|  3 | 0000 0011 | 0x03 |
|  : |         : |  : |
|  8 | 0000 1000 | 0x08 |
|  9 | 0000 1001 | 0x09 |
| 10 | 0000 1010 | 0x0A |
| 11 | 0000 1011 | 0x0B |
| 12 | 0000 1100 | 0x0C |
| 13 | 0000 1101 | 0x0D |
| 14 | 0000 1110 | 0x0E |
| 15 | 0000 1111 | 0x0F |
| 16 | 0001 0000 | 0x10 |
|  : |         : |  : |
| 31 | 0001 1111 | 0x1F |
| 32 | 0010 0000 | 0x20 |
|  : |         : |  : |
| 47 | 0010 1111 | 0x2F |
| 48 | 0011 0000 | 0x30 |
|  : |         : |  : |
|159 | 1001 1111 | 0x9F |
|160 | 1010 0000 | 0xA0 |
|  : |         : |  : |
|254 | 1111 1110 | 0xFE |
|255 | 1111 1111 | 0xFF |

[^1]: A～Fの代わりに、小文字のa～fを使う場合もあります。

### 【練習問題】

・ 10進数表記の数値「15」を、16進数表記で1文字で書くなら、何と書く？
・ 16進数表記で「0xA1」となる数値は、10進数表記で書くといくつになる？


## 2.「ビット」とか「バイト」ってなんなん？

大雑把にいうと、コンピュータ上のデータは、内部表現としては0と1の羅列として扱われており、データを扱うための最小の単位として、<b>ビット</b>が使われます。
ただ、これだと細かすぎて（人間からみて）扱いづらいので、<b>8ビット</b>ごとに区切った塊として、基本的に<b>バイト</b>という単位で扱われます。
・<b>ビット(bit)</b>・・・2進数の各桁 ( <b>0</b> か <b>1</b> )
・<b>バイト(byte)</b>・・・8ビット ( 0～255 (<b>0x00～0xFF</b>))
です。

キロバイト(KB)、メガバイト(MB)、ギガバイト(GB)は、下表のようになります。（具体的な数値は覚えなくてよいです。）
2の10乗（=1024）が1000に近いため、キロ＝1000とする場合とキロ＝1024とする場合があります。
（表現が定まっていないのでトラブルのもとになりがち。）

|    | 1キロ＝1000とする場合 | 1キロ＝1024とする場合 |
|---:|-----:|-----:|
|  1キロバイト(1KB) | 1000バイト | 1024バイト |
|  1メガバイト(1MB) | 1,000,000バイト | 1,048,576バイト |
|  1ギガバイト(1GB) | 1,000,000,000バイト | 1,073,741,824バイト |

### 【練習問題】

1KB=1024バイトとする。
- 2KBは512バイトの何倍？
- 1回のメールで8MBまでのデータを送信できるとするとき、1GBのデータを送るのに何通のメールを送ることになる？[^2]
- 1バイトのデータは、最大何種類の数を表現できる？ ・・・「〇〇進数」ってなんなん？ ～ 16進数ってナニモノ？の最後にある表を眺めると何かわかるかも？

[^2]: 厳密には、メール送信用のデータ形式に変換するときにデータ量が増加しますが、ここではそのデータ量の増加は無視して計算してください。


## 3. コンピュータは「小数」が苦手？＜＜読み飛ばし可＞＞

コンピュータで小数を表すときの話。
内部表現として0と1を使っている都合上、2進数との相性がよい（処理の効率がよい）ので、2進数で小数を表すことが多いです。
下記のようなイメージです。

| 2進数 | 分数表記(10進数) | 10進数 |
|---|-----|-----|
| 0.1 | 1/2 | 0.5 |
| 0.01 | 1/4 | 0.25 |
| 0.001 | 1/8 | 0.125 |
| 0.0001 | 1/16 | 0.0625 |

ここで、10進数の0.1を2進数で表現しようとするとどうなるでしょうか？
（計算が面倒なので、Google先生に「`0.1 2進数`」と聞いてみると、下記がでてきます。）

```math

0.1 = 0.000110011001100… (2進数)

```

いわゆる循環小数という無限に続く列になります。コンピュータのリソースは有限なので、これは扱えません。[^3]
[^3]: 10進数で小数を表現する方法はありますが、ややこしくなるので省略します。


### 【練習問題】
10進数「0.75」を、2進数の小数で書いてみてください。

## 4.「ファイル」の中身はどうなってるの？　～　音声データも文字データも結局は0と1で構成されている

### 4.1. 音声ファイルの中身を覗いてみる
ファイルの実体は、バイトの羅列です。
試しに楽曲などの音声が保存されているmp3ファイルの中身をバイナリエディタ（16進数でデータを表示するツール）で開いてみると、下図のようになります。（<font color="Blue"><b>青色の枠</b></font>で囲った部分が実際のデータです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/d72eda11-9237-f3a6-3099-cfa5f62433d4.png)


### 4.2. テキストファイルの中身を覗いてみる
次は、下記の内容のテキストファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/23bef653-5991-37ea-295b-0cde4fa74bc1.png)
をバイナリエディタで開いてみます。（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/e0622858-d4c7-d55f-4a38-c1f9a842b9a3.png)

先頭のデータ `54 68 69 73 20 69 73` (16進数) は、文字列でいうと図の右側の`This is`に対応しています。（後述の「文字の数値表現」参照）

### 【補足】バイナリって何？
以下、Wikipediaより引用。
> バイナリ (binary) とは、本来は二進法のことであるが、情報技術においては、コンピュータが直接的に処理するために２進数で表現されるデータ（バイナリデータ）のことを指して用いられる。

### 【コラム】ファイル名に含まれている拡張子の役割
アプリやWindowsがどうやって音声ファイルなのかテキストファイルなのか区別しているかというと、通常は、ファイル名に含めれている拡張子（`.mp3`とか`.txt`）で判断しています。アプリによっては中身のデータを解析して推測する場合もあります。

### 【練習問題】

- 文字 `s` にあたる16進数はなんでしょうか？（「テキストファイルの中身を覗いてみる」を見ながら考えてみてください。）<br>もしくは、後述の「【補足】ASCIIを扱うときによく使う知識」を参考に調べてみてください。

## 5. 「プログラム」ってなんなん？

イメージで例を示すと下記のようなものです。

```text

FileName <- "なんとかかんとか.mp3"
if ( FileExists(FileName) ) then
    PlayMp3File(FileName)
end if
```

ファイル「"なんとかかんとか.mp3"」が存在していたら、そのmp3ファイルを再生するプログラムです。[^5]
大雑把にいうと、プログラムとは、コンピュータへの指示を特定の規則に沿って記述したものです。

[^5]: ※わかりやすさを優先しており、実在しないプログラミング言語で記載しています。


## 6. 「ソフト」と「ハード」ってなんなん？

- ソフト（＝ソフトウェア）・・・主に、プログラムのことを指します。
- ハード（＝ハードウェア）・・・主に、ソフトを動かす装置のことを指します。

## 7. 「コンピュータ」ってどうなってるの？

ノートパソコンのよくある構成は下記のようなイメージになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/f196a5ff-0de7-ed82-bb23-cba3eb08d452.png)


下記で構成される。

- CPU　・・・　プログラムを処理するもの。
- メモリ　・・・　プログラム自体とその処理中の情報を保持するもの。
- 外部記憶装置　・・・　ハードディスクなど。ファイルを保存するもの。
- 入力装置　・・・　キーボードやマウスやマイクなど。
- 出力装置　・・・　ディスプレイなど。

### 参考
https://www.google.co.jp/search?q=%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%80%80%E6%A7%8B%E6%88%90

## 8. 文字コードの話

【作成中】

Shift_JISとUnicode(というかUTF-8)の話。
ムズカシイので概要だけ書きたい。
・実例をあげる
・ASCII文字のみの場合、区別がつかないこと

・UTF-8にはBOMありとBOMなしがあること  そもそもBOMとは・・



# 実務編. データを分析する
## 文字の数値表現
「テキストファイルの中身をみてみる」で見たように、テキストファイルの中身も、結局はバイナリデータになっています。

組み込み系ECU開発でありがちな業務として、開発中製品の試験ログデータの分析があると思いますが、評価設備の立ち上げ時は手動で（ようは人の目で）ログを確認するシーンがあったりします。
この中にテキストデータが含まれていることがあり、データをチェックするときに文字の表現方式（主にASCII）の知識が求められたりします。（ASCII表を暗記する必要はないです。）

### 【補足】ASCIIを扱うときによく使う知識
業務をこなしているうちに、よく使う知識は覚えるので、現時点で覚える必要はないです。
- 文字0～9の値（16進）は、それぞれ0x30に0～9を足した値になっている。
- 大文字のアルファベットA～Zの文字の値（16進）は、0x41から始まり、アルファベット順に1ずつ値が増えるように割り当てられている。
- 0x00～0x1Fと、0x7Fは特殊な文字である。[^4]
- 0x80～0xFFは、ASCIIには含まれない。

[^4]: テキスト処理をするプログラムを書く場合は、タブ文字と改行コードがここに含まれることを把握しておくべき。

| 文字 | 16進数 |
|:----:|:----:|
| スペース | 0x20 |
| : |  : |
| 0 | 0x30 |
| 1 | 0x31 |
| : |  : |
| 9 | 0x39 |
| : |  : |
| A | 0x41 |
| B | 0x42 |
| : |  :   |
| a | 0x61 |
| b | 0x62 |
| : |  :   |

### 【練習問題】

- `ECU123`という文字列があった場合、これをバイト列で表現した場合、何になる？

# 番外編. Web系

とりあえずこれ見ておけばよいかと
[【動画】非エンジニアでもわかる！Webサービス・アプリが動く仕組み](https://youtu.be/zq50JwOU_ls)

# 番外編. 心構え
コミュニケーションこそ全て

- 事実　と　事実でないもの　を分けて話す。
- 主語　はできるだけ省略しない。
- 相手が自分の話を理解したかを確認する（ただ、「分かった？」というのは、ある種の脅迫でしかない）
- 分からないことは　分からない　と言う。
- 困りごとはすぐに周りに相談する。
- お礼を言う ・・・ お願いごとを聞いてもらったり、時間を割いてもらったりしたら、一言でいいので感謝の意を伝える。（とくにチャットとかだと、書くのと書かないのでは雲泥の差になる。）
- 作業をお願いするときでも、目的とか意義は説明するべき　頼まれた側の仕事の質に関わる。

とはいえ技術的な基礎も大事

- おまじないで済ませると、なにか依頼するときに0から100まで細かく書いた手順書が必要になってしまう。
- 使わないと知識は定着しない。