OmniAICreator/Qiita-1.07M huggingface dataset:
よく使うgitコマンド

# 本記事の目的
本記事ではgitについて学んだこと、よく使うコマンドなどを紹介します。
対象者： gitを触り始めた方

# gitとは
分散型バージョン（変更履歴）を管理システム
GitHub、Sourecetree、AWS codecommitなどgitのサービスはいくつかあり、チーム事情や会社によってことなります。

### まず理解しておくと良いもの
git-flow、GitHub Flowを理解しておくとイメージがつきやすいです。
参考ページはこちら[【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう](https://www.atmarkit.co.jp/ait/articles/1708/01/news015.html)

### イメージ
先輩エンジニアに聞いてみるとだいたい川に例えて説明してもらうことが多い印象です。
本流:（masterブランチやmainブランチといわれるもの）
支流:作業用ブランチ（Topic branch） 

本流は流れを止まってはいけない（止まってもいけない）もので、必ず動いている状態を維持しておくことが大事。本流で作業をすることはチーム開発など現場ではやらないです。支流に対していろんな機能を作成して完璧に動くことを確認して、本流へ合流させることを前提とします。

### なぜ本流で作業をしないほうがいいのか
本流（master）を汚染してはならない。汚染度合いは、自動テストが十分に存在しているのであれば、自動テストが全て通るかどうかで判断できる。支流は一時的に汚染される（通らない自動テストが存在する）ことがありうるが、本流に合流させるときには浄化処理を済ませて置く（全てのテストが通る状態に修正する）必要がある
元からあったテストが通れば良いというだけでなく、基本的には、追加/修正したコードに対する十分なテストを常に追加すべきである。

### よくみるチーム開発の設計
実際のプロジェクトやチーム開発では本流は限られたひと(リーダー職)が管理し、メンバーは作業ブランチで作業し、本流への合流は確認作業（Pull requestと呼ばれます）を行ってから実施します


# よく使うgitコマンドの紹介
### そのまえに
ヘルプコマンドの利用する癖をつけるといいです。

```
git help <サブコマンド> 
```
最終的には、helpの内容を読んだだけで使い方が理解できるようになるのが望ましいです
 （調べた情報や書籍の情報は古くなってたりするため)

```
ローカルリポジトリの作成
git init //初期化
git add . //現在あるファイル全部追加
git commit -m "initial commit" //最初のコミットメッセージ
```

```
リモートリポジトリからプロジェクトをコピー
git clone [リモートリポジトリパス] 例）git@github.com:hogehoge/GitHub.git
```

```
ファイル更新までの基本手順
git add [変更/追加したファイル名]
もしくは
git add .（全部あげてもいい）

git commit -m "コメント"
git push origin 【branch名】 
```

```
ブランチの作成/移動/削除/変更/一覧
git branch [branch_name] //ブランチの作成
git checkout -b 【branch名】//新しいブランチを作成して移動する
git branch -d [branch_name] //ブランチの削除
git branch -m [branch_name] //現在のブランチ名の変更
git branch // ローカルブランチの一覧
git branch -a //リモートとローカルのブランチの一覧
git branch -r //リモートブランチの一覧
```

```
リモートブランチの確認（urlも表示）
git remote -v
```

```
今やってる作業を一時退避する
git stash
git stash pop //戻す場合
git stash list //退避の一覧
git stash clear //退避の消去
```

```
ログ表示
git log //コミットのログが見れる
git log -p
git log --oneline
git reflog //いろいろ見れる
git reflog origin/branch_name //pushのログが見れる
```

```
差分チェック
git diff
git diff HEAD^ //最後のコミットからの差分を表示
git diff --name-only HEAD^ //差分ファイルを表示
git diff file1.txt file2.txt //特定ファイルの差分
```

参考資料
[【Git】基本コマンド](https://qiita.com/konweb/items/621722f67fdd8f86a017)

# まとめ
まだ自分も経験不足ですが、この記事も少しずつ更新していきます。
誰かのお役に立てたらうれしいです。
よく利用するDockerコマンド一覧

|Dockerコマンド|詳細| 
|:-----------|------------:|
|Docker ps|起動中のDockerコンテナ一覧を表示| 
|Docker ps -a|起動の有無に関わらずコンテナ一覧を表示|
|Docker images| Dockerイメージの一覧を表示|
|Docker pull|Docker hubからイメージを取得|
|Docker save|Dockerイメージをファイルに変換|
|Docker run|Dockerコンテナの起動|
|Docker search|Docker Hub のイメージを検索|
|Docker exec|Dockerコンテナ内でコマンド実行|
|Docker start|Dockerコンテナの起動|
|Docker stop|Dockerコンテナの停止|
|Docker commit|Dockerコンテナのイメージ化|
|Docker rm|Dockerコンテナの削除|
|Docker rmi|Dockerイメージの削除|
|Docker cp|Dockerコンテナとホスト間でファイルをコピー|
|Docker save|Dockerイメージをファイルに変換|
|Docker load|ファイルからDockerイメージを抽出|
AndroidStudio LinearLAyoutを使ったビューの並べ方

この記事では、私が勉強していて感動したLinearLAyoutについてまとめていこうと思います。

##レイアウトとは
レイアウトとは、GUIの配置を決めるための仕組みです。
このレイアウトを使うことによって、Androidアプリの画面を簡単に作成することができます。
Android開発においては.xmlで記述してGUIを配置していきます。

より詳しい内容はこちら

https://qiita.com/nipp/items/6e58100c7ffdb733fb49


##LinearLAyoutで部品を整理する
LinearLayoutは「並べる」ことをテーマとしたLayoutです。LinearLayout内に記述された要素（ViewやLayout)を「縦」or「横」方向に並べるLayoutです。
実際のレイアウトを見てみましょう。

並べる方向を決めるのは
android:orientation
そして"horizontal"(横方向),"vertical"(縦方向)で指定します。
なお、未設定の場合はhorizontalが適用されます。

*しかしこれだと、ビューを横並びか縦並びしかできない。*

