OmniAICreator/Qiita-1.07M huggingface dataset:
Prologix GPIB-USBの基礎動作確認

#Prologix GPIB-USB Converter
古めの計測器を読み取るのにGPIBポートから読み出すことは良くある。
PCと接続するのにGPIB-USB変換,GPIB-Ethernet変換あるいはGPIBと無線LANの変換を用いるといった手段があるが、今回はひょんなことからPrologix社製のGPIB-USB変換を手に入れて遊んだので、基礎動作の確認部分を記しておく。
http://prologix.biz/?sef_rewrite=1

GPIB-USB変換といえばNational InstrumentsのGPIB-USB-HS等があるが、格段に値段が安いので、もしかしたらオススメかもしれない。日本だと、Compass lab社から取り扱いがあるようだ。(もちろんPrologix社から直接購入するという手段もある。納期1週間程度らしい。私の場合は前者からで、納期も値段も当時の場合はお得であった。)

GPIBという規格の基礎についても、是非記事にしたいと思っている。

#必要なもの

重要な点として、Prologix GPIB-USBのUSB部分はUSB type-Bのジャック、受け部分になっているので、通常のPCと繋ぐのであればUSB typeA-TypeBケーブルが必要になる。
これとPCとPrologix GPIB-USBさえあればとりあえずOK。

#pyserialで通信してみる

該当機器に固有なコマンドについては、Prologix社のサイトにマニュアルが落ちているので、それを読めば大体のことがわかると思う。英語が苦手な人はCompass Lab社に和訳がある。

また、USBの認証にドライバーが必要な場合があるかもしれない。FTDI社のドライバー(VCP driverあるいはD2XX driverのどちらか)が必要だろう。
https://www.ftdichip.com/Drivers/VCP.htm
https://www.ftdichip.com/Drivers/D2XX.htm

ここではMac OSを用いた(High Sierra, Mojave)を用いた。ちなみにiMacではドライバーを入れずとも動作した。Macbookでもその可能性があるが、ドライバー無しの状態でテストすることを忘れてVCPドライバーを入れたので、私の方では未確認。

後学のため、Pythonスニペットをここでは提示しておく。Python3.6.3を用いた。pyserialが入っていない場合は適宜```pip install pyserial```等でインストールしておくこと。

USBポートの指定があるので、機器をPCに繋いだ状態で```ls /dev/```等で確認し、適宜変更すること。
(Mac OSの場合)
/dev/cu.usbserial-XXXXX
/dev/tty.usbserial-XXXXX
のような形で存在していると思う。

```python
import serial
try:
    ser = serial.Serial('/dev/cu.usbserial-XXXXX',timeout=1)
    print(ser.name)
    print(ser.is_open)
    print("address")
    ser.write(b"++addr\n")
    t=ser.read(256)
    if len(t)>0:
        print(t)
    print("mode")
    ser.write(b"++mode\n")
    s=ser.read(256)
    if len(s)>0:
        print(s)

    ser.close()
    print(ser.is_open)

except serial.SerialException:
    print("serial exception")
except serial.SerialTimeoutException:
    print("timeout")

```

このGPIB-USB変換は++XXXXという形で++というものを文字列の先頭につけた形のコマンドを受け付ける。例えば今回は"++addr\n"でこの機器のGPIBアドレスを確認している(0-30で初期値は多分5)。送るのはバイナリなのでser.write()関数の引数の先頭にbを付けることを忘れずに。

同様にser.write(b"++mode\n")部分が動作モードの確認をしている。答えは0 or 1で、デバイスモードとコントローラモードにそれぞれ対応している。初期設定であれば1(コントローラモードを示す)が返ってくるはず。

GPIBアドレスやモードを書き換えるには、++addr 10や++mode 0などとすれば良い(コマンドと数字の間の半角スペースを忘れずに)。この場合、書き換えた先の数字は返ってこないので、確認するにはもう一度++addrコマンドや++modeコマンドを送る必要がある。
【Metabaseチュートリアル】Questionにフィルターを設定してみよう

