OmniAICreator/Qiita-1.07M huggingface dataset:
4 リストの操作 Dif:20 ABC191 B：「AtCoder　凡人が『緑』になるための精選50問詳細解説」サンプル

**この記事は拙著「AtCoder　凡人が『緑』になるための精選50問詳細解説」のサンプルです**
価格：100円
kindle：https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf)：https://sano192.booth.pm/items/3179185

前：https://qiita.com/sano192/items/4432b669a04e69287c05
次：https://qiita.com/sano192/items/40fdf83cedacbc9d68a6

https://atcoder.jp/contests/abc191/tasks/abc191_b

**【目標】**
・リストの作成、要素の追加方法を身につける。

**【概要】**
B問題でよくある数列をどうにかする問題。基本的なリストの操作をこの問題で身につけよう。

**【方針】**
問題文には「取り除き」とあるが、リストに受け取った後問題文の通り削除していくとインデックス番号がずれたり、実行時間が長すぎたりして大変になる。

以下のように実装すればよい。
(1)答えを格納するリスト(=ans)を用意する
(2)リストの要素を順番に確認し、Xと違う数字ならansに格納する
(3)ansの要素を出力する

**【実装】**
入力を受け取る

```python:
N,X=map(int, input().split())
A=list(map(int, input().split()))
```

答えを入れるリストをansとして定義する。ansは最初空っぽ。

```python:
ans=[]
```

次にAの要素を順番に確認し、Xと違う数字ならansに追加していく。
リストへの追加は
リスト.append(要素)
と書く。

```python:
for i in range(N):
    if A[i]!=X:
        ans.append(A[i])
```

A[i]!=Xは「A[i]がXと異なる」という意味。その場合はansにA[i]を追加する。

最後に答えを出力する。

```python:
print(*ans)
```

アスタリスクをつけずに単にprint(ans)とした場合、余計なカッコがつく。
たとえばans=[3,6,4]だった場合、
print(ans) → [3, 6, 4]
print(*ans) → 3 6 4
となる。
リストの要素を出力するときはアスタリスクをつけるようにしよう。

この問題については公式解説の「解答例(python)」がかなりマニアックな書き方をしている。この問題が解けなかった人が読んでも意味不明だろう。ある程度競技プログラミングに慣れていても意味不明なので気にしなくていい。

公式解説の内容はわかるがコード例が読めない、ということはよくある。そういうときは「提出結果」から他の人の提出結果を見てみよう。
「提出日時」を2回クリックして提出の早い順に並べ、上から5つ程度コード内容を確認するとわかりやすいコードが1つ、2つ出てくるだろう。
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700383/a179f431-2828-354a-7c53-cb2aa0f658ae.png)


**【コード全文】**

```python:
N,X=map(int, input().split())
A=list(map(int, input().split()))

ans=[]

for i in range(N):
    if A[i]!=X:
        ans.append(A[i])

print(*ans)
```

**この記事は拙著「AtCoder　凡人が『緑』になるための精選50問詳細解説」のサンプルです**
価格：100円
kindle：https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf)：https://sano192.booth.pm/items/3179185

前：https://qiita.com/sano192/items/4432b669a04e69287c05
次：https://qiita.com/sano192/items/40fdf83cedacbc9d68a6
chageコマンド(Linux)

## はじめに
現在LinuC102試験学習中です。
LinuCとは：https://linuc.org/about/01.html
今回はchageコマンドの複雑なoptionについて下記にまとめました。

## chageコマンド（CHange password AGE）


・chageコマンドはパスワードの有効期限の設定に特化したコマンドで詳細な設定やその表示が可能。
・パスワードの有効期限に関する情報は「/etc/shadow」ファイルに保存される


## option早見表

|name  |optionの意味  |option内容  |
|---|---|---|
|-l(L)|	ls |パスの有効期限に関する<font color="DodgerBlue">情報を表示</font>（<font color="DodgerBlue">一般ユーザーも確認可能</font>）|
|-m |	minimum |パスの変更間隔の<font color="DodgerBlue">最短</font>日数を指定（変更できるようになるまでの日数）|
|-M |	Max |パスの有効な<font color="DodgerBlue">最長</font>日数を指定（何日ごとにパスを変更させるか）|
|-I(i) |	Inactive(非活性) |パスの有効<font color="DodgerBlue">期限切れ後</font>にアカウントが<font color="DodgerBlue">ロックされる</font>までの日数を指定|
|-W |	Warning |パスの有効期限が<font color="DodgerBlue">切れる前に警告</font>を表示する日数を指定|
|-E |	Expire(期限切れ) |ユーザー<font color="DodgerBlue">アカウント</font>の有効期限を指定（YYYY-MM-DD形式）|

※最短で覚えたい人はoptionの意味を覚えると早そう
## 書式
```
$ chage [オプション]　[days]or[user]
```


```
//option別指定項目
[-m mindays] [-M maxdays] [-d lastday] [-I inactive]
[-E expiredate] [-W warndays][-l user]
```

## その他、パスワードの有効期限に関する設定が可能なコマンド
同じようなコマンドとその違いも問題に出そうなので覚えておくといいかも

|name|概要|
|---|---|
|chage|パスワードの詳細設定、表示が可能
|passwd|パスワードを変更可能|
|usermod|ユーザーのホームディレクトリやグループ、パスワードなどを変更可能|

※中でもchageコマンドはパスワードの<font color="DodgerBlue">有効期限</font>に特化したコマンドであることは覚えておく

## 参考
http://linuxjm.osdn.jp/html/shadow/man1/chage.1.html
2021-08-01 Godot Engine > マウスクリックして線を描画する実装 (Array, update(), _draw(), draw_line(), for文)

### 動作環境

```
Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official
```

Godotの学習歴 (今日開始: 2021-08-01)

### 処理の概要

マウスクリックごとに線分を描画する。

### 学習内容

- Array
- マウス押下処理
- 描画 (update()と_draw())
    - _draw() : 一回だけ実行される。update()で再度実行される。
- 線分の描画 draw_line()
- for文

### 準備

1. Area2Dのノードを作成する
1. スクリプトのアタッチとしてmain.gdを定義する

### 実装

```python:main.gd
extends Area2D

var poslist = []
var nowPos = null

#func _ready():
#	pass # Replace with function body.

#func _process(delta):
#	pass
		
func _draw():
	if nowPos != null:
		poslist.append(nowPos)
	for idx in range(poslist.size() - 1):
		draw_line(poslist[idx], poslist[idx+1], Color(255, 0, 0), 1)

func _input(event):
	if event is InputEventMouseButton:
		if event.pressed == false:
			return
		if event.button_index != 1:
			return
		nowPos = event.position
		update()

```

### 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/73b905b2-edf6-4bfe-148e-e97181c2044a.png)

### 参考

