OmniAICreator/Qiita-1.07M huggingface dataset:
pythonでgnuradio その14

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
sin波を録音せよ。

# サンプルコード

```
from gnuradio import gr
from gnuradio import blocks
from gnuradio import analog

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		samples = sample_rate = 48000
		ampl = 0.3
		src = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 440, ampl)
		head = blocks.head(gr.sizeof_float, samples)
		dst = blocks.wavfile_sink("a1.wav", 1, sample_rate, blocks.FORMAT_WAV, blocks.FORMAT_PCM_16)
		self.connect(src, head, (dst, 0))

if __name__ == '__main__':
	try:
		my_top_block().run()
	except KeyboardInterrupt:
		pass






```

以上。
【GDevelop】スクロールメニュー実装の複数候補と結論

# はじめに

GDevelopでのスクロールメニュー。

絶対に公式で拡張機能を用意してるはずだろ！？と思ったけれど、なんか無かったです。

探した結果、色々見つけて、どれもドンピシャ感が無かったので恨みとしてメモしておきます。

結論から書けとは良く言われますが、見つけられなかった事への憂さ晴らしが目的なので結論は最後です。



# SimpleScrollableListExtension

なんか日本の方が作ってくれたっぽい拡張機能。

「GDevelop　リスト　スクロール」とかで検索して出てきたもの。

3年前（2021年）のものが今でも英語圏でも使われてるっぽいのは、良いのか悪いのか……。

https://www.youtube.com/watch?v=E4Z9KlIYqrQ&pp=ygUPZ2RldmVsb3Agc2Nyb2xs


【Good】

・クリック時の処理などが簡単

・完成度が結構高い

・動画を見るだけで結構やれる

<br>

【Bad】

・サイズの調整方法が分からない（画像サイズを変えなきゃダメ？）

・背景色が消える仕様でリスト項目しか見えない

・「アイコン」「タイトル」「テキスト」の3要素で、表示項目を増やせないっぽい？

・ギチギチに詰まる感じのレイアウトとかを変えられそうにない？

・項目数が少ない時に下部がスカスカになっちゃう？

カスタマイズ方法が全然分からんという……。


# 縦型スライダーメニュー
https://forum.gdevelop.io/t/i-need-help-how-do-i-create-a-menu-in-a-vertical-slider/39003


【Good】

・めちゃ処理が少ない
→真似するだけなら1時間かからないかも

・特別な拡張機能を使わず、プレーンな機能を組み合わせてやってそう

<br>

【Bad】

・表示の改善方法がまるで分からん……🥺

・縦型スライダーを触って動かすのが面倒
→この形ならどうしても表示部分をスワイプでスクロールして欲しい！！！

・スライダーオブジェクトではない……。ややこしいけど。
→シェイプペインターとかいうオブジェクトを使ってるので、アセットや画像でのデザイン拡張が難しい？



# Stick & Grabble

https://forum.gdevelop.io/t/how-do-i-create-a-scrollmenu-similar-to-duolingos-or-candy-crush-sagas/50107

Duolingoみたいなメニュー作るにはどうしたらいいの？という記事

かなりシンプルで、

1.　背景オブジェクトに項目を貼り付ける（固定する：Stick）
2.　背景をY軸方向にだけ動かせるようにする

1はSticker（？）とかいう拡張機能で設定出来る。

2は発想の転換というか、Draggable拡張機能での設定”ではなく”、常時処理として『X座標の指定』という形で解決出来る。
（X軸が変わらない＝Y軸移動しか出来ない）

3. 加えて必要な設定ABC

A. 『Draggableビヘイビア』の設定で『Density』を「0」にする
→角度が変わらないように

B. 『Draggableビヘイビア』の設定で『Gravity Scale（重力）』を「0」にする
→自動で落ちていかないように

C. Y軸を画面内に収める
→縦幅（Height）を考えながら、地味に計算がむずい設定

## 画像で解説？

![gd_draggle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/38a0389c-1e9a-001e-3fc2-f309c3b36c7a.png)

拡張機能は、

・Sticker（Stick objects to others）

・Draggable（for physics objects）

以上2つを追加。

↓

そしてスライダーの上に置くオブジェクトのビヘイビアに『Sticker』を追加

ScrollFieldに『Draggable』を追加
→設定としては先述の通り、いくつか0にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/8bd71817-6b35-a7e0-5902-41f123c64328.png)

いくつかの設定は分かんない……。

（追記：Linear Dampingを100くらいにすると手を離してすぐ止まるようになる）

↓

イベント処理

・Stickする

・Scrollの制限をかける
→横移動させない（X座標を固定）
→上下に行き過ぎないようにする（数値次第でY座標を強制変更する）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/7e94c214-b06e-e8ad-a49a-9d3b0d383f65.png)


【Good】

・これだよこれェ～～～！！！！！Foooooooooooo!!!!!!!!!!!

![gd_scroll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/7ac7b1ce-f1fd-ad62-cf41-f7a144185f8a.gif)


<br>

【Bad】

・もっと検索上位に出てこい！😡



# まとめ

オシャレにコーディング（イベント処理？）での項目追加は諦めました。

ずらずらとオブジェクトを大量追加して管理するつもりです。

文句も言いましたけど、やっぱSimpleScrollableListExtensionで良いんじゃね？感も結構あります。




終わり
128日目 Gitを多用するようになった社畜M

## ♠はじめに
こんにちは、社畜Mだぜ。
最近やっていることがGitを多用することが多いからここでGitで利用される単語を教えていくぜ！ぶっちゃけ初心者向けになるがそこは気にするなだぜ！いいな？
さぁ、行くぜ！！！

**デュエル！**
## ♠まずGitとは
俺のターン！になる前に、そもそもGitとは何なのかを軽くおさらいしていくぜ！
Gitってのは簡単に言っちまえばファイルやコードの変更履歴を管理するツールだぜ。**バージョン管理システム**ともいえるな。

### ❤バージョン管理システムとは？
バージョン管理システムってのはプロジェクト進行に伴って行われる変更を記録し、後からその変更を確認、または変更前に戻せる仕組みだぜ。必要に応じて過去のバージョンに戻せるぜ。

### ❤Gitの特徴
次はGitの特徴についてだぜ
Gitは分散型のバージョン管理システムであり、各ユーザーが自分のコンピュータ上でファイルやコードの変更履歴を管理し、ブランチを利用して新機能の開発や作業を分岐させ、複数のブランチで行った作業をマージすることで統合できるのが特徴だぜ。

## ♠使うGitの機能一覧
それじゃぁここからが本題だぜ、ここに俺が覚えといた方がいいと思ったGitの機能および単語の効果について教えてやるぜ！



|機能|効果と補足|
|-|-|
| Clone<br>クローン | リモートリポジトリのコピーをローカルマシンに作成することが可能。<br>クローンは既存のリモートリポジトリを自分PCにダウンロードして、そこ時点から開発を始めたいときに使う。<br>（クローンするには**SourceTree**もしくは**TortoiseGit**というアプリを使うことをお勧めするぜ！・・・※1） |
| Pull<br>プル | リモートリポジトリから最新の変更を取得し、ローカルリポジトリに統合する。<br>他開発者がリモートリポジトリに新しい変更をプッシュしていた場合、その変更を自分のローカルに取込むためにプルを使用する。<br>他人の変更を亡き者にしないよう、リモートとローカルの基準を揃えるためなんだぜ! |
| Push<br>プッシュ | ローカルリポジトリの変更をリモートリポジトリに反映させる。|
| Commit<br>コミット | ローカルで行った変更をリポジトリに保存し、履歴に追加する。<br>ファイルに変更を加え、その変更を確定してリポジトリに記録したいときに使う。|
| Fetch<br>フェッチ | 最新の変更を取得することができるが、ローカルリポジトリには統合しない。<br>リモートリポジトリでどんな変更が行われたかを確認したいが、ローカルに統合したくない時に利用される。|
| Branch<br>ブランチ | プロジェクト内で独立した作業ラインを作成する。<br>新しい機能の開発やバグの修正など、メインの作業とは別に作業を進めたいときに使用する。|
| Merge<br>マージ | 複数のブランチで行われた変更を一つに統合する。<br>ブランチ上で作業した内容をメインのブランチに統合したいときに使う。|
| Tag<br>タグ | 特定のコミットにラベルを付けることができる。<br>ソフトウェアのリリースバージョンや重要なポイントを記録しておきたいときに使う。|
| Stash<br>スタッシュ | 現在の作業中の変更を一時的に保存し、作業ディレクトリをクリーンな状態に戻す。<br>作業途中で他の作業を優先する必要があるときや、ブランチを切り替えたいが、現在の変更をコミットする準備ができていないときに使うのがおすすめだぜ！|

※1 
- SourceTree
インストール：https://www.sourcetreeapp.com/
- TortoiseGit
インストール：https://tortoisegit.org/download/



## ♠まとめ
Gitは、ファイルやコードの変更履歴を管理するツール、さまざまな機能を使いこなすことで、効率的にプロジェクトを進行させることができるぜ。プルやプッシュを使ってリモートリポジトリとローカルリポジトリ間のデータのやり取りを行い、ブランチやマージで作業を分けたり統合したりする。さらに、クローンやフェッチ、コミット、タグ、スタッシュなどを駆使することで、開発をスムーズに進められるようになるんだぜ！
みんなも使いこなしてくれよな！

## ♠おまけ
今回の社会人が知っておいた方がいいビジネスマナーはこいつだ！
「**電話対応**」だぜ。

電話対応は相手の顔が見えない分、状況に配慮しながら丁寧根対応が求められるぜ。初めて会社に電話をする場合、**電話の印象＝会社の印象**につながるからかなり重要だぜ。
電話を掛けるときはタイミングや要件の伝え方を、受ける側は大げさかもしれないが会社の代表であるという意識を持つことだぜ。

