OmniAICreator/Qiita-1.07M huggingface dataset:
node.js,express,yarn,postgresql,sequelizeのインストールコマンド集

#動作環境
ホストos：win10
ゲストos：ubuntu
virtualbox：5.2.34
Vagrant 2.2.5

以上の条件ではなくとも仮想化が終えられている方であれば以下のインストールは問題ないかと思われます。


#node.jsのインストール
まずnode.jsのバージョン管理をするnvmをインストールし、nvmを使ってnode.jsをインストールします。

nvmインストールコマンドの引用元
>https://github.com/nvm-sh/nvm

```terminal
$curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

以下のコマンドで変更を反映させます。
$source ~/.bashrc
```

node.jsインストールコマンドの引用元

```terminal
nvm install --lts
nvm use --lts
```

#yarnインストールコマンドの引用元
JavaScriptのパッケージマネージャであるyarnをインストールします。

yarn公式
>https://yarnpkg.com/ja/docs/install#alternatives-stable


```terminal
yarnをインストール
$curl -o- -L https://yarnpkg.com/install.sh | bash
$source ~/.bashrc
```

#expressインストールコマンドの引用元
node.jsのフレームワークであるexpressをインストールします。

express公式
>https://expressjs.com/en/starter/installing.html

```terminal
expressをインストール
$yarn add express

パッケージインストール
yarn install
```
#postgresql
DBに今回はpostgresqlを使用します

postgresqlインストールコマンドの引用元
>https://www.postgresql.org/download/

```terminal
postgresqlをインストール
$sudo apt install -y postgresql
```
#sequelize
DBをexpressで使うためにsequelizeをインストールします。

sequelizeインストールコマンドの引用元
>https://yarnpkg.com/en/package/sequelize


```terminal
sequelizeのインストール
yarn add sequelize
yarn add pg
yarn add pg-hstore
```
【RSpec】テストの際、日付・時刻フォーム(datetime_select)に値を入力する

参考サイト:https://gist.github.com/lbspen/5674563

#はじめに
Capynaraを用いて、RSpecテストの際日付時刻フォームに値を入力する方法をメモします。
フォームに入力するためのヘルパーを定義し、それをRSpecで利用する、という方法をとります。

#実行環境
この記事は以下の環境で動作確認しています。
ruby (2.3.7)
rails (5.2.3)
capybara(3.15.1)
rspec-rails(3.8.2)

#ヘルパーの作成
ビュー側で、

```ruby
<%= f.label :start_at, "開始時間" %>
<%= f.datetime_select :start_at %>
```

上記のフォームを定義すると、
id="モデル名_start_at_1i"　(年を入力)
id="モデル名_start_at_2i"　(月を入力)
id="モデル名_start_at_3i"　(日を入力)
id="モデル名_start_at_4i"　(時を入力)
id="モデル名_start_at_5i"　(分を入力)
というIDを持つフィールドが作成されます。それぞれのフィールドに値を入力するようなヘルパーを以下のように作成します。

```spec/support/select_date_helper.rb
module SelectDateHelpers
  def select_date(date, options = {})
    field = options[:from]
    base_id = find(:xpath, ".//label[contains(.,'#{field}')]")[:for]
    year, month, day = date.split(',')
    select year,  :from => "#{base_id}_1i"
    select month, :from => "#{base_id}_2i"
    select day,   :from => "#{base_id}_3i"
  end

  def select_time(hour, minute, options = {})
    field = options[:from]
    base_id = find(:xpath, ".//label[contains(.,'#{field}')]")[:for]
    select hour, :from => "#{base_id}_4i"
    select minute, :from => "#{base_id}_5i"
  end
end
```

rails_helperで以下のコードがコメントインされていることを確認します

```spec/rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }
```

さらに、上で作成したヘルパーをincludeします

```spec/rails_helper.rb
RSpec.configure do |config|  
  ︙
  config.include SelectDateHelpers
end
```

#ヘルパーの利用
作成したヘルパーを、RSpecテストで利用します。
以下のように書くことで、前述の入力フォームに日付、時刻を入力できます。

```ruby
select_date("2019,9,28", from: "開始時間")
select_time("13", "00", from: "開始時間")
```

これで、開始時間のフォームに 2019年9月28日13時00分 が入力されたことになります。
入力フォームにあらかじめ値が入っているかチェックするテスト

#はじめに
予約画面などのフォームを作る際、
何かしらの値(ログインユーザー名など)があらかじめ入力されていてほしい、という場面が出てきました。

フォームにあらかじめ値が入っていることをRSpec+Capybaraを使ってテストしましたので、そのやり方をメモします。

#実行環境
この記事は以下の環境で動作確認しています。
ruby (2.3.7)
rails (5.2.3)
capybara(3.15.1)
rspec-rails(3.8.2)

#テスト方法
ビュー側で以下のフォームが定義されているとします。

```ruby

<%= form_for(@booking, url: new_booking_path) do |f| %>
  <%= f.label "名前" %>
  <%= f.text_field :name, value: (current_user.name if user_signed_in?), id: "name" %>
・・・
<% end %>
```

この場合、ログインユーザー名があらかじめ名前フォームに入っているはずです。
以下のコードを用いて、この状態をテストできます。

```ruby
expect(find_field('name').value).to eq "John"
```

"name"のフィールド要素を持つフォームに"John"と入力されているかテストしています。
"John"の部分はテストしたい内容に合わせて適宜変えてください。
【Rspec】非表示要素をCapybaraで検出する方法

