OmniAICreator/Qiita-1.07M huggingface dataset:
abc 089

B
日本では、3 月 3 日にひなあられという、色のついたお菓子をお供えする習慣があります。
1 つの袋があり、ひなあられが N 個入っています。
この袋には、桃色、白色、緑色の 3 種類か、桃色、白色、緑色、黄色の 4 種類のひなあられが入っていることが分かっています。
桃色を P、白色を W、緑色を G、黄色を Y と表したとき、袋からひなあられを 1 粒ずつ取り出していったところ、i 番目に取り出したひなあられの色は Si でした。
この袋に 3 種類のひなあられが入っていた場合は Three、4 種類のひなあられが入っていた場合は Four と出力してください。

```
#include<iostream>
#include<set>
using namespace std;
int main() {
	int N;
	cin >> N;
	char S;
	set<char>fuck;
	for (int i = 0; i < N; ++i) {
		cin >> S;
		fuck.insert(S);
	}
	if (fuck.size() == 3)
		cout << "Three";
	else
		cout << "Four";
	return 0;
}
```

C
N 人の人がいて、i 番目の人の名前は Si です。
この中から、以下の条件を満たすように 3 人を選びたいです。
全ての人の名前が M,A,R,C,H のどれかから始まっている
同じ文字から始まる名前を持つ人が複数いない
これらの条件を満たすように 3 人を選ぶ方法が何通りあるか、求めてください。ただし、選ぶ順番は考えません。
答えが 32 bit整数型に収まらない場合に注意してください。
制約
1≤N≤105
Si は英大文字からなる
1≤|Si|≤10
Si≠Sj(i≠j)

```
#include <iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
using ll = long long;
#define INF 1e9
int main() {
	ll N;
	cin >> N;
	string S;
	ll count[5] = { 0 };
	for (int i = 0; i < N; ++i) {
		cin >> S;
		if (S[0] == 'M')
			count[0]++;
		else if (S[0] == 'A')
			count[1]++;
		else if (S[0] == 'R')
			count[2]++;
		else if (S[0] == 'C')
			count[3]++;
		else if (S[0] == 'H')
			count[4]++;
	}
	ll ans = 0;
		for (int i = 0; i < 3; ++i) {
			for (int j = i + 1; j < 4; ++j) {
				for (int k = j + 1; k < 5;++k) {
					ans += count[i] * count[j] * count[k];
				}
			}
		}

	cout << ans << endl;
	return 0;
}
```
【備忘録】FireMonkey と VCL で使用できる色および色定数

FireMonkey と VCL で使用できる色および色定数を備忘録も兼ねて
ドキュメント上に色見本もあるので分かりやすいかな..と (クリックすると各ドキュメントページに遷移します)

## FireMonkey

- [FireMonkey での色](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/FireMonkey_%E3%81%A7%E3%81%AE%E8%89%B2) 
- [TColorRec](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/System.UITypes.TColorRec#.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E8.89.B2)

コードの記述例

```pascal
// uses に System.UITypes が存在する場合
Rectangle1.Fill.Color := TAlphaColorRec.Red;

// uses に Sysytem.UIConsts が存在する場合
Rectangle1.Fill.Color := claBlue;

// 16 進数で指定する場合 (Green) 
Rectangle1.Fill.Color := $FF008000;  
```

## VCL

- [VCL における色](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/VCL_%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%89%B2)
- [色定数](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E8%89%B2%E5%AE%9A%E6%95%B0)

コードの記述例

```pascal
// プロジェクトのオプションでランタイムテーマを無効にしないと反映されない場合があります
// VCL の場合、ランタイムテーマが有効だと Windows のテーマが使用されるため

// uses に Vcl.Graphics が存在する場合
Panel1.Color := clRed;

// 16 進数で指定する場合 (Green) 
Panel1.Color := $008000;  
```

## おまけ
色に直接関係するものではないのですが...
FireMonkey では[不透明度の Opacity](http://docwiki.embarcadero.com/Libraries/Tokyo/ja/FMX.Controls.TControl.Opacity) (値の範囲は 0 から 1)プロパティの値を変化させると、こんなことができます
![color01.gif](https://qiita-image-store.s3.amazonaws.com/0/164551/2f9305cd-3b6e-a4c9-a055-f803322bc405.gif)

このサンプルはRectangle.Opacity プロパティと TracBar1.Value をライブバインディングで結びつけ 0 <-> 1 に変化させることで不透明度を操作しています
Opacity プロパティの値が 0 に近づくと透明度が増して後ろにある青い丸がみえるというものです
abc 088

B
N 枚のカードがあります. i 枚目のカードには, ai という数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください. 

kisikan!!

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int N;
	int a;
	vector<int>V;
	cin >> N;
	for (int i = 0; i < N;++i) {
		cin >> a;
		V.push_back(a);
	}
	sort(V.begin(), V.end(),greater<int>());
	int Asum = 0;
	int Bsum = 0;
	for (int i = 0; i < N; i += 2) {
		Asum += V[i];
	}
	for (int i = 1; i< N; i += 2) {
		Bsum += V[i];
	}
	cout << Asum - Bsum << endl;
	return 0;
}
```
vectorは便利。

C
3×3 のグリッドがあります. 上から i 番目で左から j 番目のマスを (i,j) で表すとき, マス (i,j) には数 ci,j が書かれています.
高橋君によると, 整数 a1,a2,a3,b1,b2,b3 の値が決まっており, マス (i,j) には数 ai+bj が書かれているらしいです.
高橋君の情報が正しいか判定しなさい. 
制約
ci,j (1≤i≤3,1≤j≤3) は 0 以上 100 以下の整数

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int c[3][3];
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			cin >> c[i][j];
		}
	}
	bool can = false;
	if (c[1][0] - c[0][0] == c[1][1] - c[0][1]&&c[1][1]-c[0][1] == c[1][2] - c[0][2]
		&& c[2][0] - c[1][0] == c[2][1] - c[1][1] && c[2][1]-c[1][1] == c[2][2] - c[1][2]
		&& c[0][1] - c[0][0] == c[1][1] - c[1][0] &&c[1][1]-c[1][0] == c[2][1] - c[2][0]
		&& c[0][2] - c[0][1] == c[1][2] - c[1][1] &&c[1][2]-c[1][1] == c[2][2] - c[2][1]) {
		can = true;
	}
	if (can)
		cout << "Yes" << endl;
	else
		cout << "No" << endl;
	return 0;
}
```


```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
#define INF 1e9

int main() {
	int c[3][3];
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			cin >> c[i][j];
		}
	}
	int a[3], b[3];
	bool can = true;;
	for (int i = 0; i < 3; ++i) {
		a[i] = c[i][0] - b[0];
	}
	for (int i = 0; i < 3; ++i) {
		b[i] = c[0][i] - a[0];
	}
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			if (c[i][j] != a[i] + b[j])
				can = false;
		}
	}
	if (can)
		cout << "Yes";
	else
		cout << "No";
	return 0;
}
```
スマートな解法。AC。
Firebaseの設定ファイルを環境ごと(DEV/STG/PRO)で分けたいマン

# 概要
タイトルに全て書いてしまったが、FirebaseやらAPIの接続先とかをDEV/STG/PRO環境で別々にしたかったので調べたメモ

# 設定周り
今回このような形で分けられるように設定
この手の設定はぐぐると古い記事が出てきてしまうのだが、Xcode8以降は`Active Compilation Conditions`に設定するのが正解
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38677/cf787e6a-e94d-511d-372e-b1718496a8a1.png)

```swift
        #if DEBUG
            let fileName = "GoogleService-Info-dev"
        #elseif STAGING
            let fileName = "GoogleService-Info-stg"
        #else
            let fileName = "GoogleService-Info"
        #endif

        let filePath = Bundle.main.path(forResource: fileName, ofType: "plist")
        let fileopts = FirebaseOptions(contentsOfFile: filePath!)
        FirebaseApp.configure(options: fileopts!)

```

# おまけ
Staging向けの設定は、プロジェクトの下記debugから複製で作成した
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38677/2be0ac23-19af-9d3c-952d-81599bab40e8.png)

現状これ動いてるのか謎なんですが、変に動かれても気持ち悪いので変えておいた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38677/b32a1df2-a110-aa9c-405a-abc187b21e2d.png)

ちなみにnew schemaからこんな感じに環境ごとに設定をわけてるマン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/38677/06b80442-c4c0-1575-4b01-d4d7ed437448.png)


APIの場合はbaseURLを環境ごとに切り替える感じでやってます。
abc 087

B
あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。
同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

kisikan

