OmniAICreator/Qiita-1.07M huggingface dataset:
40 代おっさん GASのDriveAppクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## DriveAppクラス

DriveAppクラスとは
Driveサービスの最上位に位置するトップレベルオブジェクトです。

＊DriveAppクラスの主なメンバーの図は、参考資料の本を見ていただくか、ネットで調べください。

ちなみにこちらで書いてありました。
<https://excel-ubara.com/apps_script1/GAS036.html>

### フォルダIDとファイルID

ファルダ、ファイルが作成、アップロードされた時点でIDが付与される。

```javascript
https://drive.google.com/drive/u/1/folders/{ID}
```

IDの部分がファルダIDになる。

```javascript
https://drive.google.com/file/d/{ID]/view
```

IDの部分がファイルIDになる。

IDを使ってファルダ、ファイルを取得するには

getFolderByIdメソッド（ファルダ）

構文

```javascript
DriveApp.getFolderById(ファルダID)
```

getFileByIdメソッド（ファイル）

構文

```javascript
DriveApp.getFileById(ファイルID)
```

お試し

```javascript
function tosiki() {
  const folderId = '×××××××××××××';
  const folder   = DriveApp.getFolderById(folderId);

  console.log(folder.getName());

  const fileId = '×××××××××××××××';
  const file   = DriveApp.getFileById(fileId);

  console.log(file.getName());
}
```

### ルートフォルダの操作

ルートフォルダとは
マイドライブのこと

ルートフォルダを収得するメソッド
getRootFolderメソッド

構文

```javascript
DriveApp.getRootFolder()
```

お試し

```javascript
function tosiki() {
  const root = DriveApp.getRootFolder();

  console.log(root.getName());
}
```

本来、ファルダにファイル、フォルダを作成、削除する操作に関しては、Folderオブジェクトを収得してからそれに対して実行する。
ルートフォルダに関してはDriveAppクラスのメソッドで、ファルダの取得せず操作可能

フォルダを作成
createFolderメソッド

構文

```javascript
DriveApp.createFolder(ファルダ名)
```

ファイルを作成
createFileメソッド

構文

```javascript
DriveApp.createFile(ファイル名, 内容, [, MIMEタイプ])
```

内容は文字列を指定
MIMEタイプはファイル形式を指定

お試し

```javascript
function tosiki() {
  const folderName = '作成したファルダ';
  DriveApp.createFolder(folderName);

  const fileName = '作成したファイル.txt';
  const content = '利樹かわいい～～～';
  DriveApp.createFile(fileName, content);
}
```

## 参考資料

<https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Google-Apps-Script%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88/dp/4798064742>
【環境構築サクッとメモ】rails×reactとlaravel×vuejsとlaravelの参考メモ

新しい言語のキャッチアップをする時には環境構築が必要になります。
Dockerだったら簡単に構築出来ますよね。

他の人が作ったリポジトリを参考にすれば、早く環境構築が終わるので楽ちん。
以下をDockerで構築した記事をメモがわりに残しておきたいと思います。

・rails×react
ブログ
【Docker】Rails6 API + React（TypeScript）のSPA開発環境を構築する
https://qiita.com/taki_21/items/613f6a00bc432d1c221d
github
https://github.com/taki-21/rails-react-ts-docker

・laravel×vuejs
Qiita
【導入編】絶対に失敗しないDockerでLaravel + Vue.jsの開発環境（LEMP環境）を構築する方法〜MacOS Intel Chip対応〜
https://yutaro-blog.net/2021/04/28/docker-laravel-vuejs-1/
github
https://github.com/shimotaroo/docker-laravel-vuejs-sample

・laravel
Qiita
Docker ComposeでLaravel開発環境を構築その壱
https://qiita.com/_bobtabo_/items/42b70d334dee33befdfb
github
https://github.com/bobtabo/docker2
Web Development with Clojure (第3版) の紹介

本記事では、Clojure を用いた Web 開発を取り上げた書籍 「Web Development with Clojure (第3版)」 を章を追って紹介します。

本書は Clojure での Web 開発で用いられるツールやミドルウェア、フレームワーク等について紹介されており、Clojure での Web 開発の最新動向を知るために最良の本のようです。

洋書の概要を日本語で紹介しながら、Lisp 方言である Clojure の魅力をお伝えできればと思います。

ご興味がある方は、ぜひ原著を手にとっていただき、書籍をお楽しみください。

https://pragprog.com/titles/dswdcloj3/web-development-with-clojure-third-edition/

取り上げる章のタイトルは以下の通りです。

---
第 1 章：足場を固める
　・環境を整える
　・Leiningen でプロジェクトを管理する
　・最初の Web アプリケーションを作る
　・アプリを改良する
 						
第 2 章：Luminus の Web スタック
　・Ring によるリクエストのルーティング
　・Ring の拡張
　・Reitit によるルート定義 
　・Selmer による HTML テンプレートの作成
 						
第 3 章：Luminus のアーキテクチャ
　・プロジェクトの管理
　・アプリケーション・コンポーネントの観点から考える
　・ステートフルコンポーネントの管理
					
第 4 章：ClojureScript の紹介
　・ClojureScript の理解
　・ClojureScript サポートの追加 
　・Reagent による UI の構築 
　・Re-Frame による状態管理
									
第 5 章：成功のための準備
　・ClojureScript の開発ツール
　・Re-Frame の導入
　・WebSocket によるマルチユーザー化
　・Sente へのアップグレード
　・Re-Frame のイベントとエフェクト

第 6 章：アプリケーションの計画
　・MVP の中身は？
　・部屋の中の象
　・データのモデリング
　・ユーザー管理の追加 
 						
第 7 章：アカウント管理
　・認証
　・著者の投稿ページの追加 
　・アカウントのカスタマイズ 
　・アカウント設定
											 							
第 8 章：ソーシャル・インタラクション
　・投稿の改善
　・投稿のキュレーション
 						
第 9 章 デプロイメント
　・ユニットテスト
　・アプリケーションのパッケージ化

---

では、今後の投稿をお楽しみに。

May REPL Be With You. 
REPL と共にあらんことを。
AWS RDSのlog_bin_trust_function_creatorsとはなにか？

# log_bin_trust_function_creatorsとは？
RDSに設定できるオプションのひとつ
MySQL DB インスタンスの関数、プロシージャ、トリガーの実行を行えるようになります。
このパラメーターを設定しないと動きません。

ref: https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-mysql-functions/

# Super権限は設定しなくてもいいの？
>　SYS アクセス (SUPER 権限) は提供されていません。MySQL DB インスタンスでバイナリログが有効になっている場合は、DB インスタンス用に作成するカスタム DB パラメータグループで log_bin_trust_function_creators パラメータを true に設定します。

AWSのRDSにおいてはそもそもSUPER権限を使ったアクセスができないそうで、パラメータ変更のみでいいみたいです。

# リスクはないのか？
このオプション自体には特に問題はない
が、Triggerやストアドファンクションを安易に使うことのリスクは存在する

# Triggerのリスク
DBに設定するという特性上アプリケーションコード上に表示されていないが、
特定のDB操作を行うと処理が発生するという副作用が場合によっては負債となる場合がある
その場しのぎ的に使い長期的には、アプリケーションコードで表現する方が安全性は高いので消すのを忘れないようにすること大事
.env ファイル

## PHPでの .env 参考サイト

https://technoledge.net/composer-dotenv/

https://seiyaan.com/2019/06/phpdotenv/

https://webukatu.com/wordpress/blog/39216/

https://qiita.com/junpeko5/items/6754efcd014ae86a5aed

##### 公式のREAD ME.md 日本語訳

https://qiita.com/H40831/items/aaf8ffa727928661ad1d

### 概要

**dotenv(.env)** というライブラリを使い、アプリケーション内で使用する環境変数を読み込む。

dotenvはファイルから環境変数を読み込み、`$_SERVER`や`getenv()`を使用して設定した環境変数を読み込むことができる。

データベースの接続情報やAPIの鍵といったGitなどの __バージョン管理に含めることができない__ 設定値をアプリケーションで利用するために`.env`ファイルを作成する。

しかし、バージョン管理外にすると、何を`.env`ファイルに記述すればよいか分からなくなってしまうため、`.env`の設定値をダミーデータにして`.env.example`のようなファイルをバージョン管理下に指定する。

#### 使い方　

https://weblabo.oscasierra.net/php-composer-1/

+ PHP アプリケーションを作成するディレクトリ(index.php がある階層)に `vlucas/phpdotenv` をインストールする。

```
composer require vlucas/phpdotenv
```

+ `.env` ファイルの作成 

```.env
DB_HOST=localhost
DB_USER=user
DB_PASS=password
DB_NAME=database
```
+ PHPファイルで環境変数を呼び出す

```php
#vendorファイルを読み込む
require_once __DIR__ . '/vendor/autoload.php';

#dotenvを使用する
$dotenv = new Dotenv\Dotenv(__DIR__); // .envファイルがあるディレクトリを指定
$dotenv->load();                      // .envファイルから環境変数を読み込み

```

