ubuntuでcを実行する

$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”

gccはc言語用のコンパイラ
GNU Compiler Collectionの略

$ gcc –version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ sudo apt-get install build-essential

#include <stdio.h>

int main(void){
	printf("hello world!\n");
	return 0;
}

// コンパイル時に-oオプションを使うことで、実行形式ファイルの名前を指定
$ gcc -o hello hello.c
$ ls
hello hello.c
// ./実行形式ファイルパスで実行
$ ./hello
hello world!

ArduinoとRaspberry Piの違い

### Arduinoとは
AVRマイコン、入出力ポートを備えた基板
C言語風のArduino言語によってコンパイル、デバック等を行う
Arduinoを動かすプログラムをSketch(拡張子は.ino)といい、統合環境はArduino IDE
OSがインストールされていないので、プログラムを送信する必要がある
基本はArduino Uno

Github: Arduino
機能: 温度センサー、気圧センサー、赤外線センサーなどの様々なセンサーをArduinoに接続することで、その値を使って処理可

### Raspberry Piとは
OSが搭載されている
SDカードから、Raspberry Pi専用のLinuxを起動でき、そこからプログラミングができる
Raspberry Pi用のカメラも発売されている
主にPythonやbashでプログラムを書く
無線通信が出来る

### ArduinoとRaspberry Piの違い
Arduinoは、組み込みや電子回路を学びたい人向け
Raspberry Piはソフトウェアを組み合わせたい人向け

両方とも実際にやってみないとわからなそうやな。

RAMの仕組み

### SRAM
フリップフロップを使ったメモリで、SRAMと言われる。消費電力が少なく、動作速度が早い
DRAMと比べて1セルあたりの部品点数が多いため集積度を上げにくい
CPU間近にSRAMに記憶する

### DRAM
大量データの記憶にはDRAMが使用される
コンデンサに蓄えた電荷量によって1ビットを記憶する
1個のコンデンサと1個のMOSFET AD=HにしてQをオンにすると、コンデンサ電圧がデータ線Dに現れるので、電圧H、Lで判定できる
構造、動作原理がSRAMに比較して単純でセル面積も小さいため、大容量メモリに適している

EPROMとflip-flopの構造的な違いは理解しておく必要がありそうだ。

### 半導体の設計
半導体の機能目的を決定する「システム設計」、これを電子回路で実現するための「ロジック設計」、さらに実際にパーツを並べて詳細な回路を検討・設計する「回路設計」、ICチップの中で回路の配置を決定する「レイアウト設計」

集積回路設計

集積回路設計は、主にシリコンを使った半導体上に、トランジスタ、抵抗器、キャパシタといった部品を配置し、それらを金属の配線で接続する。シリコン基板は電導性があるため、個々の部品の絶縁を確保する方法(いわゆる素子分離)が必要とされる。集積回路の素子は一般の部品より非常に小さいため、トランジスタの電力消費、配線抵抗、配線における電流密度といったことに注意を払う必要がある。金属配線におけるエレクトロマイグレーションや極小素子の放電による破損なども考慮される。回路の物理配置も重要であり、性能やノイズの影響、発熱分布、ピン配置といったことと密接に関連する。
半導体製造工程の「前工程」と呼ばれる半導体ウェーハ処理工程では、シリコンウェーハ表面上にトランジスタなどを含む電子回路を高集積で形成
成膜、 パターン転写、エッチング
半導体製造工程の「後工程」と呼ばれる組立工程では、ウェーハから半導体を切り出し、所定の位置に固定・封入して検査

RAMの製造メーカー
Micron

こりゃ凄い世界や。

ROMの電子回路の仕組み

### マスクROM
メモリセルの内部回路の開放と短絡によって1, 0を記憶する
半導体製造工程には写真の感光技術が利用されるが、基板を覆うマスクパターンによってデータが記録される
データ線ADとデータ線Dが短絡しており、AD=HとなるとD=Hとなる
アドレス線を開放状態にすると、AD=HとしてもD=Lのままである H, Lに0と1を割り当てて、1ビットを記憶することができる
バイポーラトランジスタを使ったマスクROMはこの原理で動作させてることができる
実用的には消費電力の少ないMOSFETを半導体スイッチとして用いている
マスクROMはIC製造段階で情報を書き込むのでデータを変更することができない