```
#include<iostream>
using namespace std;
int main() {
	int A, B, C, X;
	cin >> A >> B >> C >> X;
	int ans = 0;
	for (int i = 0; i <= A; ++i) {
		for (int j = 0; j <= B; ++j) {
			for (int k = 0; k <= C; ++k) {
				if (500 * i + 100 * j + 50 * k == X)
					ans++;
			}
		}
	}
	cout << ans;
	return 0;
}
```
C
2×N のマス目があります。上から i 行目、左から j 列目 (1≤i≤2, 1≤j≤N) のマスをマス (i,j) と表すことにします。
あなたははじめ、左上のマス (1,1) にいます。 あなたは、右方向または下方向への移動を繰り返し、右下のマス (2,N) に移動しようとしています。
マス (i,j) には Ai,j 個のアメが置かれています。 あなたは移動中に通ったマスに置いてあるアメをすべて回収します。 左上および右下のマスにもアメが置かれており、あなたはこれらのマスに置かれているアメも回収します。
移動方法をうまく選んだとき、最大で何個のアメを回収できるでしょうか。
制約
1≤N≤100
1≤Ai,j≤100 (1≤i≤2, 1≤j≤N)

```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
#define INF 1e9

int main() {
	int N;
	cin >> N;
	int A[2][100];
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < N; ++j) {
			cin >> A[i][j];
		}
	}
	int ans = 0;
	for (int k = 0; k < N; ++k) {
		int sum = 0;
		for (int j = 0; j <= k; ++j) {
			sum += A[0][j];
		}
		for (int l = k; l < N; ++l) {
			sum += A[1][l];
		}
		ans = max(sum, ans);
	}
	cout << ans << endl;
	return 0;
}
```
```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int INF = 1e9;
int main() {
	int N;
	cin >> N;
	int A[3][110];
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < N; ++j) {
			cin >> A[i][j];
		}
	}
	int dp[3][110];
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < N; ++j) {
			dp[i][j] = 0;
		}
	}
	dp[0][0] = A[0][0];
	for (int i = 0; i < 2; ++i) {
		for (int j = 0; j < N; ++j) {
			dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + A[i + 1][j]);
			dp[i][j + 1] = max(dp[i][j + 1], dp[i][j] + A[i][j + 1]);
		}
	}
	cout << dp[1][N - 1] << endl;
	return 0;
}
```
もちろんdpでもできる
MAC環境にAnsible導入後、AWSサービス構築までの道〜⑤API Gateway〜

第5回
AnsibleでAPI Gatewayを構築し、Lambdaポリシーの設定を行う。
API Gatewayのモジュールは提供されているようですが、新規構築ができないのでは？と思い、今回はaws apigatewayコマンドを使用して構築を行う。

## やりたいこと
1. 既存のAPIからクローン
2. API情報を取得し、Lambda function名を変更
3. ステージの作成
4. Lambdaポリシー追加（トリガーの追加）  
===khskさんスペルミスの指摘ありがとうございました！(10/11追記)===

## create_apigateway.yml作成
変数化できる部分はvars_filesにまとめています。

```create_apigateway.yml
# aws apigateway create-rest-apiにて作成
# --clone-from {{ gateway_id }}　　でClone元のgateway_idを指定する
- name: Create RestApi
  shell: aws apigateway create-rest-api --name '{{ prefix }}-{{ project_name }}-image-resize' --description '{{ prefix }}-{{ project_name }}-image-resize' --clone-from {{ gateway_id }}
  register: api_info

# aws apigateway情報を変数に代入
- name: Set Api Info
  set_fact: api_info_json="{{ api_info.stdout | from_yaml }}"

# Resources情報の取得
- name: Get Resources
  shell: aws apigateway get-resources --rest-api-id "{{ api_info_json.id }}"
  register: resources_info

- name: Set Api Info
  set_fact: resources_info_json="{{ resources_info.stdout }}"

# Lambda Function名の変更（事前に作成したLambda関数名を指定）
- name: Update Lambda Function
  shell: aws apigateway update-integration --rest-api-id "{{ api_info_json.id }}" --resource-id "{{ resources_info_json['items'].1.id }}" --http-method GET --patch-operations op='replace',path='/uri',value='arn:aws:apigateway:{{ region_east }}:lambda:path/2015-03-31/functions/arn:aws:lambda:{{ region_east }}:{{ account_id }}:function:{{ prefix }}-{{ project_name }}/invocations'

# ステージ作成
- name: Create Stage (API Deploy)
  shell: aws apigateway create-deployment --region "{{ region_east }}" --rest-api-id "{{ api_info_json.id }}" --stage-name '{{ stage_name }}'

# Lambdaポリシー追加（トリガーの設定）
# lambda_policyモジュールを使用
- name: Add Policy Lambda
  lambda_policy:
    aws_access_key: "{{ key }}"
    aws_secret_key: "{{ secret }}"
    region: "{{ region_east }}"
    state: "{{ state | default('present') }}"
    function_name: "{{ prefix }}-{{ project_name }}"
    statement_id: lambda-s3-myBucket-create-data-log
    action: lambda:InvokeFunction
    principal: "apigateway.{{ aws_domain }}"
    source_arn: "arn:aws:execute-api:{{ region_east }}:{{ account_id }}:{{ api_info_json.id }}/*/GET/*"
```


## 実行
以下コマンドにて実行。
「-vvv」をつけることで、詳細な実行ログが出力されます。
エラーが出ている際など、非常に助かるので常にオプション付与して実行しています！

```
ansible-playbook -vvv -i localhost, -c local create_apigateway.yml
```

##マネージメントコンソール確認
＜API Gateway＞
API Gatewayのリソース、ステージが作成されていることを確認。
またLambda function名が変更されていることを確認。

＜Lambda＞
トリガーにAPI Gatewayが追加されていること。

## 感想
Lambdaのトリガーを設定するところで結構苦戦しました。
しっかりと仕組みを理解していないとダメですね…
t2インスタンスからt3インスタンスへインスタンスタイプの変更　失敗談

## 環境
- CentOS7 7.4.1708
- t2.micro

## 手順

### 事前確認作業
- OS側の対応確認

```$ modinfo ena
```

- ENAに対応済か

```
aws ec2 describe-instances --instance-id i-**** --query 'Reservations[].Instances[].EnaSupport'
```
 - Trueが返ってくるので有効化が完了している


### AMIのバックアップ作成
- インスタンスを停止して、マネージメントコンソールから右クリック、「イメージの作成」で完了


## トラブル
- ステータスチェックで「初期化しています」が5分ほど続く
- 「1/2のチェックに合格しました」で警告が出る
- ssh/ping通じず
- マネージメントコンソールから「システムログを取得」
 - Emergency Modeに入ってしまっている

## トラブルシューティング（10/10 アップデート）
- Elastic IPとの関連を外してみた
 - ×関係無し
- t3.microへの変更を辞めて、m5.largeに変更してみた
 - ×関係無し
- バックアップで取得したAMIからt3.microの起動
 - xこちらも同じ症状
- フォーラムを見ても情報が無い、、、

-----

- コメント頂いた下記を参考に、dracutの設定を変更 　(yuuitiro様ありがとうございます！！）
 - http://t-cyrill.hatenablog.jp/entry/2018/04/18/091832
 - xこちらを試しても同じ症状

- 起動時のサービスに当たりをつけて、ログを再チェック
```
[[1;33mDEPEND[0m] Dependency failed for File System Check on /dev/xvdb.
[[1;33mDEPEND[0m] Dependency failed for /mnt/www.
[[1;33mDEPEND[0m] Dependency failed for NFS server and services.
[[1;33mDEPEND[0m] Dependency failed for NFSv4 ID-name mapping service.
[[1;33mDEPEND[0m] Dependency failed for NFS Mount Daemon.
[[1;33mDEPEND[0m] Dependency failed for Local File Systems.
[[1;33mDEPEND[0m] Dependency failed for Migrate local... structure to the new structure.
[[1;33mDEPEND[0m] Dependency failed for Relabel all filesystems, if necessary.
```
 - fstabおまえか！fstabを無効にして、t3へインスタンス変更
 - 起動OK！
 - 起動後のドライブの状況を確認　/dev/xvda、/dev/xvd1、/dev/xvdbが無くなってる事を確認
 - dfでボリューム名が何になってるか確認 /が/dev/nvme0n1p1になってる！
 - fstabに/dev/nvme1n1を既存のフォルダにマウントで完了！
- 新世代SSDはNVMeになるのですね。


## 参考
ステータスチェックに失敗したインスタンスのトラブルシューティング
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/TroubleshootingInstances.html

カスタムして作った CentOS7.4 をAWSの M5, C5 で動かすときに落ちた沼について書いておく
http://t-cyrill.hatenablog.jp/entry/2018/04/18/091832

NVMe をわかりやすく解説します
https://tintri.co.jp/blog/2017/03/nvme
abc 086

B
シカのAtCoDeerくんは二つの正整数 a,b を見つけました。 a と b をこの順につなげて読んだものが平方数かどうか判定してください。

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string a, b;
	cin >> a >> b;
	string S;
	S = a + b;
	int s = stoi(S);
	for (int i = 1; i <= 1000; ++i) {
		if (s == i * i) {
			cout << "Yes";
			return 0;
		}
	}
	cout << "No";
	return 0;
}
```

C
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻 ti に 点 (xi,yi) を訪れる予定です。
AtCoDeerくんが時刻 t に 点 (x,y) にいる時、 時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。 その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。
制約
1 ≤ N ≤ 105
0 ≤ xi ≤ 105
0 ≤ yi ≤ 105
1 ≤ ti ≤ 105
ti < ti+1 (1 ≤ i ≤ N−1)
入力は全て整数

既視感of既視感
だけど解けなかった草。そうか偶奇に着目か。アホ～～

```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
#define INF 1e9

