OmniAICreator/Qiita-1.07M huggingface dataset:
F.O.X Android SDK の新インストールリファラ計測

こんにちわ、F.O.Xの開発の中の人、そろそろ新しい服が欲しいガーヒラです。（冬でもTシャツなんですよｗ）
前回は [自動計測機能のすゝめ](https://qiita.com/garhira/items/351e42e6fe22bb341e97) という記事を書きましたが、Googleさんが [Play Install Referrer Library](https://developer.android.com/google/play/installreferrer/library.html) を出されたのでF.O.Xにおけるインストールリファラを用いた広告計測について触れたいと思います。

## FOXにおける従来のインストールリファラ計測

これまでのインストールリファラ計測はこんな感じです。

![old_referrer.png](https://qiita-image-store.s3.amazonaws.com/0/31466/f478cf9f-6dbb-48c3-e0b5-28e79c313db2.png)

広告をクリックするとF.O.XがGooglePlayのアプリページにリダイレクトします。その際に、`referrer=`にF.O.Xが発行するIDを付与し、アプリがインストールされるとreferrerがアプリにブロードキャストされます。
F.O.X SDKはブロードキャストされてきたリファラ文字列をアプリの初回起動時に、成果として送信します。


## Google Play Referrer API を用いたインストールリファラ計測

これまで、リファラ文字列の取得は暗黙的Intentで送られてくるものをキャッチするという受け身でしたが、`Referrer API`を用いることにより任意のタイミングでリファラの取得が可能で非常にコントローラブルとなりました。（一昔であればリファラが飛んで来ないことは送られくるタイミングが一定ではないこともありましたが、ずいぶんと成長したものです）

![new_referrer.png](https://qiita-image-store.s3.amazonaws.com/0/31466/84f0a71a-a4e1-da57-11cb-7cfd1850180c.png)

Googleの中の人の話によると、アドフラウド(広告詐欺)対策としてリリースされたそうです。
故にAPIで取得出来るのはリファラ文字列だけでなく、`クリック時間`、`インストール開始時間`も取得することが可能となりました。
また、従来からAndroidManifestに定義して貰っていたF.O.X SDKのBroadcastReceiverは削除しても計測が可能となっておりますが、サポート外のバージョンのGooglePlayが入っているなどでAPIが動作しない場合や、一部広告商品の計測手法にて利用していることもあり削除するレギュレーションにはしていません。
万一、BroadcastReceiverでもリファラが取得出来た場合には、ReferrerAPIで取得した値を成果判定に用います。
F.O.X SDKは騙せませんよ♪ ( ͡° ͜ʖ ͡°)ニヤリ


## Google Play Referrer APIを用いるには

Google Play Referrer APIが提供されましたが、ライブラリを導入しないことには利用できません。
build.gradleのdependenciesに以下の清き１行を入れて貰えればF.O.X SDKでリファラ計測が可能となります。特に実装は必要ありません。

```
dependencies {
    ...
    compile 'com.android.installreferrer:installreferrer:1.0'
}
```

## まとめ

* ReferrerAPIを用いることによりリファラ文字列・クリック時間・インストール開始時間を取得できるようになった。
* F.O.X SDKの実装内容はこれまでと同様、何も変更はない。
* ただし、build.gradleのdependenciesには`'com.android.installreferrer:installreferrer:1.0'`を指定する必要がある。


どうぞ、よろしくお願いします。:pray_tone2:
【プログラミング】「仮想関数」という名前の意味について考察してみる

# はじめに
C#やC++といったプログラミング言語には**仮想関数**(仮想メソッド)と呼ばれる機能が用意されています。
仮想関数を利用すると、基底クラスの関数の挙動を派生クラスで**書き換える**といったことが可能になります。
参考: <a href = "http://wisdom.sakura.ne.jp/programming/cpp/cpp31.html">関数のオーバーライド</a>
# 「仮想」関数？
この仮想関数ですが、なぜ **「仮想」**関数という名前なのでしょうか？
気になってググってみたのですが、全くヒットしません。
そこで、「仮想関数」という名前について考察してみました。

### 【仮想】の意味
「実際には無いが、**仮にあるもの**と考えてみること」
参考: <a href = "https://dictionary.goo.ne.jp/jn/41489/meaning/m0u/"> 仮想（かそう）の意味 - goo国語辞書</a>

# 「仮想」関数という言葉の意味
つまりこういうことでしょうか。

派生クラスで定義する想定の関数を **「仮にあるもの」**として考え、基底クラスに関数をあらかじめ持たせておく。

# 仮想関数の例
C# の仮想関数を例に見てみます。

以下のような仮想関数Hogeを定義してみます。

```csharp:基底クラスの例
public class A 
{
    protected virtual void Hoge()
    {
    }
}
```


そして派生クラスを書いて仮想関数Hogeをオーバーライドしてみます。

```csharp:派生クラスの例
public class B : A
{
    protected override void Hoge()
    {
    }
}
```


クラスAのメソッドHoge()の頭に**virtual**を付けることによって
**「派生先のクラスでもHogeというメソッドが作られる想定ですよ」**
という意図を込める事ができるのではないでしょうか。

つまり、仮想関数を定義することによって
「同名の関数が派生先のクラスでも**仮にあるもの**(=**仮想**である)として考えることができる」

「**仮**にある」と**想**定される関数だから**仮想**関数。

# 純粋仮想関数の名前の意味も考えてみる
C#には抽象メソッド(C++では**純粋仮想関数**と呼ばれる）機能も用意されています
純粋仮想関数は「実装がなく、プロトタイプが宣言されているだけの関数」です。


# 「純粋」仮想関数？
この純粋仮想関数ですが、なぜ**「純粋」**仮想関数という名前なのか。

これも考察してみました。

## 【純粋】の意味
雑多なものが**混じっていない**こと

参考: <a href="https://dictionary.goo.ne.jp/jn/106847/meaning/m0u/純粋/">純粋（じゅんすい）の意味 - goo国語辞書</a>

# 仮想関数と純粋仮想関数の違い
ここで、仮想関数と純粋仮想関数を比較してみます。

## 仮想関数
仮想関数は以下のような記述になります。

```csharp:仮想関数
public class A 
{
    protected int x;

    // 仮想関数
    protected virtual void Hoge()
    {
        x = 114514;
    }
}
```

Hogeの定義とHogeの実装が一緒に行われています。　
つまり、**雑多なものが混じっている**と言えます。

## 純粋仮想関数
これに対し、純粋仮想関数は以下のような記述になります。

```csharp:純粋仮想関数の例
public abstract class A 
{
    protected int x;
    
    // 純粋仮想関数
    protected abstract void Hoge();
}
```

Hogeの定義のみが行われています。　つまり雑多なものが**混じっていない**(=**純粋**)と言えます。


# 「純粋」仮想関数という言葉の意味
純粋仮想関数は関数の**定義だけ**を行う(=雑多なものが混じっていない)関数だから
**純粋**仮想関数なのでしょうか。

# まとめ
・仮想関数の**「仮想」**には派生先のクラスに同名メソッドが**仮にあるもの**(=**仮想**)とする意味合いがある。

・純粋仮想関数の**「純粋」**には雑多なものが**混じっていない**(=関数の**定義だけ**を行う)という意味合いがある。
dockerコンテナからローカル上のmysqlに接続する(docker ver17.06以降)

諸事情によりローカルに作ったmysqlにdockerコンテナから接続する必要があったので調べました。

# 2022/01/27追記
Docker desktop4.3.0において、記事で紹介している`docker.for.win.localhost`と`docker.for.mac.localhost`両方ともは非推奨になりました。（なぜかwindowsのリリースノートもmac用のDNSが乗ってますが……）

- https://docs.docker.com/desktop/windows/release-notes/#docker-desktop-430
- https://docs.docker.com/desktop/mac/release-notes/#docker-desktop-430

今後は変わりに以下のDNSにアクセスすれば良いとのことなので、記事は適宜読み替えるようおねがいします。macもwindowsも一緒になって便利ですね。
ただし、あくまでこれは開発用に利用するDNS名であり、Docker for WindowsおよびDocker for Mac以外では動作しないとのことなのでご注意ください。

```
host.docker.internal
```

- https://docs.docker.com/desktop/mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
- https://docs.docker.com/desktop/windows/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host

追記が遅れてすまねえ……。

## 環境
* Windows 10 Enterprise
* mysql 5.6.36
* Docker for windows
* Docker 17.09.0-ce

## 接続方法
dockerのバージョンが17.06以降であればこれでOKです。

```text
mysql -h docker.for.win.localhost -u root
```

macの場合は（おそらく）こちらでいけるはずです。

```text
mysql -h docker.for.mac.localhost -u root
```

dockerのバージョンが17.05以下の場合はこちらでは取り扱いません。軽く調べてそっとブラウザを閉じたくなりました。17.06で追加された機能が便利すぎます。
mysql側での準備についてですが、おそらく不要です。少なくとも自分の環境では、bind-addressが127.0.0.1のみに設定されている状態でも、問題なく接続することができました。

## docker.for.win.localhost
さらっと使った`docker.for.win.localhost`および`docker.for.mac.localhost`とは何ぞや？というお話ですが、これはDockerのver17.06にて追加されたローカルホスト用DNS名だそうです。これをmysqlのホスト名に指定すれば、ローカルのmysqlを実行することができます。
他のサービスにおいても、同様にローカルを指すことができるはずです。
ですがどうやら、`docker.for.win.localhost:80`のような感じで、ポートを指定している他のコンテナに続することにも使えるらしく、こちらの使い方の方が本命っぽいです。


## 参考サイト
* [nginx - From inside of a Docker container, how do I connect to the localhost of the machine? - Stack Overflow](https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach)
* [Announcing Docker 17.06 Community Edition (CE) - Docker Blog](https://blog.docker.com/2017/06/announcing-docker-17-06-community-edition-ce/)
* [Docker 17.06 Updates 最近何が変わったの？](https://www.slideshare.net/zembutsu/whats-new-in-docker-2017-06-distribution-ver)
pyenvの使い方めも。

python実行時のデフォルトバージョンの切り替えに便利。
python hogehoge.py ってやっても、バージョンが2だよとか3だよとか、
パスがねえよ。とか。とか。
システムにインストール済みのものを切り替えたりすると、不具合がでるかもしれないので使うと良い。

初心者でも簡単。
ubuntu16.04でやりました。

### 1.Pyenvの取得。

```
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
```

### 2.環境変数の定義

`vim ~/.bash_profile`

```
export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"


if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
```

ここでサーバに再ログインして、環境変数を再度読み込む。（sourceコマンドで読み直してもおｋ）

### 3.必要なライブラリの導入
```
apt install -y make build-essential 
apt install -y libssl-dev zlib1g-dev libbz2-dev libreadline-dev 
apt install -y libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils
```
やらないとエラーがでるかも。


### 3.pyenv
pyenv自体のバージョンの確認
`pyenv -v`
インストール可能なPythonバージョン一覧
`pyenv install --list`

Python3.6.3のインストール。
（OSのバージョンには影響しません。リストで出てくるものでほしいのを選んでください。）
`pyenv install 3.6.3`

pyenvで切り替え可能なバージョン一覧(取得済みの一覧)
`pyenv versions`


pythonのバージョン変更（3.6.3）
`pyenv global 3.6.3`

pythonのバージョン確認
`python --version`
文字列の表示幅を調べる方法を模索

全角を半角2文字分とみなして文字列を表示したときの幅を求める方法を模索していきます。

# 方法1. 1文字ずつ自力で調べる

```rb
w = -> s { s.codepoints.inject(0) { |a, e| a + (e < 256 ? 1 : 2) } }
w["12"]                             # => 2
w["あ"]                             # => 2
w["\a"]                             # => 1
```
意外と応用が効きそうです。

# 方法2. encode("EUC-JP").bytesize

```rb
"12".encode("EUC-JP").bytesize      # => 2
"あ".encode("EUC-JP").bytesize      # => 2
"\a".encode("EUC-JP").bytesize      # => 1
```
`EUC-JP` なのか `EUC_JP` なのかで私はよくわからなくなります。


# 方法3. toeuc.bytesize

```rb
require "kconv"
"12".toeuc.bytesize                 # => 2
"あ".toeuc.bytesize                 # => 2
"\a".toeuc.bytesize                 # => 1
```

簡単です。

# 方法4. unicode-display_width gem を使う

```rb
require "unicode/display_width"
require "unicode/display_width/string_ext"
"12".display_width                  # => 2
"あ".display_width                  # => 2
"\a".display_width                  # => 0
```
ベルを鳴らす文字は幅が0だそうです。
高性能です。

# それぞれの方法で動作検証

```rb
str = [*"あいうえお".chars, *"a".."z"].shuffle.join * 100
w[str]                              # => 3600
str.encode("EUC-JP").bytesize       # => 3600
str.toeuc.bytesize                  # => 3600
str.display_width                   # => 3600
```
どれもちゃんと動いてます。

# ついでに速度の比較

```rb
require "active_support/core_ext/benchmark"
def _; "%7.2f ms" % Benchmark.ms { 2000.times { yield } } end
_ { w[str]                        } # => " 543.65 ms"
_ { str.encode("EUC-JP").bytesize } # => "  77.91 ms"
_ { str.toeuc.bytesize            } # => " 353.93 ms"
_ { str.display_width             } # => "4792.27 ms"
```
【備忘録】pug の変数の書き方いろいろ


## 変数定義の時の行頭の「-（ハイフン）」は最初だけでよい

最初に「-（ハイフン）」入れて、改行＆インデントでその後は不要

```:pug
//-  最初知らなくてやってた面倒な書き方
- var aaa = "hoge";
- var bbb = "fuga";

//-  改行＆インデントすれば1個で済む
-
	var aaa = "hoge";
	var bbb = "fuga";
```

## 連想配列も使える

連想配列を定義したら `each ... in` で取り出す

```:pug
//-  連想配列例
-
	var obj = {
		title : 'hoge',
		description : 'fugafuga.',
		img : './hoge.jpg',
		date : '2017/12/8'
	}

//-  取り出し
//-  配列のキーと値の取り出し順が逆なのがちょっと気持ち悪い。。。
ul
	each val, key in obj
		li(class=key) !{val}
```

## 配列に入れた連想配列も使える

同じく `each ... in` で取り出す

> ご指摘いただいてコード直しました。恥ずかしい＞＜ (2021/05/07)

```:pug
//-  配列に入れた連想配列
-
	var arr = [
		{
			title : 'hoge1',
			description : 'fugafuga1.',
			img : './hoge1.jpg',
			date : '2017/12/8'
		},
		{
			title : 'hoge2',
			description : 'fugafuga2.',
			img : './hoge2.jpg',
			date : '2017/12/9'
		},
		{
			title : 'hoge3',
			description : 'fugafuga3.',
			img : './hoge3.jpg',
			date : '2017/12/10'
		}
	];
//-  取り出し
ul
	each val in arr
		li
			h2 #{val.title}
			p #{val.description}
			img(src=val.img)
			p #{val.date}
```

## mixinへの代入もできる

```:pug
//-  変数は上記と同じものとする

//-  mixin定義
mixin set_list(_title, _desc, _img, _date)
	li
		h2 #{_title}
		p #{_desc}
		img(src=_img)
		p #{_date}

//-  取り出し
ul
	each val in arr
		set_list(arr.title, arr.description, arr.img, arr.date)
```

単体で文字列として出力したい時や属性値として使う時、引数として使う時などで微妙に書き方が変わるのでよく間違える。。
Macのローカルで急にPostgreSQLが動かない（psql -lできない）


# 現象
```
$ psql -l
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

posgreに接続できないみたいなエラーだろうが、俺何もしてないぞ。

# 解決策
とりあえず、エラーの内容をそのままググる。

https://qiita.com/ms2sato/items/a0f7d32a3ecda76a7be3

おーエラーそのまま一緒！！
本当にありがとうございます。助かりました。

で、解決策は`postmaster.pid`を消す！

```
$ rm /usr/local/var/postgres/postmaster.pid

$ psql -l
psql: FATAL:  the database system is starting up # 再起動中

$ psql -l
                                       List of databases
            Name             | Owner | Encoding |   Collate   |    Ctype    | Access privileges
-----------------------------+-------+----------+-------------+-------------+-------------------
 hogehoge                | taku  | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
```


めでたしめでたし。
WordPress管理画面の「投稿」を別の名前に変更

「投稿」を「ニュース」に変える


```functions.php
function change_post_menu_label() {
  global $menu;
  global $submenu;
  $menu[5][0] = 'ニュース';
  $submenu['edit.php'][5][0] = 'ニュース一覧';
  $submenu['edit.php'][10][0] = '新しいニュース';
  $submenu['edit.php'][16][0] = 'タグ';
}

function change_post_object_label() {
  global $wp_post_types;
  $labels = &$wp_post_types['post']->labels;
  $labels->name = 'ニュース';
  $labels->singular_name = 'ニュース';
  $labels->add_new = _x('追加', 'ニュース');
  $labels->add_new_item = 'ニュースの新規追加';
  $labels->edit_item = 'ニュースの編集';
  $labels->new_item = '新規ニュース';
  $labels->view_item = 'ニュースを表示';
  $labels->search_items = 'ニュースを検索';
  $labels->not_found = '記事が見つかりませんでした';
  $labels->not_found_in_trash = 'ゴミ箱に記事は見つかりませんでした';
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );
```
vscodeオススメショートカット。レベル別25選


最近フロントエンドでVS Codeを使うようになったので、よく使っているショートカット等をメモってみます。
VS Codeで触ってる主な言語はReact、ReactNative、Javascript、Typescript、HTML、CSSです。

## 便利ショートカット一覧
### 最低限覚えておきたい10選
|動作|コマンド|
|---|---|
|ファイル検索|Command + P|
|ファイル内を検索|Command + F|
|置換|Command + Option + F|
|ファイル横断で検索|Command + Shift + F|
|最近開いたもの|Control + R|
|現在選択されているファイルを閉じる|Command + W|
|行をコメントアウト|Command + /|
|定義へ移動|F12|
|すべての参照の検索|Shift + F12|
|前へ戻る|Control + -|

### そこそこ覚えておきたい10選
|動作|コマンド|
|---|---|
|エディタタブの移動|Option + Command + ←/→|
|行削除|Command + Shift + K|
|行移動|Control + G|
|コマンドパレットを開く|Command + Shift + P|
|ファイル/フォルダを開く|Command + O|
|設定を開く|Command + ,|
|キーボードショートカット一覧|Command + K + S（Kの後にSを押すこと。逆だと反応しない）|
|新規ファイル作成|Command + N|
|全てのファイルを閉じる|Command + K + W|
|縮小/拡大|Command + -（拡大時はShift押しながら）|

### 余裕があったら覚えたい5選
|動作|コマンド|
|---|---|
|（検索時などに）次のマッチに移動|Command + G|
|画面を分割|Control + Option + Command + ¥|
|Git画面の表示|Control + Shift + G|
|エクスプローラー画面の表示|Command + Shift + E|
|マークダウンのプレビュー表示|Command + Shift + V|

## コマンドを変更したいショートカット
ファンクションキー系（F12とか）。一部のMacだと、ファンクションキーがタッチバーになっていて押しづらいです。  
変更箇所ですが、Command + K + Sのショートカット一覧から、各ショートカットのコマンドの左側にカーソルを移動すると、編集用のペンアイコンが表示されます。
tidyverse ≒ 定型詩

tidyverseってなんぞ?

このところのtidyverseユーザーたちの関心で，[Advent Calendar](https://adventar.org/calendars/2188)にまでなってしまいました．
そこで私も12/9のAdvent Calendarに登録しました．
先だっては[俺たちのtidyverseはこれからだ！ by yutanihilationさん](http://notchained.hatenablog.com/entry/tidyverse)やTwitter上で話題になりました．
話題を取り上げた方々が訳語を知りたいのではなく，実態に迫りたいのだろうことは想像にかたくありません．
そして「[もうtidyの訳語はtidyでよくない？ by yutanihilationさん](http://notchained.hatenablog.com/entry/2017/10/26/203205)」といった事態に．

こんなに話題になるのは，tidyverseが発展途上ながら，実用的だからでしょう．
加えて，tidy data([整然データってなに？ by Nishiharaさん](https://speakerdeck.com/fnshr/zheng-ran-detatutenani))とtidyverseは等価ではない(tidyverseにtidy dataは含まれる包含関係？)ことが，混乱を招きます．

で，tidyverseとはなにかを考える時，みなさんtidyに注目しがちですが，verseに注目してみました．

universe(宇宙)やmultiverse(多元的宇宙)という言葉があることから，tidyvereはtidyな世界とか宇宙とか環境とかそういった意味合いだろうと皆さん念頭に置いている気がします．
しかし，verseの訳語を英辞郎で調べると

- (動) 〔散文を〕韻文に作り替える
- (名) 〔ある形式の〕詩◆無韻詩（blank verse）や自由詩（free verse）などがある。

といった説明が出てきます．
ということは

tidyverse == tidy詩 == tidyポエム？!

なんということでしょう．
我々のAdvent Calendarもtidyverseなのです．

さて，ここでもう一つ重要なのが，動詞としてのverseで"韻文に作り替える"です．
もうお分かりですよね．
みなさん大好きパイプ演算子で韻を踏もうということです．

```r:散文
plot(density(iris$Sepal.Length))
```

```r:韻文
iris %>%
  dplyr::select(Sepal.Length) %>%
  unlist %>%
  density %>%
  plot
```

更に[The tidy tools manifesto](https://cran.r-project.org/web/packages/tidyverse/vignettes/manifesto.html)にあるルールを足して，詩としての体裁を整えて(tidy)いく．
これは詩でいう自由詩(free verse)より定型詩(rythmed verse)でいこうぜ!といったムーブメントに他なりません!(過言)

ということで，

tidyverseは「詩を整える」という意味で，転じて定型詩を訳語にするというのはいかがでしょうか．

皆さん詩うようにcodingしましょう!!

いいかげん，ggplot2もパイプを基本にしてもらいたいものです．
サーバーサイドエンジニアがJavascriptを使うにあたって学んだこと

この文章は[Fringe81 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fringe81)の7日目の投稿です。

サーバーサイドエンジニアがJavascriptを使うにあたって学んだことを、書籍、環境、単語に分けて紹介します。
同じような方が、「何学べばいいの」「どんだけ新しいこと学ぶの」といった際に参考になればと思います。

### 前提

サーバーサイド歴5年（Java, Scala等）
Javascript歴半年未満（Javascript, Typescript, React, ReactNative）

## オススメ書籍
- 『パーフェクトJavascript』
辞書的役割。わからない単語があったら、google先生と、この本を参照しています。

- 『JavaScript: The Good Parts』
中級者向けです。良いコード、悪いコードがわかるようになります。

- 『JavaScriptで学ぶ関数型プログラミング』
JavaScriptで関数型を学べます。関数型触った事ある方だと少し物足りないかもです。関数型初めてという方にはとてもオススメです。

## 開発環境
有料なら[WebStorm](https://www.jetbrains.com/webstorm/)
無料なら[Visual Studio Code](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)（vscodeとか呼ばれます）がオススメです

## 単語
javascriptの言語自体や、環境を作るためや、周りのJavascript使いの人と話すために必要だったなと感じる単語を列挙してみます。

とにかくわからない単語があったらgoogle先生に聞くのがオススメです。
javascriptの情報で、ネット上で見つからないというものはほとんど無いと思います。

オススメ度は、私の印象なので、ご意見いただけると嬉しいです。

### オススメ度★★★
- グローバル変数
- var/let/const
- this
- apply
- call
- bind
- typeof
- prototype
- Flux
- Redux
- ajax
- DOM
- ES2015
- npm
- nodejs
- typescript
- react

### オススメ度★★
- 即時関数
- クロージャ
- strictモード
- innerHTML
- iframe
- プロトタイプチェーン
- SPA
- Linter
- gulp
- webpack
- babel
- angular

### オススメ度★
- jsonp
- 仮想DOM
- websocket
- レキシカルスコープ
- Elm

### 特に理解に苦しんだもの
- クロージャ
- Redux, Fluxなどのアーキテクチャのメリット
- 仮想DOM

以上です。今後も学びがある程度たまったら、随時更新していきます。
LINE Messaging API の エンジンに Twilio Functions がおすすめ

LINE Messaging API の Webhook 先に Twilio Functions がおすすめです。

Twilio Functions は、 AWS Lamda みたいな サーバーレス でプログラムを動かせる環境なのですが、

1. https に対応している
2. 結構な無料枠（毎月10,000アクセスまでは無料とかそういうかんじ。あとでちゃんと調べて補足します）
3. nodejs つかえる。 npm modules も、簡単に追加できる

といういいところがあります。

Lamda との違いは、

1. いろいろ隠蔽してくれてて、こまかなパラメータを気にしなくていい
2. Endpointの公開もセットでついてるので、別途 Amazon API Gateway な設定をしなくていい
3. （Twilio Functions がそもそも Lamda を Wrap するように動いているらしい）

です。

## 注意点１ 環境変数

Twilio Functions の環境変数は、文字列の長さ制限があるようです。
LINE CHANNEL ACCESS TOKEN はとってもながいので、一つの変数におさまらないようです。
ですから、

LINE_CHANNEL_ACCESS_TOKEN1 = 'てきとうに100桁くらい'
LINE_CHANNEL_ACCESS_TOKEN2 = 'てきとうに100桁くらい'

と、ぶったぎって、定義しておいて、使うときに

```
  // create LINE SDK config from env variables
  const config = {
    channelAccessToken: process.env.LINE_CHANNEL_ACCESS_TOKEN1 + process.env.LINE_CHANNEL_ACCESS_TOKEN2 ,
    channelSecret: process.env.LINE_CHANNEL_SECRET,
  };
  const client = new line.Client(config);
```

こういう感じで、つなげてあげる方法をおすすめします。

## 注意点2 @ つきの npm module の追加

npm module も簡単に追加できて、とても便利です。

でも追加できるは、できるのですが、どうも @line/bot-sdk というような @ つきの npm package の追加には、くせがあるようです。
なんどか、ためしてたら、通ったのですが、、、最初何回か、追加できなかったです。
　なにをどうしたら追加できるようになったのか、わかってないのですが、追加できることはできたので、希望をすてないでください。
（もし、追加する上手な方法をみつけたかたは、おしえてくださいませ）

下図のように、@line/bot-sdk は、2018.12.3 時点で、5.0.1 を追加して利用することができました。

![Twilio Console Runtime Functions.png](https://qiita-image-store.s3.amazonaws.com/0/57516/a73faf51-0f91-1639-6456-45e4516a5e25.png)
ある程度フルスタックなReact周辺まとめ

*React*
  抑えどころ！　データは親コンポーネントから子供コンポーネント常に一方向に流れる(undirectional data flow)
  Propsは親子コンポーネントから子供のコンポーネントになんのデータをどんなpropsの名前で流していくか、重要なものなので
  reactのexampleコードをたくさん読んで見慣れておくと最高です:)

 読んで良いなと思ったコードたち(propsがいっぱいで大変ですが じ〜〜っくり読むと徐々に慣れてくると思います)
  https://github.com/gakuakachi/sound-redux
  https://github.com/gakuakachi/login-flow

*Redux*
    https://egghead.io/courses/getting-started-with-redux　->　reduxを作った人がreduxの説明をしてくれる動画
    https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0　-> containerとcomponentについて
   -Reduxのstoreのstateを更新できるのは基本的にはactionのみ
   -actionとはdispatch({type: 'actionのtype', payload: '更新するためのデータ'})
   -reducerでactionが受け取られ、各actiontypeに沿って、何を、どう更新するか
  
 connectメソッド - connect(mapStateToProps,   mapDispatchToProps)(Component) ReactコンポーネントでReduxstoreのstateを使えるようにする、
  mapStateToProps -reduxStoreのstateをconnectしたコンポーネントに渡す(使うstateはselectorでなんのstateを使いたいか選びましょ！)
  mapDispatchToProps - dispatchメソッドをconnectしたコンポーネントに渡す

*Styled Component*  ->スタイルもコンポーネント化していきましょう的な
  https://hackernoon.com/styled-components-in-action-723852f2a93d

*Selector* -> reduxのstateからどんなデータが欲しいか、選ぶ（各コンポーネントのselector.jsに書いてあります）
  Reselect -> データーをメモ化（いちいち計算しなさなくてもいいようにできる）
  https://github.com/reactjs/reselect

*Immutable.js*　-> データそのものを書き換えるのではなく、元データと更新分を参照して、新たな値を返す

  以下の関数をdocumentationでさっくり見てみてください
  get  getIn => selectorにてどのstateを使うかget,もしくは取りたいstateが深い場合はgetIn
  set  setIn  => stateオブジェクト(だいたいオブジェクト)を更新するとき
  merge mergeDeep　=>　stateオブジェクト(だいたいオブジェクト)のプロパティを複数個、更新するとき

*ReduxForm*
  Reduxのstoreを利用して、formデータの保存場所にできる。
  https://redux-form.com/7.1.2/

*Redux-saga*
キーワード
    Saga: put, call, takeLatest
    ES６:  generator https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Generator
              promise https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise (edited)
[ios]入力フォームでの初期化について

イメージでは下記のような画面で、「シェアする」を押した時に、画面遷移しつつ、下記の画面のテキストを空にしたり、ボタンの色を初期化することを実装したい。
テキストだけであったら、下記のように記述すればいいが・・・

```swift:sample.swift
　messagefield.text = ""
```



<img width="375" alt="fullsizeoutput_928.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/175906/5b65e5a6-6934-e1e1-71aa-534fe8d93622.jpeg">

ただ、ボタンが複数あった場合や、textFieldが複数ある場合、全部に初期化するのはめんどくさいかなっと思って調べたらところ、下記の記事を発見。
http://www.anvariation.com/uiviewcontroller-reload/

あ〜確かに画面自体を初期化すればいいのかと思い、下記のコードのように実装。
画面遷移後に、loadView(),viewDidLoad()を記述してもうまく行かないので、遷移前に実行。
ただ、すごいズボラな処理ではないかと思いつつ、他にいい方法が思いつかないので、とりあえずこれで先に進めてしまおう。
リファクタリング頑張らなければ・・・

```swift:sample.swift
　override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        ・・・中略
            if (identifier == "Gotoshare") {
                if cameratap.backgroundImage(for: .normal) == UIImage(){
                    let alert = UIAlertController(title: "入力エラー", message: "グループ画像を設定してください", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "OK", style: .default))
                    self.present(alert, animated: true, completion: nil)
                    return false;
                }
            }
        }
        loadView()
        viewDidLoad()
        return true;
        
    }
```
M-1グランプリ2017決勝のジャルジャルネタ再現してみた

Nuco Advent Calendar 8日目の記事です。


# 盛り上げてくれへん？

今年のM-1グランプリは皆様ご覧になられましたでしょうか？
どのコンビのネタもすごくおもしろかったですね。
いやー個人的にはジャルジャルのネタすごい好きだったんですけどね。優勝ならずでした。

あのネタやってみたいんですけど僕は相方いないし1人でやるのもどうかな、と思ったので、
pythonにジャルジャル後藤役をやってもらうことにしました。

# python2
実はpython2ってあんまり書いたことないんですよ。
っていうかほとんど書いたことないんですけど、今回できれば色んな方に是非盛り上がってもらおうと思って、色んなLinuxディストリビューションにプリインストールされてるpython2系を採用しました。

python2の文字列操作はめんどくさそうだったんですけど、実際めんどくさい。
python3は楽でいいですね。
ちょこちょこエラー吐かれるたびに3にすればよかったと後悔しました。

# 実行してみた

[コードはこちら](https://github.com/miumiu0917/jarujaru2017)

```
$ python jarujaru.py
今から変な校内放送やるから盛り上げてくれへん？
(Press Ctrl-C to exit.)
> ピンポンパン
一個少ないな
> ピンポンパンポンピン
一個多いな
> ぴん
背筋伸びてるやん
> ピン
背筋伸びてるやん
> ﾋﾟﾝ
背筋伸びてるやん
> ぴん
背筋伸びてるやん
> ぴん
背筋のびきってるやん
> ピンポンパンライス
いや、ファミレス行ってピンポン押して店員さん呼んでハンバーグ定食頼んだらパンorライスって聞かれてるやん
> ピンポン
誰か来ましたよ－
> ぽんぴん
来ましたよ－誰か
> やったら絶対できる子やねん
よしよしすな
> ほげ
変な校内放送やってや
```

入力は全角半角どちらでも大丈夫です。
ぴらがなでもOK。[jaconv](https://pypi.python.org/pypi/jaconv/0.2)というパッケージでそのへんの処理をやってます。

```python:jarujaru.py
def goto(boke):
  s = boke.decode('utf-8')
  if s == u'やったら絶対できる子やねん':
    return u'よしよしすな'
  s = jaconv.hira2kata(s)
  ends_with_rice, s = rice(s)
  noise = len(filter(lambda x: not x in [u'ピ', u'ン', u'ポ', u'パ', u'ー'], list(s)))
  if noise:
    return '変な校内放送やってや'
  s = filter(lambda x: x in [u'ピ', u'ン', u'ポ', u'パ'], list(s))
  s = jaconv.z2h(''.join(s))
  return evaluate(s, ends_with_rice=ends_with_rice)
```


ただし、ピンポンパン（と伸ばし棒）以外の文字が入ってるとevaluateできずに変な校内放送やってやって怒られます。


# 校内放送しよう！
コードも急いで書いたのでちょっと雑ですが、python2系の文字列処理の煩わしさを体感することができました。
今後もあまり2系でコーディングすることはなさそうですが、python3が使えることに感謝しながらコーディングに励みたいと思います！

~~書くことなさすぎてこんなクソ記事書いたってのは秘密だよ！！！~~
もうJS開発環境は訳わからんって人に薦めたい CodeSandbox

## CodeSandbox って何？

<img width="1430" alt="スクリーンショット 2017-12-08 12.08.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/81547/29268a87-84a4-d6ad-4a59-d9e74ba9359e.png">

いわゆるオンラインのコードエディター。
よく使われているのは CodePen とか jsBin とか jsFiddle あたりでしょうか。
しかし、それらとは一線を画する優秀さを紹介していきます。

## CodeSandbox の素晴らしいところ

### 最近流行りのJSフレームワークを使った開発がすぐに始められちゃう

[OPEN REACT] ボタンをポチっとすれば、 React での開発に必要な依存モジュールが勝手にインストールされて、環境が揃った状態の画面が立ち上がる。
最初は React だけだったらしいですが、今は preact や Vue も使える。Svelte も。

![codesandbox.gif](https://qiita-image-store.s3.amazonaws.com/0/81547/d4548f7e-d9ba-57b7-adda-b58b25b78826.gif)

### そこらへんのコードエディターと遜色ない

いわゆるオンラインエディターにありがちな HTML, CSS, JS でウィンドウが分けられてるような画面でなく、普通のコードエディターさながらに左メニューでプロジェクトツリーを管理できます。
パッケージの追加も GUI で選べます。

<img width="1437" alt="スクリーンショット 2017-12-08 14.39.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/81547/8abfc9da-d813-8d94-e2ce-efe29caa8a5a.png">

### しかもオープンソース

- [codesandbox-client](https://github.com/CompuIves/codesandbox-client) (GUI)
- [cli](https://github.com/codesandbox-app/cli) (自分のプロジェクトを CodeSandbox にアップロードできる)
- [git-extractor](https://github.com/codesandbox-app/git-extractor) (GitHub 連携)

## CodeSandbox でできること (抜粋)

盛りだくさん。

- GitHub 連携
 - リポジトリの作成
 - コミット
 - プルリクエストの作成
- 静的ファイルのホスティング (`public` フォルダー)
- 型定義の自動検索＆ダウンロード
- コード補完とか
 - [ESLint](https://eslint.org/)
 - [Prettier](https://github.com/prettier/prettier)
 - [Emmet.io](https://emmet.io/)
- [react-error-overlay](https://github.com/facebookincubator/create-react-app/tree/master/packages/react-error-overlay) (React エラーハンドリング)
- プレビューの別ウィンドウ表示
- 埋め込み (Qiita には埋め込めなかった。。)
- オフライン！！

## どんな時に使えそう？

この手のオンライン コードエディターってサンプル書いたり、ブログにスニペットとして埋め込んだり、バグ再現のエビデンスとして使ったりすることが多いと思います。
ただ、ここまで揃ってると軽めのプロダクトだったらこれでいけちゃいそうな予感。
手の空いた時に React コンポーネントをブラウザーで作ったりとか、メインの開発環境とは別のところ (いわゆる Sandbox) で実装進められたりするのは捗りそうな気がする。

ちなみに、弊社 AdventCalendar がなかったら、CodeSandbox 知ったのはもっと先の話になったはず。誰か早く教えてよ。

ということで、来年はこれで何か作ってみようと思います。

明日は [takanorip](https://qiita.com/takanorip) が D3.js でデータビジュアライゼーション的な記事を書くとか。お株を奪われそう。
ブラウザで動作する機械学習ライブラリdeeplearn.js

ランサーズ Advent Calendar 2017 8日目

はじめまして、開発部の井上です。
ランサーズにおける機能開発を主に担当しております。
今回はdeeplearnjsについて少し紹介させていただきます。

## なにそれ？

Googleが発表したJavaScriptライブラリです。
ブラウザ単独で動作する点、WebGLを介してGPUが利用できる点等が特徴として挙げられます。特に計算処理がクライアント上になるというのはdeeplearnjsの優位性ともいえます。

https://deeplearnjs.org/

### 背景

近年、需要が高まる機械学習。どの企業でも活用が進んでいますね。
ランサーズでも機械学習への取り組みが進んでおりサービスへの活用が行われています。
（詳しくは担当者が書いてくれるはず...）
ブラウザで動作するということで導入コストが低く、
学習しやすそうだと感じたので触れてみることにしました。

## 早速動かしてみる

それでは動作させてみましょう。
githubリポジトリにいくつかのデモがあるので動作させてみようと思います。

```shell-session
git clone https://github.com/PAIR-code/deeplearnjs.git
cd deeplearnjs # 以降の操作は、このディレクトリをカレントと想定しています
npm run prep
```

それでは`demos`ディレクトリ配下にいくつかあるデモの中から
Compositional Pattern-Producing Network(CPPN)を動かしてみます。

```shell-session
./scripts/watch-demo demos/nn-art
```

##### ブラウザで以下URLへアクセス
http://127.0.0.1:8080/demos/nn-art/

<img width="466" alt="nn-art.png" src="https://qiita-image-store.s3.amazonaws.com/0/221491/a9b80f9c-9ca2-bfa2-1185-18708a62a755.png">

簡単に動作させることができましたね。

## 他も触ってみる
demos配下のディレクトリを指定してやることで
他にも色々なデモも触ることができます。

#### Benchmark
CPUとGPUのベンチマーク

```shell-session
./scripts/watch-demo demos/benchmarks
```

<img width="654" alt="benchmark.png" src="https://qiita-image-store.s3.amazonaws.com/0/221491/1f6b66b6-5fcc-ef23-c694-e0cd2f2f3b5c.png">

GPUの方が高い結果が出てますね。

#### Model-Builder
画像認識

```shell-session
./scripts/watch-demo demos/model-builder
```

<img width="1263" alt="model-builder.png" src="https://qiita-image-store.s3.amazonaws.com/0/221491/0a4a92b4-9438-dcf3-2339-8331b817901c.png">

初期状態では精度が悪いので
trainを実行し、しばらく待てば(3分ぐらい)徐々に精度が上がってるのがわかると思います。
画面中央付近にあるCPUとGPUを切替えてもらって、その差を感じて下さい。

## 環境を作ってみる

それでは自身で利用/開発するにはどうすればよいか？ですが、
cloneしたリポジトリ内にstarterが含まれているのでソチラを利用するのが良いです。
typescriptとes6の2種類存在していますが、手順は簡単です。

```shell-session
cd starter/[typescript|ec6]/
yarn prep
yarn watch
```

実行はコマンド実行したディレクトリにあるindex.htmlをブラウザで開けばOKです
実行結果はブラウザのdeveloper toolにて確認できます。

<img width="1392" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/221491/a44004ac-fd76-4355-2b79-91f04da0368b.png">


#### より簡単に

yarnがインストールできない環境の方にはコチラ
htmlファイル作成して中に以下コードを記述してもらえば簡単に実行できます。
これらは配列の中身をスカラーで合計するだけの簡単な計算処理です。

```html:index.html
<script src="https://unpkg.com/deeplearn"></script>

<script type="text/javascript">
var math = new dl.NDArrayMathGPU();
var a = dl.Array1D.new([10, 15, 20]);
var b = dl.Scalar.new(5);

var result = math.add(a, b);

result.data().then(data => console.log(data)); // Float32Array([15, 20, 25])

console.log(result.dataSync());
</script>
```

## まとめ

比較的簡単に機械学習を体験できたのではないでしょうか？
発表も新しいためネット上に資料が少なく動作環境も限られてますが、
クライアント上で動作する機械学習ライブラリということで発想は面白いと思います。

現状deeplearnが公式でサポートしてるのがtypescriptとes6ですが、
reactから操作してみようと整理してますので近々お伝えできれば幸いです。
Lineでog:imageを表示させるにはContent-Typeヘッダーを明示的に指定する必要がある

og:imageにS3にアップロードした画像を指定した時に、
何故かLineでog:imageが表示されていなかったので原因を調べたら 
`Content-Type:image/jpeg` をS3オブジェクトのmeta情報に設定する必要がありました。(Content-Typeは適宜指定してください。)

---

その他検証時メモ

Lineに投稿すると
ユーザーエージェントが `facebookexternalhit/1.1;line-poker/1.0` のクローラーがアクセスしてきた後にog:imageに設定したファイルに `facebookexternalhit/1.1;line-poker/1.0` と `Mozilla/6.0` からアクセスが来ているようでした。

```
203.104.145.38 - - [08/Dec/2017:05:16:17 +0000] "GET / HTTP/1.1" 200 10519 "-" "facebookexternalhit/1.1;line-poker/1.0" "-"
203.104.145.38 - - [08/Dec/2017:05:16:17 +0000] "GET /assets/hoge.png HTTP/1.1" 200 84437 "-" "facebookexternalhit/1.1;line-poker/1.0" "-"
203.104.145.59 - - [08/Dec/2017:05:16:17 +0000] "GET /assets/hoge.png HTTP/1.1" 401 195 "http://example.com/" "Mozilla/6.0" "-"
```

`facebookexternalhit/1.1;line-poker/1.0` のipは `203.104.145.38`、`Mozilla/6.0` は `203.104.145.59` で `whois` コマンドでIPの所有者を調べたら両方共LINE Corporationが所有しているようでした。
開発サーバーで `line-poker` はベーシック認証を回避する設定はしていましたが、 `Mozilla/6.0` はベーシック認証で弾くようになっていたためかLineでog:imageは表示されませんでした。
`line-poker` からも画像にアクセス自体はあったようですが、Lineアプリの方ではog:imageは表示されていませんでした。

推測するにLineのシステムは、記事情報を取得するクローラーと画像を取得するクローラーは別のプログラムが動いているのだろうと思われます。(しかし画像のクローラーのユーザーエージェントに `Mozilla/6.0` とするのはベーシック認証をかけているテスト環境でOGPのテストがしずらいので、 `facebookexternalhit/1.1;line-poker/1.0` を指定してもらえると助かります・・・)
【Ruby】コーディング規約抜粋

#はじめに

下記の中から忘れそうなものをピックアップした
参照先：https://shugo.net/ruby-codeconv/codeconv.html

#ソースコードの整形
##インデント

インデント幅は2とする。また、インデントにはスペースのみを使用し、タブは使用しない。

#コメント

メソッド定義の中にはコメントは記述しない。

#構文に関する規約
##クラスの構成要素

クラスの構成要素は以下の順序で記述する。

1. モジュールのインクルード
2. 定数の定義
3. クラス変数・クラスのインスタンス変数の定義
4. パブリックなクラスメソッドの定義
5. アクセサの定義
6. initializeの定義
7. パブリックなインスタンスメソッドの定義
8. プロテクティッドなクラスメソッドの定義
9. プロテクティッドなアクセサの定義
10. プロテクティッドなインスタンスメソッドの定義
11. プライベートなクラスメソッドの定義
12. プライベートなアクセサの定義
13. プライベートなインスタンスメソッドの定義
14. ネストしたクラスの定義

##アクセサの定義

アクセサの定義には、`attr_accessor`・`attr_reader`・ `attr_writer`を使用する。(`attr`は使用しない。)

##メソッドの定義

メソッド定義に引数がない場合は、括弧を省略する。

```ruby:example-method.rb
#正
def foo
  ...
end

#誤
def foo()
  ...
end
```

##メソッド呼び出し

`print`や`puts`や`p`の場合は、引数の括弧を省略してもよい。

##ブロック

ブロックは基本的に`do ... end`を使用する。ただし、メソッドチェインを行う場合は`{ ... }`を使用する。

##return

メソッドの値を返す場合は、必ず`return`を使用する。また、`return`の括弧は省略する。

```ruby:example-return.rb
#正
def add(x, y)
  return x + y
end

#誤
def add(x, y)
  x + y
end

def add(x, y)
  return(x + y)
end
```

##yield

`yield`の呼び出し方法はメソッド呼び出しに準ずる。

##条件分岐

1. `if !x`のような場合は、`unless x`に置き換える。ただし、`unless`の場合、`else`は使用しない。
2. 条件が十分に簡単で、一行で書ける場合は、`if`修飾子を使用してもよい。
3. `case`を使用できる場合は、`case`を使用する。
4. 条件分岐の式の値は使用しない。

```ruby:example-if.rb
#正1
unless x
  puts "x is false"
end

#誤1
unless x
  puts "x is false"
else
  puts "x is true"
end

#正2
puts "x is true" if x

#誤2
puts "foo && bar && baz && quux" if foo &&
  bar && baz && quux

#正3
case x
when 1
  ...
when 2
  ...
end

#誤3
if x == 1
  ...
elsif x == 2
  ...
end

#正4
if x > 0
  msg = "x > 0"
else
  msg = "x <= 0"
end

#誤4
msg = if x > 0
        "x > 0"
      else
        "x <= 0"
      end
```

##繰り返し

1. `while !x`のような場合は、`until x`に置き換える。
2. 無限ループには`loop`を使用する。

##論理演算子

論理演算には`!`や`&&`や`||`を使用する。(`not`/`and`/`or`は使用しない。)

##文字列リテラル

文字列リテラルには基本的に`"..."`を使用する。ただし、特殊文字を解釈させたくない場合のみ、`'...'`を使用する。
また、原則的にヒアドキュメントは使用しない。

#命名規約
##全般

1. 原則として、単語の省略は行わない。
2. スコープが狭いループ変数には、i, j, kという名前をこの順序で使用する。
3. スコープが狭い変数名には、クラス名を省略したものを使用してよい。(例：`eo = ExampleObject.new`)

##クラス・モジュール名

クラス・モジュール名は、各単語の一文字目を大文字にし、`_`などの区切文字は使用しない。ただし、HTTPなどの略語の場合はすべて大文字のままとする。

```ruby:example-class-name.rb
#正
ExampleClass  
HTTPClient

#誤
Example_Class
EXAMPLE_CLASS
HttpClient
HTTPclient
HTTP_Client
```

##メソッド名

メソッド名は、すべて小文字とし、単語の区切りに`_`を用いる。メソッド名には動詞の原形を使用する。

```ruby:example-method-name.rb
#正
add_something

#誤
addsSomething
Add_Something
```

##定数名

クラス・モジュール名以外の定数名は、すべて大文字とし、単語の区切りに`_`を用いる。

##変数名

変数名は、すべて小文字とし、単語の区切りに`_`を用いる。

##ファイル名

ファイル名は、すべて小文字とし、単語の区切りに`-`を用いる。
また、ファイル中の主な定義クラスの名前を変換したものをファイル名に使用する。
(モジュールを名前空間として使用する場合は、ディレクトリを使用して階層構造を表現する。)

```ruby:example-file-name.rb
foo.rb # クラスFooを定義
foo-bar.rb # クラスFooBarを定義
foo/bar-baz.rb # クラスFoo::BarBazを定義
```
改行の除去で地味にハマった件

由来の分からない有象無象のテキスト数千件から改行を取り除くというタスクがありまして。目的は、まあよくあるtsvファイル化です。tsvなのでとりあえずデータ区切りとかち合う改行とタブを除けば良いわけです。

ひとまず元データを１件ずつ読み込むことはできたんですが、なにせいろんな人がいろんな環境で自由入力したテキストなんで改行やらタブやらが含まれるんですね。

で、最初改行（とタブと空白）の除去をこうやろうとしたんです。

```Swift
let nonewline = String(text.characters.filter { !" \n\t\r".characters.contains($0) })
```

でも、これだとどうも除去できない改行があるんですね。¥nでも¥rでもマッチしない改行って何！？ 
ひとまずよくわからないので、OSの認識に任せてみようと思って、こうしてみました。

```Swift
let nonewline = text.components(separatedBy: .whitespacesAndNewlines).joined(separator: " ")
```
componentsに分解してjoinするっていうのは回りくどいようですが、CharacterSetを使う場合はこれが楽だったのでこうしました。

それはさておき、これはうまくいきました。ということは、¥nと¥r以外の改行があるってことなんでしょうか・・・と思って、定義を見てみたらこういうコメントが入ってました。

```Swift
    /// Returns a character set containing the newline characters (`U+000A ~ U+000D`, `U+0085`, `U+2028`, and `U+2029`).
    public static var newlines: CharacterSet { get }
```

なにこれけっこういっぱいある！！ U+000A〜U+000Dで４個、そのほかにさらに３個で計７個！

謎だったのでググってみたらこういうことのようです。
[入力改行コード指定](http://sakura-editor.sourceforge.net/htmlhelp2/HLP000285.html)

ということで、改行コードは意外に種類があるので、扱うときはなるべく CharacterSet.newlines を使いましょうというお話でした。
Visual Studio | WPF > カスタム添付プロパティ > AttachedPropertyBrowsableForType の効果 > デザイン時にプロパティウィンドウに表示するかどうか

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 関連

- [Visual Studio | WPF > カスタム添付プロパティの使用例 | link:AttachedPropertyBrowsableForType](https://qiita.com/7of9/items/eff609eeb0b7c4381d0b)
- [Visual Studio | WPF > カスタム添付プロパティ > AttachedPropertyBrowsableForType > Getには指定して、Setには指定しない](https://qiita.com/7of9/items/e8d639ea94eeba42d8e9)

### AttachedPropertyBrowsableForType の効果

```csharp
       [AttachedPropertyBrowsableForType(typeof(TextBox))]
        public static bool GetIsNumeric(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsNumericProperty);
        }

```

`AttachedPropertyBrowsableForType(typeof(TextBox))`の効果とは何か。

[BrowsableAttribute クラス](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.browsableattribute(v=vs.110).aspx)
> A visual designer typically displays in the Properties window those members that either have no browsable attribute or are marked with the BrowsableAttribute constructor's browsable parameter set to true.

デザイン時にプロパティウィンドウに表示されるかどうかということのようだ。

### 試してみた

以下の２つのコントロールに`TextBoxBehaviors.IsNumeric`プロパティを設定した。

- TextBox
- Button

```MainWindow.xaml
<Window x:Class="_171207_t1930_behavior.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171207_t1930_behavior"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBox Name="textBox1" Height="23" Width="120"
                 local:TextBoxBehaviors.IsNumeric="True"/>
            <Button Name="Button1" local:TextBoxBehaviors.IsNumeric="True" Height="30"/>
        </StackPanel>
    </Grid>
</Window>
```

プロパティのウィンドウで`TextBoxBehaviors.IsNumeric`が見つかるか調べた。

TextBoxで検索 (見つかる)
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b162f70a-77aa-1648-4730-6e932c7ab6c3.png)

Buttonで検索 (見つからない)
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/5ce25ea4-4567-4360-423c-81ab84f473b5.png)
HTTPSにおけるクライアント認証(Mutual TLS)の話

# Mutual TLSとはなにか

我々が例えばブラウザでウェブサイトを見るとき、接続先のサーバーが信頼できることを保証するためにHTTPSを使います。一方でサーバー側から見て接続してくるクライアントが信頼できることを保証するためにTLSクライアント認証という仕組みがあります。
これを同時にやることをMutual TLS(SSL)と呼びます。Mutualとは相互という意味です。
これは公式な定義がない用語ではありますが、結構広く使われているようです。

これから数回に分けてNginxを題材にMutual TLS設定の話を書いて行こうと思います。
ですがHTTPSについてはほとんど説明しません。なぜならHTTPSサーバーの設定についての記事は世の中に多く存在するためです。畢竟、TLSクライアント認証に関する話題がほとんどとなる予定です。
仕組みについては適宜記述しますが、どちらかというと設定の話がメインです。

# Mutual TLSで用意するもの

Mutual TLSで必要なものは多いので、以下にまとめておきます。
登場人物としては、HTTPSサーバー、認証局、クライアントの三者です。
このうちHTTPSサーバーと認証局の運営者は同一です。
サーバーは当然オンラインでなければありませんが、認証局についてはオンラインである必要はまったくありません。
むしろ安全のためにはオフラインであるべきでしょう。
なおサーバー上にはクライアント認証用の秘密鍵は置かれません。

## サーバー & 認証局
- HTTPSに必要なもの (割愛。証明書の発行者はクライアント証明書と異なってよい)
- クライアント証明書用認証局
	- root認証局
		- root認証局秘密鍵(自身を含むサブ認証局を作るため使用する)
		- root認証局証明書(オレオレでもよい。というかオレオレ)
	- sub認証局
		- sub認証局秘密鍵(クライアント証明書署名用。サーバーには置かない)
		- sub認証局証明書(root認証局で署名する)
		- sub - rootのchained証明書 (サーバーに置く)

## クライアント側
- 秘密鍵(CSR作成と接続時に利用する。サーバー側にも送ってはならない)
- 証明書署名要求(CSR)
	- これを認証局に送り証明書を作ってもらう
- CSRを元に認証局で作られたクライアント証明書(接続時に利用する)

## オレオレ認証局でよいのか？
クライアント証明書のための認証局のroot証明書がオレオレでいいのか？という疑問があるかもしれませんが、この認証局は**サーバーがクライアントを認証するためのもの**です。つまり「サーバー & 認証局」から見て、正当性を確保できればよいためオレオレで問題ありません。サーバー側を証明するためのHTTPSとは異なることに注意してください。
つまりMutual TLSにおいてはサーバ証明書の発行者と、クライアント証明書の発行者は別でもよいということになります。
ただしHTTPSを終端しているもの(今回はNginx)が、クライアントの認証を行う必要はあります。

# Basic認証との比較
## よい点
Basic認証の場合、サーバー側が認証情報を全部保持しているため、クライアントになりすますことが可能です。
TLSクライアント認証の場合、サーバー側はクライアントの秘密鍵を知らないため、なりすますことは不可能です。

## よくない点
「用意するもの」を見てわかる通り、非常に複雑です。とりあえず立ててつなぎたいレベルだと面倒すぎます。
またこれはサーバー側だけでなく、クライアント側も同様で、秘密鍵とCSRを作ってもらったり鍵の管理をしてもらったりと、相手側の情報管理能力が高くないと事実上運用不可能でしょう。

# まとめ
Mutual TLSは、ざっくり言うと「HTTPS + TLSクライアント認証」です。

---
次回はクライアント証明書の認証局を作ります。
果たしてこのシリーズは完結するのか。
[途中]Adminer から Oracle10g に接続するまで

# to do
- oracle instant client 
- oci8
- 

# task

- 編集するファイル？

```bash
/etc/prifile
/etc/apache2/envvars
/etc/php/7.1/apache2/php.ini
/usr/sbin/apache2ctl
```

# ref
- [Oracle Instant Clientの導入とPHPのOCI8設定－Linux編｜フランス語を一日一語 UN MOT PAR JOUR　と少しPC関係](https://ameblo.jp/french-touslesjours/entry-11076725318.html)
- [yumで入れたPHPにoci8とpdo_ociを入れる - Qiita](https://qiita.com/asano_yuki/items/24fd22412057338093ae)

# env

- Ubuntu info

```bash
lab_release --all
# No LSB modules are available.
  Distributor ID: Ubuntu
  Description:    Ubuntu 16.04.3 LTS
  Release:        16.04
  Codename:       xenial

apache2 -v
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-09-18T15:09:02

php -v
PHP 7.1.12-2+ubuntu16.04.1+deb.sury.org+2
(cli) (built: Dec  7 2017 20:12:04) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017
Zend Technologies with Zend OPcache 
v7.1.12-2+ubuntu16.04.1+deb.sury.org+2,
Copyright (c) 1999-2017, by Zend Technologies

# /var/www/html/adminer/
cat adminer.php | grep version
version=4.3.1
```

- windows info

```ps1
$ systeminfo
OS Name:                   Microsoft Windows 10 Pro Insider Preview
OS Version:                10.0.17025 N/A Build 17025
System Type:               x64-based PC
```
Project Euler Q42 【符号化三角数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
三角数の$n$項は $t_n = \frac{1}{2}n(n+1)$で与えられる. 最初の$10$項は
$1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...$

である.

単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば $SKY$ は $19 + 11 + 25 = 55 = t_{10}$である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.

$16K$のテキストファイル [words.txt](https://projecteuler.net/project/resources/p042_words.txt) 中に約$2000$語の英単語が記されている. 三角語はいくつあるか?

## 解答

```bash
cat words.txt |
tr -d '"' |
tr ',' '\n' |
sort |
nl |
awk '{for(i=1;i<=length($2);i++){print $1,substr($2,i,1)}}' |
sort -k2,2 |
join -j 2 - <(echo {A..Z} | tr ' ' '\n' | nl) |
sort -k2,2n |
awk '{a[$2]+=$3}END{for(i=1;i<=length(a);i++){print a[i]}}' |
awk '{print $1,sqrt(8*$1+1)}' |
fgrep -v '.' |
wc -l
162
```

「単語の値が三角数である」を整理すると、「$\sqrt(8*単語の値+1)$が整数である」ということが導ける。
※正確には整数であっても偶数の場合はNGだが、上記が偶数ということは$(8*単語の値+1)$が$4$の倍数ということである。これはありえない。

## 別解

```bash
cat words.txt |
tr -d '"' |
od -An -td1 |
tr -d '\n' |
sed 's/44/\n/g' |
awk '{for(i=1;i<=NF;i++){s[NR]+=$i};print s[NR]-64*NF}' |
awk '{print $1,sqrt(8*$1+1)}' |
fgrep -v '.' |
wc -l
162
```

`od`コマンドを使ってみた。普段は`-tx1c`で使うが、$10$進数が欲しかったので初めて`-td1`を使った。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/042.html
systemctl コマンド

# systemctl

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の8日目の記事です。

```
NAME
       systemctl - Control the systemd system and service manager

SYNOPSIS
       systemctl [OPTIONS...] COMMAND [NAME...]

DESCRIPTION
       systemctl may be used to introspect and control the state of the "systemd" system and service manager. Please refer to systemd(1) for an introduction into the basic concepts
       and functionality this tool manages.
```
これまでサービス起動デーモンとして、SysVinit/Upstart が使われてきたが Red Hat Enterprise Linux 7 や CentOS 7 からは systemd が使われるようになり、それをコントロールするためのコマンド。
サービスは `Unit` という単位で作られる。

## コマンド群

| 操作                 |  コマンド          |
|---------------------|------------------|
| サービス起動           | systemctl start ${Unit} |
| サービス停止           | systemctl stop ${Unit} |
| サービス再起動         | systemctl restart ${Unit} |
| サービスリロード         | systemctl reload ${Unit} |
| サービスステータス表示   | systemctl status ${Unit} |
| サービス自動起動有効    | systemctl enable ${Unit} |
| サービス自動起動無効    | systemctl disable ${Unit} |
| サービス自動起動設定確認 | systemctl is-enabled ${Unit} |
| サービス一覧           | systemctl list-unit-files --type=service |
| 設定ファイルの再読込     | systemctl daemon-reload | 

## サービスを作る

1. サービスのユニット定義ファイルを作る
2. ユニット定義ファイルを再読込
3. 起動

```console
## 動かすサービスを作る
$ sudo vim /usr/local/bin/hello_world.sh
$ cat /usr/local/bin/hello_world.sh
#!/bin/sh

while :
do
    echo "Hello, World. (PID=$(echo $$), DATE=$(date))"
    sleep 30
done

## ユニット定義ファイルを作る
$ sudo vim /etc/systemd/system/hello_world.service
$ cat /etc/systemd/system/hello_world.service
[Unit]
Description=hello_world
After=network.service

[Service]
Type=simple
Restart=on-success
ExecStart=/usr/local/bin/hello_world.sh

[Install]
WantedBy=multi-user.target

## 起動
$ sudo systemctl start hello_world

## 自動起動の設定
$ sudo systemctl enable hello_world
Created symlink from /etc/systemd/system/multi-user.target.wants/hello_world.service to /etc/systemd/system/hello_world.service.
```

## ログの確認

systemd によって起動された Unit のログは、`/var/log/journal` 以下にバイナリ形式で保存されるようになっています。そのため、ログの確認には `journalctl` コマンドを利用する。
`-f` で `tail -f` 的な動きになる。

```console
## tail -f 的な動きをさせる。
$ sudo journalctl -f -u hello_world
-- Logs begin at Fri 2017-11-24 12:20:20 JST. --
Dec 08 12:59:40 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 12:59:40 JST 2017)
Dec 08 13:00:10 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 13:00:10 JST 2017)
Dec 08 13:00:40 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 13:00:40 JST 2017)
Dec 08 13:01:10 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 13:01:10 JST 2017)
Dec 08 13:01:40 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 13:01:40 JST 2017)
Dec 08 13:02:10 test hello_world.sh[27804]: Hello, World. (PID=27804, DATE=Fri Dec  8 13:02:10 JST 2017)