![スクリーンショット 2021-06-09 17.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/797a9cab-05f1-c17e-218f-5bacb156da59.png)
[出典](https://codezine.jp/article/detail/9437)

####縦方向にも横方向にもビューを並べたい時は、``LinearLAyout``を入れ子にする。
![スクリーンショット 2021-06-09 18.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1098849/efc36aca-90e3-2598-a052-22b9dc46abab.png)
[出典](https://codezine.jp/article/detail/9437)

つまり、
親``LinearLAyout``の中にさらに``LinearLAyout``を入れ込むことで、最初の設定を"vertical"（縦方向）入れ子を"horizontal"にすることで、上の図のような設定をすることができる。

##サンプルコード

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#A1A9BA"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tvLabelInput"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="10dp"
        android:background="#ffffff"
        android:text="@string/tv_msg"
        android:textSize="25sp" />

    <EditText
        android:id="@+id/etInput"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="25dp"
        android:layout_marginTop="5dp"
        android:background="#ffffff"
        android:inputType="text"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#df7401"
        android:orientation="horizontal">

        <CheckBox
            android:id="@+id/cdDrink"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="25dp"
            android:background="#ffffff"
            android:text="@string/cd_drink"/>

        <CheckBox
            android:id="@+id/cdFood"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#ffffff"
            android:text="@string/cd_food"/>

    </LinearLayout>
```
UITextField に入力がある時だけボタンを押せるようにする

#はじめに
UITextField と UIButton を連動させて、テキストが入力されている時だけボタンを押せるようにする方法です。


#ソースコード

ソースコードを見るのが早いと思うので、ソースコードを抜粋

``` swift:ボタンとテキスト
    @IBOutlet weak var someText: UITextView!
    @IBOutlet weak var execButton: UIButton!
```


``` swift:Delegateの指定
    override func viewDidLoad() {
        super.viewDidLoad()
        someText.delegate = self
    }
```


``` swift:EditingChangedイベント
    @IBAction func someTextEditingChanged(_ sender: Any) {
        if someText.text?.count == 0 {
            execButton.isEnabled = false
        } else {
            execButton.isEnabled = true
        }
    }
```

Editing Changed イベントでテキストの文字数を判定しボタンの Enable を設定する。


#参考

UITextField関連で役立ちそうなリンクです。

[【バリデーション 】TextFieldが未入力の場合はボタンを押させない](https://hari-blog.com/textfield-validation)
[[初心者向け]UITextFieldDelegate](https://programfromscratch.com/初心者向けuitextfielddelegate/)
[UITextFieldのイベント種類](https://qiita.com/Resan0725Apple/items/7d4692fe1476a526b24e)
[UITextFieldを使用する時に必要なあれこれ](https://qiita.com/Todate/items/f6c9e27898e60f295ebf)
no accounts with app store connect access have been found for the team ってなに？

![sst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1627424/b1def265-11ba-81d1-cd0f-429210542816.png)





直らないんですけど・・・・・





PCの再起動で直る・・・・？

本当？？



本当だった！！！！
[Linux]各ディレクトリの役割

#はじめに
”新しいLinuxの教科書”で学んだことのアウトプットです。
いままで、何となくで触れてましたが、改めてまとめました。
参考までにどうぞ。

#各ディレクトリの役割

###/bin
一般ユーザおよび管理者ユーザの両方が使用するコマンドの実行ファイルの置き場所。Linuxシステムの動作に最低限必要な重要度の高いコマンドを格納している。

###/dev
デバイスファイルを格納している。デバイスファイルとは、ディスクやキーボードなどのハードウェアをファイルとして扱えるようにしたもの。

###/etc
設定ファイルの置き場所。Linixで動作するさまざまなアプリケーションの設定やLinuxの設定ファイル

###/home
ホームディレクトリでユーザごとに割り当てる。ユーザ名がそのままホームディレクトリになっている。（例：home/tanaka）

###/sbin
/binと似ている、実行ファイルの置き場所。ただし、これらは管理者向けのコマンドのみが置かれている。（例えば、shutdownコマンド）

###/tmp
一時的なファイルの置き場所。定期的に削除する設定になっているので、保存先として指定することは避ける。

###/usr
各種アプリケーションと、それに付随するファイルを置くためのディレクトリ。また、/usrではサブディレクトリとして/binや/sbin,/etcなどをもち、内部にルートディレクトリと似た構造を持つ。

###/var
変化するためのデータを置くディレクトリ。アプリケーションのログや電子メールなどがこのディレクトリに置かれる。

#おわりに

ん〜〜まだピンときてないですが、AWSでEC2の設定する際に出てきたのと合わせるとちょっとわかるかも！！
というわけで引き続き、勉強していきます！！！
「【Ruby】多角形の内角の和を求めるメソッド」を参考にWolframAlphaでやってみた。

(オリジナルポスト)

https://qiita.com/jungh0929/items/69706795f0abcb0c2f83


#WolframAlphaで

https://www.wolframalpha.com/input/?i=%E5%A4%9A%E8%A7%92%E5%BD%A2%E3%80%80%E5%86%85%E8%A7%92&lang=ja



####入力:
多角形　内角


####入力解釈:
正多角形 | 内角
####結果:

(180 (n - 2))/n° (度)
(n 頂点と仮定しています)
goでスレッド処理する。

# はじめに
Go言語でスレッド処理について
やったメモを記載します。

# 実践

## 単純なスレッド
以下のmain関数内のthread()の処理部分をスレッドさせます。

```go:main.go
package main

import (
	"fmt"
	"time"
)

func thread() {
	time.Sleep(time.Microsecond * 100)
	fmt.Println("test")
}

func main() {
	thread()
}
```

例えば以下のようにgoとつけることで、スレッドできますが、処理が終わる前にメイン処理が終わってしまうため
実行しても何にも表示されません。

```go:main.go
package main

import (
	"fmt"
	"time"
)

func thread() {
	time.Sleep(time.Microsecond * 100)
	fmt.Println("test")
}

func main() {
	go thread()
}
```

実際に、channelsの機能を使用して、スレッドの処理がおわるまで処理させる場合は以下のように変更します。

```go:main.go
package main

import (
	"fmt"
	"time"
)

func thread() {
	time.Sleep(time.Microsecond * 100)
	fmt.Println("test")
}

func main() {
	ch1 := make(chan bool)
	go func() {
		thread()
		ch1 <- true
	}()
	<-ch1
}
```

##複雑な処理

以下のように、0~100までの数をnとしたときに、0～nまでの数を和を求めるものとします。

```go:main.go
package main

import "fmt"

func thread(num int) int {
	output := 0
	for i := 0; i < num; i++ {
		output += i
	}
	time.Sleep(time.Microsecond * 10)
	return output
}

func main() {
	output := []int{}
	for i := 0; i < 100; i++ {
		tmp := thread(i)
		output = append(output, tmp)
	}
	fmt.Println(output)
}
```

もし、同じ結果を得るような内容のスレッド化する場合は、以下の通りになります。

```go:main.go
package main

import (
	"fmt"
	"time"
)

func thread(num int) int {
	output := 0
	for i := 0; i < num; i++ {
		output += i
	}
	time.Sleep(time.Microsecond * 10)
	return output
}

func main() {
	output := make([]int, 100) //スレッドの処理結果格納場所を確保
	ch := make(chan bool, 100) //同時に処理できる数
	for i := 0; i < 100; i++ {
		ch <- true
		go func(num int) {
			tmp := thread(num)
			output[num] = tmp
			<-ch
		}(i)
	}
	for {
		if len(ch) == 0 {
			break
		}
		time.Sleep(time.Microsecond)
	}
	fmt.Println(output)
}
```

現時点では、100スレッドまで同時に処理できるようにできますが、ハードウェアの処理できる数によっては
chの確保数を減らせば、同時に処理できる数を変更できます。
また、スレッド内の処理結果の値をメインで使用したい場合は、あらかじめ格納場所は指定してください
`append`などの関数を使用すると結果がおかしくなることが多いです。
VirtualBoxでCentOSの時刻を変更する(Mac)

#はじめに
CentOSからgitにコミットした際にCentOSの設定時刻と現在の時刻がずれていることに気がつく。
github上で正しい時刻に草が生えるようにCentOS上の時刻を直す。

原因はわからないがMac（ホスト）とCentOs(ゲスト)の時刻に7時間ほどの差異がある。

現状、Mac(ホスト)とCentOs(ゲスト)の時刻が同期される設定になっている。

#開発環境
・MacBook Pro 
プロセッサ2 GHz クアッドコアIntel Core i5
メモリ16GB
・Virtualbox+vagrant+CentOs7.9
#作業

まず何も設定していない状態でCentOS上（ゲスト）で時刻を変更しても、すぐに元に戻ってしまう。

```
$ sudo date -s"06/10 5:40 2021"
```
その数秒後には元の時刻に戻る。

```
$ date
2021年  6月 9日 水曜日 22:40:45 
```

一度、ホスト側に戻り下記のコマンドを入力する。
VirtualBox のゲスト OS の時刻をホスト OS と同期させない設定をおこなう。

```
$ VBoxManage setextradata "VM name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1
```
"VM name"→VM Virtualboxを開き、対象のVirtualboxの名前を確認する。

その後、ゲストOSを再起動し、ホスト側で再び下記のコマンドを入力。


```
$ sudo date -s"06/10 6:00 2021"
```
今度はホストOSの時刻と同期されず、設定した時刻を保っている。

```
$ date
2021年  6月 10日 木曜日 6:00:23 
```
#補足
VirtualBox のゲスト OS の時刻をホスト OS と同期させる場合は下記のコマンドを入力する。

```
$ VBoxManage setextradata "VM name" "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 0
```

ご覧いただきありがとうございました。

#参考にさせていただいた記事
https://digitalbox.jp/virtualbox-guest-sync-time-host/
Tips: Hexoで静的サイト構築

各種静的サイト構築を試す遊びに興じてしまいそれぞれをメモしている。
[3000文字Tips - 知ると便利なTipsをみんなへ届けよう](https://qiita.com/official-events/d523df99d6479293ffa7) にあやかりHexoで静的サイト構築までを書きます。

https://liginc.co.jp/web/programming/server/104594

## 公式

https://hexo.io/

node.js と git があればよい。

`npm install -g hexo-cli`
`npx hexo init <フォルダ名>` 例えば `npx hexo init blog`

で初期インストール。
`cd blog` する。

`npx hexo clean`
`npx hexo generate`
`npx hexo server`

で `localhost:4000` に起動する。
または `npx hexo server -p 5000` などすると 5000 に起動する。


`npm install hexo-deployer-git --save`
しておくと、

`npx hexo deploy -g`

でgitにお手軽デプロイできる。

### プラグイン一覧
https://github.com/hexojs/hexo/wiki/Plugins

### テーマ

https://hexo.io/themes/

例: https://github.com/klugjo/hexo-theme-alpha-dust

なら、上の `blog` フォルダ内で
`git clone https://github.com/klugjo/hexo-theme-alpha-dust themes/alpha-dust` してくる。


### テーマごとの設定
`.\themes\(テーマ名フォルダ)` 内の `_config.yml` に書くと反映される。

```yml
# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
## theme: landscape
theme: alpha-dust
```

### ページ作成

`npx hexo new "welcome"`
で、welcome ページができる。



## 参考

読み方はヘクソで良いのかな。日本語で綴るとちょっと残念なのが玉にキズ。GitHub Pages と組み合わせると blog作成は非常に簡単。

https://qiita.com/7321hasu/items/4ffe8636d69fea228827

https://qiita.com/nekozuki_dev/items/395dd3911790d43176b2

https://qiita.com/genie-oh/items/8c19668c7dae6b4a153e

以上です。
シリコン量子ビットコンピュータの仕組み

## :sparkle: この記事の目的

超電導方式、イオントラップ方式に並び、最も有力視されている量子コンピュータの実現方式である**シリコン量子ビット方式**について解説します。

## :sparkle: シリコンとは

私たちの生活になくてはならないパソコンやスマートフォン、マイコン(家電製品や自動車に組み込まれているマイクロコンピュータ)には、CPU(シーピーユー)と呼ばれる計算装置があり、様々な計算処理を一括して行っています。
このCPUの実態はIC(アイ・シー：集積回路)やLSI(エル・エス・アイ：大規模集積回路)で、半導体と呼ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4c07c923-aa56-2716-e03d-d08f85b33bdf.png)

半導体の基本的な原材料はシリコンの結晶です。
シリコンとは元素記号「Si」で表される非金属元素で、日本語で「ケイ素」のことです。
純度の高いシリコンの結晶にホウ素やガリウムまたはリンやヒ素などの不純物を少し混ぜた塊を作ります。そして0.5mm～2mm程度の薄さにスライスします。このスライスしたものをウェハーと呼びます。

## :sparkle: シリコン基板上に電子を閉じ込める

スライスしたシリコン基板上に、厚みが数十nm程度の半導体の薄膜を何層も重ね、さらに電極を取り付け、[図1]のような構造物を作ります。これにより、薄膜と薄膜の接触面となる2次元平面に電子を閉じ込めることができます。さらに、電極に電圧をかけ磁場を発生させることで電子を静止させます。

電子はスピンと呼ばれる上向きと下向きの2種類の物理量をもちますが、電極にかける電圧を変えることで磁場の強さを変化させ、電子のスピンを制御します。
この電子のスピンの向きを「0」と「1」に対応させることで量子ビットを実現します。
[図1]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/4c6590e7-4f6a-e2fd-3e18-1ad9256b24f1.png)
[引用] インターフェース 2019.3月号より