int main() {
	int N;
	int t[100005], x[100005], y[100005];
	cin >> N;
	t[0] = x[0] = y[0] = 0;
	for (int i = 1; i <= N; ++i) {
		cin >> t[i] >> x[i] >> y[i];
	}
	bool can = true;
	for (int i = 0; i < N; ++i) {
		int dt = t[i + 1] - t[i];
		int dist = abs(x[i + 1] - x[i]) + abs(y[i + 1] - y[i]);
		if (dt < dist)can = false;
		if (dist % 2 != dt % 2)can = false;
	}
	if (can)cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}
```
マイルストーン

#そこにあるのは石か？

いつからだっただろうか、Qiitaにマイルストーンが表示されるようになったのは？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/1ff78e23-2c5a-57dd-3d35-e5343a5789ff.png)

ふむふむ、どうやらリアルタイムに**いいね**が10、100、300の投稿が新着順に確認できるようだ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267629/3475245e-6685-914c-d22f-c40980d58280.png)


#つまり
さっきまでそこに無かったはずの石が、隙間に突然現れたかのようである
**間入る、ストーン！**



～～ しーんとするシーン ～～



**まあ居留守、とん**でもない！
YAML の要素を楽に取得・修正したい

**jq** って JSON をいじるには本当に便利で shell で済んじゃうような何かをする時には重宝してます。

ただ最近は YAML ファイルが頻繁に使われる状況なので jq のような奴の YAML 版が欲しいと思ってた。

PyPI に **yq** なるものがあった。

https://pypi.org/project/yq/

## How to `yq`

```bash
$ pip install yq

$ yq
usage: yq [-h] [--yaml-output] [--width WIDTH] [--version]
          jq_filter [files [files ...]]
yq: error: too few arguments

$ cat sample.yaml | yq '.'
{
  "version": "2"
}

$ cat sample.yaml | yq -y '.'
version: '2'
```

普通に使える！以上！

### 補足

- jq を入力無しに使う `jq -n '{}|.version = "2"'` のような `-n` オプションが yq では使えません (他にもあるかも)
- Mac で `brew install yq` とするとなんかインストールできるけど、上述の yq とは異なるツールなので注意
Google Apps Scripts によるGoogleフォームの選択式アンケートページの自動生成

# イントロダクション
## 背景
アンケート調査または審査の回答を収集する際、複数の会場やセッションごとにGoogle フォームの選択式(グリッド）ページを作成したい。しかし、Google フォームでは会場の入力や、発表番号の入力を誤る可能性がある。そこで、そもそもアンケート回答者に余計な入力はさせず、運営の方で全て管理する方針で調査を行う方針に沿わなければならないときがある。そこで、手作業では、若干の文字修正や画像修正の手間がかかるため、Google Apps Scripts を利用する。

## 目的
一部文章や画像が異なる、Google フォームの選択式(グリッド）ページを繰り返し文を利用して生成する。

## 目標
本ページでは次の画像のアンケートページを作成します。 本ページのソースコードを実行すると、「0000年00月00日」と'Aルーム', 「0000年00月00日」と'Bルーム', 「0000年00月01日」と'Aルーム',「0000年00月01日」と'Bルーム'の文字が変更された Google フォームが4つ生成されます。
 
![img3.jpg](https://qiita-image-store.s3.amazonaws.com/0/154819/90313ae4-6143-b763-13e5-58010b050c17.jpeg)


# ソースコード
本ページのソースコードは次の箇所を書き換えてから、実行してください。

 - 「ID1」 : Google ドライブの画像の共有リンクからIDを取得してください。本ページの例では審査の手順の画像に該当
 - 「ID2」 : Google ドライブの画像の共有リンクからIDを取得してください。本ページの例では審査項目の画像に該当
 
```javascript

// 画像のIDを入れる
var img1 = UrlFetchApp.fetch('http://drive.google.com/uc?export=view&id=ID1');
var img2 = UrlFetchApp.fetch('http://drive.google.com/uc?export=view&id=ID2');

function CEF(){
  // ある期間実施される
  var arr_Day = ['0000年00月00日','0000年00月01日'];
  // 複数の部屋がある
  var arr_Room = ['Aルーム', 'Bルーム'];

  for( var j = 0; j <= 1; j++){ // // ある期間実施される for
    for( var j2 = 0; j2 <= 1; j2++){ // 複数の部屋がある
    
      // Google フォームの大元のフォームを生成する
      var form = FormApp.create(arr_Day[j] + "の" + arr_Room[j2] +'のxx学会口頭発表審査');
      form.setDescription('ご不明な点がある場合はxxx実行委員にお尋ねください。');
    
      // Google フォームでは凝った形式の文章は作成できないので、画像として貼り付ける
      form.addImageItem()
      .setTitle('審査手順')
      .setImage(img1);

      // 誰が審査したのか？
      form.addTextItem().setTitle('お名前を記入してください。').setRequired(true);
      // setRequired()は入力を必須にするかどうかを決定

      // 審査方法も同様に入れる
      form.addImageItem()
      .setTitle('審査方法')
      .setImage(img2);
        
      for ( var i = 0; i <= arr_Room.length; i++){
        var gridItem = form.addGridItem();
        gridItem.setTitle(arr_Room[j2] + 'の' + i +'番号の審査項目')
        gridItem.setRows(['審査項目1', '審査項目2', '審査項目3']) // 審査項目を入れる
        gridItem.setColumns(['1', '2', '3', '4', '5']); // 5件法で調査
        var gridValidation = FormApp.createGridValidation()
        }
    }　 // 複数の部屋がある for end 
  } // ある期間実施される for　end
  
}

```

# 参考文献
- Google Apps Scripts リファレンス, https://developers.google.com/apps-script/reference/forms/image-item, 2018/10/10 アクセス
- Google Drive に保存した画像を直接呼び出せるURLの取得, https://qiita.com/arribux/items/0394968fa318d9309d33, 2018/10/10 アクセス
Vue.jsで処理中はボタンを無効にする

## 概要
処理を開始したら、二重処理を防ぐため、ボタンが押せないようにしたかったので調べた内容をメモしておく。

## 実装方法
調べたら、「v-bind:disabled」で動的に無効にしたり、有効に戻したりするのが楽そう♪。

```html
<button v-bind:disabled="isProcessing" @click="submit">何かしら処理する</button>
```

ただし、このためのコードを各コンポーネントに記述すると非効率なので、mixinを使って共通処理しようと思う。

## 実装したコード
ファイル構成は以下の２つとなりました。

```:ファイル構成
├ components
│  └ Register.vue
└ mixins
   └ processing.js
```
まず、mixinで共通処理化する。

```js:mixins/processing.js
export default {
  data() {
    return {
      processing: false
    }
  },
  methods: {
    startProcessing: function () {
      this.processing = true
    },
    endProcessing: function () {
      this.processing = false
    },
    isProcessing: function () {
      return this.processing
    }
  }
}
```
コンポーネント側で利用する。

```vue:components/Register.vue
<template>
  <div>
    <button v-bind:disabled="isProcessing()" @click="submit">何かしら処理する</button>
    <p>※押すと2秒間ロックされます</p>
  </div>
</template>

<script>
import Processing from '@/mixin/processing'

export default {
  mixins: [Processing],
  name: 'articleRegister',
  methods: {
    submit: function () {
      // ボタンのロックを開始する
      this.startProcessing()

      // 何かしらの処理...

      // 2秒待つのは、Ajaxなどの処理を擬似的に表現しています
      setTimeout(function () {
        // ボタンのロックを解除する
        this.endProcessing()
      }.bind(this), 2000)
    }
  }
}
</script>
```

## テスト
ボタンを押すと２秒間ボタンが無効になりました。
![test.png](https://qiita-image-store.s3.amazonaws.com/0/142279/c36b3203-1560-37a4-718e-5e003447c53b.png)

## まとめ
今回はmixinで実装したが、コンポーネントのメソッドとして追加されるのでプラグインなどにして、thisとは分離したいですね。
あと、処理に時間がかかる場合、「処理中...」などのnowloadingみたいな表示を共通処理に盛り込めたら全ページで共通に使えて便利かも。

## 参考サイト
* [Vue.jsでボタンをdisabledして押せなくする方法【:disabled】](http://www.sky-limit-future.com/entry/vue_disabled_btn)
* [[Vue.js] フォームの多重送信を防止する](https://qiita.com/ryo511/items/2563bb61b4b4d1be9619)
動的にxmlレイアウトを追加する。


久しぶりに使ったら軽くハマったので備忘録

**このエラーに軽く悩んだ**
Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.


```
LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.my_layout);
LinearLayout v = (LinearLayout)getActivity().getLayoutInflater().inflate(R.layout.custom_layout, null);