通常の環境変数を呼び出すのと同じように`getenv()`、`$_SERVER`、`$_ENV`と複数の方法で環境変数を呼び出すことができる。

```php
<?php
require_once __DIR__ . '/vendor/autoload.php';

$dotenv = new Dotenv\Dotenv(__DIR__); // .envファイルがあるディレクトリを指定
$dotenv->load();                      // .envファイルから環境変数を読み込み

// 通常の環境変数を同じように下記のどの方法でも環境変数を呼び出せます
$host = getenv('DB_HOST');
$user = $_SERVER['DB_USER'];
$password = $_ENV['DB_PASS'];

$dsn = "mysql:host={$host};charset=utf8;";
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];

$this->pdo = new PDO($dsn, $user, $password, $options);
```


## docker-compose での .env　参考サイト

https://blog.cloud-acct.com/posts/u-env-docker-compose/

https://qiita.com/ucan-lab/items/b094dbfc12ac1cbee8cb

公式

https://docs.docker.jp/compose/environment-variables.html


#### 環境変数の与え方
　1. ホスト側で環境変数を設定する
　2. `.env`ファイルを`docker-compose.yml`と同じ階層に置いておく
　3. `docker-compose`時に`--env_file`オプションを付けて`.env`の代わりにファイルを指定する
　
#### 利用される環境変数の優先順位
1. ホストで設定した環境変数
2. `.env`ファイル


### 注意すること
+ `.env`ファイルの内容はすべて __テキスト__ として扱われるので、数値やbool値として環境変数を使用することはできない。

+ `.env`ファイルを守る
`.htaccess` で`.env`ファイルへの __アクセス拒否設定__ をしたり、`.env`ファイルの __パーミッション(400)__ を見直す。

+ `.env`ファイルを __公開領域外__ へ



### env_file と .env の違い

https://scrapbox.io/koji-engineers/docker-compose_.env%E3%81%A8env_file%E3%81%AE%E9%81%95%E3%81%84
update CentOS 8 to AlmaLinux メモ

## CentOS 8 から AlmaLinux　へのアップデート

### 事前確認

```
# cat /etc/redhat-release
CentOS Linux release 8.5.2111

# uname -r
4.18.0-240.15.1.el8_3.x86_64
```

## アップデート

```
# git clone https://github.com/AlmaLinux/almalinux-deploy.git
# cd almalinux-deploy
# bash almalinux-deploy.sh
```

![スクリーンショット 2022-02-24 14.42.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266239/8e0a0c1f-a77c-8605-a7bb-857839c8e647.png)
![スクリーンショット 2022-02-24 15.12.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266239/fc55335a-13a6-b990-836d-5fc15ae06353.png)


## 確認

```
#  cat /etc/redhat-release
AlmaLinux release 8.5 (Arctic Sphynx)

# uname -r
4.18.0-240.15.1.el8_3.x86_64

```
ServiceNow - フォームに「挿入と維持」ボタンを表示させる

#目的
ServiceNowで複数のデータを登録する場合はレコード毎に「登録」ボタンを押下した再び「新規」ボタンを押下すると登録ページが表示されるまでに時間が掛かる。
登録時間を短縮するためには「挿入と維持」ボタンを利用するとページの読み込み時間を省くことができる。
標準ではフォームに「更新」と「削除」ボタンのみが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/369dfb4b-086f-b705-a8d6-ef91e4ff95a9.png)
本ページは次のように「挿入」、「挿入と維持」、「保存」ボタンを追加する手順を説明する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/870427e0-bc8f-16e4-7df7-21a3daab015f.png)

#設定手順
1. ナビゲータに「sys_properties.list」を入力してシステムプロパティページを開きます。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/d92823a5-6f8d-f487-560c-d98c8290a310.png)
1. 名前を「glide.ui.advanced」でフィルタして、表示される行をクリックします。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/42583603-1c4f-d70f-19d9-fc81f4ccefcd.png)
1. 値を「true」にして保存します。<br/>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698027/96d64c9b-109c-abe7-6796-6f25b9700a6e.png)
これでフォームに「挿入」、「挿入と維持」、「保存」ボタンが追加されます。

以上
Windows10で「@」と「`」のキーが打てない

MacのMicrosoft RemoteDesktopで、キーボード配列が正しく認識されないので、キーボード周りを触っていたら、突然JIS配列のままで、「@」と「`」キーだけが反応しなくなってしまいました。
設定を触っているうちに、どうも「テキストサービスと入力言語」の設定がおかしくなってしまったようだったので、下記の手順で復旧しましたので、忘備録として残します。

1 タスクバーの虫眼鏡（検索）で、「入力」と入れて検索すると、「設定」の「入力」画面が表示される。

2 左メニューの「入力」を選択し、「その他のキーボード設定」欄から「キーボードの詳細設定」をクリックします。

3 「入力方式の切り替え」欄から「使用可能な場合にデスクトップ言語バーを使用する」にチェックを入れて、「言語バーのオプション」をクリックします。
 
4「テキストサービスと入力言語」のダイアログが表示されるので、「詳細」タブを選択する

5 「入力言語を切り替える」の「キーシークエンス」が「アクサングラーブ(`)」になっていることを確認する。

6 「入力言語を切り替える」を選択し、「キーシークエンスの変更」ボタンを押す。

7 「アクサングラーブ(`)」から「割り当てなし」に変更し、OKボタンを押す。

8 「OK」ボタンをおして、「テキストサービスと入力言語」から抜ける。

9 キーボードの「@」や「`」が入力できるようになったのを確認する。
40 代おっさん GASのDriveサービスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Driveサービス

Driveサービスとは

GASでGoogleドライブを操作するためのクラス

Driveサービスの主なクラス
|クラス|説明|
|------|----|
|DriveApp|Driveサービスのトップレベルオブジェクト|
|Folder|Googleドライブ内のフォルダを操作する機能を提供する|
|FolderIterator|Googleドライブ内のフォルダに反復処理をする機能を提供する|
|File|Googleドライブ内のファイルを操作する機能を提供する|
|FileIterator|Googleドライブ内のファイルに反復処理を機能を提供する|

Driveサービスのクラスは、DriveApp→Folder→Fileという階層構造になっている

FolderIteratorクラス、FileIteratorクラスは集合をコレクションとして取り扱い、反復処理をサポートする機能を提供している。

## 参考資料

<https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Google-Apps-Script%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88/dp/4798064742>
エラー: repo 'appstream' のメタデータのダウンロードに失敗しました : Cannot prepare internal mirrorlist: No URLs in mirrorlist  対策

CentOS 8 をまだ使っている場合

```
# dnf update
エラー: repo 'appstream' のメタデータのダウンロードに失敗しました : 
Cannot prepare internal mirrorlist: No URLs in mirrorlist
```

こんなふうになった場合、「URLs in mirrorlist」がvault.centos.orgへ向くようにする

```
# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*

# sed -i -e 's/^mirrorlist/#mirrorlist/g' -e 's/^#baseurl=http:\/\/mirror/baseurl=http:\/\/vault/g' /etc/yum.repos.d/CentOS-*repo

```

コマンド実行

```
# dnf clean all
130 ファイルが削除されました
```
コマンドが実行できるようになる

```
# dnf update
```
【バッチファイル】文字コードはUTF-8のほうがいい

# はじめに

もう、Shift_JISは終わりです。
Windowsのメモ帳のデフォルトの文字コードもUTF-8になったので。

これからは、バッチファイルもUTF-8で書くようにしましょう。

# コマンドプロンプトのデフォルトの文字コードをUTF-8にする

こちらを参考にすれば、コマンドプロンプトのデフォルトの文字コードをUTF-8にすることができます。

[Windowsのコマンドプロンプトの文字コードを設定 | Linuxコマンド.NET](https://linuxcommand.net/cmd-charset/#:~:text=chcp%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A8%AD%E5%AE%9A,-chcp%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7&text=%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88,%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

# これからのバッチファイルのテンプレ

これからのバッチファイルは、先頭にこのように書くべきだと思います。

こちらに書かれているテンプレに一行追加しただけです。
[【bat】Windowsのバッチファイル(*.bat)の書き方自分用まとめ](https://qiita.com/sksmnagisa/items/8c4c1788af44cc1dc63a)

```bat
@echo off
chcp 65001 > nul
cd /d %~dp0
```
SageMaker同じロールでインスタンスを特定するCloudTrailログの作成

#背景
同じロールでSageMakerインスタンスを作成することは管理上で容易でありますが、CloudTrailログでは全部同じロールが見えます。

#実現方法
[すべてのインスタンスが同じ IAM ロールを使用する場合、どの SageMaker ノートブックインスタンスが特定の API コールを行ったかを判断するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/sagemaker-instance-api-iam/)
上記のAWSブログによると実現すればOKです。
[※20211111後の画面スナップショット](https://web.archive.org/web/20211214035805/https://aws.amazon.com/jp/premiumsupport/knowledge-center/sagemaker-instance-api-iam/)
##実現ポイント：
1、SageMakerライフサイクルスクリプトで起動時にCLI認証情報を書き込む

```bash
#!/bin/bash