参考サイト：[非表示要素はCapybaraのfindで検索対象になるのか](https://qiita.com/upinetree/items/4d4022c90ce32b68c38d)
　　　　　　[RSpec Capybara 非表示な要素のテストにハマる](https://chaika.hatenablog.com/entry/2019/10/08/083000)

---
この記事は以下の環境で動作確認しています。
ruby (2.3.7)
rails (5.2.3)
capybara(3.15.1)
rspec-rails(3.8.2)

---

カーソルをあてないと表示されない要素や、display: none で非表示にしている要素は

```ruby
expect(find('field')).to have_content('hoge') #非表示要素を検出できない
```

のような方法では検出できません。
have_selector, およびvisibleオプションを用いることで、上記のような非表示要素を検出できるようになります。

```ruby
expect(find('.field', visible: false)).to have_content ('hoge') #非表示要素を検出できる
expect(page).to have_selector ('.field',visible: false, text: 'hoge') #非表示テキストを検出できる
expect(find('.field', visible: false)).to have_selector ('.field',visible: false, text: 'hoge') #非表示のcss要素から、非表示テキストを検出できる
```
Docker Desktop on Macでは複数アーキテクチャのバイナリが動くけど仕組みがわかってない

自分用の調査メモです。


# Docker Desktop on Macでは複数アーキテクチャのバイナリが動く

表題の通りなんですが、Docker Desktop on Mac環境ではarm、aarch64(ARM 64bit)、ppc64leのバイナリが動きます（s390xも動きそうだけど未検証）。

早速実験してみましょう。Goでhello worldを書いて色々なアーキテクチャ用のバイナリを作り、Dockerコンテナ上で実行してみます。

```
$ docker run -v $(pwd):/opt -w /opt -it debian:stretch /bin/bash
root@713e373405ca:/opt# uname -a
Linux 713e373405ca 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 GNU/Linux
root@713e373405ca:/opt# ./hello.arm
hello, world
root@713e373405ca:/opt# ./hello.arm64
hello, world
root@713e373405ca:/opt# ./hello.ppc64le
hello, world
```

x86_64環境なのにarm, arm64, ppc64leのバイナリが動作しています。

これ以外にmips, mipsle, ppc64のバイナリも用意したんですが、これは動きませんでした。

別アーキテクチャのバイナリはQEMUのuser emulationで動いています。実際、上記プログラムが動いているタイミングでpsコマンドを実行すると次のように表示されます。

```
root@713e373405ca:/opt# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18128  3148 pts/0    Ss   05:14   0:00 /bin/bash
root         6  0.1  0.6 4509084 13836 pts/0   Tl   05:14   0:00 /usr/bin/qemu-arm ./hello.arm
root       278  0.0  0.1  36632  2876 pts/0    R+   05:15   0:00 ps aux
```

ここで表示されている`/usr/bin/qemu-arm`はコンテナ上には存在しないファイルです。ホスト側で実現されているのかもしれません。

```
root@713e373405ca:/opt# ls -la /usr/bin/qemu-arm
ls: cannot access '/usr/bin/qemu-arm': No such file or directory
```

また、コンテナ上では特にbinfmtの設定もされていないようです。やはりホスト側で何か細工しているんだと思います。

```
root@713e373405ca:/opt# ls -la /proc/sys/fs/binfmt_misc/
total 0
dr-xr-xr-x 2 root root 0 Oct 27 05:16 .
dr-xr-xr-x 1 root root 0 Oct 27 05:16 ..
```

## Docker Desktopは複数アーキテクチャをサポートしているらしい

以下、[Leverage multi\-CPU architecture support \| Docker Documentation](https://docs.docker.com/docker-for-mac/multi-arch/) より

> Docker Desktop provides binfmt_misc multi-architecture support, which means you can run containers for different Linux architectures such as arm, mips, ppc64le, and even s390x.

詳細の仕組みはわかりませんが、Docker Desktopではbinfmt_misc+QEMUで複数アーキテクチャのサポートをしているとのことです。

これは上の実験結果とも一致します。

## Linux上の素のDockerでは別アーキテクチャのバイナリは動かない

同じコンテナと同じバイナリをLinux環境のDockerで動かしてみたのですが、こちらはエラーが出て動きませんでした。

```
standard_init_linux.go:211: exec user process caused "no such file or directory"
```

念のため、ホスト側でbinfmt+QEMU user emulationによりARMバイナリを動かせるようにしてみたのですが、やはりコンテナ上ではARMバイナリは動きませんでした。ホスト側だけではなく、Dockerのレイヤでも何かの細工が必要なのかもしれません。

コンテナ側でbinfmt+QEMUの設定をすれば動くと思うんですが、可能なら実機と同じコンテナを動かしたいですよね。そんなことが可能なのかどうかはよくわかっていません。（Docker Desktopでは実現できているので可能不可能で言えば可能だと思うんですが）
バッチの管理者実行とダブルクリックの違い

## 管理者実行周りの説明

Windowsに管理者権限を持ったユーザでログインし、GUIで操作を行います。そのとき、管理者権限が不要な操作は標準ユーザー権限で実行され、管理者権限が必要な操作は、ダイアログで確認が行われた上で、管理者権限で実行されるという仕様です。

管理者権限を持つユーザ
![administrator_account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/7e84064b-bf1d-1561-8f0b-81bc76778e4f.png)

管理者実行の確認ダイアログ
![admin_requirement.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/6ebceef1-484a-f194-f5f4-5fdfed9e82e7.png)

これは、マルウェアなどがOSに変更を加えないようにするための仕様で、Windows Vista以降の標準になっています。

では、バッチの操作の場合はどうなるのでしょうか？
バッチは無人で実行されるので、管理者権限が必要な操作が出てくるたびに確認ダイアログを表示しても、確認できる人がいません。そのため、管理者実行を行うかどうかをバッチ起動時に決める仕様になります。

- ダブルクリックだと、標準ユーザー実行
- 右クリック→管理者として実行 だと、管理者実行
![admin_exec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298692/e0cccff5-85aa-fa89-c1a0-bf787669f987.png)


なお、バッチ起動で管理者実行を強制させる方法については、以下の記事を参照ください。
[管理者権限でbatを実行したい時にやッた事](https://qiita.com/resolver/items/7187bd6ee8016ee5c741)

## バッチの管理者実行のメリット
以下に挙げるのは、バッチの管理者実行ではできるが、ダブルクリックではできない操作です。

### 管理者（Administratorsグループ）のアクセス権による操作
C:\Windows、C:\Program Filesなどの配下は、Administratorsグループはフルコントロールですが、Usersグループは読み取りと実行権限しか与えられていないケースが多いです。
したがって、C:\Program Files内の設定ファイルを上書きコピーしようとした場合などは、バッチを管理者で実行する必要があります。

### レジストリの操作
管理者実行だとレジストリ操作ができます。

例）最近使ったファイルの表示を有効化


```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" /v "ShowRecent" /t "REG_DWORD" /d "1" /f
```

### 管理者コマンドが使える
管理者しか実行できないコマンドが使えます。

例）windows updateで使うプロキシ設定をieからインポート

```
netsh winhttp import proxy source=ie
```



## バッチのダブルクリック実行のメリット

以下に挙げるのは、バッチの管理者実行ではできないが、ダブルクリックではできる操作です。

### カレントフォルダがバッチのフォルダになる

ダブルクリックの場合、カレントフォルダはバッチのフォルダになります。
管理者実行の場合、カレントフォルダがC:\Windows\System32になります。

そのため、以下のtest.batを管理者実行すると正しく動作しません。ダブルクリックだと正しく動作します。

D:\test\test.bat
D:\test\test.ps1



test.bat

```
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 > .\test.log
```

test.ps1

```
write-host "test"
```

管理者実行で動作できるようにするには、バッチにバッチのあるフォルダへの移動を追加します（ただし、jmeter.batなどダブルクリックで起動するしかないバッチもあります。）

test.bat

```
pushd %~dp0
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1 > .\test.log
popd
```
scikit-learnを使用した主成分分析(PCA)

#はじめに
こんな方にオススメ。
・説明変数の特徴量大小を把握したい
・前処理でデータの次元削減対象を知りたい
・すぐ動かせるサンプルースが知りたい

#ソース
```py
import numpy as np
import pandas as pd
import urllib.request 
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn
from sklearn.decomposition import PCA #主成分分析器
from sklearn.datasets import load_iris

# データセット読み込み
iris = load_iris()
df=pd.DataFrame(iris.data, columns=iris.feature_names)
# アヤメの種類を列末に追加(3種類)
df["CLASS"]=iris.target
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/c38a3226-034b-5a34-50e1-43139f66d414.png)

```py
# 説明変数の組み合わせとアヤメの種類をプロット
from pandas import plotting 
plotting.scatter_matrix(df.iloc[:, 0:4], figsize=(8, 8), c=list(df.iloc[:, 4]), alpha=0.5)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/09e683c3-228a-a4ed-7287-159612555f29.png)

```py
# 行列の標準化
dfs = df.iloc[:, 0:4].apply(lambda x: (x-x.mean())/x.std(), axis=0)
dfs.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/bdeabfd9-5933-df58-6e0c-d8b0f7ce4256.png)

```py
#主成分分析
pca = PCA()
pca.fit(dfs)
feature = pca.transform(dfs)

# 標準化後のプロット
from pandas import plotting 
plotting.scatter_matrix(pd.DataFrame(feature, 
                        columns=dfs.columns), 
                        figsize=(8, 8), c=list(df.iloc[:, 4]), alpha=0.5) 
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/b994a142-d8ea-11cf-6236-36e1c0fb11e0.png)

```py
# 寄与率算出
f_df = pd.DataFrame(pca.explained_variance_ratio_, index=dfs.columns)
f_df.columns=["Feature"]
# アヤメの種類は、第二主成分までで約95%の情報を説明できる
# よって、第三、第四主成分は削減しても影響は小さいと言える
f_df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/195e0ec5-e9b0-b5fe-3fc4-32aef51daf0a.png)

```py
# 円グラフ表示
plt.pie(f_df, labels=f_df.index, autopct="%1.1f%%", startangle=90, counterclock=False)
plt.legend()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439049/729550c0-a2eb-20ec-c8d7-051f8c9e42b9.png)


```py
# 第一主成分と第二主成分でプロット
plt.figure(figsize=(6, 6))
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, c=list(df.iloc[:, 4]))
plt.grid()
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()
```

# 参照
https://qiita.com/maskot1977/items/082557fcda78c4cdb41f
サーバーの基本情報をPowerShellやコマンドプロンプトで取得・変更するコマンド | 新人SEの備忘録

SE界隈では分厚いドキュメントの作成が必須です。
設計書にはOSや日付の情報など、サーバーの基本的な情報を写経する作業が必要です。
作業に数時間必要なのでPowerShellで自動化したい、というのが僕のスタンスです。

なのでこのページにサーバーの基本情報をPowerShellで取得したり、変更したりするコマンドに関するサイトのリンクを、バシバシ貼り付けていこうと思います。

---
#【日付 | Powershell】
Get-Date で情報を取得。
-Format で出力情報を成形できる。
月はMMで表示しなければいけないので注意（mmは分を表示）。

```
# exsample [Get-Date]
PS C:\> Get-Date
2019年10月28日 12:37:48

PS C:\> Get-Date -Format "yyyy/MM/dd"
2019/10/28
```

PowerShellで現在の日付や時刻を取得する方法とは？フォーマットの変更は？ | チェシェわら
https://cheshire-wara.com/powershell/ps-cmdlets/system-service/get-date/

---
#【ホスト名 | Powershell】
$Env:COMPUTERNAME で情報を取得。
Rename-Computer で変更。（管理者権限が必要）
-NewName "newhostname" でnewhostnameに変更。（管理者権限が必要）
-Restart でPCを強制的に再起動。（管理者権限が必要）
ホスト名は小文字・大文字の区別なし。全て大文字になる。

```
# exsample [$Env:COMPUTERNAME]
PS C:\> $Env:COMPUTERNAME
OLD

# exsample [Rename-Computer]
PS C:\> Rename-Computer
コマンド パイプライン位置 1 のコマンドレット Rename-Computer
次のパラメーターに値を指定してください:
NewName: NEWHOSTNAME
警告: 変更は、コンピューター OLD の再起動後に有効になります。

PS C:\> Rename-Computer -NewName "NEWHOSTNAME"
警告: 変更は、コンピューター OLD の再起動後に有効になります。
```

PowerShell でコンピューター名を変更する | アプ研
https://www.upken.jp/kb/powershell-changecomputername.html

---
#【ファイアウォール | コマンドプロンプト】
ドメイン、プライベート、およびゲストまたはパブリックの3つを一括で無効化するコマンド
netsh advfirewall set allprofiles state off （管理者権限が必要）

有効化も可能
netsh advfirewall set allprofiles state on （管理者権限が必要）

```
# exsample [netsh advfirewall set]
c:\>netsh advfirewall set

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
set allprofiles - すべてのプロファイルにあるプロパティを設定します。
set currentprofile - アクティブなプロファイルにあるプロパティを設定します。
set domainprofile - ドメイン プロファイルにあるプロパティを設定します。
set global     - グローバル プロパティを設定します。
set privateprofile - プライベート プロファイルにあるプロパティを設定します。
set publicprofile - パブリック プロファイルにプロパティを設定します。

c:\>netsh advfirewall set allprofiles state off
OK

```
コマンドでのWindowsファイアウォールの無効化 | 俺的備忘録 〜なんかいろいろ〜
https://orebibou.com/2014/01/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%81%AEwindows%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96/

---
#【リモートデスクトップ | コマンドプロンプト】
下記のコマンド"x"の値を変更する。
0で有効化、1で無効化。

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d "x" /f （管理者権限が必要）

```
# exsample [ ]
C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d "0" /f
この操作を正しく終了しました。

C:\>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d "1" /f
この操作を正しく終了しました。

```
リモートデスクトップの有効化・無効化を簡単に切り替えるbatファイル
 | Widowsの機能紹介・トラブル対応の備忘録
http://long-distance.jp/sb/log/eid47.html

---
#【ローカルセキュリティポリシー | コマンドプロンプト】
色々変更できるが、今回はパスワードの有効期限について記載。
下記の参考サイトでは、パスワード有効期限以外の設定方法も記載されています。

"有効期限"に有効期限に設定したい日数を数字で入力する。
net accounts /maxpwage:"有効期限" （管理者権限が必要）

```
# exsample [net accounts]
C:\>net accounts /maxpwage:60
コマンドは正常に終了しました。

C:\>net accounts /maxpwage:0
ユーザー アカウントのパスワード変更禁止期間は
パスワード有効期間より短くなければなりません。

NET HELPMSG 3816 と入力すると、より詳しい説明が得られます。
```
ローカル セキュリティ ポリシーのパスワードの有効期限の設定をコマンドで変更する方法【共通編】 | Windows 自動化技術大全
https://automationlabo.com/wat/?p=7955
オライリー「入門監視」まとめ

# 概要
初めてサービスを公開するにあたって、障害対策のために監視を強化することになり、[入門　監視](https://www.oreilly.co.jp/books/9784873118642/)を読むことで監視に関して知見をつけることにしました。この本の内容についてまとめます。対象として後半の「何を監視すべきか、なぜ監視すべきなのか、どうやっって監視するのかといった監視の戦略」についての内容をまとめます。

![begin-kanshin-orailly-half.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/9ba04951-6224-3d68-21d8-a5d270aa3826.jpeg)


## フロントエンド監視

#### 監視ののゴール

フロントエンドのパフォーマンス監視のゴールは動き続けることではなく、**素早くロードされること**

フロントエンド監視には、 リアルユーザー監視(RUM)とシンセティック監視の２つの方法がある。

- リアルユーザー監視： 監視のデータとして実際のおユーザトラフィックを使うもの
ex)下の Navigation Timing APIや　Speed Indexでメトリクスを取得

- シンセティック監視：Webサイトがうご行っているかどうかをリクエストしてstatus code 200のレスポンスが返ってくることで確かめる方法
ex) Datadog synthetics 