## :sparkle: シリコン量子ビットのデメリット

シリコン基板は、そのものを構成する原子が、閉じ込めた電子に影響を与えないように制止させておく必要があります。すなわち、基盤を極低温に冷凍する必要があります。そのため冷凍機が必要となり、全体的な構造も大きくなります。
また、閉じ込めた電子は周囲の磁場の変化や温度変化などのノイズの影響を受けやすく、安定的に状態を保持するための高度な技術開発も必要です。

## :sparkle: 量子もつれの生成技術にも期待

本記事の執筆日付は2021年6月9日ですが、2021年6月7日に理化学研究所から、3量子ビットの制御および量子もつれ状態の生成に成功したというニュースが発表されました。


シリコン3量子ビットを実現－シリコン量子コンピュータの複数量子ビット制御に指針－
https://www.riken.jp/press/2021/20210608_1/index.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399135/98c593d6-8202-4ca5-d7cb-0136cbc4f835.png)
[引用] 理化学研究所

量子コンピュータ開発技術として一歩遅れを取っている日本勢にとっても良いニュースで、今後の進展が期待されます。


## :sparkle: 関連情報

:paperclip: イオントラップ型量子コンピュータの仕組み - イオン化粒子と量子ビット
https://qiita.com/ttabata/items/c2f9c946ab2b106d11d9


## :sparkle: ご意見など

ご意見、間違い訂正などございましたらお寄せ下さい。
【kotlin】オプションメニュー オーバーフローメニュー

#■オーバーフローメニュー
![スクリーンショット 2021-06-10 1.22.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/7849ba07-6d26-bdc7-b568-7ba22dc4f0b1.png)
右上の縦3っつの丸です。
ここを押せばメニューが出てくる。

ちなみに紫の部分がアクションバーと言う。

###1 ■menuファイルを入れるフォルダを作る。


resフォルダ右クリック
[New] -> [Android Resource Directory]
専用画面出てくるので
Resource type: menu に変更。
OK

[menu]フォルダ完成

作ったばかりの[menu]フォルダ右クリック
[New] -> [Menu Resource File]
専用画面出てくるので
File name: 好きな名前
OK

###2 menu用のXMLファイルの中身を記述する。
menuタグで囲む
▼itemタグ
itemタグ一つにつき一つの選択肢ができる。

▼app:showAsAction
never : オーバーフローメニューの中に入れる。
always: アクションバーに表示する。
ifRoom: アクションバーに表示する。アクションバー横幅入り切らんかったらオーバーフローメニューに入る。

``` kotlin
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menuListOptionTeishoku"
        app:showAsAction="never"
        android:title="@string/menu_teishoku"/>
    <item
        android:id="@+id/menuListOptionCurry"
        app:showAsAction="never"
        android:title="@string/menu_curry"/>

</menu>
```

###3 オーバーフローを表示したいActivityにメソッドを実装する。
■onCreateOptionsMenu()
オプションメニューやオーバーフローメニューを表示させるのに必要
■menuInflater
アクティビティが持っているプロパティ
■inflate(インフレート)膨らませる。
menuInflaterのメソッド

作ったオプションメニューをユーザーに表示します。
trueでいいよ!

``` kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.作ったxmlFile名,menu)
        return true
    }
```

これで表示はされる。

###4 itemの選択肢によって処理を分岐する。
下記のメソッドをoverrideで実装する。

■onOptionsItemSelected(item: MenuItem) :Boolean
第一引数 item
選択肢一つ分

返り値
Bool値

▼item.itemID
選択肢のidのR値
これでwhen文で処理を分岐します。

``` kotlin
 override fun onOptionsItemSelected(item: MenuItem): Boolean {
       //return用にtrueが入った変数を用意
        var returnVal = true

        when(item.itemId) {
            R.id.itemにつけたid ->
                処理
            R.id.itemにつけたid ->
                処理
            //それ以外が選ばれたら親クラスのonOptionsItemSelectedを呼び出すその戻り値を入れる。
            else ->
                returnVal = super.onOptionsItemSelected(item)
        }

       　 処理等を書く
        //trueでreturnする。
        return returnVal
    }
```
ボタンをタッチして表示される簡単なアプリ

###▼レイアウト
プロジェクトを立ち上げたら、「activity_main.xml」を開き、右上にある「Split」でコードとアプリプレビューを出す
左にコード、右にアプリプレビューが出てるようにするとやりやすい

●テキストやボタンの配置
コードとアプリプレビューを分けている真ん中上に「Palette」があるのでそれを開く
![スクリーンショット 2021-06-10 2.33.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1187927/2fa96b54-aca1-e25c-dcdb-b1851486772e.png)
開くと画像のようになっているので、まず「TextView」を右にあるアプリプレビューにドラック&ドロップする
同様にTextViewの下にある「Button」も同じくドラック&ドロップ

![スクリーンショット 2021-06-10 2.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1187927/9455ac66-06fd-906d-0350-9f9ef82835c7.png)
こんな感じで並べる
（これはすでに配置やtextを変更してます）

操作したいtextviewやbuttonを選択し、右側に表示される「id」を変更、「text」には表示させたい名称を入れる
![スクリーンショット 2021-06-10 2.40.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1187927/348e9164-c446-d601-3cf4-8699d6ad698f.png)
※「id」を変更すると、左側にあるコードの↓の部分が変更したものになる。これで名前を決定する。

```kotlin
android:id="@+id/tv"
```
「Button」の部分も同様に変更することで、レイアウト部分は完成！

###▼コードを書く
次に、「MainActivity.kt」に移り、コードを書く
もともとの雛型の中に書いていく、書く部分は「onCreate」の{}の中
行う操作として
1.idを取得
2.クリック処理

```kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //idを取得

        //クリック処理

    }
```

●1.idを取得
idを取得するために変数を作成する
「findViewById」でidを探す
「(R.id.tv)」どこにあるのかを示す
この「tv」がレイアウトで決めた名前になる
また、kotlinの場合、最後の;は省略できる
同様にbutoonも作成する

```kotlin
//idを取得
        var tx:TextView = findViewById(R.id.tv)
        var btn1:Button = findViewById(R.id.btnDog)
        var btn2:Button = findViewById(R.id.btnCat)
        var btn3:Button = findViewById(R.id.btnClear)
```

●2.クリック処理
次はクリックした時の処理を書いていく
このアプリは、ボタンが押されたときに、テキストに押された文字が表示されるようになるため、以下のように書く

```kotlin
//クリック処理
        btn1.setOnClickListener {
            tx.text = "いぬ"
        }
```
id取得で作成した変数を使い、btn1が押されたとき、txがいぬと表示させる
押されたときに表示させるためにつかうのは「setOnClickListener」
同様に他２つも作る

以上でボタンをタッチして表示させるアプリの完成！
Android studioでプログラムを書く上で覚えておく最初のこと

▼MainActivity.ktにある雛型について

