OmniAICreator/Qiita-1.07M huggingface dataset:
Metacoderで系統樹を可視化する

#metacoderパッケージについて
metabarcoderはphyloseqと同様に微生物データの可視化に有効です。系統樹がきれいに書けます。
とりあえずビジュアルがかっこいいです。:point_down:
![VignaMaize.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/c14cea97-698d-8e2f-a139-1d96c68cce56.png)

#phyloseqオブジェクトからmetacoderオブジェクトに変換する
今回はphyloseqオブジェクトにインプットしたデータを使用してmetabarcoderの系統樹を描く方法を紹介します。phyloseqオブジェクトの作成については前回の記事を参照してください。（metacoderに直接OTU table, rooted tree, metadataをインプットしてもOK。）

```{r}
library(metacoder)
library(phyloseq)
obj <- parse_phyloseq(physeq) #physeq = phyloseqオブジェクトを入れます
```

#プロットする

```{r}
obj%>% 
  filter_taxa(grepl(pattern = "^[a-zA-Z]+$", taxon_names)) %>%
  filter_taxa(taxon_ranks == "Order", supertaxa = TRUE) %>% # Orderレベルに指定
  heat_tree(node_label = gsub(pattern = "\\[|\\]", replacement = "", taxon_names),
            node_size = n_obs,
            node_color = n_obs,
            node_color_axis_label = "OTU count",
            layout = "davidson-harel", initial_layout = "reingold-tilford") # 系統樹のアルゴリズム
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437659/7617c255-0362-7672-d9c6-a842b43d4e13.png)


#サンプルごとにプロットする
上のプロットはサンプルすべての平均値なのでサンプルの処理事のプロットをつくります。

```{r}
obj$data$type_abund <- calc_taxon_abund(x, "otu_table",
                                        cols = metadata$X.SampleID,
                                        groups = metadata$plant) # plant = 各サンプルの処理
```

plantという処理区の中のVignaMaize処理の平均をとってみます。

```{r}
obj %>%
  taxa::filter_taxa(VignaMaize > 50) %>% # abundanceが50以上のバクテリア
  filter_taxa(taxon_ranks == "Order", supertaxa = TRUE) %>% # taxa:: needed because of phyloseq::filter_taxa
  heat_tree(node_label = taxon_names,
            node_size = VignaMaize, 
            node_color =VignaMaize, 
            layout = "da", initial_layout = "re", 
            title = "Taxa in VignaMaize") ->p
p
```
最初に貼った図が描けます。

#参考URL
https://grunwaldlab.github.io/metacoder_documentation/index.html
PythonでSwitchBotから電池残量を取得する

# はじめに
SwitchBotを使っていて困るのが電池切れ。
公式アプリを開けば電池残量を確認できるけど、日常的には見ないし、使いたい時に電池が切れてるでおなじみですよね。
私はオートロックの解錠に使っているので死活問題です。

SwitchBotの公式が公開しているPythonにはPressなどのコマンドはありますが、電池残量を取得するものはないです。
アプリで取れるんだから、そんなわけないだろと調べていると、やっぱりありました。
https://github.com/RoButton/switchbotpy

一旦これを使って満足してたんですけど、なんか安定して取れない時があるので安定してる公式のPythonにコマンド追加することにしました。

# 公式Pythonの修正
設定情報取得コマンドを追加しました。
公式からForkした私のリポジトリに公開しています。
https://github.com/kanon700/python-host/tree/feature/add_get_settings

修正内容は以下

```python:switchbot_py3.py
class Driver(object):
    handle = 0x16
    notif_handle = 0x13
    commands = {
        'press'     : '\x57\x01\x00',
        'on'        : '\x57\x01\x01',
        'off'       : '\x57\x01\x02',
        'settings'  : '\x57\x02',
    }

    def run_and_res_command(self, command):
        self.req.write_by_handle(self.handle, self.commands[command])
        return self.req.read_by_handle(self.notif_handle)

    def get_settings_value(self, value):
        value = struct.unpack('B' * len(value[0]), value[0])
        settings = {}
        settings["battery"] = value[1]
        settings["firmware"] = value[2] / 10.0
        settings["n_timers"] = value[8]
        settings["dual_state_mode"] = bool(value[9] & 16)
        settings["inverse_direction"] = bool(value[9] & 1)
        settings["hold_seconds"] = value[10]

        return settings
```

# 電池残量取得スクリプト
こんな感じのスクリプトでバッテリ残量を取得できます。

```python:SwitchBot_Battery_Get.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from switchbot_py3 import Driver

switchbot = 'xx:xx:xx:xx:xx:xx' #switchbotのMACアドレス

def main():
    bot = Driver(device=switchbot)
    bot.connect()
    value = bot.run_and_res_command('settings')
    settings = bot.get_settings_value(value)
    print("battery:" + str(settings["battery"]))


if __name__ == '__main__':
    main()
```

以上
(Unity)昔のプロジェクトを開いたら「Faild to load window layout」が出て詰んだときの対処

タイトル通りですがUnity2020で昔のプロジェクトを更新して開こうとした時に「Faild to load window layout」が出てどの選択肢を選んでもプロジェクトが開けない状態に陥入りました。色々調べるとUnityフォーラムに解決が載っていたので検索ヒット率を高めるために共有します。

こちらのスレッドに載ってます。ここでもなかなか迷走しているので自分がやって治った箇所だけピックアップします。
[Can not Launch Unity Due to "Failed to load window layout"](https://forum.unity.com/threads/can-not-launch-unity-due-to-failed-to-load-window-layout.694450/)

## 原因？

なんとなくですが昔のプロジェクトのエディターのレイアウトデータ（2 by 3とかそういうやつを自分で大きさ変えたりしたのが保存されているはずなので）が読み込めなくなり、本来はデフォルトのレイアウトを読み込むところがなぜかデフォルトのレイアウトも読み込みすることができなくなっている状態だとみたいです（実際よくわからんけど、とりあえず開けないんだ。。。）

## 解決方法 

ざっくり説明すると[Load Default Layout]を押すとCurrentLayout-default.dwltにデフォルトのデータが読み込まれるがどう操作しても開けないようになっている上にUnityを終了するとまたレイアウトデータが破壊される（！？）

なので読み込まれた正しいデフォルトのレイアウトデータ（破壊前の）をデスクトップか何かにコピーしておいて終了後にそのデータを上書きして起動時にコピーしておいたデータを読み込ませて正しく起動させているようです。

---
1. Press [Load Default Layout]
2. Unity copies the correct default layout to CurrentLayout-default.dwlt
3. Unity complains that it still cannot load the layout
4. Copy the now correct CurrentLayout-default.dwlt somewhere
5. Press Quit
6. Unity corrupts the file during quitting
7. Copy back the correct CurrentLayout-default.dwlt
8. Start Unity again

翻訳
---
1. [Load Default Layout]を押します
2. Unityは正しいデフォルトレイアウトをCurrentLayout-default.dwltにコピーします
3. Unityはまだレイアウトをロードできないと表示される
4. 正しいCurrentLayout-default.dwltをどこかにコピーします
5. 終了を押します
6. Unityが終了中にファイルを破壊する
7.正しいCurrentLayout-default.dwltをコピーして戻します
8. Unityを再起動します


## その他

自分でも色々やってその上でスレッドに載っていた他こともちょっとやってダメで上のを試したら解決したのでもダメだったら以下も試してみてください。

- 大元のデフォルトレイアウトデータでLastLayout.dwltを消す
- プロジェクトのLibraryフォルダを消す
- 日本語から英語エディターに切り替える（他のプロジェクト開いて）

などです（多分効いてないと思いますが）。

同じ症状が出た人は試してみてください。
簡単なジャンケン

```ruby

puts "最初はグー!じゃんけん。。。"
puts "【0】グー【1】ちょき【2】パー"

user_input = gets.to_i #ユーザーに選んでもらう（整数）to_i
computer = rand(3) #コンピュータの選択をランダムで0~2

if user_input >= 3 #3以上の数字が選ばれた際に出力して、以降の処理をストップする
    puts "0~2の数字を入力してください"
exit
end

puts "あなたは #{user_input}"
puts "computerは #{computer}"



if user_input == computer
    puts "あいこです。"

elsif (user_input == 0 && computer == 1) ||
 (user_input == 1 && computer == 2) ||
 (user_input == 2 && computer == 0) 
    puts "あなたの勝ちです"
#ジャンケン勝敗の３パターンを記載　&&(and) ||(or)の使い方

else
    puts "あなたの負けです"
    

end

#ユーザーが0~2を入力する
#判定する

#1.user_input == computer_input => あいこ
#2.user_input (勝ちパターン)
#3.

#結果を表示する



```
TestCafeでE2Eテストを自動化

## 概要
TestCafeにより、E2Eテストを自動化する。

## 手順
1. TestCafeをインストール

```shell
// インストール
$ npm install -g testcafe

// インストール確認
$ testcafe -v
Using locally installed version of TestCafe.
1.9.2
```

2\. テストファイル(test.ts)を作成。

```typescript:test.ts
import "testcafe";
import {Selector} from "testcafe";

fixture(" [テストグループ名] ")
    .page("https:[テスト対象のURL] ");