### フロントエンドパフォーマンスのメトリクス

#### Navigation Timing API
ブラウザは、W3Cによって推奨されいている Navigation Timing APIという仕様に基づいたAPIを通じて、ページパフォーマンスのメトリクスを公開している。

**特に有益なメトリクス**

| メトリクス項目 | 内容 |
|:-----------|:------------|
| navigationStart  | ブラウザによってページリクエストが開始されたタイミング |
| domLoading  | DOMがコンパイルされロードが始まったタイミング| 
| domInteractive |ページが使用可能になったと考えられるタイミング(ページのロードが終わっているとは限らない |
|domCoontentLoaded | 全てのスクリプトが実行されたタイミング|
|domComplete| ページが全て(HTML,CSS,JS)のロードを終えたがイミング|

他にも、 Speed Indexなどのフロントエンドパフォーマンステストツール。
Speed Indexは視覚的な点でページがいつロードされ終わったのかを判断する。


## アプリケーション監視

### メトリクスでアプリケーションを計測する
まずシンプルにはじめる。
ex)

- データベースのクエリの実行にかかった時間
- 外部ベンダのAPIが応答するのにかかった時間
- あるいは一日に発生したログインの数


### ビルドとリリースのパイプラインの監視
デプロイイベントとAPIエラー率のそれぞれのグラフを重ねた表を作ることで、どこのデプロイから挙動おがおかしくなったのかを一目で分かるようにする。

<img width="569" alt="スクリーンショット 2019-10-27 13.59.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/c298c090-8b17-c3ed-fc5e-fe7b099b26c2.png">


### healthエンドポイントによるレスポンスの確認

監視方法
healthエンドポイントに対してhealth()関数を呼び、レスポンスを返してそのステータスコードで成功しているかどうかを判断する

- sqlデータベースに接続してqueryが実行できるかどうか
- Redisに依存性がある場合はRedisに接続してデータを取得できるか否か。場合に応じて書き込みの確認も


### マイクロサービスアーキテクチャを監視

監視方法
分散トレーシングにより、1つのリクエストに一意なリクエストIDを「タグ付け」することで、そのリクエストがどのサービスにアクセスしたか、各サービスでどのくらい時間を過ごしたかが分かる。ただ、分散トレーシングを始めるには時間と労力がかかる。

ex) Zipkin


## サーバ監視

### OSの標準的なメトリクス
OSの標準的なメトリクスは世の中の監視ツールではデフォルトで収集対象になっているため、どうやって取得するかよりも、その意味と使い方について説明。
CPU、メモリ、ネットワーク、ディスク、ロードアベレージなどについて説明されています。今回は省略。

### Webサーバ
パフォーマンスとトラフィックのレベルを測る決定版のメトリクスは**秒間リクエスト数**。
基本的には秒間リクエスト数はスループットの指標。
パフォーマンスにはそこまで致命的ではないが全体の見通しで重要なのがHTTPステータスコードの監視。
もう1つ便利なメトリクスが、リクエスト時間。

### DBサーバ

監視項目

- まず監視するのはコネクション数(MySQLではスレッドと表現している)
- どれくらい忙しいのかをみるのには**秒間クエリ数**をみる。
- スロークエリー(クエリの実行時間、実行回数、そのクエリ自体をあわせてログに出力される)
- レリプリケーションの遅延
- IOPS

参考資料： 実践ハイパフォーマンスMySQL Database Reliability Engineering

### ロードバランサー
ロードバランサはヘルスチェックを通じてバックエンドサーバの状態を判断する。

監視項目

- フロントエンドとバックエンドの2つのメトリクスを両方とる必要がある

### キャッシュ

主なメトリクス

- キャッシュから追い出されたアイテム数(evicted items)
- ヒット・ミス比率(hit/miss ratio、又はキャッシュヒット率[cache-hit ratio])


キャッシュから追い出されたアイテム数が多いということは、キャッシュ容量が足りないということ。
キャッシュの目的はよくあるリクエストの応答速度をあげることだが、キャッシュミスはその速度をさげてしまう。したがって、ヒット・ミス比率を監視するのはキャッシュパフォーマンスを確認するのに良い方法。


# まとめ

フロントエンド、アプリケーション、サーバーのそれぞれのレイヤーについての監視の目的と監視する項目について本の内容から抜粋して書きました。この本でも書かれていることで、まず監視をはじめて、定期的に監視を振り返ってブラッシュアップしていくことが大事だとのことでした。
MaixPy/MF1/M5StickVのFirmware downloadツールについて

K210採用商品にFirmwareを書き込むにはkflashというツールを使います。が、皆さん、kflashって複数種類あるの知ってますか？