- [GDScriptの基本](https://docs.godotengine.org/ja/stable/getting_started/scripting/gdscript/gdscript_basics.html)
- [How to draw a line in 2D?](https://godotengine.org/qa/3829/how-to-draw-a-line-in-2d)
    - updateと_draw()
- [マウスと入力座標](https://docs.godotengine.org/ja/stable/tutorials/inputs/mouse_and_input_coordinates.html)
    - event.positionなど
- [2Dカスタム描画](https://docs.godotengine.org/ja/stable/tutorials/2d/custom_drawing_in_2d.html)
- [ButtonList](https://docs.godotengine.org/ja/stable/classes/class_%40globalscope.html#enum-globalscope-buttonlist)
- [Array](https://docs.godotengine.org/ja/stable/classes/class_array.html)
3 やるだけ Dif:15 ABC188 B：「AtCoder　凡人が『緑』になるための精選50問詳細解説」サンプル

**この記事は拙著「AtCoder　凡人が『緑』になるための精選50問詳細解説」のサンプルです**
価格：100円
kindle：https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf)：https://sano192.booth.pm/items/3179185

前：https://qiita.com/sano192/items/467939ec8336d0bec380
次：https://qiita.com/sano192/items/f2bb2fde590bc11e7cfb

https://atcoder.jp/contests/abc188/tasks/abc188_b

**【目標】**
・リストの使い方を身につける。
・「やるだけ」問題を実装できるようになる。

**【概要】**
コンテスト終了後、Twitterで「B問題：やるだけ」と書かれるタイプの問題。
「やるだけ」とは問題文にある操作をそのままコードにできれば解けるという意味。
考え方に難しいところはないので、ぱぱっと実装できるようになろう。

**【方針】**
問題文にはベクトルだの内積だの書いているが、最後の行にある式
A1*B1+A2*B2+A3*B3+...+AN*BN
を計算して0か否か判定できれば解ける。

具体的には以下の手順で実装する。
(1)A、Bをリストとして受け取る
(2)for文でA1*B1、A2*B2、...を計算して足す
(3)0かどうかを判定する

そもそもリストが何かわからない人は以下のサイトがわかりやすいので見てほしい。
https://www.python.jp/train/list/list.html

**【実装】**
入力を受け取る。ここがわからないひとは「1 入力と出力」を確認しよう。
(1)A、Bをリストとして受け取る
リストの受け取りはA=list(map(int, input().split()))と書く。

```python:
N=int(input())
A=list(map(int, input().split()))
B=list(map(int, input().split()))
```

次に内積を格納する変数を作る。変数名は「naiseki」

```python:
naiseki=0
```

内積は英語でinner productだが英語がわからなければ日本語そのままで変数名をつけてしまえば良い。変数名は自分がわかればなんでもよい。

(2)for文でA1*B1、A2*B2、...を計算して足す
for文の使い方を説明しよう。

```python:
for i in range(N):
```

上記のように書くとi=0~(N-1)まで順番に数字を入れてfor文内の処理を行ってくれる。
(リストのインデックス番号(要素がリストの何番目にあるかを示す番号)は0から始まるため、最初～最後=0~(N-1)となる)

for分でリストの要素を一つ一つ取り出しながら掛け算し、naisekiに足していく。

```python:
for i in range(N):
    naiseki+=A[i]*B[i]
```

この部分は具体的には以下の処理を行っている。
1周目:A[0]×B[0]をnaisekiに足す
2周目:A[1]×B[1]をnaisekiに足す
...
N周目:A[N-1]×B[N-1]をnaisekiに足す

ちなみにnaiseki+=という書き方は右辺の値をnaisekiに足すという意味。以下のように書いても同じ処理をする。

```python:
naiseki=naiseki+A[i]*B[i]
```

(3)0かどうかを判定する
for文の処理が終われば問題文の通りに内積が計算され、結果がnaisekiに入っている。
あとはこれが0かどうか判定すればOK。

```python:
if naiseki==0:
    print("Yes")
else:
    print("No")
```

**【コード全文】**

```python:
N=int(input())
A=list(map(int, input().split()))
B=list(map(int, input().split()))

naiseki=0

for i in range(N):
    naiseki+=A[i]*B[i]

if naiseki==0:
    print("Yes")
else:
    print("No")
```

**この記事は拙著「AtCoder　凡人が『緑』になるための精選50問詳細解説」のサンプルです**
価格：100円
kindle：https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf)：https://sano192.booth.pm/items/3179185

前：https://qiita.com/sano192/items/467939ec8336d0bec380
次：https://qiita.com/sano192/items/f2bb2fde590bc11e7cfb
色の選択で参考にするサイトのリンク

非デザイナー向け。
というか、配色でいつも悩む自分向け。

## 色と配色の基本知識のまとめ
https://baigie.me/officialblog/2021/01/27/color_theory/

どの色がどんな意味で私たちの潜在意識に刷り込まれているのかを知ることができる。

## カラーパレットのリンクまとめ
https://uxmilk.jp/50657

いい感じの色の組み合わせを紹介してくれる。

## 色コードを取得できるサイト「Color Picking Tool」の紹介
http://brsounds.net/index.php/2017/04/05/rbg_color_darken_righten/

カラーコードを指定する時に便利なサイト「[Color Picking Tool](https://www.hexcolortool.com/)」の使い方を教えてくれる。

他にも参考になるサイトがあれば追記します。
Salesforce DX 時、Dev Hub 組織を認証しても、組織リストに(D)を出ないの間違い穴

Salesforce DXのスクラッチ組織の作成する時、以下の`間違い穴`ある手順をやって、組織作成出来なかった
--
1. Salesforce DX プロジェクトを設定する
2. `間違い穴`　Dev Hubの組織をデフォルト組織に設定される
3. Dev Hub 組織を認証する
4. スクラッチ組織定義ファイルを作成する
5. スクラッチ組織をCreateする

- Dev Hub 組織を認証前に、この組織をVSCodeのデフォルト組織に設定しました。（組織にアクセスできるかどうかことを確認したいため）、実はこれは`間違い穴`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/1b5443ae-9bce-6638-0c76-585d6be37c01.png)

- `間違い穴`があるため、4番スクラッチ組織をCreateする時、`couldn't create this sandbox or scratch org because the associated Dev Hub isn't authorized. Authorize the Dev Hub and try again.`エラーを発生する。実はDev Hub認証しました。


- 組織をリストして見ると、(D)は私のdev-hub-myというDev Hub組織の前に表示れない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/0c127264-5cde-6c90-1b7c-3e49695c204c.png)

- 一旦別の組織をデフォルト組織に設定したら、(D)は組織の前に表示ました。（解決策ため一時間を掛かりました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/9766f1c1-bb31-61a7-cbdc-1eab058538dd.png)

- 後にもう一回スクラッチ組織をCreateして、成功しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356407/1f004695-4620-9d2c-e2c5-2a099afb22d8.png)
sbt-play-swagger を使ってみた

[Play](https://www.playframework.com/) は [Scala](https://www.scala-lang.org/)/[Java](https://www.java.com/ja/) 向けの Web フレームワークです。このフレームワーク用のプラグインに [sbt-play-swagger](https://github.com/iheartradio/play-swagger) があります。これを使うことで [Play の routes ファイル](https://www.playframework.com/documentation/2.8.x/ScalaRouting)から [swagger.json ファイル](https://swagger.io/specification/v2/)を作成することができます。

swagger.json を用意することで、swagger/openapi のエコシステムが使えます。[各言語向けのクライアントの自動生成](https://swagger.io/tools/swagger-codegen/)や、 [GitLab だと swagger.json をその場でレンダリングしてリッチなUIを提供することができます](https://docs.gitlab.com/ee/api/openapi/openapi_interactive.html)。

# sbt-play-swagger を使う

swagger.json を用意するにはインスペクタを使ったり、アノテーションを使ったりと色々な方法がありますが、ここでは sbt-play-swagger を使った方法を紹介します。

## 使用方法

plugin.sbt に sbt-play-swagger を追加します。

```plugin.sbt
addSbtPlugin("com.iheart" % "sbt-play-swagger" % "0.10.6-PLAY2.8")
```

build.sbt に設定を追加します。

```build.sbt
swaggerRoutesFile := "routes"
swaggerTarget := file("swagger.json")
swaggerDomainNameSpaces := Seq(
  "com.example.domain"
)
swaggerPrettyJson := true
Assets / WebKeys.exportedMappings := Nil
```

| 設定 | 説明 |
|:-:|:-:|
| `swaggerRoutesFile` | routes ファイルの場所。conf/routes であれば指定を省略できる。もし違うファイル名の場合は conf からの相対パスで記述する。 |
| `swaggerTarget` | swagger.json ファイルを出力する場所。こちらはプロジェクトルートからの相対パスで記述する。 |
| `swaggerDomainNameSpaces` | ドメインクラスを検索するパッケージを指定（後述） |
| `swaggerPrettyJson` | pretty 出力するかどうか。基本は git 管理すると思われるので、差分管理しやすい pretty の方がおすすめ |
| `Assets / WebKeys.exportedMappings` | `Nil` にする必要がある |

実行は `swagger` タスクです。

```
$ sbt swagger
```

## メリット

### ドメインクラスから定義を自動生成できる

play の routes にはドメインクラスを利用して型を指定できますが、sbt-play-swagger はその型情報から swagger.json の定義を自動生成できます。そのため、swagger.json の記述をできる限り省略できます。

### swagger.json がそのまま書ける

既存の型をそのまま自動生成してしまった場合（特に Enum など）、想定した swagger.json が出力されないことがあります。その場合は [conf/swagger-custom-mappings.yml を用意する](https://github.com/iheartradio/play-swagger#how-to-override-type-mappings)ことで、自動生成を回避できます。また、そのマッピングよりも優先したい定義があった場合は routes 側でアドホックに定義できます。

### swagger 情報がソースコードに散らばらない

これは好みの問題ですが、特にアノテーション形式で swagger 情報を記述する場合、言語の型情報と swagger の型情報が重複してかなりのノイズになります。加えて swagger のアノテーションは記述が長くなりがちなので、ソースコード中のメタ情報が増えてかなり辛いです。

routes ファイルに記載する場合、swagger の概念的にも場所的に近いので、かなり整理された感じです。ただ、routes ファイルに長大なコメントを書くのはカルチャーショックかもしれません...

## デメリット

### プロジェクト構成に注意

プロジェクト構成によっては swagger.json を作成できないです。特に新規の play プロジェクトで実行できないことがあります。その場合は `Assets / WebKeys.exportedMappings` を `Nil` にする必要があります。

https://github.com/playframework/playframework/issues/5242

### OOM が発生する

場合によってはコンパイル時に OutOfMemoryError が発生します（なんじゃそりゃ）。さすがにそれだと困るので、環境変数が定義されている場合にだけ sbt-play-swagger の設定が有効になるようにしています。

# まとめ

- sbt-play-swagger を使って swagger.json ファイルを自動生成できました。
    - 既存はアノテーションベースだったのですが、swagger 情報を routes に移したので、ソースコードから swagger アノテーションが消えました。
- GitLab による swagger.json のレンダリング機能を使ったので、アプリケーションにバンドルしている swagger-ui を削除できました。
    - swagger-ui はそれなりのコード量あるし、play のバージョンアップによってうまく動かなくなっていたので、整理できてよかった。
- swagger エコシステムを活用していきたい。
    - クライアント自動生成はまだ試してないので、機会があれば試していきたい。
CakePHP4_migrationでカラム位置を変更したい



#まえがき
CakePHPのmigrationを利用してカラム位置の修正を行う手順を記載します。

#バージョン
CakePHP4

#手順
・Usersテーブルをmigrationで作成
`bin\cake bake migration CreateUsers login_id:string `
`bin\cake migrations migrate`

・Usersテーブル情報修正用のmigrationファイル生成
`bin\cake bake migration ChangeUsers`

```php:20210801024646_ChangeUsers.php
$table = $this->table('users');
$table->addColumn('loginId', 'string', [
    'after' => 'id'
]);
$table->update();
```

※上記のmigrationファイルでmigrate実行するとエラーが発生
 `bin\cake migrations migrate`

```
PDOException: SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'loginId' in C:\xampp\htdocs\cakephp_apps\todo\vendor\robmorgan\phinx\src\Phinx\Db\Adapter\PdoAdapter.php:194
```


```php:20210801024646_ChangeUsers.php
$table = $this->table('users');
// addColumn -> changeColumnに変更
$table->changeColumn('loginId', 'string', [
    'after' => 'id'
]);
$table->update();
```

 `bin\cake migrations migrate`

今度は正しく反映されました！
[SwiftUI]Property Wrappers変数の変更イベント

プロパティラッパー変数の`@State`などの値はSwiftのビューに対して変更をデータバインドすることができますが、データバインド領域ではなく、変数が変更されたときに何かしらの処理を実行させる場合には、例えば、onAppearなどで状態変数が変更された後の処理を書いても、変更されたタイミングでコールされません。

ではどうするか、、、
onChangeメソッドを使い状態変数の値を監視することができます。


```swift
struct ContentView: View {

    @State var name: String
    
    var body: some View {
        
        VStack {
            // do something
        }
        .onChange(of: self.name, perform: { value in
            if let receivedUpdate = value {
              // 変更されたときに実行される
            }
        })
        
    }
    
}
```

はい、このようにすることで実行できます。
SwiftUIは慣れないと最初ここらへんでつまずくのでメモとして残しておきます。

状態管理の根本がわからない人でもっと理解を深めたい人はついでにReduxなどを勉強するとためになります。
多くのフレームワークが採用しているので今後の必須知識でしょう
【SAP-C01試験対策】管理ツールのまとめ

# はじめに

AWSの管理ツールについて、以下の書籍および公式ドキュメントを参考に学習したので内容をまとめます。

https://www.amazon.co.jp/dp/B08F9CQ6LT/

https://aws.amazon.com/jp/license-manager/


# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。

# CloudWatch

* AWS上でメトリクスやログの収集・監視、イベントの監視を行うためのマネージドサービス。
* データを収集し、AWSとオンプレミスのサーバーで実行されるAWSリソース、アプリケーション、およびサービスが統合されたビューをユーザーに公開する。

## CloudWatch Logs

* ログ収集、保存機能を提供するサービス。
* CloudWatch Logs Insightsを利用すれば、保存したログデータに対してクエリを発行し分析できる。


## CloudWatch Events
* AWS上のリソースで発生した変更をニアリアルタイムにイベントとして検知する。
* EC2、Lambda、Kinesis等のサービスと連携し、イベントをトリガーとした皇族処理を実行可能。

# CloudTrail

* AWS上で発生したAPIアクセスをログに記録するサービス。
* AWSのサービスすべてAPIを介して連携するよう設定されており、誰がどのサービスに対してAPIを発行したかを監査ログに残すことができる。
* Cloudtrail Insightを利用すれば異常パターンの定義と検出、CloudWatchEventへのイベント送信も可能。

# AWS Config
* AWSのリソース構成管理サービス。
* AWSリソースの構成変更を指定されたS3バケットに保存する。
* AWS Config Ruleというルールを設定し、違反した構成変更が行われた場合に、ダッシュボードや管理者への通知、修復アクションが可能。

# System Manager
* EC2インスタンスやオンプレミスのサーバー群の運用管理を容易にするための各種サービス。

|サービス名|概要|
| ----|----|
|インベントリ|インスタンスおよびインストールされたソフトウェア群に関する情報を収集 | 
|オートメーション|定期的に実行が必要な運用管理タスクを自動化|
|実行コマンド|インスタンスに対する運用管理タスクを自動化。（レジストリの編集、パッチ適用等）|
|セッションマネージャー|マネジメントコンソール経由でインスタンスに対してSSH接続が可能|
|パッチマネージャー|指定したメンテナンスウィンドウのタイミングでパッチを自動適用|
|メンテナンスウィンドウ|運用管理タスクを実行するための時間枠をスケジュールリング|
|ステートマネージャー|インスタンスに対するサーバーの設定、ウイルス対策、ファイアウォール設定等を保持|
|パラメータストア|DBへの接続文字列等のパラメータを一元管理|

# Trusted Adviser

* 利用中のAWS環境をチェックしベストプラクティスに照らした改善アクションの提案を行うサービス。

# Personal Health Dashboard

* 全世界のリージョンで発生したAWSの生涯やパフォーマンスイシューについて確認できるダッシュボード。

# License Manager
* Microsoft、SAP、Oracle、IBM といったベンダーが提供するライセンスの管理を、AWS とオンプレミス環境で行うサービス。
* ライセンス管理者は AWS Service Catalog でルールを追加できる。

# Service catalog
- AWSアカウント内で使用できる、ITサービスのカタログを作成および管理するサービス。ポートフォリオに製品（CloudFormationのテンプレート）等を登録し、製品を起動できる。
YAMLチートシート

Cloudformationのテンプレートファイルを記述する際にYAMLの書き方に困ったのでメモ
特に配列の表記など

## コメント

``` YAML
info:
  description: 普通の行
#  description: コメント行
  titie: タイトル   # ここはコメント 
```

## 配列とハッシュ
インデントでデータ構造を表現する

### 配列
``` YAML
- aaa
- bbb
- ccc
```

### ハッシュ
```YAML
abc: val1
def: val2
ghi: val3
```

### 配列のハッシュ
```YAML
abc:
  - aaa
  - bbb
  - ccc
def:
  - eee
  - fff
  - ggg
```

### ハッシュの配列
```YAML
- abc: val1
  def: val2
- ghi: val3
  jkl: val4
```

## ブロックスタイルとフロースタイル
- ブロックスタイル（複数行表記）とフロースタイル（1行表記)
- 通常はブロックスタイルが良いらしいい
- 1行にまとめたい部分のみフロースタイルがおすすめとのこと

```YAML
# ブロックスタイル
- abc
- def
- ghi
# ↓
#フロースタイル
[abc, def, ghi]
```

## 型
- YAMLは次のデータ型を判断する
    - 整数/浮動小数点/真偽値(true,false)/日付/タイムスタンプ
- 上記以外は文字列
- 文字列を明示する場合はシングルクォート、ダブルクォート

## 複数行の文字列の扱い
- 文字列にもブロックスタイルがある
    - 用途：UserDataを書く場合らしい

```YAML
# パイプを書くと改行が保持される
text1: | 
  hogehoge
  fugafuga
  foobar
```
Laravelで認証・認可処理の諸々実装

## はじめに　　

認証・認可関係の処理を実装した際の諸々をメモ。
細かい説明は抜きでとりあえず動く部分のみ書いてます。


- やったこと　　

  - 未認証の場合ログイン画面に遷移させる　　
  - ログイン後、再びログイン画面にいくと特定の画面にリダイレクトさせる
  - ログイン後の遷移先を設定
  - 権限によってアクセス制限を行う

### 1. 未認証の場合ログイン画面に遷移させる

ルーティングでミドルウェアを通します。

```php

Route::middleware('auth')->group(function (){
    Route::get('/', [Controllers\StudentsController::class, 'show'])->name('top');
});
```

ログインしていないとき、`'/'`にアクセスするとログイン画面に飛ばされます。

### 2.　ログイン後、再びログイン画面にいくと特定の画面にリダイレクトさせる

仮定として、usersテーブルにはroleカラムがあり、1or2の数字を権限として与えます。

ミドルウェアの`RedirectIfAuthenticated.php`をいじっていきます。

```php
//省略    
    public function handle(Request $request, Closure $next, ...$guards)
    {
        $guards = empty($guards) ? [null] : $guards;

        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {
                if(Auth::user()->role==1){
                    return redirect('/home1');
                }elseif(Auth::user()->role==2){
                    return redirect('/home2');
                }
            }
        }
        return $next($request);
    }
```

- 説明

ログイン後のリダイレクト画面の設定をしています。


```php
        if(Auth::user()->role==1){
            return redirect('/home1');
        }elseif(Auth::user()->role==2){
            return redirect('/home2');
        }
```

ここでログインしているユーザーのroleがどれか確認しています。
roleが1であれば`/home1`へリダイレクトしています。
roleが2であれば`/home2`へリダイレクトしています。
（他に良い方法があればご指摘くださいっ。）

その他`RedirectIfAuthenticated.php`に関する処理で気になる部分がある方はこちらの記事に詳しく書かれていました。

[【Laravel】Closure $next, ...$guardsとは？](https://qiita.com/shizen-shin/items/03c8ae8208fa7928cbb8)

ちなみにログイン後の遷移先は`LoginController.php`に同様な処理を追加しました。

```php
//省略
    public function authenticated(Request $request, $user)
    {
        if(Auth::user()->role==1){
            return redirect('/home1');
        }elseif(Auth::user()->role==2){
            return redirect('/home2');
        }
    }
```

### 3. 権限によってアクセス制限を行う

Gateの機能を使用。プロバイダーの`AuthServiceProvider.php`に以下を追記。

```php
//省略
    public function boot()
    {
        $this->registerPolicies();

        Gate::define('admin',function ($user){
            return($user->role == 1);
        });

        Gate::define('teacher',function ($user){
            return($user->role == 2);
        });
    }
```

そしてルーティングでミドルウェアを通します。

```php
Route::middleware(['can:admin','auth'])->group(function (){
    Route::get('/', [Controllers\StudentsController::class, 'show'])->name('top');
});
```

`middleware('can:admin')`と記載することで権限がadmin、つまりroleが1のユーザーだけが`'/'`画面に遷移できます。
それ以外のユーザーには403エラーが返されます。

## おわりに

探り探りで初めての実装もりもりでしたがとりあえず想定通りの動きはできました・・・。
細かい部分の処理を見ていかないと、どのように認証が行われているか理解が難しいですね。。
動きだけでもどこか参考になれば幸いでございます。
（もっとこうしたほうが良いなどあればご指摘お願いします！）

以上！
Pythonにおける.gitignoreに追加するべきファイル

# .gitignoreファイルとは
Gitの管理下から除外するファイル・フォルダを指定するファイルのこと。
commit内容をできるだけ汚さない為に、ローカル環境（自分のPC）だけに
必要なファイルを追加する。

## Gitの管理下から除外推奨のファイル・フォルダ例
各言語における除外すべきファイル・フォルダは公式サイトを参照。

https://github.com/github/gitignore

### Python
https://github.com/github/gitignore/blob/master/Python.gitignore


+ PyCharmのキャッシュファイル
+ venvの仮想環境フォルダ
+ jupyter notebookのチェックポイントフォルダ

など、うっかりcommitすると怒られるので要注意
SQL 相関サブクエリの使用例

Every Qiita #27
のんびり独学初学者投稿 27日目
今回は・・・
sqlの基本を復習した時の備忘録です。

###グループ毎の平均値よりも高いレコードを取得したい

前回はスカラ・サブクエリを使って全体の平均値よりも高いレコードを取得しましたが、今回はグループ毎に平均値を算出しその平均値よりも高いレコードを取得していこうと思います。

**stationeryテーブル**

| name | price | name_group |
| ---- | ---- |----|
| 鉛筆　| 100 | A |
| ハサミ　| 200 | B |
| ホッチキス　| 250 | A |
| クレヨン | 400 | C |
| 消しゴム | 180 | B |
| のり | 170 | A |
| ノート | 300 | C |

前回のテーブルにgroupというカラムを追加しました。
「サプクエリを使ってグループ毎に平均値を出して絞り込めばいいんだね。了解。」

```sql
SELECT name, price FROM  stationery WHERE price > (SELECT AVG(price) FROM stationery GROUP BY name_group);
```
・・・またエラーなんだが・・・？
->スカラ・サブクエリは単一の値しか出力できません。

そんなときに**相関サブクエリ**を使ってみましょう！

```sql
SELECT * FROM stationery as st1 WHERE price > (SELECT AVG(price) FROM stationery as st2 WHERE st1.name_group = st2.name_group GROUP BY name_group) order by name_group
```

| name | price | team |
| ---- | ---- | ---- |
| ホッチキス | 250 | A |
| ハサミ　| 200 | B |
| クレヨン | 400 | C |

単一の場合はスカラ・サブクエリを使い、複数の場合は相関サブクエリを使っていけば良さそうですね。
【SAP-C01試験対策】移行方式のまとめ

# はじめに
AWSの移行方式について以下の書籍を参考に学習したので内容をまとめます。

https://www.amazon.co.jp/dp/B08F9CQ6LT/

# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。

# 移行の方式

## DMS (AWS database Migration Service)

* データベースの移行を支援するサービス。
* 移行元：オンプレミスおよびAWS環境上のDB
* 移行先：EC2上のDB、RDS
* 同種間の移行用ツールであるため、DBエンジンが異なる場合は [Scheme Conversion Tool](#SCT)と組み合わせて移行を実施する。

## SCT (AWS Schema Conversion Tool)
データベースエンジン間でスキーマの変換を行うツール

## SMS (AWS Server Migration Service)

* オンプレミス上に存在する仮想環境上のサーバーをAMIとして移行するサービス。
* リホスト方式をサポートする。
* 短い期間で大量のサーバーを移行可能。

## Application Discovery Service

* 移行の準備段階としてオンプレミス環境の情報を収集するツール。
* 収集された情報は元に移行方式の検討、移行計画の立案に利用される。

## Migration Hub

* 3rd Partyのベンダーが提供する移行サービスも含めて移行元のアプリケーションの情報を収集し、最適な移行サービスを選択する。
* 仮想サーバーやアプリケーションの情報をインポート可能。

## VM Import/Export

* オンプレミス上に存在する仮想環境上のサーバーをAWS上に移行するサービス。
* [SMS](SMS (AWS Server Migration Service))リリース前は、リホスト方式で主に利用されていた。
* VX Export はEC2をオンプレミス上に移行するためのサービス。

## Snow Family
オンプレミス環境から大量のデータを移行する際に利用

* Snowball : ペタバイト規模のデータ転送が可能。現在は利用できない。
* Snowball Edge コンピューティング最適化: デバイス内にCPUが搭載されており、EC2やLambdaの実行が可能。データの加工、集約を実施しその結果を移行することが可能。42TBのオブジェクトストレージを搭載している。
* Snowball Edge ストレージ最適化: 100TBのオブジェクトストレージを搭載している。
* Snowmobile : ストレージを搭載したトレーラー車。エクサバイト規模のデータ転送が可能。最大1Tbpsのデータ転送が可能。
PHPの基本文法まとめ

PHPについて一通り学習して、今後また使う機会があるかもなので、備忘録として残しておきます。

#基本形

- phpを使う際は、`<?php ... ?>`の間に記述していく。
- 文末にセミコロンをつける。

```php:
<?php
  echo 'HelloWorld！';
?>
```

#変数に数字を足す

- 省略形を紹介

```php:
// 変数xに１を代入
$x = 1;

// 四則演算の省略形
$x += 10;
$x -= 10;
$x *= 10;
$X /= 10;
$x %= 10;

// 値が１のときだけの省略形
$x ++;
$x --;
```

#文字列の連結

- 文字列の連結は、ドット「.」を使う
- 「.=」で省略して書ける

```php:
$name = '久保';

echo '私の名前は'.$name.'です';
// 結果: 私の名前は久保です

// 省略形
$name .= '建英';
echo $name;
// 結果: 久保建英
```

#変数展開

- `ダブルクォーテーションで文字列を囲んだときのみ`
- シングルクォーテーションで文字列を囲んだときは、そのまま文字列としてみなされる
- 変数を`{ }`で囲う

```php:
$name = '久保建英';

echo "私の名前は、{$name}です";
// 結果: 私の名前は、久保建英です

echo '私の名前は、{$name}です';
// 結果: 私の名前は、{$name}です
```

#if文

- 基本形は`if(条件式){}`
- else,elseifを使って条件分岐
- 条件の否定は`if(!(条件式)){}`のように「!」を使う

```php:
$x = 10;

if($x > 30){
  echo '$xは30より大きい';
}elseif($x >= 30){
  echo '$xは3０以下２０以上';
}else{
  echo '$xは20より小さい';
}
// 結果: $xは20より小さい

// 条件の否定
$name = '久保建英';

if(!($name == 'リオネル・メッシ')){
  echo '$nameはリオネル・メッシではない';
}
// 結果: $nameはリオネル・メッシではない
```

####条件式の条件

```php:
// 大小を比べる
<
<=
>
>=

// 等しいか調べる
==
!=

// かつ、または
&&
||
```

#switch文

- if文で、条件分岐が多く複雑なときに、switch文に書き換えるとシンプルにできる
- `break`を各ブロックの最後に記述
- breakがないと、条件が一致しても次のブロックが実行される

```php:
// if文で書いたコード
if($coin == 0){
  echo '表';
}elseif($coin == 1){
  echo '裏';
}else{
  echo 'エラー';
}

// switch文で書いたコード
swich($coin){
  case 0:
    echo '表';
    break;
  case 1:
    echo '裏';
    break;
  default:
    echo 'エラー';
    break;
}
```

#配列

- インデックス番号は、0.1.2...
- 連想配列で、キーをつけられる


```php:
$colors = array('赤','青','黃');

echo $colors[0];
// 結果: 赤

// 連想配列
$player = array(
            'name' => 'リオネル・メッシ';
            'team' => 'バルセロナ';
            'sex' => '男性';
)
echo $player['name'];
// 結果: リオネル・メッシ
```

#for文

- `for(初期化、ループの条件、変数の更新){繰り返す処理}`が基本形で、ループの条件に合うまで繰り返し処理される

```php:
// $iを1から100まで出力
for($i = 1; $i <= 100; $i++){
  echo $i;
}
```

#foreach文

- 基本形は`foreach(配列as値変数){繰り返したい処理}`
- キー名も出したければ、`foreach(配列as $key => $value){繰り返したい処理}`

```php:
$colors = array('赤','青','黃');

foreach($colors as $color){
  echo $color.' ';
}
// 結果: 赤 青 黃

// 連結配列
$colors = array(
            'りんご' => '赤',
            'ブルーベリー' => '青',
            'バナナ' => '黃'
          );
foreach($colors as $key => $value){
  echo $key.'：'.$value.' ';
}
// 結果: りんご：赤 ブルーベリー：青 バナナ：黃
```

#まとめ

今回はよく使うであろう基本形についてまとめておきました。

ぼく自身はRubyを学んでいたので、文法は少しずつ違うのですが、基本的にやってることは同じなので、理解が早かったように思います。

よく言う、２つ目の言語の習得は早いというのはこうゆうことなのでしょうか？

まだまだPHPに関する理解は追いついていないため、これからも頑張っていきます！
WordPressでGulpを使用してSassをコンパイルしてみよう

今回はWordPressのテーマをSassで書く機会があったので、Gulpを使用したコンパイルの設定をおさらいします。

#1. Node.jsのインストール

今回は割愛させていただきます。

https://nodejs.org/ja/download/

#2. package.jsonファイルの生成

WordPressの任意テーマのディレクトリ下に移動して下記コマンドを実行。

```
$ cd ~/public/wp-content/themes/任意のテーマ
```

初期化してpackage.jsonファイルを生成します。

```
$ npm init -y
```

#3. 必要なプラグインのインストール

```
$ npm install --save-dev gulp 
$ npm install --save-dev gulp-sass
$ npm install --save-dev gulp-autoprefixer
```

#4. gulpfile.jsの作成と編集

任意のテーマディレクトリ直下でgulpfile.jsを作成し、下記のコンパイルと自動化の設定を記述する。

```js

const gulp = require("gulp");
const sass = require('gulp-sass')(require('node-sass'));
const autoprefixer = require('gulp-autoprefixer')

gulp.task("sass", function() {
  return gulp.src("./assets/scss/*.scss") 
      .pipe(sass({ outputStyle: "expanded" })) 
      .pipe(autoprefixer()) 
      .pipe(gulp.dest("assets/compile")) 
});

gulp.task('default', function() {
  gulp.watch('./assets/scss/*.scss', gulp.task('sass'));
});

```

**コンパイル対象のファイル先を指定**

```js
gulp.src("./assets/scss/*.scss") 
```

**コンパイルする際のアウトプットスタイルを指定**

```js
.pipe(sass({ outputStyle: "expanded" })) 
```
スタイル①

```js
.pipe(sass({outputStyle: 'nested'}))
```

```css
#hoge {
  width: 600px; }
  #hoge p {
    color: red; }
    #hoge p span {
      color: blue; }
  #hoge div {
    width: 300px; }
```

スタイル②

```js
.pipe(sass({outputStyle: 'expanded'}))
```

```css
#hoge {
  width: 600px; 
}
#hoge p {
  color: red; 
}
#hoge p span {
  color: blue; 
}
#hoge div {
  width: 300px; 
}
```
スタイル③

```js
.pipe(sass({outputStyle: 'compact'}))
```

```css
#hoge { width: 600px; }
#hoge p { color: red; }
#hoge p span { color: blue; }
#hoge div { width: 300px; }
```

スタイル④

```js
.pipe(sass({outputStyle: 'compressed}))
```

```css
#hoge { width: 600px; }#hoge p { color: red; }#hoge p span { color: blue; }#hoge div { width: 300px; }
```

**必要なベンダープレフィックスを自動で付与**

```js
.pipe(autoprefixer()) 
```

**コンパイルしたファイルの出力先を指定**
assetsディレクトリ直下に`complieディレクトリ`を作成しておきましょう。

```js
.pipe(gulp.dest("assets/compile")) 
```

**タスクを走らせる毎にコンパイル対象ファイルの更新を監視する**

```js

gulp.task('default', function() {
  gulp.watch('./assets/scss/*.scss', gulp.task('sass'));
});

```

#5. タスクを走らせよう

scssファイルを編集するたびにcssファイルにコンパイル処理が自動で行われます。

```js
$ npx gulp
```

#設定中に出たエラー

エラー名忘れちゃったけど、`node-sass`が必要だよ！！と言われたのでインストールと設定して解決しました。

```
$ npm install --save-dev node-sass
```

```gulpfile.js
const sass = require('gulp-sass')(require('node-sass'));
```

#参考ファイル

https://xxbxxqxx.com/post/19524/

https://book2.scss.jp/code/c2/05.html

https://youki-takemoto.net/archives/106
C++の降順・昇順ソート(vector, array, 配列)

## c++のソートについて
最近c++の勉強を始めたのですが、ソート(降順、昇順)につまづいたので備忘録として残します。
調べたのはvector型、array型および配列の3種類です。
## 結論
(ベクトル型)
・昇順にソートする場合は```sort(ベクトル型.begin(), ベクトル型.end())```と書きます。
・降順にソートしたい場合には、```sort(ベクトル型.rbegin(), ベクトル型.rend())```とソートします。
(array型)
・昇順にソートする場合は```sort(array型.begin(), array型.end())```と書きます。
・降順にソートしたい場合には、```sort(array型.rbegin(), array.rend())```とソートします。
(配列)
・昇順でソートする場合は```sort(配列, 配列+配列の長さ)```と書きます。
・降順でソートする場合は```sort(配列, 配列+配列の長さ, greater<int>())```と書きます。


## テスト
### vector型のソート
vector型は```vector<型>```というように定義します。

```cpp
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
    vector<int> vec;
    vec = {10,30,20,50,40}; //ソートしたい数字列
    //ソート(昇順)
    sort(vec.begin(), vec.end());
    for (int i=0;i<5;i++){
        cout << vec[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    cout << endl;

    //ソート(降順)
    sort(vec.rbegin(), vec.rend());
    for(int i=0;i<5;i++){
        cout << vec[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    return 0;
}
```
```
//出力結果
10 20 30 40 50 

50 40 30 20 10 
```

### arrray型のソート

array型は```array<型, 要素数>```の形で定義します。

```cpp
#include<iostream>
#include<algorithm>
#include<array>
using namespace std;

int main(){
    array<int, 5> arr;
    arr = {10,30,20,50,40}; //ソートしたい数字列
    //ソート(昇順)
    sort(arr.begin(), arr.end());
    for (int i=0;i<5;i++){
        cout << arr[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    cout << endl;

    //ソート(降順)
    sort(arr.rbegin(), arr.rend());
    for(int i=0;i<5;i++){
        cout << arr[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    return 0;
}
```
```
//出力結果
10 20 30 40 50 

50 40 30 20 10 
```

### 配列のソート
```int x[n]```という形で定義する配列のソートです。

```cpp
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int x[5] = {10,30,20,50,40};; //ソートしたい数字列
    //ソート(昇順)
    sort(x, x+5);
    for (int i=0;i<5;i++){
        cout << x[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    cout << endl;

    //ソート(降順)
    sort(x, x+5, greater<int>());
    for(int i=0;i<5;i++){
        cout << x[i] << " ";
        if (i==4) cout <<endl; //改行
    }
    return 0;
}
```
```
//出力結果
10 20 30 40 50 

50 40 30 20 10 
```

### 備考
http://stlalv.la.coocan.jp/sort.html
https://note.com/memenekokaburi/n/na7dab7417e98

間違いなどがあれば教えていただけると幸いです。

## 追記(2020/08/01)

@mitayuki6 さんに以下の書き方も教えていただきました。ありがとうございます!

```cpp
    //ソート(昇順)
    sort(std::begin(vec), std::end(vec));
    sort(std::begin(arr), std::end(arr));
    sort(std::begin(x), std::end(x));
    //ソート(降順)
    sort(std::rbegin(vec), std::rend(vec));
    sort(std::rbegin(arr), std::rend(arr));
    sort(std::rbegin(x), std::rend(x));
```
vector,array,配列ともに同じ書き方でソートできて使いやすそうです。
[JS]thisのややこしさに終止符を打つ。

# はじめに
JavaSctiptに苦手意識がついてしまった原因が何を隠そう「this」です。初心者のうちは特に理解できずに苦しみました。しかし、重要な概念であるため、これをおざなりにしてはいけないと思い、学習してなんとか理解することが出来ましたので、自分と同じ境遇の人に共有します。。

# thisとは
thisとは、呼び出し元のオブジェクトへの参照を保持するキーワードのです。
thisの参照先は、同じ関数でも呼び出し方法が違えば、thisは異なるオブジェクトを参照します。
もう少し詳しく言うと、`関数(function)`を呼んだ時の`.`の前についているオブジェクトを指しているということです。(`.`が省略された場合はグローバルオブジェクトになります。)

```javascript
// 関数testを定義
function test() {
    console.log(this)
}

test() // => Window {frames: Window, postMessage: ƒ, ...}

// オブジェクトを定義
const animal = {
  name: 'dog',
  introduce: function() {
    console.log('The animal is ' + this.name); // ここでのthisは「animal」を指す
  }
}
animal.introduce();  // The animal is dog と出力
```

## bind
bindとは、強制的にあるオブジェクトと結びつけるものです。
第一引数には結びつけたいオブジェクトを指定し、第二引数以降は渡したい実引数を指定する。

```javascript
// thisをコンソールに出力する関数testを定義
function test() {
    console.log(this)
}

let obj = { name: "obj" }
let check = test.bind(obj) // testをobjに結びつける

test() // Window {frames: Window, postMessage: ƒ, ...}
check() // => {name: "obj"}
```

## callとapply
callやapplyを使って関数を呼び出すとオブジェクトの指定と同時に関数を実行することが出来る。
第一引数には結びつけたいオブジェクトを指定し、第二引数以降は渡したい実引数を指定する。

```js
// thisをコンソールに出力する関数testを定義
function test() {
    console.log(this)
}

let obj = { name: "obj" }
test() // Window {frames: Window, postMessage: ƒ, ...}
test.call(obj) // => {name: "obj"}
```

## アロー関数
アロー関数とはES6から使用できる、無名関数を省略化して記述する記法のことです。

```js
// 無名関数の場合
const greet = {
  hello: function() {
    console.log('hello');
  }
}

// アロー関数の場合
const greet = {
  hello: () => {
    console.log('hello');
  }
}

greet.hello(); // 'hello'
```

### 無名関数とアロー関数の違い
下記の表を見たら分かる通り、アロー関数では使えない機能があります。省略記法といっても全く同じように使えるわけでは無いことを理解しておく必要があります・

|  | 無名関数 | アロー関数 |
|:-:|:-:|:-:|
| this  | ○  | ×  |
| arguments  | ○  | ×  |
| new  | ○  | ×  |
| prototype  | ○  | ×  |

# 終わりに
少しは`this`に対する苦手意識は薄れましたでしょうか？
苦手だと思っているものはなかなか頭が働きませんが、一つ踏み出せれば理解できる日が来ると思うので、共に頑張りましょう！

# 参考
[JavaScript の this を理解する多分一番分かりやすい説明]
(https://qiita.com/takkyun/items/c6e2f2cf25327299cf03)

[【JavaScript】thisを弄ぼう]
(https://qiita.com/Yu-8chan/items/929805a62dcea8c9b16c#bind%E3%81%A8this)
Raspberry PiでNode-REDを利用してみる①

Node-RedをRaspberry Pi ZERO WHで使ってみる。



手順をメモ
#Node-Redインストール

Node-RED User Group Japanのドキュメントを参考にインストール
  https://nodered.jp/docs/getting-started/raspberrypi

```
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501219/c625b736-a1cd-0e52-8617-c2c16d58b9c5.png)

簡単にインストールできた.
##エディタを起動
ローカルでNode-REDを実行する場合、 ターミナルでnode-redコマンドを使うことでNode-REDを起動することができます。 そして、Ctrl-Cを押すかターミナルウィンドウを閉じることで停止することができます。
```
node-red
```
メニューオプションMenu -> Programming -> Node-REDを選択することによって、 Raspbian DesktopでNode-REDサービスを起動することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501219/4a4946af-f8c2-d511-01ca-5b08254a84ec.png)


## エディタを開く
いったんNode-REDを実行したら、ブラウザでエディタにアクセスすることができます。

Raspberry Piデスクトップでブラウザを利用している場合、以下のアドレスでエディタを開くことができます: http://localhost:1880

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501219/ef125446-cd27-2b82-00cc-8d4fec92664c.png)

##起動時に自動起動する
Raspberry Piの電源がついたとき、またはブート時にNode-REDを起動させたい場合、 以下のコマンドを実行することでサービスを自動起動させることができます。
```
sudo systemctl enable nodered.service
```
サービスを無効にするため、以下のコマンドを実行
```
sudo systemctl disable nodered.service
```
PostgreSQL9.5 to 11.12 pg_upgrade

###はじめに
 古いPostgreSQLのアップグレードを検証したかった。

　今回、以下で検証する。
　OS:CentOS 6.7
　旧：PostgreSQL 9.5
　新：PostgreSQL 11.2
　アップグレード方法：pg_upgradeコマンドを使用する

 PostgreSQL 9.5はインストール済みとする
　※インストール方法は以下を参照
 https://qiita.com/xyz666/items/7dd59821659b130b0393

###PostgreSQL 11.2のインストール

####1.必要ファイルダウンロード

以下の３つ
　・libs
　・sql
　・Server

```
wget https://yum.postgresql.org/11/redhat/rhel-6-x86_64/postgresql11-libs-11.12-1PGDG.rhel6.x86_64.rpm
wget https://yum.postgresql.org/11/redhat/rhel-6-x86_64/postgresql11-11.12-1PGDG.rhel6.x86_64.rpm
wget https://yum.postgresql.org/11/redhat/rhel-6-x86_64/postgresql11-server-11.12-1PGDG.rhel6.x86_64.rpm
```
####2.インストール

```
rpm -Uvh postgresql11-libs-11.12-1PGDG.rhel6.x86_64.rpm
rpm -Uvh postgresql11-11.12-1PGDG.rhel6.x86_64.rpm
rpm -Uvh postgresql11-server-11.12-1PGDG.rhel6.x86_64.rpm
```
####3.初期化と起動確認

・初期化	

```
service postgresql-11 initdb
```

・起動
 `service postgresql-11 start`
・終了
 `service postgresql-11 stop`

####旧DBのアップグレード

・3-1 両バージョンのDBが停止していることを確認する

```
service postgresql-9.5 status
service postgresql-11 status
```

・3-2 rootでは実行できないのでpostgreユーザにスイッチする

```
su - postgres
```

・3-3 pg_upgrade 実行する

【参考】コマンドの書式確認
　pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir

　oldbindir ：旧バージョンのディレクトリ
　newbindir ：新バージョンのディレクトリ
　olddatadir：旧バージョンのデータディレクトリ
　newdatadir：新バージョンのデータディレクトリ

```
/usr/pgsql-11/bin/pg_upgrade -b /usr/pgsql-9.5/bin -B /usr/pgsql-11/bin -d /var/lib/pgsql/9.5/data -D /var/lib/pgsql/11/data
```

↓実行例
-bash-4.1$ /usr/pgsql-11/bin/pg_upgrade -b /usr/pgsql-9.5/bin -B /usr/pgsql-11/bin -d /var/lib/pgsql/9.5/data -D /var/lib/pgsql/11/data
整合性チェックを実行しています。
Checking cluster versions                                   ok
Checking database user is the install user                  ok
~省略~
このポイントの後に pg_upgrade が失敗した場合、続行の前に再度 initdb を行って、
新しいクラスターする必要があります。

アップグレードを実行しています。
Analyzing all rows in the new cluster                       ok
Freezing all rows in the new cluster                        ok
~省略~
Creating script to delete old cluster                       ok
Checking for hash indexes                                   ok

アップグレードが完了しました
オプティマイザーの統計は、pg_upgrade では転送されません。そのため
新サーバーを起動した後、./analyze_new_cluster.sh を動かすことを検討してください 。
このスクリプトを実行すると、旧クラスターのデータファイル ./delete_old_cluster.shが削除されます:

####4.動作確認

4-1. postgresql-11.12の起動

`service postgresql-11 start`

4-2.DB接続

`psql`

4-3.データ確認

`select * from テーブル名;`

####注意点
設定ファイルの移行は未確認。
特に以下の2点は検証が必要
postgresql.conf
pg_hba.conf


以上


###参考サイト
・公式
https://www.postgresql.jp/document/9.5/html/pgupgrade.html
・【PostgreSQL 9.4 → 11】pg_upgradeでデータベースクラスタをバージョンアップ
https://tech-blog.rakus.co.jp/entry/20190829/postgresql

###履歴
2021/8/1 作成
【GoogleColabでスクレイピング】StaleElementReferenceExceptionがdriver.implicitly_wait()を追加しても解決しないとき

こんにちは！
GASを使った業務改善に夢中の初心者プログラマー太郎です。

最近、Google Colaboratoryをよくいじるのですが、Seleniumを用いてスクレイピングをしていてかなり困ったことがありました。

エラーの内容は
`StaleElementReferenceException: Message: stale element reference: element is not attached to the page document`
と、スクレイピングをしていれば頻繁に出会うものでした。

これはつまり、
「ページ内容の読み込みを完了する前に、スクレイピングしようとしちゃってるよ！読み込みが完了するまで待ってね！」ということを要請しているエラーなのです。

このような場合、

```python
driver.implicitly_wait(10)
```
などでページの読み込みを待つのが定石です。
ただ、なぜか今回は、原因と思しきあらゆる箇所に上記の読み込み待ちをするコードを挿入しても解決しませんでした。

困って困っていろいろ調べても出てこなくて、3時間くらい費やしたのですが、ふと、、、
「読み込みを待つ云々の問題じゃなく、そもそもボタンをクリックする速度が速すぎるんじゃない？」
と思い立ちました。

`driver.implicitly_wait()`自体は読み込みが完了するまで待つ。逆に言えば、読み込みが一瞬で終わってしまったらすぐに次の動作に行く、ということなので、この速度をスクレイピング対象のサイトが嫌がったのではないかとと考えたわけです。

そこで、ページの読み込みを少しスローにしてあげようと思い立ち、、、

```python
import time
time.sleep(1)
```
気になった箇所にとりあえず1秒間休み時間を入れました。

すると、無事解決！！！

スクレイピングする速度自体を落としてあげることが解決につながりました！

スクレイピングをするときには
**読み込みの完了を待つ**だけでなく、**スクレイピングを行う速さも考慮に入れてあげる必要がある**んですね。

ネットで調べても、`StaleElementReferenceException`が出た時の対処法は`driver.implicitly_wait()`で待つ方法しか見つからなかったので、今回の記事がどなたかのお役に立てると幸いです。
laravel Class 'ZipArchive' not foundエラー

laravelでExcelにあるデータをインポートしようとしたら
「Class 'ZipArchive' not foundエラー」が出ました。

内容的には「ZipArchiveというクラスが無いです！」と言っています。

しかし、
どこにZipArchiveというクラスをインストールしたら良いのか？
などエラー解決に時間がかかったのでメモに残したいと思います。


![スクリーンショット 2021-08-01 10.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/b2f36930-1138-a65e-b9c3-8c9dea32d0fd.png)

#開発環境
MacOSにLinuxの環境を作り、
Dockerを立ててlaravelを動かしている感じです。
![スクリーンショット 2021-08-01 10.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/43ad707d-b956-65a0-f27a-f40557c8cc1d.png)

#実装
まずphp -mでモジュールがあるか確認してください。
※php -m (モジュールの一覧を表示)


```
■MacOS
ユーザー名@コンピュータ名 docker-on-vagrant %php -m

■Linux
[vagrant@local-docker docker-laravel]$php -m

■Docker Webコンテナ内
[root@3ab4e8805629 html]# php -m
```

今回はDocker Webコンテナ内にzipモジュールをインストールすることで解決できました。

zipインストール

```
[root@3ab4e8805629 html]#　yum install --enablerepo=remi,remi-php72 php-pecl-zip
```

DockerのWebコンテナ再起動

```
docker restart apache-php  
```
もう一度Docker Webコンテナ内に戻り　php -mを試してください。
zipがインストールされていてエラーが解決できると思います。
※docker-compose downにするとzipモジュール消えます



今回はこの方法でzipをインストールしましたが、docker-compose downすると毎回zipをインストールしないといけないので
Dockerファイルにzipをインストールする記述を書いた方がいいとも感じました。

またおいおい書いていこうかと思います。
FriendsOfFlarum/webhooksでUTF-8エンコードエラーが発生するときに読むメモ

## 前提条件
- Flarum v1.0.4
- FriendsOfFlarum/webhooks v1.0.3 https://github.com/friendsofflarum/webhooks

## 発現環境
- Discord Webhooks 使用時

## エラーが発生する原因
- Webhook送信部分に、フォーラム名をトリミングする処理が実装されている。
- 日本語等マルチバイト文字が考慮されていないため、ゴミ文字が発生してしまう。

https://github.com/friendsofflarum/webhooks/blob/master/src/Adapters/Discord/Adapter.php#L44

## 確認･修正すべきファイル
- src/Adapters/Discord/Adapter.php
- 当該実装の除去
MySQLのコマンドラインでユーザー設定

#最初に
##MySQLのコマンドラインで入力をキャンセルする方法
```.sql
mysql> \c
mysql> ^C
```
\cを入力するか、Ctrl+Cでキャンセルできます。

##作成済みのユーザーを確認する
```.sql
select user, host from mysql.user;
```


##現在接続しているユーザーを確認する
```.sql
select user(), current_user();
```

#ユーザーを作成する

###パスワードなしのユーザーを作る
```.sql
CREATE USER user;
```

###パスワードありのユーザーを作る
```.sql
CREATE USER user IDENTIFIED BY 'password';
```

###ユーザー名・パスワード・ホスト名の設定されたユーザーを作る
+ ユーザー名 ：user
+ ホスト名 : localhost
+ パスワード : password


```.sql
create user `user`@`localhost` IDENTIFIED BY 'password';
```

###ユーザーの権限を確認する
```.sql
show grants for user@localhost;
--show grants for ユーザー名@ホスト名
```
```.sql
mysql> show grants for user@localhost;
+------------------------------------------+
| Grants for user@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `user`@`localhost` |
+------------------------------------------+
1 row in set (0.00 sec)
```
USAGE という権限は「何も権限がない」という権限です。




###ユーザーにDB操作権限を与える

+ 対象 ：user@localhost

```.sql
grant create on *.* to user@localhost;
```
```.sql
mysql> show grants for user@localhost;
+-------------------------------------------+
| Grants for user@localhost                 |
+-------------------------------------------+
| GRANT CREATE ON *.* TO `user`@`localhost` |
+-------------------------------------------+
1 row in set (0.00 sec)
```
CREATE になりました。


####特定のDBの権限を与える

```.sql
grant create on sampleDB.* to user@localhost;
-- grant create on データベース名.* to ユーザ名@localhost;
```
もっと詳しく権限を設定できます。
[ユーザーに権限を設定する(GRANT文)](https://www.dbonline.jp/mysql/user/index6.html)


#ユーザーを消す
```.sql
drop user user;
--drop user ユーザー名;
```


#参考HP
https://www.dbonline.jp/mysql/user/index1.html
https://www.dbonline.jp/mysql/user/index4.html
https://qiita.com/ysti/items/b4a84691c357167c89c2
https://www.dbonline.jp/mysql/user/index6.html
3.12(標準) ラプラス分布

Xの期待値は，

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[X]&= \int_{-\infty}^\infty\exp\{-\frac{|x-\mu|}{\sigma}\}dx\\
&= \int_{-\infty}^\mu\frac{x}{2\sigma}\exp(\frac{x-\mu}{\sigma}dx+\int_{\mu}^\infty \frac{x}{2\sigma}\exp(-\frac{x-\mu}{\sigma})dx\\
&= \int_{-\infty}^\mu\frac{x}{2}\{\exp(\frac{x-\mu}{\sigma})\}'dx+\int_\mu^\infty\frac{x}{2}\{-\exp(\frac{x-\mu}{\sigma})\}'dx\\
&= \left[\frac{x}{2}\exp(\frac{x-\mu}{\sigma})\right]_{-\infty}^\mu-\int_{-\infty}^\mu\frac{1}{2}\exp(\frac{x-\mu}{\sigma})dx\\
& \ \ \ +\left[-\frac{x}{2}\exp(-\frac{x-\mu}{\sigma})\right]_\mu^\infty+\int_\mu^\infty\frac{1}{2}\exp(-\frac{x-\mu}{\sigma})dx\\
&= \mu-\frac{\sigma}{2}+\frac{\sigma}{2}\\
&= \mu 
\end{align}
```

分散は，

```math
\begin{align}
Var(X)&= \int_{-\infty}^\infty\frac{(x-\mu)^2}{2\sigma}\exp\{-\frac{|x-\mu|}{\sigma}\}dx\\
&= \int_{-\infty}^\mu\frac{(x-\mu)^2}{2\sigma}\exp(\frac{x-\mu}{\sigma})dx\\
&\ \ \ +\int_\mu^\infty\frac{(x-\mu)^2}{2\sigma}\exp\{-\frac{(x-\mu)}{\sigma}\}dx\\
&= \int_{-\infty}^\mu\frac{(x-\mu)^2}{2}\{\exp(\frac{x-\mu}{\sigma})\}'dx\\
&\ \ \ -\int_\mu^\infty\frac{(x-\mu)^2}{2}\{\exp(\frac{-x+\mu}{\sigma})\}'dx\\
&= \left[\frac{(x-\mu)^2}{2}\exp(\frac{x-\mu}{\sigma})\right]_{-\infty}^\mu-\int_{-\infty}^\mu(x-\mu)\exp(\frac{x-\mu}{\sigma})dx\\
&\ \ \ -\left[\frac{(x-\mu)^2}{2}\exp(\frac{-x+\mu}{\sigma})\right]_\mu^\infty+\int_\mu^\infty(x-\mu)\exp(\frac{-x+\mu}{\sigma})dx\\
&= -\int_{-\infty}^\mu(x-\mu)\exp(\frac{x-\mu}{\sigma})dx+\int_\mu^\infty(x-\mu)\exp(\frac{-x+\mu}{\sigma})dx\\
&= -\int_{-\infty}^\mu\sigma(x-\mu)\{\exp(\frac{x-\mu}{\sigma})\}'dx-\int_\mu^\infty\sigma(x-\mu)\{\exp(\frac{-x+\mu}{\sigma})\}'dx\\
&= -\left[\sigma(x-\mu)\exp(\frac{x-\mu}{\sigma})\right]_{-\infty}^\mu+\int_{-\infty}^\mu\sigma\exp(\frac{x-\mu}{\sigma})dx\\
&\ \ \ -\left[\sigma(x-\mu)\exp(\frac{-x+\mu}{\sigma})\right]_\mu^\infty+\int_\mu^\infty\sigma\exp(\frac{-x+\mu}{\sigma})dx\\
&= \left[\sigma^2\exp(\frac{x-\mu}{\sigma})\right]_{-\infty}^\mu+\left[\sigma^2\exp(\frac{-x+
\mu}{\sigma})\right]_\mu^\infty\\
&= 2\sigma^2
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Android Studioを日本語化する（トラブルシューティング付き）

# はじめに

Android Studioを日本語化する手順をトラブル・解決方法と合わせて記載します。

:::note
2022/3/20
「Android Studio Bumblebee | 2021.1.1 Patch 2 for Mac」で使う日本語言語パックのリンクを追加。
:::

# 環境

* macOS 11.4
* Android Studio Arctic Fox | 2020.3.1

# 日本語化手順

## Android Studioをインストールする。

↓からダウンロードしてインストールします。

https://developer.android.com/studio?hl=ja

## 日本語化プラグインをインストールする。

### 【トラブル】日本語化プラグインが見つからない。

Android Studioで日本語化プラグインを検索しても出てきません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/a4cfa828-23f5-8d54-27e5-dc93cb9e6c14.png)

### 【解決方法】JET BRAINS Marketpalceからダウンロードしてインストールする。

下記リンクから **Japanese Language Pack / 日本語言語パック 203.701** をダウンロードします。  

https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions/stable/120409

:::note
Android Studio Bumblebee | 2021.1.1 Patch 2 for Mac の場合は、**Japanese Language Pack / 日本語言語パック 211.303**をダウンロードします。
https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions/stable/128311
:::

Android Studioのプラグイン画面で「Install Plugin from Disk」をクリックしダウンロードしたja.203.701.jarを選択してインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/48b58e6c-2ca1-c9ac-81d8-7ef51b4304fc.png)

「Restart IDE」をクリックしてAndroid Studioを再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/0e11431e-423c-5cad-1d8c-8e514a97ff66.png)

### 【トラブル】文字が□（四角）で表示される

なんだか文字が□（四角）になっています。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/28e91def-33a8-02fa-6a14-50dd5711ef00.png)

### 【解決方法】

一旦、日本語プラグインをOFFにします。

[Android Studio]メニューの[Preferences]を開き、[Appearance & Behavior] - 
Appearance]にある「Use custom font」チェックボックスをONにします。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/eb862e72-ff5b-58cc-381b-0e009acec2fe.png)

日本語プラグインをONにしてAndroid Studioを再起動すると日本語になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/c59a68e0-5c31-2875-3dc5-a5dcd128eb38.png)
テスト技法ツールGIHOZのペアワイズテストの組み合わせ網羅度合いを可視化するツール

# はじめに
[テスト技法ツールGIHOZ] (https://www.veriserve.co.jp/gihoz)のペアワイズテストで作成した組み合わせ結果を入力として、組み合わせの網羅度合いを可視化するツールを作ってみました。この記事ではそのツールを紹介します。
ペアワイズテストは入力パラメータの組み合わせを作るテスト技法で、2つのパラメータ間の値の組み合わせを網羅できます。オールペア法とも言いますが、この記事ではGIHOZの表記にならってペアワイズテストと記載します。

# ツールの概要
ペアワイズテストの組み合わせ生成結果から、2パラメータ間の組み合わせの網羅度合いを可視化するためのツールです。縦軸と横軸にパラメータと値を並べたマトリクスを生成し、マトリクスの交点にあたる組み合わせが何回登場しているかを可視化することができます。具体的には、以下のような表を生成します。この表を何と呼ぶのが正しいのか分かりませんが、「総当たり表」と呼ばれることもあるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188690/925632bd-4bad-b268-34b5-dbe1857edc9a.png)

GIHOZの組み合わせ生成結果を信じるのであれば総当たり表は特に必要ないですが、第三者などから「本当に2パラメータ間の組み合わせの網羅ができているの？」と問われたときや、制約をかけて組み合わせ生成したときに思った通りの組み合わせ結果になっているか不安なときなどに、総当たり表を見ることで、組み合わせの網羅度合いを確認できます。

# ソースコード・動作確認環境
ソースコードは[GitHubのリポジトリ] (https://github.com/ktanizaki/gihoz-utilities)で公開しています。
以下の環境で動作することを確認しました。

* OS: Windows10
* 言語: Python 3.9.5

# 使い方

まずPython3をインストールし、次にpandasというライブラリをインストールします。pandasはpipコマンドが使える方は以下のコマンドでインストールできます。Anacondaなどをご利用の方はご自分でコマンドを調べてください。

```
$ pip install pandas
```

ここまでで環境の準備は完了です。
GIHOZのペアワイズテスト画面で、適当に組み合わせを生成して、結果をcsvファイルとしてダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188690/45aa5f29-540f-1784-6da6-8091f9773962.png)

上記のGitHubのリポジトリからソースコードをダウンロードして、コマンドプロンプトやPowerShellでソースコードの保存先を開いて、以下のコマンドを打てば実行できます。

```
$ python check_combinations.py [ペアワイズテストのCSVファイル名]
```

[ペアワイズテストのCSVファイル名]は、GIHOZからダウンロードした直後は`Pair-wise_generated-results_yyyy-mm-dd.csv`といったファイル名になっています。（`yyyy-mm-dd`の部分はダウンロードした日付です）

実行に成功するとchecked.csvという名前のファイルが生成されます。
checked.csvを開いてそのまま数字を確認しても良いですが、Excelで開いて条件付き書式のカラースケールを指定すると、どの組み合わせがどの程度登場したか、視覚的に確認できます。対角線上のセルは、同じパラメータ同士の組み合わせは存在しないので「0」になっており、カラースケールで赤くなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188690/11acfd6e-d7cc-4b9c-99f2-87e5f06af284.png)

適当に制約をかけて組み合わせ生成した結果から総当たり表を作成すると、対角線上以外にも、登場しない組み合わせが存在することが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188690/159934a5-b804-16e9-5815-c52cd7b9ce24.png)

# おわりに
GIHOZのペアワイズテストの生成結果から組み合わせの網羅度合いを可視化するツールを作ってみた、という記事でした。ペアワイズテストのツールとして有名な「PICT」で組み合わせを生成した際にも、結果をcsv形式で保存してやれば、このツールで同じように網羅度合いを可視化できます。様々なパラメータを組み合わせてテストを行う際の一助になればと思います。
Macのdateコマンドで週の開始日(weekday)を取得する

# Macのdateコマンドでは-dオプションが利用できない

忘れた頃にハマる。。
週の開始日なども取得できないので、関数を作成した。

# 週の開始日を取得する関数

```bash
#!/bin/bash

######################################################################
# 週の開始日を返却するfanction
# 引数
# 1:指定あり→指定日を起点に返却　指定なし→実行日を起点に返却
# return
# sdate=指定日
# sb1date=指定日の前日
# wname=指定日の曜日
# wdate=指定日の週の開始日（日曜はじまり）
# w1date=指定日の週の開始日（月曜はじまり）
######################################################################

function weekday(){

  # 引数で指定日があればそれを利用、なければ実行日を利用する
  if [[ "$1" ]]
    then
      sdate=$(date -j -f "%Y-%m-%d" "$1" +"%Y-%m-%d")
    else
      sdate=$(date +"%Y-%m-%d")
  fi
  sb1date=$(date -j -v-1d -f "%Y-%m-%d" "$sdate" +"%Y-%m-%d")
  wname=$(date -j -f "%Y-%m-%d" "$sdate" +"%w")
  wdate=$(date -j -v-"$wname"d -f "%Y-%m-%d" "$sdate" +"%Y-%m-%d")
  w1date=$(date -j -v+1d -f "%Y-%m-%d" "$wdate" +"%Y-%m-%d")
  echo $sdate $sb1date $wname $wdate $w1date

}

weekday $1

```

# 利用方法
$ sh weekday.sh 2021-6-9
2021-06-09 2021-06-08 3 2021-06-06　2021-06-07

左から
- 引数の日付
- 引数の前日
- 曜日
- 週の開始日の日付（日曜はじまり）
- 週の開始日の日付（月曜はじまり）


## 参考
https://nonoichi123.hatenablog.com/entry/mac%25e3%2581%25a7date%25e3%2582%25b3%25e3%2583%259e%25e3%2583%25b3%25e3%2583%2589%25e3%2582%2592%25e4%25bd%25bf%25e3%2581%2584%25e3%2581%2593%25e3%2581%25aa%25e3%2581%2599/

https://qiita.com/___uhu/items/3c2312359da542cda163

https://mac-ra.com/mac-shellscript-yobi/