受ける側は伝達漏れがないように**内容をメモしておく**のも重要だぜ。

<br>

今回はここまでだぜ！！！
**ターンエンド**
pythonでgnuradio その13

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
1kHzのノコギリ波を表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/38efe503-424f-3ecd-62e7-f895369f150e.png)

# サンプルコード

```
from gnuradio import gr
from gnuradio import blocks
import sys
try:
	from gnuradio import qtgui
	from PyQt5 import QtWidgets, Qt
	import sip
except ImportError:
	sys.stderr.write("Error: Program requires PyQt5 and gr-qtgui.\n")
	sys.exit(1)
try:
	from gnuradio import audio
	from gnuradio import analog
except ImportError:
	sys.stderr.write("Error: Program requires gr-analog.\n")
	sys.exit(1)

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		sample_rate = 8000
		ampl = 0.2
		npts = 256
		src0 = analog.sig_source_f(sample_rate, analog.GR_SAW_WAVE, 1000, ampl)
		dst = audio.sink(sample_rate, "")
		self.connect(src0, (dst, 0))
		self.snk1 = qtgui.time_sink_f(npts, sample_rate, "Sin Time Example", 1)
		self.connect(src0, (self.snk1, 0))
		self.qapp = QtWidgets.QApplication(sys.argv)
		pyQt = self.snk1.qwidget()
		pyWin = sip.wrapinstance(pyQt, QtWidgets.QWidget)
		pyWin.show()

if __name__ == "__main__":
	tb = my_top_block()
	tb.start()
	tb.qapp.exec_()
	tb.stop()

```

以上。
pythonでgnuradio その12

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
1kHzのサイン波を表示せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/83e17f6e-a948-3c22-86d5-e6c865585ead.png)

# サンプルコード

```
from gnuradio import gr
from gnuradio import blocks
import sys
try:
	from gnuradio import qtgui
	from PyQt5 import QtWidgets, Qt
	import sip
except ImportError:
	sys.stderr.write("Error: Program requires PyQt5 and gr-qtgui.\n")
	sys.exit(1)
try:
	from gnuradio import audio
	from gnuradio import analog
except ImportError:
	sys.stderr.write("Error: Program requires gr-analog.\n")
	sys.exit(1)

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		sample_rate = 8000
		ampl = 0.2
		npts = 256
		src0 = analog.sig_source_f(sample_rate, analog.GR_SIN_WAVE, 1000, ampl)
		dst = audio.sink(sample_rate, "")
		self.connect(src0, (dst, 0))
		self.snk1 = qtgui.time_sink_f(npts, sample_rate, "Sin Time Example", 1)
		self.connect(src0, (self.snk1, 0))
		self.qapp = QtWidgets.QApplication(sys.argv)
		pyQt = self.snk1.qwidget()
		pyWin = sip.wrapinstance(pyQt, QtWidgets.QWidget)
		pyWin.show()

if __name__ == "__main__":
	tb = my_top_block()
	tb.start()
	tb.qapp.exec_()
	tb.stop()





```

以上。
ゼロ除算ってなんや

ここでゼロ除算の脆弱性（Divide By Zero）について「わかりやすく」説明してみたいのですが、はたしてうまく説明できるでしょうか・・・

まずゼロ除算ってなんやというところです。
これを読んでいるオジサンたちは、算数の時間に
Nx0=0　
そして、
N÷0=0　

と習った人もいるんじゃないでしょうか。

数学の世界だと「＝」って「等号」って言いますよね。
＝の右側と左側は一緒（等しい）ですよって意味になります。

で、たとえばですね
6x3=18　という式があるとして、
6=18÷3　と置き換えたりできるっていうの習いましたよね？
3=18÷6　でもいいです。

割り算だと
6÷3=2
2x3=6
って習います。

それじゃあこの
N÷0=0　
で同じことをやってみたいんですけど
当てはめてみると
N=0x0
0=Nx0
えっこれってN=はかならず0じゃん
ってなりますよね

現在の数学だとこれは「未定義」と習います。
なにかをゼロで割ることは「できない」が正解なのですね。

で、コンピュータというのは計算機ですから、出来ないことをやれって言われると停止することがあるわけです
もちろんプログラミングのなかでそのようなことが発生しないようにしてはいるのですが、

試しにいまお持ちのスマホの電卓で6÷0を計算させてみてください。きちんと作ってあるおかげで「ゼロ除算はできません」旨の回答が得られるかと思います。

ところが思いがけずそのような計算をさせてしまうようなバグを残したままリリースされるプログラムもあるわけで、そういったバグのことを「ゼロ除算の脆弱性」と呼称しているわけです。

今回のは、ちょっと自信ないんですけど、こんな説明でご理解いただけますでしょうか。
あるいは「ソコ間違ってんで！」とかRFC（Request for Comments）です。
Nodeビギナーズブックでつまったところ(formidableのインタフェースが変わっている)