## kflash.py

* https://github.com/kendryte/kflash.py
* kendryte製のpythonで書かれたCUI
* pipでインストールできてWin/macOS/Linuxすべてで動くのでうれしい。
* 何気にボードの自動検出機能が強い。Sipeedの通常のMaixシリーズならポートすら指定しなくても自動で検出して書き込める。

## kflash_gui

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52410/d5177db4-a667-c367-f1c9-70b885bbb057.png)

* https://github.com/sipeed/kflash_gui
* Sipeedがkflash.pyにGUIをつけたもの、という理解
* Win/macOS/Linuxすべてで動く唯一のGUIアプリ
* なぜかkflash.pyよりも書き込みが安定しない。[5回同じbin焼いたら成功した](https://twitter.com/uzuki_aoba/status/1153017288146112512)、とかある。



## K-Flash

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52410/1ce0cf5a-e55a-c985-b975-15a2d02f20c9.png)

* https://kendryte.com/downloads/
* kendryte製のWindows用GUIアプリ
* Windowsに限定されるが、kflash_guiより安定している印象。
* `Open terminal after flash` のチェックは外しておいた方がいい。(MF1の場合)
* アイコンがかわいい(CV種田梨沙)ので癒される。

## Tips

### Ubuntuで使う場合

普段使うユーザを `dialout` に追加する必要あり。 
詳しくは以下。