for (int i = 0; i < 10; i++) {
   linearLayout.addView(v);
}
```
と書いていたのだがこれだと「v」が一回目のforの中で親のレイアウトの管理下になるため、
2回目の繰り返しでエラーになる。


なのでforの中でvを都度定義した。

```
LinearLayout linearLayout = (LinearLayout) view.findViewById(R.id.my_layout);
for (int i = 0; i < 10; i++) {
   LinearLayout v = (LinearLayout)getActivity().getLayoutInflater().inflate(R.layout.custom_layout, null);
   linearLayout.addView(v);
}
```

これで多分おｋ！
abc 085

B
X 段重ねの鏡餅 (X≥1) とは、X 枚の円形の餅を縦に積み重ねたものであって、どの餅もその真下の餅より直径が小さい（一番下の餅を除く）もののことです。例えば、直径 10、8、6 センチメートルの餅をこの順に下から積み重ねると 3 段重ねの鏡餅になり、餅を一枚だけ置くと 1 段重ねの鏡餅になります。
ダックスフンドのルンルンは N 枚の円形の餅を持っていて、そのうち i 枚目の餅の直径は di センチメートルです。これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。

```
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
	int N;
	int d[110];
	cin >> N;
	vector<int>V;
	for (int i = 0; i < N; ++i) {
		cin >> d[i];
		V.push_back(d[i]);
	}
	sort(V.begin(), V.end());
	int ans = 1;
	for (int i = 0; i < N-1; ++i) {
		if (V[i] != V[i + 1]) {
			ans++;
		}
	}
	cout << ans;
	return 0;
}
```

```
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
	int N;
	int d;
	int flag[101];
	for (int i = 0; i < 101; ++i) {
		flag[i] = 0;
	}
    cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> d;
		flag[d] = 1;
	}
	int ans = 0;
	for (int i = 0; i < 101; ++i) {
		ans += flag[i];
	}
	cout << ans;
	return 0;
}
```

setを使ってもよい

```
#include<iostream>
#include<set>
using namespace std;
int main() {
	int N;
	int d;
	cin >> N;
	set<int>V;
	for (int i = 0; i < N; ++i) {
		cin >> d;
		V.insert(d);
	}
	cout << V.size();
	return 0;
}
```
C
日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。
青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が N 枚入っていて、合計で Y 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。
制約
1≤N≤2000
1000≤Y≤2×107
N は整数である。
Y は 1000 の倍数である。


```
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
#define INF 1e9