## 要点
[Nodeビギナーズブックの最後の方](https://www.nodebeginner.org/index-jp.html#handling-file-uploads)は当時とformidableのバージョンが違うため、そのままでは動かない。

:::note warn
筆者はJavaScript/TypeScript/Node.jsは全くの初心者ですので、
本記事の内容は正確ではない可能性があります。
:::

:::note info
開発環境
+ Ubuntu 24.04 LTS
+ node v20.16.0
+ formidable@3.5.1
:::

# 目次

- [エラー内容](#エラー内容)
- [原因](#原因)
- [解決方法](#解決方法)
- [参考](#参考)

# エラー内容

```javascript:requestHandlers.js
function upload(response, request) {
  console.log("Request handler 'upload' was called.");

  var form = new formidable.IncomingForm();
  console.log("about to parse");
  form.parse(request, function(error, fields, files) {
    console.log("parsing done");

    /* Possible error on Windows systems:
       tried to rename to an already existing file */
    fs.rename(files.upload.path, "/tmp/test.png", function(err) {
      if (err) {
        fs.unlink("/tmp/test.png");
        fs.rename(files.upload.path, "/tmp/test.png");
      }
    });
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write("received image:<br/>");
    response.write("<img src='/show' />");
    response.end();
  });
}
```

```:実行結果
node:internal/errors:541
      throw error;
      ^

TypeError [ERR_INVALID_ARG_TYPE]: The "oldPath" argument must be of type string or an instance of Buffer or URL. Received undefined
}
```
files.upload.pathがundefinedになってしまうため、エラーが発生している模様。

# 原因
筆者が使用したのformidableのバージョン(formidable@3.5.1)では、
form.parse()に渡しているコールバックの第3引数filesの要素はFileの配列になっているため、
配列の要素を指定してアクセスする必要がある。

```javascript:~/.cache/typescript/5.5/node_modules/@types/formidable/index.d.ts
    type Files<U extends string = string> = {
        readonly [Prop in U]?: File[];
    };
```

# 解決方法
```javascript:requestHandlers.js
function upload(response, request) {
	console.log("Request handler 'upload' was called.");

	let form = new formidable.IncomingForm();
	form.encoding = "utf-8";
	console.log("about to parse");
	form.parse(request, (error, fields, files) => {
		console.log("parsing done");
		// ↓↓↓ forEachで配列の要素にアクセス
		files.upload.forEach((file) => {
			let filePath = file.filepath;

			fs.rename(filePath, "./test.png", (err) => {
				if (err) {
					fs.unlink("./test.png");
					fs.rename(filePath, "./test.png");
				}
			});
		});

		// ↓でも動くには動いたがあまりにも汚い
		//let filePath = files.upload[0].filepath;

		response.writeHead(200, { "Content-Type": "text/html" });
		response.encoding = "UTF-8";
		response.write("received image:<br>");
		response.write("<img src='/show' />");
		response.end();
	});
}
```

# 参考
* [Node.js Upload Files](https://www.w3schools.com/nodejs/nodejs_uploadfiles.asp) 主にこちらのソースコードを参考にさせていただきました。
* [Nodeビギナーズブック](https://www.nodebeginner.org/index-jp.html)
* [formidableのGitHubリポジトリ](https://github.com/node-formidable/formidable)
移りゆく利用形態（IaaS,PaaS,SaaS）


いま現在だとだいたいの家庭にコンピュータがありますね。
スマートフォンをコンピュータに含めたとしたら各個人が1台（以上）コンピュータを持つ時代です。

コンピュータを使い始めた頃っていうのは、サイズが大きくて1台で電算室を占拠し、性能も当時の指標でかなり高いものが一つだけドンと置いてあり、それをみんなで「何時から何時まで」みたいな感じで順番に交代で使っていました。

それを、ダム端末という対して何にも出来ない性能の端末を手元に置いて、リモートでサーバへ接続することで、同時にサーバのリソースを仲良く使うようにしました。

オペレータの数が多い職場だと、とっても高性能な高価なサーバが必要になります。

＜そんな古いことボクもよくしらないので少し時代をスキップします＞

このあたりでそれなりの演算能力を持つコンピュータが一人ひとりに配られる時代になりました。
これを個人専有のコンピュータなので「パーソナルコンピュータ」と言います。

演算自体は手元のCPUで行うため、中央で演算を肩代わりする高性能サーバは要らなくなりました。
サーバ自身も小型化され「PCサーバ」などという言葉もできます。

それから、VDIの話もすこし混ぜておきましょうか。
パブリックなスペースだったりすると必ずしも高性能なPCを置く必要もないのでPC自体を仮想化して使う形態が出てきます。

VDIそのものは別の記事に委ねるのですけど、PCそのものを仮想化してスペースに置かれたシンクライアントからリモートデスクトップ（に似たプロトコル）で接続して使います。
これだと、高価なPCをパブリックスペースに置く必要もないし、盗まれたとしてもそのシンクライアント自体にはユーザのデータは入っていませんのでセキュアです。
（そのかわりどこの大学でもUSBメモリの忘れ物が爆発的に増加しました。）

-------
さてここからトレンドの話題にしましょう。

まずはDaaSを説明します。
・DaaS (Desktop as a Service)
上記で説明したVDIは、仮想PCが自社内またはリモートサイトのオンプレサーバ上に構築されています。
これをクラウドに持っていったものがDaaSと呼ばれます。
シンクライアントのような専用端末もしくはノートPCなど、企業によってはこのDaaSに接続する以外ほとんどなにも出来ないような設定にしたPCを貸与するようにしているところも見かけます。

次からの3つは同時に覚えるのがいいと思います。

・IaaS,PaaS,SaaS
この3つは（上記のDaaSもそうなんですけど）どこからどこまでをクラウドに置くのかという点で相違があると思えばわかりやすいと思います。

SaaSというのはソフトウェアをクラウド上のリソースから提供する仕組みで、ローカルのPCにそのソフトウェアをインストールしないでも使用できるようにする仕組みのことです。
これは一般の人でもM365とかGoogleのツール群（たとえばGoogleMeetなんてアプリをインストールした覚えないけど使えますよね）などで結構慣れ親しんでいる人が多いですね。

PaaSというのはこのアプリケーションのインストールなどは必要ですがそれを実行するためのランタイム（実行環境）であったりあるいはOSであったりといった部分（Platform)をクラウド上のリソースで賄うという考え方です。

次にIaaSというのはAWSとかGCPとかAzureみたいに、OSとかアプリケーションとかは自分で用意して設定しないといけないけどハードウェアの部分やネットワークの部分なんかは準備してくれるというもので、みなさんがざっくりと「クラウド」って言っているのはだいたいこれに当たります。

-----
このなかで最も一般の人に（それと知らずに）普及しているのがSaaSでしょう。
ただし、SaaS（以外のほかのaaSを含む）は利用するたびに通信が発生します。
現在の日本では移動体通信は従量課金で、スマートフォンからSaaSを利用するたびに高額な通信料金を必要とします。
技術が発展するためにはより多くの人がサービスを利用することが重要です。
こんにちでは一般の人の環境を鑑みるとPCよりもスマートフォン/タブレットの利用が伸びています。
日本でSaaSの発展を望むならば、通信料金の引き下げと通信量（トラフィック）の抑え込みが課題になってくると思います。
サーバ証明書


☆ここでいう証明書は「SSL証明書」のことです。

さて、サイトを作る際にhttpではなくてhttpsを使いましょうという話をしました。
これ自体はWebサーバ（IISやApacheなど）の設定ですぐに出来てしまいます。

通信ポートは80/tcpから443/tcpへ変更され（もちろん他のポートを指定することも出来ます）、通信は暗号化されます。

でもこうしたサイトはほんとうの意味で信頼されません。
なぜでしょうか。

ここを簡単に説明します。

上記の設定だけだと、「このサーバは信頼できるサイトですよ」という「証明」を行う「証明書」が「自分で発行したもの」になるんです。

よく言われる例えが「オレオレ詐欺と同等」というもので、まさしく自分で自分を証明しているんです。
なので、信頼するに値しないサイトということになるんですね。

ではどうしたら良いのでしょうか。

それは、「認証局（CA)」と言われる事業者から証明してもらうんですね。
申込みから1週間も待てばその認証局から証明書が届きます。
それをWebサーバにインストールするわけです。

この認証局には2つの種類があって、一つは「ルート認証局」もうひとつは「中間認証局」と呼びます。
ですので認証局からは2種類の証明書が発行されてくると思います。

認証の順番としては、
ルート認証局が中間認証局を証明し、中間認証局があなたのWebサーバ（あるいはあなたの組織（会社）を証明する、という感じです。

ここ10年くらいのあいだで、この証明書は有効期限を1年にしなさいということになりました。
以前はもっと長かったので、1度証明書をインストールしたらサーバリプレースまでの間に証明書を交換することは1度あるかないか、といった頻度だったのですが、現在ではこの証明書の発行依頼＞受け取り＞入れ替えの作業が年に1度発生します。

この仕組みはメールサーバなどにも必要になるものなので、よく慣れておいてください。
公開鍵認証


☆注意
本トピックは掘り下げると本が何冊も書けます。
よってほんとに初歩というか、実務上最低限知っておいていただきたい部分のみに絞ってご紹介します。

公開鍵認証はさまざまなところで使われています。
今回はその中でSSHを例にとって説明をしていこうと思います。

まずSSH以前の世界はもっと「やさしいせかい」でありましたのでクライアントからサーバへの接続はRSH（リモートシェル）というプロトコルを使ってサーバにログインしていました。

まず作業者の手元にWindowsPCがあるとしましょう。
RSHが使用できるアプリケーションをインストールしてあります。

サーバ側のOSのはLinuxとしましょう。
RSHのサービスが動作し、ファイヤーウォールは「やさしいせかい」なのでかけていません。

「サーバ上で○○のファイルを削除しておいてください」
などと依頼されて作業者はアプリケーションを起動し、接続先サーバのホスト名あるいはIPアドレスを入力して接続します。
ユーザ名とパスワードを入れたら接続が完了します。
そのプロンプトで打ったコマンドはローカルの作業PCではなく接続先のサーバ上で実行されます。

平和ですね。

--------------

ところが、一部の学者さんや米軍しか使っていなかったインターネットに非常に沢山の人々が繋がるようになりました。
その中には敵国であるソ連のひともいるでしょう。
「すべての人々が平等なパラダイスみたいな国」を目指した共産主義、社会主義の人たちですね。
そうでなくても敵対する企業の人もいるでしょうし、とにかくインターネットは一気にリアル北斗の拳状態と化しました。

そんななか、従来の接続方式では問題があることがわかりました。
そこで暗号化という技術が発達します。

人類の歴史は戦争の歴史といいうくらいです。
人類が産まれてから、今に至るまで戦争をしないときは1秒もなかったといわれます。
世界はいつまでたっても平和になりません。

敵国に通信を知られるのはたいへん不利です。
昔の通信はスニーカーネットワークです。

伝令が手紙を持って走るわけですね。
ここで世界で初めての暗号が考案されました。

かのローマ皇帝カエサル・シーザーの考案したシーザー暗号などというものもあります。

戦争の歴史は暗号の歴史でした。
第2次世界大戦で旧日本軍の暗号はことごとく米国に破られていたというのはあまりにも有名な話ですね。

--------------

そこで通信の世界においても暗号化はたいへん重要な技術となります。
それまで様々な暗号化がありました。がことごとく破られてきたのです。
もちろんrshにも暗号化する機能はありました。

この暗号化の歴史に大きな楔を打ち込んだのがこの公開鍵暗号方式と言えます。

公開鍵認証では、2つの鍵を作成します。
ひとつは、秘密鍵といいます。
もうひとつが、公開鍵です。

RSHは廃れ、代わりにSSHが登場しました。
このSSHでは公開鍵認証を使うことが出来ます。

まず、作業者PCで秘密鍵と公開鍵を作成します。
そして、公開鍵をサーバへコピーします。

その後、やっていることはユーザ名とパスワードを入力して接続。
接続されたらそこでコマンドを入力。
あれ？

やっていることってRSHのときとあんまり変わらないですよね？
でもこのときのやり取りで行われる仕草がちがうんです。

細かく説明すると最初に述べたようにかなり長くなりますのでバッサリ割愛しましょう。

どうやって暗号化しているか、のメカニズムがほんとにざっくり理解できていればここではまずOKです。
それは、
通信において暗号化を施す場合は
「相手の公開鍵を使用して暗号化する」
「受け取った側は自身の秘密鍵を使って復号する」
「秘密鍵が破られると暗号は破られる」
の3つだけを覚えてください。

--------------

インターネット黎明期には平和だった通信も暗号化を施さないと安心できないようになりました。
SSHに取って代わられたRSHのように、いまではあまり使われなくなった/今後そうなるであろうプロトコルがたくさんあります。

例えばHTTP
いまではURLがhttpで記述されていると身構えてしまうようになりました。
httpsを使用してください。

ファイルの交換にはrcpの代わりにscpを使います。

ほかにもFTPがありますね。
FTPの代替としては、ftps、またsftpというのもあります
もちろんscpを使っても構いません。

このように、プロトコル名の前か後ろにsがついているものはだいたいが「Secure」のsです。

ただし、公開鍵認証を使用しているからすべてが大丈夫、などということはありません。
公開鍵認証や公開鍵暗号と言われるものを使用することがスタートラインだということです。


--------------
ちょっと書き足りないものがいっぱいあるのですけど、できるだけシンプルに書きたかったのでゴッソリ消しました。
後日続きがあるかも知れませんが燃え尽きて無いかも知れません。
Windowsサーバ構築（ディスク容量について）


Windowsサーバを構築するとき、ちょっと考えてしまうのが「Cドライブの容量をどうするか」です。

マイクロソフトから、「このサーバOSはこのくらいの容量のディスクにインストールしてください」的な指標が出ているのですがそれは最低値なので、当然それ以上の容量が要ります。

OSの他にはアプリケーションが入りますね。
サーバOSにいれるアプリケーションはだいたい容量がでかいです。
普段クライアントPCしか触っていない人には、ちょっとびっくりすることもあるかも知れませんね。

他にはなにがあるでしょう。
ログはログサーバに送ってしまうのでサーバ自身には貯まらない前提としましょう。
でも、収集するログってほんとに「すべてのログ」ですか？

ログのローテーションを「すべてのログ」に対して行えますか？
そもそもどんなログが出るのか網羅出来ているでしょうか。

そのサーバを何年使用するつもりなのか、も把握しておく必要があります。
OSのログだけならそんなに気にすることもないのですけど、アプリケーションのログファイルも結構見過ごせるものではありません。
必要であれば構築前にベンダーにそのアプリケーションはどういったログが出力され、クライアント数n台の環境ならどの程度のログファイルが発生するのか、また退避する際にはアプリケーションを終了する必要があるのかなど聞いておく必要があるでしょう。

---------
ディスク容量を論じる際に気にかけなければならない項目がOSサイドでまだ存在します。
仮想メモリファイルとメモリダンプです。
・仮想メモリ
　実装された物理メモリだけでサーバの動作をまかない切ることは出来ません。
　そのためHDD上に予約された空間を作成し、必要に応じてメモリとして使用します。
　昔のOSでは（システムドライブには仮想メモリをおかずにそれ以外のドライブに設定するべき」となっていました。
　これは近年では（WindowsOSの場合）OSに自動的に設定させるほうがパフォーマンスが良いとされています。よって現在は無視してよいでしょう。
・メモリダンプ
　これはサーバがクラッシュした場合に障害調査のためメモリ上に載っていたデータを次回起動時にダンプファイルとしてHDDに吐き出す設定を指します。
　推奨値は「完全メモリダンプ」となるのですが近年は大変たくさんのメモリを搭載するサーバが増えてきました。
　このメモリダンプを完全メモリダンプにするとメモリ搭載量と同じだけのディスク容量が必要となります。
　つまりCドライブに完全メモリダンプを吐くように設定してしまうと、クラッシュ後の起動時にシステムドライブに数十GBのファイルを作成してから起動することとなります。
　理想は「システムパーティションが置かれていない別ドライブのパーティションに設定すること」ですが、そんなものはないということもありますので次善の策として「システムパーティションではないシステムドライブ（Dドライブなどとして設定）が考えられます。

＊「パーティション」「ドライブ」などがよくわからない方は別途説明するので教えて下さい。

---------------
データベースサーバというのがありまして、その名の通りデータベースが起動しています。
設計上「データベースサーバ」とされているものは何らかのアプリが必要とするDBを提供することを前提としているのでそのように設計されています。
具体的には、ストレージ製品のほうであらかじめ専用パーティションを何TBとか作成しておき、それをEドライブ等としてマウントさせるわけです。
そして肝心のデータベースソフト（OracleとかMSSQLとかPostgresとか）はそのEドライブにインストールするといった運用ですね。
もちろんサーバを利用する何年かの間にどれほどDBが肥大するのかを計算したうえでパーティションサイズを決定します。

と、ここまでは良いのですが問題は設計時に想定していなかった（想定から漏れていた）DBです。
よくあるのはバックアップソフトですね。
数多のバックアップソフトはだいたい内部にDBを持っています。
バックアップソフト本体インストール前に、SQLExpressをインストールするようになっていたりしますね。
このDB、どこに配置されるかというとだいたいはApplicationRoot（端的に言えば「C:¥Program Files¥~~」です。）

もちろんインストールする際に、どこにインストールしますかと聞いてくれるのですけどおおむね既定値「C:¥Program Files¥~~」で進められてしまいます。

このままで運用を続けると、Cドライブはあっという間に埋め尽くされ、あるいはフラグメントが発生し（最近のOSはうまくやってくれるようですがそれでも）一気にサーバパフォーマンスが落ちてしまうことでしょう。

こういった場合は別パーティションにインストールすることをおすすめ致します。

もしもあなたが構築要員で、バックアップソフトウェアのインストールを任されて、設計書を見ながらインストールしているけどもインストール場所について設計されていない、または既定値でインストールするよう求められていたとしても、DBを入れる際にはリーダーに相談してみてください。
ネットワーク機器いろいろ


世の中にはいろいろなネットワーク機器がありまして、
できるだけ簡単に説明します。
もう古くて使われてないようなものもあるのですけど、知っとかないといけないかなぁと思うものは書いていきます。

・ハブ・・PC同士をつなげるのには1対1で繋げば事足りますが、3台になった途端に必要になった（過去形）装置です。
複数の機器を繋ぐことのできる機器ですが、なんら制御はおこなわないために、
さるポートに入ってきたデータは他のすべてのポートから出ていきます。
いまでは「バカハブ」と呼ばれ、使われることはほぼありません。

・ブリッジ・・ネットワークとネットワークを接続する場合に使用される機器で、もしこれをハブで実現するとネットワークは一つになってしまいます。
層ではなくてあくまでネットワークとネットワークを繋ぐ架け橋として存在する装置で、現在はあまり見かけることはありませんが言葉として随所に残っています。
Windowsで実装されたときに問い合わせが殺到したことがありました。
たしかXPだったと思うのですけど、その当時でもすでに知らない人が多いようなデバイスだと言うことです。

・スイッチ（L2SW）・・・ハブから進化したスイッチは、一度通信したときにそのポートに繋がっている相手のMACアドレスを一定期間覚えており、そこにだけデータを流します。
このMACアドレス表のことを「ARPテーブル」とよび、たまに使用することがある言葉なので覚えておきましょう。

・ルータ・・・ブリッジと同じくネットワークとネットワークを繋ぐ存在ですが、もう少し（とっても）賢くなっています。ルータについてお話ししだすとそれだけで本が書けてしまうので割愛しますが、ブリッジがレイヤー2で動作するデバイスであるのに対し、ルータはレイヤー3で動作します。
つまりブリッジはMACアドレスをみてパケットがブリッジを渡る渡らないを判断しますが、ルータはIPアドレスを見てルーティング先を判断します。

・スイッチ（L3SW）・・・スイッチではありますがレイヤー3にて動作し、VLANを扱うことができるものをL3SWと呼びます。
このあたりから機能が豊富になり、おおくのL3SWはルータとしての機能を持っています。

・ファイアウォール・・・企業ネットワークを守るためにアプライアンス機器としてのファイアウォールを設置することがあります。

・負荷分散装置・・・複数のWebサーバ（アプリケーションサーバ）へリクエストを振り分け、サーバ1台あたりの負荷を軽減するための装置です。

・SSLアクセラレータ・・・いま現在では通常httpの通信はSSL化してhttpsとされることが多くなりましたが、SSLは暗号化/復号化にCPUを消費します。
そのため、Webサーバに対する負荷を軽減するためSSL暗号化/復号化を担当するアプライアンスがこれです。

最近の製品では、一つの製品で複数の機能を持つものがおおく、単純に説明できるものではないのですが、概念だけでも理解していただければと思います。
さまざまな攻撃手法


・XSS（クロスサイトスクリプティング）
悪意のあるスクリプトをユーザに実行させ、別のサイト（偽のログインページなど）へ誘導し情報を窃取したりcookieを盗んでネットバンクから不正出勤したりSNSアカウントを乗っ取るなどの被害が考えられます。

・SQLインジェクション
おもにWebフォームなどで設計者の意図しない特定の文字列を入力することにより、Webアプリケーションの裏側にあるSQLサーバ上でコードを実行するような攻撃手法。情報漏洩やデータ改ざんの恐れがある。

・OSコマンドインジェクション
上記のようにWebアプリケーションの脆弱性を利用してアプリケーションが動いているプラットフォームのOSに対してコマンドを実行する攻撃手法のことを指します。

・中間者攻撃（Man-In-The-Middle）（MITM攻撃）
ユーザとサーバ上の通信を傍受し、内容を漏出させたり本人になりすますための資格情報などを窃取する攻撃手法。

・Man-In-The-Browser（MITB攻撃）
ユーザのPCをマルウェア感染させ、ブラウザーを介して行われるサーバとの通信を窃取、改ざんする攻撃のこと。サーバ側の対策では防止することが不可能。
上記の中間者攻撃とともにユーザが気づきにくい。

・DNS Spoofing
攻撃者がDNSサーバのクエリを改ざんしてユーザを悪意のあるWebサイトに誘導する攻撃手法。
たとえば「ｈttps://hogehoge.com」を参照しようとしてDNSサーバへhogehoge.comのIPアドレスを問い合わせた際に、本物のrelation2012.comにそっくりな別サイトのIPアドレスに改ざんしたクエリをユーザに送信し悪意のある別サイトへ誘導することができる。

・DNS Poisoning
DNSの仕組みとして、一度問い合わせた内容を一定期間キャッシュする仕組みがあり、これによってDNSサーバは負荷の増大を防ぐことができる。
このキャッシュを改ざんすることで上記のように悪意のある偽サイトへユーザを誘導する手法のことを指す。

ほかにもいろいろありすぎて書ききれないので今日はこの辺にしておきます。
Webアプリケーションをコーディングするようなお仕事に重視されているスタッフ各位にはゆめゆめお忘れなきようにお願いいたします。
NTP概要

本日はNTPについて話していきます。
NTPとはNW内の時刻合わせに使用されるものです。

PCの時刻設定はCMOSにクロックが内蔵されています。
この時計は容易に狂います。

OSが起動するとき、一度だけこのCMOSの時計を参照しています。
起動したあとはその時刻を使用します。

このようにハードウェアで保存されている時刻と、ソフトウェアで管理している時刻の2つがありますが、どちらも正確さに欠けるものです。

またCMOSの電池が消耗したりすると時刻は簡単に狂ってしまいますね。

これを解消するためにNTPサーバが存在します。
WindowsOSでは起動後はデフォルトでMicrosoftのNTPサーバを参照しています。

なんだ、それなら大丈夫じゃん
と思った方も多いかと思いますが、MicrosoftはじめさまざまなOSの時刻合わせ割と大切なものでNW内では確実に合わせておく必要があります。

----------------
たかが時刻じゃん
という感想を持っている方もいるかも知れませんが案外重要です（なのでここで取り上げました。）

時刻があっていないとなにが起こるかというと、
まずは障害調査の際、ログを確認した折に時刻がバラバラだと調査に余計な手間がかかります。

PCの時刻とサーバの時刻がずれていると、ログの見方がとても難しくなります。
・PC-Aからhh:mm:ssにメールが送出された（PC-Aのログ）
・メールサーバ上でhh:mm:ssにPC-Aからのメールが届いた（サーバのログ）
ここに通信にかかる時間以上に差が発生したり、PC-Aがメールを送出する前にメールサーバにメールが届いていることになってたりすると、非常に読みにくいものになりますよね。


それどころか、もっと重大な問題があります。
認証サーバ（ドメインコントローラ）というものは、時刻があっていないクライアントを信用しません。

つまりドメイン参加も認めない、認証もしない、ログインを許さないということです。
これは重大ですね。

----------------
ではどうするのか、と言いますと、マイクロソフトのActiveDirectoy環境ではドメイン参加した際にドメインコントローラに時刻を合わせるように自動的に構成されます。

ですのでWindowsだけの環境でADを使用している場合はドメインコントローラがNTPサーバとして振る舞います。
Linuxなどのその他のクライアントがいる場合、例えばDHCPオプションでNTPサーバの構成を強制するとか、ローカルで設定するなどの方法でドメインコントローラを参照させます。

プリンタや、その他の機器もNTPが設定できるものがあるのですべてドメインコントローラを向かせれば問題ありません。

それでは、そのドメインコントローラはどこを参照するのでしょうか。


----------------
おおくの場合、Microsoft製品のみでシステムが構成されることはありません。
ドメインコントローラ以下のマイクロソフト製品群は、さらにエンタープライズな環境の一部となっていることが多くあります。

他の業務アプリが動作しているLinuxで構成されたWebサーバや、さらに上位にはFW機器、負荷分散装置、SSLアクセラレータなどもいるでしょう。
また、複数システムが共有しているディスク装置もあるかも知れません。

エンタープライズを考えた場合、NTPはどう構成されるべきなのでしょう。

それは、システム全体でトップレベルに1つのNTPサーバを設置するということです。
もちろん冗長されるべきなのですが、1つとはそういう意味ではなくて1単位のNTPサーバということです。

NTPサーバのアプライアンス製品も存在します。
SEIKO社製品など、よく見かけます。
https://www.seiko-sol.co.jp/products/time_server/

もちろん代表となるLinuxサーバでも大丈夫です。

システム内のすべてのサーバ/クライアントをこのNTPサーバを参照するようにしても良いかも知れませんがエンタープライズの規模によっては負荷が心配です。

各システムの中で代表となるサーバのみをこのNTPサーバを参照するよう構成します。
そして、次に代表でないサーバ群をこの代表サーバを参照するよう構成すればよいでしょう。
このあたりは思想が絡んでくるため設計者の意図によってこのとおりでないことがあります。

ドメインコントローラも代表サーバの一員としてこのNTPサーバを参照します。
ドメイン配下のすべてのノードはドメインコントローラを参照することでOKですね。
ここはそうあるべき（Microsoftの見解）です。

これでエンタープライズにおけるNTPのツリーが完成しました。

----------------
それではこのNTPサーバはどこを参照するのかといいますと、昔は福岡大学に合わせることが日本では通例でした。
いまではほかにももっといろいろありますが、

・福岡大学（近い内に停止するって書いてあってびっくり！）
https://www.itc.fukuoka-u.ac.jp/i/service/special/public_ntp

・NICT（国立研究開発法人情報通信研究機構）
https://jjy.nict.go.jp/tsp/PubNtp/index.html

その他、国内1次NTPサーバなどで調べると出てきますが、地理的に最も近いものを選ぶのが良いと思われます。


----------------
さて、この設定したNTPですが注意点があります。
LinuxのchronyにしてもMSのOSにしても「時刻のズレは徐々に少しずつ修正されていく」ことに留意してください。
「設定したはずなのに、なかなか時刻が合わない」ということもしばしばあるかと思いますが、使用しているOSのコマンドのmanなどを参照してログを確認しましょう。

また、NTPサーバは複数設定出来ますのでプライマリ、セカンダリの2つくらいは設定しておきたいですね。
もし冗長構成を取っていないのでしたらセカンダリはエンタープライズのトップのNTPあるいはそれが冗長していなければ更に上位の1次NTPサーバを参照させておけば良いと思います。（このあたりも設計者の思想により左右されます。）


と、このようにそんなに重要そうに思えない地味なプロトコルNTPの重要さを説明してみました。
このシリーズ全般に言えることなのですけど具体的なオペレーションの方法は製品やバージョンにより異なるので、概念だけでも知っておけば良いかなと思っています。
RAIDの概要

普段業務でRAIDを構築することがあるかと思います。
あんまり細かいことに触れずに、ざっくりと説明していこうと思います。

サーバ製品といえども、PCと同じくデータそのものはHDD（SSD）に保存されます。
HDDもいつかは壊れます。
HDDが壊れたら、サーバは停止します。

RAIDというのは複数のHDDを使用してデータを冗長しようとする技術のことです。

RAIDにはいくつかの種類があります。
一つずつ簡単に紹介してみましょう。

・RAID０・・・ストライピングと言います。２つ（以上）のHDDを用意してデータを細切れにして両方のHDDに保存します。HDDを増やせば増やすほど高速化が期待できるのですが、一つでもHDDが壊れるとデータは読み出しできなくなります。
つまり、RAIDと名前がついているものの冗長していないのでRAIDとは呼べません。
1TBのHDDを２つ買ってきてRAID０で構築すると2TBのデータが書き込めます。（100%)

・RAID1・・・ミラーリングと言います。２つ（以上）のHDDを用意して両方に同じデータを書き込みます。一つ壊れてもデータはまるまる残っています。
壊れたディスクを交換するとRAIDの再構築（まるっぽコピー）が始まります。
1TBのHDDを２つ買ってきてRAID1で構築しても1TBのデータしか書き込めません。(50%)

・RAID0+1・・・RAID10と表現されることもあります。
上述のRAID0とRAID1を組み合わせたものです。
速度と冗長性を成立させることができます。
1TBのHDDを4つ買ってきてRAID0+1で構築すると2TBのデータが書き込みできます。(50%)

・RAID5・・・ここから、実際によく使用されるRAIDとなります。
HDDを3台（以上）用意して（A,B,Cとしましょう）データをA,Bに保存します。Cにはパリティ情報というものを書き込みます。
パリティ情報はデータの復旧に必要なデータだと思ってください。
さらに追加のデータを書き込むときにはまた違うディスクにパリティを書き込みします。
RAID5では1台のHDDが壊れても、それを新品に入れ替えることでデータの復元が可能です。
1TBのHDDを3つ買ってきてRAID5で構築すると2TBのデータが書き込みできます。(66.7%)

・RAID６・・・RAID5のようにパリティ情報を生成しますが、RAID6ではこのパリティを2種類生成して、おのおの違うディスクに書き込みます。
このRAIDでは同時に2つまでHDDが壊れても復旧できます。
1TBのHDDを6つ買ってきてRAID6で構築すると5TBのデータが書き込みできます。(88.3%)

RAID3やRAID4などもあるにはあるのですが、ほとんど使用されていません。（少なくともわたしは構築した経験がありません。）

興味のある方は以下リンクをどうぞ。

https://www.fujitsu.com/jp/products/computing/storage/eternus/glossary/raid/index.html

-------------
RAIDを実装するには目的のRAID種別に対応したRAIDカードが必要です。
RAIDカードには電池が搭載されています。
サーバのマザーボードにもともとRAID機能がついていることもあります。

RAIDにはソフトウェアRAIDとハードウェアRAIDがありますが、ソフトウェアRAIDはほとんど使われていないと思います。
ソフトウェアRAIDではRAID処理にCPUを使用しますので負荷が増大するのと、OSの起動後にしか有効にならないので起動ディスクには使用できません。
また障害発生後にHDDを入れ替えると始まるリビルド処理のあいだ、負荷が大きすぎてほとんどなにも出来ない時間が発生します。（最近の高性能CPUではなんとか凌げるかも知れませんが・・・）

ハードウェアRAIDはOSから見ると単一のHDDにしか見えません。
「設定したのに1個しかHDDがない！」と慌てないでくださいね。


-------------
以上はサーバの内蔵HDDを想定して紹介してきましたが、外部接続されるストレージ製品（iStorageやNetAppなど）も同様にRAID構成されることがほとんどです。

ストレージ製品についてはここでは紹介しませんが、似たようなものだと思ってください。

障害が発生した場合、HDDを交換する必要があります。
この交換はサーバのシャットダウンを（基本的には）伴いません。
これを「ホットスワップ」と呼びます。
対応していないということはほぼ無いかと思いますが、機器選定に携わる可能性がある人は気にしておいてください。

またRAID製品（主にRAIDカード）には巡回ソフトがついてくることがあります。
OS起動中は常にディスク内を巡回して異常検知（物によっては通報まで）してくれるものです。

OSだけをみているとRAIDを構成するディスクが1つ壊れても通常通り稼働しているので、管理者にどうやって壊れたことを伝えることができるのかは気にしておいてください。
1つ壊れた（この時点ではちゃんと動いている）ことに気が付かないで運用を続けて、さらにもう1台HDDが壊れると目も当てられません。なんのためにRAIDにしたのかと責められることでしょう。
[Memo] nRF52832 OTA-DFU(ファームウェアアップデート)したい

## 概要
- nRF52832デバイスの、BLE無線によるファームウェアアップデートするための設定とか手順とかを忘れる前にメモっておく

### ちょいメモ
- nRF52832は FLASH 512KBだが、OTA-DFUを使用すると、半分以下しかアプリに使えなくなる。
    - MCUBOOT(ブートローダー)に48KB、SettingStorageとして、8KB(デフォルト=0x2000で、設定変更可能)がとられ、のこりうちの半分(から0.5KB引いた分)が、プログラムとして使用できる。<br>=> `(512-48-8)/2 - 0.5 = 227.5KB`
        - nrf52832のFLASHメモリのPageサイズは4KBなので(ちなみにBlockサイズは512bytes)、nvs関連で2ページ分確保するので、8KBが最小と思われる。<br>nRF52のPage/Blockサイズ : https://devzone.nordicsemi.com/f/nordic-q-a/19505/page-and-block-size-on-nrf52
    - 後半の228KBは、OTAで受信したファームウェアを一時保存するために使用される。正しいファームウェアが受信できなかった場合は、アップデートされない(のだとおもう)
    - (OTAのときにだけ使用されるのだろう、、と実行中のデバッグログとか保存に使用しているのだが、大丈夫だろうか。。　アドバイスいただけたら..)

## 環境
- nRF52832ベースの機材 またはnR52DK
- nRF Connect SDK v2.6.1 (現状v2.7.0は使用してよいのか? 実際のプロジェクトにはv2.4.3を使用している)
- ここでは、サンプルコードの、nrf/samples/bluetooth/peripheral_lbs (LED Button Service)をベースに説明
- スマホアプリ nRF Connect for Mobile (アップデートファイルを送るのに使用)
- Ubuntu 24.04 Desktop、Windows 11/10にて、ビルドしている。


## 手順
1. nRF Connect Desktopやら、Toolchain Managerやらで、SDKをインストール、VSCodeからサンプルベースにアプリ生成。ターミナルのコマンドは、ToolManagerでSDK環境でターミナルを開く。(うまくツールへのパスとか設定してある。imgtoolとか、westコマンドとか)

2. `prj.conf`に以下３行追加
    ```
    # OTA Support
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
    CONFIG_BOOTLOADER_MCUBOOT=y
    ```

3. `custom_key_dir`というフォルダを作って、秘密鍵生成。作ったキーはなくさないように。外部にもらさないように。。
    ```
    mkdir custom_key_dir
    imgtool keygen -k custom_key_dir/custom_priv.pem -t ecdsa-p256
    ```
4. CMakeLists.txtの上の方に↓の２行を追加する。(cmake_minimum_required の下あたり)
    ```
    # Specify the key file
    set(mcuboot_CONFIG_BOOT_SIGNATURE_KEY_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/custom_key_dir/custom_priv.pem\")
    ```
5. `child_image`というフォルダを作って、mcuboot.confをつくる
    ```
    mkdir -p child_image
    echo -e '\n# Force ECDSA-P256, since this is not nessecarily the default\nCONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y' > child_image/mcuboot.conf
    ```
6. 最初に、Bootloader付きのをやくので、VSCodeからFLASHするか、`ビルドフォルダ/zephyr/merged.hex` を焼く。
7. OTAアップデートには、`ビルドフォルダ/zephyr/dfu_application.zip`をスマホにおくって、nRF Connectで開く。(ファイル名を、hogehoge-2024-0815-1.zipとかにして、Gmailで送って、スマホで受信して、nRF Connectで開く、とやっている...うまい方法があれば、ぜひ...)

## その他
- "Memory report" => Partitionsタブで、パーティションの割当具合がわかる。
- Setting Storageサイズは、`prj.conf`に↓のように指定する。パーティションをうまい具合に割ってくれる。
    ```
    CONFIG_PM_PARTITION_SIZE_SETTINGS_STORAGE=0x4000
    ```
- ビルドフォルダ/paritions.yml にパーティション情報がある。
- DeviceTreeのFLASHの情報は、使用されない、っぽい？のか、自前で、DeviceTreeを合わせるように編集しないといけないのか、わからない。（誰か教えて..)

- Ubuntu 24.04 で nRF Connect SDKを使用
    ```
    # 1. appimageがよくわからんけど..
    sudo apt install libfuse2t64 
    chmod a+x ./nrfconnect-*.appimage
    ./nrfconnect-*.appimage --no-sandbox
    
    # 2. SDKをgitで取得しようとして、libunistring.so.2 が見つからん、みたいなエラー対処
    cd /usr/lib/x86_64-linux-gnu
    sudo ln -sf libunistring.so.5 libunistring.so.2
    ```
- Parition size<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/99012ca2-6b4e-00f6-9d2e-2a3af04484fd.png)
Sysprep (PCの複製)

みなさんはメーカー製PCを新品で買ってきたこと、ありますか？

初回電源投入のときを思い出してください。
WiondowsOSの場合は初回起動時はウィザードが起動して、いろいろ聞かれますよね。
あれって、ないと駄目なもんなんでしょうか。


------------
あなたは社内の営業部のメンバーに渡すPCを200台作って欲しいと言われました。

必要なアプリの一覧、設定はこれこれこの通り。
壁紙は企業のロゴの入った指定のものに変更。
省電力設定はこう、スクリーンセイバーは何分で起動。
かなり細かく決められています。

これをあなたひとりで200回繰り返すの、イヤじゃないですか？
こんなときに使用するツールが「クローニングツール」です。

クローニングツールには古くはSymantecGhost、Altiris、Acronisなどいろいろな製品がありますが、マイクロソフト純正でその機能は用意されています。

Windows2000Serverで登場したRemote Install Serverがそれですね。
いまではWindows Deployment Service と改められています。

それで、このサービスをそのまま使うことはかなり稀だと思うのですが（各社、便利なツールを出していてそちらを使うことが多い）主にクライアント側の動きについて少しお話しておいたほうが理解が深まるかと思いまして、今回はこの話をしていきます。

内容は少し古いのですけれども、それが発展していまの形となっているので参考にはなるかと思います。概念だけでも覚えていただければいいかなと。

------------
それでは200台のキッティングを始めていきましょう。

まずは雛形を作成します。
1台を箱から出して、初期設定を済ませます。
OSの設定を済ませてアプリケーションをインストールし、設定を実施します。

その後、新規のユーザを仮に作成してログオンさせ、正常動作するを確認します。
アプリの設定についてはユーザごとに違う場所に格納されるために新規ユーザでログオンするごとに初期値に戻されることがあります。

そのPCにとって初めてのユーザ（プロファイルが未作成）がログオンしてくるとOSはデフォルトプロファイルというものをコピーしてそのユーザに割り当てます。
つまりこのデフォルトプロファイルを設定する必要があります。

次に、設定上作成したり残ったゴミファイルをきれいに削除します。
デフォルトプロファイル上にも無駄ファイルが残らないようにするのと、そのユーザの情報（Cookieやパスワード情報など）を残さないように注意してください。

すべての設定が完了したと仮定して進みます。

------------
マイクロソフトの教科書では、ここで「Sysprep」を起動させます。
これは「一般化」などという用語が使われます。
これを使うとどうなるのでしょうか。

Sysprepを起動すると、まずホスト名などの「固有情報」が消えます。
PCにはSIDという固有の識別情報がありますが、これがSysprepによって消されます。

SIDのないPCは起動していることはできません。
「固有の識別情報」なのですから、そのPCのアイデンティティなのです。
アイデンティティのないPCは起動していられなくなると思ってください。

ではどうなるかといいますと、Sysprepが動作を完了するとPCはシステムシャットダウンします。
シャットダウンしたPCの電源をいれると、購入時と同じ、初回セットアップウィザードが立ち上がります。

つまり初回セットアップウィザードではいろいろな情報をユーザに書き込ませるとともに、SIDを生成していたわけですね。

このまま起動して初回セットアップウィザードを進ませると、なんのために作業したのでしょう。
このウィザードが終わってしまっては元も子もありませんね。

正解は、PCがシャットダウンしたら起動フロッピーディスクやブータブルCD、ブータブルUSBメディアを差し込みHDDから起動させないようにするわけです。
もちろんHDDを引っこ抜いてデュプリケータ（複製装置）にかけてもいいでしょう。
多くの場合はネットプートさせる方法を使いました。（そのためにほとんどのビジネスPCのNICはPXEに対応しています。）
Netboot/PXEbootだとサーバ上に準備されたOSのイメージを使用してPCを起動します。
蛇足ですがこのときに必要なのがDHCPオプション66/67（BootServer/BootFileName）ですね。

とにかくあなたが苦労して設定してSysprepをかけた上でシャットダウンしたローカルのHDD以外から起動し、共有資源やポータブルHDDなどに対してイメージ吸い上げを開始します。
200台の規模であればサーバ上に保管するのが良いでしょう。

こうして吸い上げたHDDイメージは同様の手段を持って起動した未設定クライアントに対してクローニングされます。

それでは200台のPCを一同に並べてクローニングが完了したPCの電源を投入してみましょう。

------------
残念ですがこの方法だと200台全てのPCはに対して初回セットアップウィザードを完遂しなければなりません。
それはちょっと御免蒙りたいですね。

そのために「応答ファイル」を作成することが可能です。
初回セットアップウィザードに対して応答してくれるファイルが作成できるようになっているのです。

ただ、200台あるPCのどれもが同じ応答ファイルを使用することになるので、これもうまくいかないですね。
このあたりでだんだんとMSツールだけでは難しくなってきます。

Windows2000/XPくらいまでの環境だと、クライアントはDHCPサーバを参照するように構成しておき、クライアントはサーバ上に保管された自分のMACアドレスと同じ名前のファイルを参照し、自ホスト名などを構成しながら起動するようなVBSを書いて置くこともよくありました。
（Sysprepによりアイデンディディが削除されているため、この段階のPCをNW上で識別するためにはMACアドレスしかないのですね。）

------------
いろいろとMS純正ツールだけでやれることはやれそうなのですが、どうにも手順が難しかったり柔軟性に欠ける部分があったりだとかで、フルに純正機能だけでのクローニングはなかなかやっていないと思います。

そのためAcronisほか様々なクローニングツールがあり、それらを導入している案件がほとんどだと思いますがそれらツールは上述したマイクロソフトの提供した機能を利用し、さらに便利に拡充したものがほどんどだと思います。

PCキッティングなどの案件でAltirisなどを使う際にも上記の概念を頭に入れておけば理解が深まるのではないでしょうか。
ActiveDirectory概要

マイクロソフトの世界でなにかといえばADADと言われるわけですが、
AD（ActiveDirectory）なくしてはマイクロソフトの真髄は活かせないようです。

そこまで重要と位置づけられるADについて、すこしだけ説明してみましょう。

---------------
あなたはとある会社のIT要員で、あなたの会社はまだADを導入していません。
設置PCは3台だけです。（PC-A、PC-B、PC-C）

従業員のアカウントは3台全てのPCに存在します。
つまり従業員Staff-Aのアカウントは
PC-A\StaffA
PC-B\StaffA
PC-C\StaffA
の3つのアカウントが存在することになります。

そこで、従業員にセキュリティのためパスワード変更を促しました。
StaffAは3台それぞれのPCに向かい3度のパスワード変更をすることになります。

PCのうち1台が石垣島にあろうとも。
PCのうち1台がザンビア共和国にあろうとも行ってきてください。

そしていつものとおりあなたの会社は急成長して、所有するPCは全世界に10万台ほどあるとしてください。

従業員はパスワード変更するだけで人生の大半を費やすことになります。

ここで求められるのが「認証サーバ」「パスワードサーバ」と言われるものです。

---------------
ネットワークに接続され、ADに所属させたPCはユーザ認証をドメインコントローラに委ねます。

ユーザとパスワードのリストは各々のPC内ではなくDC（ドメインコントローラ）上に保管されます。
StaffAのアカウントは、
Domain\StaffA　ただひとつとなりパスワード変更は1度しか実施する必要はありません。

ドメインにアカウントを持たないものはログインを拒否され、企業にトラストされたスタッフのみがアカウントを持て、PCを使用出来ます。

ActiveDirectory（ドメインコントローラ）はこの「認証サーバ」「パスワードサーバ」と呼ばれる機能を実行します。

このADを機能させるのにもっとも必要な機能がDNSです。
DNSが機能していない環境ではADは使用できません。

クライアントからDCを検索するのも、DCからクライアントを検知するのもDNSが機能しているからであり、最重要なコンポーネントとなります。
DNS概要

やっと実用的な部分に踏み込めるようになってきました。

本日はインターネットの基幹技術である、DNSとはについてお話します。

-------------

まずあなたが小さなデザイン事務所でも経営していることにしましょう。
作業者が5名いて、監督者が1名。それぞれにPCが与えられておりブロードバンドルータを通じてインターネットに繋いでいることにしましょう。

PCの数は6台。プリンタは1台でこれもネットワークに繋がっています。

作業者は工程ごとに分担するようにしているので一つの作品に対してそれぞれがアクセスできる必要があります。
せっかくですのでNASを導入しておきましょう。
作品はこのNASに保存するので全員がアクセスできます。

NASにもIPアドレスが必要なのでノード数は8。

さて、共有資源を探すさいに
「¥¥192.168.10.5¥share〜」などと打てばアクセスできますが、それには
「誰のpcが何番のIPアドレスをもっているか」全員が間違いなく知っている必要があります。

この場合、すべてのPCにホスト名とIPアドレスの対応表をもたせることで「名前解決」を行うことが出来ます。
Windowsでしたら「C:\Windows\system32\drivers\etc\hosts」
Linuxでしたら「/etc/hosts」にその記述を行います。

これによって、
「¥¥192.168.10.5¥share〜」ではなく
「¥¥hostname¥share〜」とアクセスすればそのホストが何番のIPアドレスをもっているかに関わらずアクセスができるので便利ですね。

-------------

それで、あなたの勤める会社は急成長して従業員が増えて社員5000人となりました。
当然全員がPCを持っており、プリンタも増えました。

あなたは引き続きこの巨大ネットワークの管理を任されています。
PCは古くなったら新しいものを順次導入します。

IPアドレスとホスト名の符号はどんどんと複雑かつ、随時変更されていきます。
変更が発生するたびにあなたは社屋中を駆けずり回ってhostsファイルを更新することに疲れました。

そこで、各PCにIPアドレスを設定する際に、hostsの記述を空にして「名前解決はこのサーバに委ねなさい」という設定を実施します。（この設定をしていてもhostsの記述が優先されますので注意）

DNSサーバにはどのPCが何番のIPアドレスを持っているかを一元管理させています。

これで管理者はPCが増えたり入れ替えたりするときにはDNSサーバを更新するだけでよくなりました。

-------------

ところでこのDNSサーバ、従業員が「https://www.yahoo.co.jp」をブラウザで見るときにも参照されます。

従業員がブラウザを開いてURLを打ったとき、まずはあなたの管理するDNSサーバに「www.yahoo.co.jpってIPアドレス何番ですか」、という問い合わせが発生します。

しかし当然あなたの会社はYahooでもなんでもないのであなたの管理するDNSサーバはwww.yahoo.co.jpのIPアドレスを知りません。

つまり、あなたの会社の従業員はwww.yahoo.co.jpが見れません。

これでは困りますね。

自分の管理していないネットワークに関する問い合わせは、「フォワード」します。
ほかのDNSサーバに聞きに行ってもらうわけですね。
このための設定を「フォワーダ」と言います。

www.yahoo.co.jp
というのは、「jpグループ」のなかの「coグループ」のなかの「yahooグループ」の中の「www」というホストを指します。
もっと言えばこの「jp」の上に「.」というのがありまして
これを「ルートサーバ」と言います。
全世界に13台あります。

まずごのルートサーバが、「jpグループのことはここに聞いて」と返し
jpグループのDNSサーバが「coグループのことはここに聞いて」と返し
coグループのDNSサーバが「yahooグループのことはここに聞いて」と返し
Yahoo社内のDNSサーバが「wwwのIPアドレスは何番ですよ」と返してくれます

このように管理が「階層構造」になっているのが大きな特徴です。
これによって柔軟な運用が最小限の工数で賄えるようになっています。

この仕組みによってあなたはあなたの会社のホストだけを管理すればよくなるということです。

-------------

現実に名前解決を確認する方法は以下のコマンドを使用します。
Windowsの場合はnslookup
Linuxの場合はdigかnslookupですね

これらのコマンドを使用して名前解決が出来ているかを確認します。

以下にコマンド出力結果を掲載しておきましょう。

% nslookup hogehoge.com
Server:		192.168.92.xxx
Address:	192.168.92.xxx#53

Non-authoritative answer:
Name:	hogehoge.com
Address: 13.225.183.xxx
Name:	hogehoge.com
Address: 13.225.183.xxx
Name:	hogehoge.com
Address: 13.225.183.xxx
Name:	hogehoge.com
Address: 13.225.183.xxx

-------------

さてこのDNSですが基幹技術というだけあって1回では伝えきれないほどのボリュームがあります。
今回はここまでとしましょう。
webview_flutter 4系 の iOS アプリケーションを Safari を使用してデバッグする方法

# 環境

Flutter 3.22.1
webview_flutter 4.7.0
webview_flutter_wkwebview 3.13.1

# はじめに

iOS で webview_flutter のデバッグを有効にし、Safari でデバッグする方法について説明します。

まず、 webview_flutter でデバッグ モードを有効にするには、 WebKitWebViewController.setInspectable に true を設定する必要があります。

webview_flutter_wkwebview 3.6.0からそうなっているようです。
https://pub.dev/packages/webview_flutter_wkwebview/changelog

# コード例

```dart
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';

class _WebViewWidgetState extends State<WebViewPage> {
  final controller = () {
    final params = () {
      if (WebViewPlatform.instance is WebKitWebViewPlatform) {
        return WebKitWebViewControllerCreationParams();
      } else {
        return const PlatformWebViewControllerCreationParams();
      }
    }();

    final controller = WebViewController.fromPlatformCreationParams(
      params,
    );
    if (controller.platform is WebKitWebViewController) {
      (controller.platform as WebKitWebViewController).setInspectable(true);
    }
    return controller;
  }();
...
}
```

# その他設定

iPhoneおよびMacの設定に関しては他記事参考に設定すればOKです。

参考
https://qiita.com/ya8612tec/items/20390b3e4fbec4d01682
【基礎から】PythonでExcel扱えるようにする（１）Python環境の構築

## 目的
Pythonプログラム上でエクセルを扱える環境を用意する。

## 環境構築のステップ
1) pythonのインストール
2) openpyxlパッケージのインストール
3) Visual Studio codeのインストール（任意）