[[小ネタ]Ubuntu でttyUSB0(USBシリアル変換)が権限関連で使えない場合の対処方法](https://qiita.com/chromabox/items/b3ceaab6efa6edde2bda)


### Sipeed MF1に書き込む場合

公式のドキュメントではkflash_guiを使うことになっているけど、超絶安定しない。
一日置いて再試行したらなぜか成功する、とかある。
kflash.pyも本来なら書き込めるはずだが、 bit with micのconfigが無いせいかうまくいかない確率が高い。

K-Flashが今のところ一番成功率が高い。

### macOSでkflash_guiが起動しない

macOS環境にて kflash_guiを使用していたが、[2019年8月に1.5.2に上げたら急に起動できなくなった。](https://twitter.com/uzuki_aoba/status/1161542856747769856)

その時に[教えてもらって](https://twitter.com/HanxiaoM/status/1166024637764886529)以来、macOSではkflash.pyを使っている。kflash.pyの方がfirmwareのパスを渡すだけで書き込めるので楽。

## さいごに

macOS/Ubuntuですべてのボードへの書き込みが安定する環境がねぇ。。。

MF1への書き込みまで合わせると、今のところ僕の環境で **信用して使えるFirmware Download構成は Windows PC + K-Flash しかないです。**


上記以外にツールがあれば教えてほしいです。
自分用メモ：Scala環境構築 for ターミナル　〜Scala スケーラブルプログラミングの下準備として〜

#前置き
**下記参考文献を読んでできるなら読まなくて良いです。**
・以下に示す条件と同じか似たような環境を持つ方で、Scalaの環境構築で詰まった場合、読まれると良いかもしれません。
・ターミナル上での実行までを書いてます。
 →　**インプレスから出ている「Scala　スケーラブルプログラミング」は、ターミナル上でscalaを実行するよう求めているので、この書籍の序盤でつまずいている方におすすめします。**



#参考文献
Scalaのダウンロード方法　https://www.scala-lang.org/download/
Homebrewのインストール　https://brew.sh/index_ja


#前提環境
・MacOS Mojave version 10.14.5
・Homebrewインストール済み

#方法

1,　ターミナルを開き、`java -v`　もしくは `java -version`を打ち込む。
　　version1.8であることを確認する。

####エラーが出たら・・・
①　jdkがインストールされてないと、エラーが出るので、[jdkのインストールページ](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)に飛びます。**Accept License Agreement**にチェックを入れて、**jre-8u231-macosx-x64.dmg**を選んでダウンロードします。

②　ダウンロードされると、Chromeだと下の方にダウンロードしたファイルが表示されるので、それをクリックしてインストールを開始します。

（続き）
2,　バカの一つ覚えかもですが、Homebrewを使います。便利です・・・。Homebrewが入ってない場合や挙動がおかしい場合の対処法は後述します。

```
$brew update
$brew install scala
```

3,　実際に動かします。

```
$scala
```
でScalaが動きます。
動くと、たとえば以下のような画面になるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439203/f67c35e4-b9c0-b6c1-c891-3377b2c1b247.png)


####Scalaの実行
**パターン１：コマンドラインに打ち込む**

例えば、以下のように打ち込みます。

```
scala> 2 + 3
```
すると、結果が

```
res0: Int = 5
```
のように帰ってきます。

**パターン２：実行ファイルを作成する**

１、　一度、scalaを止めます。以下をターミナルに打ち込みます。

```
:quit
```
`:q`でも同様にストップできます。

2,　自分が今どこのディレクトリにいるのか、`pwd`で確認します。そして、`cd　移る先のディレクトリのパス`で自分がscala用のファイルを管理したい場所に飛びます。なければ`mkdir　ディレクトリ名`で管理用のディレクトリを作成します。

3,　該当ディレクトリに移ったことを`pwd`で確認します。

4,　ターミナルに

```
$touch HelloWorld.scala
```

と打ち込みscala拡張子をもつファイルを作成します。

5,　ターミナルに

```
$vim HelloWorld.scala
```

と打ち込みファイルを開きます。`i`でINSERT、つまり書き込み可能となります。そうしたら、

```HelloWorld.scala
println("Hello, Scala! I love you!")
```
等、好きなことを書き込んであげます。
次に、`:w`で保存し、`:q`で閉じます。
（デスクトップディレクトリに作成していれば、上記コマンドを打たずとも直接ファイルを開けます。）

6,　ターミナルに次のように打ち込みます。

```
$scala HelloWorld.scala
```
Hello, Scala! I love you!と出れば成功です。

#Homebrewについて

##インストール方法

下記コマンドをターミナルに打ち込みます。

```
$/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```


##トラブルシューティング

私の場合、挙動がおかしいとき、以下の二つを行いました。
手法１で解決することが多いです。

手法１：
下記コマンドをうつ。

```
$ brew update　
$ brew doctor
```
特に、`brew doctor`は、出てきたエラーメッセージを元にコマンドを打っていくことをすると良いかと思います。他にも、`brew cleanup`等も行いましたが、これでも無理だったとき、私は手法２を利用しました。（１回経験しました。）

手法２：
下記コマンドでアンインストールしてしまう。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

```

賛否両論あるかもしれませんが。

基本は、エラーメッセージに基づき原因を根気よく探っていくのが王道だと思います。
（蛇足ですが、筆者はエラーにコマンドを打っては考えてというので数時間かけることもありました・・・。）

#最後に（超蛇足！）
実は、Intellij IDEAの方も書こうと思ったのですが、Scalaはやくやりたいので書かないことにしました。
あと、スケーラブルプログラミング第3版は訳がひどいそうですが、原文見てないのでよくわかんないです。日本語としては違和感感じるところがパッと見ないので・・・。（能力低いんですかね？）
SourceTreeのコミットでクラッシュした場合の対処方法 (Version 3.2.6)

# 経緯
ローカル環境でファイルのバージョン管理を行うためにSourceTree（Gitクライアント）を導入。
インストール中にBitbucket（Atlassian）のアカウントを作成して、インストールは正常に完了した。

ローカルフォルダをリポジトリに登録して、いざコミットしようとするとSourceTreeがクラッシュしてコミットできない…
レポートに表示されたxmlを探しても見つからず原因は不明で、履歴を見ても当然保留のままでコミットは完了していなかった。

# 原因
上記の通りエラーレポートファイルが見つからないので直接の原因は不明。
Atlassian Communityで色々調べたところ、何らかのポップアップを表示しようとしてクラッシュするらしい？

# 対処方法
デフォルトユーザー情報を一旦空欄にしてSourceTreeを再起動し、再度デフォルトユーザー情報に名前とメールアドレスを入力することでコミットできるようになる。
![qiita_20191027_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503866/c0fd5a7a-02b8-b677-ba1b-d0d09a49222e.jpeg)
[ツール] > [オプション] > [全般]タブ > [デフォルトユーザー情報] のフルネーム欄とメールアドレス欄に、Bitbucketアカウント作成時に登録した氏名とメールアドレスが表示されているが、これらをブランクにして[OK] → SourceTreeを再起動する。
再度デフォルトユーザー情報を表示し、フルネームとメールアドレスを入力し直して[OK]を押す。

![グラブル_20191027_3304.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503866/7fae558d-2be0-5602-a945-4de5721ece20.jpeg)
するとコミットのコメント欄の上に フルネーム<メールアドレス> が表示されており、これでコミットしてもクラッシュせずに保存されるようになった。

尚これ以外の対処方法として、過去のバージョン（正常動作の報告があったバージョンは3.1.3）に戻すというやり方もあるらしい。
過去のバージョンに戻すためにはアンインストールは不要で、過去バージョンをインストールするだけで上書きされる模様。
過去バージョンの入手先はコチラ↓
https://www.sourcetreeapp.com/download-archives
「UNIX ドメインソケット」と「ソケット」について比較する

「UNIX ドメインソケット」と「ソケット」について理解出来てなかったので簡単ですがメモ。
違っている部分があればご指摘頂けますと幸いです。

# まとめ

+ UNIX ドメインソケットもソケットもいずれもプロセス間のデータのやり取りを行うための手法の一つ
+ UNIX ドメインソケットではプロセス間通信にファイルシステムを利用する(拡張子 .sock という場合が多い）その為、 **同じホストでのプロセス間通信** として利用される
+ ソケット通信は **異なるホスト** で TCP や UDP を使ってプロセス間のやり取りが可能

# そもそも UNIX ドメインソケットとソケットはどんな時に使う？

いずれもプロセス間のデータのやり取りを行う仕組みの一つである。

[プロセス間通信](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E9%96%93%E9%80%9A%E4%BF%A1)

>プロセス間通信（IPC、英: interprocess communication）はコンピュータの動作において、複数プロセス（の複数スレッド）間でデータをやりとりする仕組み。通信プロセスは、同一コンピュータ内で帰結するローカル、ネットワーク接続された別のコンピュータと相互にリモート、などのほかに多様な観点で分類され、スレッド間の通信帯域幅とレイテンシや扱うデータの種類も多種多様である

今回は取り扱わないが「パイプ」もプロセス間通信（IPC interprocess communication）の一つ。

# UNIX ドメインソケットって何？

[UNIXドメインソケット](https://ja.wikipedia.org/wiki/UNIX%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88)

>UNIXドメインソケット（英: UNIX domain socket）や IPCソケット とは、単一のオペレーティングシステム内で実行されるプロセス間でデータを交換するためのデータ通信の終点
>UNIXドメインソケットは、アドレス・名前空間としてファイルシステムを使用している。これらは、ファイルシステム内のinodeとしてプロセスから参照される。これは、2つのプロセスが通信するために、同じソケットを開くことができる。しかし、コミュニケーションは、完全にオペレーティングシステムのカーネル内で発生する

自分の経験だと同じホストで nginx から php-fpm　に対して UNIX ドメインソケットで連携するというのをやったことがある。
検索してみると nginx の記事も見つかった。

[PHP FastCGI Example](https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)

UNIX ドメインソケットによるプロセス間通信ではファイルシステムを利用し、上記例では「/var/run/php-fpm.sock」を利用して nginx プロセスと php-fpm プロセスの通信を行っている。
上記要件がある為、通信をするプロセス同士は基本的に同じホストである必要があると思われる。(NFS とか使った時にどうなるとかは不明ですが。。。)

# ソケットって何？

[ソケット (BSD)](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88_(BSD))

>BSDソケットは、ホスト間の通信や1つのコンピュータ上のプロセス間の通信を可能とする

ソケットは **ホスト間の通信** が出来る事が大きな違いとして挙げられる。

以前、以下を参考に Python を使って異なるホスト間でのソケット通信も確認済み

[pythonでsocket通信を勉強しよう](https://qiita.com/__init__/items/5c89fa5b37b8c5ed32a4)


+ Python3 で実行
+ `bind`は「0.0.0.0」に変更
+ `connect`は server.py が動作する PrivateIP を指定
【swift】日付 現在時間を取得(何度も取り出したい時)

頻繁にグローバルスコープを使うのはやめたほうが良さそう。と思ったので記録として残しておきます。

日付の現在時刻を再利用して使いたい方は、viewControllerにコードをコピーして実行したらよく体感できると思います。
何度も使用したいものがあった時にスコープの考え方があるとシンプルで使いやすいです。

```
//viewController

import UIKit

class ViewController: UIViewController{
    let date = Date()
    let dateFormatter = DateFormatter()

    override func viewDidLoad(){
    dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMMdHms", options: 0, locale: Locale(identifier: "ja_JP"))
    
    print(dateFormatter.string(from: date))
    }
}
```
上記のものはグローバルスコープ(dateとdateFormatter)一度時間を取得したら値が一意になるため、再利用ができない。

なので下記のように定数(dateとdateFormatter)を関数内に収めれば関数を実行されるたびに現在の時刻を取り出すことができるようになるので使いたい時に使用できる。

```
//viewController

import UIKit

class ViewController: UIViewController{

    override func viewDidLoad(){
        let date = Date()
        let dateFormatter = DateFormatter()

        dateFormatter.dateFormat = DateFormatter.dateFormat(fromTemplate: "yMMdHms", options: 0, locale: Locale(identifier: "ja_JP"))
        print(dateFormatter.string(from: date))
    }
}
```
Google Colabでまたまた日本語表示が豆腐不可避な方に（2019/10/27時点）

## 1.想定する読者
* 1-1.以下の記事を見てgoogle colabの日本語化を済ませたのに、また**2019年10月下旬からまた豆腐に悩まされている皆様(筆者含む)。**
  * Colaboratoryでmatplotlibの日本語表示
  * https://qiita.com/unvavo/items/a907cb927bdadc1d8d0c　
  * https://qiita.com/siraasagi/items/3836cedede350280ec42
* 1-2.matplotlibを使う時、以下のエラーが出る人

``` ERROR.log
findfont: Font family ['IPAGothic'] not found. Falling back to DejaVu Sans.
/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py:211: RuntimeWarning: Glyph 29983 missing from current font.
  font.set_text(s, 0.0, flags=flags)
```

## 2.結論:matplotlibがver3.1以上だとfont cacheが「fontlist-v310.json」に変更
* 2019年9月までは「fontlist-v300.json」で良かったのですが、バージョン上がりましたmatplotlib
* 
``` NG.py
# このコマンドだと豆腐不可避
rm /root/.cache/matplotlib/fontList.json
rm /root/.cache/matplotlib/fontList-v300.json
```

* matplotlibのcacheに-vXXXと書いてある見慣れないファイル、これが本来消すべきfont cacheです。
* vXXXはどうやらmatplotlibのバージョンっぽいです。

``` ls.py
!ls -ll /root/.cache/matplotlib/
-rw-r--r-- 1 root root 46110 Jan 17 17:06 fontList.json
-rw-r--r-- 1 root root 29351 Jan 17 17:06 fontlist-v310.json # 2019/10/26時点ではこれを削除。
drwxr-xr-x 2 root root  4096 Jan 17 17:06 tex.cache
```

* またgoogle colabにデフォルトでインストールされているmatplotlibのVersioonが上がってキャッシュファイルが変わったのでしょう。

``` pipfreeze.py
!pip freeze
~(中略)~
matplotlib==3.0.2 # 2019/01/21
matplotlib==3.1.1 # 2019/10/26
~(中略)~
``` 
## 3.matplotlib ver.3以降の新たな日本語表示手順
``` success.py
# 日本語フォントをダウンロードする。
!apt-get -y install fonts-ipafont-gothic

# キャッシュを削除する。
# !rm /root/.cache/matplotlib/fontList.json　# 旧cache
!rm /root/.cache/matplotlib/fontlist-v310.json # 消すべきcache

# ランタイムを再起動する。(2020/10/14 この手順は不要ですので、スキップしてください)
``` 
* 削除するキャッシュさえ間違わなければ解決できます。

## 4.before-after
* 旧手順。相変わらず豆腐まみれです。
![qiita20190121b.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/87558622-8129-757b-7648-83d9c4e603f1.png)


* 新手順。豆腐が解消されています。
![qiita20190121a.PNG](https://qiita-image-store.s3.amazonaws.com/0/10574/74f05458-f3b1-dd7e-3a35-411fd6fb0576.png)

以上です。
Rails API modeでBasicAuthを入れる方法

RailsのAPI modeでは、いくつかの機能が使えない。フロントを用意しないのでSessionなどが使えない状態になっていて、Deviseを入れる際に苦労する。

今回、Basic認証をいれようとしたら同じく苦労したので調べた。
結果は次の一行をBasic認証入れたいControllerで呼ぶだけ。

```ruby
include ActionController::HttpAuthentication::Basic::ControllerMethods
```
mailgun x GCP Cloud DNS だと DKIM 長 2048 だとDNSレコード登録不可

タイトルの通り。
GCP Cloud DNS x mailgunの組み合わせでドメイン登録時に DKIM のキー長を欲張って 2048 にしたら登録できなかったので備忘。この構成で DKIM 使うなら長さは 1024 一択。

(その後、すぐに別ドメインを mailgun登録したら不正アカウントとみなされたらしく、ドメインを無効化され、サポート問い合わせるはめに。。)


### mailgun 仕様 (2019/10/27)
https://help.mailgun.com/hc/en-us/articles/203637190-How-Do-I-Add-or-Delete-a-Domain-

>DKIM Length - a longer DKIM key will make spoofing your emails by malicious spammer more difficult. 1024-bit is selected by default, but 2048-bit can be used as well.
Note: Some DNS providers may have an issue with a 2048-bit DKIM keys, as they produce a string longer than 255 characters (exceeding the maximum character limit for a DNS entry). 


### GCP Cloud DNS 仕様 (2019/10/27)
https://cloud.google.com/dns/docs/overview?hl=ja

>TXT
>テキスト レコード。任意のテキストを含めることができ、セキュリティ情報や不正防止情報などのマシンが読み取れるデータを定義するためにも使用できます。TXT レコードには、1 つまたは複数のテキスト文字列を含めることができます。個々の文字列は 255 文字以下にしてください。複数の文字列がある場合は、メール エージェントや他のソフトウェア エージェントによって連結されます。各文字列は引用符で囲みます。次に例を示します。

### 参考 DKIMとは
https://www.nic.ad.jp/ja/basics/terms/dkim.html

>DKIM (DomainKeys Identified Mail)は、 電子メールにおける送信ドメイン認証技術の一つであり、 メールを送信する際に送信元が電子署名を行い、 受信者がそれを検証することで、 送信者のなりすましやメールの改ざんを検知できるようにするものです。
Arrayクラスを拡張して、回帰直線を求める(配列の平均/分散/不偏分散/標準偏差/共分散/を定義する)


# 概要
ポートフォリオで体重管理アプリを作成しているのですが、過去の数値から将来の体重を予測する機能を実装中です。
最小二乗法で回帰直線の傾きと切片を導くロジックをRubyで書きました。

# 詳細
y = 2x となるような配列を用意しました。(実際はモデルの変数を使う予定です)
時間が空いたときに解説を書きます...(すみません)




## Arrayクラスを拡張
ついでに不偏分散と標準偏差も考えました。


```ruby
module ArrayStatistics
  refine Array do
    def average # 平均
      sum.fdiv(size)
    end

    def variance # 分散
      @average = average
      inject(0) { |result,n| result + (n - @average) ** 2 }.fdiv(size)
    end

    def unbiasedvariance # 不偏分散
      @average = average
      inject(0) { |result,n| result + (n - @average) ** 2 }.fdiv(size - 1)
    end

    def stadiv # 標準偏差
      Math.sqrt(variance)
    end

    def convariance # 共分散
      array1 = map{|xs| xs[0]}
      array2 = map{|ys| ys[1]}
      @average1 = array1.average
      @average2 = array2.average
      inject(0) { |result,n| result + (n[0] - @average1) * (n[1] - @average2)}.fdiv(size)
    end
  end
end
```
**@ average = average**にすることでメモ化され次の処理速度があがります
除算は***'/'***ではなく、***'fdiv'***を使用してます。

## 実行するクラス
```ruby
class Report < ApplicationRecord
  using ArrayStatistics
  def ols
    xs = [1,2,3,4,5]
    ys = [2,4,6,8,10]
    arry = xs.zip(ys)

    a = array.convariance.fdiv(xs.variance) # 回帰直線の傾き(a = XとYの共分散 / Xの分散)
    b = ys.average - a * xs.average # 回帰直線の切片(b = Yの平均 - 回帰直線の傾き * Xの平均)
    {a: a,b: b}
  end
end
```

### 実行結果
[![Image from Gyazo](https://i.gyazo.com/b9b3d8b079cc60fe45bb194b0037a691.png)](https://gyazo.com/b9b3d8b079cc60fe45bb194b0037a691)

a = 2
b = 0
が表示されました。

# ちなみに...
Hashクラスでもできますが、重回帰分析とかには、変更しにくそうなので、
Arrayクラスがおすすめかなと思います。

## Hashを拡張
```ruby
module HashStatistics
  refine Hash do
    class Hash
      def convariance #共分散
        ary1 = keys
        ary2 = values
        each_with_index.inject(0) { |result,(n,index)| result + (ary1[index] - ary1.average) * (ary2[index] - ary2.average)} / size
      end
    end
  end
end
```
## 実行するクラス（Hash対応版)

```ruby
class Report < ApplicationRecord
  using ArrayStatistics
  using HashStatistics
  def ols
    xs = [1,2,3,4,5]
    ys = [2,4,6,8,10]

    ary = [xs,ys].transpose
    hsh = Hash[*ary.flatten]

    a = hsh.convariance / xs.variance #回帰直線の傾き(a = XとYの共分散 / Xの分散)
    b = ys.average - a * xs.average #回帰直線の切片(b = Yの平均 - 回帰直線の傾き * Xの平均)

    {a: a,b: b}
  end
end
```


## 参考資料
[Basic Knowledge on Data Analysis 単回帰分析とは](https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/single_regression)

## あとがき
###追記(2019/10/28)###
[scivola](https://qiita.com/scivola)様より非常にありがたいアドバイスをコメントにいただき、書き直しました。
今更聞けないモンテカルロ法(円の面積編)

強化学習の手法の一つでもあるモンテカルロ法で、円の面積を求めます。
C#ですけれど、ソースコードはこちらにあります。
https://github.com/ma3100/AlgorithmPrimer/blob/master/FirstAlgorithmForCSharp/First/MonteCalro.cs

# モンテカルロ法とは?

前回記事のおさらいになりますが、モンテカルロ法は問題を数値計算で解くのではなく確率を利用して解く事です。

例えば今回テーマにしている円の面積の場合、**「半径 * 半径 * π」**で計算する訳ですが、モンテカルロ法は上記の計算を必要としません。

そのため、今回学ぶ方法で求める面積は正確な値ではないのですが、こちらも導入としては適しているのでその辺りは割り切ってください。

# モンテカルロ法で円の面積を求める際の考え方

1. 面積を求めたい円を四分割し、分割した円を正方形・または長方形で囲みます。
2. 1で出来た範囲の中に一様実数乱数を発生させます。3つしか点を打っていませんが、以下の様な状態になります。
<img width="149" alt="スクリーンショット 2019-10-21 14.03.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36448/20bb4250-f4d9-bf5b-32a0-cd1c8d3abdbc.png">

3. 一様実数乱数であれば、「1/4の円の中に収まる乱数と全ての乱数」の比は、「1/4の円の面積と四角形の面積の比」と同じになります。

1/4の円の面積 : 四角形の面積 = 1/4の円の中に収まる乱数の数 : 全ての乱数の数
1/4の円の中に収まる乱数の数をa,円の外に出た乱数をbと置くと、
円の面積/4 : (x * y) = a : a + b
円の面積 = 4a * xy / (a + b)
      = 4a * xy / n(発生した乱数の総数)

# 実装(C#)

```csharp:pymonte.cs
        const int RANDOMNUM = 10000;

        public double getArea(double xLength, double yLength)
        {
            double x, y, monteArea;
            var random = new Random();
            var inCircle = 0;
            foreach (var i in Enumerable.Range(0, RANDOMNUM))
            {
                x = random.NextDouble() * xLength;
                y = random.NextDouble() * yLength;

                if (x * x / Math.Pow(xLength, 2) + y * y / Math.Pow(yLength, 2) <= 1)
                {
                    inCircle++;
                }
            }

            monteArea = 4.0 * ((xLength * yLength) * inCircle / RANDOMNUM);
            Console.WriteLine($"Answer:{monteArea}");
            return monteArea;
        }

```

かなり前回の内容と被ってしまいました。。。
後ほど一つの記事にまとめるかも。。。
vue-test-utilsを使ったhoverのテスト

jest, vue-test-utilsを使ってVue.jsのテストを書いていた時に、hoverの動きがうまくテストできなくて困ったのでメモ。

## 先に結論
$nextTick()を使って、hover後の状態をDOM更新後に確認するようにする。

```js
describe("Index.vue(hoverなし)", () => {
  const wrapper = IndexFactory(false);
  describe("hover時のアクション", () => {
    it("マウスオーバーするとdata()のhoverがtrueに変わる", done => {
      const hoverIcon = wrapper.find(".hover");
      hoverIcon.trigger("mouseover");
      wrapper.vm.$nextTick(() => {
        expect(wrapper.vm.hover).toBeTruthy();
        done();
      });
    });
  });
});

```

## 全体のコード

index.vue

```vue

<template>
  <p
    class="hover"
    @mouseover="mouseOver"
    @mouseleave="mouseLeave"
  >
    ここにホバー
  </p>
</template>
<script>
export default {
  data() {
    return {
      hover: false
    };
  },
  methods: {
    mouseOver() {
      this.hover = true;
    },
    mouseLeave() {
      this.hover = false;
    }
  }
};
</script>
```

index.spec.js

```js

import { mount, createLocalVue } from "@vue/test-utils";
import Vuex from "vuex";
import Index from "@/components/index.vue";


const localVue = createLocalVue();
localVue.use(Vuex);
let actions;


//hoverがあらかじめtrue/false両方の場合をテストしたいので、
//呼び出すたびにIndexコンポーネントをモックして返してくれるIndexFactoryを先に作る
//hoverは変更可能にしたいので、IndexFactoryに引数として渡す
const IndexFactory = hover => {
  actions = {
    mouseOver: jest.fn(),
    mouseLeave: jest.fn()
  };

  return mount(Index, {
    actions,
    localVue,
    data() {
      return {
        hover: hover
      };
    }
  });
};




describe("Index.vue(hoverなし)", () => {
  const wrapper = IndexFactory(false);
  describe("hover時のアクション", () => {
    it("マウスオーバーするとhoverがtrueに変わる", done => {
      const hoverIcon = wrapper.find(".hover");
      hoverIcon.trigger("mouseover");
      //この直後にexpectを置いてもfalseのままになってしまう
      //vueのnextTick()APIを使って、内部の処理をDOM更新後の非同期処理とするとhoverのテストが可能になる
      wrapper.vm.$nextTick(() => {
        expect(wrapper.vm.hover).toBeTruthy();
        done();
      });
    });
  });
});


describe("Index.vue(hoverあり)", () => {
//逆バージョン
//最初はhoverされている状態から始めたいのでtrueを渡す
  const wrapper = IndexFactory(true);
  describe("hover時のアクション", () => {
    it("マウスを離すとhoverがfalseに変わる", done => {
      const hoverIcon = wrapper.find(".hover");
      hoverIcon.trigger("mouseleave");
      wrapper.vm.$nextTick(() => {
        expect(wrapper.vm.hover).toBeFalsy();
        done();
      });
    });
  });
});

```

## ポイント
- vueのnextTick()を使って、内部の処理をDOM更新後の非同期処理とする
- コールバック処理を描く時は、非同期処理が終わったことをdone()を呼び出すことで伝えないといけない
- done()がないと、非同期処理を無視して、最終行の処理が実行された時点でテストが終了する




参考: 
[Testing mouseover event in vue-test-utils(stack overflow)](https://stackoverflow.com/questions/50410059/testing-mouseover-event-in-vue-test-utils?rq=1)

[factory関数](https://lmiller1990.github.io/vue-testing-handbook/ja/components-with-props.html#%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0)

[非同期動作のテスト](https://vue-test-utils.vuejs.org/ja/guides/testing-async-components.html)
ServerlessFramework(AWS, Python3)を始める

# Motivation

ServerlessFramework をちょっと勉強したいので、触ってみる

- Python3 
- AWS

# 実施すること

ServerlessFramework 経由で、関数を作成して、デプロイし、動作確認する

# 手順

## 前提

- npm (install 済)
- python3 (install 済)

## ServerlessFramework のinstall

https://serverless.com/framework/docs/getting-started/

```bash
npm install -g serverless
```

## Service の作成

https://serverless.com/framework/docs/providers/aws/cli-reference/create/

```bash
serverless create --template aws-python3 --name sample-service --path sampleService
```

- template
利用するテンプレート名。 
- name
このサービスの名前。 serverless.yml 内に書かれる
- path
サービスを作成するパス。

sampleService ディレクトリにいくつかファイルが作られる

- handler.py
サンプルファンクション
- serverless.yml
サービスの構成設定

## (Optional) AWSアカウントの作成

IAM で serverless framework 用のIAMユーザーを作る

AdministratorAccess の権限を与えておく (強すぎるので注意)

## AWSアカウントの紐付け

https://serverless.com/framework/docs/providers/aws/cli-reference/config-credentials/

```bash
serverless config credentials --provider aws --key 1234 --secret 5678
```

- provider
プロバイダ。AWS使うので一択
- key
IAMクレデンシャル(アクセスキー)
- secret
IAMクレデンシャル(シークレット)


## デプロイ

region を追加する(default: us-east-1 らしいので)

```yaml:serverless.yml
-provider:
-  name: aws
-  runtime: python3.7
-  region: ap-northeast-1
```

デプロイする

https://serverless.com/framework/docs/providers/aws/cli-reference/deploy/

```bash
sls deploy -v
```

* v
詳細を表示する

## 確認

Lambdaを実行してみる

```bash
sls invoke -f hello

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}"
}
```

https://serverless.com/framework/docs/providers/aws/cli-reference/invoke/

* f
呼び出す関数名

## AWS コンソール

Cloud Formationを利用して、S3, IAM Role, Lambda, Log Group が作成されている
要らなくなったらここから(も)消せる

# まとめ

動作確認できた！
obnizOS on M5StickCでハマった件 #yorohack #obniz


ちょうど届いたので、`#yorohack`で触ってみてました。