「onCreate」は最低でも覚えておく！
意味：起動されたと同時に読み込む

起動されたと同時に読み込むようにするため、↓の{}の中にプログラムを書いていく

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
}
```
Activemodel::modelをincludeした際のinitializeの挙動について

## 挨拶
こんにちは、プレイライフの熊崎です！
最近はあったかくなって、お出かけ日和ですね！
コロナでなければ、どこかお出かけにでも行きたい気分なのですが、こんなご時世なので粛々と学習のアウトプットをしていきたいと思います笑

## 背景

今回、実務でフォームオブジェクトを作ることになり、その際にinitializeメソッドを使いました。
自分でフォームオブジェクトを作るにあたって、既存のフォームオブジェクトのソースリーディングを行っていました。その際に既存のコードが以下のような感じだったが、どのような挙動をしているかわからなかったので、まとめました。

## コード例（一部コードを省略しております。）
```hogehoge.rb
Class hogehoge
  include ActiveModel::Model

  def initialize(name, attributes = {})
    @name = name
    super(attributes)
  end
end
```

## superとは
スーパークラス（親クラス）のメソッドを呼び出す。
引数がついている場合は、引数つきでそのメソッドを実行する。

## 今回の場合は、、、
Activemodel::Modelのinitializeメソッドを呼び出す。

## Activemodel::Modelのinitializeはどうなってるか？
以下、公式のgithubリポジトリから引用


https://github.com/rails/rails/blob/main/activemodel/lib/active_model/model.rb

```model.rb
def initialize(attributes = {})
  assign_attributes(attributes) if attributes

  super()
　 # ここのsuper()は正直理解できておりません、、、 どなたかご存知の方がいらっしゃれば、コメントなどを頂けますと幸いです。
  end
  # assign_attributesメソッドは、Activemodel::Modelがインクルードしている、ActiveModel::AttributeAssignmentに入っています。
```

ActiveModel::modelのintializeメソッドに、assign_attributesメソッドがあって、attributes内に入っている属性を変更してくれている。ということでした１

## assign_attributesメソッド
複数の属性を変更したいときに使用される
[https://qiita.com/tyamagu2/items/8abd93bb7ab0424cf084](https://qiita.com/tyamagu2/items/8abd93bb7ab0424cf084)

## 最後に
まだまだ未熟ゆえに、間違っていることを書いていることもあると思います。（なるべくそのようなことのないよう、気をつけてはおりますが、、、）
もし、間違い等ございましたらコメントにてご指摘いただけますと幸いです。
[Prometheus] PromQLを扱う前に知っておいたほうがよい超最低限の知識

## 目次
- [[目次] Prometheusで監視システムを作る with Docker](https://qiita.com/Esfahan/items/7dc780501f418a71ad9d)

## 概要
PrometheusでPromQLを書く前に、最低限理解しておいたほうがよい用語や知識など。

## 関連記事
[PrometheusとNode ExporterでCPUとメモリとディスクを監視する](https://qiita.com/Esfahan/items/01833c1592910fb11858)

## Instant vector
時系列データ。

## Range vector
現在から過去のある期間におけるInstant vectorの値が集まったデータ。
以下のように`[1m]`などで指定したデータ。`[5m]`とすれば5分前までのデータとなる。
その他以下の単位が指定可能。

- ms - milliseconds
- s - seconds
- m - minutes
- h - hours
- d - days - assuming a day has always 24h
- w - weeks - assuming a week has always 7d
- y - years - assuming a year has always 365d

参考：https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors

下記の例は、CPU使用時間の累計を、現在から1分前までさかのぼって取得するPromQL。

```prometheus:利用例
node_cpu_seconds_total[1m]
```

実際にPrometheusで実行してみる。
![Screen Shot 2021-06-09 at 21.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/3b4afcb7-bea0-17e1-9cec-973b2290dfaa.png)

4つの数値が表示されているが、15秒ごとにデータをとっているので、1分間だと4つとなる。
4つのデータはそれぞれ`CPU使用時間の累計@測定日時`という意味になる。

データを見てみる。

```
node_cpu_seconds_total{cpu="0", env="development", instance="example.com:9100", job="node", mode="idle"}

18039154.58 @1623240806.473 => 6.8642065491192(ヶ月)@2021/06/09 21:13:26
18039169.54 @1623240821.473 => 6.8642122416548(ヶ月)@22021/06/09 21:13:41
18039184.5 @1623240836.473  => 6.86421793419(ヶ月)@22021/06/09 21:13:56
18039199.45 @1623240851.473 => 6.8642236229208(ヶ月)@22021/06/09 21:14:11
```

**測定日時**
2021/06/09 21:15分頃にこのPromQLを実行したので、測定日時が合っていることを確認できる。

**CPU使用時間の累計**
PromQLの結果では約6.8ヶ月となっている。

このPrometheusが入っているCentOSサーバーを起動した日は以下のシェルスクリプトで調べると、2020/11/11となっている。

```console
$ date --date=@$(expr `date +%s` - `cut -d "." -f 1 /proc/uptime`)
Wed Nov 11 15:46:02 JST 2020
```

今日は2021/06/09なので、2020/11/11は約6.8ヶ月前ということで、CPU使用時間の累計も正しいことが確認できる。

## rate関数
rate関数は、ある期間の時系列データの1秒あたりの平均増加率を計算する。
参考：https://prometheus.io/docs/prometheus/latest/querying/functions/#rate

以下は、現在から1分前までのCPU使用時間の累計の、1秒あたりの平均増加率を算出するPromQL。

```prometheus:利用例
rate(node_cpu_seconds_total[1m])
```

![Screen Shot 2021-06-09 at 21.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/870654df-df4a-7cd6-13e5-3b63d4ac6b81.png)

先程のRange vectorの例では4つのデータが出力されたが、今回はその4つの平均増加率となるので、1つに集約される。

```
{cpu="0", env="development", instance="example.com:9100", job="node", mode="idle"}
0.997555555568801
```

ちなみに、rate関数の他にirate関数というものがあるが、irateは突発的なスパイクなどの観測のみに利用すべきで、アラートなどの用途にはrateを使うべきとのこと。
参考：https://prometheus.io/docs/prometheus/latest/querying/functions/#irate
CakePHPでIntervention Image(laravelでお馴染み)を導入して画像のリサイズをする方法

# 前書き

画像の加工を行う場合GDやImageMagickなど使う機会が多いですが、そんな二つを使いやすくしたライブラリ「Intervention Image」

色々と調べてみましたが、CakePHPで書かれたドキュメントは無く、Laravelで実装されたドキュメントしかありませんでした。
ドキュメントの中には**Laravelのライブラリと書いてある記事**なんてのもあったんですが普通にPHPのライブラリなので、確認しながらCakePHPで導入と実装が出来たので備忘録程度に記事にしております。

※CakePHP4系統で実装しましたが、CakePHP3でも同様の書き方で導入、実装できるはずです。

# 本文

## Intervention/image導入

まずは、composerで**Intervention/image**をCakePHPのアプリにダウンロード

```terminal
$ composer require intervention/image
```

以上。


導入は、Laravelと同じ。（PHPのライブラリなので）

## CakePHPでの実装

### 失敗

Laravelの記事を参考にして、書いて実行をするとエラーが出てきます。
（Laravelで実装したことないので詳しくはわかりませんが）

```php
//...その他名前空間は省略
use Intervention\Image\Facades\Image;

//テスト用に適当に作ったコマンド
class ImagResizeCommand extends Command{
    public function initialize(): void{
        parent::initialize();
    }
    public function execute(Arguments $args, ConsoleIo $io){

        Image::make('image_path');

        //...その他処理の省略
    }

}
```
エラー内容↓

```terminal
2021-06-10 01:01:31 Error: [Error] Class 'Illuminate\Support\Facades\Facade' not found in /Users/user_name/Desktop/app/vendor/intervention/image/src/Intervention/Image/Facades/Image.php on line 13
Stack Trace:
```

と、言われライブラリのコアな部分で読み込まれている**Facade**が見つからない。と言われるので呼び出すクラスを変えて実装します。

### 成功


```php
//...その他名前空間は省略
use Intervention\Image\ImageManager;

class ImagResizeCommand extends Command{

    public function initialize(): void{
        parent::initialize();
    }