test(" [テスト名] ", async (t) => {
    // 操作するHTMLの要素 (ここでは、クラス名とname属性で要素を指定）
    const emailInputArea = Selector(".form-control").withAttribute("name", "email");
    const passwordInputArea = Selector(".form-control").withAttribute("name", "password");
    const loginButton = Selector(".loginBtn").withAttribute("name", "commit");

    // 実行するテスト（ログインし、指定した要素に田中 創さんという名前の表示があることを検証）
    await t
      .typeText(emailInputArea, " [メールアドレス] ")
      .typeText(passwordInputArea, " [パスワード] ")
      .click(loginButton)
      .expect(Selector(".header__userName").innerText).eql('田中 創さん');
});
```

3\. package.jsonを編集し、テスト実行時のブラウザと実行ファイル(2.)を指定。

```package.json
"scripts": {
        (略)
        "testcafe": "testcafe chrome ./test.ts",
        (略)
    },
```

4\. テスト実行

```shell
$ npm run testcafe
```
<java>正規表現で住所を番地前後で分割する


# 概要
javaで正規表現を使って、住所を番地前後で分割しようと思います。

コンソールから住所を入力することで分割された住所が表示されます。
<font color="red">※あくまで簡略的なものであり、全ての住所を完璧に分割できるものではないのでご了承ください。</font>
# 手順
手順は以下の通りです
1.Patternクラス（java.util.regex.Pattern）で正規表現をコンパイル
2.Matcherクラス（java.util.regex.Matcher）のfindメソッドで入力された文字列が正規表現にマッチするか確認する。
3.マッチした場合文字を分割し、表示する。

正規表現の詳細はこちらのサイトを参考にいたしました。
https://www.sejuku.net/blog/13215


# コード
```java:SplitAddress.java

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SplitAddress{

	public static void main(String args[]) throws Exception {
		System.out.println("住所を入力してください");
		Scanner sc = new Scanner(System.in);
		//コンソールに入力された文字を下記メソッドに引数として渡します。
		String[] ad = split(sc.nextLine());

		//出力しておく
		System.out.println(ad[0]+"\n"+ad[1]+"\n"+ad[2]);
		sc.close();
	}

	//住所を分割するメソッド
	static String[] split(String str)throws Exception {
		String[] ad = new String[3];

		//判定するパターンの生成準備
		//半角数字・全角数字が一回以上または漢数字が一回以上（番地の先頭）
		String p1 = "([0-9０-９]+|[一二三四五六七八九十百千万]+)+";

		//半角数字・全角数字が一回以上または漢数字が一回以上またはハイフンなどの接続記号が０回以上（番地の中身）
		String p2 = "([0-9０-９]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号|-|‐|ー|−|の))*";

		//半角数字・全角数字が一回以上または漢数字が一回以上または数字/号など番地の終わりに使われる文字が１回（番地の終わり）
		String p3 = "([0-9０-９]+|[一二三四五六七八九十百千万]+|(丁目|丁|番地|番|号))";

		//ex)番地が2-6-6なら「2」がp1、「-6-」がp2、「6」がp3に当てはまります。

		//正規表現
		Pattern p = Pattern.compile(p1+p2+p3);
		Matcher m = p.matcher(str);

		//正規表現に該当する文字列があればその前後で住所を分割する
		if(m.find()) {
			ad[0] = str.substring(0,m.start());
			ad[1] = str.substring(m.start(),m.end());
			ad[2] = str.substring(m.end(),str.length());


			//四万十3-6-1みたいな漢数字+数字の時のための処理
			//(３分割された住所の番地部分に、漢数字１回＋数字１回という正規表現に該当する文字列があれば分割する境を訂正する)

			//漢数字１回＋数字１回
			String p4 = "[一二三四五六七八九十百千万][0-9０-９]";

			p = Pattern.compile(p4);
			m = p.matcher(ad[1]);
			if(m.find()) {
				String tmp = ad[1].substring(0,m.start());
				ad[0] = ad[0] + tmp;
				ad[1] = ad[1].substring(m.start(),ad[1].length());
			}

			//3-4-5三井ビルみたいな数字+漢数字の時のための処理
			String p5 = "[0-9０-９][一二三四五六七八九十百千万]";
			p = Pattern.compile(p5);
			m = p.matcher(ad[1]);
			if(m.find()) {
				String tmp = ad[1].substring(m.start()+1,ad[1].length());
				ad[2] = tmp + ad[2];
				ad[1] = ad[1].substring(0,m.start());
			}
		}else ad[0] = str;

		return ad;
	}
}
```
# 実行結果
######緑色の文字が入力した住所、その下３行が分割された住所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593491/5a716c51-5524-6444-8b2e-148cd2a2c98f.png)

###<font color="blue">試しに使ってみてください！！</font>
PyInstallerでPythonがないWindows環境で動作するexeファイルを作成する

作成した機械学習のプログラムをPythonがインストールされていないWindows環境で動作させるために試行錯誤したメモ。

環境は以下の通り

* Python 3.6.8
* PyInstaller 4.0
* Windows 10 x64

# PyInstallerの基本的な使い方

## インストール

```
$ pip install pyinstaller
```

## exeファイル作成

```
$ pyinstaller main.py --onefile
```
これで、Pythonの実行環境や関連ライブラリもまとめて1つのexeファイルにまとめてくれる。

ただし、PyInstallerが解決できない依存関係があったりすると、作ったexeファイルがエラーを吐く。

その場合は、`--onefile`オプションを使わずにビルドして、以下の2点を１つずつ解消していくとよい。

## Pyinstallerでうまくexe化できないとき

### `*.so not found` が出る

依存している外部ライブラリのバイナリを取り込めていない。直接参照しているものはPyInstallerが自動で取り込んでくれるようだが、間接的に参照しているものは考慮してくれない様子。
`--add-binary` オプションで明示的に取り込むように指定すればよい。
Pathの指定の仕方が特殊なので注意

```
--add-binary "<取り込み元のSOファイルの相対パス>;<配置先のディレクトリの実行時相対パス>"
```

#### パスの指定の仕方が正しく記述できているはずなのにうまく配置されない

キャッシュが残っていて悪さをしているようだったので、`--clean`オプションをつけると指定した通りに配置されるようになった。


### `ModuleNotFoundError` が出る

こちらも同様に外部ライブラリが取り込めていない。Pythonのライブラリ系で間接的に参照しているものが該当する様子。
pyinstaller実行時にhidden-importで指定すればよい。
追加しながら、exe化を繰り返して、ModuleNotFoundErrorがなくなるまで続ける。

例えば、tensorflowを使ったテキスト分類プログラムを作った場合はこんな感じになった。

```
$ pyinstaller main.py ¥
--hidden-import=tensorflow.python.keras.engine.base_layer_v1 ¥
--hidden-import=tensorflow.python.ops.while_v2 ¥
--hidden-import=tensorflow.python.ops.numpy_ops
```


## 最終的なpyinstallerの実行時オプション

例えばこんな感じになる。

```
$ pyinstaller main.py --onefile -y --clean \
   --hidden-import=tensorflow.python.keras.engine.base_layer_v1 \
   --hidden-import=tensorflow.python.ops.while_v2 \
   --hidden-import=tensorflow.python.ops.numpy_ops \
   --add-binary "../../../../AppData/Local/Programs/Python/Python36/lib/site-packages/tensorflow/lite/experimental/microfrontend/python/ops/_audio_microfrontend_op.so;tensorflow/lite/experimental/microfrontend/python/ops" 