### 1) pythonのインストール
[3] Windows版Pythonのインストール
https://www.python.jp/install/windows/install.html

### 2) openpyxlパッケージのインストール
[4] Windows環境でpythonのパッケージをインストールする方法
https://qiita.com/sim58/items/03f0eee74c9fffa39293

### 3) Visual Studio codeのインストール（任意）
[5] Visual Studio Code のインストール方法
https://qiita.com/YurimyMiyu/items/5ce7821f1e3e5905c3ee

## リンク
[1] Excel作成/編集を自動化！python openpyxlのまとめ
https://qiita.com/mathlive/items/20078f4b31273c180f51
[2] Excelファイルを読み込むPythonライブラリを比較してみた
https://qiita.com/2019Shun/items/db0028a535297ef50184
[3] Windows版Pythonのインストール
https://www.python.jp/install/windows/install.html
[4] Windows環境でpythonのパッケージをインストールする方法
https://qiita.com/sim58/items/03f0eee74c9fffa39293
[5] Visual Studio Code のインストール方法
https://qiita.com/YurimyMiyu/items/5ce7821f1e3e5905c3ee

## 履歴
2024/08/16 新規作成 

#
[本編へ戻る](https://qiita.com/YossyIto/items/ae822beb7350338e89fb)

### eof
TCPとUDP（レイヤー4）


TCP/IPの話をしようとして、IP（レイヤー3）についてはざっくりとお話してみました。
今回からレイヤー4に入りたいのですが、それがTCP/IPの前の方、TCPとなります。

ただ、掲題に挙げたUDPというのもあるのでそちらも合わせて少しだけ説明しておきます。


TCPの特徴は「コネクションの確立」といえます。
電話をかける時、「もしもし、俺だよ俺」って言いますよね。
そこで「ああ、○○だね、なんか用かい。」と返すとコネクションが確立します。

つまり通信において相手側にいきなりデータを送りつけるのではなく、
A）「通信していいですか」
B）「いいですよ。こういう形式で送ってください。」
A）「わかりました」
というやり取りが発生します。

これを「3way-handshake」と呼びます。

「通信していいですか」＝SYN
「いいですよ。こういう形式で送ってください。」＝ACK＋SYN
「わかりました」＝ACK

このACKとかSYNは、サインだと思ってください。

転送許可要求がSYN、転送許可がACK

ちょっと専門的になっちゃうかもですが、パケットのキャプチャなどをおこなうと必ず直面するので絶対に覚えておいたほうがいいと思います。
★障害調査でパケットキャプチャなど行う場合は、NACK（拒否）も覚えておくといいでしょうね。

もう少し詳しくみていきましょう。
ホストA、Bの状態を表す用語とともに理解しましょう。

・初期状態

A)状態：Close
B)状態：Listen
　★LISTENは待ち受けている状態を示す