    public function execute(Arguments $args, ConsoleIo $io){

        //リサイズを行う画像のパス
        $image_path = WWW_ROOT . DS .'img/' . 'cake-logo.png';

        //リサイズされた後に保存されるファイル名
        $resize_path = WWW_ROOT . DS .'img/' . 's_cake-logo.png';

        $height = 100;
        $width = 100;

        //driverはgdにしていますが、ここで「ImageMagick」を指定することも可能です。
        $manager = new ImageManager(['driver' => 'gd']);
        $original_image = $manager->make($image_path);
        $original_image->resize($width, $height);

        //リサイズ完了
        $original_image->save($resize_path);
    }
}
```

上記のように呼び出すクラスを**ImageManager**にして、実装をしてみるとCakePHPでも**Intervention/image**による画像のリサイズをすることができました。
久しぶりにapt updateしたらエラー（http://packages.ros.org/ros/ubuntu bionic InRelease: 以下の署名が無効です）


久しぶりにapt updateしたらエラー

```
$ sudo apt update -y
アップグレードできるパッケージが 25 個あります。表示するには 'apt list --upgradable' を実行してください。
W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://packages.ros.org/ros/ubuntu bionic InRelease: 以下の署名が無効です: EXPKEYSIG F42ED6FBAB17C654 Open Robotics <info@osrfoundation.org>
W: http://packages.ros.org/ros/ubuntu/dists/bionic/InRelease の取得に失敗しました  以下の署名が無効です: EXPKEYSIG F42ED6FBAB17C654 Open Robotics <info@osrfoundation.org>
W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。
```

おそらくROSの署名が古かったためか以下実行すると解決

```
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
```

# 参考
[http://wiki.ros.org/melodic/Installation/Ubuntu](http://wiki.ros.org/melodic/Installation/Ubuntu)
apt-get update時にエラー（The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ）

apt-get update時にエラー

```
Err:1 http://packages.osrfoundation.org/gazebo/ubuntu-stable bionic InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 67170598AF249743
```

以下で解決

```
wget  http://packages.osrfoundation.org/gazebo.key
sudo apt-key add gazebo.key
```

# 参考
[GPG error: http://packages.osrfoundation.org [duplicate]](https://askubuntu.com/questions/611221/gpg-error-http-packages-osrfoundation-org)
docker-compose で名前付きボリュームをホストのディレクトリにマウントする

自分用メモ。

バインドマウントとは似て非なるもの。
コンテナイメージのマウント先ディレクトリにファイルが存在している場合、下記のような挙動をする。

* バインドマウント
    * コンテナイメージのディレクトリは消失し、ホストのディレクトリがマウントされる
* 名前付きボリューム
    * (ホスト側にファイルがない場合)コンテナイメージのファイルがマウント先ディレクトリから名前付きボリュームにコピーされた上で、ホストのディレクトリがマウントされる

**docker-compose.yml**

```yaml
version: "3"

services:
  httpd:
    image: httpd
    ports:
      - "8180:80"
    volumes:
      - "httpd-conf:/usr/local/apache2/conf"

volumes:
  httpd-conf:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: ./conf/httpd/
```
Reactの基本的な用語をまとめてみた



Reactアプリを作ったが基礎的な用語でも理解できていないところがあったので、調べてみた。

# React関連

### コンポーネント

- UIを構成する部品
- 最小単位はHTMLタグ一つ分
- クラスコンポーネントと関数コンポーネントの２種類がある。
- React 16.7以降はhook機能の追加によって、シンプルに記述できる関数コンポーネントで記述するのが一般的
- Unityで例えるとGameObjectに近い ※同語のComponentではない

### state

- コンポーネントごとに持つ、コンポーネントの状態を管理する仕組み。
- 静的(static)変数の代わりに使う。※ちなみに他言語と違ってstaticは予約語ではない。
- スコープ（アクセス範囲）はプライベートと同様の扱いとなる。
- 読み込みは変数と同様の扱いできるが、書き込み時はsetState(),useState()等React特有の記述が必要。
- stateを更新すると、参照しているコンポーネントは自動で再読み込みされる。
- 子コンポーネントにpropsで渡すことはできるが、親コンポーネントにstateを渡すことはできない。

#### 状態管理ライブラリ別のstateのアクセス可能範囲（スコープ）
- Redux
	全コンポーネントからアクセス可能で、Store(stateの集まり)はプロジェクトに一つだけしか作成できない。<br>
グローバル変数の様に扱える。<br>
	便利だが、記述量が多いので実装が大変。
- Recoil
	指定したコンポーネントのみアクセス可能で、atom(stateの集まり)は複数個作成できる。<br>
	Reduxより実装は楽。
- どちらも使用しない場合
	自コンポーネント内または、親コンポーネントからprops(引数)としてstateを受け取るバケツリレー方式でコンポーネントを跨いでstateを渡す。<br>
	孫コンポーネントとか複数階層が出てくると対応できなくなる（対応すると煩雑なコードになる）場合がある。<br>
	小規模なアプリだったらこれでも良いかも。
	

### props

- 親コンポーネントから子コンポーネントへ値を渡す仕組み
- 要するにコンポーネント呼び出し時に渡す引数

### hook

- 2020年のReact 16.8から使えるようになった。
- 関数コンポーネント内でクラスコンポーネントでしか使用できなかった機能を使用できるようにする関数の種類。
- 上記stateの項目のuseState()もhookの一種
- 本機能の追加により、これまでクラスコンポーネントでしか扱えなかったライフサイクルの機能が関数コンポーネントでも扱えるようになった。

### ライフサイクル

- コンポーネント毎の各種タイミングによって実行される関数
- 種類
	tick()
		毎秒実行
	componentDidMount()
		DOM として描画されるタイミングで実行
	componentWillUnmount()
		DOMが削除されるタイミングで実行
		
- Unityで例えるとstart,update等の"スクリプトライフサイクル"に近い

### React Router

- ユーザーからの入力に応じて表示させるページを出し分ける機能
- ユーザーがリクエストしたURLとコンポーネントを紐づける（ルーティングする）ことができる。
- ページ間の移動時は、不足しているコンポーネントのみ更新する。（SPAの動作になる）
- ルーティングはサーバー側ではなく、クライアント側で行い、ルート先のコンポーネントをサーバーに要求する動作を行う。
　


# TypeScript関連（基本的に言語固有のもの）


### any型

- 動的型付け言語の変数型と同様に扱える型
- 戻り値等の型が読めない場合に使える。
- JavaScriptからの移植が面倒な時に…

### スプレッド演算子(...)

- オブジェクトのメンバーを展開して設定することができる。
- プロパティ名と値を全部書きたい時にめちゃくちゃ便利
- 多分ほかの言語にはない

### アロー関数

- 他言語のラムダ式、無名関数と同じ

### interface

- 多言語同様にインターフェース（実装）に使用する。
- 拡張する(可能性のあるもの含めて)型定義はTypeではなくInterfaceを使う。
- 加えてオブジェクトの構造を宣言するための多くの機能がある。
- 同名のinterfaceを記述すると"Declaration merging"(エラーにならずに統合)が発生するので注意。
【Php】PDOでdatabaseに接続する(2)

# 初めに
PDOについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

前回の記事：
https://qiita.com/redrabbit1104/items/2668e56d4c058221388e

# ユーザーの入力なしのデータを取得
まずはphpAdminで取得するデータを確認します。
![スクリーンショット 2021-06-10 0.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/67827c1a-9d70-be88-4928-8978e175c2dd.png)
sql文を書きます。accountsテーブルからuser_idが1のデータを取得するようにします。

```php
$sql = 'select * from accounts where user_id = 1';  //sql文
```
PDOクラスのメソッドであるquery()を使い、先ほどのsql文が入っている$sqlを引数として渡します。
公式ドキュメントに書いてあるとおり、query()メソッドの戻り値はPDOStatementクラスになります。

>PDO::query — SQL ステートメントを実行し、結果セットを PDOStatement オブジェクトとして返す

```php
public PDO::query ( string $query , int|null $fetchMode = null ) : PDOStatement|false
```
query()メソッドを実行した結果を変数$stmtに格納します。

```php
$stmt = $pdo -> query($sql);     //sql実行結果のステートメント
```
PDOStatementクラスに用意されているfetchall()メソッドを使い、ステートメントの中身を取得し変数$resultに格納します。

```php
$result = $stmt -> fetchall(); 
```
$resultは連想配列になっているので、var_dumpを使って中身を表示します。

```php
var_dump($result);
```
![スクリーンショット 2021-06-10 0.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/ddab6ef8-fa61-d985-984d-609460ea572c.png)

# 参考サイト
https://www.php.net/manual/ja/class.pdo.php
https://www.php.net/manual/ja/pdo.query.php
https://www.php.net/manual/ja/pdostatement.fetchall.php
Laravel routes→Controller→view

Laravel6における、routes→Controller→viewの基本的な流れをメモ。

###routes

```.php
Route::get('/', function () {
    return view('welcome');
});
```

```.php
Route::get('/home', 'HomeController@index')->name('home');
Route::get('[view名](ディレクトリ/ファイル)',[Controller名]'@[method名]')->name('[リンク名をつける](controller名.method名)など');
```

###Controller

```.php
public function index()
    {
       
        //クエリビルダ

        $hoges = DB::table('log_me_events')
                ->select('id', ...)//取得したいカラム
                ->orderBy('year', 'desc')//ソートをかけたり
                ->get();//最終データベースから取得する
        
        return view('[view名](ディレクトリ.ファイル)', compact(''));

    }