int main() {
	int N, Y;
	cin >> N >> Y;
	bool ans = false;
	int count10000 = -1, count5000 = -1, count1000 = -1;
	for (int i = 0; i <= N; ++i) {
		for (int j = 0; j + i <= N; ++j) {
			int k = N - i - j;
			if (10000 * i + 5000 * j + 1000 * k == Y) {
				count10000 = i;
				count5000 = j;
				count1000 = k;
			}
		}
	}
	cout << count10000 << " " << count5000 << " "<< count1000;
	return 0;
}
```
既視感
チームワークをするならコーディング規約は制定すべきである(しないと酷い結果に繋がる)。

# きっかけ
あるプログラミング言語のある機能に本当に悩まされている。[^1]
自身の不勉強故もあるが、それだけでなくチームワークにおいては他の人のやり方を受け入れるしかない局面が多い事も苦悩に繋がっていると思う。
やはりこういう局面を想定すると、誰もが自分勝手にコードを書いていい自由はチームワークでは採用すべきではないと思う。
他の人のやり方を無制限に受け入れ続ける事はできないので、それを一定の範囲に縛らざるを得ないのだ。

# 功罪両面を捉えて、破綻から逃れて現実を生き抜く為の、とある暫定的なソリューション
無論、規約で自由を縛る事は、規約制定側の、極めて狭いであろう想定範囲に物事を縛り付ける事だから、いつでも規約は見直し続けなければいけない。

規約制定作業には、悪意を持たない関係者なら誰もが参加できるべきであろうし、
そのように複数の異なる意見が衝突する事が容易に想像できる状態でも、
一つの規約を確定させる為には、何らかの意思決定機構が必要だ。

このように決められる規約は暫定的なものにしか成り得ないだろう。
恒久的で変更不可能な規約を制定し、それを尊寿し続ける事は、未知の状況に際した時に破滅が不可避である。
実際にそのようなものを制定して、それでも未知の状況に対応するならば、「恒久的で変更不可能」とした事を翻す事になる。

我々に与えられた時間は有限で、無限に想定する事は事実上不可能だし、
それでも現実では未知の状況を含めた想定外の状況が起こる。

ならば、「この規約は恒久的で変更不可能」と定義する事は賢明に将来を生きようとする者の選択ではないはずだ。
その選択は実在しない安定した世界、もし実在させるなら時が止まって生きているとは言えない世界向けの選択になる。

破滅を回避しつつ現実を生きる為には、暫定的な規約を定義し、同時にその規約を保守し続ける機構も定義しなくてはいけないだろう。

この暫定的な規約とそれを保守する機構、改定の頻度、参加者の誰にどんな権限があるべきあるいはあるべきではないのかについては、
唯一の大域的最適解は、これもまた現実的に与えられた時間で求められる物事ではないように見える。

それでも、だから考えないのではなく、これもまた暫定的に成らざるを得ない事を承知の上で、
せめて局所的最適解でも目指すつもりで決めなければ、混沌の中にある破滅から逃げ続けられるとは言えないだろう。

# 結論
現実世界でチームワークをするなら、良い規約になる事を目指して規約を定義せよ。
それでも定義された規約は決して究極の物にはなり得ないのだから、規約を改定をする機構も定義せよ。
その機構でさえも決して究極の形にはなり得ないのだから、その機構自体に、機構の自己改定機能を内在させよ。

全ては現実世界で破綻から逃れつつ未知の状況に対応していく為に。

# 追加の観点
## 最初にやる事
この規約の定義と改定の機構を持つ事は簡単ではないだろうし、全てを最初から想定することはできないのだからまずはたたき台を作って始めてみて、現実のフィードバックを得ながら改善していく事がよいように思える。

## 規約の大きさ
規約が大きくなれば、覚えきれない、探しきれないという状態がすぐにくる。
こうなれば規約を守りたいと思っても守れない事になる。
これもまたバランスだから不要になった規約は随時捨てていく必要があるだろう。

規約を探しやすくするツールなども、あればまた有用だろう。

## 規約の改定の頻度
多すぎても少なすぎても問題があるだろうが、これも組織のサイズや性質、その他の状況に依存するので、いい具合の所を模索し続けていく必要があるはずだ。

## 意思決定機構
これは現実の組織では割と簡単な問題で、実際には機構の外側になるだろうが組織の代表が最終にして至高の意思決定者になる。
つまり全てはその人にどんでん返しされ得る儚い機構なのである事を理解していなければ、実際にその時が来た時につらすぎるだろう。

それでも、やはり機構の内側に最終にして最高の意思決定者を、実際にはそうなのではなくても形式的には定義したほうがよいと思う。
その人は自身のセンスが世界一だと己惚れるなら独裁者にもなれるが、謙虚さが欠片でも残っているならば、その人の下に合議制のようなシステムを構築するべきだと思う。
この時、「全ての人は平等であるべきだ」などという綺麗事は恐らく偏った思想の一つになって、矛盾して解決困難な状況を多く生み出す要因になると思う。

全てのステークホルダーはその特性から分類して、何ができて何が許されないのか決めていかなければいけない。

## 複雑すぎる機構への対応
ここまで書いた事だけでも既にとても複雑で容易には管理できない。
意思決定機構も定義改定機構も多重の階層化が必要になるだろう。
そしてそれは、途中に挟まる各層毎に、それより下の層をより縛る事なのだから、
上にいけばいくほど謙虚で真摯に洞察し続けるセンスと努力が求められる事だ。

馬鹿と無能は上層に置いてはいけないし、そうなってしまった時にいち早く気づいて、いち早く取り除く事は、より上層にしかできない極めて重要な仕事のひとつである。

上層になればなるほど、より謙虚に、より真摯になるべきであり、
自身が下層にいて、上層がそうではない、最上層もそうではなかったと結論した場合には、ただ立ち去り、それ以降も何も言わない事が一番賢い選択肢に思える。

上層に状況を伝える努力は必要だが、それが単なる闘争に変質してしまった時、勝機はない事の方が一般的だ。
ある程度永い眼でみて、状況を受け入れられないか、あるいは今は無理でも受け入れられるように努力して成長できないかは検討する価値があるが、何事にも限界はある。
本当に無理な状況であった場合はその努力の先にあるのは成長ではなく破滅のほうだ。
しっかり見据えて、限界を超えつつあるときは勇気ある撤退を選べる事も、ある種の知性のひとつと言える。

# オチと記事名の回収
記事名につけた「しないと酷い結果に繋がる」というのは、このようにこの職場を辞めるべきなのかまで悩む人が出てくるという話である。

# 実際にコーディング規約を制定する際に参考になりそうな記事
- [ベストなコーディング規約の作り方](https://qiita.com/tadnakam/items/5d1280559eb75b29847c)
どんな項目について、どのように検討すべきなのか簡素かつ詳細なまとめがあります。

[^1]: この件については具体的に挙げてしまうと差し障りもあるだろうし、上手くパターンとして抽出できればこれに限らない汎用的な知見になると思うので語る事は後の別の機会に譲る。
ITIL v3 プロセスまとめ　【サービスデザイン編】

##ITIL v３における５つのライフサイクル

- サービスストラテジ（Service Strategy）
- **サービスデザイン（Service Design）**
- サービストランジション（Service Transition）
- サービスオペレーション（Service Operation）
- 継続的サービス改善（Continual Service Improvement）

##サービスデザインとは

＝サービスストラテジで作成した戦略を実現し、高い品質と顧客満足度、費用対効果を保ちながら運用環境へスムーズに
導入出来るITサービスを設計するプロセス。

サービス設計により作成される成果は全てサービスデザイン・パッケージ(SDP)とまとめられ、サービストランジション（Service Transition）へ引き渡される。

以下の3つのバランスを考慮することが大切。
・機能性（サービスの機能、品質など）
・リソース（費用、スタッフなど）
・スケジュール（期間）

##キーワード

###4つのP

サービスは、人や製品、それらのプロセス(Process)、またパートナーによって顧客に価値を提供する。
これらの組み合わせをサービスデザインでは4Pと言う。

・人（People）
・動き（Process）
・製品、技術（Product）
・パートナー、サプライヤ（Partner）

４Pから計画の見直しなどをし、優秀なサービスを設計する有効な手段となる。

##サービスデザインのプロセス

サービスデザインは、主にサービスの保証を確実にするプロセス。
サービスストラテジで作成されたサービスレベルパッケージ(SLP)に基づき、以下の７つのプロセスから構成されている。

１．サービスレベル管理
２．サービスカタログ管理
３．サプライヤ管理
４．キャパシティ管理
５．可用性管理
６．ITサービス継続性管理
７．情報セキュリティ管理

加えて、サービスデザインの全ての活動を調整するプロセスとしてデザイン・コンビネーションがある。

###プロセスⅠ
顧客の期待に応えるサービスを提供するためには、
顧客の期待を理解しなければなりません。

以下の3つは、サービスを供給する枠組みを確立し、またその関係を維持し、サービスに関する情報を一元的に管理するプロセス。

####１、サービスレベル管理
　現在と未来のすべてのITサービスが合意されたサービスレベルで、
　供給されることを確実にし、継続的な改善活動をけん引するプロセス。
　SLAが作成され、その達成状況はサービスレポートにまとめられ、顧客や利害関係者に報告される。

※ SLA(サービスレベルアグリーメント)はサービス提供者（プロバイダ）とサービス委託者（顧客）との間で契約を行う際に、提供サービスの内容と範囲、品質要求基準を明確にして、基準を達成できなかった場合のルールを含めて、事前に合意しておくこと。合意内容の文書、契約書を指すこともある。


####２．サービス・カタログ管理
　運用中や準備中のあらゆるサービスに関する正確な情報を持ったサービス・カタログが生成され、維持されることを誠実にするプロセス。

####３．サプライヤ管理
　サプライヤ＝サービスを供給するために必要な製品やサービスを供給する責務を負う外部組織（アウトソーシング）。
　顧客と合意したSLAを整合させ、事業に安定した品質のITサービスを供給できるように、サプライヤとそのサービスを管理するプロセス。


###プロセス２
サービスデザインにまとめられているプロセスは、
サービス設計以外にも、サービス移行やサービス運用など、サービスの品質を保証する
プロセスとして重要な役割を果たす。
サービスの保証を実現するプロセスは、以下の4つ。

####４．キャパシティ管理
提供するITサービス全般のキャパシティ（リソース・パフォーマンス）を管理し、問題点を事前に検知、サービスレベルを保持したまま最適なコストで維持する活動。
現在と将来の合意されたビジネス・ニーズをタイムリーに満たすことを確実にするプロセス。
ここで得られたデータは、CMISに格納される

＊CMIS（キャパシティ管理情報システム）
　キャパシティ管理に必要な情報を格納するデータベース。

####５．可用性管理
　可用性：システムが継続して稼働できる能力
すべてのサービスの可用性が、現在と将来の合意されたビジネス・ニーズを
コスト効率よく満たすことを確実にするプロセス。
可用性管理では可用性の目標値を定めて「イベント管理」や「インシデント管理」で測定、検知、対処します。可用性、信頼性、保守性の3つを用いて、監視、測定、分析、報告する事が重要です。可要請管理のデータはAMIS※に格納されます。

・可用性　必要な時に機能を実施する能力
・信頼性　機能を中断せずに実施する能力
・保守性　障害発生後、通常稼働にもどす復旧能力

####６．ITサービス継続性管理
ITサービスが中断した場合に必要なIT技術とサービス設備を、合意された事業期間内に確実に回復させることで、事業継続性管理プロセス全体を支援するプロセス。

####７．情報セキュリティ管理
すべてのサービスとサービスマネジメント活動において、
情報セキュリティが効果的に管理されることを確実にするプロセス。

情報セキュリティ管理プロセスには、データやサービスの価値を守るために必要な以下の３つの要素がある。
・気密性
　情報が漏れないように管理
・完全性
　正確かつ最新の状態で管理
・可用性
　情報を使いたいとき使えるように管理
MAC環境にAnsible導入後、AWSサービス構築までの道〜④Lambdaモジュール〜

第4回
Ansibleのlambdaモジュールを使用して実際にLambdaを構築してみる。

だいぶ間が空いてしまいましたが、一旦やりたいことが完成したのでメモとして各AWSサービス構築の手順を残します。

## やりたいこと
1. 関数作成

## create_lambda.yml作成
事前準備として、関数コード（index.js）を圧縮してzipファイルを作成しています。
また変数化できる部分はvars_filesにまとめています。

またS3bucket名を関数コードの中で指定していますが、汎用的に作るためにenvironment_variablesを使用するようにしました。

```create_lambda.yml
- name: Create Lambda functions
  lambda:
    name: "{{ prefix }}-{{ project_name }}"
    aws_access_key: "{{ key }}"
    aws_secret_key: "{{ secret }}"
    region: "{{ region_east }}"
    memory_size: 256
    timeout: 30
    description: "{{ prefix }}-{{ project_name }}"
    handler: 'index.handler'
    runtime: 'nodejs6.10'
    role: "arn:aws:iam::{{ account_id }}:role/service-role/testRole"
    zip_file: 'roles/Lambda/files/index.zip'
    environment_variables:
      prefix: "{{ prefix }}"
      project_name: "{{ project_name }}"