・AからSYNが送信される

A)状態：SYN_SENT
B)状態：LISTEN
　★AはSYNを送ったのでSYN_SENTに状態遷移する

・BがACK+SYNを返す
A)状態：SYN_SENT
B)状態：SYN_RCV
　★BはSYNを受け取ったのでSYN_RCVに状態遷移する

・AがACKを返す
A)状態：ESTABLISHED
B)状態：SYN_RCV
　★AはACK+SYNを受け取ったのでESTABLISHEDに状態遷移する

・BがACKを受け取る
A)状態：ESTABLISHED
B)状態：ESTABLISHED
　★BもACKを受け取ったのでESTABLISHEDに状態遷移する


実際のデータが送信される前にこれらのやり取りが発生します。
こうすることで確実性を高めているわけですね

また、データ通信を終了する際には、FINというサインを送ります。
パケットをキャプチャして障害調査などする際には上記の内容によく慣れているといいですね。

ほかにも機能があるのですが、例えば「再送要求」というようなものもあります。
これが割と重要で、無線環境でパケットのロスがたまにあるとか、ケーブルが破損しててたまにパケットが届かないとか発生すると、「○○番まではデータ受け取ったので△△番からのパケットをもう一度ください」といった処理も行っています。

---------------
さて、上記でTCPの素晴らしさを説いたうえで、それらの手続きがあまり意味を産まないシチュエーションについてお話しましょう。