set -ex

# Obtain the name of the notebook instance
nbname=$(jq -r '.ResourceName' /opt/ml/metadata/resource-metadata.json)
echo "Notebook Name = $nbname"

# Use the AWS Command Line Interface (AWS CLI) to obtain the Amazon Resource Name (ARN) of the IAM execution role
nbinfo=$(aws sagemaker describe-notebook-instance --notebook-instance-name $nbname)
nbrole=$(jq -r '.RoleArn' <<< "$nbinfo")
echo "Notebook Role = $nbrole"

# Obtain the Region of the notebook instance
nbregion=$(aws configure get region)
echo "Notebook Region = $nbregion"

# Write Assume Role Provider Settings to a new config file
echo "Writing new config file"
cat > /home/ec2-user/.aws/config.new <<EOF1
[default]
region=$nbregion
role_arn = $nbrole
credential_source = Ec2InstanceMetadata
role_session_name = $nbname
sts_regional_endpoints = regional
EOF1

echo "Moving new config to config file"
sudo mv /home/ec2-user/.aws/config.new /home/ec2-user/.aws/config
```
2、EC2インスタンスプロファイルにアタッチされたIAMロールを使用する
`role_arn = $nbrole`：SageMaker自分のロールを使用する
`credential_source = Ec2InstanceMetadata`：当インスタンスの認証情報を使用する
`role_session_name = $nbname`：インスタンス名をセッション名に指定する
参考：[AWS CLI での IAM ロールの使用](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-role.html)

#おまけ
[2021年3月17日（すべてのインスタンスが同じ IAM ロールを使用する場合、どの SageMaker ノートブックインスタンスが特定の API 呼び出しを行ったかを判断するにはどうすればよいですか?）](https://web.archive.org/web/20211214035805/https://aws.amazon.com/jp/premiumsupport/knowledge-center/sagemaker-instance-api-iam/)
2021年11月11日以前のAWSブログでの記事で、ロールの連鎖を起こすから、現在の記事になりました。
ロール連鎖現象：
SageMakerインスタンスで作成した`Client`または`Resource`を利用する場合、1時間後に使えなくなります、権限が足りないエラーです。
参考：[ロール連鎖](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E9%80%A3%E9%8E%96,-%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E9%80%A3%E9%8E%96)
【Wordpress】最終更新日時を表示するショートコード作ったよ

WordPressの勉強がてら、投稿ページや固定ページに埋め込めるショートコードを作りました。
以下のソースコードをテーマファイル内の **「functions.php」** 内にコピーしてお使いください。
投稿ページ・固定ページの使用したい箇所に `[LastModDate]` と入力すれば、**年/月/日  時間:分:秒** のように自動で表示されます。
※functions.phpの中身をいじりますので、エラーが発生する可能性があります。必ず事前にバックアップをとった上で、自己責任で編集してください。
万が一のことがあっても中の人は責任を負えません……:sob:

```php:functions.php 
//最終更新日時を取得→表示するショートコードを作る関数
function last_modified_func($atts, $format)
{
	$pdate = get_the_date('Ymd');
	$mdate = get_the_modified_date('Ymd');
	$modified_year = get_the_modified_date('Y/');
	$modified_month = get_the_modified_date('m/');
	$modified_day = get_the_modified_date('d');
	$modified_hour = get_the_modified_time('H:');
    $modified_minute = get_the_modified_time('i:');
	$modified_second = get_the_modified_time('s');
	$mod = shortcode_atts( array(
		'modYear' => $modified_year,
		'modMonth' => $modified_month,
		'modDay' => $modified_day,
		'modHour' => $modified_hour,
		'modMinute' => $modified_minute,
		'modSec' => $modified_second
	), $atts );
	
	//新規投稿時は表示しない
	if($pdate > $mdate){
	   return null;	
	} else {
	  $msg = $mod['modYear'] . $mod['modMonth']. $mod['modDay'] . ' ' . $mod['modHour'] . $mod['modMinute'] .  $mod['modSec'];
	return $msg;	
	}
	
}
add_shortcode('LastModDate','last_modified_func');
```

## 関数の解説

`$pdate` = 投稿日の取得

`$mdate` = 編集日の取得  

`$modified_year` = 編集日の年の部分(西暦4桁で取得)

`$modified_month` = 編集日の月の部分(先頭に0をつける)

`$modified_day` = 編集日の日の部分(先頭に0をつける)

`$modified_hour` = 編集時間の時の部分(24時間単位)

`$modified_minute` = 編集時間の分の部分(先頭に0をつける)

`$modified_second` = 編集時間の秒の部分(先頭に0をつける)  
<br>
秒がいらない場合は、`$msg`内の `$mod['modSec']`を削除してください✌('ω')
<br>
WordPress1年目のひよっこが作成していますので、表示がおかしい等エラーがありましたら、お手数ですがコメントでご連絡ください。直ちに修正します:mask:
【Unity】AR FoundationのARCameraBackgroundでCustom Materialを使う

UnityのAR Foundationでカメラから取得した映像を背面に描画するためにARCameraBackgroundコンポーネントを使用します。この記事では、ARCameraBackgroundコンポーネントでCustom Materialを設定し、カメラから取得した映像にエフェクトをかける方法について解説します。

この記事の内容はURP、ARKit(iOS)のみで検証しています。使用しているUnityおよびパッケージのバージョンは以下のようになっています。

- **Unity:** 2021.2.10f1
- **Universal RP:** 12.1.4
- **AR Foundation:** 4.2.2
- **ARKit XR Plugin:** 4.2.2

---

まず、Custom Materialに使用するシェーダーを作成します。`/Packages/ARKit XR Plugin/Assets/Shaders/ARKitBackground.shader`を雛形として使用するので、これをAssetディレクトリ以下の適当な箇所にコピーします。

コピーしたシェーダーを編集してエフェクトを加えます。ここでは、カメラ画像の色を反転させるようにしています。

```hlsl:ARKitBackground.shaderの194行目あたり
fragment_output o;
// o.color = videoColor;
o.color = real4(1.0 - videoColor.rgb, videoColor.a);
o.depth = depthValue;
return o;
```

ビルドする際にエラーとなるので、次のようにしてLWRP向けのシェーダーバリアントが作成されないようにします。

```hlsl:ARKitBackground.shaderの38行目
// #pragma multi_compile_local __ ARKIT_BACKGROUND_URP ARKIT_BACKGROUND_LWRP
#pragma multi_compile_local __ ARKIT_BACKGROUND_URP
```

このシェーダーを使用するマテリアルを作成します。ARCameraBackgroundコンポーネントの`Use Custom Material`プロパティを有効化し、`Custom Material`プロパティに作成したマテリアルを設定します。

ビルドして実機で確認するとカメラ映像の色が反転することが確認できます。

![ARCameraBackgroundCustomMaterial.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/fdfe9fea-877a-fdb4-b97f-dce701a4382c.jpeg)
aws cliを使ったcloudwatch logsのログファイル取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278776/658aabf1-0ce6-cc5c-7160-32a70931ec90.png)

ログファイルをAWSマネジメントコンソール画面から取得するのが面倒と感じたことありませんか？

ロードを繰り返し全て表示してからアクションより検索結果をダンロード(csv)...
ログが長いと本当に面倒なので、`aws cli`を活用して一気に取得しちゃいましょう。

# コマンド

初期設定。済んでいる方はスキップしてください。

```zsh
// aws cliのインストール
brew install awscli
// jqのインストール
brew install jq

// aws cliの初期設定
aws configure

AWS Access Key ID [None]: アクセスキー ID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: 
Default output format [None]:
```

ログ取得コマンド
```zsh
// ${log_group_name}, ${log_stream_name}は取得したい情報に置き換えてください。

aws logs get-log-events --log-group-name ${log_group_name} --log-stream-name ${log_stream_name} --start-from-head --query "events[].[timestamp,message]" --output json | jq -r '["timestamp", "message"], .[] | @csv' > ~/Downloads/log-events-viewer-result.csv
```
マネジメントコンソール画面から取得できるcsvファイルとほぼ同じ内容のものがダウンロードできます。
M1 Macのためのpython3.9未満の環境構築

# 目的

M1 Macにpython3.7環境を構築したい

# 環境

```
~ ❯ sw_vers
ProductName:	macOS
ProductVersion:	12.2.1
BuildVersion:	21D62
~ ❯ sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M1
```

# 背景

1. 目的:　M1 Macにpython3.7環境を構築したい
1. 施策:　[こちらの記事](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)を参考にpyenvを導入
1. 問題: `$　pyenv install 3.7.12`にて以下のエラー発生
1. 施策:　[こちらの記事](https://qiita.com/miyacomaru/items/a105800f938de7b908e0)を参考に`$ xcode-select --install`などを実施
1. 問題:　依然として`$　pyenv install 3.7.12`は同様のエラー発生

```
~ ❯ pyenv install 3.7.12
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.12.tar.xz...
-> https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tar.xz
Installing Python-3.7.12...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 12.2.1 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/8s/dtsbb4kj5v5dq13thtlh14cc0000gn/T/python-build.20220224123613.31577
Results logged to /var/folders/8s/dtsbb4kj5v5dq13thtlh14cc0000gn/T/python-build.20220224123613.31577.log

