OmniAICreator/Qiita-1.07M huggingface dataset:
VisualStudio2017でpython3を始める

Qiitaデビューしました。
#最初の記事なので軽く自己紹介
今年(2018年)で22歳の工学部の大学生。
アニメ・ゲーム大好き。最近はVtuberでてぇてぇしている:pig:
プログラミング歴4年くらい。C,C++,C#経験あり(他人に簡単なプログラムの解説ができる程度。<font color="Silver">その他もかじったことあるけど忘れた</font>)

#pythonを始める
記事タイトルにもあるようにpythonに挑戦。
今までC,C++,C#とやってきたが動的な言語は初めてで、Pythonに関する知識は

 - 機械学習によく使われてる
 - インデントでネストを制御してセミコロンで終わらない
 - ライブラリが豊富
 
くらいしか知らない。
作りたいものの目標はあるのでせっかくなので過程を残していこうかと。
特にこの記事では、VisualStudio2017での開発。(VisualStudioCodeではない)

##なぜVS2017なのか
VisualStudioCode(あるいは他のエディタ)のほうが開発しやすい環境であることは知っているが、単純にPCにあれこれ入れるのが面倒で入れたあとの面倒も嫌なので、可能であれば統一したいという意志。

もちろん、進めていくうちにエディタは変わるかもしれない。

##Python3の導入
https://qiita.com/kituneazami/items/4d2db7726bdc0eb37f2b
を参考に導入しました。自分の場合3.7.0をダウンロードしインストール。
「よしHello Worldするか」と思ってVS2017を開くが、よく考えたらVSのプロジェクト一覧にPythonがない。
VSで開発するつもりなら導入もVSでやればよかったやん…と思いつつ、「ファイル」→「新規作成」→「プロジェクト」→「Visual Studioインストーラーを開く」からPythonにチェックを入れる。
オプションはデフォでついてたやつだけ。3.6.3って書いてるけどまあいいかって感じでインストール。(画像は導入後に開いたもの)
![VSinstall.png](https://qiita-image-store.s3.amazonaws.com/0/277953/499e6c05-b08d-d628-1e0a-fc3a15c9f9cc.png)

##Hello World
無事導入できたようなのでプロジェクトを作っていざHello World。

```python3:Hello.py
print("Hello,World")
input() #なくてもいい?
```

includeもusingもないめっちゃ短いコードな上にビルドしなくていい違和感。いつも通りデバッグなしで開始。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/277953/01336ee1-0118-cc75-e977-3dbb2493b5d9.png)
無事VS2017で動いたので今回はここまで。
array の中に要素として含まれているかの判定

こんにちは。
Golang で array の中に要素として含まれているかの判定を行ってみました。array はソートされている必要があります。下記例では```int32``` の array ですが、他の変数型の場合でも可能です（大小判定が可能ならば）。

```go
import (
 	"sort"
)

func contains(arr []int32, e int32) bool {
	i := sort.Search(len(arr), func(i int) bool { return e <= arr[i] })
	return i < len(arr) && e == arr[i]
}

sort.Slice(arr, func(i, j int) bool { return arr[i] < arr[j] })
if contains(arr, e) {
	fmt.Printf(...)
}
```
人狼GM支援ツールを作る（環境構築編）

# はじめに
7月に配属されたものの、10月までは~~暇を持て余している~~空きなので、業務時間中にごく個人的な趣味全開のシステムを作ることになりました。
今回は「汝は人狼なりや？」というゲームをGMなしでプレイするための支援ツールを作ります。
切りのいいところでいくつかの記事に分けて書こうと思うので、長い目で見守っていただければ幸いです。
想定する構成としては、

- Laravel
- Vue.js
- websocket
- MySQL
- bootstrap（余裕があれば）

という構成で作ろうと思っています。
主にLaravelとVue.jsの勉強のためです。

ホストOSはwin10です。なので、以下はWin10向けの記述となります。

