OmniAICreator/Qiita-1.07M huggingface dataset:
Abcを消す

Tableauでぺこぺこ項目を選んで、キャンパスにドロップする際、右端に「Abc」の表示がいつまでも残ったりしませんか？
![01_例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/925c47ee-5053-46d4-d4cb-8521c36739a9.png)
これの消し方を同じグループのTabeau有識者から教えてもらったので共有します。

##__①そもそもこれは何か__##
プレースホルダー テキスト、というのが正式名称です。

ユーザーに対し、ここにドロップすると何かが起こりますよ、的なサジェストをするのが意図らしいですが、
個人的には、消せなくて、Tabeauで可視化しても右端に残るので気持ち悪さを持ってました。
今回はそれを消すTipsです。気にならない人は全く気にならないし、本来ならうまくTableauを駆使して表示しないようにするのが上級者だと思いますが、まずは消すことを第一に取り組んでみます。

##__②消し方__##
__01_何も考えず書式設定フィールドで「〇」を選択__
![02_書式設定選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/d51e22c6-3f4c-6a01-9ada-8065500ce9c0.png)
すると、Abcがまさかの〇に変化します。
![03_〇化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/7ef0b699-efab-6c28-a5d0-7a8eb5a1cf4c.png)
あとはこの丸をどうにかして見えなくするだけ…

__02_〇のサイズを最小化__
次に〇のサイズを変更します。
↓のようにサイズをクリックして最小の方にバーを移動させます。
![04_最小化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/96a50365-4fbc-dfc4-01e0-0286494ff06c.png)
そうすると、〇が点ぐらいになります。
![05_最小後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/3dd2dd4b-ff7f-f3ca-7bdc-bf8112c1420a.png)


__03_〇の色を透明に__
大きさを変えた後は色を変えればAbcは消えます。
↓のように色の不透明度を現在の100%から0%にバーを移動させます。
![06_透明化前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/46295524-69e2-7f75-24a2-571ca752f9c3.png)
はい、点が透明になり、消えました。
![07_色_透明化後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1036899/f43313ab-a412-3241-1a06-05b25e82d66b.png)

ということでAbcは無事きえました。
枠線が残るのですが、これは書式設定で何とかなるかな。。。
（いつもここで満足しているため、未確認ですみません。）

##__③まとめ__##
ということで、Abcを消すには、
書式設定のフィールドで
　01_マークの形を〇にする
　02_〇の大きさを最小化にする。
　03_丸の色の不透明度を0%にする。
だけでした。

以上、小手先ですが、読んでいただきありがとうございました。:baby_tone2:
composer require した時に killed になった時の対処

phpのパッケージ管理ツール composerでrequireコマンドを実行した時に、`killed` となってしまったので対処法を残しておきます。
ちなみに環境はlaradockerを使っています。

下記、エラーメッセージです。

```shell:docker_workspace
composer require league/flysystem-aws-s3-v3 ~1.0
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Killed
```

# 原因
OSでメモリが不足していたため、自動でプロセスをキルしてしまっていました。

# 対処法１：composer install で入れる

```shell:docker_workspace
cat composer.json | grep "パッケージ名" # パッケージが表示されるか確認、なければ追記

rm composer.lock # パッケージのバージョン管理ファイルを削除

composer install # パッケージの実体をダウンロード

composer show -i | grep "パッケージ名" # パッケージがダウンロードされたか確認
```


# 対処法2：仮想マシン、php.iniのメモリを増やす

## php.iniのメモリ設定

```shell
php -i | grep php.ini # php.iniの場所を確認

sudo vim /etc/php.ini # php.iniを編集
```

ローカル環境なので無制限に設定しておきます。
あとで元に戻しておきましょう。

```ini:php.ini
; memory_limit = 128M
memory_limit = -1
```

## 仮想マシンのメモリ設定 for Vagrant

```shell
vim Vagrantfile
```

とりあえず2GBに設定しておきます。

```ruby:Vagrantfile
  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
    vb.memory = "2048"
  end
```


## 仮想マシンのメモリ設定 for Docker

Docker version 2系の場合は`docker-compose.yml`のコンテナ名下の階層に`mem_limit`を設定することで増やせるとのこと。
Docker version 3系は公式ガイドに記載されていますが`mem_limit`が削除されていて使えません。
詳しいところは下記のサイトでわかりやすくまとまっています。
[docker-compose におけるメモリ使用量の制限方法](https://reboooot.net/post/how-to-specify-mem-limit-on-docker/#compose-file-version-3-%E3%81%A7%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95)
Docker のDBのコンテナにdumpファイルをimportする方法

DockerのDBコンテナにさくっとダンプデータを直接入れる方法のメモ書き

```
docker-compose exec -T {container_name} mysql -u{user_name} -p{password} {db_name} < sql/testdata.sql
```


```:実行例
docker-compose exec -T db mysql -umy_app -psecret my_app < sql/testdata.sql

docker-compose exec mariadb /bin/bash

mysql -u my_app -p

show databases;
```
AWS Systems Manager パラメータストアから秘密情報を取得してLambdaで使用する方法


# この記事からわかること
パラメータストアに保存されている秘密情報をLambdaから取得して使用する方法がわかります。

# 手順
手順の概要は以下の通りです。

* パラメータストアに秘密情報を追加
* Lambdaにパラメータストアのアクセス権限を付与
* Lambdaにパラメータストアを扱う関数を追加

以降ではそれぞれの手順について記載します。

## パラメータストアに秘密情報を追加

パラメータストアにパラメータ「/sushi/like/rds」を追加します。
種類は「SecureString」を選択
※DBの接続情報を想定


```json:/sushi/like/rds
{
    "HOST": "host_sushi",
    "DBNAME": "dbname_sushi",
    "USER": "user_sushi",
    "PASSWORD": "password_sushi"
}
```


## Lambdaにパラメータストアのアクセス権限を付与

上記で作成したパラメータの値を取得するためのIAMポリシー「get_rds_param」を作成します
下の例では扱うことができるパラメータを「/sushi/like/rds」のみに制限しています。
作成したポリシーをLambdaのIAMロールに付与してあげます。


```json:get_rds_param
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter*"
            ],
            "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/sushi/like/rds"
        }
    ]
}

```


## Lambdaにパラメータストアを扱う関数を追加

Lambdaに関数get_parametersを追加します。
変数PARAM_PATHに使用したいパラメータ名を記載してください。


```python:lambda_function.py
import json
import boto3

# SSM region
REGION = 'ap-northeast-1'
PARAM_PATH = '/sushi/like/rds'

def lambda_handler(event, context):
    
    param_dict = get_parameters(PARAM_PATH)
    print(param_dict)


# パラメータストアからパラメータを取得する関数
def get_parameters(param_path):
    ssm = boto3.client('ssm', region_name=REGION)
    response = ssm.get_parameters(
        Names=[
            param_path,
        ],
        WithDecryption=True # SecureStringを復号する場合はTrue
    )
    return json.loads(response['Parameters'][0]['Value'])

```


手順は以上です


# Lambda実行結果
パラメータが取得できていることが確認されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066929/6149a968-177e-7558-4122-f8e76215ff72.png)
VyOS 1.3でwireguardを使う (その2)

