OmniAICreator/Qiita-1.07M huggingface dataset:
FullCalendar with Vue で、イベントの日の日付数字に色をつける（例：日本の祝日）

# 前提

google calendar apiを利用してイベントを取得してFullCalendarによって作られたカレンダーに表示します。
今回は、日本の祝日を取得して休みの日の日付は赤にしたいな〜、なんて思います。

# FullCalendar についての情報

VueComponent
https://fullcalendar.io/docs/vue

events from Google Calendar
https://fullcalendar.io/docs/google-calendar


# google calendar api

FullCalendarでgoogle calendar APIを使うので、クライアント用のAPI keyを取得
（上記のevents from Google Calendar参考）


# コンポーネントを書く

- 祝日の他にも予定が入っているカレンダーを取得したかったので、`eventSources`を使ってgoogle calendarから予定を取得します。

- 祝日は、公開されているカレンダーに「日本の祝日(カレンダーID:　japanese__ja@holiday.calendar.google.com)」があるので、それを利用。

- 取得成功で、呼び出されるコールバックで、日にちが入っているDOMを読み込む
参考：https://fullcalendar.io/docs/event-source-object

- DOMには`dataset.date`に年月日がセットされているので、コールバック関数で取得できる祝日の日付とつけあわせて、一致していたら、DOMにクラスを追加。

あとは、cssで見た目をセットすればよいんじゃないでしょうか？

ということで、実際のコード↓

```vuejs:calendar
<template>
  <FullCalendar
    default-view="dayGridMonth"
    :plugins="calendarPlugins"
    :googleCalendarApiKey="googleCalendarApiKey"
    :eventSources="eventSources"
  />
</template>

<script>
import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import googleCalendarPlugin from '@fullcalendar/google-calendar';

export default {
  components: {
    FullCalendar
  },
  data() {
    return {
      calendarPlugins: [ 
        dayGridPlugin, googleCalendarPlugin
      ],
      googleCalendarApiKey: '取得したgoogle API keyを記載',
      eventSources: [
        {
          googleCalendarId: 'japanese__ja@holiday.calendar.google.com',
          success:function(e) {
            let days = document.getElementsByClassName('fc-day-top');

            e.forEach(el => {
              for(let i=0; i<days.length; i++) {
                let day = days[i]
                if (el.start === day.dataset.date) {
                  day.classList.add('is_holiday')
                }
              }

            });
          }
        },
      ],
    }
  }
}

</script>
<style>
   @import '~/node_modules/@fullcalendar/core/main.css';
   @import '~/node_modules/@fullcalendar/daygrid/main.css';
</style>

```

# あとがき

apiで取得したデータで祝日リストを作って、dayRendarにわたそうとか、いろいろこころみたのですが、`this`の中身がVueのコンポーネントにならないとか、いろいろあって、かなり手間取った結果、かなりシンプルに落ち着いたかと。
SourceTreeインストール方法

# はじめに

SourceTreeは、GitをGUIで扱えるツールです。
ここでは、SourceTreeのインストール方法について、解説します。
後日、初期設定についても追記する予定です。

# SourceTreeのダウンロード、インストール