Last 10 log lines:
      _PyLocale_localeconv in libpython3.7m.a(_localemodule.o)
  "_libintl_textdomain", referenced from:
      _PyIntl_textdomain in libpython3.7m.a(_localemodule.o)
ld: symbol(s) not found for architecture arm64
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [python.exe] Error 1
make: *** Waiting for unfinished jobs....
make: *** [Programs/_testembed] Error 1
```

# 解決方法

1. intel x86仕様のhomebrewを使ってpython3.7をインストール
1. シンボリックリンクにてpyenvのバージョンフォルダとリンク

実際にteminalにて実行したコードは以下の様．

```
# Install x86 homebrew
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
alias ibrew="arch -x86_64 /usr/local/bin/brew"

# Install Python 3.7
ibrew install python@3.7

# Add `python` executable (symlink to `python3`)
ln -s python3 "$(ibrew --prefix python@3.7)"/bin/python

# Symlink x86 Python 3.7 into pyenv
ln -s "$(ibrew --prefix python@3.7)" ~/.pyenv/versions/3.7.12

# Check
pyenv local 3.7.12
python3 -V
```

# 使用ソフトウェアバージョン

- `/opt/homebrew/bin/brew`: Apple M1仕様のhomebrew
- `/usr/local/bin/brew`: Intel x86仕様のhomebrew

```
~ ❯ pyenv -v
pyenv 2.2.4
~ ❯ /opt/homebrew/bin/brew -v
Homebrew 3.3.16
Homebrew/homebrew-core (git revision 4e9f2fa2945; last commit 2022-02-23)
~ ❯ /usr/local/bin/brew -v
Homebrew 3.3.16
Homebrew/homebrew-core (git revision ff793e4fe51; last commit 2022-02-24)
Homebrew/homebrew-cask (git revision 9303a058be; last commit 2022-02-24)
```

# 参考

- https://github.com/pyenv/pyenv/issues/1768
- https://zenn.dev/azuharu07/scraps/fe158823a6389c
- https://diewland.medium.com/how-to-install-python-3-7-on-macbook-m1-87c5b0fcb3b5
KubernetesでsidekiqをGracefulにshutdownできるようにした


Podをスケールインしたりローリングアップデートする場合に、終了するPodへのリクエストを受け付けないようにして、実行中の処理をGraceful Shutdownしたいケースがあると思います。

今回は自分が担当した案件の中でSidekiqをKubernetesで導入した際に、
コンテナのライフサイクルの挙動を制御するhookとして用意されているPreStopを用いて、安全にPodをterminateした際の備忘録を残しておきます。

また今回はSidekiqをGracefulに扱いたい場合のケースなので、
その他はそれぞれドキュメントを参照しつつ、安全な停止方法を模索する必要があります。

## 前提
- Kubernetes 1.21 on EKS
- Ruby 2.7.2
- Rails 6.0.4.4
- Sidekiq 6.4.0

## Container hooksとは

コンテナの起動・終了時点で任意の処理が実行できます。
二種類のhookが存在します。

### hooks
|  k  |  v  |
| ---- | ---- |
|  PostStart  |  コンテナ起動後に任意の処理を実行できる  |
|  PreStop  |  コンテナ終了前に任意の処理を実行できる  |


参考
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks

### implementations

#### Exec

```yaml
# 省略
lifecycle:
  preStop:
    exec:
      command: [
        "/bin/sh", 
        "-c", 
        "echo HELLO"
      ]
```
#### HTTP

```yaml
# 省略
lifecycle:
  preStop:
    httpGet:
      scheme: HTTP
        port: 80
        path: "/hoge"
```
参考
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-implementations

### 注意点

- PostStartの場合hookの時間がかかりすぎるとPodが起動しないので軽量な処理にするべき。
- PreStopの場合terminationGracePeriodSecondsを過ぎると時間切れで強制終了する。

参考
https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/


## sidekiq6をGraceful Shutdownする方法


**Sidekiq < 6**

```bash
$ bundle exec sidekiqctl stop
```
**Sidekiq >= 6**

```bash
$ kill -SIGTSTP ${sidekiqのPID}
```

今回はsidekiq６を利用しているので、後者になります。

参考
https://github.com/arturictus/sidekiq_alive
https://github.com/arturictus/sidekiq_alive/issues/47

## PreStopでkillコマンドを実行

Execを用いて、先ほど調べたコマンドをそのまま実行しました。

```yaml
# 省略
lifecycle:
  preStop:
    exec:
      command:
        [
          "/bin/bash",
          "-c",
          "SIDEKIQ_PID=$(ps aux | grep sidekiq | grep busy | awk '{ print $2 }'); kill -SIGTSTP $SIDEKIQ_PID",
        ]
```

## Podをリスタートして挙動を確認

```bash
$ k rollout restart deployments/xxx