例えばIP電話や動画ストリーミングなど。

ひとつやふたつ、パケットを取りこぼしたとしましょう。
ここで、再送要求をして何になります？

そう、もう刻は過ぎ去ってしまっているのでいまさらパケットをもらっても意味がないのです。
それよりも、そんな煩雑な手続きをするくらいならどんどんパケットを送ってほしい。

つまり、通信の内容によってはTCPの利点が利点でなくなる場合があるのですね。
そういうときにはUDPを使用します。

取りこぼしちゃってももういいや、どんどん送ってね
というときはUDPだと思ってください。


TCPとUDP、まだまだ語り尽くせない部分があるのですけど、このあたりで次へ
（多少偏った）セキュリティ用語解説

セキュリティ関連の記事によく出てくる用語を解説して置きたいと思います。

■Exploit（エクスプロイト）
脆弱性を突くようなスクリプトだったり簡単なプログラムを指します。
これを作ってばらまくことで、よりたくさんの人がより簡易に攻撃を実施することが出来ます。

■0-day（ゼロデイ）
脆弱性が発覚してから企業が対策を実施するまでの間の空白期間のことで、この間に攻撃をかけられると防御が難しくなります。

■workaround（ワークアラウンド）
0-day攻撃などが予想される場合、たとえば当該昨日を無効にしておくなどの緊急対策のことを指します。
パッチが提供されるまでの間の応急処置となります。
またパッチを適用後に下に戻しておくのを忘れがちな項目でもあります。