```
Windows10でWSL2をセットアップしてLinuxコマンドの勉強環境を作る方法

##はじめに
以下のリンク先の情報をもとに、Windows10でWSL2を使用できるようにセットアップし、Ubuntuを導入してLinuxコマンドを打てる環境を作りました。
[WSL2インストールガイド for Win10]
(https://docs.microsoft.com/en-us/windows/wsl/install-win10)

WSL2は、WSL1とは違ってLinuxカーネルが動くアーキテクチャーだそうで、Windows上でLinuxの勉強を行う環境として使えそうだと思いました。
WLS1とWSL2の違いは以下のリンク先を見てください。
[WSL1とWSL2の違い](https://docs.microsoft.com/en-us/windows/wsl/compare-versions)


#####この手順を実施したWindows10の環境

|エディション|バージョン|OSビルド|プロセッサ|
|:-----------:|:------------:|:------------:|:------------:|
|Windows 10 Pro|2004|19041.508|x64 (AMD Ryzen7 3700X)|

##Windows10のバージョンを最新化する
1. 「Win」+「R」キーを押して「winver」と入力して「OK」ボタンをクリック。
2. OSビルドが「18361」以下の場合は、WSL2が利用できないのでバージョンアップしてください。
3. バージョンアップする場合は、「Win」+「R」キーを押して「ms-settings:windowsupdate」と入力して「OK」ボタンをクリック、バージョンアップを行ってください。


##「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」を有効化する
1. 「Win」+「R」キーを押して「OptionalFeatures」と入力して「OK」ボタンをクリック。
2. 「Linux用Windowsサブシステム」にチェックを入れる。
3. 「仮想マシンプラットフォーム」にチェックを入れる。
4. 再起動を行ってください。


##WSL2をデフォルトバージョンにセットする
1. スタートメニュー右の「ここに入力して検索」に「PowerShell」と入力して、「管理者として実行する」を選択。
2. 以下のコマンドを実行。

```
>wsl --set-default-version 2
```
私の環境では以下のエラーが表示されてしまいました。

```
>wsl --set-default-version 2
エラー: 0x1bc
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
```
以下リンク先の情報をもとにWSL2のカーネルの更新を行ったのち、再度コマンドを実行すると、エラーが表示されなくなりました。
[カーネルの更新](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)

##Ubuntu 20.04 LTSをインストールする
1. 以下リンク先のMicroSoft StoreからUbuntuをインストール。

[Ubuntu 20.04 LTS](https://www.microsoft.com/store/apps/9n6svws3rx71)

##WSLを起動する
1. 「Win」+「R」キーを押して「wsl」と入力して「OK」ボタンをクリック、もしくはスタートメニューから「Ubuntu 20.04 LTS」を選択。
2. コマンドプロンプトが表示されコマンド実行ができる。（以下はカレンダー表示を行うcalコマンドの実行結果）

```
$ cal
   September 2020
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
```

##最後に
これでWindows10でLinuxコマンドが打てる環境ができました。
仮想化環境（Virtual BOXやHyper-V）を準備してLinuxをいちからインストールすることで環境を作ることに比べると、簡単にLinux環境が作れると思いました。
今後この環境でDockerを導入してプログラム開発環境を整えていきたいと思います。

##参考情報
[Windows Subsystem for Linux Documentation](https://docs.microsoft.com/en-us/windows/wsl/)
「php artisan ui vue --auth」ができなかった時の解決法【メモ】【超初心者】

```
$ php artisan ui vue --auth
```
上記を実行しようとしたところ、、、

##エラー内容
「Command "ui" is not defined.」
![スクリーンショット 2020-09-12 16.36.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693622/1b8aaa3c-618e-8a56-4790-b9dc2c4e52a9.png)


##解決した方法

```
$ composer require laravel/ui "^1.0" --dev
```
このコマンドを実行してから
またさっきのをやってみたらできました

```
$ php artisan ui vue --auth
```


参考にしたサイト https://zukkokeblog.com/laravel6-auth
構成管理

応用情報技術者平成29年秋期 午前51

ソフトウェア開発プロジェクトで行う構成管理の対象項目はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d9e37e2b-4157-b191-a51d-5b0b34b7c518.png)



１、ソフトウェア開発における構成管理とは、
ソフトウェアがどのような構成品目の組み合わせで構成されているかという構成識別体系を
管理台帳や管理用のソフトウェアに記録して管理することをいいます。

個々のプログラム，ライブラリ，設計書，マニュアルなどの構成要素ごとに、
・変更内容，
・最新のバージョン番号，
・リリース番号，
・ビルド番号などが記録されています。


構成管理（Configuration Management）とは、
「顧客にITサービスを滞りなく提供するために、社内のIT資産やシステムの流れを管理すること」を指します。また、「組織としての開発手法をチーム全体に共有する」などのチーム管理の要素や、「ユーザーからのクレーム対応」なども含みます。あわせて、IT資産にはインフラ、ハードウェア、ソフトウェアなど以外にも、契約情報やライセンスといったものも含みます。

つまり問題や課題をスムーズに乗り越え、ITサービスの質を落とさずに顧客に提供し続けることが構成管理の役割です。


２、構成管理とIT資産管理との違い
構成管理が「顧客にITサービスを滞りなく提供し続けるため」に管理しているのに対し、
IT資産管理は財務もしくはコンプライアンスの観点から管理しています。「予算内でIT資産を社内に効率的に配布すること」や「ライセンス違反を防止すること」が主な目的です。


３、構成管理は変更管理やリリース管理、インシデント管理と密接な関係があります。：
・変更管理では変更を加える構成アイテムの情報が必要になり、変更対象となる構成アイテムの情報の記述が要求されます。

・リリース管理では、リリースにかかる時間を想定するために構成アイテムの情報は必要不可欠で、それなくしては正確で確実なリリースはできないでしょう。

・インシデント管理においては、インシデントが発生した際に過去の履歴を調べますが、その時に構成アイテムの情報が必要になります。

上記からわかるように、構成管理はITシステムを管理する上で「前提情報を揃える」役割を果たします。構成管理自体も重要ですが、同様に他の管理プロセスをスムーズに行うためにも構成管理が欠かせないのです。



参照：
https://www.ap-siken.com/kakomon/29_aki/q51.html

構成管理とは？
https://www.ivanti.co.jp/blog/what-is-cmdb-and-its-pain-points
SMB v1 の問題点

「SMBv1 の NAS に Windows10 をつなげる」
https://qiita.com/nanbuwks/items/c0338966b33606b62034
では Windows10 で SMBv1 プロトコルが切られているというお話をしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ffd63cf1-334e-e3df-d445-78fa79bd42d5.png)


MS-Windows のファイル共有プロトコルとしての SMB ですが、SMBv1 はアレなので切れということが強く言われています。

以下の Microsoft の Techブログにおいても、利用の停止が強く言及されています。

Stop using SMB1
https://techcommunity.microsoft.com/t5/storage-at-microsoft/stop-using-smb1/ba-p/425858
The Deprecation of SMB1 – You should be planning to get rid of this old SMB dialect
https://docs.microsoft.com/ja-jp/archive/blogs/josebda/the-deprecation-of-smb1-you-should-be-planning-to-get-rid-of-this-old-smb-dialect


理由として以下のようなことが挙げられています。

1. WannaCry が感染を広げるのに SMBv1 の脆弱性を利用していた
2. セキュリティ的に脆弱
3. パフォーマンスが悪い
4. 実装が複雑怪奇


 1. については実装ミスによる脆弱性、2. は実装の仕様自体の問題として分けて考えることとします。


# 1.実装ミスによる脆弱性

## MS17-010
WannaCry は 2018 年に世界中で蔓延した身代金マルウェアです。SMBv1の脆弱性を利用して感染を拡大します。
この脆弱性については以下のセキュリティパッチが公開されています。

マイクロソフト セキュリティ情報 MS17-010 - 緊急
Microsoft Windows SMB サーバー用のセキュリティ更新プログラム (4013389)
公開日: 2017 年 3 月 15 日
https://docs.microsoft.com/ja-jp/security-updates/securitybulletins/2017/ms17-010


## CVE-2020-1301

MS17-010に相当するものは最近も発見されており、以下のように公開されています。

 「複数の Microsoft Windows 製品におけるリモートでコードを実行される脆弱性」
https://jvndb.jvn.jp/ja/contents/2020/JVNDB-2020-006534.html


ここでは例として2つの脆弱性を挙げましたが、これらは即 SMBv1 の利用停止に結びつけて考えるべきでしょうか？

実装ミス的なところから出た脆弱性であれば、例えば以下は SMBv3 で同様のものが発見されており SMBv1 が危険というのにはすぐには結びつかないです。

CVE-2020-0796 | Windows SMBv3 クライアント/サーバーのリモートでコードが実行される脆弱性
https://portal.msrc.microsoft.com/ja-jp/security-guidance/advisory/CVE-2020-0796ry/CVE-2020-0796



# 2.実装の仕様自体の問題


SMBv1 の仕様上のセキュリティ問題がどこにあるかという件。

## LMハッシュ

SMBv1 は元々認証方法として LMハッシュを使っていたらしいですが、LMハッシュは脆弱な関数らしいです。
「LMハッシュ」
https://ja.wikipedia.org/wiki/LM%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5
には

> LMハッシュは、標準化されたブロック暗号であるDESを使ってはいるものの、設計段階でいくつもの脆弱性を抱えた実装であり、元のパスワードを決定可能となってしまっている[5]。
とあります。

Wikipediaによると、以下のように羅列されています。

- パスワードが最長14文字に制限されている
- 7文字以上のパスワードは半分に分けてそれぞれをハッシュ化するため、7文字ごとに解析することができる
- LMハッシュにはハッシュ値の事前計算を防ぐためのソルト (暗号)が使われていない。
- 7文字以下のパスワードを使った場合、後半7バイトはすべてヌル文字で埋められ、0xAAD3B435B51404EEという決まった値を生成するので、短いパスワードを簡単に判別できる。
- LMハッシュの使い方にも問題があり、パスワードの代わりにハッシュをそのまま送ることで認証を突破可能となる。


しかしながら現在は SMBv1 においても NTLMv2 を使うことができるらしいです。


# 3.パフォーマンスが悪い


https://ja.wikipedia.org/wiki/Server_Message_Block
> SMB1は暗号化強度の面や通信効率の面からも好ましくないとされるようになる。

の「通信効率」に該当します。



# 4.実装が複雑怪奇

Wikipedia の 「Server Message Block」
https://ja.wikipedia.org/wiki/Server_Message_Block
では、SMB2の説明として以下のようにあります。

> コマンド/サブコマンドの種類が100以上あったものを19にまとめ、

SMB1ではコマンド／サブコマンドの種類が100以上あったということですね。


# 1〜4以外の理由

1.〜4.それぞれ調べていましたが、特に 2. の実装の仕様自体の問題について現在はLMハッシュの問題しか行き当たりませんでした。ということはLMハッシュを使わなければ良いということで、SMBv1全体について致命的な問題は他には何でしょうか？

こちらの記事
https://xtech.nikkei.com/it/atcl/column/15/061500148/051500108/?P=2
では、WannaCry  が蔓延するより前に MS17-010 の脆弱性が情報機関や裏社会で把握されていたことが示されています。
これと同じように、現時点では表社会では伏せられているけれどもゼロデイがあるので SMBv1 を使うなと言われているのでしょうか？

冒頭に出した Microsoft のTechブログなどでも、肝心の SMBv1 のどこがダメかというのは奥歯に物が挟まったような説明しか無くて、やっぱり某政府機関や裏社会の闇が関係しているのか？という妄想が捗ってしまいます。

妄想としては楽しいのですが、表向きの理由として、メンテできてないないから使うな！ という中の人のメッセージではないかと考えることにしました。
PHP の閉じタグは書かないらしい

PHPのみのファイルを書く場合は、閉じタグは書かない方がバグが起きにくいらしいです。
参考→https://www.php.net/manual/ja/language.basic-syntax.phptags.php

htmlに挿入する場合は必要になります。

また、echoの場合も省略する書き方があるようです。

```example.php
<?php echo 'text'; ?>
<?= 'text'; ?>
//どちらも同じ動きをする
```
QualysのSSL Server TestでA+をとりたい

#はじめに
SSL Server TestしてみたらAだったので、A+にしてみたかった。
サーバはCentOS7.8にyumで入れたhttpdを使用。opensslもデフォルトのまま。

#Cipher Suites
最初はCipher Suitesに出てくるCBCが入っているものがオレンジ色で（weak）になっていたので、そこを直した。
具体的には、ssl.conf の <VirtualHost> 内に以下の行を追加。（外に書いても大丈夫かも、未確認）

```
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
```

これでCBCが使われなくなる。
ついでにopensslの脆弱性（CVE-2020-1968）のためにDH鍵交換も無効にしておいた。

**Let's EncryptのオプションファイルをIncludeしていると、そこにSSLCipherSuiteが書いてあるので注意。このせいで設定が変わらなかった**

ただ、これではA+にはならず。
A+のサイトを見てもweak残っていることもあり。

また、この設定だとWindows7, 8.1のIE11やSafari8以下がつながらなくなるらしい。

#HSTS設定
mod_headerが必要なので、/etc/httpd/conf.modules.d/00-base.conf を確認しておく。（デフォルトで有効なはず）
ssl.confに以下の行を追加。（これも <VirtualHost> 内に書いたが、外でも大丈夫かも）

```
Header add Strict-Transport-Security "max-age=15768000"
```

これでA+になった。
Dart x Flutter MokuMoku Live Coding 2020/09/12


Dart と Flutter で 何か作る..

https://www.youtube.com/watch?v=meWE25TzQHo&feature=youtu.be


もくもく会での作業中のLive Coding 動画です

詳細は追ってまとめます

# Code

https://github.com/kyorohiro/mokumoku02


# 成果物について

![Screen Shot 2020-09-12 at 20.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/da1c6a5b-8fb6-9e45-3473-41a7da405e25.png)



## 今後の課題
DuckDuckGoすると、デザインされたメニューなど見ると
https://t.co/LADyeBbOU8?amp=1
List表示みたいな事はしてなくて
色々と工夫がされている

そういうのを反映していきたい


## Know-How

vscode の　正規表現でAssetsの文字列をconstの変数に変換した。

```
1 "xxxx/yyy/xxx.jpg" -> "xxxx/yyy/xxx.jpg = 'xxxx/yyy/xxx.jpg'"