```

## 実行
以下コマンドにて実行。
「-vvv」をつけることで、詳細な実行ログが出力されます。
エラーが出ている際など、非常に助かるので常にオプション付与して実行しています！

```
ansible-playbook -vvv -i localhost, -c local create_lambda.yml
```

##マネージメントコンソール確認
Lambda関数が作成されていることを確認。

## 感想
モジュールが提供されていることで、思ったより簡単に構築が完了できました。
関数コードの読み込みをS3からしようと試みましたが、時間がかかってしまい、今回は時間がなくて断念しました…


## 残タスク
今回、S3+Lambda+API Gateway+CloudFrontでServerlessな環境を構築しようと考えています。
そのためAPI GatewayからLambdaをコールしてもらうようにするために、トリガーにAPI Gatewayを設定する必要があります。
こちらの設定は次回のAPI Gatewayの構築部分でやりたいと思います。
計算機サーバーとのデータのやり取り(scpコマンドの使い方)

#概要
ここでは数値解析系研究室で計算機にデータを送ったり、逆にデータを受信する方法を記述していく。
はじめに転送コマンドscpの使い方に触れ、後半ではシェルスクリプトを使用して、効率的にデータの送受信ができるようにしていく。

# リモート‐ローカル間のファイルコピー
基本中の基本のコマンド
なおローカルの環境では、ほとんどipアドレスがルーターによって自動的に割り振られるようになっているため、ファイルの送受信の操作はローカルから行うことにした。

```bash
#ローカルのPC　=>　リモートの計算機サーバー
scp -r <ローカルのファイルパス>　<リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス>
#リモートの計算機サーバー　=>　ローカルのPC
scp -r <リモートのUser>@<リモートのipアドレス>:<リモートのコピー元のファイルパス>　<ローカルのコピー先ファイルパス>
```
-rはコピー対象としてディレクトリーを含めるオプション

このコマンドを実行するとサーバーからパスワード認証を求められ、パスワード入力後にファイルの送受信が行われる。
##シェルスクリプトの作成
パスワード認証は面倒だし、いちいちipアドレスを入力するのも面倒なので、[前回](https://qiita.com/earth06/items/6662d79128255fa93e24)の公開鍵認証と合わせて以下のような送信用と受信用の2つのシェルスクリプトを作成する。スクリプトの保存先は~/binにしておくと、コマンドサーチパスに含まれているので、どのディレクトリからでもスクリプトを実行することができる。

```bash:~/bin/scpl2r.sh
#! /bin/bash　　　　#シバン行(必須)
# ローカルのPC　=>　リモートの計算機サーバー
scp -i ~/.ssh/id_rsa -r $1 <リモートのUser>@<リモートのipアドレス>:$2
```

```bash:~/bin/scpr2l.sh
#! /bin/bash
# リモートの計算機サーバ　=> ローカルのPC
scp -i ~/.ssh/id_rsa -r <リモートのUser>@<リモートのipアドレス>:$1 $2
```
\$1,\$2にはそれぞれシェルスクリプトを実行するときの引数の1番目と2番目がシェル変数として代入される。
##実行権限の付与
作成したスクリプトには(おそらく)コマンドとして実行する権限(パーミッション)が付与されていないのでchmodコマンドを用いてパーミッションを変更する必要がある。現在の実行権限の確認には`ls -l`コマンドを用いる。
![screen.PNG](https://qiita-image-store.s3.amazonaws.com/0/257782/5f26344a-27b2-3999-82f5-1c98e3b6bd21.png)
-rwxr-xr-xの1文字目はファイルタイプと呼ばれ、'-, d, l'で表され、それぞれ以下の意味がある。

|記号|意味|
|:----:|:----:|
|-|通常ファイル|
|d|ディレクトリー|
|l|シンボリックリンク|
残りの9文字は3文字１組でパーミッションを表し、先頭から順番にオーナー、グループ、その他ユーザーのパーミッションとなっている。
パーミッションの変更であるがchmodには記号で指定する方法と数値で指定する方法の2種類があるが、今回は後者の方法を用いる。後者の場合以下の表のように、それぞれrwxの権限を数値で対応させ、その和でパーミッションを変更する。

|記号|数値|意味|
|:-----:|:-----:|:------:|
|r|4|read(読み取り権限)|
|w|2|write(書き込み権限)|
|x|1|execute(実行権限)|

###使い方
```bash
chmod <オーナの権限><グループの権限><その他ユーザの権限>　<権限を変更するファイル>
```
###具体例
```bash
#<file>のパーミッションをrwxr-xr-xにする
$ chmod 755 <file>   
#<file>のパーミッションをrwxr-xr--にする
$ chmod 754 <file>
```
個人的に一番よく使うのは`chmod 755`だと思う。
ここでは先ほど作成したシェルスクリプトに`rwxr-xr-x`の権限を付与する。

```bash
$ chmod 755 scpl2r.sh scpr2l.sh
```
これでスクリプトが実行可能な状態になった。

##シェルスクリプトの実行
作成したスクリプトはそれぞれ以下のように使用する。

```bash
#ローカルのPC　=>　リモートの計算機サーバー
$ scpl2r.sh <ローカルのコピー元のファイルパス>　<リモートのコピー先のファイルパス>
                        $1                                   $2
#リモートの計算機サーバー　=> ローカルのPC
$ scpr2l.sh <リモートのコピー元のファイルパス>　<ローカルのコピー先のファイルパス>
                        $1                                   $2    
```
リモートのファイルパスはローカルからでは'~'がリモートのホームディレクトリとして解釈されないので、ルートディレクトリからフルパスで指定しておくのが無難である。
コマンドが実行されないときは一度ターミナルを再起動すると、実行できるようになることがある。
それでも実行できないときはスクリプトの保存場所がサーチパスに含まれていない可能性があるので`echo $PATH`でサーチパスを確認した方がよい。サーチパスを追加するには.bashrcに以下を追記する。

```bash:~/.bashrc
export  PATH="${HOME}/bin:$PATH"
```
追記後はターミナルを再起動するかターミナルで`source .bashrc`とすることで変更が反映されてサーチパスに~/binが追加される。

#まとめ
今回はデータの送受信についてまとめ、シェルスクリプトによって送受信の効率化を行った。記述に誤りがあったり、他にもっといい方法があれば教えていただけると幸いです。
Cannot ready property "forEach" of undefined

DialogflowのFulfillmentでHelloWorldを試していたところ、
よく解らないエラーに悩まされていました。

githubを確認すると既に修正されているようでした。

Cannot ready property "forEach" of undefined #233
https://github.com/actions-on-google/actions-on-google-nodejs/issues/233

agent.add(conv) not working any more #149
https://github.com/dialogflow/dialogflow-fulfillment-nodejs/issues/149

新しく作り直しても改善されないようでしたが、

```json:package.json
{
  "dependencies": {
    "dialogflow-fulfillment": "^0.5.0"
  }
}
```

を

```json:package.json
{
  "dependencies": {
    "dialogflow-fulfillment": "^0.6.1"
  }
}
```

のように変えると正常に動作しました。

慣れていると感が働くと思うのですが、
自分が何か間違っていると思い悩んでました・・・

参考になれば幸いです。
Laravel ページネーションのパラメータをシンプルにする

`appends()`の中に`$requests->all()`を突っ込むと画面ごとにリンクのパラメータを調整する必要がなくなる。
（pageの要素が被るけどページネーションで自動付与されるpageの方で上書きされるので問題ないはず）

ロジック

```php
$page = Model::orderBy('column_name')->paginate(10);
```

テンプレート

```php
{{ $page->appends($requests->all())->links() }}
```

# ロジック内で初期値を設定している場合

```php
$sort = $requests->input('sort', 'default_value');
if ($requests->has('sort')) {
  $requests->offsetSet('sort', 'default_value');
}
```

offsetSetでRequestオブジェクトにパラメータを追加できる。
e: [kapt] An exception occurred: java.lang.NullPointerException

# はじめに

```
e: [kapt] An exception occurred: java.lang.NullPointerException
```

というエラーが出た．

# 修正
```build.gradle

kapt 'com.android.databinding:compiler:3.1.4'

```

を

```build.gradle

annotationProcessor 'com.android.databinding:compiler:3.1.4'