■ワナビー、スクリプトキディ、ウィザードなど
ハッカーの順位というか称号というか、呼び方のことです。
・ワナビー・・・これはハッキング以外にも使われる言葉で「Wanna Be」のこと
　つまり「あんなふうになりたいなぁ」と思っているが自分ではなにもしないクソガキのことで努力をしないものに対しての侮蔑の意味で使われます。
・スクリプトキディ・・・自分ではコードが書けないが、他人の作ったスクリプトを遊び半分で使ってハッカーを気取っているクソガキのことで、これも侮蔑の意味で使われます。
・ウィザード・・・ハッカー界隈でも有能と慕われるものに使われる称号です。

■DoS攻撃
多数のリクエストをサーバに送りつけてサーバを動作不能または高負荷状態とする攻撃手法を指します。

■DDoS攻撃
DoS攻撃と同じではありますが攻撃の送信元が1台ではなくボットネットを使用した多数のホストからの攻撃を行うものを指します。

■Bot
攻撃者の言う事をきくようになってしまった攻撃者の手駒のことで、ウイルス感染等によって作られてしまいます。

■BotNet（ボットネット）
上記のBotを世界中に数万台もつと、とんでもない攻撃力になります。
こうなると、レンタルさせて稼ぐことも出来ます。

■バックドア
ウイルスなどによって形成される攻撃者からの命令を受け待ちする「勝手口」のこと。