at following regex expression
(.*)
$1 = $1

2 "xxxx/yyy/xxx.jpg = 'xxxx/yyy/xxx.jpg'" -> "xxxx_yyy_xxx_jpg = 'xxxx/yyy/xxx.jpg'"

at following regex expression

(.*)\/(.*) = (.*)
$1_$2 = $3
```


assets.dart　見たいなのが出来る。

```
const images_food_pizza_slice_fast_jpg = "assets/images/food_pizza_slice_fast.jpg";
const images_food_dim_sum_squid_jpg = "assets/images/food_dim_sum_squid.jpg";
const images_food_chili_cheese_bowls_jpg = "assets/images/food_chili_cheese_bowls.jpg";
const images_flower_orange_calendula_bright_0_jpg = "assets/images/flower_orange_calendula_bright_0.jpg";
const images_food_pasta_tomato_theme_jpg = "assets/images/food_pasta_tomato_theme.jpg";
const images_food_purple_chocolate_dessert_jpg = "assets/images/food_purple_chocolate_dessert.jpg";


```
CMMI(Capability Maturity Model Integration)

応用情報技術者平成29年秋期 午前49 


CMMIの説明はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/72321b86-1a96-1519-e0bc-add85e1f3dd5.png)



１、CMMI(Capability Maturity Model Integration)は、統合能力成熟度モデルと呼ばれ、組織におけるプロセス改善をガイドするモデルです。
プロジェクト管理，プロセス管理，エンジニアリング，支援に関するプロセスについて、それらが効果的なプロセスであるために重要な要素をゴール及びプラクティスという概念を用いて整理されています。
また、未成熟なプロセスから有効性を持った秩序ある成熟したプロセスへの進化の改善経路も記述しており、自らの組織の状況に合わせて適用内容を徐々に高度化できるようにもなっています。

CMMIではプロセス成熟度に対して次の5つのレベルを設定しています。
・レベル1：初期
　場当たり的で無秩序な組織として最も低い状態。

・レベル2：管理された
　プロジェクト管理のための基本的なプロセスが備わっている状態。

・レベル3：定義された
　組織内に標準化された一貫性のあるプロセスが定義されている状態。

・レベル4：定量的に管理された
　定量的な品質目標が存在し、プロセスはデータに基づき予測可能である状態。

・レベル5：最適化している
　継続的な改善プロセスが常に機能している状態。



参照：
https://www.ap-siken.com/kakomon/29_aki/q49.html
回帰テスト（＝リグレッションテスト　regression test）

応用情報技術者平成29年秋期 午前48

アジャイル開発のプラクティスのうち，回帰テストを行うことを前提とするものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f2f11aa8-e674-768e-5eb7-3c00867573f0.png)


**１、回帰テストは、**
システムに変更作業を実施した場合に、それによって以前まで正常に機能していた部分に不具合や影響が出ていないかを検証するテストです。

回帰テストとは、コンピュータプログラムに手を加えたことによる影響を確認するテスト操作のことである。 プログラムが大規模化で複雑化になってくると、何も関係がないかのように見えるプログラムが相互に関係しあっているのを見落とす場合も少なくない。

タイミングは、リファクタリング後です。
リファクタリング後にはシステムの内部構造が以前と変わります。このため修正部分がほかの機能に悪影響を及ぼしていないかどうかを検証しなくてはなりません。

**２、リファクタリング(Refactoring)は、**
外部から見たときのソフトウェアの機能や振る舞いを変えずに、ソフトウェアの内部構造を変えることをいいます。ソースコードの品質を良くし、高効率化や保守性向上を目的として行われます。


**３、リグレッションテスト　regression test　（＝回帰テスト、退行テスト）**
バグ修正などの変更をプログラムに加えた際、修正した箇所以外に影響がないかを確認するテストを「リグレッションテスト」といいます。

プログラムの修正によりデグレーションが起こっていないかどうかを検証するためのテストが、リグレッションテストです。デグレーションを検証することから、リグレッションテストには「ノンデグレードテスト」「回帰検証」という言い方もあります。

※デグレード（degrade）とは、
「悪化」「退化」という意味です。プログラムの不具合を修正したときに、ほかに新たな不具合が出てくることをデグレーションといいます。品質や機能が修正前より悪い状態になることです。




**４、日次ミーティング**
日次ミーティングは、問題が拡大したり、状況が悪化したりするのを避けるために、毎日決めた時刻にチームメンバが集まって開発の状況を共有する活動です。

**５、ふりかえり**
ふりかえりは、イテレーション終了毎にその活動や状況についてチームメンバ間で話し合い、次の活動への施策を考える活動です。

※イテレーション　iteration
短い期間での開発を何回も繰り返す際の、それぞれの「短い期間での開発」のこと


**６、ペアプログラミング**
ペアプログラミングは、2人1組で1つのプログラムの実装を行い、1人が実際のコードをコンピュータに打ち込み、もう1人はそれをチェックしながら補佐するという役割を随時交代しながら作業を進めていく手法です。


参照：
https://www.ap-siken.com/kakomon/29_aki/q48.html


リグレッションテストとは
https://hnavi.co.jp/knowledge/blog/regression-test/
modelとtableの命名規則


1日エラーと戦い続け、原因がわからず、何度もコードを見直し…

お手上げ状態で質問したところ、なんとmodelとtableの命名規則を無視していた！

命名規則があること自体知らず、そんな大事なことはテキストに書いといてくれよ…
と思ったのでまとめておきます。

##modelの命名規則
* 単語の頭文字は大文字
* 単語の連結も頭文字を大文字にする
* 単数形

ex. ProfileHistory

##tableの命名規則
* 全て小文字
* 単語の連結は"_"アンダーバーで行う
* 複数形

ex. profile_histories


##なぜ規則を破るとうまく動作しないのか
Laravelではmodel名から自動で参照すべきtable名を決めているので名前がおかしいとmodelとtableが結びつかない。

つまり、**Laravelでは単語の頭文字が大文字になっている箇所で区切ったテーブル名を参照する。**
ex. ProfileHistory(model名)　→　profile_histories(table名)

私がやってしまった間違えは
    Profile_History(model名)　→　profile_histories(table名)

model名にアンダーバーを入れてしまったことで2単語を連結した名前だと認識されず、tableがありませんというエラーに繋がってしまった。
ExcelからMarkdownのtableをコピペで変換するWebツール「MarkDown Convert」

Markdownの表を簡単に変換するWebツールをご紹介します。
QiitaでMarkdownの表を作成する場合などに大変便利です。

ツールやエディタなどむずかしい方法を使わずに
コピペするだけの方法です。

# Webツール「MarkDown Convert」で変換

Markdown表変換ツール - MarkDown Convert
https://markdown-convert.com/ja/tool/table

Excelで作成したデータを左側に貼り付けて、
メニューのExcelを選択すると右側にMarkdownの表が生成されます。とっても簡単です。

![Alt text](https://i.gyazo.com/49a325281e21a26c522cc6c1d32de7e4.png)

メニューを選択すると表のテキストを右寄せ／中央寄せ／左寄せにすることが可能です。

![Alt text](https://gyazo.com/6c5a5a053e211da2694043a379938af5/raw)

Excelからサクッと表を作りたい時に重宝する方法です。
お役に立てたらうれしいです :ok_woman_tone1:

# 関連記事

ExcelからHTMLのtableをコピペで変換するWebツール「Excel to Table」 - Qiita
https://qiita.com/flatsato/items/fa6e46f645c8a458d4ae
ExcelからHTMLのtableを生成するWebツールの紹介記事を書きました。
知らなかった便利そうなショートカットキー

コピー＆ペースト等は使用していたけど…
もっと便利なショートカットキーを利用していくべきだと思い、自分用にまとめておきます。


* **⌘command + F**
ページ内検索
ひらいてるページ内に指定のキーワードがあるか簡単に調べられる

* **⌘command + tab**
起動中アプリケーションの切り替え

* **control + tab**
複数開いているブラウザタブの切り替え

* **⌘command + W**
開いているウィンドウを閉じる。（現在のタブ）

* **⌘command + T**
新規タブ作成


###テキスト入力系
* **control ＋ K：**カーソルの右側の文字を全て削除する

* **control ＋ H：**カーソルの左側の文字を削除する

* **control ＋ A：**カーソルを行頭（左側）に移動する

* **control ＋ E：**カーソルを行末（右側）に移動する

* **control ＋ P：**カーソルを一行上に

* **control ＋ N：**カーソルを一行下に

* **control ＋ F：**カーソルを一行右に

* **control ＋ B：**カーソルを一行左に

###Cloud9　ショートカットキー
* **option + left ：**左の単語に移動
* **option + right：**右の単語に移動
* **command + ?：**一気にコメントアウト（行選択後）
【コピペ可】Qiita 記事テンプレート【学習用】

## 実現したいこと
- (例)https化など

## 作業環境
- OS
    - CentOS7
- webサーバー
    - Nginx
- 言語
    - Python
- フレームワーク
    - Django

## 参考サイト
- [Qiita](http://qiita.com)


## 実際にやってみる
- 実行画面

```
```
- サンプルコード

```
```

## 参考サイト

## 次の目標
- サブドメインの作成
ExcelからHTMLのtableをコピペで変換するWebツール「Excel to Table」

Excelで作成したデータから
HTMLのtableを生成する方法をご紹介します。

ツールやエディタなどむずかしい方法を使わずに
コピペするだけです。

# Excel to Tableにコピペする

Excel to TableというWebツールにExcelデータをコピペするだけ。


Excel to Table | Excel表からHTMLテーブルへ一発変換 | すぐに使える便利なWEBツール | Tech-Unlimited
https://tech-unlimited.com/exceltable.html

![Alt text](https://i.gyazo.com/0de9eca450abba9a9b9e9c104dadd29f.png)

こちらのツールの素晴らしいところは、1行目のtdをthにしたり、
左から1番目のtdをthに変換できるところです。簡単すぎて感動です。

お役に立てたらうれしいです！

関連記事
ExcelからMarkdownのtableをコピペで変換するWebツール「MarkDown Convert」 - Qiita
https://qiita.com/flatsato/items/64066a7286e7a58eb726
ExcelからMarkdownのtableを生成するWebツールの紹介記事を書きました。
テストードライバ、スタブ

応用情報技術者平成29年秋期 午前47

テストで使用されるドライバ又はスタブの説明のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/70e3919a-26d7-f76e-115d-44d61633db05.png)


１、スタブは、　stub
モジュール結合テストの手法であるトップダウンテストにおいて必要となるテスト用のモジュールです。
未完成の下位モジュールの代わりとして、テスト対象の上位モジュールからの呼び出しに対して、下位モジュールが返すべき適切な値を返却するなどの役割を担います。

２、ドライバ　 driver
ボトムアップテストで必要となるドライバは、未完成の上位モジュールに代わり、テスト対象の下位モジュールに適切な引数を与えて呼び出すなどの役割を担います。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ddaaab12-4044-1c47-de5e-80bf2860b057.png)


参照：

https://www.ap-siken.com/kakomon/29_aki/q47.html
var_dump()ってなんだっけ

突然出てくるvar_dump()。
出てくるたびにこれなんだっけ…となっていたのでまとめ。

まず…
##演算について

変数（$○○と表記される、プログラムで扱うデータを入れておく容器。箱のようなイメージ。）に対して計算したり、内容の加工を行うことを演算という。

演算にも何種類かあって…

```php

