OmniAICreator/Qiita-1.07M huggingface dataset:
QuantXでより良いアルゴを作成する

##1.　はじめに
QuantX Factoryでは、株売買のアルゴリズムを作ることができます。また、アルゴリズム開発画面では、過去の株価データを利用して、自分の開発したアルゴリズムのパフォーマンスを期間や初期資金量を設定して検証することができます。具体的には自分のアルゴリズムのMaxDrawdownやSharpeRatio等が確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378059/0366edb3-4df3-771d-4c54-8379b3454646.png)

##2.　パフォーマンス指標
QuantX Factoryで確認できる指標は以下の通りです。

・取引回数
取引回数はバックテスト期間における市場開催日の日数となります。
・損益
初期資金を用いて売買されたときの、損益の金額が表されます。
・損益率
初期資金と損益の割合が表されます。
・シグナル回数
アルゴリズムによって出されたシグナルの回数
・MaxDrawdown(Drawdown)
>最大資産（累積利益）からの下落率のこと。システムトレードなどでは、最大ドローダウン(下落率)をどれだけに設定するかがリスク管理の観点から重要な要素の一つとなる。(https://www.nomura.co.jp/terms/japan/to/A01914.html)

大きいほどリスク度合いが高くなります。

・SharpeRatio
>投資信託の運用成績を測るための指標のひとつ。ポートフォリオの総リスクを示す標準偏差で計測される。 

>一般的には、ポートフォリオの年率換算後の収益率（ここでは平均リターン）、標準偏差、無リスク利子率が用いられ、 ｛（ポートフォリオの平均リターン）－（無リスク利子率）｝／（ポートフォリオの標準偏差） で表される。 

>単純なリターンの大小ではなく、そのリターンを得るためにどれ位のリスクをとっているかを計測する。数値が大きいほど運用効率が高いことを示す。一般的に、同種の投資対象分類ファンド同士を比較するのが効果的とされている。 なお、リターンがマイナスの場合には、リスクが大きいほどシャープレシオが大きくなるという制約を伴う。 

>指標の考案者は、米国の経済学者であるウィリアム・シャープ（William Sharpe）。(https://www.nomura.co.jp/terms/japan/si/sharpratio.html)

リスクに対してどれだけの利益を得ることが出来るかということになります。

・volatility
>証券などの価格の変動性のこと。期待収益率が期待通りとなる度合いを示す。ボラティリティが高ければ期待収益率から大きく外れる可能性が高い。 
標準偏差で示すことが多い。ボラティリティが大きいとは価格の変動性が大きいことを指す。また、1つの変数の変動に対する他の変数の感応性を意味することもある。例えば、長期債の利回りの変動に対する価格の変動性は、短期債のそれよりも高く、ボラティリティが大きいという。(https://www.nomura.co.jp/terms/japan/ho/volatility.html)

価格変動の大きさを表します。

・Alpha
>β値で表されるリスクを調整した後の個別証券の収益率が、どれだけ市場平均（ベンチマーク）の収益率を上回っているのかを示す数値。α値が高いということは、ベンチマークよりも、それだけリターンが大きいことを意味する。 

>なお、ある変数ｙ（被説明変数）のデータを他の変数x（説明変数）のデータから予測しｙ＝α＋βxの関係式に当てはめて検証する回帰分析を行う場合、最小2乗法の手法を用いて 
α＝（ｙの平均値）－β×（ｘの平均値） 
と推計される。(https://www.nomura.co.jp/terms/japan/a/alpha.html)

αが高いほど、ベンチマークは収益率を上回り、リターンが高いことを示します。

・Beta
>個別証券（あるいはポートフォリオ）の収益が証券市場全体の動きに対してどの程度敏感に反応して変動するかを示す数値で、現代ポートフォリオ理論でよく用いられる。 
β＝個別証券のリターン÷市場全体のリターン 

>で表される。(https://www.nomura.co.jp/terms/japan/he/beta.html) 

INDEX指数（日経平均やTOPIX）に対して対象銘柄が指数の変化よりもどれだけ大きく動くかを数値化したもの。βが高いほど証券市場全体の動きに連動した変動幅が大きいことを示す。

##3.　いいアルゴリズムとは
QuantXでは上記のような指標を用いて、自分のアルゴリズムを考えることが出来ますが、果たして、上記指標がどのような値になったときに、いいアルゴリズムで、開発するうえで、どのような値を目指せばよいのでしょうか。

ここでは、いいアルゴを考える前に、まず先に、悪いアルゴについて考えてみます。
悪いアルゴとは、
・パラメーターや開始日を少し変えたらパフォーマンスが大きく変わる
・パフォーマンスの大半が1、2銘柄の好成績に依存してる
・組み入れ銘柄の株価の上昇に依存している
・シグナル発生頻度が極端に低い

ということが考えられます。特に一番初めの、パラメーターや開始日を変えたときに大きくパフォーマンスが変わるのは、バックテスト最適化になっている可能性が高く、アルゴ開発を行う上で、注意しなければいけません。

また、いいアルゴを定義することは難しいのですが、悪いアルゴから考えてみると、いいアルゴとは、

・パラメーターや開始日を少し変えても、パフォーマンスが大きく変わらないこと
・パフォーマンスが1、2銘柄に依存せずに、収益が出ていること
・銘柄に流動性があり、適切に選択されていること
・シグナル回数が極端に低すぎないこと
・MaxDrawdownが高すぎないこと
・SharpeRatioが適切な値であること


等が考えられます。評価基準は多岐にわたるので、簡単に書くことは難しいのですが、上記のようなことが一般的に考えられます。
Flutterでの非同期処理とIsolate

#はじめに
FlutterでiOSアプリを作っていて、処理中にIndicatorを回すような処理を書いていたが、
場所によっては、Indicatorが固まるような動きなるので、調べていたら、CPU負荷の高い処理によって、
スレッドがブロックしてしまうことが原因だった。
また忘れないように、以下覚書。

#シングルスレッドのイベントループ
Dartの実行モデルはシングルスレッドのイベントループ処理(
https://qiita.com/takyam/items/6ad155678c95bba4047f
)で、Node.jsなどと同じ。

#スレッドブロック
例1.  

```rei1.dart
await Future.delayed(new Duration(seconds: 5));
```

例2.

```rei2.dart
await Future(() => sleep(new Duration(seconds: 5)));
```

この2つをcallしてみると、例1の方は、通常のasync awaitの書き方で次の処理に進むことが可能だが、
例2の場合は、スレッドをブロックしてしまうため、Futureを使って逃していても、
5秒間、アプリは止まってしまう。

単純にhttpのcallbackを待つ場合などはMain isolateを使い、シングルスレッド上で、実行させればokだが、
CPU負荷の高い処理などは、Main以外のIsolateで処理を行う必要がある。


#compute関数を使う

FlutterではIsolateを簡単に扱うためにcomputeという関数が用意されているので、
これを呼べばOK.


```call.dart
var result = await compute(testFunc,5);
```

#注意点(Invalid argument(s): Illegal argument in isolate message )
https://stackoverflow.com/questions/51998995/invalid-arguments-illegal-argument-in-isolate-message-object-is-a-closure

"compute can only take top-level or static methods, but not instance methods"
ということで、
staticの関数でなければ呼び出せないらしい。


#おしまい


#参考
https://twitter.com/_mono/status/1090598230251847680
アスペクト比で高さを指定した場合のトルツメ（Viewの非表示）の方法

今回は特殊なトルツメ(Viewを消して空白を詰めること）について紹介したいです。
　androidでいうところのView.GONEがないようなので。

ちょっとばかりコアなのですが、<font color="red">aspect ratioでwidthからheightを動的に設定している場合</font>を想定してください。

通常、トルツメをする際は消したいViewのheightに関する制約をドラッグしてきて

```swift
hogeHeightConstraint.constant = 0
```

これだけです。
調べたら大体この方法が出てくるかなと思います。
が、aspect ratioの場合はどうしたら。。。

width:height = 1:0にしちゃえばいいのかなと、とりあえず制約をドラッグしてみますがうまくいじれませんでした。
これのいじり方を知ってる方は教えてください。

というわけで別のちょっとテクニカルな方法をとりました。

<font color="red">priority</font>
こんなものがあったなとふと脳裏をよぎりました。
プライオリティー
まんま、優先、ですね。優先席はプライオリティーシートなんて言いますが、それです。


これの利用方法ですが
①height = 0　の制約のpriorityを低めに設定
②widthとheightのaspect ratioの制約のpriorityを中くらいに設定(①の制約よりこちらが優先されるため、今のところ①の制約は無効）
③トルツメしたいタイミングで、height = 0の制約（①の制約）のpriorityを高めに設定し直す（これにより②の制約が無視される）

③のコードですが

```swift
hogeHeightConstraint.priority = UILayoutPriority(rawValue: 500)
```

こんな感じです
これは優先度500です
ストーリーボードなどで①の制約のpriorityを100、②のアスペクト比のpriorityを300などに設定しておいてください。

ちょっとテクニカルですが参考にしてくれたら嬉しいです。
Skype を Ubuntu18.04 にインストール

2019/07/16現在、公式サイトから、debファイルがダウンロードできなくなっている。

![Screenshot from 2019-07-16 15-10-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c7c3b77c-6c9f-d373-3b4e-4429fd7fff3d.png)

しかしながら、以下のようにするとダウンロードできるらしい。


```

wget https://go.skype.com/skypeforlinux-64.deb
```



```

$ sudo dpkg -i skypeforlinux-64.deb 
[sudo] nanbuwks のパスワード: 
以前に未選択のパッケージ skypeforlinux を選択しています。
(データベースを読み込んでいます ... 現在 181576 個のファイルとディレクトリがインストールされています。)
skypeforlinux-64.deb を展開する準備をしています ...
skypeforlinux (8.33.0.41) を展開しています...
skypeforlinux (8.33.0.41) を設定しています ...
gnome-menus (3.13.3-11ubuntu1) のトリガを処理しています ...
desktop-file-utils (0.23-1ubuntu3) のトリガを処理しています ...
mime-support (3.60ubuntu1) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...
```

インストールできました

![Screenshot from 2019-07-16 15-31-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c74076a6-18e4-73e7-32d9-0a67c9f9a521.png)
pythonの比較演算子isで数値を比較するときの注意点

#isで比較するのはやめよう
それ以上でもそれ以下でもないんですが、特に必要でないときは**必ず==で比較しましょう。**
私のようにPythonは比較を英文っぽく書けるからちょっとカッコイイ！！なんて**考えないようにしましょう。**

##isと==の違いについて
詳しく書いてあるサイトはいくらでも存在するのでここでは軽く。
**isはオブジェクトのid比較、==は中に入っている値の比較**を行っています。(厳密には違いますがその認識で当分は良いです)

```python
a = [1,2,3]
b = [1,2,3]
print(a == b) #True
print(a is b) #False
```
このように、aとbが違うオブジェクトの場合はそれぞれが別の場所に作られているため結果が異なります。

しかし

```python
a = True
b = True
print(a is b) #True

a = None
b = None
print(a is b) #True
```
このように場合によっては異なるオブジェクトを比較しているつもりでも```True```が帰ってくることもあります。
これがなぜ起こるかと言うと、``True``や``None``はそれぞれ1つしか存在しないため、全てが同じオブジェクトのidを指すように作られているからです。

##数値を比較してみる
ではここで本題です。数値に対してis演算子を適用してみましょう。

```python
a = 1
b = 1
print(a == b) #True
print(a is b) #True

a = 1.0
b = 1.0
print(a == b) #True
print(a is b) #False
```

int型ではis演算子で``True``が帰ってきました。

[Pythonのリファレンス](https://docs.python.org/3.7/c-api/long.html)を見てみると、どうやら```-5```から``256``は配列で最初からidが押さえてあるみたいですね。つまり、**int型において``-5~256``の比較のみ**``is``が使えるようです。

実際

```python
a = 256
b = 256
print(a is b) #True

a = 257
b = 257
print(a is b) #False
```
となっています。何度も言いますが**むやみに``is``で比較しないようにしましょう。**

##ではis演算子は使わないほうが良いのか
というとそんなことはなくて、``==``より``is``の方が良い場合もあります。
最初に出したような``True``や``None``など、**確実にidが同一であるとわかっている場合は**``is``を使うほうがよいです。

理由はいくつかありますが、``is``のほうがidを直接参照しているので高速であるということ、``==``はユーザーが定義したクラスなどの場合にオーバーロード(挙動の書き換え)ができてしまうため不確実である可能性があるということです。
【Power BI】ドリルダウンすると合計が違っちゃう事件

##全体とメンバー別のグラフを作成してみて事件発生

こんな感じの、いつ、誰が、誰に指名されたかというトランザクションデータがあるとします。

![Qiita1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/2d034411-3bf0-8699-0c35-9032c13d793a.png)

このデータから、今年初めて指名してくれたお客の人数をカウントしたい！という要望があったとします。
これを、こうやって今年以降の日付でフィルターしてカウントすればいいじゃん！とこんなメジャーを書きました、が。

```
当年指名人数 = CALCULATE(DISTINCTCOUNT('指名履歴'[お客]),'指名履歴'[日付]>=DATE(2019,1,1))
```
このメジャーだと、今年来てくれたお客をカウントしているだけで、今年も去年も来てくれたお客も含まれてしまうので、

当年初指名人数=(お客の人数)-(去年のお客の人数)
と考えて

```
当年初指名人数 = DISTINCTCOUNT('指名履歴'[お客])
　　　　　　　　-CALCULATE(DISTINCTCOUNT('指名履歴'[お客]),'指名履歴'[日付]<DATE(2019,1,1))
```
こんなメジャーで算出することにしました。
$\tiny{※今年のお客から去年のお客を引くと、今年のお客から去年しか来ていないお客も引いてしまうので注意です。}$ 

で、グラフ。まずは全体。
![Qiita2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/8adef6ae-d4c1-4731-1f21-d7247c50d2ad.png)

案外少ない。苦戦してますね。
では、メンバー別に見てみましょう。

![Qiita3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/bc57f683-895a-361b-7562-4fd3897b1914.png)

え・・・・全体で4人なのに、メンバー別にすると16人！何故？？？

##捜査開始
とりあえず明細を見て確認と思い、グラフをテーブルに変えてみる。
![Qiita4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/374933e5-2824-6d91-85f7-c8f6fcf87fc0.png)

え？ええ？？なんでこれで合計4？？
この時点で、ちょぴり「バグかも・・・・？」とかも思ったりもするが、甘い。**たいがいのことは自分に問題がある**。

で、明細。
ここでクイズ①。原因が分かりますか？
![Qiita5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/659c0a20-833a-7388-4e2f-da6913716d38.png)
↓
↓
↓
↓
↓
↓
↓
↓
↓
これは簡単。エさま、ビさま、総さまはダブルカウントされてしまっていますね。
ただ、これだけが原因ではなさそうです。ダブルカウントされている3人を除外しても、13人。全体の4人とはまだ乖離があります。

そこで、全体で今年初とカウントされている4人が誰なのか見てみます。
![Qiita6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/d123db44-f39f-38b4-9e7d-4956cd638bd0.png)

そして、該当しないお客の指名履歴の明細を見てみます。例えば市さま。
市さま、色々とご指名されていますが、ここでクイズ②。原因が分かりましたでしょうか？
![Qiita7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/08502841-8c14-60fc-af96-c6ea414cb233.png)
↓
↓
↓
↓
↓
↓
↓
↓
↓
わたし的にはここが結構落とし穴で、実データではなかなか発見ができませんでした・・・・・
このサンプルデータだとすぐわかると思うのですが、アッピーにとっては市さまは今年初めて指名してくれたお客なので、メンバー別にするとカウントされてしまうのですが、去年アストロやアインシュタインが指名されているので、全体にとっては今年初めてのお客ではないのでした。
##結局Power Queryで・・・・
これを解決するメジャーが考え付かず、結局Power Queryでゴリゴリグループ化することに。

①次の3つのクエリを作成する。

-当年初指名：指名履歴を今年の日付でフィルターし、お客ごとにグループ化、日付の最小を集計する。

-当年初指名メンバー別：指名履歴を今年の日付でフィルターし、お客ごと、メンバーごとにグループ化、日付の最小を集計する。

-前年指名：指名履歴を去年の日付でフィルターし、お客ごとにグループ化、日付の最小を集計する。

②当年初指名に当年初指名メンバー別をマージ。
照合列はお客と日付。
メンバーを展開

③当年初指名に前年指名をマージ。
照合列は日付。
前年指名日付を展開

④前年指名日付がnullのお客だけをフィルター
最終的にこんなクエリができます。
![Qiita8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/57b7a404-19ef-07ea-d33d-e52f824a4124.png)

で、グラフはこんな感じ。
全体の合計とメンバーの合計が合致しています。
![Qiita9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221359/38a91d75-b1a3-0d77-c98a-ac276214c71b.png)

アインシュタイン、アッピー、クラウディ、ブレイズが1人ずつ。
一番人気のアストロがまさかの0人。常連ばかりにかまけてないで、新規獲得活動も必要ですね。
##事件振り返り
実はずっと公開していたレポート、全然使われずに事件が放置されていて、三連休前の金曜日に急に「アレ使うから、体裁整えておいて」と言われたのが金曜日の15時ごろ。
事件が発覚したのが16時ごろ。
落ち着いて捜査すればすぐに原因が分かったと思うのですが、タイムリミットが近づくに比例して焦りみが急上昇、結局三連休に持ち越したという残念な結果でした。

サンプルみたいに分かりやすければ作成した時にすぐわかると思うのですが、多分作成した時点では原因①も②も発生していなかったので気が付かなかったものと推測されます・・・・。（言い訳）

こういうことがあったという自分的備忘録とともに、もしもっといい集計方法がありましたらご教授ください。
TensorFlowを用いた非線形回帰

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。
http://ai999.careers/rabbit/

#TensorFlowによる非線形回帰

#正解値データ

```math
y=-0.4x^3+1.6x^2-2.8x+1

```

```
#データを生成
n=100
x = np.random.rand(n).astype(np.float32) * 4 - 2
d =  - 0.4 * x ** 3 + 1.6 * x ** 2 - 2.8 * x + 1
```
非線形な解を生成

#モデル

```
#xの3乗、2乗、1乗、0乗の4つ分のプレースホルダ
xt = tf.placeholder(tf.float32, [None, 4])
dt = tf.placeholder(tf.float32, [None, 1])
#-0.4,1.6,-2.8,1という4つの重みがあるので、4つ。0.01の標準偏差で初期化
W = tf.Variable(tf.random_normal([4, 1], stddev=0.01))
#ノードとしてxt×Wを定義
y = tf.matmul(xt,W)
```
1次元目はバッチサイズで上記のようにNoneにしておくと可変サイズに対応可能

#誤差関数

```
optimizer = tf.train.AdamOptimizer(0.001)
```
Adamを使用、学習率は0.001

#結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/5cfb3baa-803a-4a5e-6d65-4ff2dab64e84.png)
W1 = [-0.40030134] ※正解-0.4
W2 = [ 1.5934367 ] ※正解1.6
W3 = [-2.7970264 ] ※正解2.8
W4 = [ 1.0092059 ] ※正解1

#ノイズの変更
**10倍のnoise = 0.5**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/8d630d94-fa1f-b75a-f6a5-4ae08491012e.png)
W1 = [-0.47843903]
W2 = [ 1.5267874 ]
W3 = [-2.5911577 ]
W4 = [ 1.1071517 ]
保ててはいるが、精度は落ちている

**100倍のnoise = 5**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/22dd6e80-280c-745d-ff34-a083dd072095.png)
W1 = [-0.07317215]
W2 = [ 1.7690974 ]
W3 = [-3.3754215 ]
W4 = [-0.42890525]
ノイズに対しては弱いことが観測できる

#dの正解値モデルの変更

```math
y=1.4x^3+3.1x^2-5.5x^2+0.03
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/b924f76a-c96c-a608-0721-eb3e0dae349e.png)
非常にきれいにモデルを予測できている

#演習
```math
y=30x^{2} +0.5x+0.2
```
の予測を行う
**iters_numやlearning_rateを変更せずに実施**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/c05f34cc-b61e-6a80-a557-749010cad9e8.png)
W1 =[ 4.544718 ]
W2 = [ 9.391723 ]
W3 = [-2.7000463]
W4 = [ 9.274796 ]

誤差が収束するようiters_numやlearning_rateを調整
**学習率0.00001**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/9a9534df-406a-9d2b-1ccb-b5cbfb9d6cc6.png)
むしろ悪化
⇒プレースホルダーの個数変更等、ウェイトが減ったことを加味していなかったことが原因

**学習率0.01**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/e41ae8b7-e8d6-b70a-269a-9ccce94467da.png)
非常に高精度に改善

**学習回数100万回**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/a0828a5b-3ff9-74c7-e3ad-1b59a697d8a6.png)
W1 = [4.2578713e-03]
W2 = [3.0001066e+01]
W3 = [4.8582685e-01]
W4 = [2.0072795e-01]
変数対応をしないで、計算回数だけで力技で実行
ここまで学習を回すと、3乗の係数がウェイトを無視できるものまで落としていることが観測できる
Kerasによるirisの分類

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。
http://ai999.careers/rabbit/

#iris
http://home.a00.itscom.net/hatada/ml/data/iris01.html
セトナ(setosa[ラベル:0])、バーシクル(versicolor[ラベル:1)、 バージニカ(virginica[ラベル:2])という3種類のあやめの 4個の計測値：がく片長(Sepal Length),がく片幅(Sepal Width),花びら長(Petal Length),花びら幅(Petal Width)と種(Species)からなる。 判別分析，クラスター分析などの研究にもテストデータとして良く用いられる。
がく片/がく片幅/花びら/花びら幅/あやめの種類

#実装

```
#from sklearn.cross_validation import train_test_splitは最新版では使えない
from sklearn.model_selection import  train_test_split
#学習に使うデータと、性能検証用のデータの分離
#len(x_train),len(x_test)を実行すると、(120, 30)と0.2対0.8になっている
x_train, x_test, d_train, d_test = train_test_split(x, d, test_size=0.2)

#モデルの設定
model = Sequential()
#入力4、中間層は12ノードで活性化関数はRelu、出力層は3ノードで出力用活性化関数はsoftmax
model.add(Dense(12, input_dim=4))
model.add(Activation('relu'))
# model.add(Activation('sigmoid'))
model.add(Dense(3, input_dim=12))
model.add(Activation('softmax'))
model.summary()

model.compile(optimizer='sgd', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

```

目的関数sparse_categorical_crossentropy
https://keras.io/ja/objectives/
one-hot形なら、categorical_crossentropyを使う。今回は[0,1,2]なので、sparse_categorical_crossentropy
※sparse:まばらな

metrics=['accuracy']
学習の途中で精度を確認できる

##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/0b864a49-ec78-d8b2-4742-bb45960b95ef.png)
120/120 [==============================] - 0s 217us/step - loss: 0.2735 - acc: 0.9667 - val_loss: 0.2776 - val_acc: 0.9667
**Relu関数からsigmoid関数へ変更**

```
model.add(Activation('sigmoid'))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/a6bc02ee-1903-ed90-5cd1-917e061d77cb.png)
120/120 [==============================] - 0s 225us/step - loss: 0.8497 - acc: 0.8417 - val_loss: 0.8642 - val_acc: 0.6667
**SDGのデフォルトの学習率は0.01、これを0.1に変更**

```
from keras.optimizers import SGD

model.compile(optimizer=SGD(lr=0.1), loss='sparse_categorical_crossentropy', metrics=['accuracy'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/a2df1c09-2ce6-05f0-c32b-197250780811.png)
120/120 [==============================] - 0s 217us/step - loss: 0.3040 - acc: 0.8917 - val_loss: 0.3655 - val_acc: 0.8000

Kerasでは、活性化関数やハイパーパラメータの変更が容易に実装、実行できる。
TensorFlowを使用した線形回帰

※以下、個人的な勉強のためのレポートです。
※間違い多々あると存じますが、現在の理解レベルのスナップショットのようなものです。
※勉強のためWebサイトや書籍からとても参考になったものを引用させていただいております。
http://ai999.careers/rabbit/

# TensorFlowを使用した線形回帰

#実装

```
#学習回数、後のfor文で使用される
iters_num = 300
#何回学習するごとに表示するか
plot_interval = 10

# データを生成
#100個のランダムなx
#randは0～1の一様分布
#randn(10)       # 標準正規分布を10個生成
n = 100
x = np.random.rand(n)
#正解データの作成
#これでは直線データができるだけなので、下でノイズを加えている
d = 3 * x + 2

# ノイズを加える
# 0～0.3くらいのノイズ
#randnは平均0、分散1のガウス分布(標準正規分布)
#randn(10)       # 標準正規分布を10個生成
#randn(10,10)    # 標準正規分布による 10x10 の行列
#randn(100)で、1から-1の数を100個作り、これに0.3をかけてやることで、0.3から-0.3の数を100個作っている

noise = 0.3
d = d + noise * np.random.randn(n) 

# 入力値
#xを入れるプレースホルダ
xt = tf.placeholder(tf.float32)
#dを入れるプレースホルダ
dt = tf.placeholder(tf.float32)

# 最適化の対象の変数を初期化
#ここから、trainの行までがTensorFlowで学習を行うための準備
#初期値0の重み
W = tf.Variable(tf.zeros([1]))
#初期値0のバイアス
b = tf.Variable(tf.zeros([1]))

#今回の学習では、この重みWとバイアスdを求めることが目的
y = W * xt + b

# 誤差関数 平均2乗誤差
#回帰問題なので、誤差には平均２乗誤差を用いる
loss = tf.reduce_mean(tf.square(y - dt))
#https://qiita.com/mine820/items/747a876d0bce658ad9ba
#TensorFlowで用意してくれている関数
#「GradientDescentOptimizer」は急速降下法
#「AdamOptimizer」はAdamアルゴリズム
#この0.1は学習率
optimizer = tf.train.GradientDescentOptimizer(0.1)
#誤差を最小化して学習していく
train = optimizer.minimize(loss)

# 初期化
# TensorFlowの初期化およびセッションの立ち上げ
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

# 作成したデータをトレーニングデータとして準備
# 縦ベクトル化
x_train = x.reshape(-1,1)
d_train = d.reshape(-1,1)

# トレーニング
#先ほど定義したiters_nomは300なので、300回実施
#
for i in range(iters_num):
    #sess.runを行うときに、先ほど定義したtrain(誤差を最小化する処理)
    #feed_dictで、dtには正解データを縦ベクトル化したd_train(ノイズ入り)を、
    #xtには、0～100の整数入力値を、それぞれ代入
    sess.run(train, feed_dict={xt:x_train,dt:d_train})
    if (i+1) % plot_interval == 0:
        loss_val = sess.run(loss, feed_dict={xt:x_train,dt:d_train}) 
        W_val = sess.run(W)
        b_val = sess.run(b)
        print('Generation: ' + str(i+1) + '. 誤差 = ' + str(loss_val))

print(W_val)
print(b_val)

#  予測関数
#予測できた重みWとバイアスbを用いて、式(モデル)を算出
def predict(x):
    return W_val * x + b_val

```

## noiseやd(正解モデル)の重みW/バイアスbを変えた実験と考察

### noiseの変更
**noise = 0.1**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/e0177461-5972-e225-9ac6-1de668ef7666.png)
W = [2.9645967]
b = [2.017563]

**noise = 0.5**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/d5422651-d640-238f-ef6f-3a63f181ba36.png)
W = [2.9131765]
b = [2.0111299]

上下に均等にnoiseが乗る場合には、それほど近似性に際は内容に思われる。

**noise = 5**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/7e654dbc-0dd3-6db2-f9b9-5f575c34802a.png)
W = [2.0730288]
b = [5.7792187]

予測値が正解式と大きくかい離。

### Wの変更
**W=9で正解式を作成(noise = 0.3)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/b661584e-5cd6-3012-6392-9d8b554fadb0.png)
W = [8.721432]
b = [2.1758988]

**b=6で正解式を作成(noise = 0.3)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405299/78a76544-4ba9-3dc6-d094-2303924f44d7.png)
W = [2.9766734]
b = [5.998174]

依然として、近似性に際は内容に思われる。

**ノイズには弱く、線形性の傾きや切片の変化には追従性が高い**
Lightning Aura Components 覚え書き


[Lightningコンポーネント (cmp)](https://qiita.com/TaigarAndDragon/items/a981b0c6bb98c6d02094)
[Lightningコンポーネント (イベント)](https://qiita.com/TaigarAndDragon/items/9bc94bdbb1558fff45ce)
[Lightningコンポーネント (Controller)](https://qiita.com/TaigarAndDragon/items/09956e26cebd720eb733)
[Lightningコンポーネント (style)](https://qiita.com/TaigarAndDragon/items/3d4fa40d6e5ea6289dee)
[Lightningコンポーネント ($A)](https://qiita.com/TaigarAndDragon/items/9ecd3c77125ec3c43ad3)
[Lightningコンポーネント (標準コンポーネント)](https://qiita.com/TaigarAndDragon/items/3f9196e2915904b5b24a)
[Lightningコンポーネント (DOM操作)](https://qiita.com/TaigarAndDragon/items/e4591f595fda10088a9b)
[Lightningコンポーネント (サーバー側コントローラ)](https://qiita.com/TaigarAndDragon/items/892978245c2c52942ca1)
[Lightningコンポーネント (その他JSテクニック)](https://qiita.com/TaigarAndDragon/items/4aac385977a401c2ad36)
[Lightning Hint&Tips](https://qiita.com/TaigarAndDragon/items/3a7f4d716b147fcec4a7)
Transactionの中で意図的にロールバックさせたい

`ActiveRecord::Base.transaction`はとっても便利です
save!メソッドなどの例外を拾ってロールバックを自動でかけてくれます
トランザクションの中でロールバックを意図的にかけたいときがあると思います


### ダメな例
```
begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::Rollback # ロールバックは実行される
    end   
  end
rescue e => 
  # ここは実行されない
  Rails.logger.error(e)
end
```

### 良い例
`ActiveRecord::RecordNotSaved`でもロールバックが走るため、こちらを例外として投げてあげると、
rescueでキャッチすることができる

```
begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::RecordNotSaved
    end   
  end
rescue e => 
  # 実行される
  Rails.logger.error(e)
end
```
EC2インスタンスへのログイン方法

EC2インスタンスへのログインの手順

ホームディレクトリに移動する。

```
$ cd ~
```

ホームディレクトリから隠しファイルである「.ssh」というディレクトリ(ファイル名)

```
$ ls -a
```
https://gyazo.com/a3b158acc0ade19fe9db319a24ba3b39

ホームディレクトリから.sshにcdコマンド(絶対パス?)で移動する。

```
$ cd ~/.ssh
```
.sshから、以下のコマンドを実行して、EC2インスタンスへのログインする。

```
$ ssh -i pemキー名 ec2-user@ 自身のIPアドレス
```
「pemキー名」は、AWSの鍵の名前を指す。

「自身のIPアドレス」は、インスタンス作成時に作成される数字


ログインが完了すると、以下のような画面になる。
https://gyazo.com/d8358a055227c0859543a3e47b016775

※隠しファイルのリストを見たい時は、-aで一覧表示できる。

```
$ ls -a
```


また、Finderにおいて、隠しファイルの一覧を表示させるには、

```
シフトキー　＋ command + .
```
のコマンドを実行すると、以下のような挙動となる。
https://gyazo.com/045020868a0f15b3e5fab25f5482588e
oracle 初期設定　備忘録＊完全なる私用＊

##完全なる私用のため、見栄えは範疇外。悪しからず。

####ORACLE_HOMEに異常を発見
````windows:cmd
 C:\???\???>tnsping
 TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Production on 16-JUL-2019 14:38:45

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

TNS-03502: Message 3502 not found; No message file for product=NETWORK, facility=TNS
````

````windows:cmd
C:\???\???>>lsnrctl start XE

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Production on 16-JUL-2019 14:43:08

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Message 1070 not found; No message file for product=NETWORK, facility=TNSTNS-12557: Message 12557 not found; No message file for product=NETWORK, facility=TNS
 TNS-12560: Message 12560 not found; No message file for product=NETWORK, facility=TNS
  TNS-00527: Message 527 not found; No message file for product=NETWORK, facility=TNS
````

[参考にさせていただいたページ1](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1331980643)
[参考にさせていただいたページ2](http://www.orafaq.com/forum/t/199201/)
[参考にさせていただいたページ3](https://www.shift-the-oracle.com/oerrs/ora-12560.html)



####ORACLE_HOMEの問題は解決したものの、「TNS-12541: TNS: リスナーがありません。」が出る
````windows:cmd
C:\Users\CiNK03>lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Production on 16-7月 -2019 17:37:17

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))に接続中
TNS-12541: TNS: リスナーがありません。
 TNS-12560: TNS: プロトコル・アダプタ・エラー
  TNS-00511: リスナーがありません。
   32-bit Windows Error: 2: No such file or directory
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521)))に接続中
TNS-12541: TNS: リスナーがありません。
 TNS-12560: TNS: プロトコル・アダプタ・エラー
  TNS-00511: リスナーがありません。
   32-bit Windows Error: 61: Unknown error
````
````windows:cmd
D:\>TNSPING XE

TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Production on 16-7月 -2019 17:51:39

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

パラメータ・ファイルを使用しました:
D:\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora


エイリアスを解決するためにTNSNAMESアダプタを使用しました。
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST =)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))に接続の試行中
TNS-12541: TNS: リスナーがありません。
````

[参考にさせていただいたサイト「似た症状のQA」](https://community.oracle.com/thread/2490394?start=15&tstart=0)
Javaのラムダ式について

長い記事を書こうとしていつまでも書けなかったので、
自分のための記事を書こうと思いました。
既に書き尽くされた感もありますが、初心者向きのメモになります。


# ラムダ式とは

ラムダ式 ＝ Java という間違った認識も生みがちですが（個人的偏見）
背景をざっと流してみます。

* CPUマルチコア化に伴う、スレッドを有効活用する需要
* Java SE 7 での**Fork/Join Framework**（分割統治法）を簡単に利用
* 関数を独立して扱うことが出来る
* 匿名クラスを簡単に扱える

# Javaでの位置づけ

* 関数型インターフェースを簡単に記述できる
* 関数型インターフェースとは、１つの抽象メソッドを含むインターフェースのこと
* **Java8**では、バックグラウンドでソースコードの自動変換を行い実現
* **型推論**により型の記述も省略すれば、非常にシンプルなコードが書ける
* **Stream** を活用するために必要

ただの列記になってしまうので、実際に比較してみます。

## 書いてみる
**メソッド**

```java
public class ThisIsSample {
	int res;
	private void calculate(int value1, int value2) {
		res = value1 + value2;
	}
}
```

**無名クラス**

```java
ThisIsSample printRunOut = new ThisIsSample() {
  public void prt() {
    System.out.println("sample");
  }
};
printRunOut.prt();
```

**ラムダ式**

```java
ThisIsSample printRunOut = () -> {
  System.out.println("sample");
};
printRunOut.prt();
```

やはりこれだけではよく分かりません。
**型推論**で省略を復元してくれている、までは分かるのですが、理解したとは言えません。やはり実践しないといけないようですが、今コンパイルが出来ません。（？）
ということで、追って記載したいと思います。

## 参考情報

[Java関数型インターフェース](http://www.ne.jp/asahi/hishidama/home/tech/java/functionalinterface.html)※ラムダ式のまとめもあり
[Java8ラムダ式の使い方の基本](https://www.task-notes.com/entry/20150418/1429359646)
[[Java] Java8のラムダに超入門（書き方、関数型インターフェース、独自に定義、ラムダ受け取り処理）](https://www.yoheim.net/blog.php?q=20160410)

**追記**
[Markdown記法 チートシート -Qiita](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
[Markdownで文書を書くためにやったこと一覧 -Qiita](https://qiita.com/tomokin966/items/7731a6337670f5de2342)
[Qiita マークダウン記法 一覧表・チートシート -Qiita](https://qiita.com/kamorits/items/6f342da395ad57468ae3)

時間がないので、ひとまず挙げときます・・・。
後日修正します。（Streamのこともまだよく分かっていない）

2019.7.16追記
自分は今までサーバー系とは縁がなく、小さな事務所でExcel/Access/VBAを弄ってきました。なぜ今Javaかと言いますと、Javaで構成されたRPAに触れたことで、Web以外で初めてサーバーサイドのシステムに親近感を持てたことが切っ掛けです。
~~いい加減な~~記事になってしまいましたが、生暖かく見て頂ますようお願い致します。
gitでローカルディレクトリをリポジトリにする

リポジトリを作成する

```
cd '/Volumes/【中略】/'
mkdir abc.git
cd abc.git
git init --bare
```

作業用ディレクトリで push, pull する準備をする

```
mkdir abc
cd abc
git init
git remote add origin '/Volumes/【中略】/abc.git'
git push --set-upstream origin master
```
SQL Server Management Studio 18.1 (SSMS)のインストール方法

##SQL Server Management Studioのダウンロード
#####◆SSMS 18.1(GA版) のダウンロード
ダウンロードは[こちら](https://go.microsoft.com/fwlink/?linkid=2094583)からどうぞ。

※プレビュー版の SSMS 18.0 がインストールされている場合は、それをアンインストールしてから SSMS 18.1 をインストールしてください。
GA版の SSMS 18.0 をインストールしている場合は、アンインストールせずとも18.1 にアップグレードされます。

#####◆注意事項
ダウンロードしたSSMS-Setup-JPN.exeをダブルクリックで実行し、インストール完了後に必ずPCの再起動を実施してください。

#####◆SSMSの概要
概要についてはこちらをご参考ください ⇒ [Microsoft](https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017)
pexpect使い方メモ

対話型プログラムのラッパーを作るときに使ったpexpectのメモ

```python
import pexpect
# 任意のコマンドを実行する子プロセスのインスタンスを生成
p = pexpect.spawn("some command")

# 任意の入力を行う
p.send("yes")
# 任意の入力＋改行を行う
p.sendline("yes")

# 指定した正規表現が表示されるまで待機する
p.expect(r"> ")

# expectがマッチしたときのインスタンス変数
data = {
    "正規表現にマッチした文字列より前に標準出力されていた文字列全て": p.before,
    "正規表現にマッチした文字列": p.after,
    "正規表現マッチ時、マッチした文字列より後に標準出力されていた文字列全て": p.buffer
}
```
SSH踏み台サーバをSOCKS Proxy風に使う

# はじめに
「操作端末」からネットワーク的に直接繋がっていないWebサーバ群に対してWebブラウザでアクセスする方法を記載する。

参考
https://linuxfan.info/ssh-dyamic-forward

# 操作端末の1080ポートをSSH踏み台サーバのlocalhost:1080へSSHポート転送
踏み台サーバを仮に172.16.1.1とする。

```
$ ssh user@172.16.1.1 -L 1080:localhost:1080
```

# SSH踏み台サーバで以下実行

```
$ ssh localhost -D localhost:1080 -N
```

# 操作端末のWebブラウザのProxy設定でlocalhost:1080をSOCKS Proxyに設定
注意点としてはHTTP Proxyなど他のProxy設定の箇所は空欄にしておく必要がある。
超初心者が書く！ Project Euler を Python で解いてみた！ Problem2

#problem2
学校でも勉強が進み、個人的にも少し勉強をしたので、今回は自分でコードを書いてみたいと思います。

##問題文

> フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.

>1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

>数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

という問題です。
最初の2項が 1 , 1 で始まらないんですね．．．

フィボナッチ数列とは何ぞや？ という方は [こちらへ](http://www.suguru.jp/Fibonacci/)

##方針
フィボナッチの偶奇を判定していけばいいんですね！　（そのまんまやんけ．．．）
a = b っていう文と、 b = a + b という文が出てきそうですね
とりあえず書いてみましょう。

##間違った解答&解説

```python:Fib
a = 1 
b = 2
result = 0
while b < 4*10**6:
    if b%2 == 0:
        result += b
        a = b
        b = a + b
print(result)
```

```
4194302
```
あれ？答えが違う．．．　（ちなみに答えは 4613732 です）

間違い探しをする前に初登場の関数の紹介です！

<details><summary>**ここを押すと while文 の説明がでるよ！**</summary>
whileとは．．．
while文は繰り返し実行をための文です。こんな書き方をします。
**while 繰り返しの条件：**
実際のコードで書くと
<div>

```python:while
n = 0
while n < 5:
    print(n)
    n += 1
```
</div><div>

```
0
1
2
3
4
``` 
</div>
このように「繰り返しの条件」に当たる箇所が**真**（正しい）のときに繰り返してくれます。</details>

ここから解説です。
前回もやった通り　１、２、３行目　で関数の宣言と代入を行っています。
４～８行目　で繰り返しの処理を行っています。
５行目　で偶数の判定、
６行目で result に偶数を合計していています。
７、８行目で肝心のフィボナッチ数列を作っているのですが、どうやらここに問題があるらしい．．．
初期の予定では

(a, b) = (1, 2) (2, 1+2) (3, 2+3) (5, 3+5) ．．．となる予定でしたが、実行してみると

(a, b) = (1, 2) (2, 2+2) (4, 4+4) (8, 8+8) ．．．と、上がっていってしまいました...

これは a = b を行った後に b = a + b を行っていため
　　　　　　　　　　　　 b = b + b をしているのとおんなじなんですね。(´･ω･｀)

どうにかしてこの処理が b = a + b として成り立たせることができればよさそうです。

##解答&解説

```python:Fibonacci_Sequence
a, b = 1, 2
result = 0
while b < 4*10**6:
    if b%2 == 0:
        result += b
    a, b = b, a + b
print(result)
```

```
4613732
```
ﾔﾀ━─━─ヽ(*´Д｀*)ﾉ─━─━!!!!

同時に変数の宣言と代入ができるのではないかとおもって直感で書いたらいけました！　[正規の方法ですのでご安心を（笑）](https://note.nkmk.me/python-multi-variables-values/)

しっかり a = b と b = a + b が行われていますね。

他の分は書き換えてないです。

##終わり
while文の使い方と代入の面白さが伝わっていれば幸いです！
fcitx + mozcで入力中の文字が表示されなくなったときには

## TL;DR
`Ctrl + Alt + P`でもとに戻る


## fcitx + mozcで入力中の文字が表示されない

LinuxでのIMEはFcitx + mozcがメジャーかなと思いますが、度々「入力中の文字がプレビューされない」という問題に直面します。

![Screenshot_20190716_140456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204734/f78a9caf-88e6-22c6-0640-33b99d9237fe.png)


この問題が発生してる人はやっぱりそこそこいるみたいで、調べると「Fcitx XIM Frontendのチェックを外したりつけたりする」とか「`~/.confg/fcitx`を削除して再起動」とか、「fcitxを消して再インストール」とかがヒットします。

確かにこれで治ることもあるのですが、治らないこともありなんだかよくわからないうちに治ってたりといまいち原因がわからず毎回トラブルシューティングに時間をかけてしまっていました。


## 原因
fcitxに「入力中の文字表示をオンオフするショートカット」がありました...
デフォルトで`Ctrl + Alt + P`に振られており、何かの拍子に押してしまってこの状態になっていたようです。

設定の削除だとか再インストールだとかで治ったケースはこのオンオフ状態が初期状態に戻っているから治っていたようで、逆にその状態が維持されたままだと何しても解決しません。

うっかり発動しても困るので、このショートカットを無効化しておきましょう。

Fcitxの設定から`Global Config`タブを選択し、「Show Advance option」にチェックを入れると詳細設定画面になります。
`Hotkey`タブに「Switch Embedded Preedit」という項目があるので、ここのショートカットを空にしてOKを押せば二度とこの現象は発生しなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204734/0286cd38-762d-d1c3-3535-678b5f9e85c0.png)

これを削除してEmptyにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204734/e02dc374-ea98-a674-32b5-d97743ebda17.png)


以上で完了です。


## おわりに
この機能いる...？
[nuxt.js] nuxt勉強してみた

nuxt使って何か作ってみよう　ということで、できるだけ後から何をやったかわからなくならないように項目ごとに区切ってまとめていきます。
※このページは随時更新予定

# 目次
[[nuxt.js その１]プロジェクトの作成と生成されるディレクトリ構成まとめ](https://qiita.com/yaiza/items/7bbee744e816ed3d98a6)
[[nuxt.js その２] 全体像の把握](https://qiita.com/yaiza/items/aaffc75feafb047b0b10)
[[nuxt.js その３] firebaseのセットアップ](https://qiita.com/yaiza/items/f53437a7ab3826c94590)
[[nuxt.js その４] ページとコンポーネントの作成（ログイン）](https://qiita.com/yaiza/items/dcb5d4d4167cc740b4f2)
[[nuxt.js その５] storeの実装](https://qiita.com/yaiza/items/80173d4540ba4d6577c6)
[[nuxt.js その６] middlewareによるナビゲーションガードの実装](https://qiita.com/yaiza/items/b8ffc8217edef657baf1)
[[nuxt.js その7] グローバルsnackbarの実装](https://qiita.com/yaiza/items/a710d20de30f3b6db5be)
[[nuxt.js その８] firestoreの利用](https://qiita.com/yaiza/items/67e624fac5370e393f1d)
Swift  Firebase  匿名ゲストログイン

Firebaseへ匿名ユーザーのログイン
Authenticationのログイン方法はmail/password, Anonymousを有効にする

```swift
   
 @IBAction func loginOutClicked(_ sender: Any) {
        
        guard let user = Auth.auth().currentUser else { return }
        if user.isAnonymous {
            presentLoginController()
        } else {
            do {
                try Auth.auth().signOut()
                Auth.auth().signInAnonymously { (result, error) in
                    if let error = error {
                        debugPrint(error)
                    }
                     self.presentLoginController()
                }
            } catch {
                debugPrint(error)
            }
        }
    }
```
simple_formatとrails_autolinkを掛け合わせて使うと便利


文字列の中からリンクを自動で生成してくれるgemの`rails_autolink`と改行で表示してくれる`simple_format`を掛け合わせてみた。

### rails_autolinkをインストール

```Gemfile.
  gem 'rails_autolink'
```

これで `bundle install`を実行する。


### 掛け合わせて使う

```show.html.erb

  <%= auto_link(simple_format(@user.description), html: {target: '_blank'}) %>
```

### helperとしてmethod作成
method名はお好みでネーミングすれば良いのですが、

```application_helper.rb
  def regular_format(arg)
    auto_link(simple_format(arg), html: {target: '_blank'})
  end
```

`regular_format`という名前で定義してあげれば、先ほどの`show`は

```show.html.erb
  <%= regular_format(@user.description), html: {target: '_blank'}) %>
```

こうしてあげると色々便利です。
ROS2に関する基本情報:初級 -ROS1 style-

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】
【[ROS2レクチャー:初級 -ROS1 style-](https://qiita.com/NeK/items/74e4bb9d1530e22a63fc)】

【次:[ROS2プロジェクトの作成]】

[ROS2プロジェクトの作成]:https://qiita.com/NeK/items/067bc227f706d7b8a2f3

より詳細は[こちら](https://qiita.com/NeK/items/18ff9e9c443295d5d805)

# ROS2の構造
## 用語

<dl>
<dt>ノード:node</dt>
<dd>ROS2における様々な機能を提供するもの．</dd>
<dt>ターゲット:target</dt>
<dd>nodeを組み込んで実行できるようにしたもの．</dd>
<dt>ライブラリ:library</dt>
<dd>nodeを共有ライブラリ化したもの．</dd>
<dt>パッケージ:package，プロジェクト:project</dt>
<dd>関係の深いターゲット，ライブラリを集めたもの．ros2 pkg createコマンドで作成．</dd>
<dt>ワークスペース:workspace</dt>
<dd>使用するパッケージを集めたトップディレクトリ．より具体的には「コンパイル・ビルドを行うディレクトリ」．もしパッケージディレクトリの中でコンパイル・ビルドを行うなら，ワークスペース=そのパッケージとなる．</dd>
<dt>アンダーレイ:underlayとオーバーレイ:overlay</dt>
<dd>ROS2が管理する領域．特に管理する全体の領域を<font color="Red">アンダーレイ:underlay</font>と呼び，source /opt/ros/&lt;distro&gt;/setup.bashで設定される．その中にworkspaceやpackageがある．
workspaceやpackageなど，切り替えて使用するもの/できるものを，アンダーレイに対して<font color="red">オーバーレイ:overlay</font>と呼ぶ．
</dd>
</dl>

# ROS2における実装スタイル
ROS2での実装スタイルを大別すると以下となる．

- ROS風node
    - 初級 -ROS1 style-の説明対象
- クラス化したnode
- 共有ライブラリ化したnode
- コンポーネント化したnode

## ROS風node
ROS風の実装方法だと，main関数の頭から，

1. ROS2システムのための初期化
1. nodeに関する設定．初期化やnodeの実行に必要な処理などを行う部分．
1. nodeを実行．下図ではwhileをつかって「ループして実行してます！」と表現しているけど，ROS/ROS2の通常ではspin()を使う．
1. 終了処理．nodeの実行が正しく終わったらちゃんと終了させないとね．

という流れとなる．

![ROS風PG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284261/360ce933-edff-701e-38bd-4e73a69b967a.png)

【次:[ROS2プロジェクトの作成]】
【GCE】Dokku に Laravel 環境を作る

Dokku のお手軽さが楽しくなってしまい、 Laravel も Dokku で運用したくなったのでメモ

# Laravel プロジェクトのインストールと前準備
## Laravel のインストール
`composer` のインストールについては「[Laravel 4.2 Laravelクイックスタート](https://readouble.com/laravel/4.2/ja/quick.html)」をみてください。

`composer` を使って Laravel をインストールする

```bash:bash
composer create-project laravel/laravel <プロジェクト名> --prefer-dist
```
## APP_KEY の作成

```bash:bash
cd <プロジェクト名> # プロジェクトディレクトリに移動
php artisan key:generate 
```
`/<プロジェクトディレクトリ>/.env` に記述されている `base64:` から始まるキーをコピーしておく

# Dokku をさわる

## GCE に接続する
`ssh` で GCE に接続する

```bash:bash
ssh -i <PATH_TO_PRIVATE_KEY> <USERNAME>@<EXTERNAL_IP_ADDRESS>
```
もしくは、 `gcloud` を利用している場合は
「インスタンス＞リモートアクセス＞`gcloud`コマンドを表示」からコピペして接続

## GCE に Dokku アプリを作成する
`laravel-dokku-app` って名前のプロジェクトを作ることにする

```bash:bash
dokku apps:create laravel-dokku-app
```

## APP_KEY を Dokku に設定する
```bash:bash
dokku config:set laravel-dokku-app <APP_KEY>
```
`APP_KEY` => 「APP_KEY の作成」の項目でコピーしたやつをコピペする

## Procfile と BUILDPACK_URL を設定する
Dokku は何も設定しないと Node.js プロジェクトと認識されるらしいので、
PHP を扱うために `Procfile` と `BUILDPACK_URL` とかいうやつの設定をする

### Procfile の作成
ローカル環境の Laravel プロジェクトのルートでやる

```bash:bash
echo 'web: vendor/bin/heroku-php-apache2 public/' >> Procfile
```

### BUILDPACK_URL の設定
GCE サーバー内でやる

```bash:bash
dokku config:set laravel-dokku-app BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-php
```

# Laravel を Dokku にデプロイする

```bash:bash
git init
git add .
git commit -m "first deploy"
git remote add dokku dokku@<外部IPアドレス>:laravel-dokku-app
git push dokku master
```
`外部IPアドレス` => インスタンス＞ネットワークインターフェース＞外部 IPの下にある数字をコピペ

おわり

**メモ: ポートを指定する場合はこうする**

```bash:bash
git remote add dokku ssh://dokku@<外部IPアドレス>:<ポート番号>/laravel-dokku-app
```

# 参考
How to deploy Laravel app on Dokku 
https://jiegersblog.blogspot.com/2017/06/how-to-deploy-laravel-app-on-dokku.html

setting permissions problem
https://github.com/dokku/dokku/issues/353

[Laravel5.5] APP_KEY の行方を追う
https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f
【Firebase Hosting】SPAなサイトでPage Not foundとでた

React.js(SPA)で構築したサイトをFirebase Hostingを用いてデプロイすると、
以下のように、`404 Page Not Found`と表示された。

<img width="1284" alt="スクリーンショット 2019-07-16 13.37.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270696/2dfb65e8-4daa-d5fe-88f1-ec960eb0a154.png">


firebase.jsonでのHostingの設定に問題があったらしい。

**変更前**

```firebase.json
{
  "storage": {
    "rules": "storage.rules"
  },
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

**変更後**

```firebase.json
{
  "storage": {
    "rules": "storage.rules"
  },
  "hosting": {
    "rewrites": [ {
      "source": "**",
      "destination": "/index.html"
    } ],
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```
これを追加した。

```js
"rewrites": [ {
"source": "**",
"destination": "/index.html"
} ],
```


参照：　[公式ドキュメント](https://firebase.google.com/docs/hosting/url-redirects-rewrites?hl=ja)
46日目。Javascriptで配列を作ってまとめて更新、メンテしやすくなりました。

品物のリストをずらっと表示しているホームページの改修をしています。
今後もしょっちゅう入れ替えがありそうなので

JavaScriptをつかってみました。
覚えたら使ってみたいじゃないですか！？


```test.js
const Targets = [
    ["butaman.png", "横浜", "ぶたまんケーキ","2019/07/11 11:00","出荷済み"],
    ["takoyaki.png", "大阪", "たこやきケーキ","2019/07/11 14:00","製造中"],
    ・・・
    （中略）
    ・・・
    ["higuma.png", "札幌", "ひぐまケーキ","2019/07/12 11:00","スタンバイ"]
]

let str = "";
for (i=0; i<Targets.length; i++ ){
    Target = Targets[i]
    str = str  + `<div class='frame'>`;
    str = str  + `<img class='left'  src="${Target[0]}" >`;
    str = str  + `<div class='store'>${Target[1]}</div>`;
    str = str  + `<div class='prod'> ${Target[2]}</div>`;
    str = str  + `<div class='time'> ${Target[3]}</div>`;
    str = str  + `<img class='right' src="${Target[4]}">`;
    str = str  + `</div>`
}

const firstscript = function() { 
   document.getElementById('eid').innerHTML = str;
};

window.addEventListener("DOMContentLoaded", firstscript);
```

品目がたくさんあると更新が大変！
HTMLにずらっと書かれていたものを、配列にまとめて更新しやすくしてみました。
これをforでくるくる回してHTMLに返しています。


[JavaScriptでHTMLを書き換えよう！](https://qiita.com/n_oshiumi/items/5795de01187d5aafca07)

`document.getElementById`だけだと更新されなかったので`addEventListener`で開いたときに起動させています。
[【JavaScript入門】addEventListener\(\)によるイベント処理の使い方！](https://www.sejuku.net/blog/57625)



最初はPHPでフォームを作ってと考えたのですが、サーバーのメンテが難しそうなので見送り。

次にCSVファイルを読み込む作戦を試したのですが、Chromeではセキュリティ上原則禁止。見送りました。

onclick()でコンテンツを変えられないかな？と思ったのですが、複数箇所のクリック画像がぜんぶ同時に更新される謎現象がわからなくて見送り。

[Javascriptでローカルファイル\(file://\)を読み込んでみる](https://qiita.com/otakeuchi/items/fbd5f1771c56ddd0d708)

[Chromeでcsvを開きたい　発生している問題・エラーメッセージ  XMLHttpRequest cannot load file:///D:/test/Book1\.csv\. Cross origin requests ar](https://teratail.com/questions/37254)

[【JavaScript入門】すぐわかる！画像を切り替える方法](https://www.sejuku.net/blog/63834)

あきらめて一行ずつコツコツ更新を進めつつ
Progateを復習してみたら配列に変数をどんどん入れて、forでくるくる回す方法がちょうど出てきました。さっそく使ってみたらいい感じになりました。

この方法にたどりつくまでが、えらい大変でした。。。

所要時間
・PHPで試作・・・２時間
・CSV方式の試作・・・１時間
・onclickの試作・・・１時間
・Progate Javascript1,2の復習・・・１時間
・配列に格納、forで回す・・・１時間
0.1ぐらいから始めるProjectEuler@python　Problem 4

どもども、最近疲れやら悩み事やらが増えているとある学生です。
というわけで、4問目書いていきます。
（3問目はちょっと難しかったのでいったん飛ばします。頭いい人ヒントください）

```python:Problem_4.py
#左右どちらから読んでも同じ値になる数を回文数という. 
#2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.
#では, 3桁の数の積で表される回文数の最大値を求めよ.
max_num = 1000
max_ans = 0
for i in range(100, max_num):
    for j in range(100, max_num):
        num = i * j
        num_str = str(num)
        if num_str == num_str[::-1] and num > max_ans:
            max_ans = num
print(max_ans)
```
解　906609
はい、私はこう書きました。
####解き方の解説をしていきます。
最初のグローバル関数2つが問題に書いてある最大数と、答えを入れる用の箱です。
後は、100から1000までi * jをしつつ、掛け算をして出たものと、それを逆にしたものが同じで、numより大きければその答えをprintする感じです。

こんな感じですかね？もしわからないやアドバイス等あればコメントしていただければと思います（答えるとは言っていない）
というわけで気が向いたら次のも見てってください。よろしくお願いします。
眠いのでElixirでズンドコキヨシのねむいバージョンを書いた

```elixir:nemui.exs
defmodule Nemui do

  @nemui ~w(ね む い)

  def nemui() do
    nemui(zzz(), "")
  end

  def nemui(s, "いむね" <> _ = acc) do
    IO.puts acc |> String.reverse
  end

  def nemui(s, acc) do
    nemui(zzz(), s <> acc)
  end

  def zzz() do
    @nemui
    |> Enum.take_random(1)
    |> List.first
  end
end

Nemui.nemui()

```

```
$ elixir ~/nemui.exs
いむねいねねいねねねねねむむむむむむねねねねねいいむむいむねいねいいむむいむねむい
```



仕事中眠すぎたので眠気ざま・・・し・・・に :zzz:
Ubuntu18.04LTSにNode-REDをインストールして立ち上げる

## SnapでNode-REDをインストールする
```
# snap install node-red
```

## Node-REDを起動する
```
# snap start node-red
```

以降は、 ```http://<IPアドレス または FQDN>:1880/ ``` へWebブラウザからアクセスすることでNode-REDが利用可能です。
あなたのWEBサイトを爆速でダークモードにする(Darkmode.js)

## はじめに
macOS Mojaveからダークモードが搭載され、i0S13でもダークモードが採用される予定です。流行っているこのダークモードは、省エネ・目に優しいといったメリットがあるそうですが、個人的には、単純に「かっこいい」と思っています。（素人から見ると、「こいつ・・できるな・・」を演出してくれる、と勝手に思っています）

## 爆速でWEBサイトをダークモードに　Darkmode.js
アプリによっては、すでにダークモードや黒背景ができるようになっているものがありますが、自分のWebサイトを爆速でダークモードにしてくれる [Darkmode.js](https://darkmodejs.learn.uno/) というのを見つけましたので、やってみました。

といってもメチャクチャ簡単で、たったの4行。

CSS: mix-blend-mode を使用しているとのことなので、[Can I USE](https://caniuse.com/) でサポートを調べておくとよいかと思います。

### 追加するコード
~~~sample.html
<script src="https://cdn.jsdelivr.net/npm/darkmode-js@1.3.4/lib/darkmode-js.min.js"></script>
<script>
  new Darkmode().showWidget();
</script>
~~~

### オプション
~~~sample.html
<script src="https://cdn.jsdelivr.net/npm/darkmode-js@1.3.4/lib/darkmode-js.min.js"></script>
<script>
  var options = {
    bottom: '64px', // default: '32px'
    right: 'unset', // default: '32px'
    left: '32px', // default: 'unset'
    time: '0.5s', // default: '0.3s'
    mixColor: '#fff', // default: '#fff'
    backgroundColor: '#fff',  // default: '#fff'
    buttonColorDark: '#100f2c',  // default: '#100f2c'
    buttonColorLight: '#fff', // default: '#fff'
    saveInCookies: false, // default: true,
    label: '🌓', // default: ''
    autoMatchOsTheme: true // default: true
  }

  const darkmode = new Darkmode(options);
  darkmode.showWidget();
</script>
~~~

### サンプル
#### サンプル1
[Darkmode.js](https://darkmodejs.learn.uno/)
![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/d693787d-a2f8-7a2c-4a6f-0dca0f2ce59d.gif)

#### サンプル2
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/bf51b4a1-be50-05c1-11a2-999d6ff36418.gif)

#### サンプル3
[こちらの記事](https://qiita.com/yoshi_yast/items/1f48337a7caed143f07b)のWEBサイトに設置
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/fa4ba84d-33d8-4c53-118f-4c3c25b8431e.gif)

## 余談
Qiitaタイトルに「爆速」をつけるのに、とても憧れていたので、今回使ってみました。。

## 参照URL

https://coliss.com/articles/build-websites/operation/javascript/add-dark-mode-to-your-site.html
[AWS] EMR調査メモ

# EMR

- [公式](https://aws.amazon.com/jp/emr/)
- Amazon EMR は、業界をリードするクラウドネイティブなビッグデータプラットフォームです。大規模環境で大量のデータを迅速かつコスト効率よく処理できます

> 公式HPから引用

# クラスター作成

1. クラスター名を入力
2. ログ記録するかチェック
    - 今回はログ記録しない
3. 起動モードは「クラスター」を選択
4. リソース選択
    - `emr-5.24.1` を選択
5. アプリケーション
    - `Core Hadoop: Hadoop 2.8.5 with Ganglia 3.7.2, Hive 2.3.4, Hue 4.4.0, Mahout 0.13.0, Pig 0.17.0, and Tez 0.9.1`
6. インスタンスタイプ
    - `m3.xlarge`
7. インスタンス数
    - 1
8. EC2キーペア
9. アクセス権限
    - デフォルト

# EC2ログイン

- 上記で指定したキーペアの権限を「400」に変更
- EMR用のEC2インスタンスを確認しログインする
    - ex) `ssh -i "xxxx.pem" ec2-user@xxxx.xxxx.compute.amazonaws.com`

# S3DistCp

- [ドキュメント](https://docs.aws.amazon.com/ja_jp/emr/latest/ReleaseGuide/UsingEMR_s3distcp.html)
- S3に対する様々な操作が可能
    - 複数ファイル集約
    - 圧縮
- [使用方法7つのヒント](https://aws.amazon.com/jp/blogs/news/seven-tips-for-using-s3distcp-on-amazon-emr-to-move-data-efficiently-between-hdfs-and-amazon-s3/)

## ファイル集約

```
s3-dist-cp --src /data/incoming/hourly_table --dest s3://my-tables/processing/daily_table --targetSize=10 --groupBy=’.*/hourly_table/.*/(\d\d)/.*\.log’
```
俺のArduinoで室温管理ができるわけがない

##説明
ソースとREADMEはGithubに置いてます。

https://github.com/SHdragons/arduino-proper-temperature-jp

##使用環境

開発はWindowsで行いましたが、Macでも同じ手順で行けると思います。

Arduino IDE
Arduino Uno R3
温度センサ DS18B20
10kΩ抵抗
LED (閾値確認用)

回路図は以下を参照（Figure 4 を参考に実装）
http://akizukidenshi.com/download/ds/maxim/DS18B20.pdf

図では4.7kΩ抵抗が使用されてますが、所持してなかったので10kΩ抵抗を代用しました。
Maya | 複数のobjファイルをインポートする

スクリプトを実行すると、ファイル選択ダイアログが表示されます。
インポートしたいobjを複数選択して、一度にインポートできます。

```python
import maya.cmds as cmds

files = cmds.fileDialog2(dialogStyle=1, fileMode=4, fileFilter='*.obj', caption='OBJファイル選択')
if files:
    for f in files:
        cmds.file(
            f,
            i=True,
            type="OBJ",
            ignoreVersion=True,
            renameAll=True,
            mergeNamespacesOnClash=False,
            namespace="c1",
            options="mo=1;lo=0",
            preserveReferences=True,
            importFrameRate=True,
            importTimeRange="override")
```
Gitlab RunnerをPrometheusで監視する

# モチベーション

---

## Gitlab CI Runnerのトラブルにいち早く気づきたい
- zabbixでもいいけど、監視対象に対してプロダクトが大きすぎる感
- gitlabがprometheus対応を前面に出している
  - 1バイナリを監視対象にデプロイするだけ -> 楽そう

---

## Runnerをオートスケールしたい
- Runner上で稼働しているJobの数等を分析したうえで適切にスケールさせたい

## 流行ってる
- 流行ってる

---

# Prometheusとは
[Prometheus](https://prometheus.io/)

---

# Prometheus Server
[INSTALLATION](https://prometheus.io/docs/prometheus/latest/installation/#using-docker)を参考に

---

### とりあえず立ち上げる
```shell
docker run -p 9090:9090 prom/prometheus
```

[http:://localhost:9090/](http:://localhost:9090/)

---

![コメント 2019-07-09 202144.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314367/a2791c3e-dcf0-de29-625f-00b278393fba.png)

---

### config使いたい
手早く進めたかったので、手元にソース用意して進めます。

[Building from source](https://github.com/prometheus/prometheus#building-from-source)に従って、

---

```shell
$ mkdir -p $GOPATH/src/github.com/prometheus
$ cd $GOPATH/src/github.com/prometheus
$ git clone https://github.com/prometheus/prometheus.git
$ cd prometheus
$ make build
$ ./prometheus --config.file=prometheus.yml
```

---

### Gitlab Runner
今回はAWS LightsailにRunnerをセットアップしました。Ubuntu 18.04を使用。
[Install GitLab Runner using the official GitLab repositories](https://docs.gitlab.com/runner/install/linux-repository.html)を参考に進めます。

---

#### インストール&起動

```shell
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
$ sudo apt install gitlab-runner
```

---

#### Runnerの状態を確認

```shell
$ sudo gitlab-runner status
```

---

#### Runnerをレポジトリに登録

```shell
$ sudo gitlab-runner register
```

プロンプトでURLとかTokenの入力を要求されるので進めると登録完了します。

---

#### Runnerの/metricsを有効にする
Gitlab Runnerのconfigファイルである `config.toml` を以下のように編集します

```toml:config.toml
concurrent = 4
check_interval = 0
listen_address = "${ip or hostname}:${port}"

# 以下略
```

今回私はIPアドレスを登録を利用しようとしましたが、LightsailだとPrivate IPを `listen_address` フィールドには入れなければならなかったです。

---

### Prometheusの設定
```yaml:prometheus.yml
scrape_configs:
  - job_name: 'gitlab'
    static_configs:
      - targets: ['${ip or hostname}:${port}']
```

```shell
$ ./prometheus --config.file=prometheus.yml
```
実行後、[http:://localhost:9090/](http:://localhost:9090/)にアクセス、`Status->Targets`で

---

![コメント 2019-07-10 012351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314367/941c2080-5f92-0947-76bd-16c1229db374.png)

---

あとはPromQLでデータを加工すれば、というところです。

一番時間がかかったのがGitlab RunnerのConfigで、PrometheusのConfigにはほとんど時間を使っていないという...認証やアラートなど必要なものは自分で後付しなければいけませんが、土台がこんなに簡単なのは流石だなと思います。

---

### 展望
認証やアラートの追加、Grafanaできれいなグラフを表示したいです。
深層学習（後編 2）：「Section2 : 強化学習」

強化学習とは、長期的な観点で、得られる報酬を最大化できる環境の中で行動を選択できるエージェントを作成することを目的とした機械学習の一分野。行動の結果として得られる報酬を学習し、行動を決定する原理を改善していく仕組みである。過去のデータでベストとされる行動のみとり続けると他にもっとよい行動を見つけることができない（探索がたりない）。一方未知の行動のみとり続ければ、過去の経験を生かせない（利用がたりない）。これらの関係性を探索と利用のトレードオフと呼び、これを最適化するのが強化学習である。