OmniAICreator/Qiita-1.07M huggingface dataset:
2-Elasticsearchの構成を検討する

#はじめに
定義ファイルや起動コマンドの解説をする前にどういった構成を作成するか記述します。
下記事項はインストールする前に検討した方が良いです。

#Elasticsearch 構成の検討
実際に設定をしていく前にElasticsearchの構成を検討します。
今回は下記のような構成を考えました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47012/e303a4f6-b786-f4f3-850a-9ffe2b045232.png)

(1)サーバ(インスタンス)の台数について
デフォルトのシャード設定がプライマリ5：レプリカ1と言うことで、何も考えずにデータを投入した際に1サーバに1シャード配置される想定で5台としています。
次の項目で記載するマスター適格ノードの考察から、クラスタを構成する場合はサーバ3台以上が望ましいと思われます。

(2)マスター適格ノードの数について
図中ではMasterと記載しています。
後ほど記載するのですが、定義ファイル内にマスター適格ノードの最低数を定義する項目があります。
その算出式が「マスター適格ノードの合計数 / 2 +1」となっています。この式から最低数が2ノードであり、1ノード障害を考慮すると3ノードかなと思われます。

一般的なクラスタでも3台以上の構成というのが多いので、今回は3ノードとします。
(どこかにElasticsearchのクラスタ構成に関する記述があったと思いますので、後で探してみようと思います。)

(3)データノードの数について
上述した通りデフォルトのシャード分割から5つとしています。

1ノードのメモリ上限が30GBですので、サーバ1台にデータノードを複数保持することも可能です。
ただし、サーバ障害やメンテナンス時に停止となるノード数が複数になってしまうため、データ欠損の可能性があがります。
このあたりはシャード/性能/冗長性を考慮する必要があり、一度構成を組んで実際に使いながら検討をした方が良いです。
格納されるデータの内容や量、ユーザ数や利用状況等々により変わってくるので、事前に検討は難しいと思います。

(4)クライアントノード(Ingest node)
マスターと同様の考えで3ノードとしています。

#サーバの構成について
##物理か仮想か
Elasticsearchの性能設計はどうしたら良いのか色々と調べましたが、これと言った算出根拠はありませんでした。
色々なところに書いていますが、格納されるデータの内容や量、ユーザ数や利用状況等々で必要性能が変わってくるため、公式ではあまり触れていないのかなと類推しています。

上記もあり柔軟にリソースの変更が可能な「仮想」をオススメします。

##リソースの検討
サーバのリソースを検討します。

公式HP
https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html

(1)CPU
2コア～8コア以上のCPUが推奨となっています。

(2)メモリ
下記の条件から検討します。

OSの半分のメモリをElasticsearchに割り当てる
マスター及びクライアントノード：4～8GB
データノード：～30GB
RHEL#3がノード数最多なので、こちらを基準とします。
最大でElasticsearchとして46GB使用しますので、96GB(92だが一般的なメモリで搭載したケースを考慮)のメモリが必要です。

(3)ディスク
ディスクI/OがElasticsearchの性能に大きく影響するようです。

SSDをお勧めします。
Elasticsearchの　データは他のところに原本がある／データを分散保持しており、他から再構成が可能　という特性からRAIDは組まなくても大丈夫かなと思います。

データの保存場所は定義ファイルで複数指定できるので、複数本のSSDを接続して容量を確保できます。
CSVをEXCELで開いても0落ちさせない加工

# 事象

例えば、以下の様なCSVがあった場合

```sample.csv
number,name
01,name1
02,name2
03,name3
```

エクセルで開くと先頭の0が消えます。

```excel_open.csv
number,name
1,name1
2,name2
3,name3
```

# 対応

数値を`=""`で囲んであげます。

```sample.csv
="number",name
="01",name1
="02",name2
="03",name3
```
# ツール

```awk:convert.sh
FILENAME=$1

cat $FILENAME |
awk '{FS=",";OFS=","}{$1="=""¥""$1"¥""}1' > $FILENAME.tmp
mv -f $FILENAME.tmp $FILENAME

iconv -t SJIS $FILENAME -o $FILENAME
```

## 使い方
convert.shの第一引数に加工したいファイルを指定し実行します。

```
 $ convert.sh sample.csv
```

デフォルトではcsvの全ての行に対して、1列目の値を`=""`で囲んでいます。
`=""`で囲みたい列を変更したい場合は、シェル4行目の`$1`の部分を`$列`に変更して下さい。
ex) csvの2列目を0落ち対応加工したい場合

```diff:convert.sh
FILENAME=$1

cat $FILENAME |
- awk '{FS=",";OFS=","}{$1="=""¥""$1"¥""}1' > $FILENAME.tmp
+ awk '{FS=",";OFS=","}{$2="=""¥""$2"¥""}1' > $FILENAME.tmp
mv -f $FILENAME.tmp $FILENAME

```
curlコマンドでWebDAVサーバアクセス

# WebDAVとは

HTTPを拡張したプロトコル。
アップロード、ダウンロードなどコンテンツ管理が全てHTTPで操作できる。

# 構文

## 基本構文
```
$ curl --url アクセスURL -X HTTPメソッド
```

## アクセスにID、パスワードが必要な場合
```
$ curl -u ID:PASS --url アクセスURL -X HTTPメソッド 
```

# 使用方法

アクセスするWebDAVサーバ内部の構成は以下を想定します。

```
URL: example.com

#ディレクトリ構成
directory
├── file1.txt
└── file2.txt
```
## ファイルダウンロード

WebDAVサーバ上の`file1.txt`をダウンロードする

```
$ curl --url http://example.com/directory/file1.txt -X GET
```

## ファイルアップロード
カレントディレクトリの`upload_file1.txt`をアップロードする

```
$ curl -T upload_file1.txt --url http://example.com/directory/upload_file1.txt -X PUT
```

## ファイル削除
WebDAVサーバ上の`file1.txt`を削除する

```
$ curl --url http://example.com/directory/file1.txt -X DELETE
```
最初の記事はFizzBuzzで。I love C#!

ようやくQiitaにアカウントを作り、何か投稿しようと思ったのですが、まずは毒にも薬にもならぬFizzBuzzから書いてみます。
役に立たない記事でごめんなさい m(_ _)m

```csharp:FizzBuzz.cs
using System;
using System.Linq;

namespace Sample {
    class Program {
        static void Main(string[] args) {

            Enumerable
                .Range(1, 100)
                .Select(FizzBuzz)
                .ToList()
                .ForEach(Console.WriteLine);

            string FizzBuzz(int num) =>
                num % 15 == 0 ? "FizzBuzz" :
                num % 3 == 0 ? "Fizz" :
                num % 5 == 0 ? "Buzz" :
                num.ToString();
        }
    }
}

```

無難にもほどがあるコードですが、ご挨拶までに。
Numpy > array > np.array(None) > size=1であるが0番目の要素: too many indices for array < ゼロ要素のnumpy arrayを返そうとして

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 検討事項

- ゼロ要素のnumpy.arrayを返す

### code


```test_nparray_zero_elem_180512.py
import numpy as np

wrk = np.array([])
print(wrk.size)

wrk = np.array(None)
print(wrk.size)
print(wrk[0])
```

```txt:run
$ python3 test_nparray_zero_elem_180512.py 
0
1
Traceback (most recent call last):
  File "test_nparray_zero_elem_180512.py", line 8, in <module>
    print(wrk[0])
IndexError: too many indices for array
```


### 得られた知見

- numpy.array(None)
    - sizeは1になる
    - 0番目の要素の出力はエラーになる
Plesk OnyxでLaravelのartisan

CentOS上のPlesk Onyxで、Laravelのartisanコマンドを行う場合、通常通りの
「php artisan」とするとCentOSに標準で入っているPHP5.4を使用するのでエラーとなる。

Pleskで管理しているPHPを利用する。

```sh
$ /opt/plesk/php/7.1/bin/php artisan
```

Plesk Onyxでは、PHPのバージョンの切り替えができるので「7.1」の部分を変えて他のバージョンを使うこともできる。

```sh
$ ls /opt/plesk/php
5.6  7.0  7.1  7.2
```
Android phoneをUbuntuパソコンのカメラとして利用する方法