```

###view

```.php

@foreach($hoges as $hoge)
  <tr>
    <td>{{$hoge->id}}</td>
    <td>{{$hoge->...}}</td>
  </tr>                                    
@endforeach

```
【React】useStateを使ったら無限ループしたので、対処した。Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.

<h2>症状</h2>
useStateを使用したら、無限ループが発生してしまいました。
翻訳すると、「再レンダリングが多すぎます。 React は、無限ループを防ぐためにレンダリングの数を制限します。」です。

```terminal:error
Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
```

```react:Hoge.jsx
import React, {useState} from "react";

export const Hoge= () =>{
  const [count,setCount] = useState(0);

  const handleHoge= () =>  {
      setCount(count+1)
  }

  return(
    <div>
        <div>{count}回押された</div>
        <button onClick={handleHoge()}>HOGEButton</button>
    </div>
  )
}
```

<h2>解決策</h2>
Clickイベントをアローにしたら、無限ループ解決しました。
render内をアロー関数で書かないと、render時にuseStateが呼ばれてしまい、再びrenderされ、そこでもuseState→renderm→useState→render...というループに陥るみたいです。

```react:Hoge.jsx
import React, {useState} from "react";

export const Hoge= () =>{
  const [count,setCount] = useState(0);

  const handleHoge= () =>  {
      setCount(count+1)
  }

  return(
    <div>
        <div>{count}回押された</div>
        <button onClick={() => handleHoge()}>HOGEButton</button>
    </div>
  )
}
```

<h2>参考</h2>

https://qiita.com/katsuomi/items/5a062dc1e4d0ab64ae21
flannelで使用していたNetworkって何だっけ？

と思ったときに叩くコマンドです。

## その1: Podでコマンドを実行して確認する

flannelで使用するセグメントは、Podにある`/etc/kube-flannel/net-conf.json`に記載されています。

```bash
kubectl exec -it -n kube-system $(kubectl get pods -n kube-system | grep kube-flannel | cut -f 1 -d ' ') -- cat /etc/kube-flannel/net-conf.json
```

出力

```
Defaulted container "kube-flannel" out of: kube-flannel, install-cni (init)
{
  "Network": "10.244.0.0/16",
  "Backend": {
    "Type": "vxlan"
  }
}
```

## その２: ConfigMapを確認

```bash
root@k8s-master1:~# kubectl get cm -n kube-system kube-flannel-cfg -o json | jq '.data["net-conf.json"]'
```

出力(defaultで改行コード入ります)

```
"{\n  \"Network\": \"10.244.0.0/16\",\n  \"Backend\": {\n    \"Type\": \"vxlan\"\n  }\n}\n"
```

## その他

```bash
root@k8s-master1:~# kubectl get cm -n kube-system kube-flannel-cfg -o jsonpath --template {'.data["net-conf.json"]'}
error: error parsing jsonpath {.data["net-conf.json"]}, invalid array index "net-conf.json"
```

jqコマンドと同じようにはいきませんでした。


[[ jq ] keyの値にドット(.)が入っているときはどうするか - Qiita](https://qiita.com/penguin_dream/items/18a414302ccc301f8b54)
WebAPIについて学んだこと

WebAPIについて基礎的なことを学んだのでアウトプットしようと思います。
間違っている理解があればご指摘いただけるとありがたいです。

#APIとは
APIは、Application Programming Interfaceの略語
処理の塊、関数に近いイメージで、ソフトウェアとソフトウェアをつなぐルールのようなものです。

Interfaceは「接点」を意味しており、ハードウェア同士のインターフェイスには、USBコード等があります。
そして、ソフトウェア同士をつなぐインターフェイスがAPIです。
その接点の役割について、リクエストとレスポンスというものがあります。

#リクエストとレスポンス
リクエストとは、クライアント側からサーバ側へのHTTP通信であり、GETやPOST等が存在します。
そして、リクエストに対する返信がレスポンスになります。
正常なレスポンスが返って来た場合は、ステータスコード200が返って来る仕組みです。

ステータスコードには他にも、４00や500等が存在し、400番台はリクエストが不正であることを意味しています。
また、500番台は、サーバのエラーを意味しています。

#WebAPIとは
Webブラウジング（ブラウザでネットを閲覧すること）と似ており、流れとしては

- クライアントからhttpでリクエスト
- Webサーバで処理
- レスポンスで返す

という流れで処理され、インターネット経由で別のサーバ上にあるプログラム（処理の塊）を呼び出して、その結果を受け取ることができるようになるものです。

インターネット上のプログラムを呼び出すのか、そうでないのかがWebAPIとAPIの違いだと理解しました。
Ruby on railsにおいては、

```
$ rails new xxxxx --api 
```
を実行することで、railsでapiに必要なものだけを生成することができます。
ここで、自分専用のAPIを作成することで、これを使いまわすことができるようになり、開発効率を上げることができるなどのメリットがあります。

同じような処理をあらかじめ作っておけば、見た目の作成だけに専念ができる等、効率的な開発が実現するということだと理解することができました。
SharePoint Online でモダン表示に替えられないときの対応法

強引にモダン表示に切り替える方法です。
SharePoint でクラシック表示からモダン表示に切り替えたいときは、通常は、この「クラシック表示を終了」をクリックすればいいですが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/96291d90-37bf-2a24-2ba0-10f647748469.png)
サイトによっては、左側のサイドリンクバーを~~余計にも~~親切にも非表示にしてくれているページがあります。モダン表示にしたくても、「クラシック表示を終了」のリンクがなくて困ります。
そんな時は、以下の方法で強引にモダン表示にすることができます。

画面上で右クリックして「開発者ツールで調査する」を選択し、ブラウザの開発者ツールを起動します。
※Chrome の場合は「検証」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/81bf0ea4-1e30-1823-26b7-bf1b67fea6e3.png)
右側に、開発者ツールが開くので、一番下のコンソール上で
``GotoModern()``
とタイプすればモダン表示に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1467348/26ff8dcb-2086-aab5-fb65-d9ed0914fca1.png)
クラシック表示への切り替えのファンクションはまだわかっていません。ご存じの方おられたら教えてください。
※「従来の SharePoint の表示に戻す」のアクションは、おそらくイベントリスナーがどこかで定義されているのでまだ見つけられてません。
Firebaseとは？

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_694910_1eee50ba-c22f-9b45-51aa-713abcdd2680.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694910/0259522b-3048-d418-5fe6-5a36b5386800.png)
#Firebaseとは？

Firebaseとは、Googleが提供している、すばやく高品質のモバイルアプリやWebアプリケーションを開発することができるプラットフォームです。

Firebaseを使うことで、開発者はアプリケーションの開発に専念でき、バックエンドで動くサービスを作成する必要も管理する必要もありません。
ここでいうバックエンドとは、サービスの内、見えないところでデータの処理や保存などを行う要素のことです。

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_694910_1eee50ba-c22f-9b45-51aa-713abcdd2680.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694910/1c33ac23-5ca9-3dd4-c991-2d925797073e.png)

#データベースには２種類ある
* RealTime Database
* Cloud Firestore

RealTime DatabaseはFIrestoreの古い版のデータベスとなり、Cloud Firestoreは最新版のものとなります。
Cloud Firestoreの方が精度が高く公式でもCloud Firestoreを使うことを推奨しているので、基本はこちらを使って行きましょう。

では、次回からは実践的にCloud Firestoreを使ってアプリを作って行きます！
指定ディレクトリで分岐させる

# HUBLで指定ディレクトリで分岐させたい場合

## 完成
```HUBL
{% set subdir = slug|split('/', 2) %}
{% if subdir[0] == 'dirname' %}
dirname配下ページです。
{% endif %}
```

## slug
ドメイン以降のURLを取得できる。

```
URL
http://www.exmple.com/directory/path/

HUBL
{{ slug }} 

出力
/directory/path/
```

## split
引数1の文字で分割し配列にする
引数2は分割する数を制限

```
{% set subdir = slug|split('/', 2) %}
{{ subdir[0] }}

出力
directory