[SourceTreeのダウンロードページ](https://www.sourcetreeapp.com/)にアクセスします。
「Download」をクリックすると、インストーラーがダウンロードされます。

![sourcetree_download.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/adfadde4-597b-ce8e-9a8a-8dabf09561fe.png)

指示に従って進んでいくと、インストールが完了します。

![sourcetree_top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517951/121115b1-ad48-8d4a-f411-9bc2c4c81ac6.png)

このような画面が立ち上がれば完了です。

# まとめ

ここでは、SourceTreeのインストール方法について解説しました。
コマンド操作に苦手意識のある人でもGitを扱えるようになります。
キャプチャボードからの入力映像を画像で保存

# はじめに


キャプチャボードからの入力映像を定期的に画像として保存するスクリプトです。
ゲーム映像(Nitendo Switch)のスクショを定期的に取得したかったので作成しました。

![SnapCrab_NoName_2020-3-22_18-44-35_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191958/49eafc42-7d32-bad5-bdf7-b8dbfacc0fd9.png)

# 環境
 - Windows 10
  - Python 3.7
 - GC550 PLUS（キャプチャボード）
    

# スクリプト概要

- OpenCVでキャプチャボードからの映像を取得

- 1秒おきにキャプチャ画像を取得

　-> キャプチャしたい動画のfpsは 60なので、 `count` が60の倍数のときに画像を保存 

- 取得したフレームをHDサイズにリサイズして保存

　-> 今回のケース（Siwtch）はFull HDで映像が出力されますが、HDのキャプチャ画像が欲しかったため

# スクリプト概要



``` capture.py
import cv2
import datetime

# VideoCapture オブジェクトを取得
# キャプボの他にWebカメラなど接続している場合は他の数字を指定する必要があるかも
capture = cv2.VideoCapture(0)
print(capture.isOpened())
capture.set(3, 1920)
capture.set(4, 1080)

count = 0
while(True):
    ret, frame = capture.read()
    cv2.imshow('frame', frame)
    count += 1
    print(count)
    if count % 60 == 0:
        dt_now = datetime.datetime.now()
        # 1280 * 720のキャプチャ画像に変換、保存
        resized = cv2.resize(frame, (1280, 720))
        # 所定のフォルダにjpgで保存
        cv2.imwrite('H:/capture/'+ dt_now.strftime('%Y%m%d-%H%M%S')+'.jpg', resized)

    # "q"キー または ctrl + C でキャプチャ停止
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

capture.release()
cv2.destroyAllWindows()
```
Swiftで簡単なコードを書いてみた(初心者向け)

#はじめに
アプリ開発に最近興味を持ち始めSwiftについて勉強したことのアウトプットとして書きました
初心者向けの簡単な文法や記述方法について触れています
#Swiftって？
誰もが圧倒的に優れたアプリケーションを作れる、パワフルなオープンソースの言語です（[Appleサイト](https://www.apple.com/jp/swift/)より）

主に下記アプリの基幹言語として使用されています
・iPhoneアプリ
・OSXアプリ
・Apple Watchアプリ
・tvOSアプリ

#環境構築
WindowsやLinuxでもSwiftは動かすことは出来ますが、やはりMacを使用するのが適しています
また、実際に開発を行うのは「XCode」というソフトを使用します

詳しくは下記サイトで環境構築をしてみてください
[XcodeとSwiftを使ってアプリ開発を体験してみよう](https://www.webprofessional.jp/lesson/swift4designers/lesson01/)

#実装
![681E9860-93E4-4D46-B44A-1322FFA9FF9F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559642/631de560-4051-cec9-9236-a470a601ec97.jpeg)

Xcodeをインストール後、以下の画面が表示されるので、今回はplaygroudを使用していきます

playgroudは名の通り、遊び場のように作ってはすぐに実装の確認をすることが出来ます

Single Viewを選択し適当な名前を付けます


[実行画面]
![02A67201-011F-466A-9B8C-6B00AA1E9CD2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559642/02339d53-9fb0-9d08-3e66-0e09ff5fac9f.jpeg)

初期の起動時に、自動的にHello Worldを出力するソースがあるので、とりあえず実行してみました

実装の確認を同一の画面で確認出来ることが分かると思います

#簡単な記述方法
それでは簡単なコードをSwiftで記述していきます


1.文字の出力

```swift

print("Hello Swift")

//実行結果
//Hello Swift
```

と記述することでテキスト出力します（改行あり）
Java等に比べると、シンプルに記述可能です

2.if文

```swift
var num = 1

if num < 10 {
    print("10より小さい値です")
}else{
    print("10より大きい値です")
}

//実行結果
//10より小さい値です
```
varで変数を定義し、if文で判定を行っています
ちなみに、変数numにカーソルを当てQuick Helpというツールを使うと自動的に変数の型を明示してくれます。これも便利ですね
![BFC8C3F9-DD17-4A0D-8724-AAAC0C5FA983_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559642/29c6eebf-02aa-9042-5bd2-5777f80c31eb.jpeg)


3.for文

```swift

for n in 1...5 {
    print(n)
}

//実行結果
//1
//2
//3
//4
//5
```
1から5までの繰り返しを記述します
こちらも独特な書き方ですが、分かりやすいです

4.while文

```swift
var cnt = 0
var sum = 0

while cnt < 5{
    cnt += 1
    sum += cnt
}
print("cnt:\(cnt)")
print("sum:\(sum)")

//実行結果
//cnt:5
//sum:15
```

#終わりに
ここまで読んで頂きありがとうございました
今回は簡単なSwiftの記述方法に触れましたが、他の言語と比べ書き方が相違する所はありますが、簡略して書けるのではと思います
これからもSwiftについて勉強していこうと思います
Laravel リレーションの取得 withメソッド


##withでeagerloadする
紐づいたテーブルから大量にデータ取得する場合、何度もDBアクセスしてデータを取得するとレスポンスがわるくなるので、リレーションを取得するときはwithを使う。

###使い方
下記のようにするとwithメソッドが利用可能

```
Model::with('リレーション名')->get();
```

###実際の例

1対多の関係(Personが複数のBoardを持っている)
親：person
　・[id, name, email, age]
子：Board
　・[id, person_id, title, message]
withを使うと下記のような流れで値を取得できる。
※hasMany, belongsTo等、正しく設定されていること前提
①Boardだけを取得
②取得したBoardのperson_idの値をまとめ、それらのIDのPersonを取得


```Board.php
$boards = Board::with('person')->get();
return view('boards.index', ['boards' => $boards])
```

```Boards/index.blade.php
# こうすると親の値も取得できる
@foreach($boards as $board)
  <p>{{ $board->message }}</p>
  <p>{{ $board->person->name }}</p>
@endforeach
```

上記は子から親を取得しているが、これの逆パターンをすれば親から子の取得も可能
【AWS初心者】×【対策本１冊のみ】×【 平日＋休日２日のみ（50時間）】でSAA（ソリューションアーキテクト アソシエイト）を取得する方法

## この記事の構成
▶合格するのに必要なもの３点（無駄を究極にそぎ落としました）
　①：対策本１冊
　②："受けるからには **絶対に** 受かる"という強い意志
　③：50時間
▶これから始める人へのエール

## ①：対策本 

本屋に並んでる対策本全部見て、以下の観点で決めました。
ポイントは**１冊に絞る**こと。複数冊買いたくなりますが、
９割以上重複してるので学習効率が悪いです。

- ページ数が少ない（重要！量より質を大事に）
- 図解が好み（超重要！色とかテイストは集中力に直結）
- 模擬試験の解説が教科書とリンクしている（最重要！！学習効率が爆上がり） 

![51XxEhKaqbL._SX350_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602559/f49656c9-6379-b3b7-11af-e0919474ee98.jpeg)

## ②："受けるからには **絶対に** 受かる"という強い意志 

なんのために試験を受けるか？

なんとなく勉強するのであれば時間の無駄です。
**受かる** ことから逆算して攻略方法を考えるべきです。
意志次第で同じ１時間でも密度が全く異なります。

## ③：50時間 

具体的な学習方法について記述します。
１冊を **教科書・模擬試験・試験解説** に分解して考えます。
１冊を極めることを意識して学習に臨みます。

#### 1.教科書
|   　　　　　　    |所要時間　　　　|学習方法　　　　　　　　|
|:-----------------|:-----------------|:-----------------|
|１周目|８時間|[**慣れる**] 流し読み。言葉に慣れるだけでOK|
|２周目|５時間|[**慣れる**] 言葉に慣れきることを意識|
|３-５周目|各３時間|[**理解する**] 書かれてる内容を理解しようとする。ネットを少し活用して調べるのも可|
|６-１０周目|各２時間|[**極める**] 模擬試験の内容とリンクさせる。必要に応じて書き込み|
|合計|３２時間||
#### 2.模擬試験
|   　　　　　　    |所要時間　　　　|学習方法　　　　　　　　|
|:-----------------|:-----------------|:-----------------|
|１周目|２時間|[**慣れる**] ほとんど解けない。**一番しんどい**ですが我慢です|
|２周目|１時間|[**解ける**] 間違えたところと自信がなかったところだけ重点的に|
|３周目|１時間|[**理解して解ける**] 解説に書かれている内容を思い出しながら|
|合計|４時間||
#### 3.試験解説
|   　　　　　　    |所要時間　　　　|学習方法　　　　　　　　|
|:-----------------|:-----------------|:-----------------|
|１周目|５時間|[**知識吸収**] 出題されることしか書いてないです。貪欲に頭に叩き込みます|
|２周目|４時間|[**解き方の理解**] 選択肢の中で正答と誤答の違いを **人に説明する** つもりで理解します|
|３周目|１時間|[**理解して解ける**] 間違ったところだけもう一度理解|
|合計|１０時間||

→合計で４６時間です。残り４時間は自身で不足箇所の学習にあてます
#### ３週間でやるとすると
|      　　　 |所要時間|やること　　　　　　　|
|:-----------------|:-----------------|:------------------:|
|１週目|１３時間|教科書２周|
|２週目|１９時間|教科書２周、（模擬試験＋試験解説理解）×２周|
|３週目|１８時間|教科書６周、試験解説理解１周|

#### 平日＋休日２日のみ で時間を捻出する
- 通勤で１時間
- 昼休みで３０分
- 定時後に１時間  
→これで平日に２時間半確保。３週間で３７時間半
- 休日に６時間～７時間を２日

私の場合、自宅では集中効率が悪いのでやらないと決めました。
定時後や休日はカフェやコ・ワーキングスペース（**AWS Loft Tokyo**や**Nagatacho GRiD**）を利用しました。

## これから始める人へのエール
ここまで読んでいただきありがとうございます。

人生８０年で考えると５０時間はたったの０.００７％ほどです。
これからの時代を考えるとかけた時間に対して得られる果実が圧倒的に大きいです。


それから、試験は選択式です。
- ４択で正答１つを選択
- ５択で正答２つを選択
の２パターンです。

問題数は６５問なので５０問以上（正答率７７％）の正解を目指しましょう。
単に知識を問うだけの問題も多いので、３５問は自信を持って答えられるレベルであれば
残り３０問の５０％（１５問）を正解すればよいだけです。
４択で正答１つを選択のパターンであれば２択まで絞り込めれば合格できる計算です。

ぜひ頑張ってください！！
Ubuntu 18.04にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してUbuntu18.04にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y software-properties-common
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
# apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main'
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt update; apt install -y zulu-14
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
ループ中にある無名関数のgoroutineではキャプチャに気をつける

# ループ中のgoroutineでは束縛に気をつける

ほかのプログラミング言語の非同期処理でもよく起こしてしまう問題が、レキシカルスコープとダイナミックスコープの理解不足によるキャプチャのミスだ。

今回は、 **goroutine でやりがちなコードでキャプチャのミスを `go vet` で機械的に見つける方法を紹介する**

## 例題
goroutine を使って1,2,3とプリントする関数を3並列で処理したいとする[^1]。以下のコードを書いてみた。どういう動作をするだろうか？

[^1] 今回はプリントする関数としたが、実用であれば重い処理を実行する関数になるはず。

```go

package main

import (
	"fmt"
	"sync"
)

func main() {
	integers := make([]int, 3)
	for i := range integers {
		integers[i] = i
	}

	wg := &sync.WaitGroup{}
	for _, v := range integers {
		wg.Add(1)
		go func() {
			defer wg.Done()
			fmt.Println(v)
		}()
	}
	wg.Wait()
}
```

これを実行すると、2が3回プリントされる。

```console
$ go run main.go
2
2
2
```

## 回避

`fmt.Println` の引数として与えられている `v` がループ変数の `v` にキャプチャされているから起こる。これを回避するには以下のように書き換える。無名関数の部分に引数を渡す形にすればいい。

```diff
 	wg := &sync.WaitGroup{}
 	for _, v := range integers {
 		wg.Add(1)
-		go func() {
+		go func(v int) {
 			defer wg.Done()
 			fmt.Println(v)
-		}()
+		}(v)
 	}
 	wg.Wait()
 }
```

こうすることで期待した動作になる。

```console
$ go run  ./main.go
2
1
0
```

## 機械的に見つけ出す

`go vet` を使う。

```console
$ go vet
# _/your/path/
./main.go:19:16: loop variable v captured by func literal
```

「ループ変数にキャプチャされているよ」と `go vet` が教えてくれた。ループ変数にキャプチャされていると、無名関数が実行されたとき(goroutineがスケジュールされたとき)にループ変数の値を読みに行ってしまう。goroutineがいつスケジュールされるか未定であるから、出力される数字も未定になってしまう。

ということで、ループ変数をキャプチャしないように引数を渡してやれば解消する。

> Note that the tool does not check every possible problem and depends on unreliable heuristics, so it should be used as guidance only, not as a firm indicator of program correctness.

https://golang.org/cmd/vet/

公式ドキュメントから和訳すると、「vet コマンドは問題になりえそうなものを発見してくれるが、それが必ず問題であるわけではない。ガイダンスとして利用すること」ということ。

今回のケースでは機械的に問題を発見できた。
Ubuntu 16.04にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してUbuntu16.04にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y software-properties-common
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
# apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main'
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# apt update; apt install -y zulu-14
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
Debian 10にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してDebian10にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y software-properties-common gnupg
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
# apt-add-repository 'deb http://repos.azulsystems.com/debian stable main'
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y zulu-14
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
TypeORMのconnection設定はormconfig.jsに書くのがおすすめ

# はじめに

TypeORMのcreateConnectionメソッドを呼ぶ際の設定値は、色々な指定方法があります。
色々あって迷っちゃったので、整理して考えた結果、ormconfig.jsに書くのが分かりやすいのではという結論に至りました。

# createConnectionメソッドの引数として直接渡す方法は避けたかった

createConnectionメソッドでは、引数としてconnectionの設定値を直接渡す方法があります。

https://typeorm.io/#/connection/creating-a-new-connection

```ts:メソッド引数として直接渡す例（公式ドキュメントの引用）
import {createConnection, Connection} from "typeorm";

const connection = await createConnection({
    type: "mysql",
    host: "localhost",
    port: 3306,
    username: "test",
    password: "test",
    database: "test"
});
```

バックエンドのアプリケーションにおいて、createConnectionを呼ぶのは大抵の場合、サーバー起動時に一回だけでしょう。そのため、一見するとこの方法でもさほど問題なさそうに思えます。

ところがTypeORMは、バックエンドアプリケーション用の本番コードからだけでなく、何らかのテストコードからとか、[DBマイグレーション用のCLIコマンド](https://typeorm.io/#/migrations/running-and-reverting-migrations)から呼ばれる場合もあるはずです。
それらを視野に入れると、createConnectionの引数として直接渡すだけではカバーしにくい場面がでてきそうです。似たような設定を何箇所かに重複して書く羽目になるかもしれません。

# 引数として直接渡す以外の方法は色々ある

では他の方法はというと、大別すると2種類があります。このあと紹介するそれらの方法で設定した上で、引数なしでcreateConnectionメソッドを呼べば、その設定が参照されます（[Creating a new connection](https://typeorm.io/#/connection/creating-a-new-connection)の節の後半で、そう説明されています）。

## 環境変数TYPEORM_XXXを設定する

1つ目は、何らかの手段によって、所定の名前の環境変数を設定する方法です。

`TYPEORM_CONNECTION`や`TYPEORM_HOST`など、`TYPEORM_XXX`という名前の環境変数を設定しておくと、TypeORMはその値を参照します。参照される環境変数名は、以下のURLにまとめられています。

https://typeorm.io/#/using-ormconfig/using-environment-variables

この方法の亜種として、環境変数を設定する代わりに、ormconfig.envというファイルにそれらの設定を書く方法もあります。

## ormconfigファイルを作る

2つ目は、ormconfig.xxx（ただし、xxx ≠ env）というファイルをpackage.jsonと同じ階層に置き、そこに設定を書く方法です。拡張子はjs、json、ymlなどから選べます。

```js:jsにおける例（公式ドキュメントの引用）
module.exports = {
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "test",
   "password": "test",
   "database": "test"
}
```

# 環境変数TYPEORM_XXXとormconfigの併用はできない

下記のURLで述べられている通り、上記2種類の設定方法を併用することはできません。環境変数TYPEORM_XXXが設定されていると、ormconfigファイルは無視されます。

https://typeorm.io/#/using-ormconfig/which-configuration-file-is-used-by-typeorm

[TypeORMの設定値](https://typeorm.io/#/connection-options)の中には、環境変数で指定したいものもあるでしょうし（例えばDBのパスワード）、分かりやすくどこかにハードコードしたいものもあるでしょう。ところがあいにく、環境変数TYPEORM_XXXとormconfigファイルの併用はできません。

# そこで

そこで、以下のようにすればちょうど良い落とし所になるのではと考えました。

- ormconfig.jsファイルを用意する。
- ormconfig.jsの中で必要に応じて、環境変数を参照する。

この時、ormconfig.jsに書く環境変数名はTYPEORM_XXXではなく、TypeORMが予約していない何らかの独自の名前にします。そうすれば、「環境変数TYPEORM_XXXが設定されていると、ormconfigファイルは無視される」という制約を気にせず、柔軟に設定をかけるようになります。
jsファイルなので、環境変数の値に応じたちょっとした分岐を書きやすい利点もあります。

# まとめ

TypeORMは、バックエンドアプリケーション用の本番コードからだけでなく、何らかのテストコードからとか、DBマイグレーション用のCLIコマンドから呼ばれる場合もあるので、1個の設定用ファイルにまとめて書いておけば、どこから呼んだ場合でも対応できます。

そして、設定用ファイルの種類としてormconfig.jsを使えば、jsファイルの中で環境変数（TYPEORM_XXXでない独自名）を参照させたり、ちょっとした分岐を書いたりと、柔軟に設定を書くことができます。

その環境変数はどこでどう設定するんかっていう点は残りますが、それはTypeORMの専用知識とは切り離した汎用的な問題として、独立して検討しやすいでしよう。また、TypeORM設定の入り口がormconfig.jsという一箇所に集約されるので、（jsファイルの中で、どこかで設定されている環境変数を参照しているとはいえ、）見通しもそこそこ良くなります。
ReadMeをプレビュー表示で編集しやすくする

# 今日のテーマ
VscodeでReadMe編集時にプレビュー表示があるととっても便利で編集捗るよねってお話

マークダウン で編集する際　Qiitaなんかでも右側にプレビューがある　
ReadMeもマークダウン で書くので　例えば　

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

のように表で表示させたければ　以下のように書く必要がある

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

### でも　これ　確認しながら　書く必要あるよね？

さらに　スクショをReadMeに貼り付けたりする場合

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

# どう考えても　プレビュー表示が必要だ！
ということで　

##  本題
ReadMe.md ファイルを開いているときに、「Command + Shift + P」を押して、上のコマンドパレットに 「Markdown: Open Preview to the Side」と入力し選択すると、右側にマークダウンのプレビューを表示することができます。

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

# これで見易くなりました

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

# おまけ
マークダウン記法でGithubのアイコン&リンクを貼るコード


```
<a href "GithubのURL"><img src="アイコンの画像リンク" height="100px;" /></a>
```

こんな感じでリンクにも飛ばせます。

<a href="https://github.com/higakikeita"><img src="https://avatars0.githubusercontent.com/u/41051390?s=460&v=4" height="50px;" /></a>

# まとめ
マークダウン記法は習うより慣れよですね
［C#］DebugとReleaseで別々のconfigファイルを適用する


config配下にApp.Debug.configとApp.Release.configを配置して、実行時にそれぞれ適用する際に詰まったので記録。

環境：
Windows10
VS express2017

[こちらのサイト](http://devdevdev.hatenablog.com/entry/2016/04/05/021945)を参考にしました。



#### 1. .csprojを開く
エクスプローラで該当の .csprojを表示し、メモ帳などで開く。

#### 2. .csprojを編集する
2-1. PropertyGroupを編集

```
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "></PropertyGroup>
```
の間に

```
<appConfig>App.Debug.config</appConfig>
```
を記入。DebugをReleaseに置き換えて同様に記入。





2-2. ItemGroupを編集

```
<None Include="App.config" />
<None Include="App.Debug.config" />
<None Include="App.Release.config" />
```

を以下に書き換える。（Releaseも同）

```

<ItemGroup>
 <Content Include="App.config">
  <SubType>Designer</SubType>
 </Content>
</ItemGroup>
<ItemGroup>
 <Content Include="App.Debug.config">
 <DependentUpon>App.config</DependentUpon>
  <SubType>Designer</SubType>
 </Content>
</ItemGroup>
```
初心者が分かり辛い『アソシエーション』とは？

##モデルとは何をやっているところ？？
簡単に説明すると、データベースとの橋渡し役です。
データベースにアクセスする為の機能を持ったクラスのことを言います。 
コントローラーの命令に従って、データベースから何らかの情報を取り出したり、
あるいはDB（データベース）に何かデータを格納したい場合に使われる役割です。

##アソシエーションとは
モデル間の関連付けに使われるものです。
モデルの関係には**belongs_to**や**has_many**があります。
SNSなどの例を用いながら説明していきます。

##belongs_to
投稿内容から見た投稿者は一人です。
なので投稿テーブルと投稿者のテーブルはbelongs_toの関係です。


##has_many
投稿者から見た投稿内容は複数あります。
なので投稿者のテーブルから投稿テーブルはhas_manyの関係です。

##まとめ
SNSなどの具体例を用いたら想像がしやすい。
モデルの関係を間違えないようにしよう。
【Vue.js】テンプレートリテラル記法メモ

## JSファイルのバッククォート内にHTMLタグごと記述する
### 下記のコードで「こんにちは」と表示される

```index.html
<div id="app">
    
</div>
```
```index.js
const vm = new Vue({
  el: '#app',
  template: `
    <div v-if="message">
    {{ message }}
    </div>
    <div v-else>
      メッセージがありません
    </div>
  `,
  data() {
    return {
      message: 'こんにちは'
    }
  }
})

window.vm = vm
```
MSYS2 のセットアップ

# MSYS2 のセットアップ

## Download
https://www.msys2.org/

## Windows環境変数の設定
コントロールパネル - システム - システムの詳細設定
環境変数
xxxのユーザー環境変数
`変数名：MSYS2_PATH_TYPE`
`変数値：inherit`
を追加

## MSYS2 のセットアップ

```bash
pacman -Syu
pacman -S vim base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain mingw-w64-x86_64-boost
pacman -S openssh sshpass git zip unzip rsync tmux wget 
pacman -S mingw-w64-x86_64-jq
tree
```

vim ~/.bash_profile

```bash:~/.bash_profile
alias ls='ls --color=auto --show-control-chars --time-style=long-iso --human-readable --classify'
alias ll='ls -l'                        # long list
alias la='ls -A'                        # all but . and ..
alias grep='grep --color'               # show differences in colour
alias less='less --raw-control-chars'   # raw control characters
alias whence='type -a'                  # where, of a sort
```

```bash
source ~/.bash_profile
```

Windowsのホームディレクトリとを利用する。
vim /etc/fstab
以下を追加

```bash:/etc/fstab
C:/Users /home
```

### Python のインストール
```bash
pacman -S python python-pip python-setuptools
```
### bashのprompt文字列をgit statusの状態で色変えする
https://qiita.com/u1and0/items/84bd864307ba781d9942

## 参考
- MSYS2＋VagrantによるWindowsでのUNIX環境
https://tamosblog.wordpress.com/2014/12/25/msys2_vagrant_1/#3

- MSYS2 +α - 構築手順・備忘録
https://qiita.com/yuukiyouki/items/a84c14240429e453428b

- MSYS2 で PATH が引き継がれない
http://chirimenmonster.github.io/2016/05/09/msys2-path.html

- お前らのSSH Keysの作り方は間違っている
https://qiita.com/suthio/items/2760e4cff0e185fe2db9

- MSYS2の使い方の備忘録 (2016年度3月版)
https://gist.github.com/ubnt-intrepid/05dab5f0f88bd3baf1a1

- Windows Terminalでもmsys2を使おう
https://qiita.com/yumetodo/items/4aa03d1eb3d887bca1a8
subversion のログをきれいに出力(powershell版)

#この記事では
subversionのログを出す時にpowershellで整える方法を紹介します。
#想定シーン
windows環境でsubversionのログを出力し、比較・精査したい時
#解決したい課題
普通にログを出すと次のように __---------__ が表示されます。
これを取り除きたい

```
>svn log -q 
------------------------------------------------------------------------
r15 | user1 | 2020-03-22 17:34:24 +0900 (日, 22 3 2020)
------------------------------------------------------------------------
r14 | user1 | 2020-03-08 19:15:54 +0900 (日, 08 3 2020)
------------------------------------------------------------------------
r13 | user1 | 2020-03-08 19:13:23 +0900 (日, 08 3 2020)
------------------------------------------------------------------------

```
##方法
linuxでは普通に**grep \-v**だが、
powershellでは**grep**の代わりに**Select-String \(文字列\) \-NotMatch**を使う。

```
svn log -q | Select-String "^-" -NotMatch 
```
```
(実行結果)
r15 | user1 | 2020-03-22 17:34:24 +0900 (日, 22 3 2020)
r14 | user1 | 2020-03-08 19:15:54 +0900 (日, 08 3 2020)
r13 | user1 | 2020-03-08 19:13:23 +0900 (日, 08 3 2020)
```
python responderを利用してSlack botのチャレンジパラメータを応答させる

python3とresponderを利用して、Slack Botを作成しているので備忘録
responderを利用するためには、python3.6以上が必要です

responderをインストール

```python
pip install responder
```

以下のようにpythonファイルを作成

```python:slack.py
import responder

api = responder.API()

@api.route('/')
async def index(req, resp):
    resp.status_code = 200
    if req.method == "post":
        req_data = await req.media(format="json")
        if 'challenge' in req_data:
            token = str(req_data['challenge'])
            resp.headers["Content-type"] = "text/plain"
            resp.text = token
                   
            return

if __name__ == '__main__':
    api.run(debug=True)

```

作成したファイルを実行

```bat
python slack.py

[32mINFO[0m:     Started server process [[36m39040[0m]
[32mINFO[0m:     Uvicorn running on [1mhttp://127.0.0.1:5042[0m (Press CTRL+C to quit)
[32mINFO[0m:     Waiting for application startup.
[32mINFO[0m:     Application startup complete.
```

標準だとローカルの5042番ポートで実行されます
ローカルで実行しているので、外部からアクセスさせるためにはngrokを利用して、
SlackのRequest URLへngrokのアドレスを指定し問題なくチェックされるかを確認します

[responder](https://responder.kennethreitz.org/en/latest/) はバックグランド処理が簡単にかけるので便利そうです。

Herokuへのデプロイ方法も公式にあります
https://responder.kennethreitz.org/en/latest/deployment.html
Debian 9にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してDebian9にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y software-properties-common gnupg
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
# apt-add-repository 'deb http://repos.azulsystems.com/debian stable main'
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y zulu-14
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
Qiitaでアウトプットするきっかけになった2つの記事

#概要
最近、以下の2つの記事を読んでQiitaでアウトプットするようになり、筆者らが話している効果とアウトプットの良さを実感しているのでエンジニアの方にはぜひ読んでいただきたいです。

##参考記事１
エンジニアは全員技術記事を書くことを習慣化した方がいいぞ
https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118

@HiromuMasuda0228さんのQiita記事。

##参考記事２
エンジニアにとっての“アウトプット”の意味
発信し続けるために必要なこと
企業に所属するエンジニアとしての社内と社外の実績の重ね方
https://logmi.jp/tech/articles/320694

松本亮介氏（さくらインターネット株式会社 さくらインターネット研究所上級研究員）のログミー記事。
Debian 8にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してDebian8にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# apt update; apt install -y software-properties-common
# apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0xB1998361219BD9C9
# apt-add-repository 'deb http://repos.azulsystems.com/debian stable main'
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt update; apt install -y zulu-14
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
How to show view controller in full screen

Q:
when I open a view controller in following way, it don't be shown in full screen

let viewController = UIViewController()
present(viewController, animated: true, completion: nil)

A:

just add the following code.

let viewController = UIViewController()
<b>
viewController.modalPresentationStyle = .fullScreen
</b>
present(viewController, animated: true, completion: nil)
【SQL入門】SQL解析時間の短縮について

>この記事では、《SQL解析時間の短縮》について、
業務を通して学習した内容を、備忘録としてまとめています。

- __『SQL解析』の仕組み__
- __『SQL解析時間短縮』の対策__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

## 遅くなる要因のメモリの使い方

### ➡︎&ensp;SQLが共有されていない

## SQLの共有化について

SQLの解析処理には…

- __ハード解析__
- __ソフト解析__

の２種類があります。

この２つの解析は、以下のようなものとなっています。

### ---&ensp;ハード解析&ensp;---

SQL解析に関連する全ての操作を１から処理していくもので…

1. &ensp;__文法チェック__
2. &ensp;__構造解析__
3. &ensp;__最適化（実行計画生成）__
4. &ensp;__解析済みSQLのキャッシュ__

といった処理を行っていきます。

要するに、『ハード解析』は…

__実行計画を新たに生成する解析__です。

>生成した実行計画は、キャッシュされます。

### ---&ensp;ソフト解析&ensp;---

__すでに実行したSQLがあれば、プログラムコード (Pコード) もキャッシュされています。__

__それを使って実行するのが『ソフト解析』__です。

すでに実行したSQLから一致するSQLを探索し、一致するSQLの実行計画をそのまま利用します。

>『ハード解析』で行っていたSQL解析や、実行計画生成を行う必要がありません。

---

つまり・・・

__『ハード解析』の割合を減らし、『ソフト解析』の割合を多くすること__で…

__キャッシュされている実行計画を利用する割合が大きくなります。__

そのためには・・・

__DBに、同じSQLと認識させ、実行計画をそのまま利用させる必要があります。__

## DBに "同じSQL" と認識させるには…？

- __大文字／小文字の使い方を統一する__
- __インデントの入れ方を統一する__

### ---&ensp;例題&ensp;---

~~~sql
SELECT * FROM EMPLOYEE;
~~~

~~~sql
select * from employee;
~~~

上記２つのSQLは・・・

__実行結果は同じになりますが、データベース側では異なるSQLと判断されます。__

>__【補足】DBは、ハッシュ値を比較してSQLを判断している__

>データベースでは、同じSQLか判断するために…

>__それぞれのSQLの『ハッシュ値』を比較して、判断しています。__

ちなみに・・・

macOSでハッシュ値を計算すると、下記のようになりました。

~~~
$ echo "SELECT * FROM EMPLOYEE" | shasum;
ad47d3b42d84a6f793c461e34bfdb60317965f21
~~~

~~~
$ echo "select * from employee" | shasum;
e9082b866d6027bd5bd73127ba9bf43a98dac8c8
~~~

そのため・・・

__下記のSQL解析が実行され、処理が遅くなります。__

1. &ensp;__文法チェック__
2. &ensp;__構造解析__
3. &ensp;__最適化（実行計画生成）__
4. &ensp;__解析済みSQLのキャッシュ__

ですので・・・

__大文字／小文字、インデントの使い方を統一し、ハッシュ値が変わらないようにする必要があります。__

## 『SQL解析時間短縮』の対策&ensp;【PHPの場合】

### 対策：&ensp;『プリペアドステートメント』を使う

『[プリペアドステートメント](https://www.php.net/manual/ja/pdo.prepared-statements.php)』を使い、実行したいSQL文をコンパイルすることで・・・

SQL文を固定し、ハッシュ値が変わらないようにします。

>『プリペアドステートメントの使い方』について詳しく知りたい方は、
下記を参照してみて下さい。

>[》【PDO】PHPでデータベースに接続する方法【INSERT編】](https://qiita.com/yaaabu51/items/11d09c0219907e63a484)

- __プリペアドステートメント__<br>
SQL文で値がいつでも変更できるように、変更する箇所だけ変数のようにしたSQL文を作る仕組みのことです。
通常『プリペアドステートメント』は『プレースホルダ』を使うために作られます。
- __プレースホルダ__<br>
ユーザが入力した内容を後から挿入するために、予め確保した場所のこと。

##まとめ：&ensp;基本コーディング

~~~sample.php
<?php

try {

    // リクエストから得たスーパーグローバル変数をチェックするなどの処理
    $user_name = "ここにユーザー名が入ります";
    $password = "ここにパスワードが入ります";

    // データベース接続設定（MySQL）
    $pdo = new PDO(
        'mysql:host=サーバー名;dbname=DB名;charset=文字エンコード',
        'ユーザー名',
        'パスワード',
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );

        // パラメータ
        $spl = (
            'SELECT
                USER_NAME, PASSWORD
            FROM
                テーブル名
            WHERE
                AND USER_NAME = :USER_NAME
                AND PASSWORD = :PASSWORD'
        );
        
    // プリペアドステートメントを用意
    $stmt = $pdo->prepare($sql);

    // 値をバインドする
    $stmt->bindValue(':USER_NAME', $user_name, PDO::PARAMS_STR);
    $stmt->bindValue(':PASSWORD', $password, PDO::PARAMS_STR);
        
    // 結果を取得する
    $row = $prepare->fetch();

} catch (PDOException $e) {

    // エラー処理

}
~~~
できるオーオース　mod_auth_openidc編

前回はResource Owner Password Credentials Grantでしたが、今回はUbuntu上のApacheにmod_auth_openidcをインストールして、悪名高いImplicit Grantを体験してみます。
https://qiita.com/namikitakeo/items/ea23adbc0b5c941ff0ed

今回のClientは、前回までのコンソールとは違ってWEBブラウザになるため、環境変数を表示するCGIを設置します。

mod_auth_openidc設定をApacheで行い、環境変数を表示するCGIを保護します。

```auth_openidc.conf
（省略）
OIDCRedirectURI https://ubuntu18.japaneast.cloudapp.azure.com/cgi-bin/redirect_uri
OIDCCryptoPassphrase passphrase
OIDCProviderMetadataURL https://ubuntu18.japaneast.cloudapp.azure.com/auth/realms/master/.well-known/openid-configuration
OIDCScope "openid"
OIDCSSLValidateServer Off
OIDCClientID ubuntu18
OIDCResponseType "id_token token"
<Location /cgi-bin>
AuthType openid-connect
Require  valid-user
</Location>
（省略）
```

つぎに管理ユーザー(admin)でKeycloakのAdministration Consoleにログインしたら、Clientsメニューをクリックして、新規Client(ubuntu18)を登録します。Access Typeはpublicのままで、Implicit Flow EnabledをOFFからONに変更しSaveします。

さっそくWEBブラウザからアクセスして、Implicit Grantでid_token/access_tokenを取得します。

本来OAuth 2.0ではresponse_type=tokenがImplicit Grantなのですが、access_tokenの改竄を防ぐためなのか、OpenID Connect 1.0のid_tokenを追加したImplicit Flowでないと実行できませんでした。

```
OIDCResponseType "id_token token"
```

またセキュリティ面を考慮するならば、Hybrid Flowで＃フラグメントにaccess_tokenが渡らないようにすべきなんだと思います。

```
OIDCResponseType "id_token code"
```

かんたんにaccess_tokenが取得出来たのですが、もうuserinfoは叩かなくてもいいですよね。ところで本命のAuthorization Code Flowもmod_auth_openidcを使えば簡単です。くわしい説明は、Qiitaにすばらしい記事がたくさんあるため割愛いたします。

```
OIDCResponseType "code"
```

Keycloakすごい！mod_auth_openidcすごい！という事で、できるオーオースは終わりにしようと思います。もしも分かりにくい部分がありましたらご連絡ください。

#次回
つくるオーオース　MVC編
https://qiita.com/namikitakeo/items/0de598b8e43eb5b1ff94
UniRx と DoTween で簡単にドーナツを追随するニワトリをつくる

ドーナツを追い続ける、アニメーション付きのニワトリを、UniRx と DoTween で作りましょう。
Update から切り離して、UniRx を使うことで、値がメソッドで閉じて、Time.deltaTime などの和算も不要になります。

# こんな感じで動きます
![tracing.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/82a424be-b1a7-e954-1ffd-b657639912e4.gif)


# UniRx と DoTween でつくる Walk メソッド
```C#
    private void Walk()
    {
        // Walk アニメーションを開始
        animator.SetBool("Walk", true);

        // ここから UniRx、 Interval を使うことで 0.1秒毎に Subscribe が呼ばれ続けます
        var duration = 0.1f;
        Observable
            .Interval(TimeSpan.FromSeconds(duration)) 
            .Subscribe(_ =>
            {
                // 移動距離を計算、早く動かしたければ 0.01f の値を大きくすればOK
                var add = transform.rotation * new Vector3(0, 0, 0.01f);
                // DoTween の Move で移動させます
                transform.DOMove(transform.position + add, duration);
                // DoTween の LookAt でドーナツの方向を向かせ続けます
                transform.DOLookAt(target.position, duration, AxisConstraint.Y);
            });
    }
```

# その他
## ニワトリのAsset
* [こちら](https://assetstore.unity.com/packages/3d/characters/animals/meshtint-free-chicken-mega-toon-series-151842)
* 無料です。モデルとアニメーションが付いています。


## 停止方法
* var hoge = Observable.Interval... みたいな感じで書いて、hoge.Dispose(); すれば、止まります。
* 本当は Observable.Interval は AddTo(this) などをして、不要になったらリソースを破棄するべきです。ここでは省略しています。

## 全コード
ほとんど代わり映えしませんが、全コードです。

```C#
using System;
using DG.Tweening;
using UniRx;
using UnityEngine;

public class Chick : MonoBehaviour
{
    [SerializeField] private Animator animator; // 自分自身を設定してください
    [SerializeField] private Transform target;  // 向かっていくドーナツを設定してください

    void Start()
    {
        Walk();
    }

    private void Walk()
    {
        animator.SetBool("Walk", true);
        var duration = 0.1f;
        Observable.Interval(TimeSpan.FromSeconds(duration)).Subscribe(_ =>
        {
            var add = transform.rotation * new Vector3(0, 0, 0.01f);
            transform.DOMove(transform.position + add, duration);
            transform.DOLookAt(target.position, duration, AxisConstraint.Y);
        });
    }
}

```
DBの基本的なコマンド

DB初心者が、DBから情報を取得する際のコマンドを備忘録としてまとめました。

#### クエリ、SQL とは？
- クエリとは、DBに送る命令のこと
- SQLとは、クエリを書くための言語。大文字、小文字の区別はしないらしい
- 文字列を指定するときは" "（ダブルクォーテーション）で囲む


#### DB情報の取得方法
#####テーブルからカラムを取得する（SELECT句）

```
//単一取得
SELECT （カラム名を指定）　FROM　（テーブル名を指定）;

//複数取得
SELECT （カラム名）,（カラム名）　FROM　（テーブル名）;

//全取得
SELECT ＊　FROM　（テーブル名）;
```

##### 特定のレコード情報を取得する（WHERE句）
```
SELECT * FROM (テーブル名）　WHERE　（欲しいデータがあるカラム名）　= (欲しいレコードの値）;
```

##### 指定した文字列を含む値を取得（LIKE句）
```
SELECT * FROM （テーブル名）　WHERE　（カラム名）　LIKE "%（指定する文字列）%";
//前方一致
SELECT * FROM （テーブル名）　WHERE　（カラム名）　LIKE "（指定する文字列）%";
//後方一致
SELECT * FROM （テーブル名）　WHERE　（カラム名）　LIKE "%（指定する文字列）";
```
##### 指定した値以外の値を取得（NOT演算子）
```
SELECT * FROM （テーブル名） WHERE NOT　（カラム名）　= （指定した値）;
```
##### 空欄(NULL)を取得
```
SELECT * FROM （テーブル名） WHERE （カラム名） is NULL
// 空欄以外を取得
SELECT * FROM （テーブル名） WHERE （カラム名） is NOT NULL
```

##### 取得結果を並び替えて表示（ORDER BY)
並べ方

- ASC（昇順）
- DESC（降順）

```
SELECT * FROM （テーブル名） ORDER BY （カラム名） (並べ方）;
//条件を指定する場合
SELECT * FROM （テーブル名） WHERE （指定する条件(カラム名＝指定値など）） ORDER BY （カラム名） (並べ方）;
```

##### 必要な件数だけ取得（LIMIT句）
検索結果の上から必要な件数だけを指定して取得

```
SELECT * FROM （テーブル名） LIMIT （値）;
//条件を指定する場合
SELECT * FROM （テーブル名） WHERE （指定する条件(カラム名＝指定値など）） LIMIT （値）;
```
ラズパイの引っ越し。wifi設定を変更する。

ルータを変えるときの作業録。今後の引っ越しとかの時に絶対困るのでメモ。
もしかしたら最初の作業は有線つないでからでもいいのかも

まずは既存のwifiに繋いでる状態でsshでラズパイちゃん(3B)に侵入し、以下からwifiの設定を変更する。(sudo権限必要)

```:/etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="新しいssid"
    psk="新しいpasswd"
}
```

旧wifiを終了し、有線LANでラズパイとルータを繋ぐ。

```:sshする側のterminal
$ arp -a
```

arpはipアドレスとMACアドレスを紐付けるテーブル。

ここからラズパイのipを割り出し、sshで侵入。無線LANでのIPを確認。

```:sshする側のterminal
$ ssh -p ポート番号 ユーザ名@x.x.x.x
```

```:ラズパイちゃん
$ ifconfig
```

`wlan0`の`inet`に対応するipがそれに当たる。(`eth0`は有線。)

有線を抜き、無線接続に切り替わるので上記でわかったipにsshで入る。

```:sshする側のterminal
$ ssh -p ポート番号 ユーザ名@x.x.x.x
```
VSCodeでRubocopを使う

##Rubocopとは
Rubyのコード解析ツール。Gem。
修正した方が良い書き方を指摘してくれたり、自動で修正してくれたりします。

##導入
```rb:Gemfile
group :development do
  gem 'rubocop'
  gem 'rubocop-rails'
```
```terminal
$ bundle install
```
以下のコマンドで、コード解析が走ります。

```terminal
$ rubocop
Inspecting 67 files
........CCC...CC.C..........................................CC.C...

67 files inspected, 24 offenses detected
```
`-a`オプションをつけると、自動で修正できるところ(クォーテーションの種類を変えるなど)を修正してくれます。

```terminal
$ rubocop -a
```
##設定ファイル
###`.rubocop.yml`
プロジェクトルートに作成して、無視するルールや無視するディレクトリ等を指定することができます。デフォルトは厳しすぎるので、大体何かしらの設定をすることになります。

```yml
inherit_from: .rubocop_todo.yml

require:
  - rubocop-rails

# 対象外
AllCops:
  Exclude:
    - "vendor/**/*"
    - "bin/**"
    - "db/schema.rb"
    - "node_modules/**/*"
    - "tmp/**/*"
    - "lib/**/*"
  DisplayCopNames: true
  TargetRubyVersion: 2.6

# trueかfalseを設定しないと警告が出る
Style/HashEachMethods:
  Enabled: true
Style/HashTransformKeys:
  Enabled: true
Style/HashTransformValues:
  Enabled: true

##################### Style ##################################

# 日本語のコメントを許可する
Style/AsciiComments:
  Enabled: false

# ドキュメントの無いpublic classを許可する
Style/Documentation:
  Enabled: false

# !! のイディオムを許可
Style/DoubleNegation:
  Enabled: false

#文字列をfreezeするか
Style/FrozenStringLiteralComment:
  Enabled: false

# selfが無くても良い時に省略するか。model内において、ローカル変数とメソッド呼び出しの区別をつけた方が分かりやすい場合が多い
Style/RedundantSelf:
  Enabled: false

##################### Lint ##################################

##################### Metrics ##################################

# 変数の代入(A)、メソッドの呼び出し等(B)、条件分岐(C)から算出される複雑度
Metrics/AbcSize:
  Max: 30

# 循環的複雑度 ≒ 分岐の数
Metrics/CyclomaticComplexity:
  Max: 10

# 1行の文字数
Metrics/LineLength:
  Max: 160
  Exclude:
    - "db/migrate/*.rb"

# メソッドの行数
Metrics/MethodLength:
  Max: 20
  Exclude:
    - "db/migrate/*.rb"
```
 
###`.rubocop_todo.yml`
`--auto-gen-config`オプションをつけて実行すると、自動で生成されます。

```terminal
$ rubocop --auto-gen-config
```
現在指摘されている部分の規約を書き出します。このファイルに書かれているルールは無視されます。いきなり全てを修正するのは難しいことが多いので、少しずつこのファイルの記述を減らしていけるように頑張りましょう。

##VSCodeとの連携
VScodeを使っていると、`.rubocop.yml`で定義したルールに則ったLinterやFormaterを利用することができます。
（ルールに違反している箇所に下線が引かれ、ショートカットキーを押すとフォーマットされる）

有効化には以下の設定が必要です。

- 拡張機能`Ruby`をインストール
- setting.jsonに以下の記述を追加

```setting.json
{
  "ruby.useLanguageServer": true,
  "ruby.lint": "rubocop",
  "ruby.format": "rubocop"
}
```

## コミット時に自動で走らせる
Rubocopの警告が出ている状態だとコミットできないようにします。

```rb:Gemfile
group :development do
  gem 'pre-commit'
  gem 'rubocop'
```
```zsh
$ bundle install
$ pre-commit install
$ git config pre-commit.checks rubocop #この変更はプロジェクト内にしか影響しないので他の環境のことは考えなくてOK
$ pre-commit list
```
Rubocopに怒られるような記述をして、commit時にエラーが発生すればOK。

##参考
- [【Rails】Rubocopを使ってコーディング規約に準拠させる方法 | vdeep](http://vdeep.net/rubyonrails-rubocop)
- [Railsの品質を上げるRuboCopとは？インストールや使い方を紹介！ | キツネの惑星](https://kitsune.blog/rails-rubocop)
- [【Ruby on Rails】rubocop と pre-commit を利用して git commit 時にコーディングチェックを行う - きゃまなかのブログ](https://techblog.kyamanak.com/entry/2018/06/19/221910)
Githubからダウンロードしたリポジトリを、自分の環境で起動させる方法（Ionicの場合）

#Githubからダウンロードしたリポジトリ、エラー出るんやけど？
他人のGithubからダウンロードしたリポジトリ、**普通に`ionic serve`しても起動しないんだよな〜・・・**

<img width="390" alt="スクリーンショット 2020-03-22 17.44.04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/2da9e20d-5772-b3c2-57fb-47a53feb2ee4.jpeg">

ダウンロードしました。
これを自分のPCで起動させようとすると、**エラーがどーん！**

```terminal
$ ionic serve
> ng run app:serve --host=localhost --port=8100
[ng] An unhandled exception occurred: Could not find module "@angular-devkit/build-angular" from "/Users/gen/Desktop/basic/ionic/talktive-master".
[ng] See "/private/var/folders/r2/qclzlqq52y3c3nyffqn3lb500000gn/T/ng-JPHzL8/angular-errors.log" for further details.

[ERROR] ng has unexpectedly closed (exit code 127).
        
        The Ionic CLI will exit. Please check any output above for error details.
```

はい、意味わかりません。

#結論
**`ionic serve`の前に、`npm install`が必要！！**

```terminal
$ npm install
```

これによってそのアプリケーションに必要な依存関係を解消してくれる。

#最後に
初心者あるあるではないだろうか？

また、一応「ionicの場合」としているが、他のフレームワークでも同じような感じかと。。
Windows10Xのエミュレータを起動してみた

Windows 10X のエミュレーターが出たので起動してみました。

- 2020年冬発売
- 2画面のOS
- Arm64である
- Win32アプリはエミュレートしながら動く（←執念を感じる）

# (1) Windows Insider Program に登録

通常のWindowsアップデートでは使えません。[スタート]-[設定]-[更新とセキュリティ] から行います。Insider Program に登録すると、一般公開されていない最新のOSにバージョンアップすることができます。
注！念のため開発用途のPCで試してください。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/02cbb034-e618-3127-577e-fc58ff8c739b.png' width=45%> <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/bafd7e33-7e65-12a4-9993-5117617c012a.png' width=45%>

# (2) ストアからインストール
ストアから「Microsoft Emulator」と「Windows 10X Emulator Image」の2つをインストールします。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/037b73c8-767f-6b11-41f8-50104dbd9d92.png' width=40%> <img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/eb3221a2-c6c5-fa9b-0ee8-c2a1ad75d16c.png' width=37%>

# (3) Hyper-V を有効にして再起動

Hyper-Vとは、簡単に言うとMicrosoft製のVirtualBoxです。Windows Pro以上で、[Windowsの機能の有効化] から追加できます。VirtualBoxよりも速いです。
注！Hyper-Vを有効にするとVirtualBoxやAndroidシミュレーターが使えなくなります。そのときは有効無効を切り替えてください。管理者コマンドで以下を実行してOSを再起動します。

```
bcdedit /set hypervisorlaunchtype auto　←Hyper-V 有効
bcdedit /set hypervisorlaunchtype off　 ←Hyper-V 無効
```

# 起動してみた

Microsoft Emulator から起動します。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/52a36347-9d38-5cf8-d7b2-cb9ac382405c.png' width=30%>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/04c24e51-3ad5-07ed-e828-54ffa364045c.png' width=90%>

発表をみて2画面に興味がありました。ワードやエクセルも結局はコピペ等で2画面で使いますよね。
しっかしなんで 10X という紛らわしい名前にするのか、Arm64は互換性がないとハッキリ言わないのか。MACとiPadのように割り切れないのかな。

# まとめ

Windows10Xを動かしてみました。10年続いている自社ソフトを動かそうとしたのですが、断念しました。期待は薄いです。この先Windowsアプリを配布するビジネスが厳しくなってきました。AWS WorkSpace とか使った方がよさそうかな。
CentOS 6にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS6にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS release 6.10 (Final)

# yum install -y zulu-14 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
ワンクリックで出来る最強の検索方法

# はじめに
分からない単語などを調べる時にどのような検索をしているでしょうか？

何か検索しようとした時、
検索結果の一番上にwikiが来てとりあえず見たらますます分からなくなった...
なんて経験された方も多いかと思います。

私が単語を調べる時に必ず使う検索方法は**「画像検索」**です
### 本記事が示している画像検索とは
<img width="1371" alt="画像検索.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296341/e937e7a6-db21-c8a9-e40c-b6bfd1bc58df.jpeg">
本来画像検索というのは左を差します。

しかし今回は右を画像検索と呼ばせていただきます。（正式名称がわからなかったので）

**ここからは例をご覧ください**
#マルウェアを検索する場合
### まずはwikiを使って検索した例

<img width="1675" alt="マルウェアの例wiki.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296341/ab4c4aa1-4978-a908-2ced-fff4f42b38cc.png">
画面のほぼ全てが文字になってしまいました。
なので少し読んだだけで読むのをやめた方もいると思います。
### 画像検索を行った場合
<img width="1676" alt="マルウェアの例画像検索.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296341/190797e8-9bb3-ce4d-4368-b973a93da8b1.png">
一目でわかりやすくなりましたね！

さらに調べようとしていたマルウェアのことだけでなく「ワーム」「ウイルス」「トロイの木馬」の関係性なども分かってきます。

**ここで画像検索の利点と弱点を説明します**


# <font color='red'>「画像検索」３つの利点</font>
### 1.一目で分かる
これは説明するまでも無いかも知れませんが文章と画像だと分かりやすさは一目瞭然です。

### 2.調べたい単語の周辺情報や関係性などが分かる
周りの情報との関係性が分かることで、全体像も簡単に把握することが出来る<br>
本来調べるつもりでなかったことも同時に理解することが出来る

### 3.画像保存ができる
他の利点も素晴らしいものでしたが、個人的にはこれが<font color='red'>**最も大きな利点**</font>だと感じています。

これらの場面で使えます。<br>
・ **カテゴリー別の画像フォルダを作成して簡単に情報をまとめる。**<br>
・ **周りの人に情報共有する際に画像を用いると説明の労力が激減される**<br>
・ **後で見返した時も簡単に概要を思い出すことが出来る**


# <font color='blue'>「画像検索」2つの欠点</font>。
今までは利点ばかりを述べてきたので欠点も説明します。


### 1.細かい情報は調べられない
画像内では出来るだけ余分な情報は削ぎ落とされてします。

そのため細かな情報を調べたい場合はwikiに軍配が上がると思います。


### 2.単語によっては機能しない
長文、実際に存在する物、あまり有名では無いもの
など検索しても求めている情報が出てこない場合は度々みられます。




# 最後に
画像検索の素晴らしさが伝わったでしょうか？
ワンクリックで済むことなので今日から**とりあえず画像検索！**と言う軽い感覚でやってみてください。
ここまで見ていただいてありがとうございます。
**少しでもあなたの役に立てたら幸いです！**
CentOS 7にOpenJDK 14をインストール（Zulu Community）

# はじめに

Zulu Communityを利用してCentOS7にOpenJDK14をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Download OpenJDK Java Linux Windows macOS Alpine Java 11 Java 8](https://www.azul.com/downloads/zulu-community/)

## サポート

本手法で導入した場合、[Zulu Community Java OpenJDK free download TCK tested](https://www.azul.com/products/zulu-community/)より、2020-09がEOLになると思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

## LOG

### レポジトリ登録

```shell-session
# rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
# curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)

# yum install -y zulu-14 which
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment Zulu14.27+1-CA (build 14+36)
OpenJDK 64-Bit Server VM Zulu14.27+1-CA (build 14+36, mixed mode, sharing)
```
Alexa に話しかけてスマホに通知してみる（解決？編）

存在感のなかった Echo Dot を救うべく、IFTTT のサービスを登録した。
そして前回 ITFFF で THIS・THAT を登録までは完了した。

私は意気揚々とあれくさに何度も何度も問いかける。
そしてその度に「わかりません。ごめんなさい」と言われ続けたのだった。

[前回のITFFFの設定・悲しい結果編](https://qiita.com/morio1101/items/57f31fbb29504bae5a90)

ほかの記事を参考にしていると、語尾に「トリガー」もしくは「（を）トリガーして」等を付けると反応するとのこと。
しかし我が家のあれくさはメッセージを変えて何回やっても何回やっても「トリガーは8歳です。」「辞書でトリガーについて・・・（以下略）」など珍回答し答えに行きつくことはなかった。

そして今回、邪道かも知れないが何とか呼び掛けに応じてくれるようになったのでその方法をまとめたいと思う。
（実はほかの解決策があれば教えてほしいです:bow_tone1:）

# 今回の実験機器

Amazon Echo Dot (あれくさ)

# 使うサービス

* ITFFF
* Slack
* Amazon Alexa(スマホアプリ)

# 直面した問題ケース

amazon.com と amazon.co.jp の二つのアカウントが同一メールアドレスで登録されているとうまく動かないケースがあるという記事を見かけた。

なるほど、そんな馬鹿なことがと思いながら試すとしっかり同一アドレスでアカウントを作成しているのであった。

片方のサイトのメールアドレスを変更し、再度トライするも「わかりません。ごめんなさい」あれくさは悲しそうにそうつぶやくだけだった。

# こいつ動くぞ！

あきらめてこだわり酒場のレモンサワー「キリッと男前」を流し込んで気持ちをリセットしようと思いつつも、最後に Alexa アプリを見ていたら「定型アクション」というものがあった。

1. 再度メニュー内の「定型アクション」を押下する
![Screenshot_20200322-162507__01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/73377387-5084-76f9-cb6d-926349ce4ef3.jpeg)
2. 次に「実行条件を設定」を選択する
![Screenshot_20200322-162533__01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/f68890b5-0e02-feb2-5211-462b41c83138.jpeg)
4. 色々出てきたが声に反応してほしいので「開始フレーズを選択」するを選択する
![Screenshot_20200322-165820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/6e971d59-28cc-a9b5-3792-e71a6801d7f5.jpeg)
5. フレーズを設定すると、アクションを追加できるようになるので、IFTTT で作成したアクションを追加する
![Screenshot_20200322-162607__01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/8c00e4fe-4d42-6fe3-79c5-0e8cd5948071.jpeg)
6. あとは実行条件をあれくさに向かって言うだけで、Slack へ通知をしてくれるようになったのであった
![Screenshot_20200322-165216__01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532289/da860d0d-f857-33d2-46c9-75648b1cae40.jpeg)
（※何度か文言を変えているので文章に違いがあります）

# 最後に

【メリット】
ほかの記事のように「ｘｘｘをトリガーして」みたいな語尾がいらなくなったこと
【デメリット】
ITFFF 内で完結せず、設定が色々分散してしまう点

とはいえ動く機能の実装を完了することが出来た。
次回は ITFFF 以外の手段であれくさを動かしたいと思う。