$value = 6;
echo $value + 2;

$value = 6;
echo $value / 2;
```

このような、加算・減算・乗算・除算・連結は**二項演算**という。

本題のvar_dump()は次に説明する論理演算で使用する。


##論理演算
数値が同じか判定したり、どちらが大きいかを比較するような判定を行う演算子。

ex.

```php

$value = 10;
$result = $value == 20;
var_sump($result);

$value = 10;
$result = $value < 20;
var_sump($result);

$value = 10;
$result = $value > 20;
var_sump($result);

$a = "20";
$b = 20;
$result = $a === $b;
var_sump($result);

```

##結論
論理演算の結果を表示する時は
echoではなくvar_dump()を使用する。
モジュール強度

応用情報技術者平成29年秋期 午前46

モジュール設計に関する記述のうち，モジュール強度(結束性)が最も高いものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/bf2373b2-d4cb-b136-08f1-0741558b5a5c.png)


１、モジュール強度とは、
モジュール内部の関連性の強さを表し、暗合的強度から機能的強度までの7種類があります。
モジュール強度が高いほど独立したソフトウェア部品として再利用や拡張がしやすくなります。

下記７種類の強さは徐々に高くなります：

・暗合的強度(低)
　関係のない機能をまとめたモジュール

・論理的強度
　関連する複数の機能をまとめたモジュール

・時間的強度
　プログラムの開始時など、ある特定の時期に実行する機能をまとめたモジュール

・手順的強度
　関連ある逐次的な機能をまとめたモジュール

・連絡的強度
　関連ある逐次的な機能で要素が連絡し合うものをまとめたモジュール

・情報的強度
　同じデータ構造や資源を扱う機能を一つにまとめたモジュール

・機能的強度(高)
　一つの機能を実現するためだけのモジュール


ア、情報的強度をもつモジュールです。

イ、時間的強度をもつモジュールです。

ウ、論理的強度をもつモジュールです。

エ、連絡的強度をもつモジュールです。



参照：
https://www.ap-siken.com/kakomon/29_aki/q46.html
idとclassの違い

## そもそもid、classとはなにか…


1ページで何度も同じ要素が出てくる際にid・classを用いてピンポイントで個別に要素を指定することができる。

**idは#でclassは.で表す**



##実際の使用例


```html

<h1 id="title>Hello World!</h1>
<p class="description">CSSの入門</p>
```

というHTMLに対して


```css

#title {
  color: red;
}
.description {
  color: blue;
}
```


このように指定ができる。

一見、idとclassは同じ役割に見て取れるが、その役割は明確に異なっている。

##それぞれの役割


* **class：**同じclass名を1ページ内で何度でも使える
（種別名を割り当てるイメージ）

* **id：**同じid名は1ページ内で1度しか使えない。
（固有の名前を割り当てるイメージ）


CSSの指定は：class
JavaScriptで操作する時には：id
というのが基本となる。
react-bootstrapが原因でbuild時にエラーになる

webアプリを作成しているとあるあるなことなのですが、ブラウザ環境で確認した場合はうまくいくのに、実際buildをするとエラーになるということがあります。

今回はそれで結構詰まってしまったので参考までに残します。

# 何が起こったか

React、next.js、TypeScriptでwebアプリを作成していて、ブラウザ環境（localhost:3000）で確認が完了したのでbuildしようとするとエラーが起きた。

エラー文は下記（一部）

```
$ npm run build

Failed to compile.

./components/nav.tsx:71:15
Type error: Type '{ children: Element[]; variant: string; title: TFunctionResult; id: string; }' is not assignable to type 'IntrinsicAttributes & Pick<Pick<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "slot" | ... 253 more ... | "key"> & { ...; }, "ref" | ... 250 more ... | "key"> & BsPrefixProps<...> & NavDropdownProps & { ...; }'.
  Property 'variant' does not exist on type 'IntrinsicAttributes & Pick<Pick<DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "slot" | ... 253 more ... | "key"> & { ...; }, "ref" | ... 250 more ... | "key"> & BsPrefixProps<...> & NavDropdownProps & { ...; }'.

  69 |           <Nav>
  70 |             <NavDropdown
> 71 |               variant="success"
     |               ^
info  - Creating an optimized production build .npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! Exit status 1
npm ERR! 
```

なんか色々と出ました。

# 解決策

今回、上記のエラーを見て、本来はエラーになるはずがないreact-bootstrapの書き方の部分でエラーになっていることがわかります。
このエラーのみを解消しても、他のreact-bootstrapを使った部分でエラーになるので、どうやらこれはreact-bootstrapが原因で起こっているということがわかりました。

そこで公式のgithubを確認するとissue報告されていました。
[https://github.com/react-bootstrap/react-bootstrap/issues/5267](https://github.com/react-bootstrap/react-bootstrap/issues/5267)

どうやら、v1.0.1までは問題なく動くものの、v1.1.0からはエラーとなるようです。

というわけで下記コマンドを実行してあっさりと解決

```
$ npm add react-bootstrap@1.0.1
```
three.jsをwebpackで使う最小の環境構築

three.jsをwebpackで使用するための最小限の構成です。
なお、実装時のライブラリとバージョンは以下のとおりです。

| ライブラリ | バージョン |
|:--|:--|
| three | 0.120.1|
| webpack | 4.44.1|
| webpack-cli |3.3.12 |
| webpack-dev-server|3.11.0 |

# パッケージのインストール

`package.json` を作成。

```bash