```
Mackerelでチェック監視のアラートを通知する

★はじめに
　Mackerelの監視設定ばっかりに夢中になってたら
肝心のアラート通知のやり方が全然わかってないことに気づいたのでメモ残す

★やり方
https://business.ntt-east.co.jp/content/cloudsolution/column-try-06.html　によると、
この２ステップでOK
１．通知チャンネルを作成する
２．通知グループを作成する

★前提
あらかじめアラートの検証するためにチェックプラグインを使って
２種類のプロセス監視を作成しました。
　check_httpd
　check_tomcat
![スクリーンショット 2021-06-09 234353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/b809c820-1893-16a7-73d9-1c69b1dfc225.png)

★手順１：通知チャンネルを作成する
Mackerel管理画面 > Channels > メール通知をクリック
※ここは通知手段なのでメール通知以外でもいいけどほかの手段が用意できなかったのでひとまずメール通知でやりました
![スクリーンショット 2021-06-09 234502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/5cddd8b4-5bc8-d9d1-6671-009b3a27afb9.png)

通知チャンネル名を入力、
通知先を指定する。ここではプライベートなメアドを使用した。
で、通知イベントを選択。今回はアラート通知を選択。
で、「作成」
![スクリーンショット 2021-06-09 234632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6d2318dd-7871-1579-de6d-763c9d6e030f.png)

できた結果がコチラ。
画面下側に新しい通知チャンネルができた。
![スクリーンショット 2021-06-09 234736.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/5e8f94a8-c071-006d-25ca-ac6e71a33d5f.png)

★手順２：通知グループを作成する
Mackerel管理画面 > Channels > 通知グループをクリック

グループ名を入力。
次に通知対象を指定。
今回はチェック監視を対象にしたいので「監視ルール」をクリック。
すると、準備しているチェックプラグインが選択できるのでこれを選ぶ。
![スクリーンショット 2021-06-09 234818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e35756df-523a-63e5-dc89-e5b7344c43e6.png)

続いて通知先の選択。
ここで、さっき作成した通知チャンネルを選択する。
で、「作成」
![スクリーンショット 2021-06-09 234914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/0fdf2a95-cf90-08cf-7eb5-6802eadc2095.png)

できた結果がコチラ。
画面上あたりに新しい通知グループができた。
![スクリーンショット 2021-06-09 234957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/7b011c34-6650-93e2-d22e-5ec16f6507bf.png)

★お試しでアラートを飛ばしてみる
今回はcheck_httpdのアラートを飛ばしたかったので
httpdを停止させた

```
# systemctl stop httpd.service
```
結果がコチラ。いい感じで落ちた。
![スクリーンショット 2021-06-09 235201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/57b1ba69-f91a-2806-61a8-9fe72593bf13.png)

★Mackerelの様子を拝見
Mackerel > Hosts > [サーバ名]にて
ちゃんとcheck_httpdでアラートが起きてることを確認。
![スクリーンショット 2021-06-09 235233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/c373e202-f5e8-adeb-1ec1-31ad9fa54dcb.png)

Alertの様子を見に行くとこんな感じ
画面下側の小さなアイコンにこそーっと自分が作成した通知チャンネルが表示されていた。無事通知されたようだ。
![スクリーンショット 2021-06-10 000504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/fd39ce80-0842-3026-86a5-f95bd9e0f32a.png)

なお、ここでは画像出せないけど、ちゃんと指定したメアドに
アラートが届いてた。よかったよかった。

★オマケ：復旧後のAlert画面
復旧したら復旧したで通知をしてくれた。ありがたや。
Alertは復旧したら自動的にクローズしてくれるのか、これは便利。
![スクリーンショット 2021-06-10 000818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/f7e09f11-881d-af90-aaef-420f3925131c.png)
【忘備録】正規表現まとめ

#はじめに
忘れがちな私の、私による、私のための忘備録です。
よければ、、役に立ててください。
ex.入力チェックやエディタを使用した検索、置換 etc..

#基本
####定義済みの文字
| No | 文字列 | 役割 | 備考 |
|:-------:|:-------:|:-------|:-------|
|1|.|任意の1文字||
|2|\d|数字|=[0-9]|
|3|\D|\d以外|=[^0-9]=[^\d]|
|4|\s|空白文字|=[\t\n\r\f]|
|5|\S|\s以外|=[^\t\n\r\f]<br>=[^\s]|
|6|\w|半角大英字、半角小英字、数字、_(アンダースコア)|=[0-9A-Za-z_]|
|7|\W|\w以外|=[^0-9A-Za-z_]<br>=[^\w]|

####最長一致数量子
| No | 文字列 | 役割 | 備考 |
|:-------:|:-------:|:-------:|:-------|
|1|*|直前の文字が0個以上||
|2|+|直前の文字が1個以上||
|3|?|直前の文字が0個か1個||
|4|{n}|直前の文字がn回||
|5|{n,}|直前の文字がn回以上||
|6|{,n}|直前の文字がn回以下||
|7|{n,m}|直前の文字がn回以上、m回以下||


####それ以外
| No | 文字列 | 役割 | 備考 |
|:-------:|:-------:|:-------|:-------|
|1|^|行の先頭を表す||
|2|$|行の最後を表す||
|3|\|直後の文字をエスケープし、文字として使用する。|必要な文字列は次項参照|
|4|A&#124;B|直前または直後のどちらか一方<br>AまたはB||
|5|()|括弧内を一つとして扱う||
|6|[]|括弧内のいずれか1文字||
|7|[^]|括弧内の文字以外の1文字<br>※先頭に^が来た場合のみ||

####文字として使用する場合、エスケープが必要な記号
| No | 文字列 | 備考 |
|:-------:|:-------:|:-------|
|1|\||
|2|/|正規表現の引用符として使用する場合|
|3|.||
|4|*||
|5|+||
|6|?||
|7|^||
|8|$||
|9|&#124;||
|10|-|[]内に使用する場合|
|11|'|正規表現の引用符として使用する場合|
|12|"|正規表現の引用符として使用する場合|
|13|()||
|14|{}||
|15|[]||

#一般的な使用例
####入力チェック
| No | 内容 |  | 備考 |
|:-------:|:-------:|:-------|:-------|
|1|前方一致|ABC.*||
|2|後方一致|.*ABC||
|3|部分一致|.\*ABC.\*||
|4|半角英数時のみ|^[0-9a-zA-Z]*$||
|5|郵便番号|^\d{3}-?\d{4}$|桁数しかチェックできない|
|6|電話番号<br>(-あり)|^((\d{3}-\d{4}-\d{4})&#124;(\d{4}-\d{3}-\d{3})&#124;(\d{2}-\d{4}-\d{4})&#124;(\d{4}-\d{2}-\d{4}))$|たぶんあってるはず|
|7|電話番号<br>(-なし)|^\d{10,11}$|桁数しかチェックできない|
|8|IPアドレス<br>(IPv4)|^((25[0-5]&#124;2[0-4][0-9]&#124;1?\d{1,2})\.){3}(25[0-5]&#124;2[0-4][0-9]&#124;1?\d{1,2})$||

#参考URL
・正規表現の基本
https://qiita.com/grrrr/items/7c8811b5cf37d700adc4
・正規表現を可視化してまとめたチートシート
https://qiita.com/grrrr/items/0b35b5c1c98eebfa5128
・【保存版】正規表現でエスケープが必要な文字一覧表
https://qiita.com/katsukii/items/1c1550f064b4686c04d4

#最後に
間違いや修正方針等の意見がありましたら、コメント欄にお願いします。
Azure 環境内で ARM Template を共有する (Template Specs)

**「Azure 環境内で ARM Template を共有する」**

そんな機能を実現できるのが、ARM Template Specs です。

## ARM Template Specs 概要

[Azure Resource Manager テンプレート スペック - Azure Resource Manager | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-specs?tabs=azure-cli)

> テンプレート スペックは、後でデプロイするために Azure に Azure Resource Manager テンプレート (ARM テンプレート) を格納するためのリソースの種類です。

「んなら、GitHub とかでもいいんじゃないの？」という声に対しては、下記がアドバンテージとなる設計思想のようです。

> テンプレート スペックには、次のような利点があります。
> * テンプレート スペック用に標準 ARM テンプレートを使用する。
> * SAS トークンではなく、Azure RBAC を使用してアクセスを管理する。
> * ユーザーは、テンプレートへの書き込みアクセス権がなくてもテンプレート スペックをデプロイできる。
> * テンプレート スペックは、PowerShell スクリプトや DevOps パイプラインなどの既存のデプロイ プロセスに統合できる。

その他、バージョン管理も可能になっています。

## チュートリアル

* [リンクされたテンプレートを使用してテンプレート スペックを作成する](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-specs-create-linked?tabs=azure-powershell)
* [リンクされたテンプレートとしてテンプレート スペックをデプロイする](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/template-specs-deploy-linked-template?tabs=azure-powershell)

上記のチュートリアルにはないバージョンの確認などは、下記の Microsoft Tech Community の記事が分かりやすいかなと思います。

[ARM Template Specs now GA! - Microsoft Tech Community](https://techcommunity.microsoft.com/t5/azure-governance-and-management/arm-template-specs-now-ga/ba-p/2402618)

-----

若干、手抜き感でスミマセン😅
このリソース、名前だけじゃよくわからなかったので用途からタイトルを付けて記事にしてみました。
VScodeのRemote Developmentが接続エラーになった時の対処法

ある日、VScodeの[Remote Development]( https://code.visualstudio.com/docs/remote/remote-overview )がエラーでSSHに接続できなくなってしまいました。
解決までに時間がかかってしまったので、備忘録として記載します。
（分かってしまえば単純なことなのですが、再発した時にまたハマりそうなので…）

## 解決策
SSHのホームディレクトリにある`.vscodeフォルダ`を丸ごと削除する。

## 手順
1. SSHにログインする
1. `ls -a`コマンドで、ホームディレクトリに`.vscodeフォルダ`があることを確認する
1. `rm -r .vscode`コマンドで、`.vscodeフォルダ`を削除する
1. `exit`コマンドで、SSHからログアウトする

以上です。
最後までお読みいただき、ありがとうございました。

---
## お世話になったサイト
- [MacのTerminalで「 ssh 接続名」で SSH 接続 - Qiita]( https://qiita.com/blendthink/items/d31e5c19751644129efc )
- [Macのターミナルコマンド一覧（基本編）） - Qiita](https://qiita.com/ryouzi/items/f9dee1540a04a0bfb9a3)
Node.jsで認証機能を作る際に使用したパッケージ集

##各パッケージと機能の簡単な説明

<dl>
<dt>bcryptjs</dt>
<dd> データベースに保存する前にパスワードをハッシュするのに役立つライブラリ。全てJavaScriptで記述され得ている。</dd>

<dt>body-parser</dt>
<dd> ミドルウェアで受信リクエスト本文を解析するために使用される。（フォームに入力された値を受け取る。）</dd>

<dt>concurrently</dt>
<dd> バックエンドとフロントエンドを異なるポートで同時に実行できます</dd>

<dt>express</dt>
<dd> Node.js のための高速で、革新的な、最小限のWebフレームワーク。</dd>

<dt>is-empty</dt>
<dd>valueが空かどうかを確認します。</dd>

<dt>mongoose</dt>
<dd>非同期環境で動作するように設計されたMongoDBオブジェクト モデリング ツール</dd>

<dt>passport</dt>
<dd>Node.jsの認証ミドルウェア。Facebook, Twitter認証もサポートしている。</dd>

<dt>passport-jwt</dt>
<dd>受信したJWTトークンを検証し、ログイン中のユーザーであるかを判定する。</dd>

<dt>validator</dt>
<dd>入力した内容が文字列かどうか判断する。(たとえば、有効な電子メール形式のチェック、パスワードの一致の確認。)文字列以外を渡すとエラーになる</dd>
</dl>

##参照
https://blog.bitsrc.io/build-a-login-auth-app-with-mern-stack-part-1-c405048e3669
https://www.npmjs.com/package/bcrypt
[node.js(express)のbody-parserを理解する](https://qiita.com/anoonoll/items/050ebb62143ada022a32)
[Express](https://expressjs.com/ja/)
https://www.npmjs.com/package/is-empty
https://www.npmjs.com/package/mongoose
[passport.js](http://www.passportjs.org/)
[[Node.js] Express で JWT 認証する方法
](https://mseeeen.msen.jp/passport-jwt-authentication-on-express/)
https://www.npmjs.com/package/validator
【Laravel】フォームリクエストのエラーレスポンスを json で返す


API リクエストのバリデーションをフォームリクエストで行うとき、バリデーションエラーのときのレスポンスが意図していたものと違った（ json で返ってこなかった）ので、 json でレスポンスされる方法を調べてみました。

## エラーレスポンスを json で返す

エラーレスポンスの定義は``failedValidation``メソッドをオーバーライドして書きます（ここがミソです）。``failedValidation``メソッドをオーバーライドしていないと、バリデーションエラーの場合にホームにリダイレクトされたりします。

```php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
// ↓追加する
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;