# つづき
[(その1)](https://qiita.com/MT-07/items/75bfa00b20f6ae4b6f62 "その1")で作成したサーバへ接続するためのクライアント側の設定です。
今回はWindows 10を使います。

## 作り方
まずは、wireguardをダウンロードします。
https://www.wireguard.com/install/
ここからWinodws用のインストーラーをダウンロードし、ウィザードに沿ってインストールします。

1. アプリケーションを起動する  
デスクトップのアイコンをダブルクリックし、起動します  
そっけない感じのウィンドウが現れますので、ウィンドウ下部の「トンネルの追加」→「空のトンネルの追加」を選びます  
![SnapCrab_NoName_2021-1-30_14-55-17_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223667/cc3b50ac-9136-198c-1ce3-7821b96c4bf7.png)
1. 自動的に鍵が作成されるのでVyOSの設定に必要な「公開鍵」をどこかへメモしておきます  
適当に名前を付けて保存します  
![SnapCrab_NoName_2021-1-30_15-1-2_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223667/c1c06b1d-5d87-814d-7682-9400cf6d9165.png)
1. サーバー側のVyOSにログインし、サーバの公開鍵を取得しメモします

    ```
    $ show wireguard keypairs pubkey default
    +OVotY/2uP/vbQw2Ad1XhJv0Ghc3gbKSE3pW2Xk4b2U=
    ```
1. ついでにそのまま先ほどメモしたクライアントの公開鍵で設定しなおします

    ```
    $ configure
    # set interfaces wireguard wg01 peer client001 pubkey 'ZM0fRfUAwDkDSk9SaqbLayUzBFuaG5wbTiXMKn2NQBI='
    # commit
    # save
    ```
1. クライアント側の設定に戻り、サーバ側で設定したallowed-ips(許可した固定IP)と公開鍵を追記します  
[Peer]セクションのAllowsIPsはサーバ側からのアクセス許可。EndpointはサーバのIP(公開用IP)と待ち受けポート番号を指定します  
設定が完了したら保存します  
![SnapCrab_NoName_2021-1-30_15-50-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223667/4a198456-a682-b8ce-ea46-96fd559599d9.png)
1. hogehogeトンネルを選択し「有効化」をクリックして接続が完了します  
![SnapCrab_NoName_2021-1-30_15-54-23_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223667/1960cea8-90e7-1958-c70a-0732b9aa8bad.png)

### 注意
windowsのwireguardアプリケーションでは、設定に誤りがあっても「有効化」をクリックすると見た目上はつながっているように見えます。
ピアに「直近のハンドシェイク」が表示されない。や「転送」に受信が0Bの場合は設定を見直してみましょう。
![SnapCrab_NoName_2021-1-30_15-59-37_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223667/32ab6a5e-c32f-6846-d236-533ea798e5ba.png)

# おわりに
設定自体は非常に簡単ですが、つながらない場合の切り分けが意外と難しいので、色々試して仕組みを理解する方が良いかと思います。
また、MacやLinuxも対応していますので、機会があれば投稿したいと思います。
Commitizenを使用してコミットメッセージを統一する

# はじめに

- コミットメッセージの入力で迷うことが多々ある
- コミットメッセージが統一されていない(個人/チーム関わらず)

以上のような悩みがあり、今回Commitizenを導入しました。

# Commitizenとは

公式ページ
[https://github.com/commitizen/cz-cli](https://github.com/commitizen/cz-cli)

'git cz' とタイプするだけで選択肢が表示され、対話形式で質問に答えていくだけでシンプルでわかりやすいコミットメッセージを作成することができるというツールです。
![スクリーンショット 2021-01-30 15.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/46bd0b60-4c94-4fa0-5015-edc757479187.png)

# 導入方法と使い方

### インストール

下記コマンドでグローバルインストールしました。

```
npm install commitizen -g
npm install -g cz-conventional-changelog
echo '{ "path": "cz-conventional-changelog" }' >> ~/.czrc
exec $SHELL -l
```

### 使い方

'git cz'コマンドで起動します。

```
git cz
```

![スクリーンショット 2021-01-30 15.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/c865766e-1eab-fc85-daf9-54b0e5eeafb1.png)

今回はREADME.mdを追加しただけなので、docsを選択します。
![スクリーンショット 2021-01-30 15.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/90abf980-a4f3-2e19-8989-e0172a4d1172.png)

変更のスコープを聞かれるので、README.mdと入力します。
![スクリーンショット 2021-01-30 15.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/bef606cc-a061-358c-508c-edad3e381ced.png)

次に短い説明文を入力します。今回はadd READMEとしました。
![スクリーンショット 2021-01-30 15.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/ea0c7e44-d7cd-97e2-a1ac-d062a4b66584.png)

次に長い説明文を入力します。今回は詳しい説明は不要なのでEnterでスキップしました。
![スクリーンショット 2021-01-30 15.40.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/5c26a4b9-1e89-d6d8-60ca-6517652b67bc.png)

破壊的な変更はあるか聞かれますが、今回はNoです。
![スクリーンショット 2021-01-30 15.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/bc43b3a6-cbeb-8e04-ecf9-741a3502909b.png)

issueと関係しているか聞かれますが、こちらもNoです。
![スクリーンショット 2021-01-30 15.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/e58c824d-322a-e4f6-ac8b-88869312a26e.png)

以上で終わりです。どのようなコミットメッセージが作成されたか確認してみると以下のようになっています。

```
docs(readme.md): add README
```

![スクリーンショット 2021-01-30 15.41.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979977/f5ca2b0a-70ff-2bbe-62a4-2e668fa069fa.png)



# 最後に

以上、Commitizenの導入方法と使い方でした。見ていただきありがとうございました。
dockerで覚えておきたいコマンド

<p>今後も使いそうなdockerコマンドの記録です。</p>

<p>dockerの教材として、udemyで勉強しました。</p>

[米国AI開発者がゼロから教えるDocker講座](https://www.udemy.com/share/103qtiAEISd1dVQ3QJ/)

<p>内容は素晴らしく丁寧で、docker初心者の私でも基礎を習得できました！</p>

<p>簡単に環境構築ができるので、今後の開発環境に活かせそうです</p>

<p>基本的なコマンド</p>
```
//Dockerfileを実行する、-tでimage名を指定
docker build -t <image> .

//imageの確認
docker images

//imageの削除
docker rmi <image>

//コンテナを作成・起動しbashを起動
docker run -it <image> bash

//コンテナ名を指定し起動
docker run --name <container名> <image>

//detached modeで起動
docker run -d <image>

//exit後にコンテナ削除
docker run --rm <image>

//-pでホストのポート番号とコンテナのポート番号を指定する
docker run -p 80:80 -p 443:443 <image>

//コンテナを出る
exit

//コンテナのリストを表示しup or exitを確認
docker ps -a

//upのコンテナを止める
docker stop <container>

//upのコンテナでbashを起動
docker exec -it <container> bash

//コンテナを削除
docker rm <container>

//exitのコンテナを全削除
docker system prune
```
【C#】タイムゾーンを指定した日時を拡張ISO 8601形式で取得する

# やりたいこと

C#で、UTCの日時が入った`DateTime`型変数から、`2021-01-30T15:47:02+09:00`のような時差情報を含む拡張ISO 8601形式の文字列に変換する。

# 実装

```C#
// using System;
DateTime dateTimeUtc = DateTime.UtcNow;
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime tstDateTime = TimeZoneInfo.ConvertTimeFromUtc(dateTimeUtc, tst);
string iso8601DateTime = tstDateTime.ToString("yyyy-MM-dd'T'HH:mm:sszzz");
```

# 補足

## DateTime.ToStringの書式について

[DateTime.ToString メソッド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime.tostring?view=net-5.0#System_DateTime_ToString_System_String_)より転記

```C
// This example displays the following output to the console:
//       d: 6/15/2008
//       D: Sunday, June 15, 2008
//       f: Sunday, June 15, 2008 9:15 PM
//       F: Sunday, June 15, 2008 9:15:07 PM
//       g: 6/15/2008 9:15 PM
//       G: 6/15/2008 9:15:07 PM
//       m: June 15
//       o: 2008-06-15T21:15:07.0000000
//       R: Sun, 15 Jun 2008 21:15:07 GMT
//       s: 2008-06-15T21:15:07
//       t: 9:15 PM
//       T: 9:15:07 PM
//       u: 2008-06-15 21:15:07Z
//       U: Monday, June 16, 2008 4:15:07 AM
//       y: June, 2008
//
//       'h:mm:ss.ff t': 9:15:07.00 P
//       'd MMM yyyy': 15 Jun 2008
//       'HH:mm:ss.f': 21:15:07.0
//       'dd MMM HH:mm:ss': 15 Jun 21:15:07
//       '\Mon\t\h\: M': Month: 6
//       'HH:mm:ss.ffffzzz': 21:15:07.0000-07:00
```

## TimeZoneInfo.FindSystemTimeZoneByIdで指定可能な値

調べても見つからず。
ご存じの方、コメントください。
参考：[TimeZoneInfo.FindSystemTimeZoneById(String) メソッド | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.timezoneinfo.findsystemtimezonebyid?view=net-5.0)
【Rails6】カスタムフォントの使い方

# はじめに

先日、以下の記事を拝見しました。

[フリーフォント好きに朗報！Fontworksから日本語フォント8書体がSILライセンスで公開、商用利用も完全に無料](https://coliss.com/articles/freebies/free-fonts-by-fontworks.html)

こちらで紹介されている「クレーOne」が僕のRailsポートフォリオテーマの雰囲気にぴったりなフォントだったので導入してみました！

## 開発環境

- MacOS Catalina 10.15.7
- ruby 2.7.1
- rails 6.0.3.4


# フォントデータのダウンロード

GitHubからフォントデータをダウンロードします。
https://github.com/fontworks-fonts/Klee

フォントデータの場所
fonts/ttf/KleeOne-Regular.ttf


# 開発環境に配置

僕の開発環境ではCSSや画像ファイルなどをwebpackerで管理しているので、フォントデータも同じように配置しました。（※fontsフォルダは新規作成しています。）

app/javascript/fonts/KleeOne-Regular.ttf

なお、Rail5の環境でカスタムフォントを導入されている方の記事では、app/assets/fonts/ に配置されているようです。


# フォントデータの読み込み

CSSファイルに以下を記述します。ファイルのパスは僕の環境の場合なので、みなさんの環境にあわせて読み替えてください。

```css:app/javascript/stylesheets/custom.scss
@font-face {
  font-family: "kleeone";
  src: url('../fonts/KleeOne-Regular.ttf');
}
```

| 設定項目 | 設定値 |
|:--------|:------|
|font-family|このフォントを使用する際のクラス名を好きな名前で名付けます|
|url|フォントデータのパス（場所）|

フォントデータのパスについてはCSSファイルからの相対パスになっています。

フォントデータの場所
app/javascript/fonts/KleeOne-Regular.ttf

CSSファイルの場所
app/javascript/stylesheets/custom.scss

CSSファイルのある stylesheetsフォルダから見て、フォントデータは1つ上の javascriptフォルダの中の fontsフォルダにあるので、 ../ で1つ上に上がってそこからのパスを記述しています。（../ は app/javascript と同義です。）


# カスタムフォントの適用

実際に使用したい部分に記述します。僕はアプリケーション全体に適用したかったので、bodyタグに記述しました。

```css:app/javascript/stylesheets/custom.scss
body {
  font-family: "kleeone"
}
```


# 見た目の違い

僕のポートフォリオでは仏像やお寺をテーマにしているのですが、それっぽい感じの雰囲気が出ていると思います。（笑）

## 適用前
![適用前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651975/19ee6926-4835-b8c2-aa41-5f04691c1840.png)

## 適用後
![適用後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651975/1a6e4cfe-dfd9-784c-ce1e-8bde51343dcd.png)
ROS2でusbカメラから画像情報を取得する

## 経緯
ROS2でusbカメラから画像情報取りたいなと、ふと思ったのでやり方を共有します。超簡単にできます。
環境は以下の通りです。

- Ubuntu20.04
- ROS2 foxy


## やり方
使うパッケージは[v4l2_camera](https://index.ros.org/r/v4l2_camera/gitlab-boldhearts-ros2_v4l2_camera/#foxy)というやつです。

```bash
$ apt-get install ros-<ros_version>-v4l2-camera
```
ソースコードからビルドしたいよ、って方は下のコマンドを実行してください。

```bash
$ git clone --branch <ros-version> https://gitlab.com/boldhearts/ros2_v4l2_camera.git src/v4l2_camera
$ colcon build
```
これでもう使えます(笑)。
あとは、下のコマンドを実行してください。

```bash
$ ros2 run v4l2_camera v4l2_camera_node
```
新しいターミナルを開いて、下のコマンドを実行すれば画像データがGUIで確認できます。

```bash
$ ros2 run rqt_image_view rqt_image_view
```

## 結果
こんな感じ。恥ずかしいので手で隠してますが(笑)。
![Screenshot from 2021-01-30 15-45-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663246/bfadb562-4506-1d2d-259e-b63c589bff38.png)


## まとめ
ROS2触りはじめて間もないですが、基本的な考え方とかはROS1とほとんど変わらないみたいですね。ただ、launchファイルがpythonスクリプトになってたのには驚きました(笑)。

**間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。**
「Mathematical Theory of Bayesian Statistics」読後メモ(1) (「ベイズ統計の理論と方法」の比較)

# 本稿について

本稿はSumio Watanabe ・著「[Mathematical Theory of Bayesian Statistics](https://www.amazon.co.jp/dp/1482238063)」(Chapman and Hall/CRC, 2018)の読後メモです。

# はじめに

## この本に期待したこと

大まかに渡辺澄夫先生の著作というと、以下の4つが挙げられます。

- 「Mathematical Theory of Bayesian Statistics」(Chapman and Hall/CRC, 2018)  
  以下、「緑本」と略す。 [https://www.amazon.co.jp/dp/1482238063](https://www.amazon.co.jp/dp/1482238063)
- 「ベイズ統計の理論と方法」(コロナ社, 2012)   
  以下、「赤本」と略す。 [https://www.amazon.co.jp/dp/4339024627/](https://www.amazon.co.jp/dp/4339024627/)
- 「Algebraic Geometry and Statistical Learning Theory」(Cambridge University Press, 2009)  
  以下、「learning本」と略す。 [https://www.amazon.co.jp/dp/B00H7WPCDE/](https://www.amazon.co.jp/dp/B00H7WPCDE/)
- 「代数幾何と学習理論」(森北出版, 2006)  
  以下、「学習本」と略す。 [https://www.amazon.co.jp/dp/462781321X/](https://www.amazon.co.jp/dp/462781321X/)


渡辺澄夫先生の著作は基本的には教育的なスタンスも強くありますが、それに加えて学術的な成果を示す傾向にあるため、その時々の最先端に触れることができる印象。
赤本は2012年の著作であり、以下のWBIC論文は2013年のもののため、赤本への未掲載なのは仕方ないでしょう。

- S Watanabe (2013) "A widely applicable Bayesian information criterion" Journal of Machine Learning Research 14 (Mar), 867-897 ([pdf Link](https://jmlr.org/papers/v14/watanabe13a.html))

その辺の要素がアップデートされていることを期待しました。

しかも、赤本は226ページだけど、緑本は330ページ！
内容のブレイクダウンも期待しました！

## 読後メモの記載の方針

赤本からのアップデート内容や比較を中心に、話を展開します。
原則的には、先頭のページから読んでは行きますが、ものによってはあとに回すことになったりもします。
(おもに数値シミュレーション関連)

# 読後メモ

まずは、全体像について記載します。

## 全体的な印象

各論の話に入る前に、全体としての印象の話をします。
おおまかには以下の通りです。

- 具体例が多い。  
    - 2章まるまると、具体的な統計モデルの扱いも出てくることが象徴的である。
    - 数学的概念についても、なるべく例を出すようにして、理解を促すようになっている。
- 数学的な概念が必要以上に求められなくなっている。  
特に、特異点と多様体は知らなくても、理論展開ができるような記載になっている。
- WBICはモデル選択の計算として挙げられているが、証明とかの扱いはない。  
たぶん、緑本の内容が理解できれば、該当論文も読めるようになる(はず！)ことから除外かと。  
- 赤本には記載のあった変分ベイズだが、緑本において扱いがない。

いったんはこんなところで。
読後メモ(2)ではChapter1について記載する予定。

# 余談

#### 余談1

緑本は、CRCのサイトでたまに2割引きで売られているようです。
[https://www.routledge.com/Mathematical-Theory-of-Bayesian-Statistics/Watanabe/p/book/9780367734817](https://www.routledge.com/Mathematical-Theory-of-Bayesian-Statistics/Watanabe/p/book/9780367734817)
輸入だから、時間はかかりますが、コストの面で有利になるので…ということで。

#### 余談2

本来ははてなで書いていたが、Markdownで数式書くと、謎のエスケープ地獄になるので、一時退避場所としてQiitaさんにて書くことにした。
ある程度(転職？ジョブチェンジ？)活動が落ち着いたら、Netlify等に移行したいZe。
Dockerfileのportsとexposeの違い


## ports
- ホスト側のポートとコンテナ側のポートをマッピングする
- `ホスト側:コンテナ側`

```dockerfile

ports:
  - "3000:3000"
```

## expose
- コンテナ側のポートを指定
- ホストには公開されず、`docker0`の仮想ブリッジネットワークにのみ公開される


```dockerfile

expose:
  - "3000"
```



### docker0

```
8: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:b9:e5:cd:08 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
```
AWS SAM CLIでデプロイしてみる

###前提

AWS CLIを入れておく
https://qiita.com/pino2/items/c0ede5c2b23f7f898a99

SAM CLIでHelloWorldアプリを作っておく

###デプロイ実行

~~~
$sam deploy --guided
~~~

適当に答えていく。コンソールに表示される[]内がデフォルトだが、よしなに答える。

~~~
Stack Name:sam-app
AWS Region:ap-northeast-1
Confirm changes before deploy:Y
Allow SAM CLI IAM role creation:Y
HelloWorldFunction may not have authorization defined, Is this okay?:Y
Save arguments to configuration file:Y
SAM configuration file:samconfig.toml
SAM configuration environment:default
~~~

コンソールのOutputsのところにエンドポイントのURLが出力される。
〜/Prod/hello/
template.yamlのOutputsが出力される。
Outputsは他のCloudFormationスタックのインプットになったり、コンソールに出力されるもの。単体では設定に反映するわけではない。

上記回答からsamconfig.tomlが作られた。

samconfig.toml

~~~
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app"
s3_bucket = "XXX"
s3_prefix = "sam-app"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"

~~~


次回からはguidedオプション無しでいける。

~~~
$sam deploy
~~~

API Gatewayのステージは、Stage, Prodができていた。どこで設定しているわけでもないが。
〜/Stage/hello/
のエンドポイントもできている。

ステージの概念はなんだろ。
Laravelの環境変数設定




.env.localをバッチで読み込む

```
$ php artisan config:clear
$ php artisan [command] --env=local
```


設定ファイルがキャッシュされると、.envファイルはロードされなくなるため下記を先に実行する

```
$ php artisan config:clear
```

下記、他の方法あるようです。
https://qiita.com/mmmmmmanta/items/b992c7d8cd69343b6626

現在の環境を確認する（--env=localやったときだけlocalになるので、こちら単体で実行してもproductionのまま）

```
$ php artisan env
Current application environment: production
```
Auto Encoderを用いた異常検知 PART2（データ作成）

# データの作成方法について
numpyのrandomを使って、正常データと異常データを作成します。

ここで、正常データと異常データの定義は以下のようになります。
正常データ：データ集合がある範囲に収まっている
異常データ：データ集合がバラバラである

上記を踏まえて、正常データと異常データを作成します。

# ライブラリのロード

```Python
import pickle
import numpy as np
import random
```

# コード
numpyのrandom.sampleを使い、正常データを作成します。
対して異常データは、1以上の数値を配列に入れることで、作成します。

最後にpickle形式で保存します。

```Python
# 正常データ、異常データを生成
normal_data = np.random.rand(1000, 4)
number_lst = list(range(1, 100))

anomaly_data = list()
t_anomaly_data = list()
for i in range(0, 100):
	anomaly_data.append(random.sample(number_lst, 4))

anomaly_data = np.array(anomaly_data)

print(normal_data.shape)
print(anomaly_data.shape)

with open('normal_data.pkl', 'wb') as f:
	pickle.dump(normal_data, f)
with open('anomaly_data.pkl', 'wb') as f:
	pickle.dump(anomaly_data, f)
```

![斑点正常異常.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053943/d5a3f0ae-c8e3-63a0-c9c8-b613b966f8b3.jpeg)
【初心者向け】自分のコードをGitHubに公開する手順

## 概要
最近、初めて自分のソースを公開したので、手順をまとめました。
SSHでの公開キーの設定の仕方に手こずりました。

## GitHubとは
Gitはファイルのバージョン管理ツールのこと。
GitHubはGitで管理しているファイルを特定のユーザまたは世界中に共有するためのサービス。
MacまたはLinuxであれば、Gitは標準でインストールされているとのこと。
Windowsの場合はダウンロード＆インストールが必要。

## Gitの基本構成
Gitは下記の4つの段階でファイルを管理する
ローカルディレクトリ　→(add)→　ステージング環境　→(commit)→　 ローカルリポジトリ　→(push)→　リモートリポジトリ
上記のうち、「ローカルディレクトリ」「ステージング環境」「ローカルリポジトリ」は自分のPC環境（ローカル環境）であり、リモートリポジトリのみサーバ上の環境。

## 手順
1. ターミナル上で公開したいファイルの保存されているディレクトリに移動する  
  ```
   cd XXXX
  ```
2. Gitを設定する  
 ```
  git init
 ```
3. ステージング環境にファイルを移動する（全ファイル移動の場合）  
 ```
 git add .
 ```
4. ステージング環境にファイルが移動したことを確認する  
 ```
 git status
 ``` 
5. ステージング環境にあるファイルを全てローカルリポジトリに移動する  
 ```
 git commit -m "コメント"
 ```  
 * コメントは前回からの更新内容を書く。
6. ローカルリポジトリのファイルを確認する  
 ``` 
 git status
 ```  
7. リモートリポジトリと自分のローカル環境を接続する  
 ```  
 git remote add origin git@github.com:(ユーザー名)/(github上のリポジトリ名).git
 ```  
 * (ユーザ名)は事前にGitHubに登録したユーザー名を入力
 * (github上のリポジトリ名)には事前にGitHubで生成したリポジトリ名を入力
8. リモートリポジトリにファイルをアップロードする  
 ```  
 git push -u origin head
 ```  
 * headは最新のバージョンのファイルという意味  
 * originはリモートリポジトリの初期のディレクトリ名  

## 注意事項
リモートリポジトリにファイルをアップしようとすると、下記のエラーが発生することがあります。

```
Warning: Permanently added the RSA host key for IP address 'XX.XX.XXX.XX' to the list of known hosts.
ERROR: The key you are authenticating with has been marked as read only.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```
上記が表示された場合、Keyが設定できてないことが原因です。
キーを生成し、GitHubでキーの設定をする必要があります。

### GitHubでのキーの設定の仕方
1. ターミナル上で下記コマンドを入力し、sshのディレクトリに移動する  
 ```
  cd ~/.ssh
 ```
2. 公開キーを生成する  
 ```
 ssh-keygen -t rsa -C XXXX@gmail.com
 ```
 * "XXXX@gmail.com"はGitHubで登録したメールアドレス
3. 下記コマンドで表示された公開キーを全てコピーする  
 ```
 less id_rsa.pub 
 ```
4. ブラウザ上のGitHubのリポジトリ画面の右上にある*Settings*を開く
5. 左のリストの中の*Deploy keys*を開き、右上の*New deploy key*を開く
6. 表示されたkey欄にコピーしたキーをペーストする(title欄は空欄で良い)
7. すぐ下の*Allow write access*にチェックを入れて、*Add key*をクリックする  
  ここにチェックを入れないと、リポジトリへの書き込みはできません。
EC-CUBE4 管理画面に任意の情報を表示する方法

## はじめに

管理画面に任意の情報を表示する方法です。
Entity を拡張した場合は、 "[Entity からフォームを自動生成する](https://doc4.ec-cube.net/customize_entity#entity-%E3%81%8B%E3%82%89%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E8%87%AA%E5%8B%95%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B) " が利用できます。

## 部分的にテンプレートを差し込む方法

この方法は、オリジナルの Twig テンプレートファイルを修正することなく、任意の表示を任意の場所に追加できます。
※ 恐らく、一般的な EC-CUBE プラグインが使っている方法と同じです。

### 差し込み用の Twig ファイルを用意

今回は、メインエリアの一番下に表示されるサンプルです。
表示位置を変更する場合は、 jQuery のセレクタ `.c-contentsArea__cols .c-contentsArea__primaryCol .c-primaryCol` の部分を任意のセレクトにすることで、表示位置が変わります。

```twig:app/template/admin/Product/product__snippet.twig
<div class="card rounded border-0 mb-4" id="js-your-snipet">
    HELLO {{ someVar }}
</div>
<script>
    (function () {
        $('.c-contentsArea__cols .c-contentsArea__primaryCol .c-primaryCol').append($('#js-your-snipet'));
    })();
</script>
```

※ ファイル名に制約はありません。


### 対象の Twig ファイルを監視して、差し込み用テンプレートを追加

```php:app/Customize/EventListener/AdminProductTwigEventListener.php
<?php

declare(strict_types=1);

namespace Customize\EventListener;

use Eccube\Event\TemplateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class AdminProductTwigEventListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            '@admin/Product/product.twig' => 'handle'
        ];
    }

    public function handle(TemplateEvent $event): void
    {
        $event->setParameter('someVar', 'abc');
        $event->addSnippet('@admin/Product/product__snippet.twig');
    }
}
```

### 完成 :raised_hands_tone2:

![スクリーンショット 2021-01-30 15.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2019/a5a88b94-55fe-98d8-1496-eeb9dd43d5a4.png)


## 独自のテンプレートを利用する方法

"[テンプレートの読み出し順序](https://doc4.ec-cube.net/design_template#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E6%99%82%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E9%85%8D%E7%BD%AE)" を利用して、 `YOUR_PROJECT/app/template/admin` 以下にファイルを設置します。

例えば、管理画面の商品詳細画面の場合、オリジナルのテンプレートは `YOUR_PROJECT/src/Eccube/Resource/template/admin/Product/product.twig` です。

この場合、独自テンプレートを `YOUR_PROJECT/app/template/admin/Product/product.twig` に設置すると優先的に読み込まれます。

:warning: 注意点
この方法は、EC-CUBE 本体のバージョンアップや他の EC-CUBE プラグインによる拡張が適用されない可能性が高いです。
EC-CUBE バージョンアップや該当ファイルを監視するプラグインを使う場合は注意が必要です。
Install HomeBrew on MBP

Reference:
* (MacBookAir2020を買ったのでHomeBrewで色々入れる)[https://blog.katsubemakito.net/macos/setup-macbookair2020]


```bash

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

Install htop:

```bash
brew install htop
```
【React】コンポーネントの作り方

React学習メモ_コンポーネントの作りかた。

コンポーネントとは、「部品」「パーツ」という意味。
Reactでは、見た目を機能ごとにコンポーネント化して、コンポーネントを組み合わせることでWebサイトの見た目を作る。

```react.js
import React from 'react';
class Lesson extends React.Component{
  render(){
    return(
      <div className='lesson-card'>
          <div className='lesson-item'>
            <p></p>
            <img />
          </div>
      </div>
    );
  }
}
export default Lesson;
```

【手順】
①Reactをimportする。
②React.Componentを継承するクラスを定義する。
　（※このクラス名がコンポーネント目になる。）
③JSXを戻り値とするrenderメソッドを定義する。
④コンポーネントをエクスポートする。
基本情報の午前試験に合格する

<p>2020年の夏からプログラミング学習を始め、何か資格が欲しかったので、</p>

<p>基本情報技術者試験に挑戦しました。(午後試験はまだ)</p>

<p>本を読むより動画教材の方が自分には合っている、かつ、後に応用情報も受けたいので、教材として以下のudemy教材を選びました。</p>

[最新版:　基本情報技術者試験+応用情報技術者試験+Python+SQL　初心者からプロのエンジニアになる講座](https://www.udemy.com/share/102fpUAEISd1dVQ3QJ/)

<p>若干難しく感じる所があるものの、過去問の解説があり良かったと思います。</p>

<p>午前試験を受験した結果ですが、７０点でした！割とギリギリです。</p>

<p>うる覚えな知識が多かったので、動画を何周かすることで高得点が狙えると思います！</p>

<p>午後試験は動画にあるようにPythonで挑もうと思います！</p>
ちょっとした試験用擬似サーバの構築

きちんとしたWebサーバやSMTPサーバは不要だが、試験的にサーバへのアクセスまで確認したい場合にPythonやncを使って簡易なサーバを構築する手順メモ。

# pyhtonのワンライナーで擬似サーバ構築
pythonのモジュールを使うと簡単に試験サーバが構築できる。

## 擬似HTTPサーバの場合
なんちゃってHTTPサーバ。アクセスするとサーバのフォルダ一覧を返す。

### サーバ側
pythonのhttpモジュールを使って実現。

```shell:サーバ(Python3系)
$ python3 -m http.server 8080 # サーバポートは任意の数値を指定可能
```
Python2系の場合

```shell:サーバ(Python2系)
$ python -m SimpleHTTPServer 8080 
```

### クライアント側

ブラウザやcurlでアクセス。

```shell:クライアント
[~ ]# curl http://[サーバのIP]:8080
```
## 擬似SMTPサーバの構築


### サーバ側
アクセスする端末を制限しないで、どの端末からでもメールの受け付けを許可する場合の例。ローカルからのアクセスに制限する場合、IP部分を`localhost`にする。

```shell:サーバ
$ python3 -m smtpd -c DebuggingServer 0.0.0.0:25
```

### クライアント側からのメール送信

#### その１：mailコマンドで送信

mailがインストールされている場合、シェルから以下の形式で送信可能。

`echo "メールメッセージ" | mail -s "Subject" -S smtp=smtp://<サーバIP:ポート> -r <from_user> <to_user>`

```shell:クライアント
$ echo "This is a tes mail!" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com
```
クライアントからメール送信すると、サーバ側に以下のメッセージが表示される。

```shell:サーバ側
# python3 -m smtpd -c DebuggingServer 0.0.0.0:25
---------- MESSAGE FOLLOWS ----------
b'Date: Sat, 30 Jan 2021 04:08:46 +0900'
b'From: from_user@local.domain'
b'To: to_user@abc.com'
b'Subject: Hello!'
b'Message-ID: <60145d3e.QT30D9OKMb04CKyL%from_user@local.domain>'
b'User-Agent: Heirloom mailx 12.5 7/5/10'
b'MIME-Version: 1.0'
b'Content-Type: text/plain; charset=us-ascii'
b'Content-Transfer-Encoding: 7bit'
b'X-Peer: 127.0.0.1'
b''
b'This is a tes mail!'
------------ END MESSAGE ------------
```

ちなみにメール本文に日本語を入れると文字化けした。なんか設定あるのかな？

```shell:クライアント側
$ echo "日本語" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com
```

```shell:サーバ側のメッセージ
(一部省略）
b'Content-Type: text/plain; charset=utf-8'
b'Content-Transfer-Encoding: 8bit'
b'X-Peer: 127.0.0.1'
b''
b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
------------ END MESSAGE ------------
```

#### その２：pythonスクリプトで送信
mailコマンドが使えない場合Pythonスクリプトで対応。ベタなスクリプト例は以下。

```python:send_mail.py
import smtplib
from email.mime.text import MIMEText

# メール送信に必要な情報を定義
from_user = 'from_user@local'
to_user = 'to_user@abc.com'
subject = 'Hello!'
message = 'Hello, World!\nThis is a test mail\n'
smtp_sv = 'localhost'

# 情報を詰め込む
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = from_user
msg['To'] = to_user

# 送信
server = smtplib.SMTP(smtp_sv)
server.sendmail(from_user, [to_user], msg.as_string())
server.quit()
```
これを実行すると、mailコマンド同様の結果がサーバに出力される。

```shell:クライアント
$ python3 send_mail.py 
```

# ncコマンドを使って擬似サーバを構築

もしnmapが利用可能なら`ncコマンド`を利用して擬似サーバを立てる。

ncコマンドで擬似サーバを立てた場合、クライアントとサーバで接続を確立するところまでなので、httpやsmtp処理はできず、クライアントもしくはサーバで入力した文字列がそのまま相手先に出力されるだけだが、ルーティングとポートの確認をするだけならこれで十分。

```shell:サーバ側
$ nc -kl 8081   #ポート番号は任意
```
ちなみにkオプションつけると複数クライアントからの受付を可能とする。
続いてクライアントからサーバにアクセスして文字列を投入する。

```shell:クライアント側
$ nc <サーバIP> 8081
Hello!
```
```shell:サーバ側
$ nc -kl 8081
Hello!  #クライアントからの入力した文字列がサーバ側に表示される
```
クライアントからcurlコマンドでアクセスしても、サーバ側で何かしてくれるわけでなく、単にメッセージを表示するだけ。

```shell:クライアント
$ curl http://<サーバIP>:8081
```
```shell:サーバ
$ nc -kl 8081
Hello!
GET / HTTP/1.1     #クライアントからのHTTPリクエストをそのまま表示するだけ
Host: ap01:8081
User-Agent: curl/7.64.1
Accept: */*
```
EC2でインスタンスを立ち上げ、アプリケーション設置を行う。

##インスタンスを作成する

1. サービス検索で、『EC2』と入力する。
2.  『インスタンス起動』ボタンを押下。
3.  マシンイメージ (AMI)選択画面で、『Amazon Linux 2 AMI (HVM)』を選択。
4.  インスタンスタイプの選択は、デフォルトのまま。
5.  セキュリティグループの設定画面で、『ルールの追加』ボタンを押下し、以下の3つを設定する。
 5. SSHタイプのソースを『カスタム 3.112.23.0/29』に設定する
 5. HTTPSタイプのソースを『マイIP』に設定する
 5. HTTPタイプのソースを『マイIP』に設定する
6. 『確認と作成』ボタンを押下する
7. キーペアを新しく作成して、ダウンロードする（サーバーに接続する鍵になるので大事に保存しておく）
8. インスタンスを作成する

####以下の作業はSSH接続して行う。
今回は、EC2 Instance Connectを使用してSSH接続する。

##必要なパッケージをインストール

#####パッケージ情報の更新を行います
```bash:
$ sudo yum -y update
```

#####GitとWebサーバー（Apache）をインストール
```bash:
$ sudo yum install -y git curl httpd unzip
```

#####Gitをインストールしましたので次にGitの共通設定を行って行きます。
```bash:
$ git config --global user.name "{gitHubのユーザ名}"
$ git config --global user.email "{gitHubのメールアドレス}"
```

#####タイムゾーンを変更する
```bash:
$ sudo timedatectl set-timezone Asia/Tokyo
```

#####PHP7.3をインストール
途中で入力を求められるので、Enterを押す

```bash:
$ sudo amazon-linux-extras install php7.3 -y
$ sudo yum install -y php-mbstring php-xml php-gd php-xml
$ php -v
```

#####Compsoerをインストールする
```bash:
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
$ which composer
/usr/local/bin/composer
```

##アプリケーションをインストール
GitをCloneして、Composerのパッケージをインストールする。
####ssh鍵の作成
```bash:
$ ssh-keygen
```
下記のように鍵の保存位置を聞かれた場合、デフォルトの位置で大丈夫なのでそのままEnterを押す。

```bash:
$ Enter file in which to save the key (/home/yourname/.ssh/id_rsa):
```
次にパスフレーズの入力を求められますが、空で大丈夫な場合はそのままEnterを押す。
以上でSSH鍵の作成は完了する。
以下のコマンドでファイルが作成されているのが確認。

```bash:
$ ls /home/ec2-user/.ssh
authorized_key id_rsa id_rsa.pub
```
id_rsaは秘密鍵になるので、漏洩しないように注意。

####公開鍵をGitHubに登録
#####公開鍵を表示
```bash:
$ cat .ssh/id_rsa.pub
```
上記で表示される内容をコピー。

#####GitHubに連携。
GitHubのアプリケーションのリポジトリページを開く。
Settingsページを開きます。
![](https://gyazo.com/c4640a63caf8909ecdde36e218f39986.png)
Deploy Keyというメニューを選択して、Add deploy Keyをクリックする。
![](https://gyazo.com/f18a1cc0357f922912c2cfc92759ecf8.png)
![](https://gyazo.com/290799214391e64b0d61a4b366919620.png)
適当なタイトルをつけ、先ほどコピーした内容をKeyに貼り付ける。

####サーバー内に設置
GitHunのリポジトリで接続先をコピーする。
![](https://gyazo.com/67f79122524825f47683b07030401c3a.png)

サーバー内でCloneします。今回は『/var/www/aws_app』に配置します。
wwwフォルダの所有権を現在ログインしているアカウントに変更しておきます。

```bash:
$ sudo chown ec2-user:ec2-user /var/www
```

そちらに移動してcloneします。

```bash:
$ cd /var/www
$ git clone 接続先（https://github.com/・・・・・.git） app
```

問題なければComposerでインストールする

```bash:
$ cd app
$ composer install --no-dev
```

Cloneした状態だとstorageフォルダの書き込み権限がついていないため、書き込み権限を付与します。

```bash:
$ chmod 0777 storage
```

またそのフォルダも検索&書き込み権限付与をおこないます。

```bash:
$ find storage -type d -exec chmod 0777 {} \;
```

以上でアプリケーションの設置は完了。
SSH公開鍵認証の設定方法など

#なんでこの記事を書くか
AWSのEC2、AmazonLinuxにSSH接続する際、ec2-userでpemファイルを使って（キーペア）ログインしますよね。
ec2-user以外でキーペアを使って接続する場合、どんな設定をすればいいのか知りませんでした。
（そもそも公開鍵認証自体の仕組みをいまいちよくわかってない）

#調べたこと
## 1.公開鍵認証とは
私が書くよりこちらのほうがよさそう。
[「よく分かる公開鍵認証」～初心者でもよくわかる！VPSによるWebサーバー運用講座(2)][link1]
[link1]:https://knowledge.sakura.ad.jp/3543/

## 2.AWSのEC2での公開鍵と秘密鍵は？
```
- 公開鍵（パブリックキー)　#サーバ側
 - /home/ec2-user/.ssh/authorized_keys
- 秘密鍵（プライベートキー）#クライアント側
 - ec2インスタンス起動時やキーペア作成画面でキーペア作成した際にダウンロードしたファイル(***.pem,***.ppk)
```
※「authorized_keys」はデフォルトの公開鍵名で、<br>「/etc/ssh/sshd_config」のAuthorizedKeysFileディレクティブで指定されている。

## 3.ec2-user以外の公開鍵認証はどうやる？　やってみた
ec2-userに設定される公開鍵、対応する秘密鍵はAWSが作ってくれるのですが、　　
自分で公開鍵、秘密鍵を作ってec2-user以外のユーザで公開鍵認証にする場合はどうやって作るのか？やってみた

```
1.ユーザを作成する（今回はhogeを作成したとする）
# sudo useradd -m hoge

2.作成したユーザでログイン
# sudo su - hoge

3.公開鍵、秘密鍵の作成
# ssh-keygen
※3回質問されますが、今回は何も入力せずにEnter

4.公開鍵、秘密鍵が作成されていることを確認（id_rsa.pubが公開鍵、id_rsaが秘密鍵）
# ls -l /home/hoge/.ssh
-rw------- 1 hoge hoge 1675 Jan 30 05:17 id_rsa
-rw-r--r-- 1 hoge hoge  434 Jan 30 05:17 id_rsa.pub

5.公開鍵、秘密鍵の変更（秘密鍵は任意の名前でOK）
# cd /home/hoge/.ssh
# mv -p id_rsa.pub authorized_keys
# mv -p id_rsa ssh_key_hoge.pem

6.秘密鍵をダウンロードし、ターミナルからhogeユーザでダウンロードした秘密鍵(ssh_key_hoge.pem)でログイン
```
※今回はssh-keygenで作成しましたが、AWSのEC2のキーペア作成画面でも個別に作成することもできますね。
　ただ、公開鍵は秘密鍵(ppk,pemのファイル)からputtyで生成するかインスタンスメタデータで取得する感じ。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2-key-pairs.html

#その他
## 1.ppk と pem 
ppkとかpemとか拡張子の違う秘密鍵を渡されることがあります。
teratermは、どちらのppkもpemもどちらでも使えますね。
違いを知らなかったので調べてみました。

1. pem - **Privacy Enhanced Mail**<br>
暗号化鍵や証明書をを入れておくコンテナ(箱)

2. ppk - **PuTTY Private Key files**<br>
名前の通りputtyでこちらは箱ではなくファイル。
WinSCPなどではこれをつかったりしますね。

### ppk←→pem は相互に変換が可能
PuTTYgenで変換します。
変換方法は以下に書いてくれています。
- [Windowsの場合]https://ryoheihey.com/information-technology/pem-ppk-2/2019/09/14/525/

## Amazon Linux 2にrootで公開鍵認証する
rootのauthorized_keysの秘密鍵ないなと思ってたんですけど以下が参考になりました。
**(Amazon Linux 2の)sshd_configとauthorized_keysを学ぶ**
 https://qiita.com/Inon/items/84162368dd57e4356621#root%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E7%A6%81%E6%AD%A2
sshd_config　のPermitRootLoginは、without-password がよいと思います。

## 参考にした記事
[SSH公開鍵認証で接続するまで][link2]
[AWS EC2なLinux サーバへroot ユーザでのSSHログインを許可する][link3]
[pemファイルとppkファイルの違い][link4]
[link2]:https://qiita.com/kazokmr/items/754169cfa996b24fcbf5
[link3]:https://sig9.hatenablog.com/entry/2019/07/15/000000
[link4]:https://qiita.com/one_punch_man/items/2ad8b4664ed012bee5a7
【Ruby】文字の置き換えメソッド

【コード】

```
S = "oishiyo"

def slug (s)
 puts s.gsub(/[oi]/,"o" => "0", "i" => "1")
end
slug(S)
```
【出力結果】

```
01sh1y0
```
【解説】
ハッシュを使って、指定の文字を置き換えるメソッドです。
今回はネットスラングLeetの中から"o"と"i"を抜粋して"oishiyo"を置き換えてみます。

変数Sに変換したい文字を代入します。
標準入力から取得したい場合は

```
S = gets
```
となります。

slugメソッドを定義、実引数(S)に変数Sを代入し、仮引数(s)へ渡します。
変数sの後に

```
s.gsub(/[oi]/,"o" => "0", "i" => "1")
```
このように、[]の中に置き換えたい文字を入れ、 => を使ってそれぞれ置き換えていきます。

ここでは、oを0に、iを1に、という具合です。

最後にputsで出力処理をして、実行します。
RDB/SQL復習②

<a href="https://qiita.com/SOH_engineer/items/dd2ef8f360581dd44c16">RDB/SQL復習①</a>からの続きです。

<h1>サブクエリ</h1>

```SQL:sample1.sql
①マイケルの得点数を取得する
SELECT goals
FROM players
WHERE name = "マイケル";
```

```SQL:sample2.sql
②取得した結果を自分で入力する
SELECT name
FROM players
WHERE goals > 20;
```

サブクエリを使った場合、以下のようにまとめることができる。

```SQL:SQL
# サブクエリが実行された後に外側にあるクエリが実行される
SELECT name
FROM players
WHERE goals > (
  SELECT goals
  FROM players
  WHERE name = "マイケル"
);
```

<h1>AS</h1>

ASを使うことで、カラム名などに別名を定義できる

```SQL:SQL
SELECT goals AS "マイケルの得点数"
FROM players
WHERE name = マイケル";
```

<h1>JOIN</h1>

複数のテーブルを一つに結合したい時にJOINを使う。
ONで条件を指定して、テーブルAにテーブルBを結合する

```SQL:SQL
SELECT *
FROM テーブルA
JOIN テーブルB
ON 結合条件;
```

```SQL:SQL
SELECT *
FROM players (テーブルA)
JOIN countries (テーブルB)
ON players.country_id = countries.id; (テーブルA.カラム名 = テーブルB.カラム名)
```

<h4>JOINの実行順序</h4>

```SQL:SQL
SELECT * #②結合された後にSELECTが実行される
FROM players 
JOIN countries #①まずは最初にテーブルを結合する
ON players.country_id = countries.id;
```

<h1>複数テーブルでのカラムの指定</h1>

```SQL:SQL
SELECT players.name, countries.name #テーブル名を指定することで取得するカラムを指定できる
FROM players 
JOIN countries 
ON players.country_id = countries.id; 
```

```SQL:SQL
SELECT *
FROM players 
JOIN countries 
ON players.country_id = countries.id
WHERE players.name = "マイケル" #WHEREでもテーブル名を指定することで、取得するカラムを指定できる
```

<h4>全体の実行順序</h4>
①テーブルの指定 FROM
②テーブルの結合 ON JOIN
③取得条件 WHERE
④グループ化 GROUP BY
⑤関数 COUNT,SUM,AVG,MAX,MIN
⑥HAVING
⑦検索 SELECT,DISCINCT
⑧順序 ORDER BY
⑨LIMIT

<h1>LEFT JOIN</h1>

LEFT JOINを使うと、FROMで取得したテーブルのレコードを全て取得する。
外部キーがNULLのレコードもNULLのまま、実行結果に表示される。

```SQL:SQL
SELECT *
FROM players 
LEFT JOIN teams #LEFT JOINを使うと、もととなるテーブルのレコードを全て取得する
ON players.previous_team_id = teams.id;
```

<h1>複数テーブルのJOIN</h1>

```SQL:SQL
# JOINを複数回使用しても、FROMは一度だけ書けばOK
SELECT *
FROM players 
JOIN countries
ON players.country_id = countries.id
LEFT JOIN teams
ON players.previous_team_id = teams.id;
```

<h1>INSERT</h1>

テーブルにレコードを挿入したい時、INSERTを使う

```SQL:SQL
INSERT INTO students (id, name, course)
VALUES (8, "Taro", "Ruby");
```

<h4>AUTO INCREMENT</h4>
多くの場合、idカラムにはAUTO INCREMENTという機能が使われる。
AUTO INCREMENTのカラムは省略可能

```SQL:SQL
#id はAUTO INCREMENTであり、省略可能
INSERT INTO students (name, course)
VALUES ("Taro", "Ruby");
```

<h1>UPDATE</h1>
UPDATEでデータの更新ができる。複数変更したいカラムがある場合は、コンマで区切る。
WHEREで更新するレコードを指定しないとカラム内の全データが更新されてしまうので、注意！

```SQL:SQL
UPDATE students
SET name = "Michael", course = "JavaScript"
WHERE id = 5; #更新するレコードをWHEREで指定する
```

<h1>DELETE</h1>
DELETEでレコードの削除ができる。
WHEREで削除するレコードを指定しないとテーブル内の全レコードが削除されてしまうので、注意！

```SQL:SQL
DELETE FROM students
WHERE id = 9; #削除するレコードをWHEREで指定する
```

<h1>CREATE TABLE</h1>

```SQL:SQL
CREATE TABLE テーブル名();
```

RDB/SQL復習以上
RSpecのモデル単体テストにて外部キーを自動抽出する方法と注意点【初心者向け】

# 開発環境
|system|version|
|-----|-----|
|macOS Catalina|10.15.7|
|Ruby on Rails|6.0.0|
|pry_rails|4.0.0|
|Bundler|2.1.4|
|rspec_rails||
|factory_bot_rails||
|faker||

# 自動抽出が何故必要か
モデル単体テストでは、如何に実際のデータ保存機能に近い検証が出来ているかが鍵となるからである。

さて、子モデルのインスタンスをFactoryBotで生成する際、親モデルのidを外部キーとして持たせる必要があり、これには何パターンかやり方が考えられる。

**1. 任意の数字を入れた状態にする**

```ruby:spec/factories/address_order.rb
FactoryBot.define do
  factory :address_order do
# 省略
    item_id             { '1' }
    user_id             { '1' }
  end
end
```

**2. Fakerでランダムな数字を生成する**

```ruby:spec/factories/address_order.rb
FactoryBot.define do
  factory :address_order do
# 省略
    item_id             { Faker::Number.non_zero_digit }
    user_id             { Faker::Number.non_zero_digit }
  end
end
```
**3. 親モデルから紐づいているインスタンスのidを抽出する**

```ruby:spec/factories/address_order.rb
FactoryBot.define do
  factory :address_order do
# 省略
# 外部キーのカラムは消してしまう
#   item_id
#   user_id
  end
end
```

```ruby:spec/models/address_order_spec.rb
require 'rails_helper'

RSpec.describe AddressOrder, type: :model do
  before do
# 親モデルのインスタンスを生成する
    @user = FactoryBot.create(:user)
    @item = FactoryBot.create(:item)
# 親モデルのインスタンスからidを抽出する
    @order = FactoryBot.build(:address_order, user_id: @user.id, item_id: @item.id)
    sleep 0.1
  end
# 省略
end
```

どのパターンでも問題なくテストを行うことが出来るが、厳密に言うと<b>子モデルのインスタンスにおける外部キーは、親モデルの紐づいているインスタンスからマージされる</b>存在であるため、パターン3で記述することが望ましい。
これによって、実際のデータ保存機能により近いテストを行うことが出来る。

# 注意点
beforeメソッド内に`sleep 0.1`という記述があるが、この１文がなかった場合以下のようなエラーに遭遇した。
![エラー画像](https://pbs.twimg.com/media/Es9Rvl_U4AMX-M5?format=jpg&name=4096x4096)
(一部省略)
![エラー画像](https://pbs.twimg.com/media/Es9RxhGVoAUWgYR?format=jpg&name=large)
このエラー原因や解消法に関しては、[『RSpecのテスト中にMySQL client is not connected』](https://qiita.com/shun915a/items/e18f538be6221f929876) を参照した。
一言でいうと、<b>インスタンス生成に過剰な負荷がかかってしまったことによって発生するエラー</b>である。そのため、`sleep 0.1`をbeforeメソッド内に記述することによってインスタンスを生成する度に<b>0.1秒処理を待機</b>させることで、負荷の軽減に成功している。

# 結果
テストが完了するまでに以前より少し時間がかかるようになったが、より実際の昨日に近いカタチで単体テストを記述することが出来た。

# 参考リンク
- [『RSpecのテスト中にMySQL client is not connected』](https://qiita.com/shun915a/items/e18f538be6221f929876)
react カウントアップ

カウントアップとカウントダウン機能をつけました
[公式](https://ja.reactjs.org/docs/hooks-intro.html)のコード

自分の勉強として

- ```useState```
- 関数コンポーネント

を使って書きます。

公式とは異なり```onClick```にべた書きは避けました。


```react
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
    <App />,
  document.getElementById('root')
);
```

```react
//App.js
import React,{useState} from 'react';

function App() {
  const [ count, addCount ] = useState(0);
  const countUp = () => {
    addCount( count + 1 )
  }
  const countDown = () => {
    addCount( count - 1 )
  }
  return (
    <>
      <p>{count}</p>
      <button onClick={countUp}>追加</button>
      <button onClick={countDown}>削除</button>
    </>
  )
}

export default App;
```
【メモ】Jupyter Notebookでmatplotlibの日本語を表示させる方法

* 製造業出身のデータサイエンティストがお送りする記事
* 今回は使用頻度は低いですが、可視化する際に日本語を表示させる方法をメモとして残しておきます。

##はじめに
分析結果のグラフに日本語（漢字）を使用できるようにする

##実装コード
今回はUCI Machine Learning Repositoryで公開されているボストン住宅の価格データを用いて可視化します。

```php
# 必要ライブラリのimport
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# 日本語化対応
import japanize_matplotlib
#日本語フォント設定
sns.set(font="IPAexGothic")

from sklearn.datasets import load_boston

# データセットの読込み
boston = load_boston()

# データフレームの作成
# 説明変数の格納
df = pd.DataFrame(boston.data, columns = boston.feature_names)

# 目的変数の追加
df['MEDV'] = boston.target

# データの中身を確認
df.head()
```

![スクリーンショット 2020-11-09 20.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/2ffa1a41-98dd-2798-1f6d-8f3385bf5f75.png)

```php
plt.figure(figsize=(6,6))
plt.scatter(df['CRIM'], df['MEDV'])
plt.xlabel('犯罪率')
plt.ylabel('価格')
plt.title('散布図')
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/657fb15b-89d8-637e-64fc-de752a3d70e4.png)
入力フィールドの自動トリミングをoffにする方法(Laravel)

### はじめに

Laravelではミドルウェアで、全てのフィールドに自動的にトリム処理が走ります。（文字列の前後にスペースがあっても自動的に削除してくれる）
今回は、その設定をoffにする方法を書きます✍️

### 結論
#### ・全てのフィールドのトリム処理を無効にする方法
ミドルウェアの記述をコメントアウトする

##### app/Http/Kernel.php
```Kernel.php
    protected $middleware = [
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        // \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];
```
App\Http\Middleware\TrimStringsがトリム処理のミドルウェアとなりますので、上記のようにコメントアウトしてあげれば全てのフィールドのトリムを無効にすることができます。



#### ・特定のフィールドのトリム処理を無効にする方法

また、$exceptプロパティに除外したいフィールドを設定することで、特定のフィールドのみトリム処理を無効にすることもできます。

##### app/Http/Middleware/TrimStrings.php


```TrimStrings.php
    protected $except = [
        'password',
        'password_confirmation',
        'hoge',// 除外したいフィールド名を記述してあげる
    ];
```
上記のように記述してください🙇‍♂️
はい、以上となります！

### おわりに
見てくださった方ありがとうございます！
もし誤字・脱字等ありましたらご指摘頂けると嬉しいです:writing_hand_tone1:
よろしくお願いいたします。

---
### 参考文献
[入力のトリムと正規化](https://readouble.com/laravel/8.x/ja/requests.html)
yarnでbootswatchをインストール

###環境
rails 6.0.3.2
yarn 1.22.10
bootstrap4.5(yarnで導入済）

###インストール可能なバージョンを調べる
```ｓｈ：
$ yarn info bootswatch | less
yarn info v1.22.10
{
  name: 'bootswatch',
  description: 'Bootswatch is a collection of themes for Bootstrap.',
  'dist-tags': {
    latest: '4.6.0',
    next: '4.0.0-beta.3',
    old: '3.4.1'
  },
  versions: [
==中略==
    '4.0.0-alpha.6',
    '4.0.0-beta.2',
    '4.0.0-beta.3',
==中略==
    '4.5.0',
    '4.5.1',
    '4.5.2',
    '4.5.3',
    '4.6.0'
  ],
==以下略==
```
4.6.0が最新のようだ。

###インストール
```sh:
$ yarn add bootswatch@4.6.0
==中略==
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ bootswatch@4.6.0
info All dependencies
└─ bootswatch@4.6.0
✨  Done in 7.92s.
```

###scssに追加
当たり前ですが、bootstrapは入ってる前提です。
app/app/javascript/src/application.scss
に以下を追記する。
※必ず「@import "~bootstrap/scss/bootstrap";」
を前（variables)と後(bootswatch)で挟む

```app/javascript/src/application.scss
+ @import "~bootswatch/dist/[theme]/variables";
@import "~bootstrap/scss/bootstrap";
+@import "~bootswatch/dist/[theme]/bootswatch";
```

#適用されているかテスト
前項の[theme]をテーマ名に変えて体裁を確認。
※nav.nav-barを
.navbar-dark.bg-primary
.navbar-dark.bg-dark
.navbar-light.bg-light
の３つ並べたものです。
###sandstone
![スクリーンショット 2021-01-30 14.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/83c5d3df-98ff-1f3d-ac1d-2ebd7049f04f.png)

###solar
![スクリーンショット 2021-01-30 14.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/07e8ef70-9a98-036a-f77b-ac6378b46492.png)

###minty
![スクリーンショット 2021-01-30 14.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/932ca8d9-6b92-82b0-6a49-ef42c653dd73.png)
YAMAHA製ルータのconfigをVimでええ感じに見る

# YAMAHA製ルータのconfigをVimでええ感じに見る
結構前に作って放置していた物ですが、プラグインにしてみました。
RTX1210等のconfigをVimで見るとき用syntaxファイルです。

https://github.com/okkiroxx/rtx.vim
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104009/4cf805fb-5792-41be-b9d5-911d047a111b.png)
スクショのカラースキームはrailscastです。
### Qiita初投稿ですが
**GitHubもよくわかっていない**ので、何か不備があるかも知れません:scream:
【備忘録】WordPress子テーマの設定

#はじめに
　今日はWordPressの子テーマについて書いていきたいと思います！
　子テーマを使うことでWordPressのバージョンアップをしたときに、
　データの上書きで大事なデータがなくなってしまわぬようにすることができます。

#子テーマの作り方
　子テーマは「style.css」と「functions.php」の２つののファイルが必要になります。
　「style.css」には

```php

/*
Template:Original
Theme Name:Original_child
*/

```

「function.php」には

```php

<?php add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' ); 
    function theme_enqueue_styles() 
    { wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' ); 
} ?>

```


　この２つを準備すれば子テーマが使用できます。
　直接テーマを変更せずに子テーマ内に新しくファイルを作ったりstyle.cssに記述していきましょう。


#最後に
　今回は子テーマについて勉強しました。次回をプラグインについて書いていきたいと思います。
【解決】heroku-20 You are trying to install ruby-2.6.5 on heroku-20. The Ruby version you are trying to install does not exist on this stack.

「The Ruby version you are trying to install does not exist on this stack. heroku-20  You are trying to install ruby-2.6.5 on heroku-20. Ruby ruby-2.6.5 is present on the following stacks:cedar-14 heroku-16 heroku-18」とかいうエラーで、Rubyバージョン2.6.5のRails-appがHerokuにデプロイできない、、、

## 問題のエラー

![スクリーンショット 2021-01-30 14.00.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/1817de64-5746-3fd1-3c56-c17ae58321f7.png)

## 解決策

1. [**Rubyのバージョンを`2.6.6`か、`2.7.2`か、`3.0.0`に変更する**](#1rubyのバージョンを266か272か300に変更する)
2. [**またはherokuのstackを18に下げる**](#2追記herokuのstackを18に下げる)

### 1.**Rubyのバージョンを`2.6.6`か、`2.7.2`か、`3.0.0`に変更する**
（例）Rubyのバージョンを`2.6.6`に変更する場合

1.Ruby 2.6.6 をインストール（以下をターミナルで実行）[参考](https://morizyun.github.io/ruby/rbenv-update-mac-homebrew.html)

```
$ brew update         // brewをアップデート
$ brew upgrade ruby-build         // ruby-buildをアップデート
$ rbenv install 2.6.6         // ruby2.6.6 をインストール
$ rbenv global 2.6.6         // ruby2.6.6 をローカルのデフォルトに設定
```

2.`.ruby-version`のバージョンを 2.6.6 に変更
3.`Gemfile`のRubyバージョンを 2.6.6 に変更
4.再 bundle install

```
$ rm Gemfile.lock         // Gemfile.lockを削除
$ rm -rf venvor/bundle         // venvor/bundleを削除
$ bundle install --path vendor/bundle         // インストールするパスを指定してbundle install
```

5.git add から herokuデプロイまで 1コマンドで実行

```
$ git add .; git commit -m 'fix: ruby version'; git push heroku master
```

### 2.＜追記＞herokuのstackを18に下げる

ターミナルで、現在デプロイしようとしているアプリのディレクトリにいき、以下を実行

```
$ heroku login           // 実行後にエンターしてログイン
$ heroku stack:set heroku-18           // stackを heroku-18 に下げる
$ git push heroku master           // デプロイ 
```

[参考](https://devcenter.heroku.com/articles/heroku-20-stack#using-heroku-20)

以上でデプロイできたはず！

## 原因

[Herokuの公式サイト](https://devcenter.heroku.com/articles/ruby-support#supported-runtimes)に、現在対応しているRubyのバージョンが記載されていた
対応していないRubyバージョンでデプロイしていたことが原因みたい

![スクリーンショット 2021-01-30 14.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/eb22d24f-749b-661a-e5e1-3e6b9d0de0f5.png)

##  エラー文（テキストコピー）

```
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.5 on heroku-20.
remote:  !     
remote:  !     Ruby ruby-2.6.5 is present on the following stacks:
remote:  !     
remote:  !     - cedar-14
remote:  !     - heroku-16
remote:  !     - heroku-18
remote:  !     
remote:  !     Heroku recommends you use the latest supported Ruby version listed here:
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
remote:  !     
remote:  !     For more information on syntax for declaring a Ruby version see:
remote:  !     https://devcenter.heroku.com/articles/ruby-versions
```

https://qiita.com/___xxx_/items/bb85d26d50ff3940441c
https://qiita.com/wann/items/47983dad181e6df4c867
https://devcenter.heroku.com/ja/articles/getting-started-with-rails6