npm init -y
```

`three`、`webpack`、`webpack-cli`、`webpack-dev-server` をインストールします。

```bash
npm install webpack webpack-cli webpack-dev-server --save-dev
npm install three --save
```

`package.json` のscriptsに下記を追加します。

```js
"scripts": {
    "start": "webpack-dev-server"
  },
```


# webpack.config.jsの作成
`webpack.config.js` を作成します。

```js
const webpack = require('webpack');

module.exports = [
    {
        // メインとなるJavaScriptファイル（エントリーポイント）
        entry: `./src/index.js`,

        output: {
            //  出力ファイルのディレクトリ名
            path: `${__dirname}/dist`,
            // 出力ファイル名
            filename: 'index.js'
        },
        // モード値を production に設定すると最適化された状態で、
        // development に設定するとソースマップ有効でJSファイルが出力される
        mode: "development",
        devServer: {
            contentBase: "dist",
            open: true
        },
        plugins: [
            // THREE.Scene などの形式で three.js のオブジェクトを使用できるようにする
            new webpack.ProvidePlugin({
                THREE : 'three/build/three'
            }),
        ]
    },
];
```

# ファイルの作成
`dist/index.html` を作成。ブラウザでアクセスした時に表示されるhtmlになります。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>three.js demo</title>
    <script src="index.js"></script>
</head>
<body>
    <canvas id="myCanvas"></canvas>
</body>
</html>

```

`src/index.js`の作成。
ここにコードを書きます。下記のコードはサンプルなので、実装したいものに合わせて適時編集してください。

```js
window.addEventListener('load', init);

function init() {
  const width = 960;
  const height = 540;

  const renderer = new THREE.WebGLRenderer({
    canvas: document.querySelector('#myCanvas')
  });
  renderer.setSize(width, height);

  const scene = new THREE.Scene();

  const camera = new THREE.PerspectiveCamera(
    45,
    width / height,
    1,
    10000
  );
  camera.position.set(0, 0, 1000);

  const geometry = new THREE.BoxGeometry(500, 500, 500);
  const material = new THREE.MeshStandardMaterial({color: 0xff0000});
  const box = new THREE.Mesh(geometry, material);
  scene.add(box);

  const directionalLight = new THREE.DirectionalLight(0xffffff);
  directionalLight.position.set(1, 1, 1);
  scene.add(directionalLight);

  tick();

  function tick() {
    requestAnimationFrame(tick);
    box.rotation.x += 0.01;
    box.rotation.y += 0.01;
    renderer.render(scene, camera);
  }
}
```


# 実行

```bash
npm run start

```
を叩いて `http://localhost:8080/`にアクセスすると実行結果が確認できます。

![スクリーンショット 2020-09-12 13.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37716/d29de84d-7954-f246-936d-3b8a4a2edc83.png)
Devopsの利点（今週の学び）

# devopsをする理由

* 間違えてももとに戻すことができる
* 成功するためにやるのではなく、効率よく失敗できるようにするためにする。

# ウォーターフォールモデルの弊害

ウォーターフォール・モデルの弊害は、**後戻りができない** ことだ。

ゲームで例えましょう。例えば、１ステージを攻略をしている際に２ステージで必要なアイテムがあったとしましょう。しかし、あなたは１ステージを攻略最中にそのアイテムを忘れてしまった。そうすると、２ステージでは攻略ができずにゲームそのものが詰みになってしまいます。

通常の場合ですと、１ステージに戻ることはできます。１ステージに戻ってアイテムを入手してそのまま２ステージで使えば問題なくクリアすることができます。

しかし、ウォーターフォール・モデルではそうは行きません。ウォーターフォール・モデルは「要求→要件→開発→運用」で開発がされていて、開発から要件、運用から開発、と後戻りは許されていません。つまり、どこかのタイミングである間違えを見つけても前のステージに戻ることはできません。

要件から要求くらいなら1ステージ戻るだけですのまだ傷は浅いです。しかし運用の場合は戻るとしたら要求まで戻らないとういけなくなります。つまり、一からすべてを辿ってやり直さないと問題が解決しません。

こうなると、そもそも運用上で発見した開発の問題は容易に直すことはできない。どのステージでも後戻りができないから詰んでいるが分かっているのに、ゲームを続けるのと同じ行為をしています。

そのようなゲームがあったら、普通はそのゲームをやめて別のゲームに移ってしまいます。ですが、現実世界ではそのようなことは簡単にはできない。そうしたら今まで払ったお金が帰ってこなくなる。発注者からしたらたまったものではない。

また、オートメーション化をして効率よくしたくても要件でそのようなことは盛り込まれていないからソフトを使うことができない。

ゲームなら、強化アイテムを使えば楽に勝てるのにゲーム自身が縛りプレイでレベルをあげられないのと同じ。クソゲー以外の何者でもない。

更に、書くステージで完全分業制を敷いているので、お互いの仕事を手伝うことも口出しすることもできない。つまり、拙いソフトを運用者に渡したら開発者を恨み、拙い要件を開発者に渡したら要件を作った人を恨み、拙い要求を要件を作る人に渡したら要求した人を恨む、という殺意の連鎖が出来上がってしまう。

良く言えば「**お互いが仕事を全うすればいい絆が生まれる**」

悪く言えば「**お前がへましたら首を差し出せ。介錯してやる**」

というお互いずっ友並に信頼もへったくれもないような上っ面どころじゃないお互い仮面をかぶって喉元に刃物を突き刺している状態になります。

# devopsとは？

では、そのような弊害を迎えて何をするのか？解決すべき問題は以下のとおりだ

* 後戻りしてもいい
* カイゼンをするのに過度な許可を必要としない。
* お互いの仕事を理解して自分の仕事をまっとうする

ゲームのように言い換えれば

* 前のステージに戻ってもいい
* レベルアップができる
* お互いのジョブを理解をして自分のジョブを全うする益をもたらすであろう

ゴーストオブツシマの百合の言葉「力は我らの周りにあり。」

確かにdevopsの本を読むと小難しいことを言っていますが、ゲームに置き換えて考えれば難しいことは言ってはいません。

今週の調べたことはこれまで。

です。別に特別なことは言ってはいません。ゲームで当たり前のことを口に出しただけです。

まずdevopsですが、簡単にいうと開発者がアプリを開発したら自動でサーバーないしマシンに対して自動コンパイルができて、運用した結果をすぐに開発に反映することができる。

開発者は容易にマシンにコンパルができるように自動化がされているのでその分運用者の手間が減る。その分運用者は運用の仕事を思う存分できる。作ったアプリがヒットしてサーバーの負荷が上がったら対処を考える時間ができる。今までのように起こったら筋肉で解決みたいな筋肉殺法をする必要がなくなる。

筋肉殺法がなくなることによって、運用コスト自体が低くなり運用者の継承も以前よりも楽になる。更にカイゼンが制度上容易になれば昨日よりもよりよりものができる。

更に、カイゼンが進めば自ずとお互いの仕事を理解が以前よりも進む。コンパイルの自動化は運用者が考えてくれた構成図通りに機械がコンパイルをしてくれるように作らないとうまく動作をしてくれない。その過程で開発者は運用者の理解が進むことが考えられる。

## 失敗することも大切

そして、失敗をしてももとに戻すことができる。例えば、自動化をするにあたって設計をミスしてしまったとします。通常の場合は自動化に際して自動化の手順をコードで表しています。

コードで表しています。すると、gitの力を使ってコードを前の状態に戻すことも可能です。それ以外にも、ansibleならばインストールの作業をコード化していてどのデバイスでも、OSなどの指定をしていればインストール作業はコマンド1つでできるので人為的なミスも減らせます。そうすることで失敗をしても元に戻して、また最初からやり直すこともできます。

devopsは成功をするためにやるのではなく、失敗ができるようにするためにやるのです。ゲームでいうと、ストックという概念を持ち込んでいる感じです。

プレイヤーが失敗をすることを許容しないゲームは大抵はプレイヤーからそっぽを向かれてしまいます。要するに、成功を当たり前にするのではなく、失敗することを当たり前にして、その失敗から方法を編み出すことができる。これが一番大切なのです。

ゲームも同じで大抵は死んで強くなります。何回もゲームオーバーしますがその都度対策を立てたり、敵のパターンを探ったり、弱点を見つけようとします。

失敗はある程度肯定するものであって、敵視するようなものではない。depopsは自動化によって失敗しやすい環境作りを目指すことができます。

# 別に特別なことなどはしない。

以上の点からもそれほどスゴイ技術を使っているわけではない。以前から存在していた方法を実践しているのに過ぎない。

おそらくゲームで培われた技術は現実世界で姿を変えて有益をもたらすであろう

ゴーストオブツシマの百合の言葉「力は我らの周りにあり。」

確かにdevopsの本を読むと小難しいことを言っていますが、ゲームに置き換えて考えれば難しいことは言ってはいません。

今週の調べたことはこれまで。益をもたらすであろう

ゴーストオブツシマの百合の言葉「力は我らの周りにあり。」

確かにdevopsの本を読むと小難しいことを言っていますが、ゲームに置き換えて考えれば難しいことは言ってはいません。

今週の調べたことはこれまで。
packsファイルの.jsに記載したのに反応しない

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.どのように使うか</b>

<b>3.なぜjsファイルに書き込まなかったのか</b>

<b>4.ここから学んだこと</b>



1.結論
----------------------------------------
<b>直にhtml.erbファイルで"script"を記述しscript内にjavascript言語を記載</b>する！
<br>