class ApiValidation extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'title' => 'required'
        ];
    }

    /**
     * エラー時のレスポンスを定義
     */
    protected function failedValidation(Validator $validator) {
        $res = response()->json([
            'status' => 400,
            'errors' => $validator->errors(),
        ], 400);
        throw new HttpResponseException($res);
    }
}
```

## 参考記事
https://qiita.com/junsan50/items/ec7f810decd3b82d3d76
Laravel 課題1・郵便番号辞書

郵便番号の一覧データを読み込み、

郵便番号
都道府県
市区町村
町域
のデータを表示する画面を作成してください。




# csvファイル

/storage/app/**zip_data_split_1.csv**

```php
"0600000","ﾎｯｶｲﾄﾞｳ","ｻｯﾎﾟﾛｼﾁｭｳｵｳｸ","ｲｶﾆｹｲｻｲｶﾞﾅｲﾊﾞｱｲ","北海道","札幌市中央区","以下に掲載がない場合"
"0640941","ﾎｯｶｲﾄﾞｳ","ｻｯﾎﾟﾛｼﾁｭｳｵｳｸ","ｱｻﾋｶﾞｵｶ","北海道","札幌市中央区","旭ケ丘"
"0600041","ﾎｯｶｲﾄﾞｳ","ｻｯﾎﾟﾛｼﾁｭｳｵｳｸ","ｵｵﾄﾞｵﾘﾋｶﾞｼ","北海道","札幌市中央区","大通東"
"0600042","ﾎｯｶｲﾄﾞｳ","ｻｯﾎﾟﾛｼﾁｭｳｵｳｸ","ｵｵﾄﾞｵﾘﾆｼ(1-19ﾁｮｳﾒ)","北海道","札幌市中央区","大通西（１〜１９丁目
```

# ルーティング

/routes/**web.php**

```php
<?php

Route::get('/zipcode_list', 'SampleController@zipcodeList');

```

# コントローラー

app/Http/Controllers/**SampleController.php**

```php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
 
class SampleController extends Controller{

 public function zipcodeList(){
      // SplFileObjectの作成
      $file = new \SplFileObject(storage_path('app/zip_data_split_1.csv'));
 
      // 読み込み設定
      $file->setFlags(
        \SplFileObject::READ_CSV | // CSVを配列形式で読み込む
        \SplFileObject::READ_AHEAD |
        \SplFileObject::SKIP_EMPTY | // 前の行と合わせて、空行があったら読み飛ばす
        \SplFileObject::DROP_NEW_LINE // 改行コードは無視する
      );
      // 1行ずつ読み込んで配列に保存
      $members = [];
      foreach($file as $member){
        $members[] = $member;
      }
 
      return view('samples.zipcode_list', [
        'title' => '郵便番号一覧',
        'members' => $members,
      ]);
   }

}
```


# ビュー

resources/views/samples/**zipcode_list.blade.php**

```php
<style>
  table {
    border-collapse: collapse;
  }
  th, td {
    border: solid 1px black;
    padding: 5px;
  }
</style>

@extends('layouts.default')
 
@section('title', $title)
 

<h1>{{ $title }}</h1>
 
@section('content')
<table>
        <tr>
          <th>郵便番号</th>
          <th>都道府県</th>
          <th>市区町村</th>
          <th>町域</th>
        </tr>
    
    @foreach($members as $member)    
     <tr>
         <td> {{ $member[0] }} </td>
         <td> {{ $member[4] }} </td>
         <td> {{ $member[5] }} </td>
         <td> {{ $member[6] }} </td>
    </tr>
    @endforeach
    </table>
 @endsection

```
【Laravel】SQL発行回数を減らす　〜複数レコードを一気にDBへ保存する方法〜

Laravelで複数レコードを保存する際、一度のSQL発行で処理する方法を考える。


現状は4つのレコードを保存する為に、4回SQLを発行している。
コードは以下の通り。

```php:RoomController.php
//1人目
$room_player_1 = RoomPlayer::create([
    "name" => null,
    "room_id" => $room_id, 
    "user_id" => 1,
  ]);

//2人目
$room_player_2 = RoomPlayer::create([
    "name" => null,
    "room_id" => $room_id, 
    "user_id" => 2,
  ]);

//3人目
$room_player_3 = RoomPlayer::create([
    "name" => null,
    "room_id" => $room_id, 
    "user_id" => 3,
  ]);

//4人目
$room_player_4 = RoomPlayer::create([
    "name" => null,
    "room_id" => $room_id, 
    "user_id" => 4,
  ]);
```

  
<br>
これを一度のSQL発行で処理するには、以下のようにデータを配列に格納し、insert( )で保存する。

※ちなみに、save(), create() で複数データをテーブルに格納する場合, foreach() 等で繰り返し処理をする必要がある。

```php:RoomController.php
$players = [
    ["name" => null, "room_id" => $room_id, "user_id" => 1],
    ["name" => null, "room_id" => $room_id, "user_id" => 2],
    ["name" => null, "room_id" => $room_id, "user_id" => 3],
    ["name" => null, "room_id" => $room_id, "user_id" => 4]
  ];

$save_players = RoomPlayer::insert($players);
```


<br><br>
##追記
ループ処理を使ってコードを短縮しました。

https://qiita.com/hinako_n/items/99c720dd4488a481eac1