> [【乾杯スタートで居酒屋ハック！】養老乃瀧ハッカソン2019](https://yorohack.connpass.com/event/140626/)

## まず電源がつかない (でも焦ってはいけない)

木戸さんに教えてもらった記事[M5StickC[obnizOS + Hobby Lite]でLピカする。](https://raspberrypi.mongonta.com/howto-start-m5stickc-obniz-hobby-lite)を見るとこんな記載が

> ![スクリーンショット 2019-10-27 11.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/894b8f9c-aea8-f7aa-1e97-35eee5ca3f51.png "スクリーンショット 2019-10-27 11.39.46.png")

**なんと電源が付いても何も変化がありません。**

**M5StickCが起動しない時に抵抗を挟んでゴニョゴニョって話題が一時期ありましたが、それとは全くの別問題みたいです**


PCとシリアル通知をするとシリアル表示があるので、これで電源が入ってることを確認しましょう。

## Arduino IDEのシリアル通信が上手くいかない？

これはイマイチobnizOS側なのかArduino IDE側なのか分かってないです。

シリアル通信でデバイスキーの入力を求められます。[この辺のドキュメント](https://obniz.io/ja/doc/obnizos/os_install)を見てdevicekeyを入力します。

ただ、僕の環境だと永遠にdevicekeyを求められました。

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/23376d41-81b7-9fb3-05ea-412506ec0f0b.png" width="400px">

入力しても反応がありません。

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/71ec551d-c486-f194-f0d2-be1de720a0e9.png" width="400px">


環境が **macOS Catalina / Arduino IDE 1.9ベータ** という先を行き過ぎている感だったので僕の環境が悪いような気がしています。

### screenコマンドでリトライしたらつながった

ターミナルでscreenコマンド使ったら大丈夫でした

```bash
$ screen /dev/cu.usbserial-xxxxxxxxxx 115200
```

ここでdevicekeyを聞かれてエンターで進めたらうまいこと認証やwifi設定なども出来ました。

## obnizOSで音鳴らす

この辺まで来たら良い感じです。 Speaker Hatを使って音を鳴らせました。(+Lチカ)

```bash
npm init -y
npm i obniz
```

```app.js
const Obniz = require('obniz');
let m5 = new Obniz('xxxxxxxxxx'); //ID

m5.onconnect = async function() {
  console.log("connected");

  console.log("ledON");
  m5.io10.output(false);

  const speaker = m5.wired("Speaker", {signal:26, gnd:1});
  speaker.play(1000); //1000hz
}
```

Speaker Hatは26番指定らしいです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">初めてのobnizOS <br> <a href="https://twitter.com/hashtag/yorohack?src=hash&amp;ref_src=twsrc%5Etfw">#yorohack</a> <a href="https://t.co/j0QXzCj9FF">pic.twitter.com/j0QXzCj9FF</a></p>&mdash; 菅原のびすけ (@n0bisuke) <a href="https://twitter.com/n0bisuke/status/1188297175643480064?ref_src=twsrc%5Etfw">October 27, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


> 参考: [M5StickC + Speaker Hat で音を出す](https://qiita.com/onigiritech/items/36f35beb018cba6f473f)
> 参考: https://obniz.io/ja/sdk/parts/Speaker/README.md

## まとめ

* obnizOSの初期セットアップは結構分かりにくい
* シリアル通信はscreenコマンド使おう
* Wi-Fiに繋がるまでが一苦労
* Wi-Fi繋がってしまえばカンタン
MacでVscodeが開けない現象を解決する方法


##前提
Vscodeをまた1から始めようということでアンインスト、そして再インストしよう思いました。
その時Vscodeを再インストールし、開こうとしたときに下記のような注意がでました。
<img width="424" alt="スクリーンショット 2019-10-26 23.27.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283604/0a408d5d-161b-819b-e7b9-820de6f7491c.png">


##解決方法
下記の通りに行ったところ無事開くことができました。
[macOSユーザガイド](https://support.apple.com/ja-jp/guide/mac-help/mh40617/10.15/mac/10.15)
リバースプロキシでPOSTされた内容に値を追加する方法(NGINX)

初投稿になります。ミドルウェアエンジニアのラッシーです。よろしくお願いします。
今回やりたかったことは、リバースプロキシーを経由する通信のPOST値を書き換える　orパラメーターを追加するというもの。果たして可能なのか…。
リバースプロキシにNGINXを使うのが一般的なのかは知らないが、泣きそうな思いで探した結果NGINXを使うのが一番まともそうだったので、ベースとするミドルウェアはNGINXとした。

### 必要なもの
・普通のNGINX(別にコンパイルしても良いけど、yumとかapt-getとかで入れたやつでOK)
・気合

### 結論
初めて見たが、「proxy_set_body」なる設定項目があるようだ。
NGINX設定ファイルのserver設定内にあるlocation配下に次のように記述してやればよい。
dokoka.conf

```nginx
(略)
location /dokoka/ {
	proxy_pass https://tensou.xxx;
	proxy_set_body $request_body&param1=val1&param2=val2;
}
```
### 用法
検索しても中々出てこないので使用頻度低いのかなとも思ったが、あまり知られていないから？と勝手に妄想したり。
例えば、　AJAXで認証突破するためにPOSTでIDとパスワードが必要なんだけど、JavaScriptに書いたら確実にバレるじゃんと言うこの状況。この場合は、IDだけ、POSTしておいてリバースプロキシ側でパスワードを付加してやるとパスワードを知られることなしに認証を突破できる。
通常こういう時は、PHPとかRubyとかPythonのプログラムを一枚噛ませて処理したりするのだが、POSTの値を追加するためだけにアプリケーションサーバーを立てるのはなんだか悔しいし、メンテナンスも結構手間だったりする。以上、ちょっとサーバーのことを知っている、ミドルウェアエンジニアの投稿でした。
〜誰ワカ〜　rails　文字列に変数やインスタンスを代入、挿入、入れる方法

#Rubyや、Ruby on Railsで文字列の中に変数を入れるやり方

こんにちは、〜誰ワカ〜のコムリンです。
文字列の中に変数を入れるやり方って***簡単***ですよね？

多分Rubyを勉強された方なら必ず知っているはずです。


# ＃{n}  　←　こんな感じ

#しかーし！

僕は初級者卒業くらいのところで、できなくて困りました・・・
ちょっとしたポイントがあったので、ご紹介します。


***〜ポイント〜***
文字列は「””」でかこむ

❌　work#{user.id}
⭕️　"work#{user.id}"

❌　:work#{user.id}
❌　":work#{user.id}"
⭕️　"work#{user.id}"

❌　params(work#{user.id}: work)
⭕️　params("work#{user.id}": work)

イメージはつきましたでしょうか？

このように記述すると、ちゃんと挿入することができます。

ちょっとしたことですが、僕もよく質問されたり教えたりする部分でしたので参考にしていただければと思います。
AtCoder Beginner Contest 142 「python解答」



AtCoder Beginner Contest 142
「python A問題　Odds of Oddness　解答」



```python:filename.py
N = int(input())

g = 0
k = 0
for i in range(1, N + 1): # Nだけだと１～N－１までしか計算されない。
    if i%2 == 0:
        g += 1 # 偶数
    else:
        k += 1 # 計算

print(k / (g + k))
```
RでLookup Tableを作る

[Advanced R](https://adv-r.hadley.nz) に Lookup Table に関する記載があり、知らなかったので備忘のためにまとめました。

## Lookup Table

まずは Lookup Table でなにをしているのか [Advanced R](https://adv-r.hadley.nz/subsetting.html#lookup-tables) のコードを見てみます。

```r
x <- c("m", "f", "u", "f", "f", "m", "m")
lookup <- c(m = "Male", f = "Female", u = NA)
lookup[x]
#>        m        f        u        f        f        m        m 
#>   "Male" "Female"       NA "Female" "Female"   "Male"   "Male"
```

名前付きベクトルを使って略称を変換しています。
最初にこのコードを見た時なぜこんな挙動になるのかイマイチわかりませんでしたが、文字列ベクトルを使ったデータ抽出の挙動を振り返ると合点がいきました。

## なぜ変換されるのか

名前付きベクトルに対して、文字列ベクトルを使ってデータ抽出を行うときの挙動があります。
以下2つの性質を利用することで Lookup Table が実現されています。

### 名前が一致する要素を返す

```r
lookup[c("m", "f")]
#>       m        f 
#>  "Male" "Female" 
```

### 同じ添字を繰り返すことができる

整数添字と同じように繰り返すことができます。

```r
lookup[c("m", "m", "m")]
#>     m      m      m 
#> "Male" "Male" "Male"
```

## おまけ: 定義されていない名前でのアクセス

存在しない名前でのアクセスは、範囲外として `NA` が返ってきます。

```r
lookup[c("m", "x")]
#>      m   <NA> 
#> "Male"     NA
```

## 参考

* [Advanced R](https://adv-r.hadley.nz)
webサイトを自動デプロイできるようにしてgithubで管理する

## 概要
n番煎じの記事ですが、自分用にまとめます。

S3バケットをまるごとWeb上で公開することができます。ただし、公開できるのは静的コンテンツに限ります。独自ドメインもRoute 53を使うことで使用可能です（今回はお名前.comからname serverを変更）。LinuxなどでWebサーバを立てる場合のように、sshログインやサーバー運用を行う必要はありません（←非常に楽！）。また、CloudFrontをキャッシュサーバーとして併用することで、サーバーの負荷軽減、ネットワークレイテンシの低減を行えます。

![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264708/e4e3a073-f564-4bcc-35de-f59b6b259427.png)

### 作業の流れ
Githubのmaster branchにあるコードが(pushやmergeで)改変されるたびに、S3のバケットに自動でdeployされます。アップロードされたコンテンツは、ClowdFrontによって、世界中の様々なサーバーに格納されます。独自ドメインにアクセスすると、更新後のwebサイトを閲覧することができます。

### 用意するもの
- 公開するwebコンテンツ
- 独自ドメイン(お名前.com)
- Github
- CircleCI
- AWSアカウント

webコンテンツの変更をgitで管理することができる、複数人で運用することができる、nginxなどのwebサーバーの不具合等の要因を考える必要がないなど、非常に楽で、手動で管理する部分を極力減らしてあるので、一度構築してしまえば、保守が楽チンです。

## 0. IAMの設定
CircleCIがS3にアクセスするためのユーザーを生成します。
IAMから`AmazonS3FullAccess`をアタッチします。
`Access key ID`と`Secret access key`をメモしておきます(CircleCIの設定で必要)。


## S3の設定
- bucketの生成
- アクセス権限のバケットポリシーの設定

```json:s3
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "forPublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[backet名]/*"
        },
        {
            "Sid": "forCircleCi",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::[AWSのユーザーID]:user/[IAMで設定したユーザー名]"
            },
            "Action": [
                "s3:PutObject",
                "s3:ListBucket",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::[バケット名]",
                "arn:aws:s3:::[バケット名]/*"
            ]
        }
    ]
}
```


## CircleCIの設定
- **Githubとの連携**
https://circleci.com/

組織アカウントのレポジトリが対象の場合、[次の記事](https://qiita.com/fkymnbkz/items/cbe27254a24d4457663d)を参考のこと。

- **`config.yml`ファイルの生成**

```yml:.circleci/config.yml
version: 2.1
orbs:
  aws-s3: circleci/aws-s3@1.0.11
jobs:
  build:
    docker:
      - image: 'circleci/python:2.7'
    steps:
      - checkout
      - aws-s3/sync:
          from: .
          to: 's3://${AWS_S3_BUCKET_NAME}'
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          aws-region: AWS_REGION
          arguments: |
            --acl public-read \
            --cache-control "max-age=86400"
          overwrite: true
```
- **Environment Variables(環境変数)の定義**

    - AWS_S3_BUCKET_NAME
    - AWS_ACCESS_KEY_ID
    - AWS_SECRET_ACCESS_KEY
    - AWS_REGION
 
  の設定をする。
  

ここまでで、一応S3にアップロードするところまではうまくいきます。

## お名前.comからroute 53にネームサーバーの変更

- route 53側の設定
- お名前.com側の設定

## 独自ドメインに対して証明書の発行
Certificate ManagerでRoute 53に登録した独自ドメインに対して証明書を発行する

## CloudFrontの設定
- S3でホスティングしたwebサイトのdistributionを公開する
- http→httpsへリダイレクトの設定
- Route 53で独自ドメインを有効化する