## pager(less) をやめる。
$ sudo journalctl --no-pager -u hello_world
```
Githubの通知メールの宛先をorganization毎に変える

Githubを普段使っていると色々メールで通知が来ると思いますが、最近は会社やプロジェクトチームなど所属しているorganizationが増えてきて、しかも全部プライベートなメアドに通知が来るのでだいぶ煩雑になってしまっていました。
そこでorganization毎に通知の宛先変えられないかと思い調べたらできるっぽいのでやってみました、という話。

# 手順
1 . 「Settings」 → 「Emails」をポチ。
2 . 「Add email address」に追加するメアドを入力して「Add」をポチ。

![Email settings 2017-12-08 10-49-44.png](https://qiita-image-store.s3.amazonaws.com/0/63069/bd170589-5b31-83c0-e9a8-d53acb483165.png)

3 . 追加したメアド宛てに確認メールが届くので、メールのリンクをポチって確認を完了します。
4 . Githubに戻って「Settings」 → 「Notifications」をポチ。
5 . 下の方に「Custom routing」という項目があるので、そこで通知先を変えたいOrganizationの「Edit」ボタンをポチ。

![Notification settings 2017-12-08 10-56-21.png](https://qiita-image-store.s3.amazonaws.com/0/63069/2e224079-e69f-1461-a68c-ea06dcf90c3c.png)

6 . 有効なメアドがプルダウンで選択できるので、先程追加したメアドを選択して「Save」ボタンをポチ。

これで設定完了です。
Organization毎に通知先が分かれて良い感じにすっきりできました。
5分でひどいGoogle Home エージェントを作ったらひどい結果になった

9日のAdventCalendarが空いていたので、5分で作ったAssistant対応エージェントの話をしてみます。
作ったのはDialogflowを使ってユーザーが喋ったことをそのまま返すAgent。
作成時間5分です。
技術的なことは何も書いていないので気分転換にごらんください。

喋ったことをそのまま返すと言っても録音した内容が返ってくるわけではなく、音声解析された結果が返されるので自分の言葉がどのように解釈されているか調べることができます。
まず、Agentを作ってIntentを作成**User says**に適当な言葉を入れて全体を選び```@sys.any:any```を選びます。
これで、Googleが音声認識した言葉がそのまま受け取れます。
<img width="749" alt="Screen Shot 2017-12-08 at 13.17.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/17830/419064cd-3811-5c39-de3d-442439d9dbab.png">
次に**Response**に```$any```と入力して、受け取った言葉をそのまま返すようにします。
<img width="729" alt="Screen Shot 2017-12-08 at 13.18.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/17830/01bfc969-a6be-590c-3371-64081eb90ce1.png">

Dialogflowはこれだけ EntityもFulfil intentも使用しません。
早速Google Assistantに繋いでGoogle Homeで試してみます。
Agent名はやまびことしました。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/G6xUEAV9tq0/0.jpg)](http://www.youtube.com/watch?v=G6xUEAV9tq0)

ところで、我が家には子供が買った喋った内容をそのまま返すくまモンのおもちゃがあります。
これと喋らせたら永遠に喋り続けるんじゃ・・・ ということで試してみました。
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/8nuLM9YVMJo/0.jpg)](http://www.youtube.com/watch?v=8nuLM9YVMJo)
どうしてこうなった・・・

思いの外ひどい結果になってしまいましたが、Googleの音声入力がどういう方向に学習が進んでいるか垣間見れた気がします。
Dialogflowはきちんと作ると奥深いですが、こういうちょっとしたおもしろツールを作ってみるのも楽しいですね。

Dialogflowを使ったちゃんとしたエージェントの書き方は11日に書きます。
【JavaScript】ページ離脱時に beforeunload でアラート表示、だがカスタムメッセージが設定できない

JavaScript で `beforeunload` イベントを使うと、ブラウザの閉じるボタンやリロード、他のページに遷移しようとしたときにアラートを表示することができます。

以下は、aタグリンクとsubmitボタンを配置しただけのHTMLです。

```html:index.html
<!DOCTYPE html>