```
にしたら治った．

# 参考文献
https://stackoverflow.com/questions/50594507/cannot-find-symbol-databindingcomponent-on-android-studio-3-2-canary-16-kotlin-p
Reactのイベントハンドラ中のfetchのイベントハンドラでthisを使うときはアロー関数を使う

jsは初心者なんだけど、せっかくなのでReact使ってちょっとしたデモページを作ろうとして少しはまった話。

以下のようなクラスで、submitされたらとあるREST APIを叩いてレスポンスで特定の要素の表示を切り替えたいと思ったのだけど、fetchのハンドラの最後でsetStateが見つからないと言われる。つまりthisがうまく渡っていない。

```javascript
    class Parent extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: '結果表示欄'};

        this.handleSubmit = this.handleSubmit.bind(this);
      }
      handleSubmit(event) {
        const formData = new FormData(event.target)
        event.preventDefault();

        fetch(event.target.action, {
          method: 'POST',
          body: formData
        }).then(function(response) {
          return response.json()
        }).then(function(json) {
          this.setState((state, props) => {
            return {value: JSON.stringify(json)}
          });
        })
      }
      render() {
        return (
          <div>
            <form action="/correct" method="POST" onSubmit={this.handleSubmit}>
            <RadioButtonParam label="l1" name="edit_dist_score_mode" params={[{value: "1", label: "L", checked: true}, {value: "2", label: "P"}] } />
            <TextParam label="target" name="target" />
            <p><input type="submit" value="実行" /></p>
            </form>
            <div> {this.state.value} </div>
          </div>
        )

```

あれこれ調べるとbindが必要とかes5のときはどうとかいろいろあって(reactの情報は新旧入り交じってて探しづらい..)、最終的に [こちら](https://stackoverflow.com/questions/38814997/call-function-in-a-fetch-promise-without-this)の以下の記載に行き着いた。

> Using a ES6 fat-arrow function means that this is bound to something else than the body of the function at hand.

functionでなくアロー関数で書けばthisが維持されるっぽい。
というわけで、下の形にしたらうまく行った。

```javascript
    class Parent extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: '結果表示欄'};

        this.handleSubmit = this.handleSubmit.bind(this);
      }
      handleSubmit(event) {
        const formData = new FormData(event.target)
        event.preventDefault();

        fetch(event.target.action, {
          method: 'POST',
          body: formData
        }).then(function(response) {
          return response.json()
        }).then((json) => {
          this.setState((state, props) => {
            return {value: JSON.stringify(json)}
          });
        })
      }
      render() {
        return (
          <div>
            <form action="/correct" method="POST" onSubmit={this.handleSubmit}>
            <RadioButtonParam label="l1" name="edit_dist_score_mode" params={[{value: "1", label: "L", checked: true}, {value: "2", label: "P"}] } />
            <TextParam label="target" name="target" />
            <p><input type="submit" value="実行" /></p>
            </form>
            <div> {this.state.value} </div>
          </div>
        )

```
CLIからiOSにPush通知を送る

[Apple Push Notification Authentication Keyを使う時](https://stackoverflow.com/questions/39943701/how-to-send-apns-push-messages-using-apns-auth-key-and-standard-cli-tools)

[Apple Push Notification Service SSLを使う時](https://gist.github.com/haranicle/cd7c0aa52ef8b9b80729ae856d73f746)
[Vue.js] 日本語変換の確定でkeyup.enterが発火してしまうのを防ぐ

# 背景

Vue.jsでenterキー押下ですぐ送信できるチャットを作っていたら日本語入力を確定するenterでも送信されてしまい「ムキー！」となったので直した話をメモしておきます
(Vue.js特有の問題というわけではなくkeyupイベントをハンドリングする際に起きる問題です）

# 対応概要

* IME変換時でなければkeypressも発火する
* IME変換時はkeypressが発火しない

という性質を利用し、

* keypressイベントで送信可能フラグを立てておく
* keyup.enterイベントでフラグが立っていたら送信

とします。
フラグとかあまり使いたくないですが調べた感じこの対応が多かったです。
もっとスマートなやり方があったらぜひご教示ください。

# コードはこんな感じ

```vuejs
<template lang="html">
  <section class="container">
    <input
      v-model="message"
      type="text"
      @keyup.enter="say"
      @keypress="setCanMessageSubmit">
  </section>
</template>

<script>
export default {
  data() {
    return {
      message: '',
      canMessageSubmit: false
    }
  },
  methods: {
    setCanMessageSubmit() {
      this.canMessageSubmit = true
    },
    say: function() {
      if (!this.canMessageSubmit) {
        return
      }

      // -- submit message -- //

      this.message = ''
      this.canMessageSubmit = false
    },
  }
}
</script>
```

これで日本語変換の確定では送信されず、もう一度enterを押下したら送信されるようになりました。
credentials.yml.enc やめたい…

# 概要

Rails5.2でconfig/secrets.ymlの代わりに入ったconfig/credentials.yml.encだが
環境毎に変える機能がなかったりして、外部APIへの接続情報をstaging系とproduction系で分ける、みたいなことができない。

また、Deviseが何をするにもsecret_keyを要求するせいで、
master.keyを作り直そうとして、master.keyとcredentials.yml.encを削除してから
`bin/rails credentials:edit`を叩くとエラーを吐いてしまい、スタックしてしまう。

もういっそ、Rails5.1時代のsecrets.ymlと同じ状態で使いたい。

# 結果

こうなりました。
ちゃんとENVも展開されます。

```config/application.rb
module XXXXX
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    config.require_master_key = false
    config.x.secrets = ActiveSupport::InheritableOptions.new(config_for(:secrets))
    config.secret_token = config.x.secrets.secret_key_base
  end
end
```

```config/secrets.yml
# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rails secret` to generate a secure secret key.

# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.

# Shared secrets are available across all environments.

# shared:
#   api_key: a1B2c3D4e5F6

# Environmental secrets are only available for that specific environment.

development:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

test:
  secret_key_base: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

# Do not keep production secrets in the unencrypted secrets file.
# Instead, either read values from the environment.
# Or, use `bin/rails secrets:setup` to configure encrypted secrets
# and move the `production:` environment over there.

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

secretの部分は

```shell-session
$ bin/rails secret
```

で生成すること。
SqlBulkCopy でエラーとなった行を取得する

# SqlBulkCopy のエラー情報
`SqlBulkCopy` を使用すると高速に Bulk Insert を行えるが挿入中にエラーとなったときにエラーとなった行を特定することができない。

```csharp
using (var copy = new SqlBulkCopy("ConnectionString"))
{
    try
    {
        copy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
        // Exception にはエラーになった行を特定する情報は含まれていない。
    }
}
```

# 拡張メソッドの定義
`SqlBulkCopy` クラスの実装を覗くとプライベートフィールドに処理する行の情報を格納しているので、リフレクションを使って無理やり取れる様にしてみた。※.NET Framework 4.6.1

```csharp:SqlBulkCopyExtensions.cs
public static class SqlBulkCopyExtensions
{
    private static readonly BindingFlags BindingAttributes = BindingFlags.Instance | BindingFlags.NonPublic;

    public static DataRow GetLastDataRow(this SqlBulkCopy instance)
        => (DataRow)(typeof(SqlBulkCopy).GetField("_currentRow", BindingAttributes).GetValue(instance));

    public static int GetLastIndex(this SqlBulkCopy instance)
        => (int)(typeof(SqlBulkCopy).GetField("_rowsCopied", BindingAttributes).GetValue(instance));
}
```
# 使い方
```csharp
using (var copy = new SqlBulkCopy("ConnectionString"))
{
    try
    {
        copy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
        // エラーになった行の DataRow とインデックスを取得する。
        var errorRow = copy.GetLastDataRow();
        var errorIndex = copy.GetLastIndex();
    }
}
```
dynamic VCL Snippetsを更新する

目的
作ったvclを更新したい

[前回](https://qiita.com/takayuki_tk/items/c75e4d7826d7e6b1b589)まで
├ create.sh
├ delete.sh
├ vcl(この下にアップロードするvclを保存する。)

今回
├ create.sh
├ delete.sh
├ update.sh (new!)
├ vcl(この下にアップロードするvclを保存する。)

``` update.sh
SERVICE_ID=$1
FILE=$2

response=$(curl -X GET -s "https://api.fastly.com/service/${SERVICE_ID}/version" -H "Fastly-Key:${FASTLY_API_TOKEN}"  -H 'Content-Type: application/json')
len=$(echo $response | jq length)

for i in $( seq 0 $(($len - 1)) ); do
    row=$(echo $response | jq .[$i])
    active=$(echo $row | jq ".active" | tr -d '"')
    if [ $active = "true" ]; then
        active_version=$(echo $row | jq ".number" | tr -d '"')
    fi
done

echo "active version: $active_version"

response=$(curl -X GET -s "https://api.fastly.com/service/${SERVICE_ID}/version/${active_version}/snippet" -H "Fastly-Key:${FASTLY_API_TOKEN}"  -H 'Content-Type: application/json')
len=$(echo $response | jq length)

for i in $( seq 0 $(($len - 1)) ); do
    row=$(echo $response | jq .[$i])
    name=$(echo $row | jq ".name" | tr -d '"')
    if [ $name = $FILE ]; then
        snippet_id=$(echo $row | jq ".id" | tr -d '"')
    fi
done

if [ -z $snippet_id ]; then
    echo "対象のsnippetが存在しません"
    exit 1
fi

echo "snippet_id: $snippet_id"

content=`cat vcl/${FILE}.vcl`

curl -X PUT -s "https://api.fastly.com/service/${SERVICE_ID}/snippet/${snippet_id}" -H "Fastly-Key:${FASTLY_API_TOKEN}" -H 'Content-Type: application/x-www-form-urlencoded' --data $"content=${content}";

```

使い方
./update.sh <SERVICE_ID> vclの下に置いたファイル名（拡張子覗く)

例
./update.sh xxxxxx sample

まず現在activateされているversionを取得。
apiみたかんじ消すのはnameでできるのに更新はidが必要だったのでnameをidに変換。
最後に更新APIを実行しています。
【初心者向け】AWS Lambdaの超基礎

## 注意
公式サイトやいろんなサイト見て、自分なりにまとめたり、言い換えたりしたものです。
AWSは、EC2,S3,CloudFront,CloudWatch,コピペLambda関数の使用経験があります。
がっつりLambdaを触る上で、理解が必要になったので知識の整理のためにまとめます。

## Lambdaとは
サーバーの準備・管理をしなくても、コードを実行できるサービス。
Lambdaは必要に応じてコードを実行して、その使用時間に対して料金を払う。だから使い方によってはすごく安い。
現在のサポート言語は、Node.js、Java、C#、Go および Pythonです。
コンピューティングリソースはLambdaが管理するので、実行するコードにだけ集中することができる。
逆に言えば、コンピューティングしているインスタンスにログインしたり、言語のランタイムをカスタマイズする、といった細かいことが出来ない。

## Lambda関数
[参考:Lambda関数のビルド](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-app.html)
### Lambda関数のビルド
Lambdaに関数をアップロードするだけ。こうすると、僕らの代わりにLambdaが関数を実行してくれる。
#### ライフサイクル

Lambda関数のライフサイクルは以下。

- コードの作成
- コードをデプロイしてLambda関数を作成
- 監視とトラブルシューティング

### コードの作成

サポートされている言語で書くことができる。
コードの作成はLambdaのコンソール画面か、IDEが使える。
ただし、使用できるIDEや各種ツール・オプションなどは、言語とコードで使用するライブラリに依存する。

###### 言語によらず言えること
Lambdaで記述するコードにはパターンがある。
長くなるので、別途後述する。
<br>

### コードをデプロイしてLambda関数を作成

デプロイパッケージを作成して、それをLambdaにアップロードするとLambda関数を作成できる。

###### デプロイパッケージの作成について
コードとその依存関係を特定方法で組織化してデプロイパッケージを作成できる。手順は言語によって異なる。
自分で作成するか、Lambdaのコンソールで作成できる。
Lambdaコンソールでコードを直接記述すると、コンソールによってデプロイパッケージの作成とアップロードが行われ、Lambda関数が作成される。
[参考：デプロイパッケージの作成(Node.js)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-create-deployment-pkg.html)

###### Lambda関数のテスト
サンプルデータを利用してテストできる。
Lambdaコンソールでも、AWS CLIでも可能。

<br>


### 監視とトラブルシューティング
CloudWatchを通じてメトリクスをレポートすると、監視できる。
ログに関しても、CloudWathc Logsに自動的に保存される。


## プログラミングモデル
[参考:プログラミングモデル](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/programming-model-v2.html)
前述で割愛した内容をここに書きます。
使用する言語に関わらず、パターンがある。

- Handler
- contextオブジェクトと実行時のLambdaの動作
- ログ記録
- 例外

### Handler
Handlerは関数です。
どんな関数かというと、AWS LambdaがLambda関数の実行を開始するために呼び出す関数です。
僕らがLambda関数を作成するときは、Handlerを識別する。
Lambda関数が呼び出されると、AWS LambdaはHandler関数を呼び出してコードの実行を開始する。
AWS LambdaはこのHandlerに、最初のパラメータとしてイベントデータを渡す。
Handlerは渡されたデータを処理する必要があるし、コード内の他の関数も呼び出せる。


### contextオブジェクトと実行時のLambdaの動作
Handlerに渡す2番目のパラメータは、contextオブジェクトです。
ちなみにcontextの言葉の意味は、プログラムの置かれた状況という意味である。
[参考：IT時点](http://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88.html)
このcontextオブジェクトにより、AWS Lambdaとやり取りができる。
例えば、Lambda関数終了させるまでの実行時間とかを確認できる。

さらに、追加のメソッドも提供されている。

### ログ記録
Lambda関数にログ記録の状態を含めることができる。
そのログを、CloudWatch Logsに書き込む。


### 例外
Lambda関数は、その関数の実行結果をAWS Lambdaに伝える必要がある。
記述する言語に応じて、リクエストを正常に終了する方法や、発生したエラーをAWS Lambdaに通知する方法は変わる。

#### Node.jsのプログラミングモデル
- [参考：Node.jsのプログラミングモデル](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/programming-model.html)
- [参考：Lambda 関数ハンドラー (Node.js)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-handler.html)
- [参考：Context オブジェクト (Node.js)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-context.html)
- [参考：ログ作成 (Node.js)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-logging.html)
- [参考：関数エラー (Node.js)](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-mode-exceptions.html)


## Lambdaのユースケース
AWS Lambdaの使用方法の例は以下から確認できます。
[参考：AWS Lambda の使用方法の例](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/use-cases.html)
Gutenbergを試してみる4（再利用可能ブロック）

wordpressの新しいエディタGutenberg。
もっとも特徴的な機能といえる再利用可能ブロックを使ってみたいと思います。

#再利用可能ブロック
再利用可能ブロックは、
自分で設定したブロックの内容を保存し再利用するというブロックです。

自分で作成する定型ブロックといえます。
何度も同じ文章をコピー＆ペーストしている方には便利なブロックでしょう。

##再利用可能ブロックの作り方
再利用可能ブロックの作り方は、
まず定型の元となるブロックを作成し、
ブロックのオプション設定から、「再利用ブロックに追加」とします。
名称を設定して保存します。

![再利用可能ブロックに追加.png](https://qiita-image-store.s3.amazonaws.com/0/172603/36fc4d41-b601-0cae-a443-19350f337fa9.png)

![再利用可能ブロック名前をつける.png](https://qiita-image-store.s3.amazonaws.com/0/172603/b05f3219-97ae-3e39-5304-b083c938d2d9.png)
名前をつけて保存をすると

![再利用可能ブロック選択中.png](https://qiita-image-store.s3.amazonaws.com/0/172603/466f05cf-86a2-287e-f305-70e899512330.png)
ブロック名は命名した名前になる

保存したブロックの内容はDBに書き込まれ、
出力の際に取得→表示されます。

コードエディタ上には参照先のIDが設定されます。

```wordpress:コードエディタ
<!-- wp:block {"ref":1331} /-->
```

実際には、
wp_postsテーブルにpost_typeはwp_blockとしてこのIDで登録されています。

##再利用可能ブロックを挿入する
再利用可能ブロックを挿入するには、
追加ボタンから、再下の「再利用可能」カテゴリより選択します。
ご自分で命名した名称のブロックを選択しましょう。
ブロックのタイプによって、表示されるアイコンも違ってきます。

![登録された再利用可能ブロック.png](https://qiita-image-store.s3.amazonaws.com/0/172603/aae00d61-ecb1-0fde-815d-85a8a33aeefd.png)

##再利用可能ブロックの編集
挿入した再利用可能ブロックは「編集」ボタンから内容の編集ができますが、
参照している全てのブロックで内容が書き換わりますので、
影響範囲を確認してから編集しましょう。

##テンプレートとして利用する
この再利用可能ブロックをテンプレート代わりに利用する場合は、
挿入後に設定から「通常のブロックへ変換」とします。
内容を書き換えても登録されている再利用可能ブロックへの影響はなくなります。

![通常のブロックへ変換.png](https://qiita-image-store.s3.amazonaws.com/0/172603/7f450993-e51d-65dd-0ac1-4a9996cf0114.png)

![再利用可能ブロックを変換後に編集.png](https://qiita-image-store.s3.amazonaws.com/0/172603/62b2b50c-55de-ea24-5faa-edd8d1a69bff.png)

```wordpress:コードエディタ
<!-- wp:paragraph {"textColor":"very-light-gray"
,"backgroundColor":"vivid-red","customFontSize":18} -->
<p style="font-size:18px"
 class="has-background has-very-light-gray-color
 has-vivid-red-background-color">再利用可能ブロックとは</p>
<!-- /wp:paragraph -->
```
コードエディタで見るとDBに登録されていた内容が展開されています。

文字だけ変更したい
毎回同じ背景のカバー画像ブロックにタイトルだけ変更したい
カラムブロックを利用した枠組みを同じように使いたい
フッター的に使いたいけれど、古いブログの内容は変更せずにとっておきたい

といった時に使えます。

クラスを設定したブロックを再利用可能ブロックとできるので、
テーマと絡めて登録しておくとさらに便利になりそうです。

ただし、関連は切れるので、
まとめて修正・・・はできません。

##再利用可能ブロックの削除
「再利用ブロックから削除」とすると、ブロックごと削除されます。
カテゴリにも表示されなくなりますが、
DB上にはpost_statusが publish→trush となって残ります。

##再利用可能ブロックのまとめ
Gtenbergで検索すると、
技術者の情報が先行しているからでしょうか、
自分で定義できるカスタムブロックの情報があがってきますが、
そこまではちょっと・・・という方でも、
再利用可能ブロックとテーマ（CSS）を組み合わせることで、
かなり利便性を追求できそうです。

- 再利用可能ブロック
- カスタムブロック
- ショートコード

といった機能をどの場面で使っていくか、
投稿者のレベルにあわせて考えていく必要がありそうです。

次回はカスタムブロックの前にショートコードなど、埋め込みブロックについて見ていきたいと思います。

[Gutenbergを試してみる1](https://qiita.com/aquagre_en/items/e23a18667149e1aa1950)
[Gutenbergを試してみる2](https://qiita.com/aquagre_en/items/b2fdea83026d21ec38a5)
[Gutenbergを試してみる3（画像を使った投稿）](https://qiita.com/aquagre_en/items/4a8f355897fad9b89d1d)