### PROM
一度だけ書き込み可能なROMをPROMという
ヒーズをトランジスタのエミッタ端子とデータ線の間に設けて、これを溶断するかどうかによってH、Lを記憶する
PROM出荷時には全ヒューズが繋がっている
セルにLを記憶するには、電源電圧Vccを高く設定し、ヒューズが溶断されるとLが記憶される
ヒューズ以外にもダイオードを挿入し、pn接合を破壊・短絡してH, Lを表す方法もある

### EPROM
データの正気と再書き込み可能なROMをEPROMという
データの消去に紫外線を使うUV-EPROMと電圧を使うEEPROMがある
装置固有の設定データや利用者情報などの記憶、書き換え頻度の少ない用途に適している

– 書き込み方法
p型半導体基板上にn型半導体を二つ設け、これに電極ドレイン(D)とソース(S)をつける
更にドレイン・ソース間に絶縁層を設け、その上にゲート電極(G)をつける
n型半導体は自由電子が含まれた物質で自由電子の流れが電流
p型半導体は自由電子を含んでいない
ゲートに電圧を加えない状態では電流は流れない(nMOSがオフ)
ゲートに電圧を加えるとゲート、ソース間はコンデンサとして働き、正の電荷がゲート電極に蓄えられる
-> nチャンネルを作り、半導体スイッチとなる Vgs > Vthでオン、Vgs < Vthでオフ FGの帯電量によってMOSFETのオンオフを決定でき、ROMとして1ビットを記憶させることができる 一度入り込んだ負電荷は電源を切っても消えないので、半永久的にこの状態を保持できる - データ消去 UV-FPROMは紫外線をFGゲートに照射させることで内部電子のエネルギーを増大させ、FGゲートから放出させる このため、IC上部には紫外線照射窓がある EEPROMは電圧によってFGゲートの電子を放出させる FGゲートの帯電動作と逆 ゲート電圧を0とし、ドレイン電圧を高く設定するとFGゲートの電子がドレイン側に逃げ出して0となる EEPROMは電圧制御によって1ビット単位で行うことができるが、セルにMOSFETが追加されるため面積が大きくなり大容量化が難しくなる ### フラッシュメモリ メモリセルを幾つかの集合に分割し、消去をブロック単位で行うようにした セルの消去用トランジスタをなくすことでセル面積を抑え、大容量化を図っている 電源を切ってもデータが保持できるので応用は急速に広がっている マザーボードのBIOS、スマホのストレージはフラッシュメモリー UBS, SSDなどもNAND型のフラッシュメモリー フラッシュメモリはTranscend(台湾)、Silicon-Power(ドイツ)、ELECOM、I-O DATA、SanDisk、BUFFALO、GREEN HOUSEなどが生産 EPROMの仕組みは、p型半導体と、s,dのn型半導体に挟まれた絶縁体のゲートでできてるのね。 1ビットでこの仕組みが必要なのに、500GBのSSDって、どれだけpnとデータ線、アドレス線をどうやって少量化して詰め込んでるんやろうか、全く想像が付かない。CPUもそうだけど。 ICメモリの仕組みがわかったところで、アプリケーションの品質には直接は影響はないけど、興味深いところではある。

ICメモリ

記憶装置には大きく分けて外部記憶装置と内部記憶装置がある

### 外部記憶装置
外部記憶装置にはハードディスク、CD、DVDなど
-> 機械的な駆動部分が存在するため読み書き速度が遅い

### 内部記憶装置
ICメモリは小型の回路部品であり、基板内部に組み込まれる為、内部記憶装置と言われる
記憶容量では劣るが、機械駆動部が少ない為高速
CPU周りの高速処理にICメモリが使われている

### ICメモリの内部構造
大量の2値情報を記憶する
IC内部の最小記憶単位をセルと良い、通常は1ビットを記憶する 
セルは平面上に配列されており、アクセスするためにアドレス(固有の識別番号)が使われている
行アドレスと列アドレスがあり、アドレス線の電圧がH(アクティブ)になり、列アドレスが入力されると、特定のデータ線が選ばれ、セルが読み書きの対象となる
読み書きの制御信号R/WがHになると、記憶データが出力され、Lになると記憶される