#sidekiqが起動した
2022-02-21T10:43:40.213Z pid=14 tid=8ui DEBUG: {:queues=>["default"] #略}

# PreStopの処理
# TSTP signalを受信し、Graceful Shutdownしていることを確認
2022-02-21T10:47:56.512Z pid=14 tid=8ui DEBUG: Got TSTP signal
2022-02-21T10:47:56.512Z pid=14 tid=8ui INFO: Received TSTP, no longer accepting new work
2022-02-21T10:47:56.512Z pid=14 tid=8ui INFO: Terminating quiet workers
2022-02-21T10:47:56.513Z pid=14 tid=vtu INFO: Scheduler exiting...
```

## 参考
- https://www.bigbinary.com/blog/graceful-shutdown-of-sidekiq-processes-on-k8s
- https://kubernetes.io/ja/docs/concepts/containers/container-lifecycle-hooks
- https://github.com/arturictus/sidekiq_alive
画像に対する異常検知のアプローチと手法【機械学習】

製造業の外観検査システム案件で必要になったので、画像の異常検知のアプローチと手法について調べてみました。

# 異常検知のアプローチ
大まかに下記４つのアプローチに分けられる。（これ以外にもマイナーなアプローチもあり。）

 - 分類アプローチ：データの正常・異常を分類する決定境界を学習する。

 - 確率アプローチ：正常データの確率分布を推定し、生起確率が低いデータを異常と判定する。

 - 生成アプローチ：正常データを再構成するモデルを学習し、再構成できなかったデータを異常と判定する。

 - 距離アプローチ：正常データとの距離により、異常データを検出する。


# 画像用の異常検知に利用できる手法
見つけた機械学習ベースの手法を列挙しました。

## 非ディープラーニング系
### SVM
SVM（Support Vector Machine）は、教師あり学習の機械学習モデルのひとつ。分類タスクや回帰タスクへ適用可能。
データが画像の場合、次元数が膨大（生データだと、次元数 = width * height * channel）となるため、PCA（Principal Component Analysis）などのアルゴリズムで次元削減してから使う。
異常検知問題では、正常データのみを学習するOC-SVM (One Class SVM)がよく利用される。
分類アプローチ。

### MSPC（多変量統計的プロセス管理）
MSPC（Multivariate Statistical Process Control）は、多数の変数間の相関関係を考慮して異常を検知する手法。
画像の場合、SVMと同様に、PCAなどで次元削減して変数を抽出する。
また、異常の判定にはホテリングのT2法(Hotelling's T-squared method)などのアルゴリズムが主に使用される。
確率アプローチ。

## ディープラーニング系
### Auto Encoder（オートエンコーダ）
Auto Encoderは、入力と出力が等しくなるように学習するニューラルネットワークの手法。
中間層の次元を小さくすることで、特徴量を抽出（次元圧縮）するエンコーダと、その特徴量からデータを復元するデコーダを作成することができる。
正常データのみを学習させることで正常以外の特徴量が失われるようなモデルとなり、異常データが入力された時も正常データとして復元されるようになる。
その入出力の差分を利用することで異常を判定している。
生成アプローチ。

### Deep Metric Learning（深層距離学習）
入力データ同士の類似度を学習するニューラルネットワークの手法。
特徴量が似ているデータ同士は距離が小さくなり、似ていないデータ同士は距離が大きくなるように学習を行う。
正常データとの類似度を算出するモデルを作成することで、異常を判定することができる。
距離アプローチ。


# 所感
いろいろなアプローチがあるが、手法によって適用できる条件やメリット・デメリットが異なるので、案件によって使い分けるのが良さそう。
ディープラーニング系の手法は学習データ用の画像が大量に必要になるので、そのあたりが現場では課題になっている。

なお、異常検知用の学習データセットについて[前回の記事（下記URL）](https://qiita.com/umapyoi/items/b5942e3fe379c6751b1e)でデータセット一覧をまとめているので、異常検知モデルを開発したい方は、そちらもご参照ください。

https://qiita.com/umapyoi/items/b5942e3fe379c6751b1e

# 異常検知の関連記事

https://qiita.com/umapyoi/items/ddd45a47aa79ccbde28b
AzureADのフェデレーションモードのドメインのSAML証明書を更新する

Google WorkspaceをIdPとしてAzureADを構成しているのですが、SAML証明書が有効期限を迎えてしまったので、その更新手順です。

### Google Workspace側の作業

1. Google Workspaceの管理画面で、アプリ > ウェブアプリとモバイルアプリ > Microsoft Office 365 > サービス プロバイダの詳細にアクセスする
1. 「証明書を管理」ボタンを選択
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/f3becf81-8ec6-7bc9-fc44-671f074914b6.jpeg)
1. 「証明書の追加」ボタンを選択  
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219010/3ab021eb-e18e-d66e-3448-08d7efa206df.jpeg)
1. 発行された証明書データをコピーしておく

### Msolコマンド(PowerShell)側の作業

``` cmdlet.ps
> Connect-MsolService
> $cert = "-----BEGIN CERTIFICATE----- ... [上で追加した証明書データから改行文字を除いたもの] ... -----END CERTIFICATE-----"
> Set-MsolDomainFederationSettings -DomainName "[フェデレーションモードのドメイン]" -SigningCertificate $cert -PreferredAuthenticationProtocol "SAMLP"
```

`Get-MsolDomainFederationSettings -DomainName [ドメイン] ` を実行してみて証明書が置き換わっていれば設定OKかと思います。置き換えたらGoogle Workspace側の古いSAML証明書は削除しておきましょう。

PreferredAuthenticationProtocol "SAMLP" を指定しないとならないようで、これが判明するまでに時間がかかってしまいました。

設定更新のためのMsolコマンドレットはどれを実行すればいいんだ??という状態だったのでメモしてみました。
tar gz の 作成 解凍

## tar gz 作成
`aaa`ディレクトリ`aaa.tar.gz`に圧縮

```
tar -czvf aaa.tar.gz aaa
```

## tar gz 解凍

```
 tar -zxvf aaa.tar.gz
```

## 参考

https://www.cyberciti.biz/faq/how-to-create-tar-gz-file-in-linux-using-command-line/

https://qiita.com/supersaiakujin/items/c6b54e9add21d375161f
flutterでignore: non_constant_identifier_namesと出てしまう場合の対処法

クラスの先頭にこちらのコメントアウトを追加してください。

    // ignore_for_file: non_constant_identifier_names

そうすることで一つ一つにコメントアウトでignore: non_constant_identifier_namesを変数定義の度につけなくても注意が出なくなります。

##プロジェクト全体で無視したい場合はanalysis_options.yamlファイルでこちらを追加

    include: package:lints/recommended.yaml

    linter:
      rules:
        non_constant_identifier_names: false

そうすることで表示されなくなります。

仕事でスネークケースを使うことになったんですが、dartでスネークケースは許容されてなくて全てのコードにコメントアウトでignore: non_constant_identifier_namesをつけるのはしんどいなって思ったので、探したらこの方法があったので共有です。

どなたかの参考になれば幸いです。
可変長の連想配列の型指定方法について

連想配列の型指定について自分のメモ用を兼ねて投稿します。


```ts
const Fruits = {
 fruit1: "apple",
 fruit2: "orange",
 fruit3: "banana",
 ...
 fruit10: "grape"
}
```

上記のような連想配列があるとします。
オブジェクトの長さは10固定ではなく、長さが分からない設定です。

自分は最初下記のような型をどうやって一般化しようか考えていました。
しかし、そんなに難しく考えなくても良かったです。

```ts
type FruitsType = {
 fruit1: "string";
 fruit2: "string";
 fruit3: "string";
 ...
 fruit10: "string";
}
```

下記のようにすれば瞬殺です。

```ts
type FruitsType = {
  [key: string]: string
}
```

連想配列のkeyに対して型指定ができるのは知らなかったです・・・
keyはstring型とnumber型を指定できるようです。

参考URL
https://golang.hateblo.jp/entry/2021/03/15/202502
Wix Toolsetでインストーラを作ってみる（準備編）

# はじめに
現在携わっている仕事の中でインストーラを作る機会がありWix Toolsetの存在を知りました。
自分自身でいろいろと調べては見るもののポンコツな英語力では公式リファレンスを熟読できるわけもなく悪戦苦闘しました。

というわけ？で、今回は何となく調べてわかった（つもりになっている）ことを備忘録として書いていきます。（初投稿記事のため、拙い文章お許しください）

# Wix Toolsetってなに？
<font color=red><b>W</b></font>indows <font color=red><b>I</b></font>nstaller <font color=red><b>X</b></font>ML <font color=red><b>Toolset</b></font>の文字を取ってきたもので、
XMLからWindows Installer（MSI）パッケージを作成するツールです。

Visual Studioの拡張機能として追加することでVisual Studio上でMSIパッケージを作成できるようになります。私自身はVisual Studio上でインストーラを作成したので、今回はその方法について何回かに分けて書いていきます。

# Visual Studio × Wix Toolsetの使い方
前述の通りVisual StudioでWix Toolsetを使うには拡張機能として以下の2つをダウンロードする必要があります。いずれもVisual Studioの「拡張機能の管理」から”Wix”と検索するとすぐに出てきます。

1. Wix Toolset Visual Studio 2019 Extension
2. Wix Toolset Build Tools

## Wix Toolset Visual Studio 2019 Extension
まず1つ目が「Wix Toolset Visual Studio 2019 Extension」です。
今回はVisual Studio 2019を使用しているため上記をダウンロードしましたが、ご自身の開発環境に合わせたものをダウンロードしてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/e63eb4da-05c0-9b12-f414-a8b0ace02ead.png" width=450>

## Wix Toolset Build Tools
2つ目が「Wix Toolset Build Tools」です。
こちらは.Net Framework 3.5を必要とするので注意しましょう！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/ef127233-3cba-a294-a285-cbe2560e018b.png" width=450>

#### Windows10で.Net Framework 3.5を有効にする方法
1. コントロールパネルから[プログラム]>[Windowsの機能の有効化または無効化]を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/99a7ba9e-343b-41d7-5845-c9bf37042199.png" width=450><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/6a9078ac-5cdb-80c3-d0f4-cd401bd1fc4e.png" width=450>
2. Windowsの機能から[.NET Framework 3.5 (.NET 2.0および3.0を含む)]にチェックを付ける
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/c834941b-6150-1c97-c4cb-92f9fb35dcc0.png" width=450>

# まずはプロジェクトを作れるか確認
上記までの準備が終われば、次にVisual Studio 2019で実際にプロジェクトが作成できることを確認します。Visual Studio 2019の「新しいプロジェクトの作成」画面にて、__「Setup Project for WiX v3」__という項目があるので選択し任意の名前を付けてプロジェクトを作成します。これができれば準備は完了です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1214834/c28ee668-ad14-0dec-e198-142d04927fc4.png" width=450>

# 次回
ここまでで準備が完了したので次回からはインストーラを実際に作ってみようと思います。
まずは簡単に最小限のインストーラ、次にUIのカスタマイズ…と言ったようにいろいろ書いていきたいと思います。
100日でSQLの達人になる@LeetCode! Day24 <Medium問題に初挑戦>

## 1445. Apples & Oranges （問題レベル: Medium）要課金
今日の問題はこれ。
同じテーブルに日毎にりんごの売上個数とオレンジの売上個数がリストされている。
ここから、りんごの売上個数-オレンジの売上個数を日毎にリストするという問題。

今日から`Medium`問題に初挑戦。最初は簡単なものということで正解率の高いものを選択しました。
この問題は、りんごの売上テーブルとみかんの売上テーブルに2つに分けて差を出すという解法で自力でAcceptされました。

`Discuss`を見ると、`SUM()`と`CASE WHEN`を使って、りんごなら足して、オレンジなら売上個数を引くという解法もあった。

今日のポイントは、同じ結果を出力するにも色々な方法がある。
にしておこう。

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Terrainの地形を動的に自動生成する

#Terrainの地形の保存先
`Terrain`の地形のデータは`TerrainData`の中の`heightmap`に`floatの2次元配列`で保存されている。
`heightmap`は地形の高さを表すテクスチャのようなものであり、要素の中には`0.0f～1.0f`の値が入っています。
この値は`Terrainの高さの割合`で、例えば`Terrain`の高さが`5.0f`の時、要素の値が`0.5f`だった場合高さは`2.5f`となる。

今回は、この`heightmap`を変更して地形を作っていきます。

#活用する変数とメソッド
```C#:TerrainDataを取得する
Terrain terrain = GetComponent<Terrain>();
TerrainData terrainData = terrain.terrainData;
```
```C#:Terrainの大きさを変更する
terrainData.size = new Vector3(x, height, z);
```
```C#:heightmapの解像度を取得する
int heightmapSize = terrainData.heightmapResolution; //地形の大きさ
```
```C#:heightmapを渡す
//地形のデータを渡す
terrainData.SetHeights(0, 0, heightmap);
```
#サンプルプログラム
パーリンノイズを利用した地形を生成するサンプルです。
インスペクターの`生成`か、`Generate()`を呼ぶことで生成できます。

```C#:TerrainGenerator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

[RequireComponent(typeof(Terrain))]
public class TerrainGenerator : MonoBehaviour
{
	[SerializeField] Vector2Int terrainSize; //Terrainのサイズ
	[SerializeField] float height; //Terrainの高さ
	[SerializeField] float relief; //地形の滑らかさ

	float seedX, seedY;

	public void Generate()
	{
		//Terrain関連のコンポーネントを取得する
		Terrain terrain = GetComponent<Terrain>();
		TerrainCollider terrainCollider = GetComponent<TerrainCollider>();
		TerrainData terrainData = terrain.terrainData;

		//シード値を設定する
		seedX = Random.value * 100f;
		seedY = Random.value * 100f;

		//Terrainのサイズを変更する
		terrainData.size = new Vector3(terrainSize.x, height, terrainSize.y);

		//地形に関する変数を用意する
		int heightmapSize = terrainData.heightmapResolution; //地形の大きさ
		float[,] heightmap = new float[heightmapSize, heightmapSize]; //地形のデータ(0 ～ 1)
		
		//地形を変更する
		for(int y = 0; y < heightmapSize; y++)
		{
			for(int x = 0; x < heightmapSize; x++)
			{
				float sampleX = seedX + x / relief;
				float sampleY = seedY + y / relief;
				float noise = Mathf.PerlinNoise(sampleX, sampleY);

				heightmap[x, y] = noise;
			}
		}

		//地形のデータを渡す
		terrainData.SetHeights(0, 0, heightmap);

		//作ったTerrainDataを渡す
		terrain.terrainData = terrainData;
		terrainCollider.terrainData = terrainData;
	}
}

/// <summary>
/// インスペクターに「生成」のボタンを作る
/// </summary>
#if UNITY_EDITOR
[CanEditMultipleObjects]
[CustomEditor(typeof(TerrainGenerator))]
public class TerrainGeneratorEditor : Editor
{
	public override void OnInspectorGUI()
	{
		TerrainGenerator terrainGenerator = target as TerrainGenerator;

		base.OnInspectorGUI();

		EditorGUILayout.Space();

		if (GUILayout.Button("生成"))
		{
			terrainGenerator.Generate();
		}
	}
}
#endif
```
100日でSQLの達人になる@LeetCode! Day23 <MySQLのGROUP_CONCATをMS SQL ServerのSTRING_AGGを使って実現する>

## 1484. Group Sold Products By The Date （問題レベル: Easy）要課金
今日の問題はこれです。
日付毎に売れたアイテムの種類をカンマ区切りでリストアップし、そのアイテムの個数を取得するという問題。
'LeetCode Curated SQL 70'の'Easy'最終問題に選んだものです。
少し特殊な問題で、複数行データを一つの行にまとめてカンマ区切りにしないといけない。
また、同じアイテムを同じ日に購入した場合は、カウントしないというのも、なかなか厄介な条件。

これはMySQLでは'GROUP_CONCAT'という分かりやすいコマンド名で下記のように実現できるのだが、MS SQL Serverではこのコマンドは使えません。
```:MySQL
SELECT sell_date, COUNT(DISTINCT product) AS num_sold, 
GROUP_CONCAT(DISTINCT product ORDER BY product ASC) AS products
FROM activities
GROUP BY(sell_date)
```
調べると以前は、`FOR XML PATH('')`を使うようですが、
`MS SQL Server`の2017年版からは、`STRING_AGG`コマンドが使えるようになっているみたいです。
ただ、`MySQL`の`GROUP_CONCAT`コマンドとは違って、このコマンド内で`DISTINCT`が使えないために、
コマンドに入れる前に複数行を統合する処理が一手間かかる。
最終的に提出したコマンドは下記。
```:MS SQL Server
SELECT a.sell_date, COUNT(a.product) AS num_sold, 
STRING_AGG(a.product, ',') WITHIN GROUP(ORDER BY product ASC) AS products
FROM (SELECT DISTINCT sell_date, product FROM activities) a
GROUP BY(sell_date)
```

まとめ。
今回のポイントは`MS SQL Server`で`MySQLのGROUP_CONCAT`と同様のことを実現したい場合は`STRING_AGG`を使う（ただし要注意）だった。
次回からは`Medium`問題に挑戦します！

* [LeetCode](https://leetcode.com/)の問題は、`MS SQL Server`で解いています。
Unityのゲーム実行時UIはまだまだuGUIかなって思った/エディタ拡張はUI Toolkit(UIElements)になりそうだけど

# TL; DR

情報も少ないし複雑で分かりづらいので、ゲーム内UIでは無理にUIElements(UI Toolkit)使わないでuGUI使っていけばいいと思う。UI Toolkitでできないことはまだまだたくさんあるし。

# 情報源

- https://docs.unity3d.com/Manual/UIElements.html
- https://docs.unity3d.com/Manual/UI-system-compare.html

# 要点

https://docs.unity3d.com/Manual/UI-system-compare.html これを見れば分かる通り、 UI Toolkit ではまだまだ `Planned` となっている未実装機能がたくさんあります。つまり uGUI の UI 実装をそのまま移植するのには機能が足りていません。(だからこそ uGUI と共存できる、と UI Toolkit の説明に書いてあります)

ゲーム実行時のUIというのは、(プロジェクトや文化にも依りますが)コードに沿った上品なUIの振る舞いを超えて、時々無茶な実装を求められることがあり、そういう例外的なワガママに応えようと思ったときにはどうしてもプログラム(スクリプト)であれこれいじくり回す必要が出てきます。

そういうエクストリーム実装に対してはまだまだ知見も安定性も足りてないと思うので、ゲーム中で使われるUIはまだまだuGUIで作っていくのが幸せなのかな、という感想です。

一方、エディタ拡張はそんな極端な動きを求められることは少なく、一定のパターンに沿った実装であるべきと思うので、こちらの実装はUI　Toolkit化させていくように色々学んでいくところかな、と思います。
form_forにおけるsubmitの役割について

```erb
<%= form_for @post do |f| %>
  <div class="field">
    <%= f.label :body %>
    <%= f.text_field :body, :size => 140 %>
  </div>
  <%= f.submit "投稿する" %>
<% end %>
```

におけるf.submitの役割は
`@post`の中身が`Post.new`(空の箱)の場合はcreateアクションに遷移する。
投稿内容を書き換えたい場合、
`@post`の中身を書き換えることになり、中身は`Post.new`ではないので、その場合はupdateアクションに遷移する仕組みとなっている。
【Git】git-ftpを使ってFTPアップロード

# はじめに
普段、FTPでサーバーにファイルをアップロードする時は「FileZilla」で手動でアップロードを行なっているのだが、アップロードするディレクトリやファイルを間違えたり、繋いでるサーバーがそもそも間違えていたり、ヒヤッとする場面が少なからず定期的に起きてしまう。(ただ私の不注意なだけなのだが...)

そこで、ある案件の今後の更新の運用体制を整理するにあたり、これからはFTPでのアップロードは手動ではなく「Git-ftp」を使おう！となったので、初回設定から実際の使用方法まで、自分の復習も兼ねて記事を書いてみる。



# git-ftpの導入手順


Mac
※ homebrew 導入済
※ GitLabでファイル管理中

ターミナルで以下を実行

```
$ brew install git-ftp 
```

# git-ftp　各種設定

Gitで管理しているフォルダ内へ移動し下記を設定

```
$ git config git-ftp.syncroot 手元ファイルのルートディレクトリ
$ git config git-ftp.url ftp://ホスト名/該当するフォルダまでのパス
$ git config git-ftp.user ユーザ名
$ git config git-ftp.password パスワード
```

上記実行後、`.git/.config`に以下のように設定が反映されてたらOK

```
[git-ftp]
	syncroot = アップロードするルートディレクトり
	url = ftp://ホスト名/該当するフォルダまでのパス
	user = ユーザ名
	password = パスワード
```

# 初回デプロイ

＊ファイルをまだアップロードしていない場合
以下のコマンドで全てのファイルがアップロードされる

```
 $ git ftp init -v
```

＊ファイルはすでにアップロード済みの場合
`git-ftp.log`ファイルだけアップロードされる

```
$ git ftp catchup
```

# それ以降

変更点をコミットした後に以下を実行

```
$ git ftp push
```

# 差分を確認してpush

1. サーバー上の`git-ftp.log`を開きコミット識別番号をコピペ
2. 以下のコマンドを叩き、サーバ上のファイルとリポジトリとの差分を確認する。
2. 差分、変更点に問題なければpush

```
$ git diff --name-only HEAD 616715abcdefgabcdefgabcdefgabcdefg
$ git ftp push
```


# 更新手順
0. 変更点をいつも通りコミットする
1. `git ftp push`でプッシュ
1. 実際の反映を確認

# 参考
https://qiita.com/sayama0402/items/d3d11bbc6b09b9b78527
https://blog.members.co.jp/article/40241

# 終わりに
FileZillaなどのアプリを使ってのアップロードの方が視認性あって分かりやすい！となりそうな気もするが、慣れたら確実にgit-ftpの方が楽だろうなあ、と感じました。
また、ファイル転送時の安全性と、各環境ごとの差分が生まれにくいメリットは大きいなあ。
参考URLの内容とほぼ差異はないですが自学の為ということで。
NotionでMermaidを使って図形を描く

# はじめに

みなさん、Notion使ってますか？
Notionは、メモ、タスク、Wiki、すべてをひとつで管理できるSaaSです。
最近では、日本語化も行われたNotionですが、
いつの間にか「図形」を描くことができるようになっていたので紹介したいと思います。

# 目次

- [概要](#概要)
- [使い方](#使い方)
- [mermaidについて](#mermaidについて)
- [最後に](#最後に)

# 概要

Notionで図形を描くことができるようになったのですが、図形エディタが搭載されたとか、そういうのではありません。

簡単なコードを書くと、それが図形に変換される仕組みです。
コードは、Notionのコードブロックに記述します。

Mermaidという図形を描画するJSのライブラリがあるのですが、コードブロックがこのMermaidに対応したのです。

# 使い方

## Notionのページの中にコードブロックを作ります

![スクリーンショット 2022-02-22 21.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/5f9457f7-a5dc-c0a1-30de-2f5e9dc17415.png)

## コードブロックの言語に「Mermaid」を選択します
    
![スクリーンショット 2022-02-22 22.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/9cf6eaae-7c5a-71c6-bbc8-90b01c375174.png)

![スクリーンショット 2022-02-22 21.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/cfe58493-4f41-c201-de7a-66ec7f2e765b.png)

        
## 初期画面ではエラーっぽいのが表示されますが気にしない

![スクリーンショット 2022-02-22 21.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/cc2c4260-08d6-3bff-f3d0-ba80011d19d4.png)


## サンプルを打ってみる

```mermaid
flowchart TD
    開始 --> 終了
```

すると

![スクリーンショット 2022-02-22 22.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/fa244b33-bd1e-7c32-cabc-d68bf9ef7696.png)


図形が描画されます。

## もう少し複雑な図形を描いてみましょう

```mermaid
flowchart LR
  S([開始]) --> a
  a[(データ取得)] --> b
  b{対象データか?} --> |YES| c
  b --> |NO| d
  c[[データ更新]] --> d
  d([終了])
```

![スクリーンショット 2022-02-22 23.47.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261675/2243bae2-4249-d43e-0fca-ab97bb8a2736.png)


# mermaidについて

mermaidは様々な図を描画することができますが、自由自在に描けるのではなく、特定のジャンルの図形を少ないコードで描くことに特化しています。

mermaidは今回サンプルとして紹介したフローチャートの他にも次のようなものがサポートされています。

- クラス図
- ER図
- シーケンス図
- 状態図
- ガント図
- ブランチツリー
- etc.

公式サイト
https://mermaid-js.github.io/mermaid

チートシートはこちら
https://jojozhuang.github.io/tutorial/mermaid-cheat-sheet/



# 最後に

Notionだけでなく
GitHub、GitLab、Joplin、Redmine、Atlassianなどもmermaidに対応しています。

mermaid記法がmarkdown記法みたいに普及したりするかもしれませんね。
PostgreSQL逆引きメモ

必要に迫られたPostgresSQLの逆引きメモです。

## シーケンスのズレを修正する方法
該当列のシーケンスを確認する。
```sql
select
         d.objid
         , cd.relname
         , cd.relkind
         , d.refobjid
         , cr.relname
         , d.refobjsubid
         , d.deptype
     from
         pg_depend d
         inner join pg_class cd
         on cd.oid = d.objid
         inner join pg_class cr
         on cr.oid = d.refobjid
     where
         cr.relname = 'test_table';
```

該当列の最大値を取得
```sql
select max(test_id) from table;
```

シーケンスの現在値を取得
```sql
select nextval('test_table_test_id_seq');
```

シーケンスの値を修正
```sql
select setval('test_table_test_id_seq', (select max(test_id) from test_table));
```

## 作成済みのテーブル一覧を取得

```sql
select
    schemaname
    , tablename
    , tableowner
from
    pg_tables
where
    schemaname not like 'pg_%'
    and schemaname != 'information_schema';
```

## 参考

* [PostgreSQL | 作成済みのテーブル一覧を表示する](https://www.dbonline.jp/postgresql/table/index9.html)
パスワードは使い回したくない、でも覚えるのが面倒な人へ

## 対象読者

- 「パスワードの使い回しは危険だ」と理解している
- ブラウザのパスワード記憶機能はなるべく使いたくないが、何個もパスワードを覚えるのはイヤだ

## 結論

1. 自分で覚えやすいパスワードを１つ作る
2. そのパスワードをいろいろな方法で**暗号化**したものを諸々のWebサービスで利用する

つまりこの方法なら、１つだけパスワードを覚えさえすればいいのです。
わざわざ何個もパスワードを覚える必要はなく、ただそれを暗号に変換してやるだけです。

なのであとは暗号化の方法ですね。ここからは、簡単な暗号についてご紹介します。

## 暗号の種類

ここでは、代表的な古典暗号

- シーザー暗号
- アトバシュ暗号
- スキュタレー暗号

の３つを解説します。

#### シーザー暗号
シーザー暗号は、元の文字を3文字分辞書順でズラすことで暗号とする手法です。

つまり、アルファベットの場合
ABCDEFGHIJKLMNOPQRSTUVWXYZ
を、それぞれ
XYZABCDEFGHIJKLMNOPQRSTUVW
に置き換えるということです。

例えば、
**JAPAN**
という文字列をシーザー暗号に変換したいなら、
**J → G**
**A → X**
**P → M**
**N → K**
のように、アルファベット順で3文字前に来るアルファベットに変換します。

すると、
**JAPAN → GXMXK**
と変換できます。

数字の場合も同様に変換することができます。
**0123456789**
をそれぞれ
**7890123456**
と変換すればよいですね。

ちなみにこのシーザー暗号は、Wikipediaによると
「暗号理論上、もっともシンプルで、広く知られた暗号のひとつ」
と言われており、簡単に暗号に変換できます。


#### アトバシュ暗号

アトバシュ暗号は、元の文字を辞書の逆順に対応する文字で置き換えます。

アルファベットの場合、
**ABCDEFGHIJKLMNOPQRSTUVWXYZ**
をそれぞれ、
**ZYXWVUTSRQPONMLKJIHGFEDCBA**
と、逆位置のアルファベットで置き換えるということです。

数字なら
**0123456789**
をそれぞれ、
**987654210**
と置き換えればよいでしょう。

#### スキュタレー暗号
スキュタレー暗号は、あの「ピタゴラスイッチ」でやっていた「**ピタゴラ暗号棒**」と全く同じものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1900599/e3b619dc-8db3-89df-23a3-954d95729470.png)
（画像引用元：「ピタゴラ暗号棒」アメブロ https://ameblo.jp/bluelapislazuli77/entry-12102353664.html）

要は、ある一定の間隔でとびとびに文字を配置していけばよいのです。

例えば、
**おはようございますはじめまして**
という文字列をスキュタレー暗号にしたいとします。

そのときは、これを例えば

**おはようご**
**ざいますは**
**じめまして**

と5文字ごとに改行して書き下します。

これを横（→）ではなく縦（↓）に読んでいけば、

**おざじ はいめ よまま うすし ごはて**

となります。2文字飛ばしで読めば解読できるようになっています。

パスワードっぽい文字列で説明すると、

**JAPAN12345**

というパスワードを

**JAP**
**AN1**
**234**
**5**

と書き下し、縦に読むと

**JA25AN3P14**

となります。

※
そういえば「プチリョンコ」「パタトクカシーー」のやつも同じ原理ですね。「プチリョンコ」を1文字飛ばしでよむと「プリン」「チョコ」がでてきて、「パタトクカシーー」も同様に「パトカー」と「タクシー」が出てきます。

## まとめ

| 暗号名 | アルゴリズム |
|:-:|:-:|
|シーザー暗号| 3文字分ズラした文字で置き換える |
|アトバシュ暗号| 逆位置の文字で置き換える |
|スキュタレー暗号| ピタゴラ暗号棒（一定間隔で文字を配置する） |

## 参考サイト
- 「シーザー暗号」フリー百科事典 Wikipedia 日本語版 最終更新＝2021年8月4日
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7
- 「古来より伝わる暗号の初歩　～アトバシュ暗号とは～」ラインセグメント日記  2017年05月24日
https://line-segment.seesaa.net/article/450135591.html
- 「スキュタレー」 フリー百科事典 Wikipedia 日本語版 最終更新＝2021年11月3日
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AD%E3%83%A5%E3%82%BF%E3%83%AC%E3%83%BC
- 「【古典暗号】種類と特性のまとめ」 俺が人生を楽しむためのITブログ  2019年10月24日
https://oretano.com/old-currency
「Herokuの起動が重すぎる」を解決する方法

#はじめに
　現在オリジナルアプリで朝散歩習慣化アプリを作っています。
Herokuにデプロイしているのですが、立ち上がりがとにかく遅くて使い勝手が悪い。
今回はHerokuの立ち上がりを早くする方法について学んだのでまとめます。


#なぜ起動が遅くなるのか
　Herokuの立ち上がりが遅い原因は、「30分アクセスがないとスリープモードになる」という仕様があるためらしいです。
そのため、スリープにしないために設定を変える必要があります。

#Herokuにスケジューラを追加

 まずはターミナルで下記のコマンドを打ちます。

```
% heroku addons:create scheduler:standard
```
すると以下のような表示が出ます。

```
Creating scheduler:standard on ⬢ morning-walk... free
 To manage scheduled jobs run:
 heroku addons:open scheduler

Created scheduler-flexible-28737
Use heroku addons:docs scheduler to view documentation
```

#ジョブを作成する
続いてターミナルに以下のコマンドを打ちます。

```
% heroku addons:open scheduler
```

すると以下のような画面が出ます。

[![Image from Gyazo](https://i.gyazo.com/e2e02cd4b5127479b17f06df7535eff7.png)](https://gyazo.com/e2e02cd4b5127479b17f06df7535eff7)

「Create job」ボタンを押すと、次に以下のような画面が出ます。

[![Image from Gyazo](https://i.gyazo.com/8e9b37946b0a4a98a77e8b147e03dc4c.png)](https://gyazo.com/8e9b37946b0a4a98a77e8b147e03dc4c)

この入力欄に

・Every 10 minutes

・curl https://morning-walk.herokuapp.com/
（curlの後は、自分のアプリのURLを記載してください）

・free


と入力すると完了です。

[![Image from Gyazo](https://i.gyazo.com/b3f6eb9584e85234f5e2adb7a205d3bd.png)](https://gyazo.com/b3f6eb9584e85234f5e2adb7a205d3bd)


ここまでで、
設定したHerokuアプリを１０分毎に起動させる処理にできました。

#まとめ
Herokuでアプリを作ると、とにかく起動が重いですが、
このような方法があると知れてよかったです。

今後は、Herokuではない別の環境でアプリを実行させたいと思います。

（これから情報収集するのですが、Heroku以外でおすすめの環境があれば教えていただけると嬉しいです💦）

参考文献↓
https://yukitoku-sw.hatenablog.com/entry/2020/02/04/225151
postman + newmanで詰まったこと

## はじめに

テストは見るべきパターンこそ多いですが、期待値は複数のケースで同じものが現れることも多いです。
そして僕の眼球や脳はポンコツなので、似たようなパターンを手作業で確認していると**絶対に**ミスをやらかすという自負があります。

したがって、似たようなパターンのテストはプログラムに任せた方が**楽で安全で確実**です。

なお、今回はトラブルシュートの記事です。
collection作成やエクスポート、Newmanのコマンドについては、既に分かりやすい記事がいくつもあるのでそちらを参照ください。

一応説明しておきますと、PostmanはAPIを気軽に叩けるツール、NewmanはCLI版Postmanです。
## 1. 環境変数が読み込まれない

**解決策：`INITIAL VALUE`に値を入れてエクスポートしましょう。**

Postmanでは問題なく動いていた APIが、`newman run`ではエラーで全滅する事象にぶつかりました。
出力をよーく見てみると、環境変数で切り替えるようにしていたドメイン部分が消えている‥‥？
そもそものURLが壊れているなら疎通も何もあったもんじゃないです。

とりあえず環境変数持ってるjsonファイルを`bat`してみると、`value`のところが見事に全部空でした。何もないヌルか‥‥
![2021-12-06_144241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065089/4794247a-1f27-437d-f0e3-18c06cab8e74.png)
ちょっと天啓に導かれたので、Postmanの環境変数を確認してみます。
![2021-12-03 171444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065089/fcee193f-0d12-7973-b108-869a2dfa8b8a.png)
(0M0)やはりそういうことか
Postmanの環境変数には`INITIAL VALUE`と`CURRENT VALUE`がありますが、前者はPostmanのサーバに送信・同期されるそうです。
僕は秘密主義なので、後者のみを使っていました。
しかし`Postman_environment.json`をエクスポートする際、前者のみを環境変数のvalueとして採用するようです。かわいいね
結果として、僕は何の値も入っていないjsonを環境変数として入力していました。

エクスポート時に`CURRENT VALUE`を見るようにする設定とかないかなー、と思って探してみましたが見当たりませんでした。
`INITIAL VALUE`を非表示にしてエクスポート、とかもやってみたけど、そこに意味などありませんでしたね。

## 2. `Hostname/IP does not match certificate's altnames`

**解決策：`newman run`に`-k`オプションをつける⚠**

ただし、このオプションの意味は`Disable SSL certificate verification`です。ﾃﾞｨｽｴｲﾌﾞﾙｴｽｴｽｴｩｻｰﾃｨﾌｨｹｲﾖﾍﾞﾘﾌｨｹｲｼｬﾝ🤗

Postmanにも同じようなオプションがありますね(画像左上の`SSL certificate verification`)。
このオプションがONのとき、Postmanは通信相手のSSL証明書を検証し、自己署名証明書を使っているサーバのAPIを叩こうとした場合はエラーを出します。
![image-20211203165603552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065089/5664df48-fec3-3c80-c1d8-d837201060ee.png)
「PostmanにこのオプションがあるならNewmanにもあるでしょ🤔」って`newman -h`叩いたら`-k`を見つけました。

このオプションをOFFにすることで、Postman/Newman側で証明書の検証をしなくなります。
オレオレ証明書を使っているサーバでも疎通できるようになりますが、そもそもオレオレ証明書を使っていること自体がリスクの温床です。

今回の例ではクライアントもサーバも何者か分かっているので問題ない‥‥と思いますが、それでもなりすましや改竄を検知できないのは怖いです。
家を出たとき鍵を閉めたか憶えてないときくらい不安です。**その精神状態でコレを書いてます。**

つまり、最善の解決方法はちゃんとした証明書を買うことです。お金を払えば無料で証明書が手に入るんだから安いですよね。
ELB暖機申請まとめ

## はじめに
ELBの暖機申請を実施する時に何をサポートに伝えればいいんだっけ？を自分の備忘も兼ねてまとめておく。

## 本題
ELBの暖機申請はAWSサポートから起票します。
内容に不備・不明点があればAWSサポートから質問が来ますので一発で申請を完璧にする必要はありません。
条件が整えば、申請した日時にAWS側でELBの暖機運転（Pre-warming）を実施してくれます。

### サポート起票

AWSサポートを起票します。
- Case type: Technical
- Service: Elastic Load Balancing(ELB)
- Category:　ロードバランサー関連
- Severity: General guidance
- タイムスタンプ（UTC）- optional: 空白のまま
- エラーコードの説明 - optional: 空白のまま
- Subject: ELB暖気申請
- Description: 暖機申請の内容を記載する

### 申請フォーマット
記載する必要がある情報は以下
この内容は上で起票しているサポートケースのDescriptionに記載します。

- リージョン
  - ap-northeast-1(東京リージョン)　etc...
- 暖機対象のELB
  - ELB名、もしくはELBのARN
- 予測されるピーク時のリクエスト数(requests/sec）
  - 20000req/sec etc...
- 予想されるピーク時の1リクエストあたりの平均リクエストサイズ+レスポンスサイズ(bytes), または想定スループット(bit/秒)
  - 1リクエストあたり平均300byte,レスポンスの平均100KByte etc...
- 暖気運転が必要となる期間
  - yyyy-mm-dd-hh-mm ~ yyyy-mm-dd-hh-mm
- HTTPSの利用有無と割合
  - http 0% : https: 100% etc...
- バックエンドインスタンスでのKeep-aliveの設定可否
  - ELBhogeのバックエンドインスタンスにてKeep-aliveの利用あり etc...
- ELBで利用するAZの数
  - ap-northeast-1b/ap-northeast-1d etc...
- イベント当日までのバックエンドインスタンスの増加の有無
  - ELBhogeは1b,1dそれぞれに2台ずつインスタンスを追加します etc...
- トラフィックパターン(トラフィックの傾向とともに予想される最大・最少アクセスの時間）
  - キャンペーン開始後（AM9時頃）20000req/secのアクセスが予想されます。1時間程でトラフィックは落ち着く見込みですが、キャンペーン期間中はトラフィックの増加が見込まれる予定です。 etc...
- ユースケース
  - ECサイトの期間限定キャンペーンに伴うトラフィックの急激な増加を見込んでいるため。

### さいごに
申請が通るとAWSより暖機設定完了の連絡がきます。
お疲れ様でした。