OmniAICreator/Qiita-1.07M huggingface dataset:
postgresに接続できなくなった場合


railsアプリにアクセスした時に以下のエラーが発生しました

```
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"?
```

usr/local/var/postgres/postmaster.pidを削除して治ります。
rake db:migrate => Access denied for user 'root'@'localhost' (using password: NO)

環境はMac OSXです。

# Railsアプリをローカルで立ち上げる

新しく作ったRailsアプリケーションや、Githubから`clone`や`pull`して取ってきたRailsアプリケーションを、ローカル環境で動かしたい場合、

1. `bundle install`
2. `rake db:create(migrate)`

とする必要があると思います。

# Access deniedエラー
2.において、

```
$ rake db:migrate
rake aborted!
Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)
```

というエラーに遭遇しがち。
なんで？
# 解決策

`confing/database.yml`で**`default`**の`username`と`password`を設定する必要がありました。
その後`rake db:migrate`をすると無事動きました。

**`development`**の`username`と`password`の設定を変えてもダメで、はコメントアウトしておきました。

こんな感じで、

```
default: &default
  adapter: mysql2
  encoding: utf8
  reconnect: false
  pool: 5
  timeout: 5000
  username: root  # とりあえずrootに設定
  password: ******  # ローカルで使うmysqlのパスワード
  socket: /tmp/mysql.sock
  host: localhost

development:
  <<: *default
  database: my_app_development
  # コメントアウトしておく
  # username:
  # password:
```

あとでもうちょっと詳しく調べてみます。