<html lang="ja">
<head>
  <title>beforeunloadTest</title>
</head>

<body>

  <form action="index.html" method="get">
  
    <div>
      <a href="index.html">link</a>
    </div>
    <div>
      <input type="submit" id="mySubmit" value="submit">
    </div>
  
  </form>

  <script src="main.js"></script> 
</body>
</html>
```

以下のように、beforeunloadイベント発火時の処理とイベントの登録を実装します。

```js:main.js
// beforeunloadイベント発火時の処理
var unloaded = function (e) {
    // カスタムメッセージの設定（後述するが、EdgeとIEしか表示されない）
    var confirmMessage = '離脱するの？';
    e.returnValue = confirmMessage;
    return confirmMessage;
};

// beforeunloadイベントの登録
window.addEventListener('beforeunload', unloaded, false);

// 特定のボタンがクリックされたときはアラートを表示しないようにもできます。
document.getElementById('mySubmit').addEventListener('click', function(){
    // submit時はアラート表示させない
    window.removeEventListener('beforeunload', unloaded, false);
});
```

ただし、上記で設定した「離脱するの？」というカスタムメッセージは**Edge**と**IE**でしか表示されません。
確認時のバージョンは以下。

- Chrome : 62
- Safari : 11
- Firefox : 57
- Edge : 40
- IE : 11.726
- Opera : 49
echoで登録したスマートホームデバイスを削除する方法

Alexaアプリでは、登録済みのスマートホームデバイスについて、無効にすることはできるけど、消すことができない。実験的に作ったものとかが残り続けるのは邪魔ですね。

消したいときには、 https://alexa.amazon.co.jp/ から操作すると削除が可能です。（こちらだと逆に名前の変更などはできません）。

スマホからアクセスすると、アプリを使えと言われてしまうので、その場合は、「PC版サイトを見る」などしましょう。
ワークフローエンジン、コンテナ関連ごとの、Tipsを集めてみる

# 概要

まずは自分備忘録のために、まとめてみる。

以下のものよりはもう少し、実践的なものになる予定。

* [バイオインフォマティクスのツール、ワークフロー、コンテナ関連調査 - Qiita](https://qiita.com/manabuishiirb/items/fff0c5b09a0a46092662) 

# CWL

## view.commonwl.org でグラフがでてこない

現状、`class` が、`Workflow`に以外のケースではグラフがでないとのこと

```cwl
class: Workflow
```

## baseCommandは２つ書けますか？

「書けません」との返事をもらいました。

[Is baseCommand allowed to appear several times in one cwl file ? · Issue #515 · common-workflow-language/common-workflow-language](https://github.com/common-workflow-language/common-workflow-language/issues/515#issuecomment-343652233) 

# Nextflow

## 「ファイルが書き込めない」というエラーがでる

こんなエラーがでる

```