# まずはパソコンに専用ソフトをいれようDroidcam
どうやらこのアプリが良さそうでうまく起動して映像をパソコン内に送ることに成功したので情報をシェアします。以下のサイトを参考にしました。
[Droidcamのインストール方法](http://ubuntuhandbook.org/index.php/2016/12/install-droidcam-ubuntu-16-04/)
この方はよく情報を丁寧にまとめていてわかりやすいですよね。
たまにうまく行かないことがありますが、ぼくの環境では上手にできたので共有します。
Ethereum のトランザクションハッシュからトランザクション詳細を取得

# Install Web3 (version 1.0)

```
$ npm install web3
```

# Example code

```js
const Web3 = require('web3');
console.log(Web3.version);
// => 1.0.0-beta.34

var web3 = new Web3('wss://mainnet.infura.io/ws');
const transactionHash = '0x6d365aa4dda50738ae9b63d0ec634d9163c814a1f257b88ed383bd3dae33bbb2';
web3.eth.getTransaction(transactionHash, function (error, result){
	console.log(result);
});

// result =>
// { blockHash: '0x767636dfb822296c23222714a0136a938d6436de5293ae59282b3ce266e7c04e',
//   blockNumber: 5526818,
//   from: '0x5baeB16048431F0F6f366788d0c1B381280c3f81',
//   gas: 21000,
//   gasPrice: '50000000000',
//   hash: '0x6d365aa4dda50738ae9b63d0ec634d9163c814a1f257b88ed383bd3dae33bbb2',
//   input: '0x',
//   nonce: 0,
//   to: '0xF02c1c8e6114b1Dbe8937a39260b5b0a374432bB',
//   transactionIndex: 55,
//   value: '4290000000000000',
//   v: '0x26',
//   r: '0x7340afd3e9c3bb3159443af772fd50cb0720fa0d1a82bfe3bcf9b7b539c1ce60',
//   s: '0x4951b17a78169233a0ee24651eff54265fd6dbb6cbaa2fc5c55cffcf78743123' }
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_のトランザクションハッシュからトランザクション詳細を取得
Numpy > vector > if (n == (vector)0) @ CのNumpy実装 > np.count_nonzero()を使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### C実装

```c
if (n == (Vector)0)             // triangle is degenerate
```

これをNumpyでチェックするにはどうするか?

### 参考

https://stackoverflow.com/questions/18395725/test-if-numpy-array-contains-only-zeros

np.count_nonzero()を使うとのこと。

### code

```test_numpy_array_all_zero_180512.py
import numpy as np

vecU = np.array([3.0, 1.0, 4.0])


def check_all_zero(avec):
	return (np.count_nonzero(avec)==0)


res = check_all_zero(vecU)
print(res)

res = check_all_zero(vecU-vecU)
print(res)
```

```txt:run
$ python3 test_numpy_array_all_zero_180512.py 
False
True
```
Spring Data JPA SQLログ出力

Spring Data JPAでは、Repositoryインターフェースに定義するメソッド名称により、SQLが自動生成されます。

便利だと思う反面、SQLに慣れ親しんでいる私は、生成されたSQLを見ないと落ち着きません。

以前、Log4JDBCを使ってSQLをログ出力する方法を書きした。
https://qiita.com/thankkingdom/items/add99a658302262b1645#log4jdbcを使ったsqlログ出力

~~しかし、社内プロキシ経由ではダウンロードできないようで利用できませんでした。~~
JUnit5を利用しており、Log4JDBCのJARはjunit4に依存しているため使えませんでした。

そこで、今回は、application.propertiesに設定する方法があったので紹介します。

```properties
# SQLログ出力
logging.level.org.hibernate.SQL=debug

# バインドパラメータ出力
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace
logging.level.org.hibernate.type.EnumType=trace
```

▼追記
次の設定では、SQLのみ出力されました。ログフォーマットには整形されず。

```properties
spring.jpa.show-sql=true
```


###### 参考サイト
https://qiita.com/sndr/items/af7d12be264c2cc4b252
http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/jpa/index.html
http://ice-black.hatenablog.com/entry/2018/04/29/164233
3D座標の重心を計算する > Python operator:面倒 | Numpy array:簡単

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### 処理

- 3D座標の重心を求めたい
    - 座標要素ごとの加算が必要

### 情報

https://stackoverflow.com/questions/18713321/element-wise-addition-of-2-lists

operatorパッケージのaddをmap()で処理している例がある。

しかしながら、これは面倒である（後述のコード参照)

### PythonとNumpyでの処理


```test_3D_center_180512.py
from operator import add
import numpy as np


def add_python(v1, v2, v3):
    print('===add_python===')
    center1 = (v1 + v2 + v3)
    print(center1)

    wrk = map(add, v1, v2)
    center2 = map(add, wrk, v3)
    print(*center2)


def add_numpy(na1, na2, na3):
    print('===add_numpy===')
    wrk = na1 + na2 + na3
    print(wrk)


def calc_center(na1, na2, na3):
    print('===calc_center===')
    center = (na1 + na2 + na3) / 3.0
    print(center)

TV1 = [-42, -8, 60]  # TV: Triangle vertex
TV2 = [43, 41, 60]
TV3 = [21, -54, 60]
add_python(TV1, TV2, TV3)

na1 = np.array(TV1)  # na: numpy array
na2 = np.array(TV2)
na3 = np.array(TV3)
add_numpy(na1, na2, na3)

calc_center(na1, na2, na3)

```

```txt:run
$ python3 test_3D_center_180512.py 
===add_python===
[-42, -8, 60, 43, 41, 60, 21, -54, 60]
22 -21 180
===add_numpy===
[ 22 -21 180]
===calc_center===
[ 7.33333333 -7.         60.        ]
```

Numpy arrayで処理するほうが遥かに簡単ですね。
geometry > 3D上の配置を検討 > 座標情報を取得する: Tinkercadを使う | 座標から配置を知る: JSFiddle(or Tinkercad)を使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### やりたいこと

3Dでの線分と三角形の交差判定の実装。

しかしながら、3D上の点の座標を頭の中で考えられるような技能は持っていない。

簡単なツールはないものか。

### 座標情報を取得する > Tinkercadを使う

1. Tinkercad上で球を配置する
2. RULERツールを用いて、球の座標を取得する

https://www.tinkercad.com/things/1VYgZjKw33g
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9b9e1155-babd-4884-882a-8993be3f48ab.png)

上記の例では赤の球が三角形の頂点を表す。
選択された頂点の座標は(7, 24, 59)

### 座標から配置を知る > 1. JSFiddleを使う

上記で得られた座標から計算をした結果を3D表示するにはJSFiddleのコードを使う。
[three.js > 3次元矢印 > ゆっくり回転 / グラデーション](https://qiita.com/7of9/items/b87e8b80c895082d52e6)

上記のv0.5からForkした下記を使う。
http://jsfiddle.net/ahzwh3r1/5/
`//arrow information`とradiusを見たい設定にする。

TinkercadとJSFiddleではy,zの座標定義が異なるかもしれない。

### 座標から配置を知る > 2. Tinkercadを使う

Tinkercadで球を追加して、計算結果の座標を入力する。


## 注意点

**Tinkercad上でRULERを非表示にすると、次回RULER表示時に座標位置が変化する。
RULERは非表示にしないこと。**
（備忘録）音声アプリ開発に役立つ便利ツールまとめ

# 1. はじめに
Alexaスキル（音声スキル）やGoogleアシスタント（音声アプリ）開発に役立つ便利ツールについて、自分への備忘録として関連資料をまとめてみました。ご参考になれば幸いです。

# 2. AlexaのInteractionModel.jsonをLambdaプログラムに変換できるツール
[ツール：Skillinator.io](https://skillinator.io/)
[参考：Developers.IO](https://dev.classmethod.jp/voice-assistant/introduce-to-skillinator-io/)

# 3. GoogleのDialogflowからエクスポートしたzipをAlexaのInteractionModel.jsonに変換できるツール
[ツール：dialogflow2alexa-skill-json](https://github.com/miso-develop/dialogflow2alexa-skill-json)
[作者：田中みそ様](https://qiita.com/miso_develop)

# 4. おわりに
少しでも、みなさまの音声アプリ開発の参考になれば幸いです。
AWS によるサーバレスアーキテクチャでの Auth0 使用について

「AWS によるサーバレスアーキテクチャ」という本で Auth0 というサービスを使っているが API などのバージョンが古くて本の通りではできなかった。何をしたかのメモ。

# 前提
- Auth0 初心者
- ６章以降何をするかわかっていないのでこの変更で困るところがあるかも
    - そもそも本の通りにはできないが、、、

# 主な変更点
- Lock v9 -> v11 にする
    - access token の取得方法が異なるのでコード改変が必要
    - [Lock v11 for Web](https://auth0.com/docs/libraries/lock/v11)
- JWT を使えない
    - Lock v11 で帰ってくる access token は JWT ではないので userinfo API を利用して検証する。
    - 本では tokeninfo API 使用してる
WindowsでNuGet Packageの保存場所を変更する

# 概要
NuGetの初期設定のまま使用すると、
`C:\Users\[ユーザ名]\.nuget\packages`
に保存される。自分のPCはCドライブの容量が少なくなったため、パッケージの保存場所を変更したく変更方法を調査。

# 設定方法
## 設定概要
次のサイトに従い設定。
https://docs.microsoft.com/ja-jp/nuget/consume-packages/configuring-nuget-behavior
自分は個人でしかPCを使用しないため、個人設定をコマンドから変更。

## 設定詳細
1. NuGetコマンドラインのインストール
https://www.nuget.org/downloads
からNuget をダウンロード
自分は`D:\bin\nuget`に保存。

2. コマンドから設定ファイルを変更
`nuget config -set repositoryPath=D:\NuGetPackages`

`%appdata%\NuGet\NuGet.Config`に次の設定が追加されていることを確認

```XML:追加された記述
<config>
　<add key="repositoryPath" value="D:\NuGetPackages" />
</config>
```
3. 動作確認
適当なプロジェクトからNuGetパッケージをダウンロード。`D:\NuGetPackages`にパッケージがダウンロードされていることを確認。

４．うまくいかない事象（2018/6/30追記）
後日、別プロジェクトのビルド中に次のようなエラーが発生
`DeleteTemporaryAudioData.csproj(180,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\packages\Microsoft.Web.WebJobs.Publish.2.0.0\build\Microsoft.Web.WebJobs.Publish.targets.`

プロジェクトファイル（.csproj）を確認すると、同ファイル内に次の記述があった。

```XML:
<Error Condition="!Exists('..\packages\Microsoft.Web.WebJobs.Publish.2.0.0\build\Microsoft.Web.WebJobs.Publish.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebJobs.Publish.2.0.0\build\Microsoft.Web.WebJobs.Publish.targets'))" />
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.3\build\netstandard2.0\NETStandard.Library.targets'))" />
<Error Condition="!Exists('D:\NuGetPackages\Microsoft.Web.WebJobs.Publish.2.0.0\build\Microsoft.Web.WebJobs.Publish.targets')" Text="$([System.String]::Format('$(ErrorText)', 'D:\NuGetPackages\Microsoft.Web.WebJobs.Publish.2.0.0\build\Microsoft.Web.WebJobs.Publish.targets'))" />
```

初期値をいじったことによる影響か、認識がうまくいかずエラーとなりビルドに失敗する。
../packagesに指定のnugetパッケージをコピーすることで、エラーは回避できるが何とも腑に落ちない結果となった。

以上
LINE＠ではまったポイント

言語はPHPです。

#BotのREPLY_MESSAGE(自動応答メッセージ)がWebhook URLで指定したURLにアクセスこない

LINE＠機能利用の自動応答メッセージを「利用しない」にする。
最初はあまり文章説明読まずに、REPLY_MESSAGEを利用するかどうかかと思い、利用するにしていた。
Webhook URLにアクセスが届かず、はまった。。。

![ライン返信メッセージ.png](https://qiita-image-store.s3.amazonaws.com/0/79214/6c1f2748-e0d0-167c-e265-77b77095d844.png)


#応答メッセージのreplyTokenの取得
1メッセージごとに、メッセージを識別するトークンが割り振られる。それが、応答トークン(replyToken)。

リクエストにある。下記のような感じで、リクエストから取得する。
`$replyToken = $request->events[0]['replyToken'];`
この値を`'<replyToken>'`に設定する。

[応答メッセージを送るAPI](https://developers.line.me/ja/docs/messaging-api/reference/#anchor-36ddabf319927434df30f0a74e21ad2cc69f0013)

#APIリクエストでのエラーメッセージ
`The property, XXX, in the request body is invalid (line: XXX, column: XXX)`
リクエストボディに無効なプロパティが指定されていました。XXXの部分に具体的な行と列が表示されます。

指定項目をチェックしても原因が分からない場合は、配列にすべきだが配列になっておらず、エラーになっている可能性が高い。
mon-put-dataを使う際のcredentialの設定


mon-put-dataでcustom metrics送信したかったけどcredential情報の設定で少しハマったのでメモ。

## 結論

AWSAccessKeyIdやAWSSecretKeyを直接exportするのではなく、ファイルに記述した上で、そのファイルPATHをAWS_CREDENTIAL_FILEとして設定する必要があるようです。

>インストール時のメッセージに環境変数にexport AWSAccessKeyId=...しろ的なコメントが出るので別にファイルに設定する必要は無いのかな？と思い、しばらくハマりました。

### ファイルの作成と設定の記述

適当な場所に設定ファイルを作成します。

```bash
cd
vi aws_credential
```

KeyとかSecretと記述します。

```bash
AWSAccessKeyId=xxxxxxxxxx
AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

credentialファイルの位置をexportしてやります。

```bash
export AWS_CREDENTIAL_FILE=/path/to/aws_credential
```

うまく動けば.bash_profileとかに書いておけばいいでしょう。

## mon-put-data

### Amazon Linux

始めからはいっていますが、上記の設定をする必要があるようです。


### Mac

下記でインストール可能です。

```bash
brew install aws-mon
```

### CentOS

```bash
sudo yum install aws-apitools-mon
```

### Ubuntu

```bash
sudo apt-get aws-mon
```

## 利用

まあ、おおよそ下記な感じ。

```bash
mon-put-data --metric-name "test metrics-001" --namespace "TestMetrics" --dimensions "InstanceId=xxxxxxx" --value 100 --unit "Count" --region ap-northeast-1
```

>regionつけないと、バージニアに飛ぶようです。。。
あと、Metricsは明示的に削除できないようなので、作成するときには名前とか注意した方がいいですね。

### InstanceIdの取得

EC2からだと下記で取得可能。動的にやるなり静的にやるなり。

```bash
curl -s http://169.254.169.254/latest/meta-data/instance-id
```

## 参考

* http://komaken.me/blog/2018/01/15/cloudwatch%E4%BE%BF%E5%88%A9%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E3%83%A1%E3%83%A2/
Bokehのインタラクティブプロットをwebサイトにシュッと埋め込む 

##プロット結果のHTMLを生成してWebサイトに埋め込こみたい
Pythonでプロットしたグラフをwebに埋め込めるライブラリとして有名なものだとmpld3やPlotly、そしてBokehなどが挙げられるでしょうか。
例えばQiitaでも下記のような記事で、Bokehを使ったプロットをwebに埋め込むための方法が簡潔にまとめられています。

[BokehのグラフをWebサイトにシュッと埋め込む
](https://qiita.com/yoku_001/items/0effd2c1cf59daccd80b)
ただ、それがインタラクティブなプロットとなると少し面倒。
本稿では、妥協をしつつインタラクティブプロットをwebサイトにシュッと埋め込みたい人のために、数値計算の実行コードのみをJSに肩代わりさせることで非常にシンプルにプロット結果のHTMLを生成する方法を紹介します。
##インストール
condaもしくはpipでインストールできます。

```bash:
$conda install bokeh
```

```bash:
$pip install bokeh
```
こだわりがなければCondaが良いみたいです。

##サンプルコード
以下、Sin波のサンプルコードです。実行すると共にslider.htmlが生成されてブラウザが自動で立ち上がります。

```python:slider.py
# Python 3.6.4
# Bokeh 0.12.13

from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show

output_file("slider.html")

t = [t*0.001 for t in range(0, 1000)]
v = t

source = ColumnDataSource(data=dict(t=t, v=v))

plot = Figure(plot_width=400, plot_height=200,x_range=[0,1],y_range=[-100,100])
plot.line(x='t',y='v', source=source, line_width=3, line_alpha=0.6)

freq = Slider(start=1, end=100, value=50, step=1, title="freqency")
amp = Slider(start=1, end=100, value=50, step=1, title="amplitude")

callback = CustomJS(args=dict(source=source,freq=freq,amp=amp), code="""
    var data = source.data;
    var f = freq.value
    var a = amp.value
    t = data['t']
    v = data['v']
    for (i = 0; i < t.length; i++) {
    v[i] = a*Math.sin(f*t[i])
    }
    source.change.emit();
    """)

layout = column(plot,freq,amp)
freq.js_on_change('value', callback)
amp.js_on_change('value', callback)

show(layout)
```

##実行
```bash:
$python slider.py
```

##埋め込んでみる
CodePenで埋め込んでみました。

<p data-height="363" data-theme-id="light" data-slug-hash="NMMYag" data-default-tab="result" data-user="Krieg_Reisfeld" data-embed-version="2" data-pen-title="NMMYag" class="codepen">See the Pen <a href="https://codepen.io/Krieg_Reisfeld/pen/NMMYag/">NMMYag</a> by Krieg Reisfeld (<a href="https://codepen.io/Krieg_Reisfeld">@Krieg_Reisfeld</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
AndroidでHTTP通信（OkHttp）

AndroidでHTTP通信するためにOkHttpを使ってみました。

参考：http://square.github.io/okhttp/

# やりたい事

- HTTP GET
 - 取得するデータは小さいものを想定しています。

# 注意した点

- メインスレッドから呼ばれる事を考慮して、コールバックを使用した非同期処理としました。

# サンプルコード

```java:HttpClient.java
package com.ykao.sample.httpclient;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpClient implements Callback {
    public void getWithUrlString(String url) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .build();

        client.newCall(request).enqueue(this);
    }

    @Override
    public void onFailure(Call call, IOException e) {
        System.out.println("onFailure");
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        System.out.println("Status code: " + response.code());
        System.out.println("Body: " + response.body().string().substring(0, 19) + "...");
    }

}
```
```gradle:build.gradle
    ...
dependencies {
    ...
    // add
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
}
```
```xml:AndroidManifest.xml
    ...
    <!-- add -->
    <uses-permission android:name="android.permission.INTERNET" />
    ...
```
Daydream入門



## 準備

1. [Google VR SDK for Unity](https://developers.google.com/vr/develop/unity/download#google-vr-sdk-for-unity)をインポートする。

2. Android7.0以上に設定
`Other Settings > Minimum API Level > Android7.0`

3. SDKをDaydreamに設定
`XR Settings > Virtual Reality Supported > Virtual Reality SDKs > Daydream`


## ヘッドセットの動きをマウスで擬似的に表現する
`GoogleVR/Prefabs/GvrEditorEmulator`をヒエラルキーに置く
https://developers.google.com/vr/unity/reference/prefab/GvrEditorEmulator


## 2台目のアンドロイド端末をコントローラにする（手元にコントローラがない場合）
The Controller Emulator
https://developers.google.com/vr/daydream/controller-emulator#game_engines

> 参考
[Controller Emulatorを利用してDaydream実機なしでDaydream対応アプリを開発する方法](http://developer.wonderpla.net/entry/blog/engineer/daydream_controller_emulator/)


## ビルドせずに実機でアプリの挙動を確認する
`GoogleVR/Prefabs/InstantPreview/GvrInstantPreviewMain`をヒエラルキーに置く
https://developers.google.com/vr/develop/unity/instant-preview

初回起動時にInstant Previewアプリが自動でインストールされる。
次回からは`instantPreview.cs`の`Install Apk on Run`のチェックを外す。


## コントローラでクリック

コントローラでポインターを合わせたオブジェクトをクリックする、といった一番基本的な動作を実装する手順。
https://developers.google.com/vr/develop/unity/controller-support

### コントローラのエントリポイントを設置する
`GoogleVR/Prefabs/Controller/GvrControllerMain`をヒエラルキーに置く
https://developers.google.com/vr/unity/reference/prefab/GvrControllerMain
接続状況、バッテリー残量、ジャイロ、加速度、ボタンの押下など、コントローラの状態を知るスクリプトがアタッチされているプレハブ


### ポインターを設置する
`GoogleVR/Prefabs/Controller/GvrControllerPointer`をヒエラルキーに置く
https://developers.google.com/vr/unity/reference/prefab/GvrControllerPointer

子要素のLaserにアタッチされている`GvrLaserVisual.cs`の`Shrink Laser`のチェックを外すとポインターまでの線が引かれる。
https://developers.google.com/vr/unity/reference/class/GvrLaserVisual


### イベントを有効にする
`GoogleVR/Prefabs/EventSystem/GvrEventSystem`をヒエラルキーに置く
https://developers.google.com/vr/unity/reference/prefab/GvrEventSystem


### レイキャストする
メインカメラに`GvrPointerPhysicsRaycaster.cs`をアタッチ
https://developers.google.com/vr/unity/reference/class/GvrPointerPhysicsRaycaster


### クリックされた時の処理を設定する
対象オブジェクトに`Event Trigger`をアタッチ
`Add New Event Type > PointerClick`を選択
最後にクリックイベント（正規コントローラのタッチパッドを押し込む）が発火したときに呼びたい関数を設定して完成
https://docs.unity3d.com/ja/current/ScriptReference/EventSystems.EventTrigger.html
Unity2018.1 で ShaderGraph の使い方

Shader初心者が四苦八苦した話です。

初心者ですが
最初からShaderGraphに手を出すと「Shaderべた書きするの面倒に感じるじゃん」
と思って3日だけShaderの勉強しました。
初学者だからこその視点で丁寧な記事を書きたいと思います。

# ShaderGraph を使うためには
ShaderGrap だけ入れても使えません！
これはShaderがパイプラインに対応していないためと思います。

どうやらShaderGraphを使うためには
Window → PackageManager
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/240260/8a2dd8ef-308c-f67f-9a82-ca8dc7e53a74.png)

1. Shadergraph
2. Render-pipelines.core
3. Render-pipelines.lightweight

の３つが必要のようです。
**Shadergraph だけ入れてもShaderGraph用の編集はできそうに見えますが**
**ピンクにしか表示されません。**
どうやらcoreと軽量パイプラインをインストールし設定しないと描画できないようです。

3つを導入したらパイプラインを変更します。
まずはLWRP用の設定ファイルを作成。
Projectウィンドウ　→　Create　→　Rendering　→　Lightweight Pipeline Asset
![createLWPipelineAsset.png](https://qiita-image-store.s3.amazonaws.com/0/240260/49f8fdcf-3b89-5cf4-1bad-d7ee1e43232f.png)

作成したファイルをプロジェクトに参照させます。
Edit　→　Project Settings　→　Graphics
![ChangePipeline1.png](https://qiita-image-store.s3.amazonaws.com/0/240260/243797c0-6e0e-319c-f326-5514c0d7d4a5.png)
Scriptable Render Pipeline Settings の項目に先ほど作成したLightweight Pipeline Assetを入れます。
![SelectLWPipelineAsset.png](https://qiita-image-store.s3.amazonaws.com/0/240260/4c5f34f2-f99e-3aaf-78e2-3f1659d87f8b.png)

これでShaderGraph及び軽量パイプラインが設定できました。
#オブジェクトが<font color="deeppink">ピンク</font>になった
既存のプロジェクトを使用している場合、
パイプラインに対応したShader(マテリアル)に変更しないといけません
[こちらをチェック。](https://qiita.com/chocolate-ryoma/items/54f8e9d0866fe2a5d17f)

#早速ShaderGraph用のShaderを作成してみましょう！
パイプラインの設定までできていたらShaderGraphが使用できます。
作成方法は
projectウィンドウ　→　Create　→　Shader　→　3つから選択
![Create_ShaderGraph.png](https://qiita-image-store.s3.amazonaws.com/0/240260/206cb6ac-798d-fb19-5fd6-57b22c31fbfb.png)
通常の3DオブジェクトはPRB Graph(物理レンダリングベース)だとおもいますが
ライトの影響を受けないなら Unlit Graph でしょう。
書き方についてはここでは触れません。

ただし編集の際に注意です。
どうやらバグがあるようで(ShaderGraph Version 1.1.4-Preview)
#そのプロパティパネル消えるよ(ShaderGraph Version 1.1.4-Preview)
ShaderGraph のウィンドウを少しでも動かすと
Editor内で プロパティパネルが消えて出てこなくなりました。

バグが起きた環境は
>Unity 2018.1.0f2
ShaderGraph Version 1.1.4-Preview

単刀直入に解決した方法は
**Shadergraph のバージョンを1.1.6へ更新したらもう起きなくなってました。**

これで大丈夫だとは思いますが、
一時的なの応急処置もあり最初はこちらで対処してました。(一応共有)
>【Unity2018】ShaderGraphのプロパティパネルが消えた！？時の対応策
https://qiita.com/r-ngtm/items/02a1a1b3a4801c48d065

あくまで一時的な処置で、再度ウィンドウを動かすと消えて萎えました…

バージョンアップで直ってくれて良かった。
Unityさんいつもありがとう
最強の英語学習ツールはMacのターミナルな気がする

# ターミナル英語学習

最強の英語学習ツールはなんだろうと考えていたこのごろ，色々考えていたけどやっぱりMacのターミナルな気がする．きちんと環境作れば多分最強．

まず，最近のMacBookは割と軽いので持ち運べる．

まぁ冗談はさておき最強の英語学習環境を構築する．

まずターミナルのsayってコマンドが超便利，英単語の発音勉強するのには最適．

ターミナル上で下のように打つだけ．

```
say <調べたい英単語>
```

簡単で超便利．

こーなったら全部ターミナル上で調べられたら最強だなと思ってたところ．便利なのがあった！ターミナル上からMacに入ってる辞書を開ける．

openを使えば良いらしい．ただコマンドが長ったらしいので少し工夫．

まず，`.bashrc` OR `.zshrc` OR `.bash_profile`に下のように書き込む．自分は`.bash_profile`に追記．

```
echo 'dict () { open -g dict:///"$@"; }' > .bash_profile
```

他のサイトだと-gオプションつけてないけど付けた方が便利．ターミナルからコマンド叩くたびにいちいち辞書にフォーカスが移動しなくて済む．

これで辞書とターミナルを同じ画面で半々に開いて（いわゆるSplitView），ターミナルから下
のコマンド叩けば辞書で調べるのもOK

```
dict <調べたい英単語>
```

辞書は画面で現在選択されてるのが優先で使われるっぽい．
自分はこれでやめたけど，これに下の投稿とかにあるGoogle翻訳のAPIを叩くコマンドとか入れたら

[コマンドラインでGoogle翻訳をする](https://qiita.com/passionate-engineer/items/1eaa806c857516aea051)

ターミナルと辞書開いてSplitViewにすると．．．

一画面で発音・辞書・翻訳が全部勉強できるので多分最強．
ラズパイとVirtualBoxを使ったLANを構築してみた

#概要
クラスタの構築、グリッドコンピューティングをやってみたいけど、ラズパイとノートPCしか持っていない私は、VirtualBoxを用いて仮想的に複数台のコンピュータを準備した。そして、これらをイーサネットで接続して、LANを構築してみたので、備忘録としてこの記事を書いてみた。また、この記事が誰かの参考にでもなったら私は嬉しく思う。

#環境
Raspberry Pi 3 Model B 　　　1台
　OS　Ubuntu MATE Desktop Environment 1.16.1
  
FUJITSU LIFEBOOK AH77/M　　　1台
　OS  Windows10

仮想マシン（VirtualBox）
　OS  Ubuntu 18.04

#目標
　目標とするネットワーク構成を次の図に示す。
![network.png](https://qiita-image-store.s3.amazonaws.com/0/167549/b5f43f0a-8d5e-0cbb-563e-82e93137417f.png)
・各IPアドレス
PC       192.168.107.65/26
ラズパイ　192.168.107.66/26
マシン１　192.168.107.67/26
マシンX　192.168.107.(66+X)/26


##準備
**1.仮想マシンの準備**
VirtualBoxをPCにインストールする。
（インストールの手順は省略します）
Ubuntuのイメージファイルをダウンロードし、
VirtualBoxでUbuntuの仮想マシンを作成する。
（作成の詳細も省略します）
仮想マシンを起動し、Ubuntuの初期設定を済ます。
（初期設定の詳細も省略します）

**2.LANケーブルの接続**
ラズパイとPCのLANポート同士をLANケーブルで接続する。

##ネットワークの構築
**1.ラズパイのネットワーク設定**

ネットワークアイコンから、「Edit Connections...」を選択し、「Add」からEthernetを選択して追加する。

Network Connectionsウィンドウから、追加したEthernetを選択して、「Edit」を選択すると、Editing "Ethernet name"ウィンドウが現れる。

このウィンドウの「IPv4 Settings」タブを選択し、MethodをAutomatic(DHCP)からManualに変更する。

変更後、「Addresses」という項目が現れるので、Addressに「192.168.107.66」、Netmaskに「26」を記入する。

記入後、Saveを選択して、設定が完了となる。

念のため確認する場合、Termianlからifconfigコマンドなどで確認できる。



**2.PCのネットワーク設定**

目標とするネットワークを構築する手段として、「PCとラズパイ」間のイーサネットと「PCと仮想マシン」間のイーサネットを構築し、この二つをPCでブリッジ接続することによって、一つのネットワークにまとめる。

「PCとラズパイ」間のイーサネットの構築には、PC内蔵のネットワークアダプターを使う。

「PCと仮想マシン」間のイーサネットの構築には、VirtualBoxのVirtualBox Host-Only Networkを使う。これの設定は、VirtualBoxを起動し、「Oracle VM VirtualBox マネージャー」ウィンドウから行う。「グローバルツール」の「ホストネットワークマネージャー」を選択し、現れる画面の作成ボタンを選択することで、「VirtualBox Host-Only Ethernet Adapter」が作成される。

この二つをブリッジ接続するために、コントロールパネルを起動する。
コントロールパネルの「ネットワークとインターネット」の「ネットワーク接続」で、ネットワークの一覧を表示する。
一覧から、「VirtualBox Host-Only Network」と「イーサネット」を選択し、右クリックで現れる項目からブリッジ接続を選択する。
すると「Microsoft Network Adapter Multiplexor Driver」が作成され、「ネットワークブリッジ」が現れる。
ここまでの設定で、次の図のようになると思う。
![network2.png](https://qiita-image-store.s3.amazonaws.com/0/167549/0eb3d48f-62de-2205-5e75-6f85ebc39f3e.png)
次に「ネットワークブリッジ」のプロパティを開く。プロパティの「この接続は次の項目を使用します」の中の「インターネット プロトコル バージョン 4(TCP/IPv4)」を選択し、これのプロパティを開く。
「インターネット プロトコル バージョン 4(TCP/IPv4)」のプロパティウィンドウで、「次のIPアドレスを使う」を選択し、IPアドレスに「192.168.107.65」、サブネットマスクに「255.255.255.192」を記入し、OKを選択し、プロパティウィンドウを閉じる。
これで、PCのネットワーク設定は完了となる。



**3.仮想マシンのネットワーク設定**
VirtualBoxマネージャーから、準備したUbuntuの仮想マシンの設定ウィンドウを開く。設定ウィンドウのネットワークの項目から、「アダプター1」タブ」を開く。「ネットワークアダプターを有効化」のチェックボックスにチェックを入れ、割り当ては「ブリッジアダプター」を選択し、名前はPCのネットワーク設定で作成した「Microsoft Network Adapter Multiplexor Driver」を選択する。
![network3.png](https://qiita-image-store.s3.amazonaws.com/0/167549/4f9e65fd-d7a7-35c4-4023-bab4e8b8c1eb.png)
設定後、Okを選択して、Ubuntuの仮想マシンを起動する。

Ubuntu起動後、SettingsのNetworkから、EthernetがONになっているか確認する。また、歯車マークから設定ウィンドウを表示し、「IPv4」タブを選択する。ここで、「IPv4 Method」をAutomatic(DHCP)からManualに切り替え、「Addresses」のAddressに「192.168.107.67」を記入し、Netmaskに「255.255.255.192」を記入する。そして、Applyを選択することで、設定が完了となる。

#最後に
接続の確認には、それぞれの端末でターミナルまたはシェルを起動し、Pingコマンドで確認するといいでしょう。

初めての記事投稿なので、読みづらいと思いますが、許してください。
あと、ところどころ間違った言葉遣いがあると思うので、指摘してくださるとありがたいです。
次はこれにグリッドコンピューティング用のミドルウェアを導入して、いろいろ試していきますね。
GitLab CIを使ってGitHubプロジェクトをHerokuへ自動デプロイ

# はじめに

[GitLab 10.6](https://about.gitlab.com/2018/03/22/gitlab-10-6-released/) から、 GitLab CI/CD が GitHub に対応しました。
GitHub で管理している Rails アプリを GitLab-CI を用いて Heroku に自動デプロイする手順をまとめます。

## 前提

* GitHub で Rails アプリを管理している
* Heroku Applicaton は作成済み
* GitLab Runner は作成済み、もしくは `gitlab.com` の public runnner を使う

# 手順

## GitHub リポジトリに接続する

CI/CD を実行するための新規 GitLab リポジトリを作成します。

1. `New project` > `CI/CD for external repo` > `GitHub`をクリック

	![スクリーンショット 2018-05-11 22.05.24.png](https://qiita-image-store.s3.amazonaws.com/0/222294/2cead7b5-dc46-0a56-21c7-de0ee89ac5b7.png)

2. `List your GitHub repositories`をクリック

	GitHub のアカウント認証すると、接続できるプロジェクトがリストアップされます。
	![スクリーンショット 2018-05-11 22.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/222294/a5fbe439-e0ee-bfb8-a017-726a04ef1a7e.png)

3. 接続したいプロジェクトの`Connect`をクリック

	しばらく待つと、次のように緑色になって`Done`と表示されます。
	<img width="1331" alt="スクリーンショット 2018-05-12 0.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/c62e5f52-3a55-5862-e7ea-b31a6cc07ccc.png">

## `.gitlab-ci.yml` を追加する

Rails アプリを Heroku へ自動デプロイするための設定をおこないます。
GitHub プロジェクトのルート下に`.gitlab-ci.yml`を作成します。

```yaml:.gitlab-ci.yml
production:
  stage: deploy
  script:
  - gem install dpl
  - dpl --provider=heroku --app=gitlab-ci-ruby-test-prod --api-key=$HEROKU_PRODUCTION_API_KEY
```

> **Note:**
> `gitlab-ci-ruby-test-prod`は実際のアプリ名に置き換える。
> `$HEROKU_PRODUCTION_API_KEY` は後述する。

## Heroku API Key を CI/CD 変数にセットする

先ほど `.gitlab-ci.yml` に記述した`$HEROKU_PRODUCTION_API_KEY`をセットします。

1. Heroku のアカウント管理画面から API Key をコピー
	![スクリーンショット 2018-05-11 22.48.58.png](https://qiita-image-store.s3.amazonaws.com/0/222294/feae285e-2760-f498-3deb-909ca7d390a1.png)


2. GitLab の `Settings` > `CI/CD` > `Secret variables` > `Expand` をクリック

	![スクリーンショット 2018-05-11 22.36.17.png](https://qiita-image-store.s3.amazonaws.com/0/222294/28859f1c-c730-b8ef-6d12-cd46b5f73bba.png)

3. コピーした Heroku API Key を入力して `Save variables` をクリック

	<img width="1614" alt="スクリーンショット 2018-05-12 0.03.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/e820c63e-f9c9-ecf0-cc4c-916232385c59.png">

	> **Note:**
> `Protected` にはチェックを入れない。
> チェックを入れると、[Protected Branche](https://gitlab.com/help/user/project/protected_branches.md) か [Protected Tag](https://gitlab.com/help/user/project/protected_tags.md) でないと変数が使えないため。

## GitHub にコードを Push

以上で GitHub にコードを Push するたびに、 Heroku へ自動デプロイされるようになっているはずです。

# 参考

## GitLab Documentation

* [Using GitLab Ci/CD with a GitHub repository](https://docs.gitlab.com/ee/ci/ci_cd_for_external_repos/github_integration.html)
* [Test and Deploy a ruby application with GitLab CI/CD
](https://docs.gitlab.com/ee/ci/examples/test-and-deploy-ruby-application-to-heroku.html)

## GitLab Help

* [Protected secret variables](https://gitlab.com/help/ci/variables/README#protected-secret-variables)
Androidのアクションバーを隠す方法


毎回どうやってやるんだっけ？と思い出せなくなるので記事をかいて記録する。

## 1. アプリケーションのテーマでActionBarを無効にする

`app/res/values/styles.xml`のAppThemeに、`windowNoTitle true`を追加する。

```diff:styles.xml
 <resources>
 
     <!-- Base application theme. -->
     <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
         <!-- Customize your theme here. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="windowNoTitle">true</item>         
```

全ActivityのActionBarが非表示になるので注意

## 2. アプリケーションのテーマに非ActionBarを適用する

`app/res/values/styles.xml`のAppThemeのparentを、`Theme.AppCompat.Light.NoActionBar`にする。

```diff:styles.xml
 <resources>
 
     <!-- Base application theme. -->
-    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <!-- Customize your theme here. -->
         <item name="colorPrimary">@color/colorPrimary</item>
         <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
```

全ActivityのActionBarが非表示になるので注意

## 3. 特定のActivityでActionBarを非表示にする

AndroidManifestでActivityのスタイルを、`Theme.AppCompat.Light.NoActionBar`にする。

```diff:AndroidManifest.xml
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
         android:theme="@style/AppTheme">
         
-        <activity android:name=".MainActivity">
+        <activity android:name=".MainActivity"
+                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>

```

これは指定したActivityのみActionBarを隠せる

## 4.プログラムでActionBarを非表示にする

Activityの`onCreate`で直接ActionBarを隠すメソッドを呼ぶ

```diff:MainActivity.kt
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
+        supportActionBar!!.hide()
     }
```

あまりイケてない方法でもある。
Objective-CからSwiftへの書き換え作業, enum, NS_OPTION, ビットフィールド

Swiftが登場して以来、
Objective-cのenumをSwiftに書き直すといった作業は少なくない。
そんなenumをSwiftでかくとどうなるだろうか。

それを一度まとめてみようと思う。

# 基本系

Objective-c

```objective_c

enum Sample {
	 SampleA = 1, SampleB, SampleC
};
```

Swift

```swift

enum Sample : Int {
    case a = 1
    case b 
    case c
}
```

# NS_ENUMで定義された列挙型

Objective-c

```objective_c

typedef NS_ENUM (NSInteger, SampleType) {
	SampleTypeObjc,
    SampleTypeSwift,
    SampleTypeJava,
    SampleTypeKotlin,
};
```

Swift

```swift

enum SampleType : Int {
    case objc
    case swift
    case java
    case kotlin
}
```

これが大体の仕事場でObjective-Cファイルでよく見られるコードだと思う。
今まで散々Swiftに書き直してきたよ。

# NS_OPTIONで定義された列挙型

Objective-c

```objective_c

typedef NS_OPTIONS(NSUInteger, SampleType) {
    SampleTypeObjc  = 1 << 0,
    SampleTypeSwift  = 1 << 1,
    CategoryJava = 1 << 2,
    CategoryKotlin = 1 << 3,
};
```

Swift

```swift

struct SampleType : OptionSet {
    let rawValue: Int

    static let objc = SampleType(rawValue: 1 << 0)
    static let swift = SampleType(rawValue: 1 << 1)
    static let categoryJava = SampleType(rawValue: 1 << 2)
    static let categoryKotlin = SampleType(rawValue: 1 << 3)
}

let singleOption = SampleType.objc
let multipleOptions: SampleType = [.objc, .swift]
if multipleOptions.contains(.swift) {
    print("multipleOptions has swift")
}

```

# マクロ定義

マクロ 

```objc

#define pi = 3.14
```

```swift

let Pi = 3.14
```

CまたはObjCで定義された、定数値を表す単純なマクロは、
Swiftではグローバルな定数として表現される。

# 共用体とビットフィールド

実務で全然見かけないが共用体の定義

objc

```objc

typedef union IntChars {
    int swift;
    unsigned char list[4];
};
```

swift

```swift

struct IntChars {
    var swift: Int = 0
    var list = [UInt8](repeating: 0, count: 4)
}
```

objc

```objc

typedef union IntChars {
    int swift;
    unsigned char list[4];
};

struct WNumber {
    unsigned int flag:1;
    unsigned int pad:7;
    IntChars data;
};
```

swift

```swift

struct IntChars {
    var swift: Int = 0
    var list = [UInt8](repeating: 0, count: 4)
}
struct WNumber {
    var: unsigned int flag?
    var: unsigned int pad?
    var data = IntChars()
}
```

このあたりを網羅しておけばenumのSwiftへの書き換えで
いちいち考える必要がなくなると思います。
Plots.jlで対数スケールにした際に、補助目盛を表示する方法

# やりたいこと
普段、JuliaのPlots.jlで色々をグラフを描いているのですが、対数を描画することも多くあります。
例えばx軸を対数にするためには、xscale=:log10　とするだけでＯＫなのですが、残念ながらGRやPyPlotをバックエンドに選択した場合は、補助目盛が表示されません。
（環境やバージョンによっては、上記バックエンドを指定しても、デフォルトで補助目盛が表示される可能性もありますが）

普通に補助目盛を入れようとすると、ticksで値を入れることができますが、数値も一緒に表示されてしまい非常に邪魔です。
そのような場合に、面倒ですがとりあえず、補助目盛を入れる方法を記載します。

# やりかた
一応、Plots.jlのAttributesに記載があります。
http://docs.juliaplots.org/latest/attributes/

具体的には、ticksの項目に以下のような記載があります。
> Vector of numbers (set the tick values), Tuple of (tickvalues, ticklabels), or `:auto`

つまり、plot関数のキーワード引数で、ticks=([], [])と指定をすればよいだけですね。
とりあえず、以下のような形で実行が可能でした。

```julia
using Plots; gr()

xlab, xval = Float64[], Float64[]
for i in 1:10, j in 1:10
    push!(xval, i*10^j)
    i==1 && push!(xlab, 10^j)
end

plot(logspace(1,10,1000), log10.(x), scale=:log10, xticks=(xval, xlab), legend=false)
```

実行結果は以下の通りです。

![a.png](https://qiita-image-store.s3.amazonaws.com/0/17461/7f0d7e61-93d1-9421-462d-07d2cdf75c46.png)

同じことしか書いていませんが、gistは以下の通りです。
https://gist.github.com/tatssuki/3966268f380511eabe6690ad66aafc3f
自分用 Sublime Text 3 インストール・設定

#Sublime Text 3 インストールするべきもの
- Package Contol
- GitGutter
- Seti UI (theme)
- ayu (color theme)
- Ruby Slim (syntax)
- SCSS (syntax)

#Preferences
{
	"always_show_minimap_viewport": true,
        "theme": "Seti.sublime-theme",
	"color_scheme": "Packages/ayu/ayu-dark.tmTheme",
	"draw_white_space": "all",
	"font_size": 14,
	"ignored_packages":
	[
		"Vintage"
	],
	"overlay_scroll_bars": "enabled",
	"tab_size": 2,
	"translate_tabs_to_spaces": true
}
Coursera Deep Learning Specializationコースを受講し終えて振り返り

2018年1月から3月の約2ヶ月間で[Coursera DeepLearningコース(全5コース)](https://www.coursera.org/specializations/deep-learning)を修了しました。
受講2ヶ月間を振り返りたいと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/201d552b-669a-9e8e-1107-427c95c23225.png" width=50%>

Courseraではテストやクイズを一定の基準でパスすると修了証が発行されます、上記の修了証は５コース全て受講すると発行されるものです。この修了証は大学によって修了したことを保証してくれます。また、履歴書に記載することができるので就職や転職に有利に働きます、嬉しいですね。

* [MOOCsブログ - Coursera｜修了証（Verified Certificates）とは](http://moocs.blog.jp/archives/coursera-verified-certificate.html)
* [Coursera Help Center - Help Articles - Course Certificates](https://learner.coursera.help/hc/en-us/articles/208280196-Course-Certificates)


## 勉強方法
朝の通勤途中での学習、帰宅後の学習というスタイルで、週末の時間をプログラミングテストやクイズの解答に当てました、1日毎の時間としては約2時間半を勉強時間にあてました。1回の視聴で内容を理解できず、何回も動画を見返していたので人より余計に時間をかけています。
通勤時に使いましたアプリは下記のアプリになります、事前に受講する動画をダウンロード可能で助かりました。
![スクリーンショット 2018-05-11 21.54.39.png](https://qiita-image-store.s3.amazonaws.com/0/40310/1753fe17-686b-3052-7815-cd37dc2f5851.png)

[AppStore - Coursera: Top online courses](https://itunes.apple.com/us/app/coursera-top-online-courses/id736535961?mt=8)

帰宅後の受講はiPadProとApplePencilを使ってノートをとりながら受講しました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/9c766b9c-8dbe-7aa4-7821-c11725423a93.jpeg" width=50%>

## これから始める方に向けて
私は約2ヶ月(お正月休みブーストを含みます)で受講し終えましたが、Courseraの推奨受講期間を見ますと
4ヶ月とありますので時間に余裕を持った受講をお勧めします。
また、基本的に全編英語での視聴もしくは受講になります(字幕が翻訳されつつありますが・・・)、したがって英語が苦手な方はオススメできません。ただし、発音で使われる中学・高校レベルの英語ですので聞き取るのはそこまで難しくないと思います。また字幕がつきますので聞き取る必要は最悪ありません、全てテキストでダウンロードも可能なのでGoogle翻訳に入れてしまうというやり方もできてしまいます。
講義の雰囲気や講義の内容にふれてみたいという方は[Youtube](https://www.youtube.com/channel/UCcIXc5mJsHVYTZR1maL5l9w)に動画がアップロードされていますのでそちらで試しに視聴してみると良いと思います。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Welcome (C1W1L01) <a href="https://t.co/S11GQl6Pty">https://t.co/S11GQl6Pty</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; wakame@転職活動中 (@wakame1367) <a href="https://twitter.com/wakame1367/status/994921944897150976?ref_src=twsrc%5Etfw">2018年5月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 参考
- [CourseraのDeepLearningコース受講前準備](https://qiita.com/wakame1367/items/6aa73a3f1c19d8e9edc5)
- [naoya_t@hatenablog - deeplearning.ai受講メモ (2/24更新)](http://naoyat.hatenablog.jp/entry/deeplearning.ai)
- [くじら公園 - CourseraのAndrew Ng氏によるDeep Learning Specializationを受講して](http://p-baleine.hatenablog.com/entry/2017/12/22/202720)
- [Qiita - CourseraのDeep Learning Specialization 5コース中4コースまで受講した](https://qiita.com/nokomitch/items/33d31247ecae79c82194)
- [【勉強法】機械学習入門ならcourseraのディープラーニングを絶対やるべき3つの理由](https://cohki0305.com/machine-lerning/cousera-deep-learning-specialization)
- [CourseraのDeep Learning SpecializationのStructuring Machine Learning Projectsコースを修了した](https://www.kaitoy.xyz/2018/01/16/coursera-deep-learning-ml-strategy/)
- [The King's Museum - Coursera: Neural Networks and Deep Learning を修了したよ](http://www.thekingsmuseum.info/entry/2018/02/26/221351)
hyperapp-nestableで作ったコンポーネントのStateの変遷をロギングしたい！

[hyperapp-nestable](https://github.com/zaceno/hyperapp-nestable)を使うと、stateとactionsとviewを持ったコンポーネントが作れるわけですが、当然ながら[@hyperapp/logger](https://github.com/hyperapp/logger)には対応していません。でも僕はロギングしたい。

## @hyperapp/loggerのコードを読む
楽をしたいので既存のloggerのコードが流用できるならしたいので、読んでみます。
コードを読むに[makeLoggerApp](https://github.com/hyperapp/logger/blob/master/src/index.js#L7-L37)という関数にメインの機能が実装されていて、その中には[enhanceActions](https://github.com/hyperapp/logger/blob/master/src/index.js#L9-L30)というのがあります。この関数の中でactionsにロギングする機能を付与しているみたいなので、これだけ切り出してactionsをenhanceしてからnestableに食わせればnestableで作ったコンポーネントのStateの変遷をロギングできます。

## エンハンスやで
ライブラリにするわけではなくプロジェクト内で使う予定なのでちょっとES6っぽく書き直して切り出すとこんな感じかと。

```Javascript:enhanceActions.js
function defaultLog (prevState, action, nextState) {
  console.group('%c action', 'color: gray; font-weight: lighter;', action.name)
  console.log('%c prev state', 'color: #9E9E9E; font-weight: bold;', prevState)
  console.log('%c data', 'color: #03A9F4; font-weight: bold;', action.data)
  console.log('%c next state', 'color: #4CAF50; font-weight: bold;', nextState)
  console.groupEnd()
}

const enhance = (actionsTemplate) => {
  const enhanceActions = (actions, prefix) => {
    const namespace = prefix ? prefix + '.' : ''
    return Object.keys(actions || {}).reduce((otherActions, name) => {
      const namedspacedName = namespace + name
      const action = actions[name]
      otherActions[name] =
        typeof action === 'function'
          ? (data) => (state, actions) => {
            let result = action(data)
            result =
              typeof result === 'function'
                ? result(state, actions)
                : result
            defaultLog(state, { name: namedspacedName, data }, result)
            return result
          }
          : enhanceActions(action, namedspacedName)
      return otherActions
    }, {})
  }
  const enhancedActions = enhanceActions(actionsTemplate)
  return enhancedActions
}
```

ロギング機能を付与したactionsをnestableに食わせるとこう。

```Jsx:nestabledComponent.js
import nestable from 'hyperapp-nestable'

const state = { count: 0 }

const actions = { up: () => ({count}) => ({count: count + 1}) }

const view = (state, actions) =>
  <div>
    <p>{state.count}</p>
    <button onclick={actions.up}>up</button>
  </div>

nestable(state, enhanceActions(actions), view)
```

これでロギングできるようになった。こないだ書いた[nestableで作ったコンポーネントで無理矢理Lazy Componentsするやつ](https://qiita.com/sosukesuzuki/items/ce766f0f700b412a8beb)も使えばややこしいがnestableが強くなる。
Elixirでは行の最大長をいくつにするべきか

<ins datetime="2018-08-02T19:55:00+09:00">(2018-08-02 19:55:00 JST 追記)最近のcredoはデフォルトの行の長さを120としているようだ https://github.com/rrrene/credo/commit/06c6a07d2e68b513660382f51e68fcdb81355b8c
もう120でいいな……</ins>

プログラマにとっての読みやすさを維持するため，またプログラムの構造の歪さが行の長さとして現れることがあるため，Linterで行の長さを制限することがよくある．

ElixirでメジャーなLinterである[credo](https://github.com/rrrene/credo)の[デフォルトでは行の最大長を80と定めている](https://github.com/rrrene/credo/blob/v0.9.2/.credo.exs#L87)．80というのはデファクトスタンダードであった[VT100というターミナル](https://ja.wikipedia.org/wiki/VT100)が表示できる行の最大長が80だったことに由来するようだ．これは妥当な設定である．しかし現代のプログラミングにおいて80は少し短すぎることもある．例えばURLが80文字以上の事もままあり，その場合コメントに参考のURLを書くだけで最大長に違反することになる．もちろんそういう場合だけ回避する方法はcredoにも用意されてはいるが，近年のプログラミングではもう少し制限を緩めても良さそうだ．

それではどのような値が妥当なのか．Githubで[credoの最大長制限設定](https://github.com/search?l=&q=%22Credo.Check.Readability.MaxLineLength%22+NOT+%22false%22&type=Code)をみると100,120あたりが多いようだ．<ins datetime="2018-05-14T12:36:00+09:00">(2018-05-14 12:36:00 JST 追記)また先程伸べたVT100というターミナルでは拡張VRAMを用意した場合132文字になるそうだ．これを採用するのもありかもしれない．</ins>

ところでElixirには標準のフォーマッタがある．そのフォーマッタは行の長さが何文字以上になると折り返すだろうか．フォーマットを担当している[Code.format_string!/2のドキュメント](https://hexdocs.pm/elixir/1.6.5/Code.html#format_string!/2)によると98であるそうだ．一つの指針として標準のフォーマッタがデフォルトで採用している98というのは妥当な選択になるだろう．

98というのは何に由来しているのか調べてみたところ[Elixir Style Guideのissueにあるコメント](https://github.com/christopheradams/elixir_style_guide/issues/56#issuecomment-385379132)でElixir作者のJoséからの伝聞という形で由来が書いてあった．

> I just asked @josevalim this question. He chose 98 so that it wouldn't take sides for any default preference. If it were 100 then someone would argue for 80. This way no one is happy. 😁

既存のいずれかのデフォルト設定によせてしまうと，なぜ別のデフォルト設定ではないんだという論争が起きてしまう．それを避けるためどのデフォルト設定にも偏らないオリジナルな98という数字を選んだそうだ．

## まとめ

Elixirにおける行の最大長としては80,98が既存のデフォルト値となっているので理由をつけやすい．
またコードを検索すると100や120なども広く採用されているようだった．
<ins datetime="2018-05-14T12:36:00+09:00">(2018-05-14 12:36:00 JST 追記)132というのも裏づけのある値として検討に値するだろう</ins>

私は98でいってみようかなあ．
厳しそうだったら120にしよう．
C# フィールドやprivateメソッドを無理やり使用する

プロジェクトTestClassLib（クラスライブラリ）内にあるTestClassのフィールドおよびprivateメソッドを、プロジェクトConsoleApp（コンソールアプリケーション）から無理やり利用する方法

```cs:testClass.cs(プロジェクトTestClassLib内)

namespace TestClassLib
{

    public class TestClass
    {
        private double _field = 3.141592;

        private int PrivateMethod(int a, int b)
        {
            return a + b;
        }

    }
}
```

```cs:Program.cs(プロジェクトConsoleApp内)

using System;
using System.Reflection;
using TestClassLib;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass tc = new TestClass();
            Type type = tc.GetType();

            //// 以下privateフィールドの値を無理やり取得する
            // Typeからフィールドを探す。フィールド名とBindingFlagsを引数にする。
            FieldInfo field = type.GetField("_field", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance);
            double privateField = (double)(field.GetValue(tc));

            //// 以下privateメソッドを無理やり使用する方法
            // Typeからメソッドを探す。メソッド名とBindingFlagsを引数にする。
            MethodInfo method = type.GetMethod("PrivateMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance);
            // インスタンスを作成する
            object instance = Activator.CreateInstance(type);
            // 探したメソッドを実行する。　呼ぶメソッドはint,intを引数にし、戻り値もintのため、intにcastしている
            int methodResult = (int)(method.Invoke(instance, new object[2] { 3, 4 }));
        }
    }
}

```
OSSメンテに便利なgitエイリアス「git pr」

会社の人に教えてもらった便利なエイリアスを紹介しておきます。多分出典は[これ](https://gist.github.com/gnarf/5406589)で、作者と思われるgnarf氏に感謝です。
このエイリアスはプルリクエストを管理するためのもので、主にコードレビューやOSSのメンテナンスをする人に需要があると思われます。
## インストール
次の`.gitconfig`をコピーするか`add-pr-alias.sh`を実行してください。

```Shell:.gitconfig
# for github remotes
[alias]
  pr  = "!f() { git fetch -fu ${2:-$(git remote |grep ^upstream || echo origin)} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f"
  pr-clean = "!git for-each-ref refs/heads/pr/* --format='%(refname)' | while read ref ; do branch=${ref#refs/heads/} ; git branch -D $branch ; done"
# for bitbucket/stash remotes
  spr  = "!f() { git fetch -fu ${2:-$(git remote |grep ^upstream || echo origin)} refs/pull-requests/$1/from:pr/$1 && git checkout pr/$1; }; f"
```

```Shell:add-git-pr.sh
#!/bin/sh
# For github
git config --global alias.pr '!f() { git fetch -fu ${2:-$(git remote |grep ^upstream || echo origin)} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'
git config --global alias.pr-clean '!git for-each-ref refs/heads/pr/* --format="%(refname)" | while read ref ; do branch=${ref#refs/heads/} ; git branch -D $branch ; done'
# For stash/bitbucket
git config --global alias.spr '!f() { git fetch -fu ${2:-$(git remote |grep ^upstream || echo origin)} refs/pull-requests/$1/from:pr/$1 && git checkout pr/$1; }; f'
```

## 使い方
このエイリアスを使うと、リモートにあるプルリクエストを簡単にローカルに落としてチェックアウトすることができます。

|コマンド|内容|
|-------|---|
|`git pr 4`|ローカルに`pr/4`というブランチを作り、`upstream`もしくは`origin`の4番のプルリクエストにチェックアウトします。|
|`git pr 4 someremote`|ローカルに`pr/4`というブランチを作り任意のリモート(`someremote`)の4番のプルリクエストにチェックアウトします。|
|`git pr-clean`|ローカルリポジトリから`pr/*`の形の名前を持つブランチを全て削除します。|
|`git spr`|`git pr`と同じ動きをするが、bitbucketやstashを使う時はこちらを使う|