2.どのように使うか
----------------------------------------
任意のhtml.erb内で

```ruby:****.html.erb
<script>
.
.
.

</script>
```
と記載してJavascriptを記載するだけです！
注意点としてapplication.html.erbで
<%=yiled%>を使用してヘッダーフッダーを適用している場合は反映させる順番に注意です。
HTMLが読み込まれるよりも前にJavascriptを適用させてしまうとブラウザの検証ツールのconsoleでエラーがでます。

<br>
3.なぜjsファイルに書き込まなかったのか
----------------------------------------
結論からいうと、jsファイルを読み込んでくれなかったり、リロードを一回挟まないと読み込んでくれませんでした。
内容としてはパスワード表示非表示を行っていましたが、検索するとたくさん出てくるのでここでは割愛します。

Rails6.0
Vscode
を使用しています。

```ruby:app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("./security")　#➡︎該当のファイル
```
と記載し、secrurity.jsにjavascript言語を記載し、

```ruby:app/layouts/application.html.erb
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%=　javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
```
と記載してあるのでjsファイルが適用されるはずと思いきや全く反映されませんでした。


また、jsファイルにてパスワードの表示非表示をプログラムしていましたが反応がないのでいろいろ参考にしました。下記のプログラムを最初に記載しました。

```javascript:app/javascript/packs/security.js
document.addEventListener("DOMContentLoaded", function(){}
```
パスワードの表示非表示はできましたが、一度リロードを押さないと反映がされませんでした。なのでjsファイル問題は解決していませんが、とりあえずやりたいことはできたのでよしとします。（可読性はよろしくないですが）

<br>
4.ここから学んだこと
----------------------------------------
このエラーの中でhtml/css/javascript/の読み込む順番やDOMがどの段階で形成されていくのかが大変勉強になりました。tutbolinksやdocumentloadedについてはまだまだ勉強が足りていないですが、流れだけでも把握できたのはかなり大きいです。scriptにしたとたんすぐに解決したのも、書く順番を把握していたおかげでした。


参考にしたURL
<a href="https://qiita.com/mamosan/items/ff336b5cc0a1a95e03a7">"DOMContentLoaded周りの処理を詳しく調べてみました"</a>
<a href="https://teratail.com/questions/24714">"【JS】addEventListenerが機能しない理由についてご教示ください"</a>
<a href="https://noumenon-th.net/programming/2017/06/11/domcontentloaded/">"DOMContentLoadedイベントとloadイベントの違い[タイミング]"</a>
<br>
Railsの本番環境でなぜかセッションが保存できない問題を解決した経緯

#概要
railsで本番環境にプッシュしたアプリがある日セッションを使った機能の全てが動作しなくなるという絶望的な問題にぶち当たった。めちゃくちゃ苦戦したし記事も全然なかったのでその解決方法を記しておく。

最終的にこの記事から設定しなおして解決しました。
https://www.cotegg.com/blog/?p=1850

#環境
・EC2にデプロイ
・サーバー環境はWebサーバーにnginx、アプリケーションサーバーにPuma
・AWSのELBにACMのSSL証明書をアタッチしてSSL化↓

クライアント→ELB→nginx→puma

#セッションが保存されない原因
####まず、セッションが保存されない原因
RailsではCSRF（クロスサイトリクエストフォージェリー）という脆弱性からサイトを守るための対策として
protect_from_forgeryというメソッドでサイトを保護している
```application.html.erb```のheadタグ内に```csrf_meta_tag```という記述をしているが
ここで認証用のauthenticate_tokenを生成しておりこの値を使ってサイトを認証している。

この辺りの説明は腐る程ググれば出てくるため割愛。
このprotect_from_forgeryメソッドのデフォルトの設定でこのauthenticate_tokenが正しくないと
セッションを空にする。(```:null_session```オプション)が指定されている。
こいつのせいでセッションは空になっている。
※これが原因かどうか一発でわかる方法として、```application_controller.rb```に
```protect_from_forgery with: :exception```←CSRFトークンが正しくなければエラーを返す
を記述してサイトにアクセスする
```ActionController::InvalidAuthenticityToken```というエラーが出たら原因はそれ

<b>つまりなんらかの原因でCSRFの認証が通っていない</b>

#なぜこんなエラーがでるのか
冒頭に環境を載せておいたが
クライアント→ELB→nginx→puma
という経路でアプリケーションにアクセスするようになっている
ELBにはSSL証明書をアタッチしてあり、自分のこの構成だと
ELBまではhttpsアクセス
ELBとnginxはhttpアクセスになっている。

実際にユーザーがアクセスするのはhttpsなのにrailsアプリ側にはhttpでアクセスしていると
情報が伝わってしまい、ここで矛盾が生じるためクロスサイト認定され
エラーが起きてしまっている模様。

対策は
nginxなら
/etc/nginx/nginx.confに

```
location / {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #これ追加
  proxy_set_header X-Forwarded-Proto https; #これ追加
  proxy_pass http://www.xxxx.com;
}
```
としてやるとアクセスするURLと伝わるヘッダー情報が一致してエラーが出なくなる

つまり解決


#補足
自分なりの理解で対処した問題の内容をまとめただけのため
間違いがあればご指摘いただけますと幸いです。
Twitterアカウント↓
https://twitter.com/TakeWeb1
【React】レンダリングと描画の違いを整理する

ブログ:
https://in-thepink.com/rendering/

# はじめに

レンダリングと描画を同じ意味で使っていませんか？
会話などカジュアルな場合には気にする必要はありませんが、厳密には違うので整理して理解しましょう！！

# DOMの種類

DOMはリアルDOMと仮想DOMがあります。
また、そもそもDOMとはHTMLを操作するためのAPIです。
[DOMの紹介](https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction)

- リアルDOM
    - 実際に表示されているDOM
    - 変更すると画面がそのまま変わる
    - 変更しようとする場合、負荷が大きい処理になる
- VDOM
    - 単なるデータ 
    - 変更しても画面が変更されない 
    - 負荷が小さい処理で変更できる

# レンダリングとは

state(props)変更前のVDOMと変更後の差分を比較し、差分を検知することでVDOMを再構築すること

## レンダリングフロー

1. 変更前と変更後の差分を比較するための仮想DOMを二つ用意する
2. 変更を反映させるため、VDOMをJavascriptで操作(一般的にリアルDOMを操作するより速い)
3. 変更前と変更後のVDOMの差分を比較
4. 差分だけをリアルDOMに反映する

### リアルDOMを操作するよりなぜ早いか

- DOMを操作するより負荷の小さい処理だから
    - jQueryなどを使用してDOM操作を行う場合、関係のないところも再描画されるから
- 変更前のVDOMと変更後のVDOMの**差分のみ**を反映させるから
    - 「差分のみ」というのがキモです

# 描画とは

上記レンダリングフローで反映されたリアルDOMをブラウザに表示させること

## 再描画のタイミング

- 関数が再生成された時
- 変数が再生成された時
- stateの変更があった時
- 親コンポーネントが再描画された時
- 親コンポーネントから引き渡されているpropsが変化した時
- コンポーネント内でuseStateで定義している変数が変化した時
- カスタムフックより受け取っている変数が変化した時

React.memo,useCallbackなどを使用することで、無駄な再レンダリングを防ぐことができます。
無駄な再レンダリングを防ぐことで、パフォーマンス向上につながります。