参考
・[railsのapp作成でmysqlを使用する時の導入とハマるところ　rake db:createができるまでの流れ　　](http://qiita.com/Kaisyou/items/17142ff2d080d565fedc)
Pacemaker1.1.15のクラスタ構成(DC決定を含む)時のメッセージのやり取り

#クラスタ構成時のメッセージの流れの概要
基本的には、PM1.0系と変わっていませんが、DC選出のロジックがPMプロセスの起動時間ベースに変わっていますが、詳細は以下に記載していません。興味のある方はソースコードを解析してみてください。

## 利用されるタイマーについて
 * election_triggerタイマー - electionを開始するかどうかDC探索の為のタイマー
 * electionタイマー - DC決定の為のタイマー
 * integrationタイマー - クラスタメンバー合意完了の為のタイマー
 * finalization_timer - クラスタ構築完了の為のタイマー

## 開始(S_STARTING)
 * 1. 初期起動関連処理を実行
 * 1. election_triggerタイマー(dc_deadtime:デフォルト20s)を仕掛ける
   * 自ノードが既にDCの場合はI_ELECTIONへ

## DC探索(S_PENDING)
 * 3. CRM_OP_JOIN_ANNOUNCEメッセージ送信(起動済みのDC探索)
 * 4. 応答の有無によって処理が異なる
   * DCが存在しなければDCから応答がない場合は、election_triggerタイマーが発動し、⑤へ
   * DCが存在する場合は、DCノードがCRM_OP_JOIN_ANNOUNCEに応答して、CRM_OP_JOIN_OFFERメッセージを送ってきたノードへ返信し、⑦へ

## DC決定(S_ELECTION)
 * 5. ⑤CRM_OP_VOTEメッセージ送信(S_ELECTIONへ)
 * 6. election_timeoutタイマー(election_timeout:2min)を仕掛ける
    * election_timeoutタイマーは、crmdの状態遷移(do_state_transition()中にS_ELECTION、S_RELEASE_DC以外に遷移する場合に停止される。
 * 6-1. CRM_OP_VOTEメッセージを受信
   * do_election_count_vote()処理を実施
    * votedハッシュテーブルには、DCになれそうなノードのみが積み上げを行う
    * DCになれないノードはここでCRM_OP_NOVOTEメッセージを送信
     * DCになれないノードは、election_timeoutタイマーもキャンセルする
     * DCになれそうなノードは、election_timeoutタイマーをキャンセルしないので、DCになれるならelection_timeoutタイマーが発動する
   * do_election_check()処理を実施 ---- election_timeoutタイマーが発動して処理が進み、構成メンバーの情報が揃った時にも処理
    * 構成予定メンバーでCRM_OP_VOTEメッセージのやり取りが終了し場合は(voteハッシュテーブルに構成予定メンバーの情報が揃った)、メンバーのcrmd宛てにCRM_OP_JOIN_OFFERメッセージを送信(DCノードからしか実行されない)
 * 6-2. CRM_OP_NOVOTEメッセージを受信
   * メッセージのノード情報でvotedハッシュテーブルの更新を行う。

## クラスタメンバの合意(S_INTEGRATION)
 * integration_timerタイマー(crmd-integration-timeout:デフォルト3min)は、crmdの状態遷移(do_state_transition)中にS_INTEGRATIONに遷移する場合に仕掛けられる。
 * 7. ⑦CRM_OP_JOIN_OFFERメッセージを受信
  * DCをセットして、CRM_OP_JOIN_REQUESTをDCに送信
  * election_triggerタイマーを停止
 * 8. CRM_OP_JOIN_REQUESTメッセージを受信
  * DCノードは構成予定メンバーからのCRM_OP_JOIN_REQUEST受信待ち状態
   * 受信完了後に、CRM_OP_JOIN_ACKNAKメッセージをメンバーに送信(CRMD_JOINSTATE_MEMBERならCRM_OP_JOIN_ACKNAKはTRUE,その他はFALSE)

## クラスタ構成の完了(S_FINALIZE_JOIN)
 * integration_timerタイマーは、crmdの状態遷移(do_state_transition)中にS_INTEGRATION以外に遷移する場合に停止される。
 * finalization_timerタイマー(crmd-finalization-timeout:デフォルト30min)は、crmdの状態遷移(do_state_transition)中にS_FINALIZE_JOINに遷移する場合に仕掛けられる。
 * 9. CRM_OP_JOIN_ACKNAKメッセージ受信
  * DCをセット
  * CRM_OP_JOIN_CONFIRMメッセージをDCに送信
 * 10. CRM_OP_JOIN_CONFIRMメッセージ受信
  * 構成予定メンバーでCRM_OP_JOIN_REQUESTメッセージ、CRM_OP_JOIN_CONFIRMメッセージのやり取りが終了し場合は、pengineへの状態遷移作成依頼
   * finalization_timerタイマーは、crmdの状態遷移(do_state_transition)中にS_FINALIZE_JOIN以外に遷移する場合に停止される。

## 状態遷移を計算(S_POLICY_ENGINE)
 * 現在DCのCIBを元にして状態遷移を作成

## 状態遷移を実行(S_TRANSITION_ENGINE)
 * 状態遷移を実行

## 安定状態(S_IDLE)
 * 状態遷移実行完了後のクラスタ安定状態で、ノード故障、リソース故障などの要因がない場合には安定状態を続けます。
ssh公開鍵のコピーコマンド

メモ

#### ファイル名は自分の作成したものに変更する

```bash:macOS
$ pbcopy < ~/.ssh/ファイル名.pub
```

```bash:Windows
$ clip < ~/.ssh/ファイル名.pub
```

#### ファイル名が`id_rsa`の場合

```bash:macOS
$ pbcopy < ~/.ssh/id_rsa.pub
```

```bash:Windows
$ clip < ~/.ssh/id_rsa.pub
```
gitconfig の基本を理解する


git を使っているとよく遭遇する「autocrlf どう設定する？」問題について、詳細を忘れた頃にまた相談を受け、またまた色々と調べて理解が深まり折角なのでメモっておきます。今回は git config について、です。

## ゴール

結局のところ、現在、有効になっている設定は何？を確認したい。また、それはどこで設定されている値が生きてるの？（どこを変更すれば変えられるの？）を理解したい。

## 現在の設定値は？

### 対象の設定Keyが明確な場合

特定の設定 `key` について、現在、有効になっている設定を確認したい場合は、下記のコマンドを入力すればいい。

```
$ git config [key]
```

ex.）

```
$ git config core.autocrlf
false
```

### 全ての設定を確認したい場合

設定されている全ての値を確認したい場合は、下記のコマンドを実行する。

```
$ git config --list
```

ただし、設定が Key=Value 形式で大量に出てくるので面食らう。しかも、同一のKeyが何回か繰り返し出てきたりして、どれが正しい設定なの？ってなる。

答えを言うと、一番最後に出てきた設定が、有効になっている。のだが、これについてもう少し解説しておく。

## gitconfig の設定は3段階

git の config 情報の設定は、3段階に分かれている。システム全体 `system` と、ユーザ全体 `global` と、対象リポジトリのみ `local` ですな。

設定は、 system, global, local の順に読み込まれ、最後に読み込まれた設定で上書きされるため、よりスコープの狭い設定が有効になる。

それぞれの設定箇所の内容をリスト出力するには `git config` コマンドにオプションを追加すればいい。例えば global の場合は

```
$ git config --global --list
```

ということを踏まえて、前述のコマンドで大量に出力されていた内容をよく見てみると

```
$ git config --list
(git config --system --list の内容)
(git config --global --list の内容)
(git config --local --list の内容)
```

という感じになっていることが分かる。

## 実際の設定ファイルはどこに

それぞれの設定ファイルの場所は、以下の通り。

#### local

対象リポジトリ内の `.git/config`

#### global

ログインユーザのHOMEディレクトリ配下の `.gitconfig`

|OS|.gitconfig path|
|---|---|
|Linux/Mac|`~/.gitconfig`|
|Win|`[home]¥.gitconfig` <br>(通常は `C:¥Users¥[user]¥.gitconfig`)|


#### system

git インストールディレクトリの `gitconfig` ファイルだが、どんなアプリにバンドルされた git か？によって場所はまちまちの模様。

|OS|gitconfig path|
|---|---|
|Win|`C:¥development¥tools¥Git¥etc¥gitconfig`|
|Win|`C:¥Users¥[myUser]¥AppData¥Local¥Atlassian¥SourceTree¥git_local¥mingw32¥etc¥gitconfig`|
|Win|`C:¥Program Files (x86)¥Git¥etc¥gitconfig`|
|Win|`C:¥Program Files¥Git¥mingw64¥etc¥gitconfig`|
|Mac|`/usr/local/git/etc/gitconfig`|

## 実運用でよく使うのは

system はシステムデフォルトを表しているので、ここに手をいれることはあまりないと思います。また、local はリポジトリごとに設定ができるので、あるリポジトリだけ固有の設定をしたい場合は使うと思いますが、これもそんなにはないケースかと。最も利用するのは、おそらくユーザ設定である global だと思います。

### 設定コマンドと設定ファイルの対比

git の導入ガイドで最初に設定しなさいと、よく書かれている

```
$ git config --global user.name "My Name"
$ git config --global user.email myname@example.com
```

という記述ですが、これを読み解くと `global` 設定の `user` セクションに `name` というKeyで "My Name" という値を設定する。というコマンドですね。これにより `~/.gitconfig` には、下記のように設定が書き込まれます。

```.gitconfig
[user]
    name = "My Name"
    email = myname@example.com
```

以上です。少しはgitconfigの理解の助けになればと思います。

### （参考）Git book
[Git - 最初のGitの構成](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
CentOSでDNSの名前解決が動作しない

DHCPの環境でテストして、固定アドレスを設定したら、
名前解決ができなくなった。
<Font color="red">追記　</font>2016.11.2　その２を追加


その1```
誤）PEERDNS=yes
```
```
正）PEERDNS=no
もしくはコメントアウト
```

DHCPによって取得したDNSサーバのアドレスを/etc/resolv.confに反映するか。DHCPを使う場合は通常yes。
だそうです。


その２
再起動したら、名前解決ができなくなった
原因は、NetworkManagerが自動起動になっていた。
network-scripts/ifcfg-eth0に
```
DNS1=xxx.xxx.xxx.xxx
DNS2=yyy.yyy.yyy.yyy
```
の設定を書いておいても、OS起動時にNetworkManagerが
動くとNetworkManagerの設定が優先されてしまった。
で、下記のコマンドでNetworkManagerの自動起動を停止した。

```
#service NetworkManager stop   # いま動いているNetworkManagerを停止
#chkconfig NetworkManager off  # 自動起動を停止
```

こうなっていたので

```
$ chkconfig --list|grep work
NetworkManager 	0:off	1:off	2:on	3:on	4:on	5:on	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```
このコマンドで

```
$ sudo chkconfig NetworkManager off
```

こうなりました

```
$ chkconfig --list|grep work
NetworkManager 	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```
CUDA > Link > Youtube > 1070：CUDAプログラミング入門 @ NVIDIA

菱洋（りょうよう）エレクトロニクスの石井啄人さんという方の説明。

1070：CUDAプログラミング入門
https://www.youtube.com/watch?v=oJa4CJxqnNs&list=PL_MJualihC5A3REXN1CnuIlImC_o9YqnH&index=7

前半にアーキテクチャの話。後半にプログラム例がある。

CUDA入門時にいいように思う。

キーワードの一部

- Warp(32スレッド)
- SHFL(シャッフル命令)
- Grid, Block, Warp, Thread
- NSIGHT
- `-Xcompiler "/wd 4819" (c4819のwarningを消す)
- UVA (Unified Virtual addressing?)
   - 64ビットのアドレス値にて転送方向を自動判別? (GPU, CPU)
   - 明示的にコーディングする場合はUVAでない方を使うのがいいかも
Quantum Chemistry - Orthogonality

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Orthogonality
https://www.youtube.com/watch?v=GHk5C7PNFOc&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=32

- 緑
  - "orthogonal" (直交している)の定義
  - もし`<m|n>=0`であれば、プサイmとプサイnは"orthogonal"と言える
- 少し右のグラフ
  - x,y,z座標では各座標軸はorthogonal
     - (mutually)orthogonal one another
          - (補足)[英語] 3つがorthogonalなので"one another"
              - 2つの場合mutually orthogonal "each other"
     - (補足)「互いに直交してる」の英語は"mutually perpendicular"という言い方もある
- 紫の式
  - fn(x)のket表記
  - fm(x)の複素共役であるfm*(x)のbra表記
- ピンクの式
  - オペレータAにbra,ketを作用させた式
- 黄色
  - オペレータAがlinearかつHermitian operatorの時、という条件
- 水色
  - `|m>`と`|n>`はオペレータAのeigenfunctionとなる
     - [このビデオ](https://www.youtube.com/watch?v=0Q_KmTOy07E&index=30&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)の左上
- オレンジの式
  - オペレータAに`|n>`を作用させたもの
  - `|n>`はeigenfunctionなので以下が成り立つ
     - `|n>`にオペレータAを作用せたものは
     - `|n>`に係数a_n がかかったものとなる
  - `|m>`についても同様に成り立つ
  - ここで係数a_n, a_mは実数 (Rの太字 @ 工学における特殊関数 p10)
- 紫の式
  - `<m|A|n>`という値を見ていく
  - それはオレンジの式を使うことにより、真ん中の形になり
  - 係数a_nはbra,ketに関係ない (積分と関係ない)ので外に出る
- 緑の式
  - 1つ目と2つ目の関係式
     - [このビデオ](https://www.youtube.com/watch?v=QCiWuNpIjmE&index=31&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh)の右下の白い式 (Hermitian definition)の式
  - 1つ目から3つ目への変形
     - オレンジの式を使用
  - 係数a_m*はbra,ketに関係ない (積分と関係ない)ので外に出る
- 右上の紫の式
  - 左下の紫の式と左下の緑の式から1つ目と2つ目の関係式が得られる
  - a_m*はa_mの複素共役である
     - v=a + biの複素共役はv*=a - bi
  - オレンジにおいてa_mは実数であり、虚数単位iにかかる値は0
  - そのためa_m*とa_mは同じ値になり
  - 紫の式の一番右側が求まる
- ピンクの式
  - 紫の式の1つ目と3つ目の等式から変形
- 黄色
  - もしa_n not equal a_mならば
  - `<m|n>`が0にならないといけない
- 水色
  - `<m|n>`が0になるということは、左上緑の定義から
  - プサイmとプサイnがorthogonalである
  - ketベクトルで書くと
  - プサイm(`|m>`)とプサイn(`|n>`)がorthogonal
- オレンジ
  - これまで見たようにHermitian operators(オペレータA)のEigenfunctionsは
  - orthogonal
     - if non-degenerate
        - a_n not equal a_mの時
技術英語 > > You don't need to follow the steps rigidly. / worry about only [one thing at a time]

@ Code Complete (No. 12897/36077)

> You don't need to follow the steps <font color=red>rigidly</font>.

http://eow.alc.co.jp/search?q=rigidly
> 堅くなって、頑固に、堅く、堅苦しく、厳しく、厳格に、こわばって

続きの文章は以下のようなもの

> The idea is to start with something concrete, worry about only <font color=red>one thing at a time</font>, ...


@ 佐藤オオキのスピード仕事術 - 400のプロジェクトを同時に進める 
> 目の前の仕事だけに集中する
CentOS 6.8のopensslを1.0.2にし、nginxをHTTP/2に対応させたい！

## 環境
- CentOS 6.8
- openssl 1.0.1(yumからインストール)→openssl 1.0.2
- nginx 1.11.3(yumからインストール)→nginx 1.11.4（2016/09/20時点最新版）

## opensslの設定

```
cd /usr/local/src
sudo wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
sudo tar -zxf openssl-1.0.2-latest.tar.gz
```

opensslは以上。

## nginxの設定

http://nginx.org/en/download.html

上記からインストールしたいバージョンを選択。

```
cd /usr/local/src
sudo wget http://nginx.org/download/nginx-1.11.4.tar.gz
sudo tar -zxf nginx-1.11.4.tar.gz
```

### njsのインストール

nginxのインストールに必要な、njsをインストール。
自分の環境では1.0.1だったので下記設定をしました。（nginx -Vで確認）

http://hg.nginx.org/njs/rev/cdb8d20935ee

```
cd /usr/local/src
sudo wget http://hg.nginx.org/njs/archive/cdb8d20935ee.tar.gz
sudo tar -zxf cdb8d20935ee.tar.gz

sudo mv ./njs-cdb8d20935ee ./nginx-1.11.4
cd ./nginx-1.11.4
sudo mv njs-cdb8d20935ee njs-0.1.0
cd ./nginx-1.11.4/njs-0.1.0
sudo ./configure

```


### nginxのインストール

nginx -Vでconfigureの設定を確認し、--with-openssl=/usr/local/src/openssl-1.0.2hを追加する（opensslのバージョンは確認してください）

```
cd ../
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --add-dynamic-module=njs-0.1.0/nginx --with-threads --with-stream --with-stream_ssl_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-openssl=/usr/local/src/openssl-1.0.2h
sudo make
sudo make install
```

### nginxのリスタート

```
sudo service restart nginx
nginx -v
```

上記で1.11.4に切り替わっているか確認。

### .confファイルの設定

あとはnginxの設定（nginx.confやsites-available/*.conf）に、

```
listen 443 ssl http2;
```

http2を追加してあげれば無事HTTP/2でサーバーが動作します。
![_tanshio_2016-9月-20.jpg](https://qiita-image-store.s3.amazonaws.com/0/39134/5e8a5192-55be-53db-678c-ab42705dcbdc.jpeg)
快適HTTP/2ライフを！
Chrome拡張機能「Falcon」でWeb閲覧履歴をサクッと検索

![Kobito.PQCRbf.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f246ef77-db04-f1dd-5592-d110f94ce679.png "Kobito.PQCRbf.png")


GitHubでトレンド入りしていたChrome拡張機能[Falcon](https://chrome.google.com/webstore/detail/falcon/mmifbbohghecjloeklpbinkjpbplfalb)の紹介記事です。

特徴としては **Webサイトの中身まで検索対象**とするところです。
この前見た○○の記事どこだっけか、みたいな探し方をする人にはとても良い拡張機能だと思います。


※執筆時点（2016/09/19）のバージョンは`v0.1.4`です。


## 使い方
まずはインストールしましょう。
https://chrome.google.com/webstore/detail/falcon/mmifbbohghecjloeklpbinkjpbplfalb

インストールが終わったら
適当にWebサイトを巡回しましょう。

ブラウザのオムニボックス（アドレスバー）に
**「f 検索したい文字列」**を入れます。

以下は`React`で検索した例です。

![Kobito.N8sEOD.png](https://qiita-image-store.s3.amazonaws.com/0/35595/36a74f3a-7ec7-85d4-9fc0-6aeedce39fe9.png "Kobito.N8sEOD.png")

----
「URL 日付 タイトル」の形式で履歴から検索＆表示されます。

![Kobito.0J7qKh.png](https://qiita-image-store.s3.amazonaws.com/0/35595/8a0e6790-2af8-227e-4533-27be49574584.png "Kobito.0J7qKh.png")


### オプション
デフォルトは現在から2週間以内に閲覧したWebサイトを対象に検索するようです。

オプションで期間の指定や除外などもいけるみたいです。
詳細は[公式サイト](https://github.com/lengstrom/falcon#examples)を参照してください。


## 技術解説
どうやってインデックス貼ってるのかと思ってソースを見ていたのですがとてもシンプルでした。

### Webサイトを開いたときの処理

1. Webサイトを開いた日時をキーにする
2. サイト中の検索対象とする単語を抽出して、スペース区切りで1つの文字列にする
3. 上記の文字列をキーに対する値とする
4. [chrome.storage](https://developer.chrome.com/extensions/storage)に上記のキーバリューを保存する

※銀行系のサイトはブラックリストとして定義してあって一応除外しているようです。
https://github.com/lengstrom/falcon/blob/master/extension/js/blacklist2.js



### 検索するときの処理

1. 2週間分（デフォルト検索の場合）のキーを取得する
2. キーに対する値から`indexOf`で検索語の存在をチェックする

単純に文字列を含んでいるかをチェックしているだけでした。
データが少ない場合は、十分なのかもしれません。


## その他
オムニボックスの検索は拡張機能に限定されているわけではありません。
[OpenSearch](https://ja.wikipedia.org/wiki/OpenSearch)で標準化されています。
Qiitaは対応されているので[Chromeの検索エンジンの設定画面](chrome://settings/searchEngines)を開くと自動で登録されていることが確認できます。
![Kobito.a5TKN9.png](https://qiita-image-store.s3.amazonaws.com/0/35595/4285a78d-4ad2-2c6b-5073-82a0f6cada29.png "Kobito.a5TKN9.png")

qiita.comなんて打つのは面倒なので「q」とかで登録しなおすのがおすすめです。

またQiitaの上のAlcは英単語を検索可能なWebサイトです。
OpenSearchに対応していないサイトですが筆者が自分で登録したものです。
URLでアクセス出来るサイトなら自由に登録できるので検索の効率化に繋がります。

**検索機能のあるWebサービスを作ったらOpenSearch対応すると良いです。**
**最低でもqパラメータなどを用意して検索できるようにしましょう。**


## あとがき
検索用のキーバリューを保存している`chrome.storage`は暗号化されているわけではないです。
※ユーザーのExtensionの保存ディレクトリを見れば普通に見えます。

漏れたら本当にまずい情報を扱う人はインストールしない方がいいです。
そういう方は拡張機能自体使ってないと思いますが念のため。
Let’s Encrypt+NginxでSSLの評価をA+にしたい！

Let’s Encryptが開始され、SSLの導入のハードルがぐんと下がりました。
その分、SSLの設定も見直す必要性も出てきます。
SSLの評価を行うことのできるサービス、[SSL Server Test](https://www.ssllabs.com/ssltest/index.html)を使ってSSLの評価を行ってみましょう。もしFだったら要注意です。

## Let’s Encryptの導入

[Let’s EncryptのSSL証明書で、安全なウェブサイトを公開](http://knowledge.sakura.ad.jp/knowledge/5573/)
さくらインターネットが公開している上記の記事が参考になります。
しかし、上記設定だと自分の設定（CentOS6.8、nginx1.1.3）だとBだったので諸々調整しました。

## 調整内容




```
server {
        listen 443 ssl http2;
        server_name ドメイン名;
        root /usr/share/nginx/html/ドメインで使うディレクトリ;
        index index.php index.html index.htm;

        ssl_certificate         /etc/letsencrypt/live/ドメイン名/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/ドメイン名/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
        
        ssl_dhparam /etc/ssl/private/dhparam.pem;
        
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 8.8.4.4 8.8.8.8 valid=300s;
        resolver_timeout 10s;
        
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        
        ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK";
        ssl_prefer_server_ciphers  on;
        
        add_header Strict-Transport-Security max-age=15768000;
}
```

ssl_certificateをcern.pemからfullchain.pemに変更するだけでAになりました。

ssl_dhparamは

```
sudo openssl dhparam 2048 -out /パス/dhparam.pem
```
で作成します。
ディレクトリは/etc/ssl/private/を作成しましたが必要に応じて変更してください。

上記設定などは、以下のサイトなどが参考になります。
[https://blog.kksg.net/posts/nginx-secure-ssl](https://blog.kksg.net/posts/nginx-secure-ssl)

上記設定をすることによりA+になりました。
![SSL_Server_Test__ftype_net__Powered_by_Qualys_SSL_Labs__🔊.jpg](https://qiita-image-store.s3.amazonaws.com/0/39134/df5f638c-153b-0230-acdf-7dcffe098a5c.jpeg)

## おわりに
もし評価がFだったら脆弱性などがあるかもしれませんので早急に対応しましょう。
新しい脆弱性は次々に出てきますので、何ヶ月か一度評価をしてみて、もし評価が下がっているようでしたら対応することをおすすめします。
[備忘録]Android Studioをアップデートした時などに表示される、Gradleのバージョンを・・・のダイアログ

Android Studioをアップデートした時などに、
Gradleのバージョンを～に変更した方が・・という感じのダイアログが出てきた場合用の備忘録。

#環境
Android Studio：2.1.xから2.2にアップデート
Gradle version：2.14.1にアップデート

#操作
Gradleのバージョン変更は、ダイアログのボタンから実行。(適用してくれそうなボタンを押下する)

#確認
##Project Structureの、Projectの設定の確認
File/ Project Structure...
　-> Project
・Gradle versionが2.14.1になっていること
・Android Plugin Versionが2.2.0になっていること
※バージョンは適宜読み替えて下さい

##build.gradle(Project: ～)の確認
> buildscript {
>   repositories {
>     jcenter()
>   }
>   dependencies {
>     classpath 'com.android.tools.build:gradle:2.2.0'
>   }
> }

※この設定で指定されているバージョンは、**「Android Plugin Version」**の方なので注意。(Gradle versionと間違えると、見つからないよ！というエラーが出る。)
※古いバージョンでは、リポジトリがjcenter()以外になっている場合があるので注意。

##gradle-wrapper.propertiesの確認
> ・・・
> distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
> ・・・

※この設定で指定されているバージョンは、Gradle versionの方。

#参考
[Android Plugin for Gradle Release Notes]
https://developer.android.com/studio/releases/gradle-plugin.html#revisions
※設定の説明など。

> Android Plugin for Gradle, Revision 2.2.0 (September 2016)
> Dependencies: 
> * Gradle 2.14.1 or higher. 
> * Build Tools 23.0.2 or higher.

[bintray / jcenter]
https://bintray.com/bintray/jcenter
※com.android.tools.build.gradle　のバージョンを見たい時に。
GCEでお手軽Minecraft Serverを構築

GCEでCoreOSを使って簡単にMinecraftのServerを構築したいと思い、CoreOSの勉強がてらやってみました。
単純にdockerが使える軽量な環境ということで、CoreOSを採用。軽いということはいいことだ。
クラスタとか、全然関係ありません。

今回使わせてもらったdockerのimageは、こちら。
https://hub.docker.com/r/itzg/minecraft-server/

環境変数で、いろいろMinecraftの設定を行えちゃうのがすごい。

## サービスの登録（まずは手動で）

CoreOSはsystemdを採用しているので、まずは/etc/systemd/system/配下にサービスを追加して確認します。

/etc/systemd/system/mc-vanilla.service

```
[Unit]
Description=Minecraft vanilla Server
After=docker.service
Requires=docker.service

[Service]
ExecStartPre=-/usr/bin/docker kill mc-vanilla
ExecStartPre=-/usr/bin/docker rm mc-vanilla
ExecStart=/usr/bin/docker run -v /data:/data -e VERSION=1.10.2 -e EULA=TRUE -e ENABLE_QUERY=true -e PVP=false -e OPS=管理権限のマイクラユーザID -e WHITELIST=ホワイトリストのマイクラユーザID -p 25565:25565 --name mc-vanilla itzg/minecraft-server
ExecStop=/usr/bin/docker stop mc-vanilla

[Install]
WantedBy=multi-user.target
```
最初、`ExecStart`の指定で`/usr/bin/docker -d -it・・・`とバックグランド実行にしていたら、うまく起動しませんでした。もしかしてフォアグランドでないとダメなのかなぁと思い、`-d -it`を削除。

で起動してみる。
```
$ sudo systemctl start mc-vanilla.service
```
で、停止。
```
$ sudo systemctl stop mc-vanilla.service
```
問題なければ、サービスを有効にする。
```
$ sudo systemctl enable mc-vanilla.service
```
うまく行かない時は、statusで確認する。
```
$ sudo systemctl status mc-vanilla.service
```
ファイルを修正した場合は、daemon-reloadする。
```
$ sudo systemctl daemon-reload
```

## サービスの追加を自動で行いたいので、cloud-config.ymlを作成する
内容はさっきと一緒。

```
#cloud-config
coreos:
  units:
    -
      name: mc-vanilla.service
      enable: true
      command: start
      content: |
        [Unit]
        Description=Minecraft Vanilla Server
        After=docker.service
        Requires=docker.service

        [Service]
        ExecStartPre=-/usr/bin/docker kill mc-vanilla
        ExecStartPre=-/usr/bin/docker rm mc-vanilla
        ExecStart=/usr/bin/docker run -v /data:/data -e VERSION=1.10.2 -e EULA=TRUE -e ENABLE_QUERY=true -e PVP=false -e OPS=管理権限のマイクラユーザID -e WHITELIST=ホワイトリストのマイクラユーザID -p 25565:25565 --name mc-vanilla itzg/minecraft-server
        ExecStop=/usr/bin/docker stop mc-vanilla

        [Install]
        WantedBy=multi-user.target
```

## GCEのインスタンス作成時に、cloud-config.ymlを指定する

gcloudコマンドを実行するマシン上にcloud-config.ymlを置いて、インスタンス作成時に`--metadata-from-file "user-data=＜cloud-config.ymlのファイルパス＞"`を指定する。

ファイルをGCSに置いて指定する方法なないのかしら。。
Stringのswitchがequalsで比較されることの確認

厳密にはhashCodeが先に比較される。

```SwitchSample.java
public class SwitchSample {
    public static void main(String[] args) {
        final String empty = "";
        final String newEmpty = new String("");

        //True
        System.out.println(newEmpty.equals(empty));
        //False
        System.out.println(newEmpty == empty);
        //True
        System.out.println(newEmpty.hashCode() == empty.hashCode());

        switch (newEmpty) {
        case empty:
            System.out.println("一致");
            break;
        default:
            System.out.println("不一致");
            break;
        }
    }
}
```

```console
true
false
true
一致
```

参考
[mi_kami's diary : Java7のswitch文から得られるバイトコードの考察]
(http://mikamikuh.hatenablog.com/entry/2013/07/02/235156)
macvim8 インストール覚書

#1. コンフィグファイルの設定

* vimscriptにてpython3を使えるようにする (python2は使わない)


```terminal:sh
$ ./configure --with-features=huge --enable-rubyinterp --enable-perlinterp --enable-cscope --enable-python3interp --with-python3-command=python3 
```

#2. ビルド

```
make
```

#3. python3が使えることを確認

```
:py3 print("Hello World")
```
gulp-zipを使うとAWS lambda上でのnode moduleの読み込みが出来ない

結論(＊2016/09現時点）
-----

    var zip = require('gulp-zip');
     ....
    .pipe(zip('xxx'))

で圧縮したファイルは、
lambdaのfunctionとして正しく使えなくなるので
gulp-zipのversionは当面3.0.2を使いましょう。

解法
----
~~lambdaにuploadする際は、[gulp-zip]を使わない事。~~

Issueがありました。

https://github.com/sindresorhus/gulp-zip/issues/64

>With 3.0.2 it works fine but with 3.1.0

というわけで、gulp-zip@3.0.2でインストールすれば
何も問題なく読み込まれました。


----

以下経緯は一応残します。

gulpでruntimeで必要な、moduleをzip化するスクリプトを書いてみる

かいつまんでいうと、

    ./dist/production

の下に

1. npm install --production でruntimeのみ"production"フォルダへ  
   (*devDependenciesは不要なので）
1. lambda function(*.js) もコピー
1. "production"フォルダをzip化(zip task)
1. 出来たzipをＡＷＳコンソールからupload(手動）

以下、その為のスクリプト
*upload自体は自動化してません

```gulpfile.js
var gulp = require('gulp');
var zip = require('gulp-zip');
var install = require('gulp-install');
var del = require('del');
var mkdirp = require('mkdirp');

gulp.task('clean', del.bind(null, ['./dist/production',"./dist/upload"]));

gulp.task('modules',["clean","mine"], function() {
  mkdirp('./dist/production', function (err) {
    if (err) console.error(err);
  });

  return gulp.src("./package.json")
    .pipe(gulp.dest('./dist/production'))
    .pipe(install({production: true}));
});

gulp.task('mine', function() {
  return gulp.src([
    './*.js',
    'my/**'
    ],{base : '.'})
  .pipe(gulp.dest('./dist/production'));
});

gulp.task('zip',function() {
  mkdirp('./dist/upload', function (err) {
    if (err) console.error(err);
  });

  return gulp.src([
    './dist/production/**',
  ],{base : './dist/production'})
      .pipe(zip('module.zip'))
      .pipe(gulp.dest('./dist/upload'));
});

gulp.task('default',["clean","modules","mine",], function() {
});

```

#### 結果.

    必要なモジュールが見つかりません。（直訳）のエラーが発生
    *node_modulesのモジュールが見つからないらしい

前述のとおり、AWS lambdaへのUpload時に何らかの問題があって
Upload（又は解凍）時に失敗しているような挙動でした。

*ちなみに、"./dist/production"フォルダの圧縮を
他のアーカイバ（explzh)でZIP化すると
他のnode_moduleを読み込めるところまでは確認できています。。
【備忘録】vagrant1.8.5でvagrant upできない時の対策

##環境

ホストOS:OSX10.11.6
vagrant1.8.5
virtual box 5.1.6

Vagrant1.8.5だと
`vagrant up`した時にエラーを吐く

##対策
下記を弄ります
`/opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb`

エディタで開きます
`vi /opt/vagrant/embedded/gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb`


56行目のここに
` mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
  fi
`
一行追加
` mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
   chmod 0600 ~/.ssh/authorized_keys
  fi
`

これで問題なく動きました
yamahaのルータでDHCPをatarmから移行する。

# 動機

atarm(WR8700N)からNVR700Wへの乗り換え
ついでに、特定のレンジから動的割り当てを始めたい。

# DHCPを使用するための基本的設定
atarm[詳細設定－LAN側設定](http://www.aterm.jp/function/guide13/web-data/type2_s/main/8700/8w_m4.html)

## DHCPサーバー機能有効化

```
dhcp service server
dhcp server rfc2131 compliant except remain-silent
```

「DHCPサーバー機能」のチェックボックスに相当

## アドレス割り当て範囲

```
dhcp scope 1 192.168.100.1-192.168.100.255/24
```
「アドレス割り当てパターン」「割り当て先頭アドレス」「割当数」に相当

# DHCP固定割り当て
atarm[詳細設定－DHCP固定割当設定](http://www.aterm.jp/function/guide13/web-data/type2_s/main/8700/8w_m18.html)

```
dhcp scope bind 1 192.168.100.2 ethernet 00:00:5E:00:53:01
```

# DHCP除外設定
atarm[詳細設定－DHCP除外設定](http://www.aterm.jp/function/guide13/web-data/type2_s/main/8700/8w_m17.html)

アドレス割り当て範囲のオプションでexceptを指定する。
※除外したところに固定割り当ては効かない・・・エラーになる。
空白で区切って複数指定可能

```
dhcp scope 1 192.168.0.1-192.168.100.255/24 except 192.168.100.1-192.168.100.100
```

個人的に以下の理由で固定割り当ての間に入れたくないのでダミーを使って除外。

* exceptの後ろにずらずらと書きたくなかった
* bind増えるときに2カ所直したくなかった

念のため衝突防止にRFCから例示用MACアドレスを使う。

```
dhcp scope bind 1 192.168.100.2 ethernet 00:00:5E:00:53:02
```

# 設定コマンドまとめ

```
dhcp service server
dhcp server rfc2131 compliant except remain-silent
#固定割り当てのみしたい範囲を列挙する。
dhcp scope bind 1 192.168.100.2 ethernet 00:00:5E:00:53:01
dhcp scope bind 1 192.168.100.3 ethernet 00:00:5E:00:53:02
dhcp scope bind 1 192.168.100.4 ethernet 00:00:5E:00:53:03
dhcp scope bind 1 192.168.100.5 ethernet 00:00:5E:00:53:04
dhcp scope bind 1 192.168.100.6 ethernet 00:00:5E:00:53:05
dhcp scope bind 1 192.168.100.7 ethernet 00:00:5E:00:53:06
```

# 失敗した試み
## 固定割り当てだけの後に動的割り当てのbindに回す。

``` fail.txt
dhcp scope lease type 1 bind-only fallback=2
dhcp scope 1 192.168.0.1-192.168.100.255/24 except 192.168.100.1-192.168.100.100
dhcp scope lease type 2 bind-priority
dhcp scope 2 192.168.100.100-192.168.100.255/24
```

## 固定割り当て範囲だけ除外
``` fail2.txt
dhcp scope lease type 1 bind-priority
dhcp scope 1 192.168.0.1-192.168.100.255/24 except 192.168.100.1-192.168.100.100
dhcp scope bind 1 192.168.100.2 ethernet 00:00:5E:00:53:01
```

# 参考先
* [atermの機能詳細ガイド](http://www.aterm.jp/function/guide13/model/wr8700n/n/index.html)
* [YAMAHAルータでDHCP固定IPアドレスの割当 - Qiita](http://qiita.com/tukiyo3/items/320c0f342994c34ee391)
* 例示用MACアドレス -> [rfc7042](https://tools.ietf.org/html/rfc7042#section-2.1.2)
D-Vulkan

D言語でVulkanする件について。
https://github.com/ousttrue/VulkanOnD

![d_triangle.png](https://qiita-image-store.s3.amazonaws.com/0/59664/7f18cfae-b36b-a891-ca2f-46f6bd4011c1.png)

もともとはDでDirectXするつもりであったのだけど、
Vulkanの機が熟したのでやってみた。

ひとつ前に書いた
[Vulkanことはじめ](http://qiita.com/ousttrue/items/2c1179b894ae6ebc1ac2)
のC++をベタにD言語に移植したものです。

[D-Vulkan](https://github.com/ColonelThirtyTwo/dvulkan)
を使った。

環境は Windows10上のDMD + dub + VisualD。
64bitビルドはリンクがいろいろ嵌るので、32bitビルドに妥協。

# D-Vulkanのコード生成
バインディングを手作りしたのかと思ったら、何やらpythonでコード生成している。
辿っていくとkhronosの公式APIがxmlで管理されていて、そこからpythonでCのヘッダやドキュメントを出力するシステムがあった。

* https://www.khronos.org/registry/vulkan/specs/1.0/registry.html#_output_generator_script_span_class_monospaced_generator_py_span
* https://github.com/KhronosGroup/Vulkan-Docs

D-VulkanはこれをベースにしたD言語バインディングの出力スクリプトを作っていた。

```
dvulkan> python.exe vkdgen.py ../Vulkan-Docs/src/spec source/dvulkan 
```

とするとtypes.dとfunction.dが更新される。
dvulkanに手を入れるときはvkdgen.pyに手を入れるとよい。

# D-Vulkanちょっと改造
Cのコールバックにextern(C)を付けるのと、最新のxmlを使うとエクステンションが増えるのでそれを防ぐ処置など。
https://github.com/ousttrue/dvulkan

# Win32Surfaceのバインディング

```D
alias PFN_vkCreateWin32SurfaceKHR
		= extern(C) VkResult function(VkInstance instance,
				const(VkWin32SurfaceCreateInfoKHR)* pCreateInfo
					, const(VkAllocationCallbacks)* pAllocator
						,VkSurfaceKHR* pSurface);
PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;

auto p=vkGetInstanceProcAddr(inst.get(), "vkCreateWin32SurfaceKHR");
vkCreateWin32SurfaceKHR = cast(PFN_vkCreateWin32SurfaceKHR) p;

struct VkWin32SurfaceCreateInfoKHR
{
	VkStructureType sType = VkStructureType.VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
	const(void)* pNext;
	VkFlags flags;
	HINSTANCE hinstance;
	HWND hwnd;
};
```

vkdgen.pyの除外エクステンションからWin32Surfaceを外す手もあったのだけど、モジュールがプラットフォーム固有の型で汚染されるので見送り。アプリ側で手動定義した。

# D-Vulkan使用上の注意

```D
VkInstance inst;
VkResult res = vkCreateInstance(&inst_info, null, &inst);
if (res != VK_SUCCESS) {
	return null;
}
loadInstanceFunctions(inst); // <- これ
```

vkCreateInstanceしたらloadInstanceFunctionsを呼ばないとほとんどの関数が呼べる状態にならない。
呼ばないとnullの関数ポインタをコールしてAccessViolationが出て頭をひねることになるので注意。
他は、Cバージョンとだいたい同じなのでD固有の注意点はない。

# おわり
久しぶりにDを再開したのだが、C++のコードをDに移植するのが楽すぎてびっくりした。
まるで、std::shared_ptrとstd::vectorとstd::stringが内包されたC++のような使い勝手になっている。
自分のC++のスタイルにすごくフィットしている感じで実に快適。
CのAPIに対してポインタを渡す時に、&struct, array.ptr, string.ptrとするだけでできてしまうのでわかりやすい。
C#のDllImportと比べてかなり楽に使える。
localのclass変数にscopeを付けると、structにしなくても寿命がgc管理ではなくscopeアウトまでにできるのもよい。

```D
scope auto uniform_buffer=new BufferResource(device);
```

開発環境にはVisualDを使った。
VisualDのソリューションはdubで生成できる。

```
> dub generate visuald
```

ブレイクポイントを置いてステップ実行することができるので十分使える。
括弧の中で改行したときなどインデントがちょっとキモイ場合があるとか、実行時にエラーが発生すると死亡するときがあるなどまだ開発版な感じがするが使っていく。

CG方面でD言語は有望だと思うので試してみようと思っている。
Slack apps用のボットを作るとっかかり


# botkit
https://github.com/howdyai/botkit
これを使う。本家が推している様子でもあり、ログインさせる仕組みまでちゃんと用意している様子。

# 手順
https://github.com/howdyai/botkit
基本はこれを見ながらやれば大丈夫。

```console
mkdir mybot
cd mybot
npm init # package.jsonを作る
npm install --save botkit
```

これでとりあえず最低限の準備。`index.js`などにこれから色々書く。サンプルとしては下記がとてもシンプルで良いと思う。
https://github.com/howdyai/botkit/blob/master/examples/slackbutton_bot.js

とりあえず全部コピペでもいい。このファイルのコメントに沿って様々な準備をする。

https://api.slack.com/applications/new
に行くとアプリを作るボタンがあるので押す。

ダイアログが出るので入力。

![Kobito.2cwtHg.png](https://qiita-image-store.s3.amazonaws.com/0/3882/1d73c09a-9c9c-2c60-4455-58ac6a0c7e1f.png "Kobito.2cwtHg.png")

`Client ID`と`Client Secret`はアプリを動かすのに必要。自分は`dotenv`でファイルに書いたけど、書かなくてもまぁいいっちゃいいよね。

![Kobito.Ap2Js7.png](https://qiita-image-store.s3.amazonaws.com/0/3882/49eda830-72ac-3312-7758-3b244a3d4b27.png "Kobito.Ap2Js7.png")

![image](https://qiita-image-store.s3.amazonaws.com/0/3882/cbd5670d-9e84-0787-8011-a0f91be53c96.png)

![Kobito.1jlLp6.png](https://qiita-image-store.s3.amazonaws.com/0/3882/fc00b364-04b5-df11-dd26-213afd55dd9a.png "Kobito.1jlLp6.png")

```console
clientId=[Cliend ID]clientSecret=[Cliend Secret] port=3000 node index.js
info: ** Using simple storage. Saving data to ./db_slackbutton_bot/
info: ** Setting up custom handlers for processing Slack messages
info: ** Configuring app as a Slack App!
info: ** Starting webserver on port 3000
info: ** Serving webhook endpoints for Slash commands and outgoing webhooks at: http://MY_HOST:3000/slack/receive
info: ** Serving login URL: http://MY_HOST:3000/login
info: ** Serving oauth return endpoint: http://MY_HOST:3000/oauth
info: ** API CALL: https://slack.com/api/rtm.start
notice: ** BOT ID: l-engine-bot-dev ...attempting to connect to RTM!
notice: RTM websocket opened
** The RTM api just connected!
```

とかで起動。`http://localhost:3000/login` にアクセスしたら、チーム選択画面にリダイレクトされるのでそれで導入できる。導入したいチャンネルで`/invite mybot` とかすれば招待できる（localhostでは/loginいらなかったんだけど、デプロイしたらやはり必要だったので追記した）。

あとは`hello`って発言して何かレスポンスくれば動いているってわかる。

## 雑感
localhostの内容を直接見てくれるのは素敵。サーバーからアクセスできるホストにアップロードする手間がいらなかった。意外だったけど、確かにそれで構わないね。Hubotでコンソールで試すよりもこちらの方が個人的には好き（いつものユーザで試せるのがやりやすいので）。
山根万理奈さんの名前を正しく覚えてもらうためのRubyプログラムを書いた

#このプログラムを書いたきっかけ
僕は，シンガーソングライター山根万理奈さんのファンです．山根万理奈さんはよく名前の漢字を間違えられます．万が真だったり，理が里だったり，奈が菜だったりします．そこで正しく名前を書いてもらうためにはどうしたらよいだろうと考えた結果次のプログラムが生まれました．

#Rubyコード
どちらの漢字が選ばれるかはランダムです．最後まで正しい名前が出力された場合は"Yes!", 途中で間違えた場合は"No!"と出力し，はじめから言い直します．
"Yes!"が出るまで名前を言い続けます．
いわゆる「ズンドコキヨシ」の派生とも考えられます．

````ruby:ma_ri_na.rb
def kiminonaha(c)
	ma=["万", "真"]
	ri=["理", "里"]
	na=["奈", "菜"]
	case 
	when c==0
		x=rand(ma.length)
		puts ma[x]
		x
	when c==1
		x=rand(ri.length)
		puts ri[x]
		x
	when c==2
		x=rand(na.length)
		puts na[x]
		x
	end
end

room=[[1,0],[2,0],[3,0],[nil]]
i=0
until room[i]==[nil]
	if kiminonaha(i)==0
		i=room[i][0]
	else
		puts "No!"
		i=room[i][1]
	end
end
````

#参考にさせてもらったページ
コードの書き方は以下の考え方を参考にさせてもらいました．
[ズンドコキヨシで決定性有限オートマトン (DFA)](http://qiita.com/rotelstift/items/30876e9db9773b0786a9)
rails_adminのadmin権限ユーザーの認証状態を確認する方法

## 結論
```rb
config/initializer/rails_admin.rb

config.authenticate_with do
    warden.authenticate! scope: :admin #←ここ
end
```
なら

```rb
warden.authenticated?(:admin) # boolean

or

current_admin.nil?

#:adminとcurrent_XXXはconfig/initializer/rails_admin.rb(rails_adminでの初期設定)による
```

## 説明
rails_adminを使用していて、「```current_user(一般ユーザのwardenのスコープを:userにしてる場合)```で取れるユーザーではなく、rails_adminで使用しているユーザーで認証したい！」ということがあったので調べました。

rails_admin導入時に`Where do you want to mount rails_admin?`と聞かれて`admin`と答える場合が多いと思うのですが、この時に答えた値がrails_adminで使用するwardenスコープとして登録されます。
そして

```rb
config/initializer/rails_admin.rb

config.authenticate_with do
    warden.authenticate! scope: :admin
end
```
この部分でrails_adminではこのスコープを使用しますよーと設定されているので、あとはこのスコープで認証されているかをチェックすれば良いのですね！

##参考
https://github.com/hassox/warden/wiki/Scopes
http://tagamidaiki.com/introduce-rails-admin-to-rails4/
Slackのemojiを別のTeamに引っ越しするスクリプトをRubyで作ってみた

2019/07/07追記 結構前からSlackの仕様が変更されて動作しない状態となっております m(_ _)m

（2016/09/21追記 ログと注意書きの記載がなかったため追記）

#はじめに
チームでSlackを使用していると、色々なemojiが増えていきますよね？
普段からemojiを使っている方ほど、別のチームを作成した時に「あのemojiが使いたいけど登録されてない」というような、残念な思いをしているのではないでしょうか。
現時点（2016年9月）は特に引っ越しする機能も用意されていないため、手作業で登録するしかないですね。
しかし、大量のemojiを一つ一つちまちまと登録し直すのはとても面倒くさい・・・。
そこで、emojiを引っ越しする作業をRuby+Mechanizeで自動化しました。
このスクリプトがあれば、100個以上emojiを登録していても大丈夫!

※既に幾つかemojiをアップロードするスクリプトはネットで見つかりましたが、どれも環境作成でつまづいたため、なるべくシンプルなスクリプトを目指して作成しました。

#ソースについて
こちらにアップロードしました。
[slack_emoji_mover](https://github.com/from-unknown/slack_emoji_mover "slack_emoji_mover")
まだrubyはあまり詳しくないため、ご指摘等ありましたらよろしくお願いします。
また、READMEやコメントが充実していないので、いずれ直します・・・。

#環境について
スクリプトが動作するためには下記が必要ですので、インストールしてください。
WindowsとMac OS（Linuxは未テストです）で動作するはずですが、うまくいかない場合はコメントお願いします。

+ Ruby 2.2.2以上（Mechanizeが1.9.2以上なので、1.9.2以上で動作するかもしれないです）
+ nokogiri (Ruby gem)
+ mechanize (Ruby gem)
+ open-uri-s3 (Ruby gem)

Ruby gemと書かれているものに関しては、`gem install ~`でインストールしてください。

#使用方法について
環境のセットアップが済んだら、emoji_conf.txtに必要な情報を記入してください。
**引っ越し先の情報**

+ Slack team URL
+ メールアドレス
+ パスワード

**引っ越し元の情報**

+ token

tokenはbot等で既に使用している場合はそちらでも大丈夫ですが、ない場合は生成する必要があります。
以下のurlから引っ越し元のSlackのteamのtokenを生成してください。
[Test token generator](https://api.slack.com/docs/oauth-test-tokens "oath-test-tokens")
tokenの生成方法については、下記記事で詳しく書かれていました。
[ロードバランスすだちくん Slackの絵文字、他社のも見たいよね](https://blog.animereview.jp/slack-emoji-matrix/ "Slackの絵文字、他社のも見たいよね")

なお、tokenを使うことで様々な事が出来てしまうため、**くれぐれも他人に教えたりはしないでください。**

全て記入できたらcmdやターミナルでフォルダまで移動し、import_emoji.rbを実行してください。

`ruby import_emoji.rb`

あとは待つだけでemojiがアップロードされていきます。

結果はemoji_log.txtに、emoji一つ一つに対して結果が記載されています。
アップロードに成功している場合は
`Successfully added.`
失敗した場合は
・名前が被っている場合は
`Same emoji name already exist.`
・それ以外のエラーは
`Unknown error occured.`
と出力されるので実行後に確認してください。

注意：

+ 引っ越し元のemojiの画像はスクリプトと同じフォルダ内にダウンロードされます。
+ 画像のダウンロードやアップロードは、サーバーに負担をかけない様に一回毎に3秒のsleepを挟んでいるので気長にお待ちください。

#仕組みについて
引っ越し元のemojiの取得については、以下のurlからJSONで情報が取得できるため、そちらを利用しました。
https://slack.com/api/emoji.list?pretty=1&token=
上記urlのtokenのパラメーターに使用方法で記載したtokenを入れることで、登録しているemojiのリストが返ってきます。
そちらのJSONからデフォルトの絵文字を除き、全ての画像ファイルをダウンロードします。
取得したJSONはemoji.txtというファイルでスクリプトと同じフォルダにダウンロードされます。

取得したemojiの登録についてですが、残念ながら現在Slackのemojiを登録するAPIはありません。
そのため、emojiを登録するためには通常通りにWebから登録します。
ざっくり書くと以下の様な作業を自動化します。

1. SlackのTeamにログインする
2. Webページにemojiの情報を記入する
3. 「Save New Emoji」のボタンを押す
4. アップロードが完了していない場合、2.に戻る

今回はRuby+Mechanizeで上記作業を自動化しました。
このスクリプトのプロトタイプは思っていたよりも簡単に出来ました。
Mechanize様々ですね。

#最後に
今回作成したスクリプトの解説は、別の記事で書きたいと思っています。
今回のスクリプトを応用して、新しいemojiを簡単に登録するスクリプトも作成していますので、そちらについても記事に書ければと思っています。

分かりにくいところなどありましたら、コメントよろしくお願いいたします。

それでは、よいSlackライフを！
MyBatis 3.4.2からMapperインタフェースでdefaultメソッドが使えるようになるよ！

（まだリリースされてませんが）MyBatis 3.4.2からJava SE 8からサポートされたdefaultメソッドが利用できるようになります。いろいろな使い方があると思いますが、ここでは、Spring DataのAPIを利用したページ検索メソッドの実装例を紹介します。自分はMapperインタフェースをRepositoryインタフェースとして代用することがあるので、この仕組みはちょっと嬉しいです。

```java
import com.example.domain.Todo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.session.RowBounds;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;

import java.util.Collections;
import java.util.List;

@Mapper
public interface TodoRepository {

    @Select("SELECT COUNT(id) FROM todo")
    long count();

    @Select("SELECT id, title, details, finished FROM todo ORDER BY id")
    List<Todo> findRangeList(RowBounds rowBounds);

    // ↓ defaultメソッドを使ってSpring DataのAPIを利用したページ検索メソッドを実装してみると・・・
    default Page<Todo> findPage(Pageable pageable){
        long total = count();
        List<Todo> list = Collections.emptyList();
        if (total > 0) {
            list = findRangeList(new RowBounds(pageable.getOffset(), pageable.getPageSize()));
        }
        return new PageImpl<>(list, pageable, total);
    }

}
```

```xml:SNAPSHOTバージョンを使うためのpom.xmlの定義例
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.2-SNAPSHOT</version>
    </dependency>
    <!-- ... -->
</dependencies>
<repositories>
    <repository>
        <id>sonatype-oss-snapshots</id>
        <name>Sonatype OSS Snapshots Repository</name>
        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </repository>
</repositories>
```

今回は簡単な紹介でしたが、MyBatis 3.4.2が正式にリリースされたら、ちゃんとまとめたいと思います。
Google マップを iOS アプリに追加するサンプルプログラムの実行方法

(1)Mac PCを準備（買う、あるいは持っている人から譲ってもらう、その場合はお礼を忘れずに）

(2)Google Maps API > iOS向け > Maps SDK for iOS
https://developers.google.com/…/docum…/ios-sdk/code-samples…

(3)ホーム、ガイド、リファレンスにざっと目を通す

(4)Xcodeプロジェクトを作成
 →create a new xcode project→single view application→product name→objective-c
と進む

(5)Xcodeプロジェクトを一旦閉じる（終了）

(6)(2)のサンプルをクリック（ここにすべての解説がある）
 ・CocoaPods* ツールを持っていない場合は、ターミナルから以下のコマンドを実行して、OS X 上に CocoaPods ツールをインストール
 （ERROR: Error installing cocoapods:activesupport requires Ruby version >= 2.2.2.）が出る場合は、http://qiita.com/shinog/items/d2de491276d86a08aedf
 を参照する

*CocoaPodsでGitHubなどからライブラリ取ってきて、プロジェクトに自動で設定できる

・ターミナル ウィンドウを開いて、以下のコマンドを実行 
 $ pod try GoogleMaps

以下、サンプルの説明に従うが、googleのAPI キー（無料）を取得する必要がある


ついでに、
*** Finderからシステムファイルを見る方法 ***

Finder⇨（メニューの）移動⇨フォルダへ移動⇨フォルダの場所を入力するフォームに、/private/var/folders/hb/・・・/T/CocoaPods/Try/GoogleMaps/Example
を入力⇨移動ボタンを押下

これで、通常は見えないシステムファイルにアクセスできます

もちろん、コマンドラインでもアクセスできますが、こっちの方が簡単です
VirtualBox上でブリッジ接続しているLinuxのIPアドレスを固定にしよう


# 目的
VirtualBox を使って CentOS を動かしているが
起動するたびにIPアドレスが変わってしまってイライラする！
というわけでアドレスを固定にした際のメモ。


# 環境
ホストOS は Mac
VirtualBox は Version 5.0.4
ゲストOS は CentOS 7.1
ネットワークはブリッジ接続を使用
試した時期は 2016年の9月


# 事前にやっておくこと
### デバイスの確認
まずはこのコマンドで デバイス を確認しよう。

``` 
$ ifconfig
enp0s3: 略
```

ブリッジ接続なので、デバイスは enp0s3 を使用しているようだ。


### default gateway の確認

もう一つ、このコマンドで default gateway のアドレスをチェックしておこう。

```
$ route
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.0.1     0.0.0.0         UG    100    0        0 enp0s3
略
```

192.168.0.1 のようだ。


### 忘れちゃいけない NetworkManager

NetworkManager 、その名の通りネットワーク周りをアレコレしてくれるサービス。
(GUI の時に使われるイメージだけど、CUI でもしっかり機能するんだろうか)

今回の手順ではこれが動いていると失敗するので、停止しておく。
サービスを停止するだけではなく、OS起動時の自動起動設定も無効にしておこう。

```
# 状態を確認
systemctl status NetworkManager.service

# サービスの停止
systemctl stop NetworkManager.service

# 自動起動設定の無効化
systemctl disable NetworkManager.service
```


### 備忘メモ：chkconfigはもう使えない
NetworkManager 停止時、
chkconfig コマンドを使ったら「systemctl を使え！」と怒られてしまった。
そうか、サービス周りはごっそり変わったんだった。
その際の注記はコレ。

```
注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
      systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
      systemd サービスを一覧表示するには 'systemctl list-unit-files' を使用してください。
      特定のターゲットにおいて有効化されているサービスを確認するには、
      'systemctl list-dependencies [target]' 。
```




# ネットワーク設定
### 現在の設定をバックアップしておこう
ネットワーク周りは失敗すると後が大変・・・なので、
今の設定はバックアップを残しておくことをオススメする。
設定ファイルはこれだ。

```
/etc/sysconfig/network-scripts/ifcfg-enp0s3
```

### 設定を書き込む
バックアップが済んだら、IPアドレスを固定にするための情報を書き込もう。

``` /etc/sysconfig/network-scripts/ifcfg-enp0s3
BOOTPROTO=none
IPADDR=xxx.xxx.xxx.xxx ← 固定にするIPアドレス
NETMASK=255.255.255.0
GATEWAY=xxx.xxx.xxx.xxx ← 先ほど確認した default gateway のIPアドレス
NAME=enp0s3
DEVICE=enp0s3
TYPE=Ethernet
```

### ネットワークの再起動
以下のコマンドでネットワークサービスを再起動することで、設定が有効になる。

```
systemctl restart network.service
```

コマンドが失敗する場合は、まずは設定内容が間違っていないかよく確認すること。
設定内容が間違っていない場合…
そもそも設定方法が間違っている可能性があるため、その時は書籍やgoogle先生に頼ろう。


# 感想
ifcfg-xxx の設定ファイルを書き込むだけでうまくいってしまった。
昔はかなり苦労していた気がするが…
OSのバージョンアップで、易しくなったということだろうか。
pugでmarkdownをincludeする

# pugでmarkdownをincludeする

色々あってpugという便利そうなものに出会ったがpugに関する情報は少なく、pugの以前の名前のjadeの情報ばかり。。。
しかも、jadeからいくつか仕様変更されていて困っていた。一応、なんとなく解決方法がわかったのでメモ。

## pugで.mdファイルをhtml形式に変換してincludeしたい

moduleがいくつかあるみたいなのだが、Google検索で引っかかったものの多くは使えなかった。
自分が試してうまくいったものを書いておく。
環境はwindows10のPowershellで適当にインストールしたnode.jsとpug(pugやらnodeやらのインストールに関しては[ここ(【Pug】ゴリラでもわかるJade改めPug入門)](http://blog.mismithportfolio.com/web/20160326pugbegin)参照)

まずmarkdownを翻訳するためのmoduleをインストールします。

```
npm install --save jstransformer-markdown-it
```

でmoduleをインストール。
そのあとindex.pugファイルには

```
include:markdown-it hoge.md
```

と書いて、ターミナル上で

```
pug index.pug --pretty
```

でhoge.mdがエラーになることなくinclude出来た。
多分pugで使うfilterの類はほとんどjstransformerに入ってる。


## あとがき

Qiitaもpugも初めてなので多少は大目に見てください。何かあれば適当に追記していきます。
ASUS Vivobook E200HA にLinux(Korora)を入れる

### まえがき
---
ポップで万能なlinuxのディストリビューションであるKororaをE200HAに単純に入れただけでは様々な不具合が出ました。
その時の対処法を備忘録としてここに記します。

### 初期設定(@Korora)
---

- インストール直後に行ったこと
	- yumでのアップデート
	- システム > 設定 > ハードウェア > キーボード > レイアウト
		- ASUSのキー配列を指定すると、キーボードがすべて使えるようになる
	- FireFoxのアドオンを切ると速度を維持できる
	- SELinuxの無効化
	- サムネ追加
	- vimrcの編集
	- 
	```
		set number▸ ▸   ▸   ▸   " 行番号を表示する↲
        set cursorline▸ ▸   ▸   " カーソル行の背景色を変える↲
		set showmatch▸  ▸   ▸   " 対応する括弧を強調表示↲
		set helpheight=999▸ ▸   " ヘルプを画面いっぱいに開く↲
		set list▸   ▸   ▸   ▸   " 不可視文字を表示↲
		set listchars=tab:▸\ ,eol:↲,extends:❯,precedes:❮↲
		set hlsearch▸   ▸   ▸   " 検索文字列をハイライトする↲
		set incsearch▸  ▸   ▸   " インクリメンタルサーチを行う↲
		set ignorecase▸ ▸   ▸   " 大文字と小文字を区別しない↲
		set smartcase▸  ▸   ▸   " 大文字と小文字が混在した言葉で検索を行った場合に限り、大文字と小文字を区別する↲
		set wrapscan▸   ▸   ▸   " 最後尾まで検索を終えたら次の検索で先頭に移る↲
		set gdefault▸   ▸   ▸   " 置換の時 g オプションをデフォルトで有効にする↲
		set tabstop=4▸  ▸   ▸   " 画面上でタブ文字が占める幅↲
		set shiftwidth=4▸   ▸   " 自動インデントでずれる幅↲
		set autoindent▸ ▸   ▸   " 改行時に前の行のインデントを継続する↲                 
		set scrolloff=4▸▸   ▸   " 上下8行の視界を確保↲
		```
	
- .ssh/configの編集
	- サスペンドは可能
		- ただし、いきなり閉じてはダメ

- インストールしたソフト
	- Atom
	- DropBox
	- コンソール(Terminator)
	- LINE
	- クローム
	- Mozc(`sudo yum install ibus-mozc`)
	- フラッシュプラグインのインストール(yumインストール)

- その他
	- bluetoothはバグにより、電源が落ちると復帰できない
		- `sudo service bluetooth restart`で復帰できる
	- zshの[導入](http://easyramble.com/change-shell-from-bash-to-zsh.html)
		- [追加](http://qiita.com/abgata20000/items/992fb14686221c326abe)
		- [対処](http://qiita.com/taskie/items/9e265df3781bcb791b07)
		- [設定ファイル](https://gist.github.com/mollifier/4979906)


###あとがき
---
- 既知の未解決問題
    - 音が出ない
    - SDスロットを認識しない

ココらへんはドライバーの問題もありそうだし、どうしようもないかな…

ブログ始めました、よかったら遊びに来てください
https://red-full-moon.com/
二項分布とPoisson分布



# 二項分布
基本的な事は、[前記事-β分布-](http://qiita.com/kilometer/items/3780f172bd314e934281)をご参照ください。

二項分布(Binomial distribution)は、コイン投げの結果を表す確率分布でした。


μ: 1回の試行でコインの表が出る確率`0≤μ≤1`
N: 試行回数(自然数)
k: (N回の試行のうち)表が出た回数
として、kの確率分布は、

```math
p(k|N,μ)={}_NC_kμ^k(1-μ)^{(N-k)}\equiv Bin(k|N,μ)
```

このkの期待値は、1回ごとの表確率μとその回数Nの積なので、

```math
\mathbb{E}[Bin(k|N,μ)]=Nμ
```

# 無限の試行

試行回数Nを無限に吹っ飛ばします。

```math
\begin{eqnarray}
\lim_{N \to \infty} Bin(k|N,μ)&=&\lim_{N \to \infty} {}_NC_kμ^k(1-μ)^{(N-k)} \\
\end{eqnarray}
```
を考えるわけですが、この無限回試行の結果表が出る回数の期待値を`λ`と置きます。

```math
\mathbb{E}\big[\lim_{N \to \infty} Bin(k|N,μ)\big]=\lim_{N \to \infty}Nμ=λ
```

さて、無限回数に吹っ飛ばす事を前提に、少し二項分布の式を書き直します。

```math
\begin{eqnarray}
{}_NC_kμ^k(1-μ)^{(N-k)} &=&\frac{N!}{(N-k)!k!}μ^k(1-μ)^{(N-k)} \\
&=& \frac{N(N-1)...(N-k+1)}{k!} μ^k(1-μ)^{(N-k)} \\
&=& \big( N(N-1)...(N-k+1)μ^k \big)  \frac{1}{k!} (1-μ)^{(N-k)} \\
&=& \Big( \frac{N}{N} \frac{(N-1)}{N}...\frac{(N-k+1)}{N}(Nμ)^k \Big)  \frac{1}{k!} (1-μ)^{(N-k)} \\
&=& \Big(1-\frac{0}{N}\Big)\Big(1-\frac{1}{N}\Big)...\Big(1-\frac{k-1}{N} \Big) (Nμ)^k\frac{1}{k!} (1-μ)^{(N-k)} \\
\end{eqnarray}
```

積和部分は、Nを無限に飛ばすと1ですね。

```math
\begin{eqnarray}
\lim_{N \to \infty} Bin(k|N,μ)
&=&\lim_{N \to \infty} \Big(1-\frac{0}{N}\Big)\Big(1-\frac{1}{N}\Big)...\Big(1-\frac{k-1}{N} \Big) (Nμ)^k\frac{1}{k!} (1-μ)^{(N-k)} \\
&=&\lim_{N \to \infty}  (Nμ)^k\frac{1}{k!} (1-μ)^{(N-k)} \\
&=&\frac{λ^k}{k!}\lim_{N \to \infty} (1-μ)^{(N-k)} \\
&=&\frac{λ^k}{k!}\lim_{N \to \infty} \frac{(1-μ)^N}{(1-μ)^k} \\

\end{eqnarray}
```

`λ`の定義より、

```math
μ=\frac{λ}{\lim_{N \to \infty}N}
```
すなわち、

```math
\begin{eqnarray}
\lim_{N \to \infty} Bin(k|N,μ)
&=&\frac{λ^k}{k!}\lim_{N \to \infty} \frac{(1-μ)^N}{(1-μ)^k} \\
&=&\frac{λ^k}{k!}\lim_{N \to \infty} \frac{(1-\frac{λ}{N})^N}{(1-\frac{λ}{N})^k} \\
\end{eqnarray}
```
分母は1になりますね。
また、

```math
e^x=\lim_{n \to \infty}\Big(1+\frac{x}{n}\Big)^n
```
より、

```math
\begin{eqnarray}
\lim_{N \to \infty} Bin(k|N,μ)
&=&\frac{λ^k}{k!}\lim_{N \to \infty} \Big(1-\frac{λ}{N}\Big)^N\\
&=&\frac{λ^k}{k!}e^{-λ} \equiv Po(k|λ)
\end{eqnarray}
```

これをポアソン分布(Poisson distribution)と呼びます。

# Poisson分布とは

これなんぞ、というと、無限回投げた時にλ回の表が出るコインを`hoge`回投げた時に出る表の回数kの確率分布、ですよね。

で、コインの性質を支配する`μ`の性質はどうなってるかというと、
無限回投げてもたったλ回しか表が出ないコインでして、

```math
μ=\frac{λ}{\lim_{N \to \infty}N}
```

ですので、ま、ハッキリ言えば`μ`すなわち「1回の試行で表が出る確率」が**チョー小さい**コインについて考えている、という事です。

# ん？？

問題は、「コインを`hoge`回投げた時に出る表の回数kの確率分布」の`hoge`ってなんぞ、という事です。

これは、特定の期待値を達成する所与のNに対して、`hoge`回という意味です。

ポアソン分布とは、「一定の(空間and/or時間)間隔で発生するイベント」を想定していて、その中で「**稀に生じる**離散的事象」の発生回数の確率分布です、という事。

「稀に生じる」というのがミソで、その稀さ加減：λ=Nμ=1になる「単位N=hoge」が分かっていれば、2N回の試行では「λ=2*hoge」のポアソン分布に従う、と言っているわけです。

例えば100回に1回表が出る事が期待されるコイン(`μ=0.01`)を、1000回投げた時に表が出る回数kの分布は、

```math
p(k|N,μ)=Bin(k|1000,0.01)={}_{1000}C_k(0.01)^k(0.99)^{(1-k)}
```

ですが、μを十分小さいとみなすと、

```math
p(k|λ=Nμ)=Po(k|0.01*1000)=Po(k|λ=10)=\frac{10^k}{k!}e^{-10} 
```

と表現できるという事です。

こちらの方が計算上有利な時があるので、そんな時はポアソン分布を使ってあげましょう。
【Swift】Cocoapods install setup終わらない問題

# pod setup <- 終わらない
タイトルの通りです。なかなか時間を取られた問題だったので、メモしておきます。同じエラーになった方へ参考になれば幸いです。

```bash:zsh
$ pod setup --verbose

Setting up CocoaPods master repo
Cloning spec repo `master` from `https://github.com/CocoaPods/Specs.git` (branch `master`)
  $ /usr/bin/git clone https://github.com/CocoaPods/Specs.git master
  Cloning into 'master'...
```

上記のような感じで永遠に終わらないという事件が発生した。

## 試行1

```bash:zsh
$ pod repo remove master
$ pod setup
$ pod install
```

ググるrepoがおかしいので、消せばいけるよ！と外人さんが言っていたので、やってみたが、成功しない。

## 試行2

```bash:zsh
$ sudo gem uninstall cocoapods
$ sudo gem install -n /usr/local/bin cocoapods
$ pod setup
$ pod install
```

そもそも、cocoapodsを入れな直せばいけるんじゃね。
余裕で失敗する。

## 試行3

どうやら、gitから落としてくる段階で異常に時間がかかっている現象をどうにかしないといけないらしく。git cloneを直接することにした。

```bash:zsh
$ cd ~/.cocoapods/repos
$ rm -rf master
$ git config --global http.postBuffer 524288000
$ git clone https://github.com/CocoaPods/Specs.git master
$ pod setup
```

かなりごり押しだが、これですんなり成功した。