■ランサムウェア
何らかの方法で感染させたPCのHDD（特定のファイルだけということもあり）を暗号化して利用不能とし、利用者に対し「暗号解除してほしかったら金を払え」というもの。

ランサムというのが「身代金」を意味しています。
で、個人のPCのデータなどはまぁ使えなくなっても被害はそれなりなのですけどこれが大企業となりますと死活問題ともなります。

また攻撃者から掠取した情報の暴露という脅迫を同時に受けることもあります。
さらには乗っ取ったPCを使用してサイバー攻撃に利用したりと、やりたい放題されるわけです。

ある日サイバーポリスが会社にやってきて「アンタんとこのPC、他の企業に攻撃かけてるやん」と言われるわけです。
これも辞めさせてほしかったら金を払えというわけですね。

ここ数年かなりの勢いで被害が増えており、要注意です。


★ほかによくわからない言葉があったら教えて下さいね！
OSI参照モデル


初回の投稿で「ここでは解説しないので各自調べておいてくださいね」くらいのことを書いたのですけど、今後L2SWとL3SWとかそういう話がしたくなったときに無理があるやろ、と昨夜風呂に入りながら思い至りまして書くことにしました。

通信の歴史のなかで、「製造元が違うPCはやり取りが出来ない」という時代がありました。

各社独自の通信規格を使っていては発展が望めません。
統一規格を求めました。

ISOという団体が取り決めたOSI参照モデルというものを使用します。

[OSI参照モデル]
第7層　アプリケーション層
第6層　プレゼンテーション層
第5層　セッション層
第4層　トランスポート層
第3層　ネットワーク層
第2層　データリンク層
第1層　物理層

OSI参照モデルは上記のように7階層に分かれます。

それぞれをホントに軽く説明していきます。


●第7層　アプリケーション層
　実際にユーザにサービスを提供する

●第6層　プレゼンテーション層
　データの形式を決定する

●第5層　セッション層
　セッションを管理する

●第4層　トランスポート層
　信頼性の高い通信サービスを保証する
　　=>関連用語：「TCP」

●第3層　ネットワーク層
　（最終的な宛先への）データの伝送、ルートの決定、宛先の決定を行う
　　=>関連用語：「IP」

●第2層　データリンク層
　（直接接続されている機器との）データの伝送制御を行う
　　=>関連用語：「MACアドレス」

●第1層　物理層
　電気、機械的なルールを司る
　　=>関連用語：「Ethernet」


このなかで、第7〜第5まではインフラとしてはそこまで重要ではない
（アプリケーション開発や、PCの動作トラブルの調査などには重要かもしれないので結局必要ではある）
第4〜第1階層はSEをはじめ、ネットワーク技術者など幅広くインフラ従事者として必要になる知識であります。


[ざっっくりとしたイメージ]
これだけだとなんだか翌わからないと思いますので、超ざっくりとしたイメージを描いてみます。

あなたはPC-Aというパソコンからメールを出して、PC-Bで受信するとしましょう。

（PC-Aでの出来事）
あなたはまずメーラーを立ち上げてメールの文章をタイプし、送信ボタンをクリックします。
ここが第7層（アプリケーション層）です。

そのあとあなたのメールはシュレッダーにかけられたように細々となり、その一つ一つが
第6層から順に第1層まで通過し、PC-Aを離れます。

〜〜途中にあるもの（メールサーバなど）をざっくり飛ばします〜〜

（PC-Bでの出来事）
届いたデータはPC-Bの第1層で受け取り、徐々に第7層まで駆け上がります。
全部届いたら組み立て直されてPC-Bのメーラーで読むことが出来ます。

こんな感じで通信は行われていると思ってください。


[カプセル化ってこと]

では、この第7層から第1層までを通り過ぎる間なにが行われるかといいますと、
細切れになったデータの先頭と最後にヘッダとフッタがつくと思ってください。
それぞれ名前は変わるのですけど、いまは覚えなくていいでしょう。

PC-Aからデータを送る際にはまず、
データがあって、
■データ■　という形になり
□■データ■□　という形になり
○□■データ■□○　という形になり
第1層を通過するときに電気信号に変換されます。
これを「カプセル化」と言います。

これをPC-Bが受け取り、

○□■データ■□○　というのを受け取ったら○を外し
□■データ■□　というのを受け取ったら□を外し
■データ■　というのを受け取ったら■を外し
データを取り出します。

いまは概念だけ理解してください。
それだけでも充分じゃないかなと思います。