OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes: oc observe でオブジェクトの変更差分を確認する

Kubernetes でコントローラの動きを確認したいときなど、オブジェクトのどの部分が変更されたかを知りたい場面があります。`kubectl get` の `-w -o yaml` で変更を watch することはできますが、複数 YAML がそのまま表示されるのであまり見やすくありません。

この記事では、Openshift の CLI `oc` コマンドの `observe` 機能を使って、オブジェクトの変更差分を少し確認しやすくする方法を紹介します。

## 実行イメージ
`obj-diff` は後述のスクリプトになります。`kubectl rollout restart` で Deployment にどのような差分が生まれるかを `oc observe` で見ている例です。

<script id="asciicast-5GlVDvMNDmuWNcbRH3kKiXg9l" src="https://asciinema.org/a/5GlVDvMNDmuWNcbRH3kKiXg9l.js" async></script>

## oc observe とは
[`oc`](https://github.com/openshift/oc) は Openshift の CLI ツールです。Mac の場合は Homebrew の `openshift-cli` で簡単にインストールすることができます。そのサブコマンド `observe` ではオブジェクトの更新ごとに、簡単に指定のスクリプトを実行することができます。例えば以下では、カレントのネームスペースの `Deployment` が変更されるたびに `./obj-diff` というスクリプトが実行されます。

```bash
oc observe deploy --object-env-var OBJ --type-env-var EV -- ./obj-diff
```

上記例の引数は以下の意味になります。

- `--object-env-var`: 指定した環境変数に JSON シリアライズされたオブジェクトが設定される
- `--type-env-var`:  指定した環境変数に更新種別 (`Sync`, `Updated`, `Deleted`, `Added`) が渡されます。

Custom Resource に関しては、2020/11/27 時点では未マージですが [observe: support CRDs #650](https://github.com/openshift/oc/pull/650) で対応されています。この PR でビルドし、Custom Resource が見れることを確認しています。

## スクリプト
以下は `oc observe` でオブジェクトの差分を監視するスクリプトの例です。

```bash:obj-diff
#!/bin/bash
DIR=${DIR:-/tmp/}
VER=$(echo -E $OBJ | jq -r .metadata.resourceVersion)
CURR="$DIR/${1}-${2}.${VER}.yaml"
PREV="$DIR/${1}-${2}.prev.yaml"
LOG="$DIR/${1}-${2}.log"
echo "$(date +%H:%M:%S) $EV: $1/$2" | tee -a $LOG
echo $OBJ | ruby -rjson -r yaml -e "print JSON.parse(STDIN.read).to_yaml" > "${CURR}"
if [ -f "${PREV}" ]; then
    git diff --color "${PREV}" "${CURR}" | tee -a $LOG
fi
cp "${CURR}" "${PREV}"
echo "-----------------------------------------------"
```

`oc observe` を使って上のスクリプト `obj-diff` を以下のようなイメージで実行します。

```bash
# YAML 保存用のディレクトリを作成しておく
export DIR=$(mktemp -d)
echo $DIR

# deploy を監視
oc observe deploy --object-env-var OBJ --type-env-var EV -- ./obj-diff

# longhorn-system ネームスペースにある Custom Resource (volumes.longhorn.io) を監視 
oc observe volumes.longhorn.io -n longhorn-system --object-env-var OBJ --type-env-var EV -- ./obj-diff
```

`DIR` 環境変数で指定したディレクトリに毎変更ごとの YAML が保存されます。また。`.log` には差分を記録したログが記録されます。

```console
$ ls -l
total 80
-rw-r--r--  1 tkusumi  staff  3914 11 27 17:08 default-mypod.11080014.yaml
-rw-r--r--  1 tkusumi  staff  3991 11 27 17:08 default-mypod.11081441.yaml
-rw-r--r--  1 tkusumi  staff  4334 11 27 17:08 default-mypod.11081448.yaml
-rw-r--r--  1 tkusumi  staff  4333 11 27 17:08 default-mypod.11081492.yaml
-rw-r--r--  1 tkusumi  staff  5743 11 27 17:08 default-mypod.log
-rw-r--r--  1 tkusumi  staff  4333 11 27 17:08 default-mypod.prev.yaml
```

## おわりに
`oc observe` は Kubernetes のオブジェクトの変更を検知して、シェルスクリプトでちょっとした処理を行いたいときに非常に便利です。@superbrothers さんの [oc observe コマンドで始める Kubernetes コントローラ開発](https://speakerdeck.com/superbrothers/get-started-developing-kubernetes-controller-with-oc-observe) のようにコントローラの PoC 実装にも使えるので、ぜひご活用ください。
ソフトウェアテスト失敗談

この記事はとあるソフトウェアテストでの失敗談です。
「ちょっとした作業だし、みんな良しなにやってくれるだろう」
こんな考えでコミュニケーションが不足したときに陥りやすい罠です、ぜひ読んでみてください。

# 登場人物
Aさん：開発チーム所属。今回テストを依頼しました。
Qさん：テストチーム所属。テスト全体を管理しています。
Rさん：テストチーム所属。テストケース作成を担当しているベテランの方です。

# はじまり
むかしむかしあるところに、新規開発されているWebサービスがありました。

仕様が固まってきたある日、開発チームのAさんは思いました。
「そろそろテストをしたいがお金がない」
「なにか良い案がないか相談に行こう」
そこでAさんはテストチームのQさんに相談に行きました。

相談したところ、Qさんは言いました。
「なるほど、状況は把握しました」
「テストケースだけテストチームで作りテストはAさん達にやってもらうのはどうでしょう」
Aさんは多いに喜び、その案は採用されました。


# そして事件は起こった
#### 順調な序盤
はじめはとても順調でした。

テストケース作成はベテランのRさんに担当してもらい
毎日欠かさず進捗を報告していました。
進捗もとても順調です。

Aさんはできあがったテストケースから開発レビューを行いました。
機能がテスト範囲から抜けていないか確認するためです。

みんな楽しく平穏な日々を過ごしていました。


#### 忍び寄る違和感
ところがある日、Qさんは違和感に気付きます。
開発レビューでの指摘が思っていたよりも多いのです。
「Rさんはベテランで技術も高いはず...」
「これでは期間内に終わらない...」

同じころ、Aさんも不満を募らせます。
「指摘が多すぎる...」
「しかも基本的な指摘が多い...」

2人は悶々とした日々を過ごします。

#### 行きついた末路
そんな日々がつづき、指摘の数もどんどん増えていきます。
テストケースの修正にも時間がかかり、スケジュールに暗雲が立ち込めてきました。

ついにAさんの不満が爆発します。
「テストケース作成の体制はどうなっているのですか」
「なぜこんなにも指摘が出るのでしょう」
「これではスケジュールに間に合いません」

Qさんは困りはててしまいます。
「Rさんの能力は高く体制は問題ありません」
「なぜだかとんと見当もつきません」

なぜこうなってしまったのか、2人は反省会をはじめました。

# 2人の反省会
#### 原因はなんだ

蓋を開ければ原因はとてもシンプルなものでした。
**テストケース作成中に仕様書が更新されていたのです。**

AさんとQさんはテストのフローはきちんと決めていました。
期間をいつにするか、報告をどうするか、レビューをどう進めるか。
ですがテスト以外の作業に無頓着すぎたのです。

そして2人は致命的な思い込みをしてしまいます。
Aさんは完了連絡のない部分については仕様変更してよいものと。
Qさんは仕様書の作成はすべて終わっているものと。

「なんてことだ」
2人は深く肩を落としました。

#### 共通の反省
そして、はたと2人は気づきます。
**2人はコミュニケーションを最低限しかとっていなかったのです。**

Aさんはテストチームがよしなにやってくれるだろうという気持ちがあり
Qさんはテストケース作成だけなら大丈夫だろうという慢心があったのです。

必要最小限のコミュニケーションだけで、時間をかけずに対応するつもりが
逆に多くの時間をかけることになってしまうという本末転倒な結末を招いてしまったのです。

驚きと悲しみのあまり2人は椅子から転げ落ちました。

# 心を入れ替えて
AさんとQさんは深く反省しました。
そして毎朝5分、全員で情報を共有する会を開きました。
Qさんはそこでテストケース作成の進捗や困っていることを細かく共有しました。

共有内容はテストだけではありません。
仕様作成のようなテスト以外の状況もAさんから共有するようにしました。
それによりテストに影響しそうなことがわかり、事前に手を打てるようになりました。

するとどうでしょう。
あれだけあった指摘がまったく出なくなったのです。
作成は順調に進み、スケジュールに遅れることもなくテストケースができあがりました。

「たった5分の会でこんなにも変わるものなのか」
2人は手を取り合って喜びました。

めでたしめでたし。

# おわりに
いかがだったでしょう。
あらためて振り返ると自身にも似たような経験があると思います。

効率化がうたわれる昨今、間違った効率化で逆に手間を増やしてないでしょうか。
それが致命的になる前に、ぜひこの機会に一度振り返ってみても良いと思います。

この記事は以上となります。
ご一読いただきありがとうございました。
Golangのテストで関数名に日本語を使ってわかりやすくする方法


## 標準テストの場合

```golang
package hoge_test

import (
	"reflect"
	"runtime"
	"strings"
	"testing"
)

func Test(t *testing.T) {
	t.Run("足し算テスト", func(t *testing.T) {
		Run(t, 卍１プラス１イコール２)
	})
}

// Run [標準のテスト] 関数名を説明文として設定する処理
func Run(t *testing.T, f func(*testing.T)) {
	fv := reflect.ValueOf(f)
	funcFullName := runtime.FuncForPC(fv.Pointer()).Name()
	list := strings.Split(funcFullName, ".")
	funcName := list[len(list)-1]
	t.Run(funcName, f)
}

// テスト本体　先頭の卍は、数字全角が先頭にくるとコンパイルエラーとなるための苦し紛れ
func 卍１プラス１イコール２(t *testing.T) {
	actual := 1 + 2
	expected := 2
	if actual != expected {
		t.Errorf("actual=%d, expected=%d", actual, expected)
	}
}

実行結果
--- FAIL: Test (0.00s)
    --- FAIL: Test/足し算テスト (0.00s)
        --- FAIL: Test/足し算テスト/卍１プラス１イコール２ (0.00s)
            hoge_test.go:33: actual=3, expected=2
FAIL

```

## テストライブラリ：goblinを使った場合

```golang
package hoge_test

import (
	"reflect"
	"runtime"
	"strings"
	"testing"

	"github.com/franela/goblin"
	. "github.com/franela/goblin"
)

func Test(t *testing.T) {
	g := Goblin(t)
	g.Describe("足し算テスト", func() {
		RunG(g, 卍１プラス１イコール２)
	})
}

// RunG [goblinテスト] 関数名を説明文として設定する処理
func RunG(g *goblin.G, f func(g *goblin.G)) {
	fv := reflect.ValueOf(f)
	funcFullName := runtime.FuncForPC(fv.Pointer()).Name()
	list := strings.Split(funcFullName, ".")
	funcName := list[len(list)-1]
	g.It(funcName, func() {
		f(g)
	})
}

// テスト本体　先頭の卍は、数字全角が先頭にくるとコンパイルエラーとなるための苦し紛れ
func 卍１プラス１イコール２(g *goblin.G) {
	actual := 1 + 2
	expected := 2
	g.Assert(actual).Equal(expected)
}

実行結果
=== RUN   Test

  足し算テスト
    1) 卍１プラス１イコール２


 0 tests complete (0 ms)
 1 tests failed: 

  1) 足し算テスト 卍１プラス１イコール２:

    3 does not equal 2
    	/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/assertions.go:67 +0x197
    	/home/daijin/src/testp/hoge_test.go:61 +0x9e
    	/home/daijin/src/testp/hoge_test.go:53 +0x2e
    	/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:228 +0x24
    	/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:351 +0x7f
    	/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:228 +0x7b
    	/home/daijin/go/pkg/mod/github.com/franela/goblin@v0.0.0-20200825194134-80c0062ed6cd/goblin.go:225 +0x371
--- FAIL: Test (0.00s)
```

上記のようにはせず、普通に書く場合、タイトルと関数名の同じものを並んで2個書くことになり冗長。

日本語関数名だけセットすれば、それがタイトルになると良いなぁという感じで書きました。

githubにでも上げるか？とかおもったのですが、コード量少ないので、使うのであれば、テストのユーティリティにでも入れてもらえばと思います。

## 終わりに一言

[TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング](https://www.youtube.com/watch?v=Q-FJ3XmFlT8)

twadaさんのテスト駆動開発ライブコーディングで、Javaだと日本語でテスト書けていてうらやまだったので、Golangでも同じように出来ないか？頑張ってみたという感じでした。

先頭が数字から始まるとコンパイルエラーとなります。

Javaだとアンダーバーでしたが、Golangだと無理だったので適当な漢字（卍）を使ってみました。

余談ですが、シャープっぽく見える井口さんの井の字も候補でした。
Laravel × Vue.jsでハマった簡単なエラー

ターミナルで下記の様に表示された際は、このエラーの上で右クリック＋許可するだけ

ESLint is disabled since its execution has not been approved or denied yet. Use the light bulb menu to open the approval dialog.　

google先生に頼りすぎていたせいか、思考力が低下していた。気をつけよう・・・
jQueryによるajax通信時、Nest.jsサーバ側の型バリデーションで詰まったので備忘録

# 概要
フロント側からjQuery.ajaxでNestJsサーバーの方へリクエストを送った際に、
型が全てstringになってしまいバリデーションが機能しないことがあったのでその解決策。

## 解決策
jQuery.ajax側で、以下の2点を明示して渡す。
・contentTypeを"application/json"に設定
・bodyをJSON.stringifyで括る

```javascript:sample.js
$.ajax({
    type  : "Get",
    url   : "https://unko.com",
    contentType : "application/json",
    timeout  : 1000,
    data  : JSON.stringify(obj)
    }).done()
)}
```

## 原因
jQuery.ajaxはデフォルトで [^1] "application/x-www-form-urlencoded"で送られるため。（クエリ形式）
注意点として、JSON.stringify()をしたからといって、Nest側で明示的にparseする必要はなく、例えば以下のような設定によって受け取り時にパースされる。

```
  app.use(express.json());
  app.use(express.urlencoded({ extended: true }));
```

処理としては[ここらへん](https://github.com/senchalabs/connect/blob/1.7.1/lib/middleware/bodyParser.js#L89-92)になるが、この時"application/jsonを明示しないと、狂ったオブジェクトとして返ってくるので注意。（ここでハマった。）

[^1]: http://semooh.jp/jquery/api/ajax/jQuery.ajax/options/
[Rails]deleteメソッドとdestroyメソッドの違いについて！！[初心者]

#はじめに
先日、とあるアプリケーションを作成していて、``deleteメソッド``と``destroyメソッド``のどちらを使うべきか、分からなくなってしまったので、備忘録も兼ねてアウトプットします！！

#deleteメソッドについて
指定した条件のレコードを、SQLを直接実行することで削除します。
ActiveRecordを介さないということなので、モデルを経由しません。
また、モデルで関連付けされているレコードがあったとしても、そちらは削除されません。

````ruby:
User.find(id: 1).delete
````

#destroyメソッドについて
ActiveRecordを介して、指定した条件のレコードを削除するメソッドです。
モデル内で、``dependent: :destory``が設定されていれば、関連付けされているデータも併せて削除されます。
ActiveRecordを介しているので、``callback``メソッドやバリデーションを機能させることもできます。

メソッドの実行時にエラーが発生し、削除ができなかった場合は、``false``を返すだけで、例外は返却されません。
なので、「とりあえずデータを削除したいが、失敗した場合はエラーを返却してほしいな...」という場合は、``destroy!メソッド``を使用すれば大丈夫です。

````ruby:
User.find(id: 1).destroy
````

例えば、Userモデルに多数のBookモデルが関連付けされている場合、``id: 1``のユーザーが投稿した``book``に関しても、同時に削除がされることになります。

#ActiveRecordって何なん？？
ActiveRecordとは、``RubyとSQLの翻訳機``のようなイメージです。

本来、DBで使用されるDB言語には、SQLが使用されています。
しかし、Railsが開発してくれている``ActiveRecord``のおかげで、我々は``Ruby``を使用して、DBからデータを探したり、持って来れたり出来るというわけなのです！！
非常に便利な機能ですね。

#delete_allとdestroy_allについて
まとめて紹介しますが、こっちを使用すると、条件に合致する``複数``のレコードを同時に削除することが可能です。
``whereメソッド``と同時に使われることが多いです！！

````ruby:
Book.where(user_id: 1).delete_all
Book.where(user_id: 1).destroy_all
````

#おわりに
Railsには、似通っている機能が多数存在するので、混乱することも多いですが、一つ一つ丁寧に理解していくことが、上達への近道になりそうですね。
機械学習･データサイエンスの勉強メモ

## はじめに
 現在､大学3年でエンジニア就活をしています｡プログラミング学習等の勉強の成果を何か言語化してアウトプットしたいなと考えたので､Qiitaで記事を投稿することにしました｡
 大学で配属された研究室では､機械学習､データサイエンスを主に取り扱っていて､その基礎知識についてインプットしているので､現在までの学習の成果をアウトプットできればと思います｡また､間違ったこと言ってるかもしれないです｡

## データサイエンスとは??
* ビックデータなどを処理･分析して､そこから有用な情報･価値を引き出すアプローチのこと｡
    * → あるデータをもとに､何か世の中の課題を解決しようとする学問だと認識してます｡

## 機械学習とは?? ん､人工知能?､深層学習?
* 人工知能>機械学習>深層学習
* 上の関係性のように人工知能のなかに機械学習という手法が存在し、さらに機械学習の中でも深層学習という手法が存在している｡
    * →僕のイメージでは､機械学習≒AIに学習させること｡ 同義と捉えても今のところ支障はない

* 機械学習アルゴリズムには､「教師あり学習」、「教師なし学習」、「強化学習」が存在する｡

##教師あり学習
* ラベル付けされたデータからの学習
* 入力と出力のペアを数多く与える
* y=f(x)におけるxとyのペアを与える
    * fはモデルを指す

### 回帰
* 変わらない関数をデータから学習すること｡  
* 与えられたデータにはどんな関数がふさわしいのか予測する

### モデル
* どんな関数関係にあるかという見当

### 誤差関数

* データとモデルの出力がどれだけずれているかを示す関数(ズレの指標) 
* 小さくなることを目指す
* モデルとデータの差の2乗和を取ることが多い(正負を考慮しないため)
* 誤差を小さくすることを最適化(問題)という

### 汎化性能

* 一部のデータから全体を評価すること
* 汎化性能を良くするのが機械学習のコツ

### バッチ学習

* バッチ=ひとまとめ､ひとくくり
* データを全部貰い受けてそれを訓練データにして学習する

### オンライン学習

* 次から次へと来るデータを学習する

### ボルツマン機械学習

* 隣同士の関係がどういう傾向にあるのか学ぶ

    
##教師なし学習

* ラベル付けされていないデータからの学習
* y=f(x)のy(出力)が指定されていない

### クラスタリング
* データの構造や特徴の類似性や傾向からグループ分けをすること
* 明確な答えはないけど､特徴や傾向を調べる際に使う｡

### 教師あり学習と教師なし学習のイメージ
* 産まれたばかりの赤ちゃんは｢🍎｣を見て､赤くて丸いものと認識する(教師なし学習)
* その後成長していって､言葉を覚え始めてから｢お母さんに『｢🍎｣はりんごだよ』と教えられる(教師あり学習)

##強化学習
* 試行錯誤することによりデータを収集し、そこから学習 ← 人間は手を加えない
* xを与えたら帰ってくるyの値を学習､またxを与えたら､､､→だんだん賢くなる
* [ブロック崩しゲーム](https://youtu.be/TmPfTpjtdgg)

## 終わりに

インプットした知識を言語化すると､すごく頭の中で整理できている部分と腑に落ちない部分が明確になりました｡
今後も学習成果をアウトプットする機会も増やしていきたいです｡

## 参考
* [機械学習入門 ボルツマン機械学習から深層学習まで](https://www.amazon.co.jp/dp/B06Y41YGNW/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Windows10の便利な画面切り取りツール

# Windows10の便利な画面切り取りツール

## 1.はじめに

パソコンの画面を画像として保存したいとき、どのような方法で保存しているでしょうか。
スクリーンショットで画面全体をクリップボードにコピーしてペイントツールで画像を成型しているという人が多いのではないでしょうか。
実はWindows10にはこれ以外にも標準で画面を切り出す便利な機能が用意されています。
知っているのと知らないのとで業務効率が段違いに違う場面もあるので知らない人は是非一度使ってみていただきたいと思います。
(特に3.切り取り＆スケッチ)


## 2.Snipping Tool

今回ツールを2つ紹介するのですが、1つ目はSnipping Toolです。
このツールのスクリーンショットと比較して優位な点として以下があげられると思います。

* 切り取る範囲を選択できる。
* (簡易的な編集のみなら、)ペイントを起動する必要が無い。

### [使い方]
> win+Rで「ファイル名を指定して実行」を開き、"snippingtool"を入力して実行します。
> ![win_r_sni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/597fd88c-54ff-0d8f-4fd5-c77c957a9c2a.png)
> 
> ↓
> 
> [新規作成]をクリックすると画面全体が白っぽくなり切り取る範囲を選択できるようになります。
> ![範囲選択_sni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/200ae384-a4d7-4451-d26c-730ac6301cb6.png)
> 
> ↓
> 
> 範囲を選択すると切り取った画像がウィンドウに表示され編集(ペン入れ)できます。
> ![編集_sni.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/7bf13ed1-95cd-6ef4-2879-28d8f99f035b.png)
> 
> ↓
> 
> 編集が終わったら画像ファイルとして保存します。


## 3.切り取り＆スケッチ

次に紹介するのが切り取り＆スケッチです。
このツールのスクリーンショットと比較して優位な点として以下があげられます。

* 切り取る範囲を選択できる。
* ツールを起動する必要が無い。(ショートカットキーで実行できる)
* Exelやwordに画像を張り付ける際、画像ファイルを作成する必要が無い。

### [使い方]
> win+Shift+Sで画面全体が黒っぽくなり切り取る範囲を選択できるようになります。
> ![範囲選択_cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/df811956-1caa-7a07-e4a2-0dd2d71aeacb.png)
> 
> ↓
> 
> 範囲を選択すると切り取った画像がクリップボードにコピーされます。
> ![保存完了_cut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/6da4104a-816d-6e40-32a1-213307737917.png)
> 
> ↓
> 
> クリップボードにコピーされた画像はペイントはもちろんのこと、
> Exelやwordにも直接張り付ける(ctrl+V)ことができます。
> ![貼付け例_cut_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/5dfa4d56-86c4-436d-b134-9a1bfceda871.png)
> ![貼付け例_cut_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604076/8e1fc474-bd12-5243-9c04-28c821274f0a.png)


## 4.終わりに

個人的にExelで資料を作成する機会が多く、これまでは張り付ける画像が必要となる度に、
PrintScreenして、paintから画像ファイルを作成して、挿入して、画像ファイルを削除するという手順を行っていました。
きっとまだこんな手順を行っている人がどこかにはいるだろうと思い今回記事を書かせていただきました。
今回紹介した切り取り＆スケッチは割と最近追加された新しい機能(だったと思う)ですが、
日々開発されるこういったTips的な知識は知らないとただただ損なので、
取りこぼさない技術者でありたいものだと思いました。
【ITインフラ】基礎知識を個人的にまとめた。

ITインフラについて、理解を深めるためにまとめる。
随時更新していく。

##OSI参照モデル
Open Systems Interconnection
国際標準化機構（：ISO）による通信機能における`共通ルール`を定義したもの
➡︎おかげで異なるメーカー製品同士でも通信し合うことができている

[ネットワーク7階層]　※最上層が`7`、最下層が`1`
#####⑦【アプリケーション層】
ネットワークを利用するソフトとのやり取りに関するルール

#####⑥【プレゼンテーション層】
コンピュータ側とネットワーク側におけるデータ形式の変換に関するルール

#####⑤【セッション層】
通信開始から終了までに関するルール

#####④【トランスポート層】
対処機器への通信の正確性に関するルール
例）通信プロトコル（TCPやUDP）
`TCP`：Transmission Control Protocol
　　　　`安全性`重視
`UDP`：User Datagram Protocol 
　　　　`スピード`重視

#####③【ネットワーク層】
対象機器への信号受け渡しに関するルール
例）ルータ、IPアドレス、アクセスポイント、

#####②【データリンク層】
直接繋がり合う機器の通信に関するルール
例）スイッチ

#####①【物理層】
物理的通信に関するルール
例）コネクタ、ケーブル、電気信号


##TCP/IPモデル

米国国防高等研究計画局（：DARPA）による通信機能における`共通ルール`を定義したもの
➡︎おかげで異なるメーカー製品同士でも通信し合うことができている

[ネットワーク4階層]　※最上層が`4`、最下層が`1`
#####❹【アプリケーション層】
ネットワークを利用するソフトとのやり取りに関するルール
OSI参照モデルのアプリケーション層、プレゼンテーション層、セッション層と似た役割
例）通信プロトコル（HTTPやFTPやSMTP）

`HTTP`：HyperText Transfer Protocol
　　　　`ホームページのファイルの受け渡し`に関しての決まり事　　

`FTP`：File Transfer Protocol
　　　　`ファイルのやり取り`に関しての決まり事

`SMTP`：Simple Mail Transfer Protocol
　　　　`メール`に関しての決まり事

#####❸【トランスポート層】
対処機器への通信の正確性に関するルール
OSI参照モデルのトランスポート層と似た役割
例）通信プロトコル（TCP）

#####❷【インターネット層】
対象機器への信号受け渡しに関するルール
OSI参照モデルのネットワーク層と似た役割
例）IPアドレス

#####❶【ネットワークインターフェース層】
直接繋がり合う機器の通信に関するルール
OSI参照モデルのデータリンク層と似た役割
例）ルータ、アクセスポイント
C言語　メモリリーク検出ツール

# はじめに

メモリリークを確認するツールが紹介されていたので、自分用に要点をまとめた記事です。

こちらのコードは以下のサイトで解説されていたコードに少し手を加えて、使っています。
以下サイトは解説等も充実しておりますので、詳しくはそちらをお読みください。

[【C言語】メモリの解放忘れ（メモリリーク）を自力で検出する方法 | だえうホームページ](https://daeudaeu.com/memory_leak/)

## ツールのコード

メモリリークを検出したいファイルと一緒にコンパイルするコード

```leakdetect.c
#include <stdio.h>
#include <stdlib.h>
#include "leakdetect.h"

#define N 500

MEM_T mi[N];

void leak_detect_init()
{
	for (int i = 0; i < N; i++)
	{
		mi[i].p = NULL;
		mi[i].size = 0;
		mi[i].file = NULL;
		mi[i].line = 0;
	}
}

void *leak_detelc_malloc(size_t size, const char *file, unsigned int line)
{
	void *p;

	if (!(p = malloc(size)))
		return NULL;
	for (int i = 0; i < N; i++)
	{
		if (mi[i].p == NULL)
		{
			mi[i].p = p;
			mi[i].size = size;
			mi[i].file = file;
			mi[i].line = line;
			break;
		}
	}
	return p;
}

void leak_detect_free(void *p)
{
	for (int i = 0; i < N; i++)
	{
		if (mi[i].p == p)
		{
			mi[i].p = NULL;
			mi[i].size = 0;
			mi[i].file = NULL;
			mi[i].line = 0;
			break;
		}
	}
	free(p);
	p = NULL;
}

void leak_detect_check()
{
	for (int i = 0; i < N; i++)
	{
		if (mi[i].p != NULL)
		{
			printf("=== memory leak ===\n");
			printf(" adress : %p\n", mi[i].p);
			printf(" size   : %u\n", (unsigned int)mi[i].size);
			printf(" where  : %s:%u\n", mi[i].file, mi[i].line);
			printf("===================\n\n");
		}
	}
}
```

```leakdetect.h
#ifndef LEAKDETECT_H
# define LEAKDETECT_H
# include <stdlib.h>

typedef struct
{
    void *p;
    size_t size;
    const char *file;
    unsigned int line;
} MEM_T;

void leak_detect_init(void);
void *leak_detelc_malloc(size_t, const char*, unsigned int);
void leak_detect_free(void*);
void leak_detect_check(void);

#endif
```

## 使い方

①mallocとfreeを使う関数の冒頭部分にマクロを追記。
②main関数の中にテストしたいコードを挟むように
`leak_detect_init();`と`leak_detect_cheak();`を追記。

```main.c
#include "leakdetect.h"
#define malloc(s) leak_detelc_malloc(s, __FILE__, __LINE__)
#define free leak_detect_free

int main()
{
	leak_detect_inti();

	// ~~~ 確認したいコード ~~~

	leak_detect_cheak();

	return 0;
```


巻き込んでコンパイル

```terminal
gcc main.c leakdetect.c
```
Vuetifyで基本の文字色をSASS(SCSS)で変更する方法

# 結論

```scss:variables.scss
$material-light: (
  'text': (
    'primary': #333333,
  )
);
```

# なんで記事にしたか

Vuetifyで基本の文字色（何も指定していないデフォルトのフォントカラー）をSASS変数で指定する方法が、なぜかググっても全然でてこなかった。
公式ドキュメントでも見つけられず…。
やっとこさ英語で見つけたので日本語情報にしておく。

# 参考元

https://github.com/vuetifyjs/vuetify/issues/11413
2.3.1 二値化･適応二値化

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABによる二値化、適応二値化について紹介します。とてもシンプルです。




Image Processing Toolboxが必要ですね。はい。

対応ファイル：[I2_03_1_adaptThresholding.m]
(https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_03_1_adaptThresholding.m)

# 初期化

```matlab:Code
clc;clear;close all;imtool close all;
```

# 画像の読込み･表示

```matlab:Code
G = imread('coins.png');
% 可視化
figure; imshow(G);
```

![figure_0_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/a5e028f4-43c3-fdb2-f1e5-f5585ae9c63a.jpeg)

# Otsu法により、大局的しきい値により画像を二値化

```matlab:Code
BW = imbinarize(G);
% 可視化
figure; imshow(BW);
```

![figure_1_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/fea40fdd-7241-44d3-9a54-f5b0d8b639ae.jpeg)

# 穴を埋める


コインの内部が二値化しきれていないので、別途モルフォロジー処理で埋めてしまいます。



```matlab:Code
BWf = imfill(BW, 'holes');
% 可視化
figure; imshow(BWf);
```

![figure_2_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/8bde9e9a-d7fa-e502-f10c-8f4d2ed94e7c.jpeg)

# 適応二値化


次に適応二値化についてみていきます。先ほどの方法は、画像全体に同じしきい値を適用して、二値化していきました。それに対してこちらは、画像の場所によってしきい値を適応的に変えて二値化するものです。背景の明るさにばらつきがある場合に効果を発揮します。



```matlab:Code
G = imread('printedtext.png');
% 可視化
figure; imshow(G);
```

![figure_3_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/69d58b5f-6e9c-6171-bb48-df2973ccc33a.jpeg)

ご覧の通り明るさにかなり違いがあります。


# 輝度の局所平均を用い、画素単位で適応しきい値計算

```matlab:Code
T = adaptthresh(G, 0.4, 'ForegroundPolarity','dark');  % 黒い部分が前景
figure; imshow(T);  % しきい値の可視化
```

![figure_4_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/1b5eacb2-8e13-9507-40a8-77c211489192.jpeg)

```matlab:Code
%% 算出したしきい値で、画像を二値化･表示
BW = imbinarize(G, T);
imshow([G; BW*256]); truesize; shg;     % 原画像を結果を、縦に並べて表示
```

![figure_5_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/14aab51f-a151-2e19-f75d-9224d7db673e.jpeg)

画像の場所によらずきちんと二値化できていますね。他の例も見てみます。



```matlab:Code
% 別の画像の読込み･表示
G = imread('rice.png');
figure; imshow(G);
```

![figure_6_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/3f5c081d-dce3-17fc-f58f-27af3f0adf29.jpeg)

```matlab:Code
% 画像を適応二値化･表示
BW = imbinarize(G, 'adaptive', 'sensitivity',0.4);
figure; imshowpair(G, BW, 'montage');
```

![figure_7_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/39c0f0b6-7efa-70e9-04dc-979b9f19289a.jpeg)

こちらもきちんとできていますね。場所によってしきい値を変えるので、結果画像がパッチ上に不連続になってしまう場合もあります。適宜使い分けることが重要かと思います。


# 謝辞


本記事は [@eigs](https://qiita.com/eigs) さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
CentOS8.2でMySQL8.0ユーザーにGRANT設定する手順

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
VPSサーバー（CentOS8.2）でMySQL 8.0を使用している。特定のデータベースに特化したユーザーを登録し、DBへのアクセス権限(GRANT)を設定する手順をメモしておく。

例として、`kankeri`というデータベースに管理者として`kadmin`と一般ユーザーとして`kuser`を登録することにする。kadminにはALL PRIVILEGESを設定し、kuserには一般的なCRUD操作のみを許可する。MySQL 8.0では、認証回りが強化されたため、userテーブルからpasswordカラムがなくなっている点に注意すること。（正確には、暗号化されたパスワードはauthentification_stringというカラムに移されている。）

```bash

$ mysql -uroot -p mysql
> use mysql;
> create database kankeri;			// まず、kankeriデータベースを生成	
	
> use kankeri;
> show variables like 'char%';

> # delete from user where user='kadmin';
> # delete from user where user='kuser';

> CREATE USER kadmin@localhost IDENTIFIED BY '***';			// kadmin追加
> CREATE USER kuser@localhost IDENTIFIED BY '***';			// kuser追加

> GRANT ALL PRIVILEGES ON kankeri.* TO kadmin@localhost;				// kadminの権限
> GRANT DELETE,INSERT,SELECT,UPDATE ON kankeri.* TO kuser@localhost;	// kuserの権限

> select host,user,plugin from user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| localhost | kadmin           | mysql_native_password |
| localhost | kuser            | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | mysql_native_password |
+-----------+------------------+-----------------------+

> flush privileges;
> exit
```
kadmin、kuserともパスワードの認証方式は、mysql_native_passwordになっている。この設定は、/etc/my.cnf.d/mysql-default-authentication-plugin.cnfで指定したものに従っている。

以下のような手順で、権限が適切に機能しているかチェックしておこう。

```
$ mysql -uroot -p kankeri
> create table dummy1 (id int, name varchar(50));
> insert dummy1 values(10,’梶井基次郎’);

// kadminは、kankeriデータベース以外にはアクセスできない
$ mysql -ukadmin -p kankeri         
> create table dummy2 (id int, name varchar(50));
> insert dummy2 values(20,’中島敦’);
> use mysql;
ERROR 1044 (42000): Access denied for user 'kadmin'@'localhost' to database 'mysql'

// kuserは、kankeriデータベース以外にはアクセスできない
// kuserは、create tableなどスキーマに関する操作はできない
$ mysql -ukuser -p kankeri
> create table dummy3 (id int, name varchar(50));
ERROR 1142 (42000): CREATE command denied to user 'kuser'@'localhost' for table 'dummy3'
> insert dummy1 values(30,’檸檬’); 
> insert dummy2 values(40,’山月記’);
> select * from dummy1;
> select * from dummy2;
```

以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
WordPressのテーマを認識させるために行うこと

多くのかたは、WordPressサイトを自作テーマで制作するときにまずはhtmlで静的サイトを作ってからWordPress化させるのではないでしょうか？

そのときの、第一課題としてテーマを読みこませる必要がありますね。
普通にhtmlファイルをフォルダ内にいれても読み込まれません。

読み込ませるための2つやらないといけないことがあるので、どのように行っていくのかを解説していきます。

##style.cssの作成
こちら気をつけないといけないのが、スタイルを当てるために使用したsytle.cssとは別に準備する必要があります。
![11064844b1156cf2440d474a774a306c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/c57781c4-1f66-d6d6-c2e4-6d0e08b773c1.png)

この中に、テーマを読み込ませるためのコードを書いていきます。

```style.css
@charset "utf-8";
/---------------------------------
テーマとしてWPに認識させるための記述↓
---------------------------------/
/*
theme Name: 好きな名前
Author: 制作者の名前
Description: テーマの解説
version： 1.0.0
*/
```

参考: codexではこのように解説されています。
![7c3c547098099f72bd0818d7d2fee8dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/1b582bc4-98f3-6bcf-5d3e-93c6ba07917e.png)

## functions.phpの作成

次に`functions.php`を作成します。
codexを参考にテーマを読み込むのに必要なコードを書いていきます。
僕はいつもこちらのブログを参考（真似て）にして書いています。(https://haniwaman.com/functions/)

本当に分かりやすいです。

```functions.php
/**
 * WordPress標準機能
 *
 * @codex https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_theme_support
 */
function my_setup() {
  add_theme_support( 'post-thumbnails' ); /* アイキャッチ */
  add_theme_support( 'automatic-feed-links' ); /* RSSフィード */
  add_theme_support( 'title-tag' ); /* タイトルタグ自動生成 */
  add_theme_support( 'html5', array( /* HTML5のタグで出力 */
    'search-form',
    'comment-form',
    'comment-list',
    'gallery',
    'caption',
  ) );
}
add_action( 'after_setup_theme', 'my_setup' );
```

あとは、`index.html`　→ `index.php`　でトップページは表示されるようになります。
汎用性が高く調査に便利なコマンドfind grep

## findとgrepを使うことでなにができるか

ディレクトリを指定して、再帰的にgrepすることができる

## 指定ディレクトリ配下の全ファイルにgrep

```sh
find /var/www/wordpress/ -type f | xargs grep '検索文字列'
```

## 指定ディレクトリ配下の指定した拡張子のファイルにgrep

```sh
find /var/www/wordpress/  \( -name \*.html -or -name \*.php \) -print | xargs grep '検索文字列'
```
- -printはフルパス出力をするオプション。findコマンドのデフォルトの挙動みたいなのであってもなくてもよさそう
- xargs が何をしているかは以下リンク
- https://albel06.hatenablog.com/entry/2018/10/21/211905
https://teratail.com/questions/25558
- https://techblog.kyamanak.com/entry/2018/02/12/202256
Next.jsでクエリパラメータを遷移先に渡すにはどうすればいいのか？

Next.jsでクエリパラメータを渡す方法について日本語の記事が少ないので、この記事では「**Next.jsでどのようにしてクエリパラメータを渡すのか？**」について解説します。

まず、サンプルで作る画面は以下の通りです。
![Nextjsのパラメータ引き渡し.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/329f0855-6d64-2f9c-6120-8e16dbf1eb77.gif)
大まかに説明すると**ホーム画面(index.jsx)で入力した内容を出力画面(output.jsx)で出力**しています。

## ホーム画面
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/29832439-a264-2368-2510-35b7e3a928b2.jpeg)

```index.jsx
import { useRouter } from 'next/router';
import {useState} from 'react';

export default function Index() {
  const router = useRouter();           //ルーターの取得
  const [input, setInput] = useState();

  // ボタンをクリックしたときの処理
  const clickButton = () => {
    //未入力の時
    if (!input) {
      return;
    }

    router.push({
        pathname:"/output",   //URL
        query: {input :input} //検索クエリ
      });
  }

  return (
    <div style={{textAlign: "center", marginTop: "50px"}}>
      {/* 入力項目 */}
      <input 
        type="text" 
        value={input}
        onChange={(e) => setInput(e.target.value)} /*変更時inputに値をセット*/
      />

      {/* ボタン */}
      <button 
        onClick={clickButton}
        disabled={!input}>    {/*入力項目が未入力の場合、非活性*/}
        遷移
      </button>
    </div>
  )
}

```


ホーム画面では、入力内容を出力画面に渡して画面遷移を行っています。大きく分けると2ステップです。

まず最初に、`useRouter`フックを使うためにインポートが必要です。
`import { useRouter } from 'next/router';`

次に`router`オブジェクトの`push`を使って画面遷移を行っています。このとき、クライアントサイドでの遷移となり、サーバーからリクエストが返されるわけではないので注意が必要です。

そして、オプションに以下の設定を行います。
・**pathname：遷移する先のURL**
・**query：遷移先に渡すパラメータ**

これにより**「遷移先」、「遷移先に渡すパラメータ」がセット**されます。注意点としてはqueryはオブジェクト型で渡すことです。そのため文字列をそのまま渡すのではなく、連想配列で渡します。

今回の場合は、`input`に入力した値をセットしています。

## 出力画面
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/533e4a86-741c-4761-5df9-e31e112544d3.jpeg)

```ouput.jsx
import { useRouter } from 'next/router';

export default function Output() {
  const router = useRouter();

  return (
    <div style={{textAlign: "center", marginTop: "50px"}}>
      {/* パラメータの表示 */}
      <h1>input：{router.query.input}</h1>
    </div>
  )
}
```

**出力画面では渡ってきたパラメータを表示する**だけです。

routerオブジェクトの`query`にパラメータが入っているので、`router.query.input`で取得できます。

ちなみに、遷移元でパラメータが設定されていない場合、`{}`で渡ってくるので先ほどの値は`undefined`となり、空白で表示されます。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621361/06881fdd-6bc1-b631-f195-df698603f492.jpeg)

##まとめ
- `useRouter`フックを使って`router.push`に`pathname(遷移先)`、`query(渡すパラメータ)`をセットする。
- 遷移先では、`router.query.「パラメータ名」`で出力できる
- 呼び出し元でパラメータが設定されていなければ、`{}`で渡される
被引用論文検索と引用アラートの設定について


#プロローグ
自分あるいは自分の研究室がpublishした論文や興味・関心のある論文たちは、どのような論文に引用され、そこからどんな研究が行われているのでしょうか？みなさん興味のあることだと思います(味方あるいは敵を知る意味で)。今回は引用された論文(**被引用論文**)の検索とアラートの設定についてまとめます。

#論文検索サイト: Web of Science

[Web of Science](https://www.webofknowledge.com/)

>Web of Scienceは世界随一の学術情報プラットフォームです。国際的に、あるいは特定の地域や分野において最も影響力の高いジャーナルや学術書、会議録、研究データ等を収録し、引用に基づく公平な指標を学術コミュニティに提供しています。広大な情報の海から、研究者が本当に必要とする、価値ある情報の発見をナビゲートします。("Web of Science クイック・リファレンス・ガイド 2019年4月改訂" より転載)

クラリベイト・アナリティクス・ジャパンが運営する論文データベースです。
例えば生物学のデータベースではNCBIのPubMedが有名ですが、Web of ScienceではPubMedではできない**被引用論文検索**が可能です。

#被引用論文検索

まず、トップページの基本検索で調べたい論文を検索します。今回は相当な被引用回数が予想される、ヒトゲノムの最初のシークエンス解析報告論文である"Initial sequencing and analysis of the human genome. (2001)"を検索します。
![Screenshot at Nov 26 11-58-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/0dcdad08-abfa-2cdf-8f87-5e886793423d.png)

検索結果にお目当ての論文が出てきました。
![Screenshot at Nov 26 11-59-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/1e9053f6-5117-f296-8574-826a4c2ec174.png)

クリックして詳細を確認します。
右の引用ネットワークのカラムに被引用回数が表示されています。予想通り、この論文は14000回を超える高い引用数を持つ論文でした。
![Screenshot at Nov 26 12-00-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/caffebd5-5665-7914-2bbe-a6eb5a24a404.png)

太文字の"**14,753**"をクリックすると、被引用論文のリストを見ることができます。
![Screenshot at Nov 26 11-59-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/20804d90-ac76-832d-1112-99ba1bf058e1.png)


#アラートの設定

> ※私が見た複数のアラートでは、publishからこのアラートに引っ掛かるまでかなり時間がかかりそうなので、最新情報を得る手段としてはあまり良くないかもしれません…これからの改善に期待？


興味ある論文が引用された論文がpublishされた際、アラートが届くように設定を行います。
引用ネットワークのカラムに"引用アラートの作成"があるので、そこから登録を行います。
登録にはアカウント登録が必要になるので別途行ってください。
![Screenshot at Nov 26 12-00-40_Fotor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/3649a686-d692-36dd-68f6-dda2a79bcecb.png)

登録した引用アラートの一覧はアカウントの"Citation Alerts"から確認することができます。
![Screenshot at Nov 26 12-03-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/6f6dccb5-f9c7-26e9-64f4-8e4a11c3509a.png)

実際に論文が引用されるとこのような通知が届きます。
メール受信時の日付が2020年11月27日、オンラインで閲覧可能になったのが9月18日なので約二ヶ月経過しています、ちょっと遅い…
![Screenshot at Nov 27 15-49-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330454/cd37dc62-25b2-cdb4-e39e-c143964654dc.png)
smtpについてのメモ（初投稿）

先日、software designの2015年9月号にある電子メールに関する特集記事を
読んだので、あとで見返すメモがてら初投稿してみます。

## １、プロトコルにはテキストベースとバイナリベースがある
アプリケーション層のプロトコルにはhttpやsmtpのようにテキストベースでやり取りをするものと、dnsのようにバイナリベースでやり取りするものがあり、前者はtelnetを使うなどして自分で通信を行えるが、後者の場合はdigなどの専用のツールを使わなければいけないということでした。

## ２、ポートには２５番と５８７番がある
smtpサーバーは一般的に、迷惑メールの踏み台になるのを防ぐために知らない相手からのメールは転送しないようになっているそうです。それを実現するために、２５番ポートを信頼できるメールサーバーからの転送に使用し、５８７番ポートを自分のサーバーにメールボックスを持つユーザーからの送信依頼の転送に使用しているそうです。この理由から５８７番はsubmission(送信) portとよばれ、利用するには事前にアカウントの認証（ログイン）が必要になります。

なんかみすぼらしいのであとで更新できたらいいと思います。
Git Hub とGitをかじってみた。

#Gitの自分用memoです
新米エンジニアです。
開発経験積みたいぞ！と思って、ボランティアで開発参加することになり「共同作業ならGitだよ！もちろん使ったことあるよね！！」という雰囲気だったので作業前にかじってみました。

#GitとGit HubとGit Bashと…
職場でもよく「Git、Git」言ってるのは聞こえてきました。聞こえるだけで見ることも触ることも許されませんが。Gitってなんかソースコードを管理しているクラウドサービスのことなのかな？と、思っていましたが実際に触ってみるとGitつってもいろいろありましたのでまとめます。
###Git
Gitは、バージョン管理のためのCUIツールです。
gitと接頭辞につけたコマンドを打つと、ファイルのバージョン管理に対する設定や指示がいろいろできるよーというもの。
ファイルのバージョン管理というのは、会社のPCで作業していてフォルダを右クリックすると「〇月×日何時に保存したファイル」とか履歴が残っていて復元できたりしませんか。あんな感じよ（適当）。
履歴にmemoも挟めて、誰が作業したのかもわかって、A案とB案があったけどB案が採用されたんだ！ってことまでわかるような、細かいファイルの履歴（バージョン）管理を作れるツールです。
###Git bash
GitはCUIツールですので、PCが強そうな人が必ず出してるあの黒い画面で操作します。
Bashというのは、黒い画面で使われるコンピュータに指示を与えるためのツールのひとつで、Windows,Macに標準装備されています。Git BashはBashにGitコマンドを追加したもので、「Git for Windows(or Mac)」をDLすると「Git Bash」というソフトが起動し使用可能となります。
###Git Hub
Git自体はバージョン管理ツールなので、自分のPCでひとり作業する際にも使用できます。ただ、別のPCを操作する別の人と共同で作業する際に、バージョン管理情報とファイルを一緒にインターネット上に置いておく必要がありますね。
そのプラットフォームがGit Hubです。
バージョン管理情報と作業オブジェクトをまとめて「リポジトリ」と呼びます。
自分のPCで作業しているオブジェクトを「ローカルリポジトリ」、ローカルからGit Hubに上げたオブジェクトを「リモートリポジトリ」と表現します。
ローカルからリモートへリポジトリを上げることを「プッシュ」と呼びます。

#Gitを使ってみよう
著者はWindowsしか持ってないのでWindowsで…
Git bash
https://gitforwindows.org/
こちらはDLしてインストールしたら使えるようになります。デフォルト設定でとりあえずインストール！

Git hub
https://github.co.jp/
こちらに自分のアカウントを登録します。んで、まずは何でもいいのでリポジトリを作ってみましょう！

###ローカルとリモートを繋げる
リポジトリを登録しましたら、URLが出てきますのでコピーします。
Git bashを起動して…適当にディレクトリを作ったら、まずはそのディレクトリにgitするよーと指示します。
$git init
ユーザーを設定しておきます。
$git config user.name
$git config user.email

作成したファイルをバージョン管理するように指示します。
$git add .
$git commit

自分のPCで作成したファイルをリモートリポジトリ（Git hub）にプッシュしてみましょう。
$ git remote add origin https://github.com/ユーザーID/リポジトリ名
$ git push origin master

Git Hubのリポジトリに変更が反映されていれば、成功です！

#Gitの勉強
こちらのサイトを一通り読みました。
https://github.com/Shinpeim/introduction-to-git
古い記事なので、ところどころ現在のGitと違うようで、共同作業の部分がうまく出来ませんでしたが、まあ、あとは慣れだろう！！！

###使用したコマンド（一部）
git status
git add ファイル名
git commit
git commit --amend
※直前のcommitを改変
git log
git log --graph --pretty=format:'%s %d'
※%s：commitメッセージ　%d：ブランチ
git branch

git branch ブランチ名
git branch -d ブランチ名
git checkout ブランチ名
git checkout -b ブランチ名

git reset --hard コミットID
※戻りたい
git merge マージするブランチ名
※マージ元のブランチに移動してから使う
git merge --no-ff ブランチ名
git clone --bare 複製元 複製される先
toio SDK for Unity で、iPhoneなどでtoio実機に接続するまでのざっくりとした流れ(無課金でok)

# この記事でできること
- toio SDK for Unity で、unityプロジェクトのあとにtoioへ接続して実機確認ができる状態になる。

# 非常に参考となる情報
## モリカトロン
- [toio SDK for Unityの準備](https://github.com/morikatron/toio-sdk-for-unity/blob/develop/docs/download_sdk.md)
- [unityをiOSビルドしてtoioへ接続する方法](https://github.com/morikatron/toio-sdk-for-unity/blob/develop/docs/build_ios.md)

# やり方
## unity編
1. iOSのプラットフォームでビルドする。

## xCode編

1. プロジェクトを開く
    - ビルド後のフォルダ内にある拡張子「.xcodeproj」を選択。

2. 端末選択する
    - エディタの上部にあります。

3. その他の設定事項
    - 要は、自分のAppleIDと紐付けてあげれば良い。
    - 「Xcode」-「Xcode Preferences...」を選択する。下図のウィンドウが表示されます。

自分のAppleIDと紐付ける
![a01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/beaa0c02-52e3-7674-8313-e2e06593d407.png)

テスト実施したい端末を選択
![a02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/97c2dfa8-6f07-9f33-08ae-7216c3cc7dc0.png)

自分のAppleIDと(略
![a03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/fe858c17-f4b2-bd79-007c-825b77bd8b24.png)

いったん問題なし
![a04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/d5da23a3-8a90-af24-ebd5-a371a2181d5a.png)

## iPhone編

- アプリの使用許可

当然のことながら信頼されていないので、設定をしていく。
![a05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/37eb6451-6ee8-ec4e-a5c4-8b58549e0230.png)

「設定」→「一般」→「プロファイルとデバイス管理」→「デベロッパAPP」→「"Apple Development: xxx＠xxx.xxx"を信頼」→「信頼」

![a06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1db4ed2d-a60a-778e-1a6c-0e22678332c0.png)

信頼

![a07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/06ba3614-d316-642f-320c-acabb3964434.png)

- Bluetoothの接続を許可する
![a08.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/6878d5e4-68fd-34c7-1dd4-57cbf6e894f9.png)

これでアプリ起動と同時に、toio実機も動き出します。
[UNIX] 複数ファイルの移動


ディレクトリ中の複数のファイルを一気に移動させたい場面に遭遇したのでまとめてみました。


1. ある規則に沿ってまとめる
2. 数で区切ってまとめる

の方法があります。(私は2の方がやりたかった、、)

###1. ある規則（ファイルのフォーマットなど）に沿って分ける

ワイルドカードを使用します。
例えばcsvファイルだけ別のディレクトリに移したい場合、以下のようにできます。

```main.sh
mkdir /path/to/subdir/
mv /path/to/supdir/*.csv  /path/to/subdir/
```
これ以外でも頭文字などで絞ってまとめることもできます。



###2. 数で区切って分ける
単純にディレクトリ内のファイル数を減らしたい時は、for文と
```ls -1```を使います(エルでなく、いち。ファイル名だけ一行ずつ表示してくれる)。

```main.sh
for file in `ls -1 | head -n 120` 
do 
mv $file /path/to/subdir/. 
done
```
これで120個まとめて動かすことができました。
ls のなかでワイルドカードを使えばファイルフォーマットなどを指定することができます(例えば中にあるディレクトリは動かしたくない場合など)。ただlsで表示されるパス名が思い通りにならないことがあるので、各ファイルがあるディレクトリで操作してください。(上手い方法があれば教えてください)
【chrome】id名で要素を取得できる！実際のWEBページで関数のテストを簡単にする方法

chrome開発ツールのコンソールで**id名を指定するとそのhtml要素を取得することができる**。

ちょっとしたテストなどをする場合に便利な小技。



##実例
例えば、yahooニュースのヘッドラインは id名 に`"tabpanelTopics1"`が割り当てられている。この**id名をconsoleで叩くとその要素を取得できる**。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/c4d78656-21f1-efd4-2bff-453003c42b56.png)


↓ consoleで出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/98997cd4-5339-b7ca-7bd1-c133c4236477.png)
id名で要素を取得することができた。（注：class名では使用できない）



<br>
##自分でid名を割り振る
id名が指定されていない場合、自分でid名を設定すれば同じようにid名で要素を取得することができる。


###実例
[bitflyerのbitcoinチャート](https://bitflyer.com/ja-jp/bitcoin-chart)のtableタグにid名を割り振ってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/01c0e134-5d7e-11f3-ecf6-9d5234e3d369.png)

↓ id名を自分で追加 （`id="xx"`）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f290ca80-a5c6-d72b-b273-5a133f710b87.png)

↓ consoleで出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/afd67e36-12ea-7cf5-df02-489f708a4409.png)

設定したid名で要素を取得することができた。



<br>
##応用編（関数を定義して実行）
このid名を割り振る方法を使うと、後から関数を読み込み、指定したid名の要素に対して処理を実行することができる。

###実例
tableを２次元配列で表す関数scanTableを読み込み、id名を指定したtableの状態を２次元配列で表現してみる。

1. 関数scanTableの読み込み
2. 二次元で表示したいtableタグにid名をつける
3. 関数を実行する

<br>
####1. 関数scanTableの読み込み

```js:scanTable
function scanTable(table)
{
    var m = [];
    for(var y=0; y<table.rows.length; y++)
    {
        var row = table.rows[y];

        for(var x=0;x<row.cells.length;x++)
        {
            var cell = row.cells[x], xx = x, tx, ty;

            for(; m[y] && m[y][xx]; ++xx);                        // skip already occupied cells in current row

            for(tx = xx; tx < xx + cell.colSpan; ++tx)            // mark matrix elements occupied by current cell with true
            {
                for(ty = y; ty < y + cell.rowSpan; ++ty)
                {
                    if( !m[ty] ) m[ty] = [];                    // fill missing rows
                    m[ty][tx] = 1;
                }
            }
        }
    }

    return m
};
```

consoleにペーストしてEnterを押すと読み込み完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/2d8a7e2b-554c-dd0f-9c84-c5ba840aa8f6.png)



<br>
####2. 二次元で表示したいtableタグにid名をつける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/f290ca80-a5c6-d72b-b273-5a133f710b87.png)



<br>
####3. 関数を実行する
読み込んだ`scanTable()`の引数にid名`xx`を指定すると、処理を実行することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/8d3ede68-6a9e-da6d-1c47-744b7fb5bff1.png)

id名を割り振ったtableは7行4列の表であることがわかる。



<br>
このid名でhtml要素を取得する機能を使うと、実際のWEBページで関数のテストを簡単にすることができる。
Cygwin環境のRubyからExcelファイルを読み書きする(rubyXLの環境構築)

# はじめに

RubyからExcelファイルを読み書きするにはrubyXLがよさげです。

https://github.com/weshatheleopard/rubyXL

このgemをインストールするには

```
gem install rubyXL
```
でいけると書いてあるが、実際にはrubyXLはnokogiriというgemに依存している。
更にnokogiriはlibxml2等様々なライブラリに依存しており、
インストールするには gcc や make なども必要になりやや複雑です。

今回はCygwin環境で rubyXL をインストールする方法をご紹介いたします。

# Cygwinのパッケージを入れる。
setup-x86_64.exeで以下のパッケージを入れておきます。

+ ruby
+ ruby-devel
+ libxml2-devel
+ libiconv-devel
+ libxslt
+ libxslt-devel
+ gcc-core
+ make

# インストール

```
gem install nokogiri -r -- --use-system-libraries
gem install rubyXL -r
```

これで cygwinで rubyXL が使えるようになります。
Laravelバリデーション integerとnumericの動作の違い

- Laravel6.x
- PHP7.4

紛らわしいので調べました。

## integer の挙動
入力値が**整数**で構成された文字列か数値であることをバリデートします。

- [参考 filter_var](https://www.php.net/manual/ja/function.filter-var.php)
- [参考 FILTER_VALIDATE_INT](https://www.php.net/manual/ja/function.filter-var.php)

※実際の判定文はこちら

```php
// vendor\laravel\framework\src\Illuminate\Validation\Concerns\ValidatesAttributes.php
public function validateInteger($attribute, $value)
{
    return filter_var($value, FILTER_VALIDATE_INT) !== false;
}
```

## numericの挙動
入力値が**数字または数値形式の文字列**であることをバリデートします。

- [参考 is-numeric](https://www.php.net/manual/ja/function.is-numeric.php)
 
※実際の判定文はこちら

```php
// vendor\laravel\framework\src\Illuminate\Validation\Concerns\ValidatesAttributes.php
public function validateNumeric($attribute, $value)
{
    return is_numeric($value);
}
```

## 比較

- ○：バリデーションチェックを通過する
- ×：バリデーションチェックに引っかかりエラーになる

|検証値|`integer`|`numeric`|`regex:/^[0-9]+$/i`|
|---|---|---|---|
|`'0'`|○|○|○|
|`'123'`|○|○|○|
|`'0123'`| **× 注意!** |○|○|
|`'+1'`|**○ 注意!**|○|×|
|`'-1'`|**○ 注意!**|○|×|
|`'0.1'`|×|○|×|
|`'1.1'`|×|○|×|
|`'113-0012'`|×|×|×|
|`'090-111-222'`|×|×|×|
|`'１２３'`|×|×|×|


## おまけ 動作確認用

```php
<?php
$list = ['0', '123', '0123', '+1', '-1', '0.1', '1.1', '114-0012', '090-2222-3333', '１２３'];
foreach ($list as $value) {
    echo "$value ";
    if (filter_var($value, FILTER_VALIDATE_INT) !== false) {
        echo " |integer: ○";
    } else {
        echo " |integer: ×";
    }    
    
    if (is_numeric($value)) {
        echo " |numeric: ○";
    } else {
        echo " |numeric: ×";
    }
    
    if (preg_match("/^[0-9]+$/i", $value)) {
        echo " |regex: ○";
    } else {
        echo " |regex: ×";
    }

    echo "\n";
}
?>
```
PHP/Laravel用語集

## はじめに

PHP/Laravelに関する基本的な用語を簡単にまとめました。
特に初学者の場合、用語の意味や意図が分かっていないまま学習をしていると「今何をしてるんだ？」となりがちなので、迷子にならない為にも用語の意味を知っておくことが重要だと思い記事にしました。

私自身、勉強中の身ですので間違っている箇所などありましたら、ご指摘いただけると幸いです。
随時更新予定です。
<br>

***

#### MVCフレームワーク
Model(モデル)、View（ビュー）、Controller(コントローラー)の各機能に分けて整理し、これらのパーツを作ることで開発を行う。
<br>

#### Routing(ルーティング)
アクセスを設定している情報(ルート)を管理する機能。
特定のアドレスにアクセスした時、どの処理を呼び出して実行するかを管理するもの。
「〇〇というアドレスにアクセスしたら、××という処理を呼び出す」という関連付けを行なっている。
<br>

#### Model(モデル)
データ処理全般を担当。データベースアクセスに関する処理全般を扱う。
<br>

#### View(ビュー)
画面表示を担当。
Controllerの指示によって アクセスしてきたユーザーのブラウザに表示するデータを生成する。(HTMLファイルを出力するところのようなイメージ)
<br>

#### Controller(コントローラー)
全体の制御を担当。
必要に応じてModelからデータを取得したり、Viewを利用して画面表示を作成したりする。
<br>

#### Blade
シンプルにHTMLファイルを書くように書くことのできるテンプレートエンジン。
通常のPHPスクリプトファイルを記述するより効率的に作ることができる。
テンプレートを継承し新たなテンプレートを定義したり、レイアウトの一部をセクションとしてはめ込むことができる。
<br>

#### パス（path:通り道）
ファイルやフォルダの場所。
(ファイル名を含む場合と含まない場合がある。)
<br>

#### Migration(マイグレーション) 
データベースのバージョン管理機能。
データベースのテーブルを作成・削除等する機能も持つ。
<br>

#### Validation(バリデーション)  
Modelでデータを保存する前に、フォームからデータを送信されてきた値が正しい形式で書かれているかどうか、データの不備をあらかじめ防ぐために検証する仕組み
<br>

#### Auth
facade (ファサード)という機能で、ユーザーを認証しログインを管理する機能を自動生成してくれる機能。
<br>

#### composer
Laravelを構成するたくさんの公開ライブラリを矛盾がない状態で管理するツール。
ライブラリ同士は相互に複雑な依存関係がるが、これらの依存関係の管理を一手に引き受けてくれるのがcomposer。
<br>

#### Webpack
CSSやJavaScriptなど複数に分割されているファイルを1つにまとめることができる。
ソースコードを圧縮し、接続速度が早くなる。
<br>

#### Laravel Mix
WebpackやsassをLaravel用に使いやすくオーバーラップしているツール。
Webpackやsassはそれぞれ環境構築などを行うのに時間がかかるがLaravel Mixを使えば設定ファイルに数行記述するだけで、自動的に圧縮等の処理ができる。
<br>

#### GET

指定したURLの内容を取り出すための要求で、最も基本的なHTTPメソッド。
ブラウザからURLを入力してｗebページを開くときには、GETメソッドのHTTPリクエストを送っている。
<br>

#### POST

URLに対して情報を要求するだけでなく、クライアントからさまざまなデータを送信することができる。
主にデータを更新するような処理に使われています。
<br>

#### テーブル
分類されたデータベースの種類ごとの単位。
データベースは複数のテーブルを保持し、テーブルごとにデータを管理している。
<br>

#### カラム
データベースの列に相当するもの。「属性」を意味する。
<br>

#### レコード
データそのものを意味する。
<br>

#### インスタンス
データベースとユーザーの間を仲介する役割がある。
インスタンスを介してデータベースを操作することで、データの安全性やパフォーマンスの向上につながる。インスタンスは『データベースにアクセスするための過程』であり、データベースは『データを格納したファイル』という関係性。
<br>

#### スキーマ
データベースの設計図
必要なデータの洗い出しや、そのデータの格納整理のルールを決める。(全体を理解するために割り当てられた『構造』)
データベースでは、そのような作業を『スキーマを定義する』と呼ぶ。
<br>

#### Eloquent ORM
ORMとは、レコードをオブジェクトとして扱えるようにするための仕組み。
Laravelには「Eloquent」というORMが内臓されている。
このEloquentを使って、モデルとデータベースとのやり取りを行うようにしています。
<br>

#### リレーション
テーブルの関連付け。
「Aさんが投稿した記事」というように、ユーザーと記事のテーブルを関連付けることを言う。
<br>

#### デプロイ
公開用のサーバーを用意し、そのサーバーに作成したアプリケーションのインストールを行い本稼働させること。
M1チップ MacのUA

M1チップ搭載のMacのUAがネット上に無いって友人から言われたので貼っておきます〜。
※2020年11月27日の情報です。

## Chrome
```
Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
```

## Safari

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15
```

## Firefox

```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:83.0) Gecko/20100101 Firefox/83.0
```

どなたかの参考になればｗ
Java 繰り返しの処理

#はじめに
学習用のメモになります。

#while文
```
// whileによるループ処理

public class Main {
    public static void main(String[] args) {
        // カウンタ変数の初期化
        while (条件式) {
            // 繰り返し処理
            // カウンタ変数の更新
        }
    }
}
```
* 括弧の中に入るのは条件式のみ

####iが５以下の場合の繰り返す処理

```
// whileによるループ処理

public class Main {
    public static void main(String[] args) {
        int i = 0;    // カウンタ変数の初期化
        while (i <= 5) {    // 0　-> 1 -> 2 -> 3 ・・・ 5 -> 6
            System.out.println("hello world " + i);    // 繰り返し処理
            i = i + 1;    // カウンタ変数の更新
        }
        System.out.println("last " + i);
    }
}
```
出力結果

```
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
```

#for文

```
// forによるループ処理

public class Main {
    public static void main(String[] args) {
        for(カウンタ変数の初期化; 条件式; カウンタ変数の更新) {
             // 繰り返し処理
        }
    }
}
```

* 括弧の中には初期化式、条件式、変化式
* i のスコープは for 文の中だけ
* i をスコープ外にまたがって使用する場合、
* スコープの外で宣言しておく必要がある
* 実は処理が一行だけなら中括弧はなくても動く
* 変化式が実行されるのは処理が行われたあと
* list 等の中身を全て参照する場合などには for-each 文が使える

#####＊スコープとは
プログラム中で定義された変数や定数、関数などを参照・利用できる有効範囲を表します

####iが４以下だったら処理を繰り返す処理

```
// forによるループ処理

public class Main {
    public static void main(String[] args) {
        for(int i=0; i<=4; i++) {
             System.out.println(i);
        }
    }
}

```

##配列の繰り返し処理
```
// ループで配列を操作する

public class Main {
    public static void main(String[] args) {
        String[] team = {"勇者", "戦士", "魔法使い"};
        System.out.println(team.length);
        
        for(int i=0;i<team.length; i++){
            System.out.println(team[i]);
        }
    }
}
```

出力結果

```
3
勇者
戦士
魔法使い
```

###拡張for文の繰り返し処理
```
String[] team = {"勇者", "戦士", "魔法使い", "忍者"};
for (String member : team) {
    System.out.println(member);
}
```
出力結果

```
勇者
戦士
魔法使い
```



#for文とwhile文の使い分け

* 単純な前処理、単純な後処理が必要な反復処理においては for 文
   * 例えば: 繰り返す回数が分かっている処理など
* 複雑な前処理や後処理が必要な反復処理が必要な場合は while 文を使う
grub rescue の画面が出てWindowsが起動しない場合の修復方法

今回起きた事象を備忘録的に記録
WindowsとUbuntuをデュアルブートしてたPCから、Ubuntuを削除しようとした。

#起こった現象
・Windows側の"コンピュータの管理"から、Ubuntuのパーティションを削除
・削除したものの、何故か"未割り当て"ではなく"空き領域"の表示になる
![not-enough-space-available-on-the-disk-to-complete-this-operation-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/82d1c2ec-8a90-06a5-89d4-67e09feec9bb.jpeg)

・このままでは拡張できないので、削除しようとするも、"十分なディスク領域がないので、この操作を完了できません"とエラーを吐かれ、削除できない。
・よく考えずに、プロンプトからdiskpartで見て、論理パーティションとなっているものを削除する。
　(おそらくここにブートローダが入っていた)
![diskpart-delete-partitions.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/e2defb93-ac38-0d47-8bd0-6f74580b3ea6.jpeg)

・Ubuntuのパーティションを削除できるようになり、Windowsを拡張したが、再起動後にgrub rescueと表示されたシェルが立ち上がり、Windowsを起動できない。
![gr_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/a67aa45f-9b64-b3a5-61fd-646e4ab59f7b.png)

#対処方
おそらくMBR(Master Boot Record)というやつを削除したためだと思われる。
これを再び入れるために、まずはWindowsのインストールメディアを作成する。
自分の場合は、別PCで16GBのUSBメモリで作成した。
↓
https://www.microsoft.com/ja-jp/software-download/windows10
＊"ツールを今すぐダウンロード"から取得できる、MediaCreationTool****.exeを起動すれば、あとは表示に従っていけばできると思う。

できたらそのUSBを該当のパソコンにさして、BIOSからbootの優先順位をUSBに上げ、USBからWindowsのインストーラを起動する。

キーボードや言語を選んで進むと、インストールのウィンドウの下の方に、小さく修復のメニューがあるのでそこをクリック。
以下のような画面が起動する。

![2018-11-08_08h49_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/7738acd1-e4e0-ef45-73aa-3aabc30c5ba7.png)

ここでスタートアップ修復をやっても直らなかったので、コマンドプロンプトを起動して、以下のコマンドを一つずつ実行。

```
X:Sources>bootrec/fixmbr
X:Sources>bootrec/fixboot
X:Sources>bootrec/rebuildbcd
```

コマンド経由でMBRを修復しているわけだが、PCがBIOSかUEFIかによってコマンドが異なるため、とりあえず両方実行しとけ。という感じ。
上の二つのコマンドのうち、どちらか一方は完了しないと思う。

ここまで来たら、USBを抜いて、PC再起動でWindowsが起動した。

#参考
https://www.reneelab.jp/mbr-repair.html