[figmaのパフォーマンス向上についての記事](https://www.figma.com/blog/improving-scrolling-comments-in-figma/)





### 参考

- https://qiita.com/risagon/items/019942c60e9c3e6c05a5
- https://www.konosumi.net/entry/2018/08/25/020111
[MySQL][備忘録]接続が出来ないときはポートも確認!!

# 問題
MySQLへローカルなのに接続できない
# 原因と解決策
参考元 https://askubuntu.com/questions/272077/port-3306-appears-to-be-closed-on-my-ubuntu-server

どうやら設定ファイルによりlocalhostに制限されているみたいです。
ということで行頭に#を付けてコメントアウト!!
(1行○○消しても良いです)

**修正前**

```config
bind-address 127.0.0.1
```

**修正後**

```config
#bind-address 127.0.0.1
```
# 最後に
意外と気づかないところなのでお忘れなく!!
Visual Studio C++ で最低限OpenMPをサクッと使う方法

#概要
ガッツリイチから解説しているのと、本当に触りのところだけ解説が多い気がしたので、Visual Studio C++で、最低限OpenMPをサクッと使う方法を知りたかった。

#準備
・プロジェクトのプロパティ
C/C++ → 言語 → OpenMP のサポート
を「`はい (/openmp)`」にする

C/C++ → コマンド ライン に
「`/Zc:twoPhase-`」を追加
（OpenMP時は、2フェーズ名前解決が出来ない、というエラー対策）

#コード
前置きとして、上記設定を行っていなかったとしてもビルド警告が出ず、並列化したつもりが実は出来ていなかったとかありえるので、まずは簡単な処理で並列化して実行してみて、実行順が順不同になったことを確認した方が良いです。
（順不同になったということは、順次実行ではなくなったということで、並列化が効いたと考えられるはず。）


##必要なインクルード

```C++:サンプルコード
#include <omp.h>
```



##for文を並列化

`#pragma omp parallel for
for () {
}`

```C++:サンプルコード
#pragma omp parallel for
for (int i = 0; i < count; i++) {
    // ここは並列実行される
}
```

##クリティカルセクションを指定

`#pragma omp critical([セクション名])
{
}`

```C++:サンプルコード
int aaaa = 0; // スコープ外の変数は、共有されるので、排他制御が必要
#pragma omp parallel for
for (int i = 0; i < 100; i++) {
    // ここは並列実行される
    int bbbb = 0; // スコープ内のローカル変数は自動でスレッド数分用意される
#pragma omp critical(crit_sct)
    {
        // この内部だけ順次実行される
        aaaa += 1;
    }
    // ここは並列実行される
}
```

##順番通り(並列化せず)に実行
 (ただし、１つのforの中に１つしか書けない)

`#pragma omp ordered
{}`

```C++:サンプルコード
int count = 100;
// ordered使う時は、"ordered"句を後ろにくっつけて、どの"parallel for"を順次実行するのか指定する必要がある
#pragma omp parallel for ordered
for (int i = 0; i < count; i++) {
#pragma omp ordered
    {
        // ここは順番通りに実行される
    }
}
```

#まとめサンプルコード
（この記事には記載していませんが、くれぐれも、mutexなどの排他処理は慎重に）

```C++:サンプルコード
#include <iostream>
#include <Windows.h>
#include <omp.h>

int main(void)
{
	const int LOOP_MAX = 10;

#pragma omp parallel for
	for (int i = 0; i < LOOP_MAX; i++) {
		cout << "para. ";
		cout << i << endl;
	}

	cout << endl;

#pragma omp parallel for
	for (int i = 0; i < LOOP_MAX; i++) {
#pragma omp critical(crit_sct)
		{
			cout << "crit. ";
			cout << i << endl;
		}
	}

	cout << endl;

#pragma omp parallel for ordered
	for (int i = 0; i < LOOP_MAX; i++) {
#pragma omp ordered
		{
			cout << "orde. ";
			cout << i << endl;
		}
	}

    Sleep(10000);
    return 0;
}
```

```:実行結果
para. 0
para. 1
para. para. 5
para. 6
para. 7
para. 8
para. 9
2
para. 3
para. 4

crit. 5
crit. 6
crit. 7
crit. 8
crit. 9
crit. 0
crit. 1
crit. 2
crit. 3
crit. 4

orde. 0
orde. 1
orde. 2
orde. 3
orde. 4
orde. 5
orde. 6
orde. 7
orde. 8
orde. 9

```

間違い等あれば、ご指摘いただければ幸いです

#バージョン・規格

- 試したバージョン: Visual Studio 2017
- [OpenMP Specifications](https://www.openmp.org/specifications)
- [Microsoft Docs | OpenMP Directives](https://docs.microsoft.com/ja-jp/cpp/parallel/openmp/reference/openmp-directives)

また、Visual C++はOpenMP 2.0までしかサポートしていないらしいです。

（ご指摘コメントありがとうございます。）
SSH(Secure SHell)

応用情報技術者平成29年秋期 午前43

暗号化や認証機能をもち，遠隔にあるコンピュータに安全にログインするためのプロトコルはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/90b3b430-20b6-a391-e95b-8f1612b84ca5.png)

１、SSH(Secure SHell)は、
公開鍵暗号や認証の技術を利用して、リモートコンピュータと安全に通信するためのプロトコルです。

・ネットワークを介して遠隔地のコンピュータを操作する「rlogin」や「rsh」などのUNIX系コマンドや「TELNET」などを安全に利用するための方式です。
・またポートフォワーディング機能を使ってFTP，POP，SMTPなどの暗号化機能をもたないプロトコルを安全に利用する手段としても使用されています。

※ポートフォワーディングとは、　 (port forwarding)
IPネットワーク上のある機器が、自らのIPアドレスのTCPやUDPの特定のポート番号への通信を、別のアドレスの特定のポートへ自動的に転送すること。 また、ネットワーク機器などの持つそのような機能。

※Telnet（テルネット Teletype network）とは、
IPネットワークにおいて、遠隔地にあるサーバやルーター等を端末から操作する通信プロトコル、またはそのプロトコルを利用するソフトウェアである。



２、L2TP　Layer 2 Tunneling Protocolの略。
OSI参照モデルの第2層におけるトンネリングプロトコルです。
暗号化の機能はないため必要に応じてIPsecと併用する必要があります。



３、RADIUS　Remote Authentication Dial In User Serviceの略。
認証情報と認証手続き、および利用ログの記録(アカウンティング)をネットワーク上のサーバに一元化することを目的としたシステムです。

ユーザー認証に基づき、データベースなどのリソースに対するアクセス制御を行う際に利用する。仕様は、RFC 2865などで規定されている。

　RADIUSは、ユーザーからの要求に対してサーバなどが認証を行い、接続の可否を返すというサーバ／クライアントモデルの仕組みをとる。そのため、要求を出す側をRADIUSクライアント、要求を受ける側をRADIUSサーバと総称して呼んでいる。なお、要求は、要求を識別するための種別コードと認証用のあて先ポート番号（1812）によって区別される。

　認証手順は、
・まずRADIUSクライアントがRADIUSサーバへアクセス要求のパケットを送信する。
・RADIUSサーバは
　　アクセス許可、
　　アクセス拒否、
　　または不正アクセスを防ぐために再度パスワードの入力などを要求するアクセスチャレンジ
のいずれかで応答する。

　従来は、ダイアルアップ接続によるリモートアクセスでの認証実現のために開発されたものだったが、ブロードバンド普及や個人認証によるセキュリティ対策の重要性から、いまでは幅広い接続サービスで活用されている。


下記と間違えやすいですね：
・RAIDとは、　Redundant Arrays of Inexpensive Disks、または Redundant Arrays of Independent Disks、レイド
2台以上のHDDを仮想的に1つのドライブであるようにPCに認識させる技術のことです。 RAIDにはいくつかモードがありますが、データの安全性を高められたり、処理速度の向上が見込めたりするなど、モードによって特徴が異なります。

※Redundant 　冗長



４、TLS　Transport Layer Securityの略。
ノード認証、暗号化通信、改ざん検知などのセキュリティ機能をOSI基本参照モデルのトランスポート層レベルで提供するプロトコルです。


IPsecはIPが属するネットワーク層(第3層)、L2TPはデータリンク層(第2層)、TLSはトランスポート層(第4層)にするので、適切な並びは上層から TLS→IPsec→L2TP の順です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/753ddb19-594b-d96c-c140-23c1d147a3c6.png)



参照：
https://www.ap-siken.com/kakomon/29_aki/q43.html

VPNで使用されるセキュアなプロトコルであるIPsec，L2TP，TLS
https://qiita.com/lymansouka2017/items/b7555fc283543f86a072

RADIUS
https://www.atmarkit.co.jp/aig/06network/radius.html
Laravelで`Target class [〇〇Controller] does not exist.`と言われたときに検討してみたい原因

#Target class [〇〇Controller] does not exist.

まだまだPHPどころかプログラミング自体初心者の域を出ていないですが、自分がぶつかったエラーの対処法を記したいと思います。自分は2時間ぐらい解決に費やしてしまったのでそんな自分の二の舞になる人が減ることを願っています笑。

以下のコードの状態の時にエラーにぶつかりました。

```web.php
Route::get('/hello','HelloController@index')
```

```HelloController.php
class HelloController extends Controller
{
    public function index()
    {
        $coolString = 'Hello from Controller.';

        return view('subviews/hello', compact('coolString'));
    }
}
```

```hello.blade.php
<h1>{{ $coolString }}</h1>
```

とりあえずエラー文をそのままググったのですが〇〇Controllersの部分がApp\Http\Controllers\〇〇Controllersになってるのばかりで、また初心者あるあるのスペルミスを何度も確認したのですがありませんでした。

#解決した方法

これまた初心者あるあるかとは思うのですがweb.phpに書いているパスが書き足りなかったです。以下に変えました。(でも[この動画](https://www.youtube.com/watch?v=98ChVWjI6KI)の人はHelloControllerしか書いてないんだよなぁと思いつつ...)

```web.php
Route::get('/hello','App\Http\Controllers\HelloController@index')
```

少しでも参考になりましたら幸いです。
Azure プライベートリンク

# Azure プライベートリンク
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/b3087dcd-11c6-f8d5-cd9a-c3cdeadc818e.png)

## 機能概要
各種PaaSリソースを、指定したVnetに接続してプライベートにアクセスできるようにする機能。インターネットを経由せず、Azureネットワーク内だけで接続ができる。
どのPaaSリソースをどのVnetのサブネットに接続するのかを指定できる。

## クイックスタート
プライベートリンクでVMとSQLデータベースを接続する方法。

- [クイックスタート \- Azure でプライベート エンドポイントを管理する \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/private-link/create-private-endpoint-portal)

## 試すときにつまづいたこと
### 他のサブネットからもアクセスできてしまう?
Subnet-1へプライベートリンクしたSQLデータベースに対して、Subnet-2のVMからアクセスができてあれ？と思ったが、これは同一Vnet内のSubnet間は既定でルーティングされるため。

### nslookupでの名前解決がおかしい?
2つのVnet（Vnet-10、Vnet-20）に対して、それぞれプライベートリンクを作成したところ、Vnet-10からは接続したSQLデータベースの名前解決ができるが、Vnet-20からは名前解決できないという問題が発生した。

調べた結果、プライベートDNSゾーンにvnet-20が追加されていないことが原因だった。
赤枠部分を追加したらどちらのVnetからも名前解決できるようになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171110/f03be073-caa2-b49c-5d77-6500163253b3.png)
￼
初めてprivatelinkを作成するときに、「プライベート DNS 統合」を「はい」にすると、自動でプライベートDNSゾーンが作成される（図中の2行目のリンク）。
あとから別のVnetで同じDNSを利用する場合、手動で接続が必要。