```

権限の問題のようで、以下のようにして解決

```
```

この問題、コンテナ使うときはいくつかありそうなかんじ

## データをS3にあげたいのだけど、どのフィールドに書いたら良いですか？

以下のディレクティブで、S3のパスをかけばよい

```
publishDir
```

# Snakemake

Snakemakeでのワークフロー

- [Snakemake\-Workflows](https://github.com/snakemake-workflows)
【調査中】Goのbenchmarkを使うと環境ごとに結果がバラバラになってしまったので、誰か知恵を貸して欲しい

今回のアドベントカレンダー、他のことを書く予定でいたのですが、不思議な事象に遭遇したのでこちらに的を絞って送ります。
__解決してません__。率直に言って謎。解決できたら追記します。むしろ誰か詳しい方がいたら教えてください。

## 今回試したこと

variableやconstを変数に代入するだけのコードを書き、ベンチマークをとりました。

### ソースコード

```go
package main

var a0 int64 = 0
var a1 int64 = 1
var b0 int8 = 0
var b1 int8 = 1
const c0 = 0
const c1 = 1
const n = 1048576

func case0() int8 {
	var number int8 = 0
	for i := 0; i < n; i++ {
		number = int8(a0)
		number = int8(a1)
	}
	return number
}

func case1() int8 {
	var number int8 = 0
	for i := 0; i < n; i++ {
		number = b0
		number = b1
	}
	return number
}