### ICメモリの分類
ROM: 読み込み専用、電源を切っても内容保持 R/W制御信号は取り除かれ、出力のみ
RAM: 読み込み書き込み自由、電源を切ると内容も消える R/W信号に応じて双方向通信に対応

メモリっていうと、文字データ、画像データなどを記憶しているように思っていたが、実際には0、1の2値データを持ってるだけなのね。えらい勘違いをしていたみたいだ。

A/D, D/A変換

アナログからデジタルに変換するのをanalog to digital conversionでA/D変換という
逆に、2値信号をアナログ信号に変換する作業をdigital to analog conversion, D/A変換という

#### D/A変換の原理
ほとんどの電子回路は電圧を情報として扱うので、アナログ電圧量に変換すると捉える
-> 2進数を10進数に変換し、この10進数に比例した電圧量を得ること
e.g. X=1011(2)の時、Y=11 11に比例した電圧が現れる仕掛けを用意すればD/A変換したと言える
ビット重みに比例した電流を流す仕掛けと、得られた電流から電圧変換する作業を行えば良い
-> 複数の抵抗網と演算増幅器を用いることが多い

– 演算増幅器
マイナス端子とプラス端子電位差を増幅する
重み付け抵抗あるいはラダー抵抗で1/8R, 1/4R, 1/2R, Rとすれば、ビットの大きさに比例した電流を得られる

### A/D変換器の原理
A/D変換の原理は積分型と比較型に分けられる

– 二重積分型A/D変換器
積分器、コンパレータ、クロックパルス発生器、ゲート、カウンタ、制御回路が含まれている
電圧の大きさ -> 時間の長さ -> パルスのカウント数 という変換作業によって電圧信号をデジタル化する
クロック周波数、積分期間が長いほど大きくなる
– 逐次比較型A/D変換
二分法と言われる探索手法
あらかじめ想定される電圧範囲を二分し、この閾値電圧と入力電圧を比較してデジタル変換する

nビットの2進変換をしたい場合は、nビット対応のD/A変換器を用意してn回繰り返し動作によって求めることができる

A/D, D/Aも2進数の変換をどう扱うかってことやな
世の中の複雑なアルゴリズムが全て2進数で処理されているってのは未だに信じられない

パルス回路(pulse)

ディジタル回路で扱う矩形波信号(非正弦波形の基本的な一種)をpulseという
信号伝送の過程でパルスが歪んだりノイズで乱れたりするので、パルス波形を加工・整形する操作が必要になる
インバータとはNOTのことで、1を0に、0を1に反転する
判定基準となるVtを閾値という
シュミットトリガー型インバータでは、Viの大きさだけでなく、それまでの変化の過程(履歴)を考慮して判定されるヒステリシス特性をもつ。これによりノイズが混入していても本来の動作を行うことができる

### マルチバイブレータ(multibibrator)
回路の二つの電圧状態を交互に行き来することによりパルスを発生させる回路
無安定型(入力不要)、単安定型、双安定型がある
-> Viが徐々に増加し、インバータの閾値で反転しV=0となりViが徐々に低下 そして再度充電すると周期的に充電放電を繰り返すのでパルス出力を得る

### 遅延回路
RC回路を使ってバッファ入力することで、波形を遅らせることができる。バッファとは信号波形を整形し、出力インピーダンスを低下させるゲート回路のこと

### パルス整形回路
信号波形が歪んだ場合に整形する操作
クリップ回路は入力波形をあるレベルで切り取る働きをするため、信号の最大値や最小値を設定するときに使われる
-> ダイオードがオン(導通)、オフ(非導通)で電流が流れたり流れなかったり制御できるので、出力電圧V0を制限できる
クリッパ回路(電圧の最大値制限)、リミッタ(最大値と最小値を制限)、スライサ、クランパ(直流再生回路)

東日本”50Hz”、西日本”60Hz”のこのプラスとマイナスが入れ替わる周波数がパルスで、このパルスを加工したり整形できるってことやね。つまり、パルスの電子の移動を制御できるってことかね?