[< 前(Questionを作ってみよう)](https://qiita.com/k_0120/items/2c4e5300ef63c514cb69)
[> 次(ビジュアライゼーションを理解しよう)](https://qiita.com/k_0120/items/71b536a48b5b959fcd2d)

# このチュートリアルで理解できること

- NativeQueryで作成したQuestionに対するフィルターの設定方法について

# フィルターの追加

- NativeQueryでは、下記の記述方式を用いることでSQL内で変数を宣言することができます。
  - 任意の変数名を宣言することができますが、半角英数字以外は受け付けないためご注意ください。
- {{変数名}}と書くことで、変数として扱われます。
- 変数を含む条件を[[]]で囲むことで、変数の入力を任意にすることができます。


```SQL 
SELECT 
  * 
FROM
  products 
WHERE 
  category = {{categoryName}} 
  [[AND vendor = {{vendorName}}]] 
```  


- 変数を宣言すると右側に変数の設定パネルが表示されます。
- フィルターラベル
  - 任意の名称をフィルターにつけることができます。
- 値タイプ
  - テキスト：フィルターに入力された値を、文字列型のデータとして受け取ります。
  - 数値：フィルターに入力された値を、数値型のデータとして受け取ります。
  - 日付：フィルターに入力された値を、日付型のデータとして受け取ります。また、フィルター選択時にカレンダーが表示されます。
  - フィールドフィルター：選択したカラムの中身をフィルターの選択肢にすることができます。

### 実践

1. categoryName変数のフィルターラベルを`category_name`、値タイプをテキストに設定してみましょう。
1. vendorName変数のフィルターラベルを`vendor_name`、値タイプをテキストに設定してみましょう。
1. `category_name`フィルターに`Gizmo`と入力し実行して、抽出結果が絞られることを確認してみましょう。
1. `category_name`の中身を消去し、`vendor_name`フィルターに`Connelly-Ritchie`と入力して実行するとエラーが表示されることを確認しましょう。
1. `category_name`フィルターに`Gizmo`、`vendor_name`フィルターに`Connelly-Ritchie`と入力し実行して、抽出結果が絞られることを確認してみましょう。


### 確認

- 実践を全て完了した時点で、下記画像と同じ状態であれば正解です。
- 上書き形式でQuestionを保存しましょう。

![Question5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/8d3f9582-2f4b-f5ee-eadb-632450d98546.png)
モノレポとCI

この記事は[2019新卒 エンジニア Advent Calendar 2019](https://qiita.com/advent-calendar/2019/2019-graduates)の16日目の記事です。


携帯で執筆したため後ほど推敲します．おそらく...

# モノレポとは
複数のサービスのコードを一つのリポジトリで管理する手法
[ここに参考文献を貼ります]
*bazel buck pants 等

## モノレポの利点
* devOpsサイクルの効率化...CIの段階でライブラリ間の齟齬を検出できます．
[ここに図を載せます]
* CIの共有...同じCIパイプラインを共有できます（もちろんジョブは並列に実行されます）
* ひとつのサービスの開発にいくつもプルリクを出す必要がない

## 欠点
* semantic versioningが意味をなさない．（正確には単一バージョン管理ができるというメリットなのですが，様々な理由により...[後ほど]）

# モノレポのCIジョブ
* pantsbuildには差分検出機能があるので[リンク]これを活用
* あとは普通にpantsのテスト等のコマンドをJenkinsなりcircleCIで実行するだけ．
* 新しいテストを追加する場合もパイプラインを共有しているのでそれを書き換えるだけで良い．
* 


# モノレポのCD
* 後ほど
unityできれいな鏡面を作りたい！！

##はじめに
MirrorRefrectionの使い方とpost processを使った応用のまとめです

unityを使い始めて1年もたってない高校生なので適当なところが多いですがあたたかい目で見てもらうとうれしいです


#MirrorRefrection

![Unity 2018.4.13f1 Personal - SampleScene.unity - 新世界創造 - PC, Mac & Linux Standalone_ _DX11_ 2019_12_27 13_51_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557872/d559de35-6e7a-72ae-3506-d4732a85cf58.png)


こんな画面を作ってみます

##使い方

http://wiki.unity3d.com/index.php/MirrorReflection4

上の記事からシェーダーとスクリプトをコピペしてマテリアルにシェーダーを割り当てて鏡にしたいオブジェクトにマテリアルとスクリプトをくっつける

これで鏡はできました

##Bloomがついてない！

鏡はできましたがpost processの効果がついてません

スクリプトをのぞいてみるとどうやらカメラを出してそのカメラに映ったものを表示させて鏡にしてるみたいです

じゃあ、post process layerをこのカメラにつければいいのかな？

##やってみる
MirrorReflectionスクリプトの160行目くらいにカメラ関係のコードを発見しました
ここでaddcomponentすればいいのかな？
FlareLayerをaddしてる行の下に

reflectionCamera.gameObject.AddComponent<PostProcessLayer>();

を入れてみました
エラー出てる…と思ったら忘れてました
using UnityEngine.Rendering.PostProcessing;
を上の方に書きます

これでlayerをカメラにくっつけることはできたみたいです

ですがただくっつけただけなのでpost process layerのレイヤーマスクがnothingになっていてブルームなどの効果がついていません
![Unity 2018.4.13f1 Personal - SampleScene.unity - 新世界創造 - PC, Mac & Linux Standalone_ _DX11_ 2019_12_27 14_34_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557872/d238d13b-3bd5-16ae-ff70-49782a5326c2.png)

そこで
reflectionCamera.gameObject.GetComponent<PostProcessLayer>().volumeLayer = 1;
を書き足しました、
これで鏡の方にもBloomの効果をつけることに成功しました


これは余談ですが、post process volumeでMotion Blur効果をつけるとなぜか鏡の方にずっとモーションブラーの効果が出ます、原因は僕にはわかりません()
![Unity 2018.4.13f1 Personal - SampleScene.unity - 新世界創造 - PC, Mac & Linux Standalone_ _DX11_ 2019_12_27 14_40_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557872/427cb5e5-c23b-93bc-7092-b97d10933090.png)
【Metabaseチュートリアル】Questionを作ってみよう

[< 前(Collectionを作ってみよう)](https://qiita.com/k_0120/items/4606f56854aebd4e0348)
[次 >(Questionにフィルターを設定してみよう)](https://qiita.com/k_0120/items/07bdb859773eb77ad1a7)

# このチュートリアルで理解できること

- NativeQueryで作るQuestionの仕様と作り方について

# NativeQueryページへ移動

- 本チュートリアルでは、直接SQLを実行する`NativeQuery`でQuestionを作成していきます。
- 下記画像の赤枠をクリッックして、`NativeQuery`ページへ移動しましょう。

![Question1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/5e58fcac-06f0-2a3a-ec83-5fb4925a49bc.jpeg)


# NativeQueryでのQuestion作成手順

- データベースから`SampleDataset`を選択してください。
  - `SampleDataset`は、Metabaseのインスタンスを作成した際に自動で生成されるサンプルデータベースです。
  - 注文データを管理する`Orders`、購入者データを管理する`People`、商品データを管理する`Products`、クチコミデータを管理する`Reviews`の4テーブルから構成されています。
- 今回は、商品データの中身を見てみましょう。下記SQLを入力してください。


```SQL 
SELECT 
  * 
FROM
  products
``` 

- 実行ボタンをクリックしてください。下記と同じ結果が表示されればOKです。

![Question2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/45b04bf3-cfde-7f39-05dd-6fca04955fa9.png)


- 下記画像の赤枠をクリックして、実行結果をQuestionとして保存してみましょう。
  - 名前：Products List
  - 保存場所：前回作成したパーソナルCollectionの中の`SampleCollection1`


![Question2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/a198df45-0775-40bd-8c93-e6bbeec2be61.png)
[Js]日付と時間の取得方法

アウトプットとして記載していきますので間違っていましたらご指摘お願い致します。
では本題に入っていきます。

##Dateオブジェクト
Dateオブジェクトとは....?
Dateオブジェクトは組み込み関数と言われていて主に日付や時間を取り扱うことができます。
では初めていきましょう！！！！

###現在を取得する書き方

```js

let now = new Date(); //new Dateで現在の時間を出力される
console.log(now);

//出力結果
//Fri Dec 27 2019 11:39:47 GMT+0900 (日本標準時)


```
と出力される


###月を取得する書き方

```js

let now = new Date();
console.log(now);

//出力結果
//Fri Dec 27 2019 11:39:47 GMT+0900 (日本標準時)

let months = now.getMonth();
console.log(months);

//出力結果
//11
```

お気づきでしょうか？？
現在を取得してnew Date();で出力したのがDec（１２月）となっているのに出力結果が１１となりました。
ここで注意して欲しいのが、now.getMonth();は返り値が０からのカウントになっているため少しズレが生じているのである。つまり、０が1月からカウントされているためそのまま数えていくと１２月が11月表示になる。なので、インクリメントが必要になる。書き方としては、、、、、、、、、？？？？
＊インクリメントとは、変数の値を1増やす演算のことである。 逆に、1減らす演算はデクリメント (decrement) である。


```js

let months = now.getMonth()+1;
console.log(months);

//出力結果
//12
```
となる。
now.getMonth()の値にnow.getMonth()+1;とすることで12表記になります。

###日にちを取得する書き方
```js
let now = new Date();
console.log(now);

//出力結果
//Fri Dec 27 2019 11:39:47 GMT+0900 (日本標準時)

let date = now.getDate();
console.log(date);

//出力結果
//27
```
となる。
これの場合は返り値が１から始まっているので、逆にインクリメントは必要ない！！！！！

###曜日の取得の書き方
```js
//今
let  now = new Date();

//日にち
let date=now.getDate();

//月
let month =now.getMonth()+1;

//年
let year = now.getFullYear();


let week =["日","月","火","水","木","金","土"]
let day =week[now.getDay()];


let present = year + "年" + month +"月"+ date2 + "日" + day;
console.log(present);

//出力結果
//2019年12月27日金
```
となる。



###時刻を取得の書き方

```js
let now = new Date();

let hours = now.getHours();

let minutes = now.getMinutes();

let seconds = now.getSeconds();

let time = hours + '時' + minutes + '分' + seconds + '秒';

console.log(time);


//出力結果
//13時50分1秒
```
となる。

###ついでに
下記の違いは何が違うのかわかりますでしょうか？？？



```js
let day-one = new Date();
let day-two = Date.now();


console.log(day-one);
//出力結果
//Fri Dec 27 2019 11:39:47 GMT+0900 (日本標準時)


console.log(day-two);
//出力結果
//1577425009654
```
となる。
両者の違いとしては、ミリ秒で出力されているかどうかの違いだ。
どれも同じ時間表示されている。
しかし、用途によっては使い分けが必要なので覚えておいて損はないでしょう！！！！！
以上です！！！！





もし、何か間違っていることやまだもっといい書き方やこんなのもあるよがあったら教えていただけると幸いです！！！！
NLTKを使って高頻度単語を抽出してみる（python）

NLTK（Natural Language Toolkit）の公式ドキュメントを読みながら、文書の中でよく使われている単語を抽出してみました。とりあえず、サンプルデータから頻出度の高いキーワードを上から3つ順番に表示するところまでやってみましたので、メモがてらに残しておきます。

## 開発環境
* Python
* NLTK

## NLTKのインストール
他のライブラリをしてくのとお馴染みで、まずはpip installします。

```terminal
$ pip install nltk
```

## 高頻度単語を抽出していく

大まかな流れとしては、まず 1) 分かち書きと、品詞を取得する機能をそれぞれダウンロードしたあとに、2) サンプルテキストを読み込んで、読み込んだテキストを分かち書きに変換し、3) 品詞を取得した後に、名詞の単語だけに絞り、最後に、4) 最も使われている上位の単語を3つだけ表示します。

### 必要な機能のダウンロード

```python:nltk_test.py
import nltk

nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
```

nltkをインポートした後に、分かち書きと、品詞分けをしてくれる機能を公式からダウンロードします。一度環境でダウウンロードすれば、それ以降はダウンロードの必要がありません。ダウンロードしようとすると、` Package punkt is already up-to-date!`ってな具合でアラートが出ます。

### サンプルテキストを取得して、分かち書きへ変換

```python:nltk_test.py
raw = open('sample.txt').read()
tokens = nltk.word_tokenize(raw)
text = nltk.Text(tokens)

tokens_l = [w.lower() for w in tokens]
```

事前に英語のエッセイ、長文を用意します。（sample.txt）これを読み込んだ後に、`word_tokenize()`で分かち書きに変換します。その後に、一応小文字、大文字の違いがある場合は同じと認識させる為に、全部小文字にして同じものは同一と認識するようにしています。

### 品詞を取得した後に名詞のみを抽出

```python:nltk_test.py
only_nn = [x for (x,y) in pos if y in ('NN')]

freq = nltk.FreqDist(only_nn)
```

NN（名詞）に該当する品詞のみを抽出して、頻度分布を計算shてくれる`FreDist`を使って、頻出回数を数えていきます。

### 上位3つを表示
```python:nltk_test.py
print(freq.most_common(3))
```

Pythonの出現回数をカウントして、多い方から表示する関数`most_common()`を使って表示完了です。
AWS Cloud9でLaravel開発環境にphpMyAdminをインストールする

# phpMyAdminをインストールするための備忘録

## 前提条件
・PHP7.1～にアップデート済み
・Laravelインストール済み
・Laravelプロジェクト作成済み

## デフォルトのMySQL5.5を削除

```
sudo service mysqld stop
sudo yum -y erase mysql-config mysql55-server mysql55-libs mysql55
```

## MySQL5.7をインストール

```
sudo yum -y install mysql57-server mysql57
sudo service mysqld start
```

## 最新版のphpMyAdminをダウンロードして解凍
2019/12/27現在、最新版は5.0みたい。

```
cd [プロジェクトフォルダ]/public/
sudo wget https://files.phpmyadmin.net/phpMyAdmin/5.0.0/phpMyAdmin-5.0.0-all-languages.zip
sudo unzip phpMyAdmin-5.0.0-all-languages.zip
rm phpMyAdmin-5.0.0-all-languages.zip
ln -s phpMyAdmin-5.0.0-all-languages phpMyAdmin
```

## MySQLにログインしてROOTユーザーのパスワードを設定

```
mysql -u root -p
update mysql.user set authentication_string=password("[パスワード]") where user='root';
flush privileges;
exit;
```

## MySQLを再起動

```
sudo service mysqld restart
```

## Laravelプロジェクトを実行

```
cd [プロジェクトフォルダ]
php artisan serve --port=8080
```

## phpMyAdminにアクセス

```
[Previewで表示されるURL]/phpMyAdmin/index.php
```
Solrで類似検索 (MoreLikeThis)と特徴語抽出を行う

# 類似検索の仕組み
`Apache Solr` に蓄えた記事データを使って、ある記事と類似する記事を探すことができる。
仕組みとしてはまず対象とする記事の **特徴語** を抽出し、その特徴語とのマッチ度が高い記事を探している模様。

特徴語とは、その記事に含まれていて、かつ他の記事にはあまり含まれていないワードのこと。
例えば、「**横須賀市**」「**マイクロソフト**」「**ドラえもん**」などの固有名詞は条件を満たしやすく、逆に「**て**」「**に**」「**を**」「**は**」などの副詞や「**私**」「**車**」などの汎用的な名詞などは条件を満たしにくいということになる。

# Solrでの検索例

```
/select?q=id:1&mlt=true&mlt.fl=mlt.mindf=1&mlt.mintf=1
```

| パラメーター名 | 値 |
| --- | --- |
| mlt | true とすることで有効化する |
| mlt.fl | どの項目を元に類似検索をするか、項目名をカンマ区切りで指定する |
| mlt.mintf | Minimum Term Frequency。 元となる記事での出現頻度が指定数以下のワードは無視される |
| mlt.mindf | Minimum Document Frequency。 複数記事上での出現頻度が指定数以下のワードは無視される |

`q` や `fq` パラメーターでヒットした各記事に対して類似記事を表示してくれる。

```json
{
  "responseHeader":{
    "status":0,
    "QTime":33,
    "params":{
      "q":"id:335676",
      "mlt":"true",
      "mlt.fl":"title_txt_ja",
      "mlt.mindf":"1",
      "mlt.mintf":"1",
      "_":"1577422689083"}},
  "response":{"numFound":1,"start":0,"maxScore":13.465984,"docs":[
      {
        "id":"335676",
        "title_txt_ja":"○○市で○○事件が発生",
        "score":13.465984}]
  },
  "moreLikeThis":{
    "product_details-335676":{"numFound":156617,"start":0,"maxScore":19.945429,"docs":[
        {
          "id":"335219",
          "title_txt_ja":"○○事件の犯人を逮捕",
          "score":12.291839},
        {
          "id":"335218",
          "title_txt_ja":"○○事件の続報",
          "score":12.291838}]}
   }
}
```

# 特徴語も抽出したい

**mltハンドラー** にアクセスすれば特徴語も抽出できる模様。

solrconfig.xml に mltハンドラーが定義されていなければ定義しておく。

```xml
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
</requestHandler>
```

```
/mlt?q=id:1&mlt=true&mlt.fl=mlt.mindf=1&mlt.mintf=1&mlt.interestingTerms=list
```

| パラメーター名 | 値 |
| --- | --- |
| mlt.interestingTerms | none: 特徴語を出力しない<br>list: 出力する<br>details: フィールド名やboost値なども出力する |

結果

```json
"interestingTerms":[
    "ビーフカレー",
    "熟成"]
```

# Solrに未登録の記事を元に類似検索したい場合は…？
やり方が見つからず今の所、記事をSolrに追加してから検索し、終わったら消すという風にしている。何か方法があれば…。
Windowsでクリップボードの画像をファイルにするにはPowerShellコマンド1行で済む

# TL;DR

PowerShellを開いて次のコマンドを打ってください。(`image.png`の部分は変更すること)

```powershell
(Get-Clipboard -Format Image).Save("image.png")
```

# 補足

- PowerShellコンソールをエクスプローラーから開くには何もないところでShiftを押しながら右クリックです。
- PNG以外の拡張子にも対応しているようです。ファイル名から自動判別されます。
- PowerShell (Core) 6以降は非対応です。
- Windows 10のエクスプローラーはいつからかクリップボードの貼り付けに対応しているようです。
samba備忘録


CentOS-7-x86_64-DVD-1511

# 再起動後も起動
systemctl enable smb nmb

# selinuxとfirewall-cmdがブロックする

/etc/selinux/config

```/etc/selinux/config
SELINUX=permissive
```

firewall-cmd --permanent --add-service=samba
firewall-cmd --reload

```/etc/samba/smb.conf
[global]
        map to guest = bad user //必須
[名前]
        path = /home/samba/public
        writable = yes
        guest only = yes
```
\\{ipaddr}\{名前}でwindowsに公開される。
pathのフォルダ名は関係ない

pathまでの親フォルダの実行権限もないと見れない
VeeValidate を使って、vue.jsで簡単にバリデート

#VeeValidate


フォームでのバリデーションで便利な`VeeValidate`というライブラリを使用。
yarnを使って`VeeValidate`を導入

```
yarn add vee-validate
```

## バリデートルールの指定

基本的に、inputタグの中に色々書き込むだけです。
**`v-validate`**の中にバリデートのルールを書き込みます。

| ルール | 意味 |
|:--|:--|
| required | 必須 |
| max | 最大文字数 |
| numeric | 半角数値のみ |
| email | メールアドレス形式 |

`v-validate = "required"`と書き込むだけで、必須項目としてルールを追加できます。複数の条件を指定したい場合は`|`で区切ればOK！


## 参考

(VeeValidateはVue.js用の超便利なバリデーション)[https://www.kabanoki.net/4955/]
フロントエンドエンジニアの自分が2019年勉強したUdemyの教材

## 概要
本文はフリーランスのフロントエンドエンジニア3年目の自分が今年買ったudemyの教材です。
vue中心にjavascript関係の知識を身に付けつつ、バックエンド系の言語pythonに手を出してみたというのが、今年やってみたことです。
似たような経歴の方のスキルアップに繋がればいいなと思い共有させていただきます。

## 教材
### js素養系
#### 【世界で2万人が受講】JavaScriptエンジニアのためのES6完全ガイド
https://www.udemy.com/share/101WLmBUAac19SQX4=/
##### 感想
どんなフレークワークを扱うにしても素養として必要だと思い購入。演習も充実していてわかりやすかった

#### モジュールバンドラー webpack を1日で習得！フルスクラッチでインストールからカスタマイズまでの手順を理解する
https://www.udemy.com/share/101YocBUAac19SQX4=/
##### 感想
こちらも素養を身に付けたくて購入。いかにもyoutuberっぽい最後のジングルは好みが別れるところではあると思うけれど、いちいち動画内でgitでremote pushまでやってくれるので、自習の成果として人に見せやすいのはありがたい

#### Node.js 入門 ー演習しながら学ぶ基本クラスの使い方ー 
https://www.udemy.com/share/101X9UBUAac19SQX4=/
##### 感想
vueを使用する際にぼやっとしていたところを理解したくて購入、reactを触る際にも応用がききそうな知識を身に付けられたのはよかった

### vue系
#### 超Vue JS 2 入門 完全パック - もう他の教材は買わなくてOK！ (Vue Router, Vuex含む)
https://www.udemy.com/share/101rYoBUAac19SQX4=/
##### 感想
vue関係の教材なら一番網羅的でわかりやすい教材、vueを勉強したい方で、早口でフランクな口調が気にならないなら、ぜひ受けていただきたい講座

#### Vue.js + Firebaseで作るシングルページアプリケーション
https://www.udemy.com/share/1021GSBUAac19SQX4=/
##### 感想
vueの周辺技術のfirebaseやvuetifyを学べたのがよかったです

### python系
#### 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
https://www.udemy.com/share/1013hkBUAac19SQX4=/
##### 感想
バックエンド系の知識も欲しいなと思い購入。原則はすごいわかりやすかったですが、動画の作成者がWebStormという期間限定無料エディタを推奨しているのでじっくりと時間かけて同じ環境でやってみたい人には向かないかもしれません

#### 【3日でできる】Django 入門 ( Python 3 でウェブアプリを作って AWS EC2 で公開！）
https://www.udemy.com/share/101X2QBUAac19SQX4=/
##### 感想
せっかく学んだpythonの知識を活かしつつフレームワークの知識も欲しいなと思い購入。多くの人が3日ではできないだろうなとは思いつつ、初心者にもわかりやすい講座だった。ただ、EC2について十分な説明はないので別途学んだ方が良さそう

## まとめと来年の方針
今年はvueを中心に勉強してみましたが、来年はreactをもっと勉強してみたいなと思ってます。
また、隙あらば、nodeを使ったバックエンド関係の仕事をできたらと思ってますので、仕事ご一緒する機会ありましたらどうぞよろしくお願いいたします。
Stateを操作する

# Stateを操作できるようにするメソッド
## initState
stateの初期状態を決めるメソッド

```example.dart
void initState(){
    super.initState();
    初期化処理;
  }
```

## setState
ステータスを操作するメソッド。

```example.dart
void _setMessage(){
    setState(() {
      stateの変更処理;
    });
```

## フローティングアクションボタンを作る
上記のメソッドを使って、ボタンを作ってみる。

```main.dart
class _MyHomePageState extends State<MyHomePage> {
  String _message;

  @override
  void initState(){
    super.initState();
    _message = 'Hello!';
  }
  void _setMessage(){
    setState(() {
      _message = 'You Taped!';
    });
  }

  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        ),

      body: Text(
        _message,
        style: TextStyle(fontSize:32.0),
      ),

      floatingActionButton: FloatingActionButton(
        onPressed: _setMessage, /*押された時にsetStateを含んだメソッドが実行*/
        tooltip: 'set message', /*ボタンを長押しした時の説明を出せる*/
        child: Icon(Icons.star),
        ),
    );
  }
```
メンバ変数への代入の省略表記について in flutter

# Stateクラスにスーパークラスの値を持ってくる

```main.dart
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  final title = 'Flutter Sample App';
  final message = 'Sample Message';

  @override
  Widget build(BuildContext context){
    return new MaterialApp(
      title: 'Flutter Demo App',
      home: new MyHomePage(
        title: title,
        message: message
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;
  final String message;
  MyHomePage({this.title, this.message}): super();
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        ),
      body: Text(
        widget.message,
        style: TextStyle(fontSize:32.0),
      ),
    );
  }
}
```

Statelesswidgetで宣言されているtitleとmessageを下記を使ってStateクラスで利用できるようにする。

まず、StatelessWidgetで定数を定義し、MaerialAppとしてインスタンスが生成されるようにしています。

##### super
サブクラスでは、スーパークラスのインスタンスにあるメソッドなどを呼び出すことができます。

##### this
Dartでは、コンストラクタの引数部分に、thisを付けてメンバ変数を書くことで、その変数を初期化することができます。

```main.dart
MyHomePage({this.title, this.message})
```
上記のように書くと、引数からメンバ変数への代入の省略表記をすることもでき、今回は初期化ではなく、こっちの使い方をしています。

下記の２つの書き方でStatefulWidgetにはStatelessWidgetで定義した定数の中身がそのまま渡されるようになっています。

Stateクラスでは、widgetプロパティを用いています。これにはStatefulWidgetのインスタンスが代入されているので、そのインスタンスに含んでいるtitleやmessageのプロパティを利用しています。
IT技術系　新人研修講師　座談会2019 での話（２）

各テーブルで話していた内容をサマリーしてみます。

![P_20191223_195115_vHDR_Auto.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100559/565aec12-07ef-1f68-f2e4-e273540f20b1.jpeg)

こちらのテーブルは、プロジェクト型演習の際、新人が上手に休憩をとれていないという問題を核に話が展開されました。

私としては、休憩のとりかたまで心配しないといけないのか！という驚きをえました。

プロジェクト型演習の際には、新人一人一人にトレーナーがついてくれるそうです。そのトレーナーは、研修中ずっとべったりで関わるのではなく、報告書ベースで間接的に関わるとのことです。
その報告書のやり取りの中に、「休憩を上手にとれてますか？」というトレーナーの気遣いが散見されたそうです。

実際、プロジェクト型演習の最中は、休憩をとっていなかったり、休憩をとっていても離席しないなどの状況だったそうです。

トレーナーサイドとしては、実業務での過ごし方を見据えて、メリハリある仕事のススメ方をプロジェクト型演習の最中に学んで欲しいという意図があったのかもしれません。

テーブルの参加者からは、休憩中、離席しトイレにいったタイミングで良いアイディアが思いついたり、返っている時にひらめいたりするようね。だから適度な休憩って大切だよね、なんて話がでていました。

上手に休憩ととらずに作業をしていると効率が悪くなったり、ミスが多発したりする。研修中そんな失敗から学ぶことも大切だなと再認識をしました。

根を詰めて作業を進めても良くないし、ダラダラ作業してもダメだし、適度に集中して仕事を進められるゾーンを個々人又はチームで探れるような仕組み（追い込み）作りが必要そうです。

私の関わっている新人研修でもプロジェクト型演習を実施しています。その中で休憩は各チーム自由にしており、いままで休憩関連を問題にしたことはないです。

チームとしての生産性を上げるためにチームでどう取り組むかを日々振り返ってもらっていたことが影響しているのかもしれません。

また、プロジェクト型演習では、チーム間での競争（順位づけ）があり、それも影響していたのかもしれません。

作った機能数やその機能の難易度、機能(お客様からいただける金額)と工数から利益率、非機能面、チームビルディング　などの観点から点数付けし、最終的に順位が決まります。ゲーミフィケーション的な要素を取り入れています。

他社さんの話を聞くと、最近は競争意識を煽るのはよくないとのことで、そういった要素を研修においても排除しているそうです。そういえば、最近関わっているお客様も、演習進捗の見えるかに関して、出来ていない人はネガティブに捉えませんかと心配していました。良し悪しですね。

その他、テレワークの話も少しでていました。

とこんなところで３０分は終了です。
RDS for MySQL8.0のパラメタ設定(ログ, sql_mode, utf8mb4など)

# 参考

- [Amazon RDS DB インスタンスに使用する MySQL のパラメータの例外](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html#MySQL.Concepts.ParameterNotes)
- [【参考】MySQL 8.0は何が優れていて、どこに注意すべきか。データベース専門家が新機能を徹底解説](https://employment.en-japan.com/engineerhub/entry/2018/09/18/110000)
- [MySQLをインストールしたら、必ず確認すべき10の設定](https://yakst.com/ja/posts/200)

# 概要

アプリケーションで利用しているMySQLを5.7から8.0(厳密には8.0.16)に移行しました。その時のパラメタの控えや参考にした情報など。

# 移行時の留意点

移行で最も手間がかかる(=アプリケーションの改修が必要)のは「クエリキャッシュ機能の廃止」(実際、`query_cache_size`パラメタもなくなっていました)のようですが、当方のアプリケーションではもともと使ってなかったので問題なしと判断しました。

# 移行後に発生したエラー

トップページを表示したらいきなりSQL実行エラーが出て焦りました。

エラーメッセージが`group by`句近辺と記載されていたので、`sql_mode=TRADITIONAL`の意味が変わった？`select`句で集計関数使ってないカラムでもあったかな？と思いましたが違いました。

`MySQL8.0`の問題というよりアプリ側の不具合。

なんと`group by`句 で `desc` を記載しているクエリがあってエラーになってました。(たぶん`order by`句をコピーして消すの忘れて、動作上も問題なかったので見落とした模様。というか5．7では`group by`に`desc`を書いても正常実行できてたんですね・・・。汗)

ちなみに`RDS for MySQL`では既存インスタンスのメジャーバージョンアップも実行可能となっています。開発途上のアプリで使っているデータベースで壊れてもいいので、怖いものみたさで実行してみましたが、「パラメタグループがデフォルトでないので駄目！」と怒られて実行できませんでした。(8.0のパラメタを指定すればできたかも？) 。

# パラメタ設定

## ログ(一般)

| パラメタ | 設定値 | 意味 |
|:--|:--|:--|
| general_log | 1 | 汎用ログの出力(RDSインスタンス作成時も指定できるが念の為) |
| log_output | FILE | RDSのディスク消費を抑えるためにTABLE → FILEに |

出力先(`general_log_file`)はRDSでは変更不可で以下の値になっていました。

![](https://i.gyazo.com/1385c1522ab8d6c52dda3a46a143be8e.png)

## ログ(スロークエリー)

| パラメタ | 設定値 | 意味 |
|:--|:--|:--|
| slow_query_log | 1 | スロークエリーログ出力を有効(これもRDSインスタンス作成時に指定可能  |
| [log_queries_not_using_indexes](https://dev.mysql.com/doc/refman/5.6/ja/slow-query-log.html) | 0 | スロークエリーでログが肥大化するのを防ぐために、インデックスを使用しない(だけの)クエリーを含め「ない」 |
| long_query_time | 0.1 | スロークエリーとして扱う時間を10秒から0.1秒に。 |

## utf8mb4用の設定

| パラメタ | 設定値 | 意味 |
|:--|:--|:--|
| character_set_client | utf8mb4 |  |
| character_set_connection | utf8mb4 |  |
| character_set_database | utf8mb4 |  |
| character_set_results | utf8mb4 |  |
| character_set_server | utf8mb4 |  |
| skip-character-set-client-handshake | 1 | クライアントライブラリからの文字セット指定を無視(意図せぬ文字化け回避)  |
| [init_connect](https://dev.mysql.com/doc/refman/5.6/ja/server-system-variables.html#sysvar_init_connect) | set names utf8mb4; | 接続開始時にクライアントに文字セットを強制 |
| innodb_file_per_table | 1 | |

なお、5.7まで指定していた以下の設定は8.0ではなくなっていました。

| パラメタ名 | 5.7での設定 | 8.0 |
|:--|:--|:--|
| innodb_large_prefix  | 1(ONの意味) | ON固定  |
| innodb_file_format  | barracuda  | Barracuda固定  |

## 重要だけど変更しないもの

以下は重要かつRDSでも変更可能なパラメタですが、特に問題ない(というかAWS側で最適に調整)のでそのまま。

| パラメタ | 設定値(既定値) | 意味 |
|:--|:--|:--|
| innodb_buffer_pool_size | {DBInstanceClassMemory*3/4} | データとインデックスがキャッシュされる領域。大きいほど良いが、せっていできる値はもちろん利用できるメモリに依存する。 |
| innodb_log_file_size | 134217728 | REDOログサイズ |
| max_connections | {DBInstanceClassMemory/12582880} | コネクション数 |
| innodb_log_buffer_size | 8388608 | コミットされていないトランザクションのためのバッファのサイズ |

## その他

| パラメタ | 設定値 |
|:--|:--|
| max_allowed_packet | 4194304 ★4MB |
| sql_mode | TRADITIONAL |
| time_zone | Asia/Tokyo |

## 参考

RDS管理コンソール上で差分確認した時のスクショ

[![Image from Gyazo](https://i.gyazo.com/049dfbebbaa2069a0ff7602e4bbc04ad.png)](https://gyazo.com/049dfbebbaa2069a0ff7602e4bbc04ad)
WSL に .net core をインストールしてC#/F#/VBの開発環境を作成

# 確認環境
WSL上にインストールされたUbuntu 18.04LTS

# Microsoftキーとフィードの登録
Microsoftキーの登録、製品リポジトリの登録、必要な依存関係のインストールを行います。

```
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
```

# .NET Core SDK のインストール
インストール可能な製品を更新し、.NET Core SDKをインストールします。

```
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-3.1
```

# プロジェクトテンプレートの作成
`dotnet new`コマンドでプロジェクトテンプレートを作成します。
ここでは、VBのコンソールアプリのプロジェクトテンプレートを作成しました。
`lang`オプションを`"C#"`や`"F#"`に変更すると、対象言語を変更できます。


```
dotnet new console -lang "VB" -o my_project
```

# 動作確認

```
cd my_project
dotnet run
```
「Hello World!」と表示されれば成功です。
Micro Hardening に参加してみた

# Overview

最近 Micro Hardening に参加させてもらえる機会がありました。

Micro Hardening についてはこちら。
https://www.sec-k.co.jp/mh


普段、業務中に当たり前にできていることでも、

- 初めて触るサービス
- 限られた時間

という条件下に多いてはなかなか実践できなかったなー...と反省したので、反省点を完結にまとめておきたいと思います。

**※ これから Micro Hardening に参加される予定がある方も考慮して研修内容の解説などは詳しくは書きません。(個人的には参加予定がある方はあまり読まない方がいいかなと思います。まっさらな状態で臨んだ方が学びが多いと思いますので...)**

# 反省点

### 1. ファイルのパーミッションは適切か？

なんでもかんでも `755` でいいわけないですよね。。

### 2. 開いているポートの数は適切か？

サービスを運用する上で必要なポートのみに限定すべきですよね。
不用意に開けられたポートは脆弱性満載でリスクの温床です。

### 3. アカウントのパスワードポリシーは適切か？そもそもパスワード設定されているか？

まあ基本ですが...そのアカウントちゃんと適切なパスワード使ってますか？という。

### 4. ログをしっかり見る

こちらも基本中の基本ですが...
`/var/log` 配下に溜まるログファイルの種類が多いと、なかなかヒットするファイルを見分けるのが難しかったです...。

### 5. サービスが依存しているプロセスを知る

初めて触るサービスだからというのもありますが、サービスに紐づいているプロセスを特定できていませんでした...。知ってないとダメですね。

### 6. サービス / プロセスの死活監視

自分が運用しているサービスには Prometheus なりなんなり使って死活監視やっていると思います。
スクリプトを用意して簡易的にでも監視しておけばよかったなあという反省...。

# まとめ

やはりどれも基本的なことばかりですね...。
ですが基本的なことだとわかっていても、実践できていないこともあるということ。
今一度基本に立ち返り、気を引き締めて業務に取り組みたいものです。
AWS Cloud9 でLaravel6.9の開発環境を構築する

#PHP
###PHP5からPHP7.2にアップデート
AmazonLinuxには、PHP7.3のパッケージにはpecl-xxxが存在せず、PHP7.4はパッケージすら存在しなかったので
PHP7.2をインストールする。


```
sudo yum -y install php72 php72-cli php72-common php72-devel php72-mysqlnd php72-pdo php72-xml php72-gd php72-intl php72-mbstring php72-mcrypt php72-opcache php72-pecl-apcu php72-pecl-imagick php72-pecl-memcached php72-pecl-redis php72-pecl-xdebug
```

###使用するPHPを7.2に設定

```
sudo alternatives --set php /usr/bin/php-7.2
```

#Swapファイル

標準だとLaravelプロジェクト作成時に
>The following exception is caused by a lack of memory or swap, or not having swap configured

とメモリ不足でエラーが出ることがあるので、以下のコマンドでSwapファイルを作成しておく。
### Swapファイルを作成
```
sudo /bin/dd if=/dev/zero of=/swap bs=1M count=1024
sudo chmod 600 /swap
sudo mkswap /swap
sudo swapon /swap
```

#Compser
###Composerをダウンロード

```
curl -sS https://getcomposer.org/installer | php
```

###Composerを/usr/local/binに移動

```
sudo mv composer.phar /usr/local/bin/composer
```

###Composerが動作することを確認

```
composer
```

#Laravel
###Composerを使ってLaravelをインストール

```
composer global require "laravel/installer"
```

###Laravelプロジェクトを作成する

```
composer create-project laravel/laravel [プロジェクト名]
```

###Laravelのバージョン確認

```
php artisan --version
```

###Laravel起動

```
php artisan serve --port=8080 
```

###動作確認
Preview->Preview Running Application
初学者によるプログラミングMemo　#4　　　メソッドの定義（計算式）

# はじめに

今回は備忘録的な感じで、自分でメソッドを定義して使う方法を紹介します
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- メソッドの定義
- 応用する

## メソッドの定義
今回は、"Squared"メソッドと言うものを自分で定義し、それを使って正方形の面積をもとめることとします

メソッドの定義の仕方は下記の様になります

```.rb
def "メソッド名"'(引数)
  "定義の中身や式"
end
```
ここで"(引数)"と言うものが出てきました
引数は簡単に言うと、メソッドなどに渡すことのできる値のことです
あとで少しだけ解説します
詳細に関しては[別解説](https://qiita.com/Ikuy_h/items/b6e7087e41e66b94010e)を用意する予定ですが、今回は先に進めてしまいましょう
習うより慣れろです

上記定義の方法に則って今回のsquaredメソッドを定義するとこうなります

```.rb
def squared(num)
  num ** 2
end
```
またよくわからないのがでてきました
"num ** 2"です
今回は正方形の面積を求めるとあらかじめ言っているので、勘の良い方はこれが二乗している式だとお気づきになるかもしれません
プログラミングの計算式において、" ** "は乗数を表します
なので、もし体積を求めたい場合は" ** 3 "（３乗）とすればいいわけです

(num)と"num ** 2"のnumは同じものをさします
なので(num)が３だった場合は、"num ** 2"は９と言うことになります
また、記述として" num * num "でも同様の結果となります

ちなみにnumは何でも構いません
第三者が見てわかればどんな単語でもOKです
ただし、(num)と"num ** 2"のnumを変更する場合は両方とも同じものに変更しなければならない点は注意してください（引数の特徴）

## 応用する
さて、メソッドの定義はこれでできました
ただし、これだけでは何も動作しません
このメソッドを使うよと言ってあげないと動きません

今回は正方形の面積なので、一辺の長さを入力すれば「一辺の長さが"hoge"cmの正方形の面積は"huga"㎠です」と出力される様プログラミングしてみます

一辺の長さは英語で"
Length of one side"の様ですが、長いので"side_length"とでもしておきましょう

先に答えを書いてしまいます

```.rb
def squared(num)
  num ** 2
end
 
puts "一辺の長さを入力してください"

side_length = gets.to_i
puts "１辺の長さが#{side_length}cmの正方形の面積は#{squared(side_length)}㎠です"
```
処理の流れを順番にみていきます
まず、メソッドの定義部分"def~end"は呼び出されるまで無視します
そしてputsメソッド（terminal上に文字列を表示させる）を使って、「一辺の長さを入力してください」と表示させます

次に、一辺の長さ（side_length）を定義（変数）します
今回は固定値ではなく、自分で入力した値としますので、"gets"メソッドを使います
getsメソッドを使うと、terminalに何か文字を入力することができる様になります
その後ろの"to_i"メソッドですが、入力された数値文字列を整数（１０進数）に変換するメソッドです
プログラム上では、入力した値は「文字列」として認識されます
「文字列」のままだと「四則演算（計算）」ができません
「四則演算」をするのであれば、「数値」に変換しないといけません
そこで登場するのが"to_i"メソッドです

最後に計算結果を表示します
"#{side_length}"は文字列の中で、変数を展開（表示）する際に使う書き方で、"#{変数名}"で使うことができます
今回の場合は、入力した数値が表示されます
"#{squared(side_length)}"の部分でようやくsquaredメソッドを呼び出しています
"squared(side_length)"の様に、"メソッド名（引数）"とすることで、定義したメソッドを呼び出すことができます
"(side_length)"の中には先ほど入力した数字が入り、これを元に"squared(num)"が呼び出されます
"（）"の中身の表示が違うのになぜ呼び出されるのか
これが引数の特徴です
"(num)"の部分は仮引数と呼ばれ、そのメソッド内で定義された**同じ変数の中に代入して使用**されます
一方で"(side_length)"の部分は実引数と呼ばれ、仮引数と同じ名前である必要はありませんが、メソッド呼び出しの際は"(num)＝(side_length)"として認識され処理が行われます
混同してはいけないのは、あくまでメソッド自体は"squared"で定義していますので、メソッドの呼び出しはこの部分で行っていると言うことです

下に実画面を貼っておきますので、こうなれば成功です
<img width="1074" alt="スクリーンショット 2019-12-27 12.54.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522204/57ea0381-03c4-9113-ef3f-1393ba36e783.png">

# まとめ
少し長くなってしまったのでまとめます

- メソッドの定義は"def~end"で囲う
- 定義側のメソッド名の横の引数は仮引数という
- 呼び出し側のメソッド名の横の引数は実引数という
- 実引数と仮引数の名前は同じである必要がない
- putsメソッドはterminalに文字列を表示できる
- getsメソッドはterminalに文字列を入力することができる
- .to_iメソッドは、数値文字列を整数（１０進数）に変換する
- 文字列内で変数を展開する場合は"#{変数名}"で表示できる

##### 参考記事
https://ref.xaio.jp/ruby/classes/string/to_i
Apollo ClientのキャッシュでInterfaceやUnionを利用する (WARNING: heuristic fragment matching going on!)


Apollo Clientのキャッシュ機能は便利で特に設定をせずにそのまま使えてたのですが、UnionやInterfaceを利用する際に工夫が必要だったのでご紹介します。



## 問題

Apollo ClientでUnionやInterfaceを含んだクエリを扱うと以下のようなWarningが出ました。



![Image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52622/ac933ace-9170-6f17-7128-b460925d1113.png)




これはFragment MatcherというApollo Clientのキャッシュ機構に使われているもので、デフォルトのものだとInterfaceやUnionには対応できないため警告がでています。

これを解決するためにはサーバーで定義されたスキーマに対応したFragment Matcherを用意する必要があります。





## 解決策



Fragment Matcherの設定を行うにはまず、GraphQL Code Generatorというツールを使います。

` @graphql-codegen/cli` と `@graphql-codegen/fragment-matcher` のインストールが必要です。



```bash
 yarn add -D @graphql-codegen/cli @graphql-codegen/fragment-matcher
```



次にGraphQL Code Generatorの設定ファイルを用意します。



```yml

# codegen.yml
schema: [YOUR_API]
overwrite: true
generates:
  ./fragmentTypes.json:
    plugins:
      - fragment-matcher
```



このような設定になります。`schema` オプションにGraphQLサーバーのエンドポイント、またはスキーマ情報が書かれたjsonファイルなどが入ると思います。



設定が完了したら、以下コマンドを実行してください。



```bash
$ yarn run gql-gen
#or
$ npm run gql-gen
```



実行後、fragmentTypes.jsonというファイルが生成されます。

これはGraphQLのスキーマ情報であるIntrospection Resultを自動で出力されたものです。



例えば

```graphql
union Animal
    = Dog | Cat | Bear
```

のようなスキーマが定義されていたとすると、fragmentTypes.jsonは以下のようなものが出力されるはずです。

```json
{
  "__schema": {
    "types": [
      {
        "kind": "UNION",
        "name": "Animal",
        "possibleTypes": [
          {
            "name": "Dog"
          },
          {
            "name": "Cat"
          },
          {
            "name": "Bear"
          }
        ]
      }
    ]
  }
}
```



あとはこの生成されたfragmentTypes.jsonをApollo Clientインスタンス作成時に読み込むことでWarningを解消することができます。



```js
import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'
import { ApolloClient } from 'apollo-client'
import introspectionQueryResultData from '../fragmentTypes.json'

// IntrospectionFragmentMatcher
const fragmentMatcher = new IntrospectionFragmentMatcher({
  introspectionQueryResultData
})
// InMemoryCache
const cache = new InMemoryCache({ fragmentMatcher })

const apolloClient = new ApolloClient({
  cache,
  ...省略
})
```



## 最後に



今回はGraphQL Code Generatorを利用してIntrospection Resultを出力しましたが、手動でスクリプトを書いてサーバーからのレスポンスで出力する方法もありますので、ドキュメントを参考にしてみてください。



ドキュメント: [Using fragments](https://www.apollographql.com/docs/react/data/fragments/)
エラー録【latex error this file needs format platex2e' but this is latex2e'】


# 起きたこと
卒論をかくために、macローカルでtex編集環境を整えようとした話です。

[macでのlatexmkを使ったTeX環境構築](http://teru0rc4.hatenablog.com/entry/2017/01/28/213102)

この辺を確認しながら、作業を進めていきました。
すると、最後のコンパイル時に以下のエラーが現れました。

```
latex error this file needs format platex2e' but this is latex2e'
```

さて、問題はlatexmkrcにおいてplatexを指定していること
大事なのでもう一度言います。
Latexmkrcは設定出来ているんです。事実、

```
latexmk -commands
```

においてもplatexが指定できるていることが確認できているにもかかわらず、なぜか実行時だけplatexを使ってくれないという不思議現象です。

# 1日がたった

以下の記事(バイブル)を発見します。

[LaTeXのエラーが消えたゾ
](https://usagi-goten.com/index.php/archives/tag/platex2e)

どうやら日本語のセットアップができていないことがあるらしいです。

# 解決法

リンクの記事とは少しパスが違います
自分の場合は

```
cd /usr/local/texlive/2019/texmf-dist/source/platex/jsclasses
sudo platex jsclasses.ins
```

これだけです。
これで日本語のセットアップが完了して無事日本語のpdfを出力できるようになりました
2019年末版 Jupyter labでElixirを動かす環境設定

東京だけど fukuoka.ex の YOSUKENAKAO.me です。

普段は合同会社The Waggleで「教育」に関わるサービス作りのお仕事と学習教材の開発や研修講座の企画開発をしています。

さて、今回はJupyter NotebookでElixirを動かせるらしいという事を知ったので早速環境作って行きたいと思います。

１年以上の前の記事として、Qiitaにも上がっていたのですが、今やると１点エラーでハマる箇所があったので、これから試した方向けに記載しておきます。

## 環境
ちょうど、Macbook proを１台新しく環境作り直していた所なので、次の設定で環境を作りました。
asdf でnodejsとerlangとelixirのバージョン管理をし、ローカルフォルダでバージョン違いを動かせるようにしています。

Pythonの方は、pyenvでバージョン管理し、こちらはグローバルでPython3系を動かすように設定しました。Anacondaはpython3.7バージョンをインストールしました。

Homebrew 2.2.2
Git 2.17.2
Asdf node’s 12.14.0
Asdf erlang 22.2 OTP
Asdf elixir 1.9.4-otp-22
Yarn 1.21.1
Postgres app ver 12

pyenv 
python 3.7.5
Anaconda python3.7バージョン

## 環境構築

基本的には、こちらの記事@h6akhさんが書かれた
[Jupyter NotebookでElixirを使えるようにする(MacOS High Sierra)](https://qiita.com/h6akh/items/fa8885f40c31c2ac82e3)
を参考にさせて頂きましたが、若干エラーがでる箇所があったので、以下の手順でやり直しています。

```
$ git clone https://github.com/pprzetacznik/IElixir.git
$ cd IElixir
$ mix deps.get
$ brew install zeromq
$ mix test
$ MIX_ENV=prod mix compile
$ ./install_script.sh
```

## jupyter labの起動

```
$ jupyter lab
```

起動すると、pythonとelixirが選択可能となっています。
<img width="1324" alt="スクリーンショット 2019-12-27 13.20.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72962/a535e442-cb50-906d-66b1-54f6dbc6448d.png">




もちろん、``` jupyter notebook```でjyupter notebookの起動もできます。

## 最後に

これで、Jupyter labでElixirを利用できるようになりました。
次は、これを使って何ができるかを紹介できるように弄って行きたいと思います。
Oculus QuestハンドトラッキングのUnity導入の備忘録

*2019/12/29　追記
#はじめに
最近のOculus Questのアップデートによりハンドトラッキングが可能になりましたが，個人的にUnityで実装する際に引っかかった点を備忘録としてまとめました．
Oculus側でのアップデートは済んでいる前提で以下記載します．

#Oculus Integrationのアップデートの問題点
##環境
今回使用したUnityのバージョンは2018.4.0f1です．
##AssetStoreでのアップデート
今回，既存のプロジェクトにOculus Integrationのアップデートを行おうとしましたが
まず最初に引っかかったのはAsset Storeから最新バージョンをアップデートできない点でした．

通常，最新バージョンをアップデートするときには，[import]のボタンが[update]との表示に変化しているはずですが，最新の(2019年12月29日時点）Oculus Integration(ver1.20)のダウンロード画面に行くとimportの状態のままです．

ここで，こちらの
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/63bc7084-f2d8-ed75-a6f9-e3c8a89c7ead.png)
**旧版のAssetStoreにアクセス**し，Oculus Integrationを検索すると無事Updateの画面になります．


これでプロジェクトに最新のOculus Integrationを統合できるようになりました．

##NameSpaceの競合によるエラー
これは，以前のOculus Integrationのバージョンによるのかもしれませんが，統合した後に複数のNameSpaceの競合エラーが発生しました．
同名のスクリプトのパスが変更されていたようです．
筆者の場合，Oculus/SampleFramework/Core/Video
の中にある同名スクリプト群を削除することで，Buildに成功しました．

#Unityでのハンドトラッキング実装の方法
1.Oculus/VR/scens/HandTestのシーンを既存プロジェクトへコピー
![無題5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/bb224f7e-fdb7-8da2-16fc-eb4d37302c56.png)

2.HandTest内のOVRCameraRigをコピー
3.OVRCameraRigのインスペクタを表示し，OVRManagerのInputをHandOnlyに
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/1bdf799f-a577-f778-db45-57684fd58fa3.png)

これで，VR空間での手による入力が可能になります．
手のマテリアルを変更する場合はOVRCameraRigの子オブジェクトである
LeftHandAnchor，RightHandAnchor直下にあるOVRHandPrefabのMaterialを変更します．
![無題4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/56659e7f-ca73-0a0a-4102-582e010fd27a.png)

*追記箇所
また，以下をシーンに持ってくることで，応用先が広がります．．
・Oculus/SampleFramework/Core/HandsInteraction/Prefabs/InteractableToolsSDKDriver
　　　→人差し指からのrayや人差し指の指先位置が表示される

・Oculus/SampleFramework/Core/HandsInteraction/Prefabs/Hands
　　　→InteractableToolsSDKDriverを使用する場合に必要な手を生成

Handsを使用する場合は先述したOVRHandPrefabを使用する必要はなくなります．
**ただし，Handsの座標が(x,y,z)=(0,0,0)でないと，Handsはうまく動きません**
カメラ位置を初期位置から変更している場合は注意してください．

以下，colliderの生成方法など今後実装していき次第，追記していきます．
（それらに関しては[こちら](http://bibinbaleo.hatenablog.com/entry/2019/12/23/163123)のサイトを参考にさせていただく予定です）
v-modelで双方向バインディング ❏Vue.js❏

HTML側から、JS側のデータを変える方法です！すごい！！

[![Screenshot from Gyazo](https://gyazo.com/0ed9b5142129a473c60561e5b8839b8a/raw)](https://gyazo.com/0ed9b5142129a473c60561e5b8839b8a)


開発環境はJSFiddle
https://qiita.com/ITmanbow/items/9ae48d37aa5b847f1b3b

```html:html
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
  <input type="text" v-model="message">
  <p>{{ message }}</p>
</div>
```

```javascript:javascript
new Vue({
  el: "#app",
  data: {
    message: "おはよう！"
  }
})
```

【解説】
`v-model="message"`とするとmessageプロパティにアクセスし、inputに入力された文字に変えています。
瞬時に反映されているのがすぎょい。。

<br>
ではまた！
AWS CDK - Lambda + API Gateway (Python)

TypeScriptの事例が多いため、Pythonで試してみた際の備忘録。

## 概要
- Python実装のLambda処理をAPI Gateway経由で公開するサンプル。

## 感想
- TypeScript比較
    - 依存ライブラリは`setup.py`に追記する(`npm install --save`と異なり、直接ファイルに記述)。
    - ビルドのステップがないため、基本操作はサクサク進む(一方で型チェックの弱さはデメリット）。
    - `cdk init`で生成されるリポジトリに`.gitignore`が含まれない現象に遭遇。以下をベースに別途ファイルを追加(`language=typescript`の場合には発生しない模様)。
        - https://github.com/aws/aws-cdk/blob/m1aster/packages/aws-cdk/lib/init-templates/app/python/.gitignore
- 全般
    - TypeScriptの型情報に基づくコード補完機能が強力なため、これを失ってでもPythonで書きたいほどの強い理由は感じない。一方、Lambdaなどの実装コードもPythonで実装した上で、Infra(CDK)も合わせて言語統一的にソース管理するのであればメリットがあるかもしれない。

## 手順
動作確認に用いた手順。

### 前提

```
$ npm install -g aws-cdk
$ cdk --version
1.19.0 (build 5597bbe)
``` 

`cdk-init`でアプリケーションを初期化。また、`source`コマンドで`virtualenv`を有効化しておく。

```
$ mkdir lambda-sample && cd $_
$ cdk init --language=python
$ source .env/bin/activate
```

**setup.py**
依存ライブラリの定義(デフォルトでは、`aws-cdk.core`しか存在しないため、`aws-lambda`と`aws-apigateway`を追加）。

```python
...

    install_requires=[
        "aws-cdk.core",
        "aws-cdk.aws-lambda",
        "aws-cdk.aws-apigateway",
    ],

...
```

定義に基づいて依存ライブラリをインストール。

```
$ pip install -r requirements.txt
```

### 実装
スクリプトの実装。

```
$ mkdir lambda
$ touch lambda/handler.py
```

**lambdahandler.py**

```python
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
 
def main(event, context):
    logger.info(json.dumps(event))
 
    return {
        'statusCode': 200,
        'body': 'Hello World'
    }
```

**lamba_sample/lambda_sample.py**

LambdaとAPI Gatewayのデプロイ定義をStackに追加。

```python
from aws_cdk import (
    aws_lambda,
    aws_apigateway,
    core
)

class LambdaSampleStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        handler = aws_lambda.Function(
            self, "backend",
            runtime=aws_lambda.Runtime.PYTHON_3_7,
            handler="handler.main",
            code=aws_lambda.AssetCode(path="./lambda"))

        api = aws_apigateway.LambdaRestApi(self, "SampleLambda", handler=handler)
```

定義したスタックをデプロイ。`Outputs`の欄に出力されるAPI GatewayのEndpointを呼ぶとLambaの出力結果が返却される。

```
$ cdk deploy
...
Outputs:
lambda-sample.SampleLambdaEndpoint9FAA5D96 = https://4rtjc3pjfh.execute-api.ap-northeast-1.amazonaws.com/prod/
```

```
$ curl https://4rtjc3pjfh.execute-api.ap-northeast-1.amazonaws.com/prod/
Hello World
```

## 参考
- https://docs.aws.amazon.com/cdk/api/latest/python/index.html
- https://cdkworkshop.com/30-python.html
- https://github.com/aws-samples/aws-cdk-examples#python-examples-
【JUnit】前日まで正常に動いてたJUnitテストで急にinitializationErrorが出た；経緯と解決策覚書き

JUnitで単体テストを行っていたところ、前日まで正常に動いてたメソッドで急にinitializationErrorが出てしまいました。
以下、経緯と解決策の覚書きです。

## 発生事象
Eclipseを使用し、JUnitテストを実行したところ、一部のテストメソッドでinitializationErrorが発生。
前日までは正常に動作していた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/4ec37b00-2cd8-6e31-9f15-4062677c29a0.png)

## 環境
- Java：バージョン1.8.0
- Junit：バージョン4.12.0
- OS：Windows10

## 経緯と調査
追加開発内容のカバレッジに漏れがないか確認するため、
開発前のコミットに戻して、テストを実施。
その後、最新のコミットに変更してテストを実施したところ、上記キャプチャのようなinitializationErrorが発生。
・・開発期限まで間もなかったため、頭が真っ白になりました。

調べたところ、@Testをつけたメソッドをテストメソッド内で呼び出すと起きるらしいのですが、
今回はそのような箇所はなし。

参考：[JUnitでInitializationErrorが出てハマった話 | 個人でもいいんじゃない? 常駐フリーランスSEのための備忘録](https://freitech.xsrv.jp/hobby/2018/04/07/post-177/)

## 原因と解決策
いろいろ確認した結果、initializationErrorは新規追加したテストメソッドのみで起きていることがわかりました。
ということは・・で、無事原因にたどり着きました。

その原因とは、、
<b>開発前のコミット→最新のコミットに戻した後にビルド・デプロイしていなかったこと。</b>
いわゆる凡ミスですね。。
その後、ビルド・デプロイ実施で、無事解決しました。

## 教訓
ブランチを変えたり、コミットをリセットした場合は、ビルド・デプロイを忘れずに。
【超初心者向け】『メイドイン「俺」』から学ぶゲーム作り②台本(スクリプト)の書き方編

#はじめに
この記事は[【超初心者向け】『メイドイン「俺」』から学ぶゲーム作り①超基本編](https://qiita.com/khjcsm/items/5b023a8237c01a6bc9a3)の続きです。
ここでいう台本とは、ゲーム上におけるスクリプトのことを指します。

#前回のおさらい
ゲーム上において、物体を動かす**台本**とも言えるスクリプトは欠かせないという話でしたよね。
では実際台本の構成はどのようにすればいいのか、どのようにセリフであるコードを書いていったらいいのかを学んでいきましょう。

#台本(スクリプト)とは
一言で言えば命令をして物体を動かす役割をするゲームの命です。
そしてこの台本は基本的に**きっかけ**と**アクション**から構成されています。
####▶︎ここでいう**きっかけ**とは
『〇〇の時に××する』の**〇〇**の部分にあたります。

####▶︎ここでいう**アクション**とは
『〇〇の時に××する』の**××**の部分にあたります。

それではいくつか例を出して具体的な構成を見ていきましょう。

##例1
###**プレイヤーがタッチされた時、動く。**

きっかけ：プレイヤーがタッチされた時
アクション：動く

になります。

例えばこれが
###**プレイヤーがタッチされた時、動いて、ジャンプする。**
のように一つのきっかけに様々なアクションが追加された場合

きっかけ：プレイヤーがタッチされた時
アクション：動く、**ジャンプする**

となるので、同じきっかけのところにどんどん足していけばいいのです。
![IMG_9358.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/80efbf7a-939d-e6ce-7f30-ca395f49a32f.jpeg)


###🔽以下はUnityにおける一例🔽

```php
void Start () //ゲームが始まった時
{
this.transform.position += transform.forward * speed * Time.deltaTime;
//この物体の位置が、向かった方向に、決まったスピードで、時間に沿って進む
Debug.Log("こんにちは");
//こんにちはという文字をログに出す
}

```

この場合ではゲームが始まった時という**一つのきっかけ**に対して、移動の指示と文字表示の指示が書かれていますね。
このようにきっかけが同じなら、**同じかっこの中にアクションを並列して**書いていきましょう。
(まだコードの意味はわからなくて大丈夫です。同じきっかけなら同じかっこに書くんだなくらいの認識でオッケーです！)

##例2
###リンゴを食べた時、笑う・バナナを食べた時も、笑う。
この場合は

きっかけ：リンゴを食べた時、バナナを食べた時
アクション：笑う

となります。
![IMG_9349.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/8b2e9121-7932-0258-3f14-39b1345de6f9.jpeg)
![IMG_9350.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/9e31c41d-d769-d08b-d608-64eb40b2fbf1.jpeg)


これは**きっかけが二つある**のでたとえアクションが同じでも別々に書かなければなりません。
###🔽以下はUnityにおける一例🔽

```php

void Update() {
if (Input.GetKey("right")) //右のボタンを押した時
{
Debug.Log("やっほー");
//やっほーという文字をログに表示させる
}
if (Input.GetKey ("left")) //左のボタンを押した時
{
Debug.Log("やっほー");
//やっほーという文字をログに表示させる
}
		}
```

この場合ではやっほーという文字の表示というアクションに対して右のボタンを押した場合と左のボタンを押した場合のきっかけごとにかっこがありますね。
こんな感じで例1と違ってきっかけごとにコードを書かなければなりません。

###おまけ
きっかけが**リンゴかつバナナを食べた時**に笑うというアクションを起こす場合は
**リンゴとバナナを食べたとき**という条件のかっこの中に笑うというアクションを足しましょう。
(この場合、リンゴだけ、バナナだけでは笑わないということになりますね。)
![IMG_9351.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/16ac53f2-f7e8-6642-71d4-f4722fa34c78.jpeg)
![IMG_9352.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/494f8968-f535-0ca5-10d2-7cfdab6a7322.jpeg)
![IMG_9353.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550954/641905ee-2f72-2a8f-523e-5f294db8a700.jpeg)

複合条件を含む様々な条件文のコードが気になる方は[こちら](https://dkrevel.com/makegame-beginner/program-beginner-if)から。
(※かなり参考になるのでUnity始めたての人は是非。)

#まとめ

台本の書き方編はいかがでしたでしょうか？少しでも参考になれば幸いです。
次回は[**アニメーションの超基本**](https://qiita.com/khjcsm/items/15bb2645c251a81827be)について書いていきます。

**『メイドイン「俺」』**についてのサイトは[こちら](https://www.nintendo.co.jp/ds/uorj/index.html "こちら")から。
zshのファイル検索

zshのファイル検索について調べていたら、結構時間がかかったのでまとめようかなと。
##環境
MacOS-10.15.1
zsh-5.7.1

##めっちゃ参考になりそうなページ
[findコマンドで覚えておきたい使い方12個(+1個)](https://orebibou.com/2015/03/find%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B912%E5%80%8B/)2020/5_27　追記



###ファイルのパスを含めた位置を検索する
`find **/検索したいファイル名`これでOK。
現在のディレクトリからそのファイルまでの相対パスが表示される。
`**/`と書くことで現在のディレクトリ以下全てを検索してくれる。
`*`はワイルドカードで、任意の文字列の代わりになる(文字数も任意)。
だから、ファイル名を一部しか覚えていない時(例:モデルと築年数.pdfというファイルを見たいが築年数の部分しか覚えていない時)は、`find **/*築年数*`と検索すればいい。

###現在のディレクトリ以下に存在する特定の名前が含まれてるファイルを探したい時
`grep 名前 **/*`のようにする。
拡張子が指定できるようだったら`grep 名前 **/*.拡張子`とした方がいい(検索時間が短くなる)。


##感想
`*`がとにかく便利だなぁと。
今後ファイル検索で書きたいことができたら追記します。

##参照
https://qiita.com/termoshtt/items/cd6a1e2b85b50b348d9d
https://qiita.com/dondoko-susumu/items/238bac310d6bd901013d
MediaLive+MediaPackageで自動フェイルオーバー

# 結論
`Input Loss Action`を`PAUSE_OUTPUT`、`Blackout Slate`をdisableにしたらできる。

↓MediaPackageのプレビューのキャプチャ。切り替わりはかなりスムーズ。
![failover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/329fe00c-1aa7-022f-25d5-803f4660358d.gif)


# あった
この記事を書き終わったタイミングでQiitaで見つけた。こっちを見てくれ。
[AWS MediaLiveの「Input Loss Action」に要注意！](https://qiita.com/ktsuchi/items/36f969ba8f460af9ed12)


# やりたいこと
2018/8にリリースされた、MediaLiveのinputs冗長構成で自動フェイルオーバーをやりたい。

MediaLiveでinputを2本(main/sub)にして、outputをMediaPackageのEndpoint 1つにできるようになってた。
[[アップデート] AWS Elemental MediaPackageがLive Channelの冗長入力に対応しました](https://dev.classmethod.jp/cloud/aws/aws-elemental-mediapackage-supports-redundant-inputs-for-live-channels/)

それ以前はCloudWatch => SNS => Lambdaとかでどうにかmain/subを切り替えていたので、勝手にやってくれたらめちゃ楽。


# 分からん
↑の記事にある通り、
> 1. MediaLiveのChannelを一度Stop、Startし直してからOBS Stduio側配信先を変えても、MediaPackageの1つのEndpointで映像を視聴しつづけることができた（映像の一時的な中断はあり）
2. MediaLiveのChannelのステータスはrunnningのままOBS Studioでの配信先を変更した場合、MediaPackageから配信される映像は黒の映像が流れ続けた（切り替わらなかった）

こうなってしまった・・・。

ドキュメントには、
> AWS Elemental MediaLive で HLS グループを使用する場合は、HLS グループの設定で、サービスで入力が受け取られない場合の入力損失時のアクションを、出力の一時停止に設定する必要があります。入力が失われたときに MediaLive がブラックフレームまたは他のフィラーフレームを送信すると、MediaPackage はセグメントが失われたときを判断できず、したがってフェイルオーバーを実行できません。
https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/what-is-flow-ir.html

とあるので、ブラックフレームが流れないようになっていればフェイルオーバーしてくれそう。
が、`General settings > Blackout Slate`をオフにしててもダメ。分からん。
![スクリーンショット 2019-12-27 12.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/9a19296d-ec2f-d27d-9a82-3cb19dbd7544.png)


# 結局
`Output > HLS settings > Input Loss Action`を`PAUSE_OUTPUT`にする必要もあった。
![スクリーンショット 2019-12-27 12.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/f786c1b4-698d-735b-7ce9-0738017108f4.png)

`EMIT_OUTPUT`と`PAUSE_OUTPUT`があって、Infoを見るとこう。Infoとは一体。
![スクリーンショット 2019-12-27 12.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/1f221fcb-c7b6-6189-e873-d511586d0d13.png)

ドキュメントを真面目に漁ると出てくる。出てくるので自分のせいである。それはそう。

> ・If the channel is a standard channel (to support input redundancy on AWS Elemental MediaPackage), set this field to PAUSE_OUTPUT. With this setup, if MediaLive stops producing output on one pipeline, MediaPackage detects the lack of content on its current input and switches to the other input. Content loss is minimized. (If you set this field to EMIT_OUTPUT, MediaLive sends filler frames to MediaPackage. MediaPackage doesn't consider filler frames to be lost content, and therefore doesn't switch to its other input.)
・If the channel is a single-pipeline channel, set this field to EMIT_OUTPUT. In this way, if the pipeline fails in MediaLive then AWS Elemental MediaPackage continues delivering to its own downstream system (although the content will be filler frames). If you set this field to PAUSE_OUTPUT, AWS Elemental MediaPackage stops updating its endpoint, which might cause problems at the downstream system.
https://docs.aws.amazon.com/medialive/latest/ug/hls-group-fields.html


# 愚痴
EMITの方がそれっぽくないですか？？？