func case2() int8 {
	var number int8 = 0
	for i := 0; i < n; i++ {
		number = c0
		number = c1
	}
	return number
}

func case3() int8 {
	var number int8 = 0
	for i := 0; i < n; i++ {
		number = 0
		number = 1
	}
	return number
}
```

### ベンチマークテスト

```go
package main

import "testing"

func BenchmarkCase0(b *testing.B) {
	for i := 0; i < b.N; i++ {
		case0()
	}
}

func BenchmarkCase1(b *testing.B) {
	for i := 0; i < b.N; i++ {
		case1()
	}
}

func BenchmarkCase2(b *testing.B) {
	for i := 0; i < b.N; i++ {
		case2()
	}
}

func BenchmarkCase3(b *testing.B) {
	for i := 0; i < b.N; i++ {
		case3()
	}
}
```

### 結果

```shell-session
$ go test -bench . -benchmem
BenchmarkCase0-4   	    5000	    314894 ns/op	       0 B/op	       0 allocs/op
BenchmarkCase1-4   	    5000	    314963 ns/op	       0 B/op	       0 allocs/op
BenchmarkCase2-4   	    2000	    636342 ns/op	       0 B/op	       0 allocs/op
BenchmarkCase3-4   	    5000	    328588 ns/op	       0 B/op	       0 allocs/op
```

## 問題点

結果を見ればわかるように、constだけ2倍近く時間がかかります。constなので、他と同レベルの時間で処理が終わるはず。

### 補足

* goのバージョンは1.8.3
* OSはHigh Sierra 10.13.2
* 自宅のデスクトップ（ubuntu16.04）で同じコードを動かすと定数が遅い事象は起きない
* 他のmacで試したいが、アドベントカレンダーの締め切りまでに試せそうな端末がなかった

作業メモは[このページ](https://qiita.com/aimof/items/d4386c83fbea7b83b7aa)に集約して、こちらでは結果だけ書きます。