# Laravel Homestead
参考：[Laravel Homestead](https://readouble.com/laravel/5.6/ja/homestead.html)
LaravelにはLaravel HomesteadというVagrantでお手軽環境構築セットがあるそうなので、これを使います。
`vagrant up`するだけで、以下のような環境が立ち上がります。

- Ubuntu 18.04 LTS
- PHP 7.2.5
- MySQL 5.7.22
- Nginx 1.14.0
- Node.js 8.11.2
- npm 6.1.0

`vagrant ssh`でupしたゲストOSにログインします。

# Laravelプロジェクト作成
Laravel Homesteadのデフォルト設定では、ゲストOS側の共有フォルダは`/home/vagrant/code`になっています。
当然コーディングはホスト側で行いたいので、共有フォルダ上にLaravelのプロジェクトを作成します。

```bash
cd code
composer global update
laravel new {プロジェクト名}
```

これで自動的にLaravelがインストールされます。
composerの設定を何も気にせずにアップデートしたせいでLaravelのバージョンが5.6になってしまいましたが、あまり気にせずに続行します。

作成したプロジェクトがホスト上からでも確認できるはず！と思い、ホスト側から共有フォルダを確認したらファイルがありません。
プロジェクトを作成したら共有フォルダの指定が思っていた階層からズレたため、のようです。
なので共有フォルダ指定を変更します。
通常ではVagrantfileを直接書き換えますが、HomesteadのVagrantfileはHomestead.yamlというファイルを通して設定する必要があります。

```yaml:Homestead.yaml
folders:
    - map: ../project/{プロジェクト名}
      to: /home/vagrant/code/{プロジェクト名}

sites:
    - map: {設定したいドメイン名}
      to: /home/vagrant/code/{プロジェクト名}/public
```

このように書き換えました。
sitesを書き換えた場合は、`C:\Windows\System32\drivers\etc\hosts`に`192.168.10.10 {設定したいドメイン名}`を追記する必要があります。（編集権限に注意！）
これによってDNSより優先的にドメインを探してくれるようになるそうです。

共有フォルダやらの設定を変えたので、`vagrant reload`してから再度VMに接続します。
フォルダが共有されたので、最低限の準備はできました。

# Vue.jsの準備
Laravelプロジェクトを作成した時点で、`package.json`が用意されています。
Vue.jsほか、Babelやらなんやら便利なものは一通りインストールできるようになっているみたいです。
なので、その場で`npm install`すれば全部インストールできる！はずなのですが……
実はWindowsとの共有フォルダの関係で、共有フォルダ上で`npm install`しても十中八九コケます。

いろいろ調べた結果、ホスト側で`npm install`して共有させる方法が一番手っ取り早いようです。
なのでNode.jsとnpmのバージョンだけ確認して、ゲスト側と同じバージョンを用意してインストールしました。


見た目上は準備完了なんですけれども、`npm run dev`をしてみると失敗します。
node-sassというモジュールが各OS用に用意されており、Windows用が入っているのにLinux上でビルドしようとしているため失敗しているようです。
なので、node-sassだけ改めてゲスト上でインストールしなおす必要があります。

```bash
npm install node-sass --no-bin-links
```

これでnode-sassだけインストールできました。
ちなみに、`--no-bin-links`オプションをつけないとエラーを吐きます。~~めんどくさいですね。~~

# 準備完了！
ここまで行えば、ひとまず環境構築は終了です。
まだwebsocket関連のモジュールが入っていませんが、実装で必要になるまで後回しにしたいと思います。

今回は環境構築編ということで、Vagrantを中心の記事となりました。
次回はLaravel編を予定しています。

# 参考にしたサイト
[Laravel 5.6 - 日本語イントロダクション](https://readouble.com/laravel/5.6/ja/)
[npm トラブルシューティング - Qiita](https://qiita.com/hatai/items/ba6eadb758a667345b27)
【Python】自作モジュールへのパスの通し方


# 方法１．`.bash_profile`にパスを記入
＜**複数の実行ファイルで使いたいときに有用**＞

```..bash_profile
export PYTHONPATH='<自作モジュールの置いてあるディレクトリパス>'
```
.bash_profile はログイン時にのみ実行される。ログイン状態で設定を反映される場合は`source .bash_profile`をコマンド入力


# 方法2．デフォルトのパッケージディレクトリに配置
＜**複数の実行ファイルで使いたいときに有用**＞

```py
import sys
print(sys.path)
```
で表示されるディレクトリ下に自作パッケージを配置する


# 方法3 実行ファイルごとにパスを追加
＜**少数の実行ファイルで使いたいときに有用**＞
自作モジュールをimportする前に以下2行を追加

```py
import sys
sys.path.append("<自作モジュールの置いてあるディレクトリパス>")
```
【TIPS】今すぐ `.filter{...}.first` をやめましょう

よくこのような構文を見かけたりするのではないでしょうか：

```swift
let array: [String] = [
    "Apple",
    "Boy",
    "Cat"
]

let target = array.filter({ $0.hasPrefix("A") }).first
// target == "Apple"
```

ところがこの書き方、微妙にパフォーマンスが悪い（結果見つかったとしても最後まで回る）のと、微妙に意図が読み取りづらいですね。

Swift には `first(where:)` というものがありますので積極的にこちらを利用しましょう：

```swift
let target = array.first(where: { $0.hasPrefix("A") })
// target == "Apple"
```

この書き方だと、結果見つかったらループから抜けるのでパフォーマンスが少し良くなるだけでなく、一目で「配列の中の最初の A で始まる単語を返す」ってわかるのでとてもオススメです。

ちなみにインデックスを探すときも同じような書き方でできます：

```swift
let targetIndex = array.firstIndex(where: { $0.hasPrefix("A") })
// targetIndex == 0
```
xcodeのstacktraceの文字化けを治す

デマングルということをするらしい

https://www.swiftdemangler.com/

この手のブックマーク記事は嫌いなのだけど、自分が忘れて再びググるときに「xcode stacktrace 文字化け」ってググると思うのでqiitaにでも書くしか思いつかなかった。
メモ: Kubernetes ＠ GKEコマンド

#create  cluster
gcloud container clusters create k0 

# Launch a single instance:
kubectl run nginx --image=nginx:*.*.*

#Get pods
kubectl get pods

# Expose nginx
kubectl expose deployment nginx --port 80 --type LoadBalancer

#List services
kubectl get services
Kubernetes cheat sheet

*Creating Pod*
#Explore config file
cat pods/\<app name>.yaml
# Create the \<app name> pod
kubectl create -f pods/\<app name>.yaml
Examine pods
kubectl get pods

#get more information about the \<app name> pod.

kubectl describe pods \<app name>

-----
*interact with POd*
#Cloud shell 1: set up port-forwarding
kubectl port-forward \<app name> 10080:80

#Open new Cloud Shell session 2
curl http://127.0.0.1:10080
curl http://127.0.0.1:10080/secure

#Cloud shell 2 - log in
curl -u user http://127.0.0.1:10080/login
curl -H "Authorization: Bearer <token>" http://127.0.0.1:10080/secure

# View logs
kubectl logs \<app name>
kubectl logs -f \<app name>

#In Cloud Shell 3
curl http://127.0.0.1:10080
In Cloud Shell 2

#Exit log watching 
(Ctrl-C)

# run an interactive shell inside the \<app name> Pod
kubectl exec \<app name> --stdin --tty -c \<app name> /bin/sh

#test external connectivity
ping -c 3 google.com

#logout
exit

-----
*Create secret*
# create the tls-certs secret from the TLS certificates stored under the tls directory
kubectl create secret generic tls-certs --from-file=tls/

#verify 
kubectl describe secrets tls-certs

#create a configmap entry for the proxy.conf 
kubectl create configmap nginx-proxy-conf --from-file=nginx/proxy.conf

#get more details about the nginx-proxy-conf configmap entry
kubectl describe configmap nginx-proxy-conf

*Access a Secure HTTPS Endpoint*
#Create the secure-\<app name> Pod 
kubectl create -f pods/secure-\<app name>.yaml
kubectl get pods secure-\<app name>
kubectl port-forward secure-\<app name> 10443:443

curl --cacert tls/ca.pem https://127.0.0.1:10443

kubectl logs -c nginx secure-\<app name>

#参照もと：
http://kubernetes.io/docs/user-guide/kubectl-cheatsheet/
JavaScriptで新しいHTML要素を追加

##JavaScriptでHTML要素を作ります
#まず、要素を作りたい場所をidで取得しておきます。

```javascript:script.js
TimeLine = document.getElementById("timeline");
```

#以下コード

```javascript:script2.js
//タグの種類を設定し、新しい要素を作る
newElement = document.createElement("div");
//「この間に、作った要素に付けたい属性を記述する
newElement.innerHTML = "done";
//」
//作った要素を最初に指定した場所に配置
TimeLine.appendChild(newElement);
```
学習率の調整、予め足すか？後から足すか？

AdaGradは言わずと知れた、特徴ごとに学習率を自動的に調整するアルゴリズムである。Hivemallの実装で初期パラメータを再考する機会があったのだけど、初期パラメータのあり方に疑問を持つ部分があって整理したかったのでこのエントリを書いている

## AdaGrad recap

AdaGradではg：勾配、w：特徴の重みの配列に対して次のように更新する。

```python
gg[i] += g * g;
η = eta / (sqrt(gg[i]) + eps);
w[i] -= η * g;
```

ここで、gg：初期値0.0の配列、eta：学習率の定数、ηが学習率。
AdaGradでは、勾配の二乗を訓練事例ごとに加えて、学習率をggで割ることで学習率の自動調整を行う。基本的には訓練が進むごとにαを小さくしていかないと学習が収束しない。

[Chainer](https://github.com/chainer/chainer/blob/v4.3.1/chainer/optimizers/ada_grad.py#L49)でも[TensorFlow](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/training_ops.cc#L152)でも[Keras](https://github.com/keras-team/keras/blob/master/keras/optimizers.py#L334)でも同様に実装されている。

## epsの初期値

epsの初期値はゼロ除算を避ける為だったりで0に近い小さな値を使うことが良いとされる。
Chainerの実装だとデフォルトで[eps=1e-8, etaが0.001](https://github.com/chainer/chainer/blob/v4.3.1/chainer/optimizers/ada_grad.py#L9)となっている。

[この記事](https://qiita.com/ak11/items/7f63a1198c345a138150#%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)でもあるように、epsが0に近い値だとすると最初の重みの更新がetaとほぼ等しくなり、比較的分かりやすい挙動となる。

```
eta / sqrt(g * g) * g = eta
```

ただし、最初の重みの更新が `w[i] -= eta` というのは理想的だろうか(?)

## etaに対する補正

epsが0に近い場合は、[1/sqrt(x)](http://www.wolframalpha.com/input/?i=1+%2F+sqrt(x))の補正が行われる。次のような感じのスロープとなる。

![af06e4b6caa790cfc169ebb682c1d388.png](https://qiita-image-store.s3.amazonaws.com/0/32790/6780d910-f053-e4a5-e265-0a34e4ff15ab.png)

ggが0.01だったりするとeta * 10であったりするので**かなり**aggressiveに更新が行われる。

Hivemallだとetaの初期値から基本的に学習率が下がっていくようにしたいという考えから、[この記事](http://www.logos.t.u-tokyo.ac.jp/~hassy/deep_learning/adagrad/)と同様、epsの初期値は1.0として `η = eta / (sqrt(eps + gg[i]))` を利用している。こうすると基本的に学習率がeta以下となる。

![c53f6cc49de83985ef9123b1eab25e7a.png](https://qiita-image-store.s3.amazonaws.com/0/32790/374d5bd4-d68c-ac7f-e958-bfd8ca8eb21a.png)

## 最初の更新

以下のように、学習率の調整に勾配gは利用しないものとする。`η * g`で更新するのに学習率の調整をその時の勾配gで調整するというのがどこか引っかかる（過去の勾配なら良いけど）。

```python
gg = gg[i];
gg[i] = gg + g * g;
η = eta / sqrt(eps + gg);
w[i] -= η * g;
```

この時、epsを1とすると、最初の更新時、ggは0であるので、学習率はパラメタで与えた初期学習率と等しくなる。つまり、SGDと同様の更新式となる。学習率は初期学習率etaから単調減少する。

```python
η = eta / sqrt (1+0) = eta
w[i] -= eta * g;
```

## 最後に

論文通りにggを先に足した方が良いでしょうか？

p.s. [この映画](https://www.amazon.co.jp/exec/obidos/ASIN/B075D6W4R1/htn405-22/)好きです。
MacのVisual Studio CodeでPythonの開発をできるようにしてみたよ

投稿しなかった1年以上の間に、WindowsユーザーからMacユーザーになりました。
AnacondaがVisualStudioCodeをやたら推してくるので、VisualStudioCodeでPythonの開発をできるようにしました。

# 環境
- OS：MacOS 10.13.5 
- VSC：1.25.1
- Python：3.7.0

#  Macにインストール
- VSCodeダウンロード
以下のサイトがらインストーラーを入手し、zipファイルを解凍します。
https://code.visualstudio.com/download


- VSCodeをアプリに追加
zipファイルをDownloadフォルダで解凍した場合のコマンド

```shell
mv ~/Downloads/Visual\ Studio\ Code.app /Applications
```

# Pythonの拡張機能追加

割と色々助けてくれるので、拡張機能も追加しました。

```
Lint機能（使用するLinterを設定可能）
IntelliSense
自動インデント／自動フォーマット
リファクタリング
コードナビゲーション
デバッグサポート
ユニットテスト
VS Codeの統合ターミナルでのPythonコードの実行
オフラインのヘルプファイル
スニペット
```

[拡張機能]　 > pythonで検索　> [python]を選択しインストール
<img width="1199" alt="スクリーンショット 2018-08-02 18.25.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/f1f4326a-34d2-0bcf-460a-2a5044593cdf.png">

# pythonで書いてみた
[フォルダを開く]　> [新しいファイルを追加]　> ファイル名を入力
<img width="1280" alt="スクリーンショット 2018-08-02 18.08.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/327ee355-83db-1ea5-1720-21b664ab107f.png">

いい感じに補完してくれます。
<img width="1202" alt="スクリーンショット 2018-08-02 18.12.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/13b5448a-d894-9d48-5a67-e072a0162f79.png">

# ついでに（ターミナルからVSCode起動）

ターミナル使っているときに、ふとVSCodeを起動したいなーと思ったので、設定しました。

[表示]　 > [コマンドパレット]　> install coと入力 > シェルコマンドを・・・を選択
<img width="1278" alt="スクリーンショット 2018-08-02 17.49.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/77bc67fe-eccd-a07d-7b79-708fa29d2078.png">

ターミナルで以下のとおり入力したら、VSCodeが開きました。

```shell
code ${path}
```

# ついでに（Pythonのバージョンを選択）

Pythonバージョンを複数持っていて、環境に応じてバージョン変えたいなーと思い、バージョンを選択する方法も確認してみました。

[表示]　 > [コマンドパレット]　> select intと入力 > インタプリターを・・・を選択
<img width="1280" alt="スクリーンショット 2018-08-02 18.04.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/5a91bda3-23a6-0133-b725-92855c01d42e.png">

Python機能拡張が認識しているPython環境が一覧に表示されます
<img width="1279" alt="スクリーンショット 2018-08-02 18.30.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/168956/a38e6508-177b-6e07-f3db-ffe56089dd19.png">

ここでは、紹介しませんがPythonの仮想環境構築したときとかに、仮想環境のバージョンで
実行したりするときとかに、使っています。

# 参考文献
http://www.atmarkit.co.jp/ait/articles/1711/24/news034.html
Setting How Quickly a Key Repeats on Mac OS X

Mac OS X の場合、キーを押しっぱなしにした時の繰り返し入力速度、特にカーソル移動が遅く感じていました。Mac OS X ではこのようなものだと思い込んでいましたが、キーボード設定から調整可能であることがわかりました。

* [Apple Support > Set how quickly a key repeats](https://support.apple.com/kb/PH26213)

System Preference > Keyboard (システム環境設定 > キーボード) で設定できます。

* Key Repeat: 長押しした場合の繰り返し速度
* Delay Until Repeat: 繰り返し入力を開始するまでの時間

## Using the defaults Command

Key Repeat は最速にするとやや早すぎると感じるかもしれません。とはいえ、スライダーの目盛りを一段さげるとデフォルト値となってしまいます。

最速にして defaults コマンドで設定値を確認すると、以下のようになります。

```shell
# KeyRepeat
$ defaults read -g KeyRepeat
2

# Delay Until Repeat
$ defaults read -g InitialKeyRepeat
15
```

デフォルト値に戻して defaults コマンドで設定値を確認すると、以下のようになります。

```shell
# KeyRepeat
$ defaults read -g KeyRepeat
6

# Delay Until Repeat
$ defaults read -g InitialKeyRepeat
35
```

目盛りの中間値が欲しい場合は `defaults write` でユーザ設定値を設定します。

```shell
# KeyRepeat
$ defaults write -g KeyRepeat -int 3
$ defaults read -g KeyRepeat
3

# Delay Until Repeat
$ defaults write -g InitialKeyRepeat -int 15
$ defaults read -g InitialKeyRepeat
15
```

いったんログアウトして、ログインしなおすと設定値が反映されます。

当然ながら、キーボード設定のスライダーで設定しなおすと、目盛りに割り当てられた値に戻りますので、注意してください。
プログラマーならzshターミナルを効率化しよう!!

## alias
このコマンドを利用することで、自分でパスを設定できる。
例えば、`home/ユーザー名`を`HOME`というパスを付けて、
`cd /home/ユーザー名`を`cd HOME`で移動できるようにしたいなら、次の操作を行う。

```
alias HOME=/home/ユーザー名
vim ~/.zshrc
# 下記のように追加
source ~/.zshrc
```

```.zshrc
alias -g HOME='/home/ユーザー名'
```

## chown
所有者を自分に

```
sudo chown -R ユーザー名:ファイル名 .
```
AWS Lambda関数の環境変数の復号エラーへの対処

## 背景

作成してから全然更新していないLambda関数がある日を境に呼び出しエラーになっていた。エラーメッセージはこんな感じ。

> Lambda was unable to decrypt the environment variables because KMS access was denied. Please check the function’s KMS key settings. KMS Exception: AccessDeniedExceptionKMS Message: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.

暗号化された環境変数が復号できない、という内容のエラーで「KMSの設定に関してチェックしろ」と書かれている。
ググっても全然対応方法が出てこなくて、ちょっとした方法で直すことができたのでここに書いておく。

## 対応方法

Lambda関数の設定で、環境変数のKMSの設定を「カスタマーマスターキーの使用」から適当なキーを選んで一旦保存し、再度 `aws/lambda` に戻して保存し直すと動作するようになった。

それにしても、KMSの設定はデフォルト値である `aws/lambda` で一切変更していないはずなのに何が起こったんだろう。
Windowsコマンドプロンプトで認証プロキシを突破する

# はじめに
会社内からだと認証プロキシがあるので、コマンドプロンプトからAWS CLIを使ったり、pipしたりするときに毎回ググって設定方法を探しているのでメモ

# 必要な情報
以下の4つ

- **ユーザー名**
    - 例：username
- **パスワード**
    - 例：password
- **プロキシサーバのホスト名（またはIPアドレス）**
    - 例：proxy.contoso.com
- **使用するポート番号**
    - 例：8080
    

# 設定コマンド

```shell
set HTTP_PROXY=http://username:password@proxy.contoso.com:8080
set HTTPS_PROXY=http://username:password@proxy.contoso.com:8080
```

# 設定値確認

```shell
echo %HTTP_PROXY%
echo %HTTPS_PROXY%
```

# 疎通確認

以下などを使って応答が返ってくること

```shell
curl http://googole.com
aws ec2 describe-instances
pip search py*
```
apache2でpythonによるcgiを動かすまでのメモまとめ

# 概要
pythonファイルをcgiとして動かしたかったので
そのためにやったことをメモ程度にまとめておく

# 前提条件
・自分で作成した適当なhtmlの公開まではできている状態
・cgi用のpythonファイルは作成済み

# 環境

```
・OS:Ubuntu
・VERSION:16.04.5 LTS (Xenial Xerus)
・apache2 ver:Apache/2.4.18 (Ubuntu)
```

# やったこと
## cgiを置くdirectoryの作成
cgiについてしらべると、
・apacheのcgiのdirectoryは何もしなければ/var/www/cgi-bin/になる
・htmlのdir配下には作らないほうがよい
ということがわかった。
自分は/home/username/配下にhtmlのdirectoryをおいていたので
/home/username/配下にcgi用のdirectoryを作成し、その中にpythonファイルをおいた。

## Apache2のmoduleファイル適用
次にapache2のcgiを動作させるために下記コマンドを投入

```bash:/etc/apache2/mods-enable配下
a2enmod cgi
```
このコマンドにより、mods-enable配下にcgid.confファイルと、cgid.loadファイルが入った。

## configファイルの作成
通常apache2のcgiはpythonファイル(.py)を見ないので、.pyをcgiとして認識させるためにconfigファイルを作成する。
ファイルの中身は下記のとおりである。

```apache:.confファイル
ScriptAlias /cgi-bin/ "cgiをおいたdirectoryのフルパス"    
<Directory "cgiをおいたdirectoryのフルパス">
    Options +ExecCGI
    AddHandler cgi-script .cgi .py
    AllowOverride None
    Require all granted
</Directory>
```
#### .confファイル説明

```apache
ScriptAlias /cgi-bin/ "cgiをおいたdirectoryのフルパス" 
```
この行は/cgi-bin/というdir指定に対して、後ろのpathとして扱うためのもの。

```apache
<Directory "cgiをおいたdirectoryのフルパス">
```
この行は特に説明はないが、ここに書くpathは上の行のpathと微妙に違う。
上の行のは最後に"/"をつけてあげなければならない。
対してこちらはいらない。

```apache
    Options +ExecCGI
    AddHandler cgi-script .cgi .py
    AllowOverride None
```
Optionsの+ExecCGIは\<Directory path\>で指定したdirectoryに対してCGI実行の許可を出す。
AddHandlerは拡張子を指定することで、その拡張子のついたファイルの実行結果をcgiとして返すようにする。
AllowOverrideに関しては割愛

```apache
    Require all granted
```
この文はもともとOrderとallowで書かれていたアクセス制限の文がApache2.2から2.4になってこう書くようになったものらしい。
正直apache触りだしたのここ最近で、そもそも2.2を触ってなかったから知らなかった・・・
Requireを知っていれば検索しようがあったが、知らなかったので2.2の記事等を見てOrderとAllowを素直に書いていたらParmission denyが出たことでたどり着くことができた。


## 適用されている.confファイルの除外
これに関しては必要かわからないが影響がないと思われるためやったに過ぎない。
除外するファイルはserve-cgi-bin.confで、conf-enabled配下をいじっていなければ適用されているはず。
中身は下記になる

```apache:serve-cgi-bin.conf
<IfModule mod_alias.c>
	<IfModule mod_cgi.c>
		Define ENABLE_USR_LIB_CGI_BIN
	</IfModule>

	<IfModule mod_cgid.c>
		Define ENABLE_USR_LIB_CGI_BIN
	</IfModule>

	<IfDefine ENABLE_USR_LIB_CGI_BIN>
		ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
		<Directory "/usr/lib/cgi-bin">
			AllowOverride None
			Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
			Require all granted
		</Directory>
	</IfDefine>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
```
このファイルがあるために起こりうる影響は
ScriptAliasがあり、/cgi-bin/に対してエイリアスを張っているためconfigtestを行った時に
エイリアスの対象がかぶっているという警告が出るくらいである。
実働には影響はないと思われる。

## apache2 再起動
下記コマンドで行った

```
/etc/init.d/apache2 restart
```

## 確認
http://localhost/cgi-bin/pythonファイル名 で確認

# まとめ
こんな感じで手順は少ないが、apache2でpythonで作ったcgiを動かすことに成功した。
実はちょいちょい関係ないことでcgiがうまく動かなかったりしたので、手順の数よりもかなり苦労している。
もうちょっとサーバーというものへの理解を勉強して深めていきたい。
アンカーテキストクリック時にスクロールする（ヘッダーの高さを意識しつつ）


# やりたいこと
- アンカーテキストクリック時にページ内遷移したい
ex) 目次、リスト

- 遷移時はスピード調整してぬるっとスクロールさせたい

- ヘッダーを固定で設けているので、ヘッダーの高さを考慮してスクロールポジションを設定する


# まずはアンカーテキストの設定

任意の文字列をaタグで囲んであげます。
このときのポイントはidを付与することです。

付与したidを遷移先にも添えることでaタグによる遷移がページ内の任意の共通idの箇所に設定されます。

```html:リンク付きテキスト

<a href="#move_to_text">↓スクロールします</a>

```

```html:移動先のテキスト

<div id="move_to_text">ここにスクロールします</a>

```

このままでも、ページ内リンクは完成するのですが今回はスクロール機能を備えたいのでもう少し調整します。

# JQueryを用いる


```javascript

// jQuery.jsの読み込み
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

// スクロール部分の記述
<script>
$(function(){
   // #で始まるアンカーをクリックした場合に処理
   $('a[href^=#]').click(function() {
      // スクロールの速度
      var speed = 400; // ミリ秒
      // アンカーの値取得
      var href= $(this).attr("href");
      // 移動先を取得
      var target = $(href == "#" || href == "" ? 'html' : href);
      // 移動先を数値で取得
      var position = target.offset().top;
      // スムーススクロール
      $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
   });
});
</script>
```

これで、サイト内でスムーズにスクロールしながら移動ができるようになりました。

さらに、固定でヘッダーが設置されている場合を考慮します。

例えば、50pxの高さのヘッダーがある場合、サイト内遷移すると期待する文字列から50px分下がった位置にスクロールしてしまいます。
それを解消するために下記の記述で対応します。

```javascript

$(function(){
  // #で始まるアンカーをクリックした場合に処理
  $('a[href^="#"]').on('click', function() {
    // スクロールの速度
    var speed = 400;
    // アンカーの値取得
    var href= $(this).attr("href");
    // 移動先を取得
    var target = $(href == "#" || href == "" ? 'html' : href);
    // 移動先を数値で取得
    var position = target.offset().top - [your_header_height];
    // スムーススクロール
    $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
  });
});
```

[your_header_height]には、ヘッダーの高さを入力してあげましょう。

これで期待する動きが実現します。

# その後追記

```
$(function(){
  // #で始まるアンカーをクリックした場合に処理
  $('a[href^="#"]').on('click', function(e) {
　　　　　　　　// イベントを終了
    e.preventDefault;
    // スクロールの速度
    var speed = 400;
    // アンカーの値取得
    var href= $(this).attr("href");
    // 移動先を取得
    var target = $(href == "#" || href == "" ? 'html' : href);
    // 移動先を数値で取得
    var position = target.offset().top - [your_header_height];
    // スムーススクロール
    $('body,html').animate({scrollTop:position}, speed, 'swing');
      return false;
  });
});
```

最後に記載していた `return false;` をイベント発火後の直後に移動させます。
このときに記述を preventDefaultを用いています。

上記の例でpreventDefault()を行わなければクリックした際に「#」の影響でページトップへスクロールしてしまいますが、preventDefault()を使用することでaタグのhrefを無効化し、ページトップへスクロールしてしまうことを防げます。

# まとめ

- aタグにidを付与
- jqueryのアニメーションでスクロール
- ヘッダーの高さに応じてピッタリの位置に移動させる
LineBotをAWS LambdaからAzure Functionsに引っ越してみる

# 今回の目的
Azure Functionsの使い勝手を試してみること。
line boot awards 2018の開催も決まり、良い機会なので（本当は、たまたま時期が重なっただけ）、以前AWS Lambdaで作ったLineBotをAzure Functionsに移行してみることにした。
（特にAWS Lambdaに不便をしていたという訳ではなく、単純な知的好奇心）

## 検証の前提 
隙間時間を利用して技術検証等を行うためマシンに依存せずに作業ができるようにブラウザオンリーで実施可能な内容としている。
（ブラウザオンリーでの開発に固執中）

# 個人的な結論（感想）
プロトタイピングの基盤として Azure Functions はかなり便利。
単純に動くところまでなら、Lambdaよりも設定するところが少ないのでは（要確認）。。。
個人的に今後、ハッカソン等で活用するシーンが増えそう。

# 試した手順
Azure Functionsで関数"HTTP trigger"を定義し、下記要領で変更したソースをブラウザ上に貼りつけて終了。

```js:AWS_Lambda 
exports.handler = function(event, context) {
    let event_data = JSON.parse(event.body);
    let reply_token = event_data.events[0].replyToken;
    console.log(reply_token);
```

```js:Azure_Functions
module.exports = function (context, req) {
    let messageData = req.body.events && req.body.events[0];
    let reply_token = messageData.replyToken;
    context.log(reply_token);
```

参考とさせていただいた記事：[Azure Functions × LINE Bot をNode.jsでやってみよう](https://hotchpotchj37.wordpress.com/2016/12/19/azure-functions-x-line-bot-%E3%82%92node-js%E3%81%A7%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/)

但し、時代は進んでいるので、参考にしていた記事より簡単にモジュール追加は可能となっていた。

「プラットフォーム機能」→「コンソール」からnpm installが実行可能に！！
![console.png](https://qiita-image-store.s3.amazonaws.com/0/157737/98d9fec0-98a6-558c-4445-40363d462812.png)
Debian9.5 StretchのFireFox(Iceweasel)に絶望した人の脱ESRメモ

## **Hello!Qiita!!**
はじめまして！
社会人になり２年目のエンジニア（園児）やってます。

うさみ みすずです。（結構これでも肩がガチガチに固まって緊張しながら書いてます）

ああ...申し訳ないです...
こんなこと書くために登録したわけじゃないので話を戻さなきゃ。

今仕事で使っているマシンで、仮想マシンをParallels Desktopを使っているんですね。
で、Ubuntuを使ってたんですが...

**それがあまりに遅い...**

正確には...MacBook2015で動作するUbuntuがあまりにも遅いのでどうにかならんかと...
(2017では全く問題なく滑らか...古さは隠せないか...)

で、至った結論は

### ***UbuntuってDebian系だからdebian使えばいいんじゃないかな？？？***

で、思い立ったらやらかしたがるのが自分。（やりました。）

いや、Debianにしたらなぜかとても動きがよくなったのでカーネル...??
どうやらCentOS6.7も快適に動作したのでカーネル（わかってない）

## 使っているマシン

- MacBook Pro (Retina, 13-inch, Early 2015)
    -  CPU : 2.9 GHz Intel Core i5
    -  RAM : 16 GB 1867 MHz DDR3
    -  VGA : Intel Iris Graphics 6100 1536 MB

- 仮想環境(そこまで詳しく書かなくても今回はここあまり重要ではなかったりする)
    - VM : Parallels Desktop Lite for Mac ver.1.3.3(19752)
    - OS : Debian GNU Linux 9 （2018/08/02時点で最新だったイメージ使いました）
     
## どうなってたのか

Debianには、FireFoxがインストールされていません。
正確には、FireFox ESRというパッケージ（通称：Iceweasel)がインストールされているのでブラウジングには困りません。Iceweasel...氷のイタチ

### FireFox(火の狐)  ↔️  Iceweasel(氷のイタチ)
対立してるみたいですよね（赤いきつねと緑のたぬき...ちがう）

Iceweaselは、FireFoxのQuantumより前のビルド（FireFox 52）をもとに作成されています。
とはいえ、長期的にサポートしているようなのでそのまま...

### ダメです

自分も初めはそう考えました。
落とし穴に見事にハマってしまったのでこの記事を書いているということになりますね。（ああ恥ずかし）
何がダメって...

### アカウント同期できない
これは致命的...ブックマークも管理してる自分にはこれは致命的。
となり、脱ESRを計画したのでした...


## やったこと



- `/etc/apt/sources.list.d`に新しく`10-unstable.list`を作ります

```bash
# vim /etc/apt/sources.list.d/10-unstable.list
```
中に1行追加してあげます。

```10-unstable.list().
deb http://http.debian.net/debian unstable main
```
-  Default releaseに登録します

```bash
# vi /etc/apt/apt.conf.d/10default-release
```
中に1行追加してあげます

```10default-release().
APT::Default-Release "testing";
```

- いざインストール

これで登録完了です。
まずはリポジトリを更新します

```bash
# apt update
```
更新が済んだら、unstableを指定してfirefoxをインストール

```bash
# apt install -t unstable firefox firefox-l10n-ja
```

これで完了です。

ちなみに、Iceweaselは共存して残しておくことができます。
#### **が、同時に立ち上げることはできません。**
ご注意ください。

加えて、このまま他のパッケージインストールしようとするとインストールできません...
これで実行するともとに戻ります。

```bash
# apt install -t stable `インストールしたいパッケージ名
```


※今回、これを書いたのは。ネット上に色々インストール方法たくさんあってどれやればいいんだ...と頭抱えて当たりを見つけたので嬉しくてここに書いておけば他の人もできるかもしれないと思ったからです。良いDebianライフを...
IntelliJのTerminalでzshのPATHがおかしくなる問題の対処

# TL;DR
Preference -> Tools -> Terminal -> Shell integrationをオフにする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94/0bd6f486-e3e0-9755-99b2-c75d01527451.png)

# 経緯
いつからか、IntelliJでterminalを開くと以下のエラーが出るようになった

```
_direnv_hook:1: command not found: direnv 
```

で、調べてみると`$PATH`の中身が普通にiTerm2で開くときより少なくなっていて、必要なPATHが通ってないのが問題っぽい。
ググるとここら辺が見つかった

- [Pycharm terminal is missing part of $PATH – IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH)
- [PyCharm drops "/usr/local/bin" from PATH : PY-17816](https://youtrack.jetbrains.com/issue/PY-17816)

これの[このコメント](https://intellij-support.jetbrains.com/hc/en-us/community/posts/208567485-Pycharm-terminal-is-missing-part-of-PATH?page=1#community_comment_115000123750)に書いてあったのが、TL;DRに書いた内容で、僕の場合直った。
ansible を使って、ubuntu 16.04LTS を設定する

### だんだんと書いていきます。ansible を、python3 で使う前提です。備忘録ですので、あまり正確ではないです。ご容赦ください。

# 対象とする読者
- python3 になれていて、ansible のために、python2 は嫌だと思っている。
- サーバ設定ができればよく、stage,productionを区別する必要がない。
- 他人のスクリプトをできるだけ有効活用したい。([ansible galaxy](https://galaxy.ansible.com/home))
 

# 前提
- python3　で使う
- 対象とするのは、aws (vagrantではない）
- どうせ aws に設定するのだから、aws にしました。スポットインスタンスなら激安です。
- ubuntu は、16.04 の公式ＡＭＩを使用
- 設定側は、anaconda3の管理下のansibleを使う

# 準備
- inventory に下記のように書いて、ansible から、pythonが使えるようにする 
```
[ubuntu_hosts]
ホスト名
[ubuntu_hosts:vars]
ansible_python_interpreter=/usr/bin/python3
```
と書いておいて、
```
---
- hosts: ubuntu_hosts
  become: yes
以下省略
```
CSSのフォントサイズ単位「rem」はどんなときに有用なのか

#はじめに
3年ほど前でしょうか、一時期いたるところで持ち上げられていたCSSのフォントサイズ単位「rem」。
ですが、モダンブラウザ全盛の今でも有用に使われているシーンは少ないように思えます。（使っているサイトが少ないという意味ではありません）
何故そう思ったか個人的な見解をつらつら書いていこうと思います。

# remとは
ルート要素（html要素）のフォントサイズを基準に相対的なフォントサイズを指定するための単位。

```css
html {
  font-size:10px;
}

p {
  /* フォントサイズ 12px (10 * 1.2) */
  font-size:1.2rem;
}
```

# 何故有用な形で使われていると思えないのか
仕事柄いろいろなサイトのCSSを覗くことが多いですが「rem」を使っているサイトの大半が「px」指定と大差ない使い方をしている印象です。
なぜ、そう思うのか理由は一つです。

**「ルートのサイズを参照している意味がない」**

私が最初に「rem」で期待したのは、レスポンシブサイトの設定工数削減でした。
ルートの相対サイズを設定するという特性上、ルートの文字サイズを変更すれば各デバイスの文字サイズを再指定することなくスマートに設定でき、実装の工数が削減できるのではないかということです。

```css
html {
  font-size:14px;
}

.title {
  /* フォントサイズ 28px */
  font-size:2rem;
}

@media (max-width: 640px) {
  html {
    font-size:12px;
  }

  .title {
    /* フォントサイズ 24px */
  }
}
```

しかし現実はそうではありませんでした。

多くのレスポンシブサイトのフォントサイズは
**ルートの文字サイズ比率 ≠ 要素ごとの文字サイズ比率**
なのではないでしょうか。

どういうことかというと、以下のような設定の場合です。

|要素|PC |SP|比率|
|:--|:--|:--|:--|
|ルート|14px|12px|7:6|
|記事タイトル|40px|20px|2:1|

ルートのフォントサイズはPCが14px、SPが12pxに設定されていたとします。
この場合、ルートのフォントサイズ比率はおおよそ7:6になります。

しかし、PCではタイトルのフォントサイズが40px、SPでは20pxでデザインされていたとします。
このタイトルのフォントサイズ比率は2:1となります。

このような場合、SPタイトルはPCの設定のままではデザイン通りのフォントサイズにはならず、結局SP用に再設定する必要が出てきます。

そうなると今度は逆にSPのルート設定12pxに対して新しく相対サイズを計算し設定する必要が出てきます。
単体ではそうでもない労力ですがサイトの要素全てとなると、よっぽどスタイルガイドが定まっているサイトでない限りかなり厳しい印象です。

```css
html {
  font-size:14px;
}

.title {
  font-size:2.85rem;
}

@media (max-width: 640px) {
  html {
    font-size:12px;
  }

  .title {
    font-size:1.67rem;
  }
}
```

こういった事を避けるため、ルートのフォントサイズをデバイス関係なく10pxに固定しているサイトも多く見られます。
10pxにすることで相対サイズの計算が容易になるので、こういった措置をとっているのでしょう。
しかし、こうなってしまうとルートのサイズを参照している意味が薄れてしまうので「rem」である必要はありません。

もちろん、要素ごとの文字サイズ比率をルートの文字サイズ比率と同一にすればこの問題点はクリアできますが、見栄え上あまり現実的であるとは思えませんし、そういったサイトも見たことがありません。

# では有用なシーンとは
さて、ここまで聞いていると「rem」は不要にも見えますが有用なシーンは無いわけではありません。

私が「rem」を有用的に用いられると考えているのは**「ユーザーがフォントサイズを変えられるサイト」**です。
昔のサイトでよく見たような文字サイズ大・中・小の切り替えスイッチがあるようなサイトですね。

過去のサイトではフォントサイズ切り替え機能は「rem」のような相対参照型のサイズ指定「em」や「%」を使いルートのフォントサイズを変化させることで実装している例が多いと思います。
しかし「em」や「%」は親要素の設定とも相対的な設定を行ってしまうため設計や保守が難しくなる面がありました。
その反面「rem」はルートのみを参照するため設定が複雑になりにくく、以前に比べ設計や保守が容易になりますので、有用に用いることが出来ると考えられます。

# まとめ
色々と便利そうなフォントサイズ設定はありますが、実務ではpx指定が一番安牌であるという所感です。
実数値で分かりやすい点、他のサイズ設定に影響されない点など小規模なサイトを組むレベルであればこちらのほうが非常に分かりやすいです。
SASSを使えば変数でフォントサイズを管理可能ですし、ルートサイズを参照して一括で管理する旨味を活かせる場面は少ない印象でした。

結局この記事で何が言いたかったのかと言うと、新しい技術や設定に惑わされず必要に応じて最適な設定を選択しようということです。
古い技術やノウハウが役に立つ場面で新しい技術ばかり使おうとして逆に遠回りしている、なんてこともざらにあります。
CSSだけに限らずHTMLやjsでも頭を柔らかくして設計や構築を行っていきたいものです。

いやいや、もっと有用な場面あるよ！といった例があれば後学のためにも是非コメントいただけると幸いです。
走り書き的な内容でしたが最後まで読んでいただきありがとうございます。
Zend Framework 1, MailTrap.ioでメール配信デバッグ

皆さん、こんにちは。
今回、よく使ってるmailtrap.ioをZend Framework 1に導入してメール配信デバッグしかたを皆さんに共有されてもらいたいと思います。

#スタート
現在、メール配信デバッグのためのツールが結構あると思いますが、私の場合は、よくmailtrap.ioを使って、これいいなと思って、結構古いZF1にmailtrap.ioを設定しかたについて皆さんに共有します。

mailtrap.ioのホームページ：https://mailtrap.io/
とりあえず、一つのmailtrapのアカウントを作成してもらいます。
それから、ログインして、上右のコーナーに自分の名前を含めるプールダウンがありますので、そちらをクリックしてもらって、
https://mailtrap.io/inboxes
このURLにアクセスできます。
<img width="1365" alt="mailtrap_1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/248132/f33b2207-79bd-c82a-241e-9f03c2f676d2.jpeg">
こちらは、私のインボクスなんですが、皆さんの場合、「Demo Inbox」がないかもしれません。でも、「Create Inbox」ボタンがあるますので、簡単に一つのInboxを作成できます。
作成したInboxの詳細ページにアクセスしてもらって、
<img width="911" alt="mailtrap_2.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/248132/bde56e3a-8847-71f0-3807-660012d7ace0.jpeg">
設定情報が見えます。

そもそも、こちらのInboxの詳細ページの中に、Zend Frameworkに導入しかたが書かれてますが、私の設定しかたを教えてもらいたいと思います。

```ruby:application/configs/application.ini
system.mailtrap.setting.host = "smtp.mailtrap.io"
system.mailtrap.setting.username = "**********"
system.mailtrap.setting.password = "**********"
system.mailtrap.setting.auth = "LOGIN"
```
上記の４行をapplication.iniに追加したら、プロジェクのどこでも、下記のソースコードで、メールが遅れるようになります。

```ruby:
$mail = new Zend_Mail();
//メール内容設定
$mailSetting = Zend_Registry::getConfig()->system->mailtrap;
$transport = new Zend_Mail_Transport_Smtp($mailSetting->setting->host, $mailSetting->setting->toArray());
$mail->send($transport);
```
送られるメールは、mailtrap.ioのinboxに届きますので、inbox詳細ページで、確認できます。

以上となります。
アーティクルを読んでくれて、ありがとうございます。
ActiveDirectoryユーザーとコンピュータで　間違って削除されないようコンテナーを保護する

で誤って作成してしまったのですが

https://kametaro.wordpress.com/2008/06/13/%E2%80%9D%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E5%89%8A%E9%99%A4%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BF%9D%E8%AD%B7%E3%81%99%E3%82%8B/

によると
[表示]-[拡張機能]をクリックし、拡張機能の表示を有効にする。
と削除出来ないフラグが表示されるのでそれのチェックを外せば削除出来ますっ^^;
webスクレイピング　Ruby 学習記録①

##　概要
 Rubyを使ってwebスクレイピングを学習します
　その学習記録です

##webスクレイピングとは

ウェブサイトから情報を抽出するコンピュータソフトウェア技術のことです。
簡単に言うと、自分で　google　検索を作るみたいな感じです。

##　GUN Wget

　rubyでwebスピレイプングを学習する前に、GUN Wgetと言うソフトウェアが学習します。


GUN Wgetとは
・HTTP,FTF経由で自動ダウンロードを行うソフトウェア
・有名なダウンローダ

GUN Wgetのwiki
https://ja.wikipedia.org/wiki/GNU_Wget

##　GUN Wgetのインストール

　macのターミナルを開きます。
以下のコード打ち込むと、インストールされます。
macは、元から入っているぽいです。
```
＄brew install wget
```

##　　wget コマンド

|     |       |   
|:-----------------|------------------:|
| wget http://ファイルのURL          |      ダウンロード  |  
| wget -O 出力先PATH http://ファイルのURL  |           ファイルの保存先を指定する|     
| wget -c http://ファイルのURL           |           ダウンロードに失敗しても、再度やり直しする|       
| wget --limit-rate=制限する速度 http://ファイルのURL            |            ダウンロードの速度制限を行う |         
| wget -b http://ファイルのURL          |             wget -b http://ファイルのURL | 
| wget --user-agent="偽装するUserAgentの内容" http://ファイルのURL          |         UserAgentを偽装する |
| wget -i URLを記述したファイルPATH       |           URLの記述されたファイルを読み込んで複数ファイルを連続でダウンロードする |
| wget -r http://再帰的にダウンロードを行うURL　 | 　再起的にダウンロードを行う


##Wgetの再帰ダウンロードについて


再帰ダウンロードとは、ダウンロードするwebサイトに載っているリンク先までダウンロードすることである。



##参考文献
http://kengo92i.hatenablog.jp/entry/2014/09/01/173547
http://www.atmarkit.co.jp/ait/articles/1606/20/news024.html
https://www.amazon.co.jp/gp/product/4797380357/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1
人狼知能開発にて投票正答率を算出するプログラム

##　人狼知能開発で投票正答率を算出するプログラムを書いてみました
人狼に投票できてたら正解っていう感じの算出方法です

```py
import  multiprocessing
import glob
import os
from datetime import datetime

def real_vote_rate(agent,savefile):
    
    vote_num = 0
    hit_num = 0

    # だいたいログは100件なので
    for k in range(100):
        # logフォルダ内のデータから正答率を出す
        try:
            f = open('./log/'+str(k).zfill(3)+'.log') #ファイル読み込み
        except:
            continue
        lines =f.readlines()# 1行毎にファイル終端まで全て読む(改行文字も含まれる)
        f.close()
        # lines: リスト。要素は1行の文字列データ
        # 投票相手
        vote = 0
        # 自分のid
        selfid = 0
        # 人狼リスト
        wolf_list = []
        # トリガー
        torriger = 0
        for line in lines:
            newLine = line.replace('\n','').replace(' ', ',').split(',')
            
            if int(newLine[0]) == 0 and newLine[1] == 'status':
                # 人狼リスト作成
                if newLine[3] == 'WEREWOLF':
                    wolf_list.append(newLine[2])
                ## 自分のid
                if newLine[5] == agent:
                    selfid = newLine[2]
                if newLine[5] == agent and (newLine[3] == "WEREWOLF" or newLine[3] == "POSSESSED"):
                    break
            if newLine[1] == 'vote' and newLine[2] == selfid: 
                vote_num += 1
                vote = newLine[3]
                if vote in wolf_list:
                    hit_num += 1
    hitracio = (hit_num / vote_num )* 100
    text = '総投票数は' + str(vote_num) + '回' + '\n' + '正解数は' + str(hit_num) + '回' + '\n' + '投票正解率は' + str('{:.1f}'.format(hitracio)) + '%' + '\n' 
    file = open(savefile, 'a')    #追加書き込みモードでオープン
    file.writelines(text)
    file.close()
agent = 'hogehoge' # hogehogeを自分のAgent名に変更

# マルチプロセス処理
if __name__ == '__main__':
    now = datetime.now()
    savefile = '{0:%Y%m%d-%H:%M:%s}w_rate.txt'.format(now)
    jobs = []
    p = multiprocessing.Process(target=real_vote_rate(agent,savefile))
    jobs.append(p)
    p.start()
```
AlibabaCloud の CLIってどんなの？

# はじめに
Alibaba CloudのCLIツール
**aliyun**コマンドに触れます。

# ドキュメントはこちら
[Alibaba Cloudコマンドラインインターフェイス - Alibaba Cloudコマンドラインインターフェイス| Alibaba Cloud ドキュメントセンター](https://jp.alibabacloud.com/help/doc-detail/66653.htm?spm=a21mg.l28256.a3.1.64ea5095bbANhI)

> Alibaba Cloud CLI は、コマンドラインインターフェイスを通じて Alibaba Cloud リソースを管理および使用するためのツールです。Go に書かれ、Alibaba Cloud OpenAPI の上に構築されています。

# CLIをインストール(セットアップ)
セットアップ方法は、ドキュメントにあるのでそちらを参考にしてください。

- Mac
- Goバージョン

# Alibaba CloudのConfigure(設定)をする

[RAMユーザーにアクセスキー/シークレットキーを発行する](https://qiita.com/wa-ta-ru/items/c91a0d640b75b417b5b3)
で取得したアクセスキー/シークレットキーを使ってセットアップします。

```sh
[f_prg@aliyun] $ aliyun configure
Configuring profile '' in '' authenticate mode...
Access Key Id [*************ZFr]: AAAXXXXXXXXXX
Access Key Secret [***************************vA1]: BBBXXXXXXXXXXXXXXX
Default Region Id [ap-northeast-1]:
Default Output Format [json]: json (Only support json))
Default Language [zh|en] en: en
Saving profile[] ...Done.

  cn-shenzhen
  cn-hongkong
  ap-northeast-1
  ap-southeast-1
  ap-southeast-2
  ap-southeast-3
  ap-southeast-5
  ap-south-1
  us-east-1
  us-west-1
  me-east-1
  eu-central-1

Configure Done!!!
..............888888888888888888888 ........=8888888888888888888D=..............
...........88888888888888888888888 ..........D8888888888888888888888I...........
.........,8888888888888ZI: ...........................=Z88D8888888888D..........
.........+88888888 ..........................................88888888D..........
.........+88888888 .......Welcome to use Alibaba Cloud.......O8888888D..........
.........+88888888 ............. ************* ..............O8888888D..........
.........+88888888 .... Command Line Interface(Reloaded) ....O8888888D..........
.........+88888888...........................................88888888D..........
..........D888888888888DO+. ..........................?ND888888888888D..........
...........O8888888888888888888888...........D8888888888888888888888=...........
............ .:D8888888888888888888.........78888888888888888888O ..............
```

# コマンドを実行して見る
## CLIの権限のチェック
[AlibabaCloudのRAMユーザーを作ってみる](https://qiita.com/wa-ta-ru/items/ab4dacc67d787e0739fa)

[AlibabaCloudのRAMグループを活用する](https://qiita.com/wa-ta-ru/items/a029429161f6a6c9ab8e)

shinya-furuwataユーザーは
検証用グループにいれており
AdministratorAccess権限を持っています。

## コマンドを実行してみます
[AlibabaCloudでカスタムイメージを作成してみた](https://qiita.com/wa-ta-ru/items/3ee472750928577f84c3)

のイメージを取得してみます。

取得する際のコマンドは
**DescribeImages**
になります。

```sh
[f_prg@aliyun] $ aliyun ecs DescribeImages --ImageName nginx_on_centos|jq
{
  "PageNumber": 1,
  "TotalCount": 1,
  "PageSize": 10,
  "RegionId": "ap-northeast-1",
  "RequestId": "3450234D-F523-42F4-8558-2582757CC675",
  "Images": {
    "Image": [
      {
        "ImageId": "m-6we8hvui4or4kx2h31jb",
        "Description": "nginx_on_centos",
        "ProductCode": "",
        "ResourceGroupId": "",
        "OSType": "linux",
        "Architecture": "x86_64",
        "OSName": "CentOS  7.4 64位",
```

ここでは、jqコマンドに結果を渡し整形しております。
これがないと見にくいので、ぜひインストールしておいてください。

[jq](https://stedolan.github.io/jq/)

# まとめ
ざっとですが、aliyunコマンドに触れてみました。
このセットアップしておくと確実にやれる範囲が広がります。
ぜひ、コマンドをマスターしていきましょう。
OculusAvatarSDKを使うときに出たエラーまとめ


自分がOculusAvatarSDKを使ったときに出たエラーと対応方法をまとめました。

## インポートするもの

- [Oculus Avatar SDK](https://developer.oculus.com/downloads/package/oculus-avatar-sdk/)
- [Oculus Integration](https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022)

## ドキュメントとか

- [Developer Guide](https://developer.oculus.com/documentation/avatarsdk/latest/concepts/avatars-gsg-unity-mobile/#avatars-gsg-unity-gearvr)
- [凹みさん](http://tips.hecomi.com/entry/2016/12/25/142057)
- [photonで同期させる方法](https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/oculusavatarsdk)
- [photonで同期させる方法その2](https://torikasyu.com/?p=1106)


# 発生したエラー
# サンプルシーンが動かない
## エラー内容
SDKをインポートした後とりあえずサンプルシーンをエディタで実行すると
```
DllNotFoundException: libovravatar
```
というExceptionが毎フレーム発生する

## 原因と対応
PCにOculusRiftのRuntimeがインストールされていなかったのが原因っぽい
https://forums.oculusvr.com/developer/discussion/64365/error-start-avatarwithgrab

ここからRuntimeをインストールする
https://www.oculus.com/setup/

# 個人のアバターが表示されない
## エラー内容
個人のアバター（Personalized Avatars）を表示しようとするが表示されない
OculusUserIdがうまく取得できていないみたい

エディタでのエラーログ
```
GetLoggedInUserCallback:OVR35993423: Must call get_signature first (1971051)
```
OculusGoでのエラーログ
```
07-10 14:21:54.599: E/SignatureHelper(1574): Not a trusted user. Do you have Unlockulus or pass the IsTrustedUser gk?
07-10 14:21:54.601: E/ExternalPlatformLocal(1574): AppID found in Library does NOT match the appID in the bundle.
07-10 14:21:54.603: E/ProfileContentProvider(1574): Package not found in library
07-10 14:21:54.603: E/ProfileContentProvider(1574): com.oculus.horizon.service.ExternalPlatformLocal$PackageNotInLibraryException: Package jp.co.churapps.shimakaze.avatar.test not in users library
```

## 原因と対応
OculusGoで動かない原因はどうやらOculusのDeveloperDashboardからアプリをアルファ版でもいいから登録しないとだめみたい
https://forums.oculusvr.com/developer/discussion/62505/gear-vr-social-starter-problem-appid-found-in-library-does-not-match-the-appid-in-the-bundle

エディタで動かない原因は不明

# OculusのDeveloperDashboardでアプリをアップロードしようとするとエラーになる
## エラー内容
![SnapCrab_NoName_2018-7-10_15-38-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/275821/eb09428e-6394-b5bc-2d2e-4ac83a2d9bc4.png)

## 原因と対応

- デバッグビルドのチェックを外した
- Manifestを修正した
  - AndroidManifest.OVRSubmissionに記載されている内容をManifestに追記した
VRM：人型3Dアバターデータ用のファイルフォーマットのお話

皆さまこんにちは。
いい感じに開発に疲れてきたのでKnowledgeを書いている山田です。
今日はVRMというファイルフォーマットの話をします。

# VRMって何?
VRMは**VRアプリケーション向けの人型3Dアバター（3Dモデル）データを扱うためのファイルフォーマット**です。
ドワンゴが先日発表しました。
[公式サイト](https://dwango.github.io/vrm/)
[記事とか](https://www.moguravr.com/vrm-dwango/)

特徴としては、VRアプリケーションなどでのキャラクターや人型のアバターの利用に特化していることが挙げられます。

従来の3Dモデル用のフォーマットだと、以下のような問題があります。
以下公式サイトから引用

> 
- 3Dモデルを作成したクリエイターや使用したモデリングツールによって「作法」が違いデータの状況がひとつひとつ異なっている
  - 座標系が異なっていたり、スケールが異なっていたり、初期姿勢が異なっていたり、表情の表現方法が異なっていたり…
  - もちろん、骨（ボーン）の入れ方も状況によって異なっていたり
- 3Dモデルデータを取り扱うフォーマットは、各社各様で仕様が必要以上に複雑であったり、必要な情報が足りなかったりしている
  - 対応ソフトが多い「FBXファイル」はアプリケーションごとに読めたり読めなかったり。どのアプリケーションのどのバージョンで出力したFBXなのか…というのを気にしたかたも多いと思います
- 3Dモデルデータを「アバターとして使用する」という観点で見ると、必要な情報が整備されていない
  - たとえば一人称視点を実現するための視点の位置はどこか、一人称視点から表示するためには頭部の表示を消さなければならないが、具体的にはどこを消すのか、など


VRMはこれらの問題に対応し以下のような特徴があります
以下公式サイトから引用

> 
- プラットフォーム非依存で人型のキャラクター3Dモデルデータを取り扱うことが可能
- 3D標準フォーマット glTF2.0をベースとして、人型モデルを取り扱うための制約と拡張を加えたフォーマット。標準フォーマットをベースとしているため実装も容易
- テクスチャやマテリアルなどすべてのデータを含めて１ファイルにまとまる。ファイル一つで取り扱い可能
- スケール（1.00 = 1m）・座標系と向き（Y-up, -Z方向向き）・骨の構造（Unity Humanoid準拠構成, Tスタンス, 各骨にローカルの回転などを入れない）などについて標準の構成が決められておりモデリングツールによる差違の影響を受けない
- Blend Shapeやマテリアルの透明度など「キャラクターの表情」を取り扱うためにはさまざまな技法が使われるが、その技法の差違をVRM側で吸収し統一したAPIで操作できる
- VRでのアバター利用のための、「一人称視点再現のための情報」に対応。
- キャラクターの髪の毛などについて、物理エンジンに依存しない「揺れ物」標準実装を用意、設定可能に
- 標準実装としてのマテリアル（シェーダ）を用意。標準的なPBRだけでなくトゥーンシェーディングやUnlitレンダリングを設定可能
- タイトル・作者名などのメタ情報だけでなく、サムネイルやVR時代に即した、アバターに特化したライセンス情報も内包可能

3Dモデルデータそのものだけでなく、ライセンス情報などにも対応しています。

# VRMの標準実装がUnityで提供されている
VRMはプラットフォームによらず使用できますが、標準実装（UniVRM）がUnityで提供されています。
[こちら](https://github.com/dwango/UniVRM)

UniVRMを使うことでVRM形式のファイルをインポートしたり、3DモデルデータをVRM形式でエキスポートしたりすることができます。

# VRM対応アプリケーション

ドワンゴが提供している[ニコニ立体](http://3d.nicovideo.jp/)や[バーチャルキャスト](https://virtualcast.jp/)の他に、clusterなども対応しています。

さらに最近発表された[Vカツ](http://vkatsu.jp/)も対応しています。

# Vカツとは

VRカノジョを開発しているイリュージョンという会社が発表した、VTuber向けアバターモデリングソフトです。
誰でも簡単にアバターを作成することができます。
現在βテスト中です。
awsにssh接続が拒否された。

```shell
$ ssh -i aws-ssh-key.pem ec2-user@[IPaddress]
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'aws-ssh-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "aws-ssh-key.pem": bad permissions
ec2-user@[IPaddress]: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

```:グーグル翻訳
'aws-ssh-key.pem'のパーミッション0644があまりにも開いています。
秘密鍵ファイルには他の人がアクセスできないようにする必要があります。
この秘密鍵は無視されます。
読み込みキー "aws-ssh-key.pem"：不正なアクセス許可
ec2-user@[IPアドレス]：許可が拒否されました（publickey、gssapi-keyex、gssapi-with-mic）。
```

##結論
`Permissions 0644 for 'aws-ssh-key.pem' are too open.`という文字通り`アクセス権限`が問題。
なので、`$ chmod 700 aws-ssh-key.pem`とすれば、問題解決。

```shell
$ ssh -i aws-ssh-key.pem ec2-user@[IPaddress]

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 79 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-1-10 ~]$
```
Raspberry Pi Zero WHとPiカメラV2を使って静止画撮影やってみる

Raspberry Pi Zero WH(以下RaspberryPi)とPiカメラV2を使って静止画撮影にチャレンジしました。
言語はPython。
主に自分用の備忘録です。

#1 RaspberryPiの設定
　①RaspberryPiのカメラモジュール接続用コネクタに、カメラモジュールのリボンケーブルを差し込みます

　②RaspberryPiにsshで接続して、設定画面を開きます

```sh
 $ sudo raspi-config
```
 　③ 5 Interfacing Options を選択、P1 Camera をEnable
　 
  これでRaspberryPi側から、カメラモジュールを使う設定が完了しました

#2 python-picameraをインストール
　pythonからカメラモジュールを制御するために、今回はpython-picameraライブラリを使います
　Raspbianのアーカイブから利用できます

```sh
 $ sudo apt-get update
 $ sudo apt-get install python-picamera

 #python3のパッケージを使いたいとき
 $ sudo apt-get install python3-picamera
```

#3 使ってみる
 /home/pi の下にdevフォルダを作り、その中に camera.py を作成しました。

```python:/home/pi/dev/camera.py
#!/usr/bin/python
# coding: utf-8

#python-picameraをインポート
import picamera

with picamera.PiCamera() as camera:
    #解像度設定
    camera.resolution = (3280, 2464)
    camera.capture("/home/pi/dev/image.jpg")
```

 実行してみます

```sh
 $ cd ~/dev
 $ ./camera.py
```
 上手くいけば、/home/pi/dev の中に image.jpgが作られているはずです
【Spring Boot Devtools】debugする際、SilentExitExceptionで止まる時の解決方法

# 現象

spring-boot-devtoolsを入れてdebugモードでApplicationを起動すると、
必ずSilentExitExceptiondeで止まってしまいます。
もちろんブレークポイントは設定していません...。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261128/5da8ac3d-0ca3-16c9-26d0-4586980356ff.png)
※原因は[bev-toolのバグ](https://stackoverflow.com/questions/32770884/breakpoint-at-throw-new-silentexitexception-in-eclipse-spring-boot)とのこと。
## ちなみに、Spring Boot Devtoolsとは

クラスパスのリソースの中で変更があった際に自動リスタートしてくれます。
build.gradleに以下の記述、再読み込みをすればOK!

```build.gradle
dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
```

# SilentExitException回避方法

eclipse[環境設定]->[java]->[debug]
suspend execution on uncaught exceptions
のチェックをはずす。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261128/b6552f71-4872-b136-1cdb-8cdeb80cd244.png)

上記の対応によってSilentExitExceptionでdebugが止まることはなくなり、
スッキリしました！
Activityのライフサイクル

<h2>
<u>概要</u></h2>
Activityのライフサイクルメソッドを理解してコーディングすることは非常に重要です。
以下に各メソッドの大枠の役割を記載致します。

<table border="1"><tbody>
<tr>     <th>コールの順番</th><th>メソッド名</th>     <th>役割</th> </tr>
<tr>     <td>1</td><td>onCreate</td>     <td>画面が可視化される前の初期処理を行う</td> </tr>
<tr>     <td>2</td><td>onStart</td>     <td>画面が可視化される直前の処理を行う</td> </tr>
<tr>     <td>3</td><td>onResume</td>     <td>画面が可視化される状態の処理を行う</td> </tr>
<tr>     <td>4</td><td>onPause</td>     <td>画面が別の画面へ遷移する際の処理を行う</td> </tr>
<tr>     <td>5</td><td>onStop</td>     <td>画面が見えなくなった際の処理を行う</td> </tr>
<tr>     <td>6</td><td>onDestroy</td>     <td>画面が破棄される直前の処理を行う</td> </tr>
</tbody></table>

<h2>
<u>詳細</u></h2>
<h4>
oncreate</h4>
<ul>
<li>アクティビティが作成された際に、一度だけ初期化されるべきリソースの初期化を行う。</li>
<li>回転などによって破棄されて作り直される場合、前の状態が保存されていれば、onCreate()の引数であるBundleオブジェクトが渡される。</li>
</ul>
<h4>
onStart</h4>

<ul>
<li>Activityをユーザーに見せる直前に呼び出される</li>
<li>onStart()が呼び出されてからonStop()が呼び出されるまでがユーザーに画面が表示されている期間なので、ここで、バックグラウンド処理のコールバックの登録などを行ったりする。
例えばonStart()メソッドの中でブロードキャストレシーバを登録して、UIに影響を与える変化を起こす通知がこないか監視するようにし、onStop()でその登録を解除する。</li>
</ul>

<h4>
onResume</h4>

<ul>
<li>Activityが復帰する時や、新しいインテントが届いた時に呼び出される</li>
<li>Activityが最前面に来ていて、ユーザーと対話状態になる直前に重い処理を
挟むと表示されてしばらく操作できないということになるので、
ここで呼び出す処理は可能な限り軽くすることを推奨。</li>
</ul>

<h4>
onPause</h4>

<ul>
<li>Androidが別のActivityへ遷移しようとするタイミングで呼び出される。</li>
<li>ユーザーとの相互作用を停止するための準備。</li>
</ul>

<h4>
onStop</h4>

<ul>
<li>Activityがユーザーから見えなくなったときに呼び出される</li>
<li>上記が起こるのは、Activityが破棄される場合と、別のActivityに隠される場合がある</li>
<li>onStart()メソッドの中で設定した、UIに変化を起こすバックグラウンド処理の監視などを解除する。</li>
</ul>

<h4>
onDestroy</h4>

<ul>
<li>Activityが破棄される直前に呼び出される。</li>
<li>onCreateで取得したリソースを解放するのが一般的。</li>
</ul>
rails5にするとパフォーマンスが向上するのかチェックしてみた。

# rails5アップデートでサイトパフォーマンスは向上するのか。
2014年ごろにrails4で作られたウェブサイトを rails5.2 までアップデートしてみました。

環境は少し特殊でmysqlとmongoの両方を用いています。

```terminal:rails4
Rails version             4.1.4
Ruby version              2.3.4
RubyGems version          2.6.13
Rack version              1.5.5

----- databases -----
mongoid version           4.0.2
Active Record version     4.1.4
```


```terminal:rails5
Rails version             5.2.0
Ruby version              2.3.4
RubyGems version          2.6.13
Rack version              2.0.5

----- databases -----
mongoid version           6.4.1
Active Record version     5.2.0
```

## テストサーバー情報
サーバはAWSを用います。

こちらからペネトレーションテスト（侵入テスト）を行う事を事前にAWSに申請しないと怒られますので申請を忘れずに。
https://aws.amazon.com/jp/security/penetration-testing/

| スペック | vCPU | メモリ（GiB） | SSD ストレージ（GB） | 専用 EBS 帯域幅 (Mbps) |
|:--|:--|--:|--:|--:|
| m4.large | 2 | 8 | EBS のみ | 450 |


rails4環境rails5環境のどちらもこのインスタンスで実験を行います。
構成はnginx unicornで動作しております。


## 速度検証 Apache Bench編
Apatche BenchについてはこちらのQiita記事をご参考にどうぞ
https://qiita.com/flexfirm/items/ac5a2f53cfa933a37192

今回は以下の設定でチェックします。

```
ab -n 1000 -c 100
```

### Rails4環境
```
合計時間：92.265 seconds

              最速  中央値   最大
接続時間:       28   75     673
処理時間:      561  8958   10915
待ち時間:      332  8929   10879

合計時間:      666  9041   10947
```


### Rails5環境
```
合計時間：123.780 seconds


              最速  中央値   最大
接続時間:       28    35     651　　     # 53%の高速化
処理時間:      525   12154   13493　　　　　　　# 35%の低速化
待ち時間:      514   12140   13483　　　　　　　# 35%の低速化

合計時間:      658   12194   13525　　　　　　　# 26%の低速化
```

# 検証結果パフォーマンスが25.4%落ちた
## rack mini profilerで原因を探る
まずはSQL発行数と実行時間、Rails5になってから11クエリ減少したが、実行時間が45ms伸びてしまっている。

Rails4環境：43クエリ（70ms）
Rails5環境：32クエリ（115.6ms）


## renderしているものが確実に増えた。
ブラウザキャッシュの影響も多少はあると思いますが、明らかに読み込んでいるファイルが増えました。
低速化の影響はview側のrenderの影響が強いと思われます。
WSLのArchLinuxでgnuplotが使えない

# エラー表示
WSLにArchLinuxが入ったので, 意気揚々とgnuplotをインストールしました.

```:bash
   sudo pacman -S gnuplot
```

それでgnuplotを実行しようと思ったら...

```:bash
   gnuplot: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
```

と言って怒られてしまいました.

# 解決方法
次のようにコマンドを走らせるだけで, エラーを吐かなくなります.

```:bash
   sudo strip --remove-section=.note.ABI-tag /usr/lib/libQt5Core.so.5.<...>
```

<...>の部分には, 現在入っているlibQt5Core.soの種類に応じて変更してください.(たくさんあるように見えますが, 私の環境では他はシンボリックリンクで, 存在しているのは一つのみでした)

# 最後に
あまりこのコマンドを理解しておりませんので, なにか情報を提供いただけたら非常にうれしいです.