ChromeでIEのUserAgentで操作したい時

ChromeでInternetExplorerとして操作したい時

1. DevToolを開く
2. 三点リーダのメニュー -> 「More tools」 -> 「Network conditions」
3. 「User Agent」の「Select automatically」のチェックボックを外す
4. IE11を選択

UserAgentは偽装できるが、思ったような挙動にはならないな。。。

順序回路

順序回路は現在の入力と過去の入力で出力が決まる回路
二次情報を記憶する回路をレジスタという、CPU内部の高速演算やデータ処理の一時記憶用途に使われる
一度に記憶できるビット数をレジスタ長といい、レジスタ長が大きいほど高度な作業を高速に行うことができる
64bit CPUとは、「一度に記憶できるビット数が64ビット」という意味。当然32ビットより性能が良い
e.g. D-FFとCK端子をつなぎ合わせると、次のクロックパスが入力されるまで出力が保持される

### シストレジスタ
レジスタ内のデータを1ビット右もしくは左にシフトさせるレジスタをシフトレジスタという
Binデータはクロックに同期して右側へ1段ずつシフトしていく
順次入力されたシリアルデータが一挙に並列出力(パラレル)された状態となる
プリセット端子はD-FF内部状態をリセット(Q=1)する端子、PR=L(0)で有効、H(1)で無効
クリア端子はCLR=0で内部状態がクリア、CLR=1で無効

### カウンタ
2進数を数える回路をバイナリカウンタという
4ビットの場合は16進カウンタという
JK-FF, T-FFで、J=K=1としてクロック信号CKを入力するたびにトグル動作を行い次段の入力となる
値が1ずつ増加をアップカウンタ、減少をダウンカウンタという
FFで時間遅延があるため、完全には同期しておらず、非同期カウンタという(asynchronous)
不要なパルスをハザードという、補出力で対策を講じる

記憶素子(flip-flop)

順序回路
->入力状態と回路の内部状態によって出力が決まる
->過去の状態を記憶する機能がある

### フリップフロップ
2つの安定した状態を持つ
A=0の時、NOT出力は1となり、これが入力Bになる 入力BのNOT出力は1となり、Aの入力に戻される この状態が維持される
一度決まった状態は新たに特定の入力がない限り保持される為、記憶素子と考えることができる
フリップフロップは様々な種類が存在し、レジスタやカウンタなど多くの応用回路がある

### RS-FF(reset-setFF)
リセット信号Rが1の時、出力Qが0にリセットされ、セット信号Sが1の時、Qが1にセットされる
R=1, S=0の時、Q=0、!Q=1となる
R=0, S=1の時、Q=1、!Q=0となる
R=0, S=0の時、直前の出力状態Q, !Qがそのまま保持される
R=1, S=1の時、Q, !Qがどちらも0になり不安定となり正常に動かない為、禁止されている

### 同期式RS-FF
R, Sの入力の他に、クロック信号CKを用意し、この信号変化に同期して出力を変化させる。この信号をトリガ(ポジティブエッジトリガ)という
CK=1とすると、RS-FFと同じ。CK=0とするとR=0, S=0に強制したことに等しく、出力内容は保持される

### JK-FF(Jack knife FF)
R=1, S=1の欠点を無くすための仕様
ANDと同期式RS-FFの組み合わせ
J=1 K=0の時、Q=1 !Q=0
J=0 K=1の時、Q=0 !Q=1
J=0 K=0の時、前の状態を保持
J=1 K=1の時、前の状態を反転…トグル動作
J=1 K=1でCK=1が長くなると発振状態となるため、CK=0にしないといけない。それがマスタースレーブ型JK-FF
->ネガティブエッジ動作

#### T-FF(toggling flip-flop)
周波数を1/2にする働きがある

### D-FF(delay flip-flop)
信号を遅延する
入力信号Dを出力するにはCKのネガティブエッジトリガを待たなければならず遅延される
->桁をずらすシフトレジスタなどに使われる

「記録する」って、要するに電子信号を保持するってことなのか。
なんか前髪を掴まれた気分だなー