OmniAICreator/Qiita-1.07M huggingface dataset:
OpenSSLでファイルの暗号化・復号化するための備忘録

# はじめに

opensslコマンドは以下の３つの分類されています。
`Cipher command`を使ってファイルの暗号化・復号をやります。

* Standard commands
* Message Digest commands
* Cipher command

# 基本的な使い方

`enc`サブコマンドを使って暗号化・復号します。

入力ファイルを暗号化・復号し出力ファイルに出したいケースが多いと思いますが、その場合はそれぞれ`-in`,`-out`にファイルパスを渡してあげます。

暗号化の場合、`-e`を復号の場合は`-d`をつけます。

```
// 暗号化
$ openssl enc -e <CipherType> -in <InputFile>  -out <OutputFile>
// 復号
$ openssl enc -d <CipherType> -in <InputFile>  -out <OutputFile>
```

また、CipherType（`aes-256-cbc`など）を以下のようにサブコマンドの位置に書いても暗号化・復号してくれるみたいです。

```
$ openssl aes-256-cbc -e -in <InputFile> -out <OutputFile>
$ openssl aes-256-cbc -d -in <InputFile> -out <OutputFile>
```

# パスワードの指定方法

| タイプ            |                   |
|:-----------------|-------------------|
| stdin            | 標準入力から指定     |
| pass             | コマンドラインで指定  |
| file             | ファイルから指定     |
| env              | 環境変数から指定     |
| fd               | ファイルディスクリプタから指定 |

* コマンドラインからパスワードを指定する場合

```
$ openssl aes-256-cbc -e -in in_sample.txt -out out_sample.txt -pass pass:hoge
```

* ファイルからパスワードを指定する場合

```
$ openssl aes-256-cbc -e -in in_sample.txt -out out_sample.txt -pass file:./password.txt
```

# 参考

http://qiita.com/takuyaWt/items/300cbb0570814b521732

http://takuya-1st.hatenablog.jp/entry/2015/12/09/174928
【Ethereum入門】Ethereum+Meteorで分散アプリケーションを作ろう(Windows 10)

# 目的
初心者向けにEthereum+Meteorの分散アプリケーションを作るまでの流れを紹介します。
大変素晴らしい[Ethereum入門](http://book.ethereum-jp.net/)の外部サイトがあるので、本記事はそれを補完するぐらいの感じで見て頂ければと思います。
本記事のコマンドは、Windows 10にて実行確認しました。

# 必要なソフトウェア
・chocolatey
・Geth
・Meteor

### chocolateyのインストール
[公式サイト](https://chocolatey.org/install)にてインストーラーを実行します。
使い方は、こちらの[記事](http://qiita.com/konta220/items/95b40b4647a737cb51aa)が参考になります。

### Gethのインストール
[公式の手順](https://github.com/ethereum/go-ethereum/wiki/Installation-instructions-for-Windows)に従いchocolateyを使ってGethをインストールします。
まず、管理者権限でコマンドプロンプトを開き、git、golang、mingwをインストールします。

```sh
cinst -y git
cinst -y golang
cinst -y mingw
```

goの環境変数を設定します。
GOPATH=%USERPROFILE%
Path=%USERPROFILE%\bin

go-ehereumのソースコードをgitから入手します。

```sh
git clone https://github.com/ethereum/go-ethereum src\github.com\ethereum\go-ethereum
cd src\github.com\ethereum\go-ethereum
go install -v ./...
```

インストールが完了すれば、gethの実行ファイルが作成されます。

```sh
geth -h
```

### Meteorのインストール
[公式サイト](https://www.meteor.com/install)からMeteorのWindows版をインストールします。
chocolatey同様、Meteorも公式サイトにてインストーラーを実行します。

```sh
mkdir meteor-proj
meteor create simple-ether-wallet

cd simple-ether-wallet
meteor npm install
meteor
```

# テスト環境構築
Ethereum入門にある[ethereumのプライベート・ネットに接続する](http://book.ethereum-jp.net/first_use/connect_to_private_net.html)から、[meteorを用いた分散アプリケーション開発](http://book.ethereum-jp.net/meteor_dapp/simple_ether_wallet_3.html)まで読み進めていけば、特に問題なくブラウザでプライベート・ネットでの採掘状況をモニタリングできるようになると思います。
本項では上記の手順を進めている最中で、役立ちそうなコマンドをTIPSにしました。

### TIPS

- miner.start()で引数を指定しないと、cpuの全スレッドを使用して採掘し始めてしまい、他の動作が重くなるので、必要な分のスレッド数を指定すると良いと思います。

gethのコンソールから採掘を開始する場合、

> miner.start(1)

cmdから採掘を開始する場合、

> --minerthreads value    Number of CPU threads to use for mining (default: 4)

- gethの立ち上げを毎度cmdから叩くのも面倒なので、シェルを作っておくと良いです。

```pswd.txt
[password]
```

```geth.sh
start geth --password "pswd.txt" --networkid "10" --nodiscover --datadir "." --mine --minerthreads 1 --unlock 0 --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" 2>> geth_err.log
```

```sh
bash geth.sh
```

# 更なるステップアップ
本記事で取り上げた[simple-ether-wallet](https://github.com/a-mitani/simple-ether-wallet)の他にも、[meteor-boilerplate](https://github.com/Differential/meteor-boilerplate)や[meteor-dapp-cosmo](https://forum.ethereum.org/discussion/2062/meteor-dapp-cosmo-a-realtime-solidity-development-environment)といったmeteorを使った分散アプリケーションがgitで公開されています。
アプリケーション開発向上のため、上記リンクからDLしてきて、ご自身のPCブラウザ上で表示させてみると良いかと思います。

### Ethereum Community Forum
[Ethereum Community Forum](https://forum.ethereum.org/categories/services-and-decentralized-applications)という次世代のスマートコントラクトな分散アプリケーション開発者のためのフォーラムが提供されています。
新規アプリ開発のアイデア探しや、GethやMeteorの仕様を調べる際などに役立つと思います。
Google Authenticatorを使ってCentOSでOTP認証

これは[マイネットエンターテイメント Advent Calendar](http://qiita.com/advent-calendar/2016/mynet) 11日目の記事です。

自宅に外出先から繋がるSSHサーバがあると色々と便利ですよね。
ただ、サーバに限らず文字列を用いた認証は「パスワードを入力する」というリスクがありますので、
今回はGoogle Authenticatorを利用してOTP認証ができる環境を作ってみます。

~~そんなことより非接触式の生体認証の一般化はよ~~

# 必要なもの

* 公開鍵認証でログインできるSSHサーバ（今回はCentOS 7.2で）
* OTPトークン端末
 * 要はスマホ、AndroidでもiOSでもOK
 * Google Authenticator自体がOSSなのでGoogle純正ではないもののWin10Mobile版もある、らしい

# サーバ側の作業

## ビルドするために色々導入

```
yum -y groupinstall "Development Tools"
yum install pam-devel
```

## GitHubからソースを持ってきてコンパイル＆インストール

```
git clone https://github.com/google/google-authenticator-libpam.git
cd google-authenticator-libpam
./bootstrap.sh
./configure
sudo make && make install
```

## sshdの設定を変更

`sudo cp /usr/local/lib/security/pam_google_authenticator.so /usr/lib64/security/`

### /etc/ssh/sshd_config を編集
変更
`ChallengeResponseAuthentication no → yes`
追加
`AuthenticationMethods publickey,keyboard-interactive`

念のため設定ファイルが正しいかテストしておきます。
`sshd -t`

### sshd再起動

`systemctl restart sshd`

## PAM設定ファイルの作成

### /etc/pam.d/google-auth を新規作成
```
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_google_authenticator.so try_first_pass
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so
```

### /etc/pam.d/sshd を編集

追加
`auth       substack     google-auth`
コメントアウト
`auth    substack      password-auth`

# OTPトークン端末側の作業

* iOS: https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8
* Android: https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja

上記アプリをインストールします。
Google Authenticatorと互換性を持つアプリであれば他でもOKです。
有名なトコだとIIJがIIJ SmartKeyというアプリを出していたり。

## サーバ側で認証情報を登録・表示する

以下のコマンドをサーバで叩きます
`google-authenticator`

色々聞かれますがとりあえず「y」でOKです。
最後にQRコードが表示されます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/150553/c2801056-1534-c8f9-5df3-a11c08c56c8d.png)
※↑は記事作成時に適当に作った認証情報です、スキャンするとOTPが生成できますが、そもそも認証するサーバが既に存在しないので使い道はありません。

## スマホに登録する

Google公式なら右下の「＋」から、他の互換アプリでも特に悩むことは無い位置に追加ボタンがあると思います。
カメラが起動するので、↑で表示されたQRコードを撮影しましょう。

1分ごとに更新される6桁の数字が今回作った環境のワンタイムパスワードになります。
サーバに接続しようとすると「Verification code」を聞かれるので、アプリ上で表示される数字を入力すれば認証成功するはずです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/150553/f150361e-ae4c-c596-f558-dc5c3b666cb8.png)

# 今更な余談

sshdのバージョンは6.2から追加されたAuthenticationMethodsに対応している必要があります。
なので、CentOS6のデフォルト（5.3？）だと使うことができません。

…まぁ、sshdなんてセキュリティ関係の更新も度々出てますし、基本的には最新にしておくべきだと思うのですが。
性能試験おコンテナ

# 性能試験おコンテナ

この記事は[mediba Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mediba)の11日目です。

## はじめに

medibaでは、auブランドのポータルサービスを開発、提供するプロジェクトが多く、WEBサービスの性能は秒間リクエスト(または秒間トランザクション)数を基本単位に厳しくチェックしています。
私が担当するプロジェクトでも性能に対して標準以上のレベルを求められることが多く、性能試験を肴にお酒が飲めたりします(実話)。
今回は、担当プロジェクトで利用している性能試験ツールの一部をパプリックなコードベースとして公開しましたので、ご査収ください。

## gatling-ocontainer

[mediba-kitada/gatling-ocontainer](https://github.com/mediba-Kitada/gatling-ocontainer)

- リポジトリ名の通り、[Gatling](http://gatling.io)をコンテナ(Docker)で稼働させるコードベースです。
- 導入、利用方法はREADMEをご確認ください。
- ツッコミや不具合等がございましたら、Pull Requestにてご連絡ください。

## おわりに

WEB屋としましては、ひとりでも多くのユーザに自分の書いたコードが(で)配信されることは、本望かと思います。
auブランドのポータルサービスは、日々多くのユーザに利用して頂けるので、困難もありますが、WEB屋としての本望をとげることが出来ると思います。
性能試験について、今後の展望としましては

- Docker対応のCIサービスで継続的性能試験を実施する
    - -> 改修単位で性能試験を実施することにより、サービス品質リスクを管理
- 継続的性能試験のレポートをGatlingのイケてるHTMLファイルで自動配信
    - -> 関係者全員で性能試験レポートを共有し、サービス品質向上

を計画しておりますが、師走ですね...  
お手伝い頂ける方は、ぜひ[medibaエンジニア採用ページ](http://www.mediba.jp/recruit/career/joblist.html#engineer)からご連絡ください。

明日は、[菅原さん](http://qiita.com/h-sugawara)です。よろしくおねがいします。
lambda + kintone でchatworkへメッセージのみ送信できるようにしてログを残す

※この記事は「AltPlus Advent Calendar 2016」の11日目の記事です。

こんにちわ、 id:thashimotoです。

社内共通で使用できる メッセージ通知用のbotをchatworkで設定しようとしたのですが
chatworkでは、アカウント毎にAPIトークンが発行されるため
APIトークンを社内で公開してしまうと、bot用アカウントの入っているチャットルームの情報へは
アクセスができてしまうので、それを回避するため下記要件で設定したときのログになります。

 - 監査用ログ取得、実行できるAPIの制限(メッセージ通知のみ)、chatworkAPIトークンを展開しない

設定中、引っかかったところなどを書きたいと思います。


# 構成
  - APIGateway
  - lambda
  - kintone 
  - ![image](https://qiita-image-store.s3.amazonaws.com/0/16117/672c1b6d-bfe8-815e-c944-7e171a9cd3b0.png)


# APIGateway
  - chatworkのAPIトークンをそのまま配布してしまうと、chatworkのAPIがすべて使用できてしまうため
    今回は、メッセージ通知のみできればよかったので、 APIGatewayの APIキーを使用して認証の対応を行いました。
  - 本文マッピングテンプレートは下記の形で設定、始め仕組みを理解していなかったためこの辺りの lambda側での受け取り方で引っかかっていました。
  
```
# Content-Type : application/json
{
    "room_id" : $input.json('$.room_id'),
    "body" : $input.json('$.body'),
    "sourceIp" : "$context.identity.sourceIp"
}
```

  - lambda側値受け取り

```
    option = "body="+str(event['body'])
    room_id = str(event['room_id'])
    sourceIp = str(event['sourceIp'])
```

# lambda
  - 言語は pythonを使用したのですが 使ったことがなく curlの使いかたがすぐはわからなかったのですが
  最終的に pycurlが使えたので下記のように対応(今回はファイルアップは行わず webページ上で設定していました)

```
import pycurl
    # chatwork post
    c = pycurl.Curl()
    c.setopt(pycurl.URL, chatwork_url)
    c.setopt(pycurl.HTTPHEADER, ['X-ChatWorkToken: '+CHATWORK_TOKEN+''])
    c.setopt(pycurl.POST, 1)
    
    c.setopt(pycurl.POSTFIELDS, post_text)
    c.perform()
```

  - lambda上で botの語尾を付けたのですが文字化けしていたので url_encodeしたものを文字連結する形で対応しました。

# kintone
  - データストアとして使用
  - 特にひっかかったところはありませんでした。
  - 簡単に集計してグラフ表示までできるので便利でした。 

# curlで実行

```
curl -H "Content-Type: application/json" -H "x-api-key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -X POST -d '{ "body": "body test","room_id": "1111111111111"}'  "apigateway endpoint url"
```

# 感想
  - 今回、仕組みが簡単だったためサーバを設置したくなかったので
  データストア含めて、サーバレス的な形で設定できて運用もあまり手間がかからないので便利そうでした。
  - 今後もグルー的な対応で問題ない場合は、運用が楽なのでこういった形で対応していければと思いました。
微分の初歩から勾配降下法まで

[機械学習に必要な高校数学やり直しアドベントカレンダー Advent Calendar 2016](http://qiita.com/advent-calendar/2016/math_for_ml)の11日目の記事です。10日目は[yaju](http://qiita.com/yaju)さんで[線形回帰で二乗和を2で割る理由について](http://yaju3d.hatenablog.jp/entry/2016/12/09/073050)でした。

# はじめに
　難しいとよく言われる微分ですが、そんなに難しい概念ではないですし、とても便利な武器になるんですよ！という記事です。

# 変化率
　まず、最初に変化率という概念について考えてみます。点aから点bへ変化するとき変化率は (yの変化量)/(xの変化量) 、すなわち

$$ \frac{By-Ay}{Bx-Ax} $$

と表せます。このように2点間でxの変化量に対するyの変化量の割合を変化率と呼び、点A,Bを通る直線を引いたときの傾きと等しい値となります。
<img width="340" alt="qiita1.png" src="https://qiita-image-store.s3.amazonaws.com/0/147085/6cdb9f9e-1122-82bf-6065-e529892e03a8.png">

## 1点の変化率
　2点間の距離を小さくしていくことを考えていきます。点Bを点Aに近づけていくことで1点での変化率に近づけていくことができます。この1点での変化率、これこそが微分で求めているものです。この値はこの1点のみを通る線（接線）の傾きと等しい値です。
<img width="855" alt="qiita2.png" src="https://qiita-image-store.s3.amazonaws.com/0/147085/16330aaa-ea13-4b47-380d-9eb4280e03ed.png">

この距離を0に近づけていくことを数学では極限を用いて、以下の式で記述することができます。
$$ \lim_{x \to 0} \frac{f(x+h)-f(x)}{h} $$
三角関数、逆関数、合成関数などの微分のような複雑な数式であってもやっていることは同じで、変化率を求めているだけです！

# 微分でわかること
　微分が何を表しているのかわかったところで微分が何の役に立つのか見ていきます。

## 極大・極小
　微分した値が0になる点について考えてみます。変化率が0となる点は以下のグラフのように接線がx軸と平行になる点です。この点では局地的に最も大きい値(点B, 極大値)、もしくは最も小さい値（点A, 極小値）となります。微分を行うことでグラフ内の極大値、極小値を求めることができます！
<img width="425" alt="qiita4.png" src="https://qiita-image-store.s3.amazonaws.com/0/147085/e9ff57c5-6aab-d8e1-7751-d2886d4d26a4.png">

## 勾配降下法
　機械学習では関数（二乗誤差関数、交差エントロピーなど）の最小化を考えることがあります。その際に微分で極小値を求める方法を応用した方法を用います。それが勾配降下法です。
　関数$ E(w) $の最小値について考えます。以下の式を繰り返し適用することで$ E(w) $がもっとも小さくなる$w$を求める事ができます。
$$ w^{t+1} = w^t - \epsilon\frac{dE}{dw}$$
$\frac{dE}{dw}$は微分を表す記号で関数$E(w)$の傾きを表します。この式をグラフで表すと、極小となる点の方向に$w$が移動します。極小となる点に近づくにしたがって微分した値（傾き）は小さくなっているので、移動する量は徐々に少なくなっていきます。微分した値（傾き）が0となる点（極小）で移動は終わり極小となる点$w$を求めることができます。
<img width="444" alt="qiita5.png" src="https://qiita-image-store.s3.amazonaws.com/0/147085/6eb6a4ee-975e-c41e-d034-dbd1b25fd4ee.png">

# おわりに
　このように微分は非常に便利で役に立つ武器となります。

　明日は[機械学習に必要な高校数学やり直しアドベントカレンダー Advent Calendar 2016](http://qiita.com/advent-calendar/2016/math_for_ml)の12日目、[clown0082](http://qiita.com/clown0082)さんの記事です！
Python3にすんなり移行できないから 2-3 互換を考えよう

そろそろPython3移行どうしようかという話が社内でも出てきたので少し調べた話。

##Python2系サポートは2020年まで

Python2系はサポートが2020年まで公式で発表されています。
(なお2.8はない模様)
現在の手持ちPython製プロダクトが2020年まで稼働しているかはともかくとして、
そろそろPython3への移行を視野に入れておいた方いい時期にさしかかっています。


まずどんな風に変わるか少し列挙

|Python2.X|Python3.X|2系記法で3系は動くか|
|:-------|:-------|:---:|
|print 'xxx'|print('xxx')|×|
|xrange(1, 10)|range(1, 10)|×|
|except Error, V|except Error as V|×|

rangeは3系ではxrangeの挙動になったようです。

見た感じ2系から3系へ移行と言ってもそこまで大きく変わるわけではありません。
細かい構文変更ぐらいです。(外部ライブラリが対応しているかは要チェック)

##移行か互換か
サポート切れといってもそこまでは運用しなくてはならない、2系と3系で別々に実装するのも効率が悪い。
ということですっぱり2系を切り捨てて移行はできず、3系と共存する道を探すのが現実的です。
幸いPythonでは2系と3系は割と同居可能です。

## 移行の場合
せっかくなので移行ツールも
###2to3
一括変換ライブラリとして 2to3 が用意されています。
Pythonに組み込まれているので外部からインストールする必要はありません。

Python3系のシンタックスに合うように構文や適宜インポートも整えてくれるようです。
2to3 に3系から2系へ変換する機能はありません。
でも 3to2 というサードパーティ製ライブラリもあるそうです。(いる？)
https://pypi.python.org/pypi/3to2

##互換性を保つ
互換性を保つためにどんなことができるか紹介します。
### 2系で3系表記をするfuture
実行環境2系で3系の記法ができます。
http://docs.python.jp/2/library/__future__.html

print() で書けるようになります。

```
from __future__ import print_function
print ('hoge')
```
Unicodeを u'hogehoge' と書いていたのが u が不要になります。

```
>>> from __future__ import unicode_literals
>>> '日本語'
u'\u65e5\u672c\u8a9e'
>>> u'日本語'
u'\u65e5\u672c\u8a9e'
```

インポートが絶対インポート優先になる(説明が難しい)

```
from __future__ import absolute_import
```

あと3つ4つありますが、Python2.6以上だとあまり関係ないので省略。

###six
互換性を保つライブラリも用意されています。six です。
2 * 3 = 6 で six らしいです。覚えやすいですね。
こちらは外部ライブラリです。
http://hhsprings.bitbucket.org/docs/translations/python/six-doc-ja/

```
pip install six
```

使い方はインポートして、2系と3系の互換性のない部分に使用するだけです。
実行時のPythonバージョンに応じて内部で使い分けてくれます。

例えば文字列系だと、

|Python2|Python3|six|
|:--|:--|:--|
|basestring|str|string_types|
|unicode|str|text_type|
|str|bytes|binary_type|


iterable (collection)
iterable系は大体似た感じなのでよく使いそうな dict を見てみると、

|Python2|Python3|six|
|:--|:--|:--|
|iterkeys|keys|iterkeys|
|itervalues|values|itervalues|
|iteritems|items|iteritems|
記法は2系に寄せた感じです。

結構な数のビルトインがsixで吸収可能です。

###そもそも
2-3互換チートシートがあります！
http://python-future.org/compatible_idioms.html

## 楽に移行はできるのか
互換性を保てることはわかりましたが、対応箇所を一つずつ探して修正するのは馬鹿にならない工数です。
一括変換ライブラリがほしくなります。あるのでしょうか？

ありました！
https://github.com/python-modernize/python-modernize
sixも使って変換してくれるそうでなかなか期待できそうです。
ソースを少し覗いた感じでは、six や future があったので、これらを使っていい感じに変換してくれるのでは！？
別の機会に試してみたいと思います。
(今回は時間が足りませんでした。本当に申し訳ない。)
(試した方は先に記事を書くチャンスです！)


## Python3のいいところ
移行の手間がかかりますが、Python3にすればこんないいこともあります。
### 型ヒント
http://docs.python.jp/3/library/typing.html
関数やクラス定義時に型指定ができます。

```
def greeting(name: str) -> str:
    return 'Hello ' + name
```
コンパイル言語と違い実行時チェックはできないものの、
開発時に引数の型がすぐわかるのはバグを未然に防ぐ意味で結構重要です。

### 順序付き辞書
入れた順番通りに取り出せる辞書です。
以前、並び順をvalueに入れ込んで取り出した後にソートとかした記憶もあるので使い道はありそう。

```
>>> from collections import OrderedDict
>>> od = OrderedDict()
>>> od['a'] = 1
>>> od['b'] = 2
>>> od['c'] = 3
>>> for k, v in od.items():
...   print(k, v)
... 
a 1
b 2
c 3

>>> od2 = OrderedDict()
>>> od2['c'] = 3
>>> od2['b'] = 2
>>> od2['a'] = 1
>>> for k, v in od2.items():
...   print(k, v)
... 
c 3
b 2
a 1
```
Python3.5からはさらに速くなってるそうですよ！

さらにPython3.6には非同期ジェネレータなども実装されるらしく夢が広がります。
サポート期限というネガティブな動機だけでなく、新機能のためにPython3対応、しましょう！
MacBook Pro 2016に付いたTouch IDを使って認証をしてみる

MacBook Pro 2016にiPhoneやiPadと同じようにTouch IDが付きました。そこで、MacBook ProのTouch IDを使って認証を行うコードを試してみました。

## Local Authenticator
Touch IDを使って認証を行うには、Local Authenticatorを使用します。Local Authenticatorは、macOS 10.10以降、iOS 8.0以降で使用可能なフレームワークです。しかし、この記事のコードは、macOS 10.12以降で定義された定数を使っているので、macOS 10.12以降でしか動作しません。

## サンプルコード
次のコードは、Local Authenticatorを使って認証を行って、その結果をアラートで表示するというものです。プロジェクトはGitHubの次のURLに置いています。

GitHub: akirark/Authentication
https://github.com/akirark/Authentication

```swift:ViewController.swift
@IBAction func authorize(_ sender: Any) {
    let context = LAContext()
    let reason = "管理者権限が必要なアクション"
    var error: NSError?

    // Touch IDかパスワードを使った認証が可能かどうかを調べる
    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) {
        // Touch IDを使って認証を行う
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (success, evaluateError) in
            // 認証後に実行される処理
            DispatchQueue.main.async {
                if success {
                    // 認証できた
                    self.show(message: "認証成功")
                } else {
                    if evaluateError != nil {
                        self.show(error: evaluateError! as NSError)
                    } else {
                        self.show(message: "予期しないエラーにより、認証失敗")
                    }
                }
            }
        })
    } else {
        if error != nil {
            self.show(error: error!)
        } else {
            self.show(message: "予期しないエラーにより、確認失敗")
        }
    }
}
```

## `deviceOwnerAuthentication`と`deviceOwnerAuthenticationWithBiometrics`の違い
`evaluatePolicy`メソッドで`deviceOwnerAuthenticationWithBiometrics`を指定すると、Touch IDを使った認証が必須となります。ダイアログには「パスワードを使用する」という選択肢が表示されますが、こちらを選択すると認証失敗となります。`deviceOwnerAuthentication`を指定した場合は、「パスワードを使用する」を選択すると、パスワードの入力ダイアログが表示されます。

## TouchIDの付いたマシンで動かすと
TouchIDを使った認証ダイアログが表示されます。タッチバーにもメッセージが表示され、指紋の入力待ちになります。`deviceOwnerAuthentication`に変更した場合はパスワードの入力待ちダイアログになります。

## TouchIDが付いていないマシンで動かすと
認証失敗扱いになります。`deviceOwnerAuthentication`に変更した場合はパスワードの入力待ちダイアログになります。


## 管理者権限を持っていないユーザーで実行すると
認証失敗になります。

## `evaluatePolicy`の`reply`は別キューで実行される
`evaluatePolicy`の`reply`はメインキューでは無く、別キューで実行されます。そのため、アラートを表示するなど、GUIに関する処理はメインキューで実行するように`DispatchQueue.async`経由で行う必要があります。
Controllerから簡単にJSに変数を渡したい in CakePHP3

[CakePHP3 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/cakephp3)の11日目 兼
[Fusic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fusic)の11日目の記事です。

こんにちは、クリスマス三連休の孤独に耐えるために一気見するアニメの選定に最近忙しいtutidaです。
福岡の[Fusic](https://fusic.co.jp/)にてLAMPでCakePHPでウェブアプリ開発もしくは、AWSをいじいじしております。
会社のAdvent Calendarがだいぶカオスなことになってきてますが、気にしない

というところで、CakePHP3で業務を行う際に発生した小さな悩みを解決するためのPluginを作成したので紹介します。

- Pack
  - github(https://github.com/tutida/Pack)
  - packagist(https://packagist.org/packages/tutida/pack)

## Controller's variables to Js

CakePHP3のControllerで作った変数をJS側で使いたい。

- layoutのscriptタグに書き込む
- data属性にぶち込む

数が多くなってくるとしんどいし、ctpも読みにくくなってくる。つらみがある。
  
  
## Railsに便利そうなの発見

[Gon](https://github.com/gazay/gon) - get your Rails variables in your js

Gon.Readme.mdより

---

  1. Write variables by

    ``` ruby
    gon.variable_name = variable_value

    # or new syntax
    gon.push({
      :user_id => 1,
      :user_role => "admin"
    })

    gon.push(any_object) # any_object with respond_to? :each_pair
    ```

  2. In your js you get this by

    ``` js
    gon.variable_name
    ```

---

なるほど、便利そう。


## Plugin つくってみた（簡易版

[Pack](https://github.com/tutida/Pack)  - You can easy to pass CakePHP3 variables to JS in View.

内部的にはStaticなClassに対して、ComponentとHelperから値を入れたり取得したりするだけ。
~~じゃあ、直接 StaticなClass叩けばいいじゃんとかいは言わないで~~
通常のControllerのsetと同じ感覚で変数をjsに渡せます。

## 使い方

読み込んで

```php
<?php
    class AppController extends Controller
    {

        public function initialize()
        {
            $this->loadComponent('Pack.Pack');
        }
        ...
    }
```

layoutにこれかいて

```php
    <?= $this->Pack->render();?>
```

コントローラーで値をセット

```php

    $url    = 'https://qiita.com';
    $entity = $this->Hoge->get($id);
    $array  = ['hoge', 'fuga'];

    $this->Pack->set('url', $url);
    $this->Pack->set('entity', $entity);
    $this->Pack->set('array', $array);

    ## OR ##
    $this->Pack->set(compact('url', 'entity', 'array'));

```

JS側で参照可能に

```js
    Pack.url;    // > https://qiita.com
    Pack.entity; // > Object {id: ..., name: ..., ....}
    Pack.array;  // > Array[2] {0: 'hoge', 1: 'fuga'}
```

他の機能はREADMEにちょこちょこ書いています。

## 順次アップデート
予定...(汗

## その他
- [Altair](https://github.com/tutida/Altair) - Auto converting special characters of variables to HTML entities
  - HTMLエスケープ用のPlugin、もし困っているのであればご参照ください
Azure CLIで複数のサブスクリプションを切り替える

Azureアドベントカレンダー11日目！ということでAzureでニッチなところの話です。

> ちなみに 「[【１周年・合宿】集まれSwift好き！Swift愛好会 vol13](https://love-swift.connpass.com/event/43865/)」の合宿でちまちま書いてます笑

azure cliを使ってておきた話です。
複数サブスクリプションを持ってない人にはほぼ関係ないです苦笑

入れてない人は以下でインストールできます。

```
npm i -g azure
```

ログイン方法などは過去の記事参照でお願いします。
> [AzureのCLIツールを使ってCoreOS/Docker上にWebサーバーを立ててみる。](http://qiita.com/n0bisuke/items/71444909769f2fc72455)

## おきた症状

`mydev`リソースグループのWebAppsアプリケーション一覧を取得したいと思ったらエラー吐かれました。

```
$ azure webapp list mydev
info:    Executing command webapp list
+ Listing webapps
error:   Resource group 'mydev' could not be found.
error:   Error information has been recorded to /Users/n0bisuke/.azure/azure.err
error:   webapp list command failed
```

**どうやら複数のサブスクリプションを持ってると、一つ目のサブスクリプションに紐づけられてるリソースグループしか読み込んでくれない**みたいです。

## 解決方法

「[Azure CLI から Azure へのログイン > 複数のサブスクリプション](https://docs.microsoft.com/ja-jp/azure/xplat-cli-connect#a-namemultiple-subscriptionsa%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)」に解決方法がありました。

`azure account list`と`azure account set <サブスクリプション>`というコマンドで切り替えできます。

```
$ azure account list

azure account list
info:    Executing command account list
data:    Name                                Id                                    Current  State
data:    ----------------------------------  ------------------------------------  -------  -------
data:    Microsoft Azure xxxxxx プラン        xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx   true   Enabled
data:    Visual Studio Enterprise: BizSpark  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  false     Enabled
info:    account list command OK
```

currentがtrueになっているのが現在有効になっているサブスクリプションです。
`Visual Studio Enterprise: BizSpark`に切り替える場合は以下のようにします。

```
$ azure account set "Visual Studio Enterprise: BizSpark"

info:    Executing command account set
info:    Setting subscription to "Visual Studio Enterprise: BizSpark" with id "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".
info:    Changes saved
info:    account set command OK

```

これで切り替えられました。

最初にやろうとしたWebAppsのリストを取ってみます。

```
$ azure webapp list mydev
info:    Executing command webapp list
+ Listing webapps
data:
data:    Web App Name     : myapp1
data:    Enabled          : true
data:    Status           : Running
data:    Last Modified    : 2016-11-05T08:36:27.397Z
data:    Location         : Japan East
data:    App Service Plan : kantoS1
+ Checking for slots
data:
data:    Web App Name     : myapp2
data:    Enabled          : true
data:    Status           : Running
data:    Last Modified    : 2016-12-04T02:34:43.840Z
data:    Location         : West Europe
data:    App Service Plan : ServicePlan92ec976d-xxxx
+ Checking for slots
info:    webapp list command OK
```

無事に取得できました！
[botkit × Nightmarejs] 指定されたURLのスクリーンショットをとるチャットボットを作ってみた

slack のチャットボットフレームワークである [botkit](https://github.com/howdyai/botkit) と
[Nightmare](http://www.nightmarejs.org/) というヘッドレスブラウザで自動テストなど書けるライブラリを使って
Webサイトのキャプチャーを撮ってslackに投稿してくれるchatbotを作ってみました。

デモ画像
![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/55219/fa360824-c377-cc42-77af-2ce23e92b977.gif)

## 使い方

リポジトリは以下
https://github.com/tamanugi/site-capture-bot

```
$ npm install
$ token=<your bot token> node bot.js
```

上記コマンドで botkit が起動します。
あとはslackで

```
@chatbot capture http://hoge.com
```

と話しかければ、指定されたURLのスクリーンショットを取得し、チャンネルに投稿します。

## ちょっとハマったところ

### botkit でURLを正規表現で抽出

URLを含むメッセージをbotkitで受け取るときURLは`<>`に囲まれて渡されるので
`controller.heaers` に書く正規表現は下記のようになる。

```javascript
controller.hears(['capture <(https?://.*)>'], 
```

これに気づかなくてなんでchatbotが反応してくれないのか
悩んでしまった。。。

### botkitで画像をslackにアップロードする

以前はできなかったようで軽く調べても情報がでてこなかった。
botkitのissuesとか探してたら修正されているのに気づいた。

こちらは別の記事にも書きました。
[Botkitで画像ファイルをslackにアップロードする](http://qiita.com/tamanugi/items/4773b00a629c301fb55a)

### Nightmareでサイト全体のスクリーンショットを取る

Nightmare では以下のコードでスクリーンショットを取得できるのですが、

```javascript
  Nightmare();
  .goto(url)
  .screenshot('path/to/image.png')
```

これだとブラウザで見れる範囲しかスクリーンショットを取得できません。

そこでサイト全体をスクリーンショットする方法を探していたところ
以下のissueをみつけました。

https://github.com/segmentio/nightmare/issues/498

こちらのissueを参考に body タグの幅と高さを取得し、
viewportに設定することでサイト全体のスクリーンショットを取得しています。

この方法をもうちょっと変えれば指定されたセレクタのみのスクリーンショットを取得することも
できそうです。
プログラマーの人生マニュアル『SOFT SKILLS (ソフトスキル)』読後感想文

[ベーシック Advent Calendar 2016](http://qiita.com/advent-calendar/2016/basicinc) 11日目は、
先月に子供が生まれた [@roki1801](http://qiita.com/roki1801)。普段は山形でリモートワークをしている。

プログラマーのみなさんの中でより良い人生を送りたくない人はいないだろう。
しかし、どんな人生を歩みたいか、どんな人生が正しいのかを具体的にイメージしている人は少ないはず。
私もそのうちの一人だ。

そんな私にソフトスキルという視点をくれた本の紹介をしたい。
日本語版の解説は「まつもとゆきひろ」氏である。

[SOFT SKILLS ソフトウェア開発者の人生マニュアル](http://amzn.asia/j5GPSRf) (日本語版)
[Soft Skills: The Software Developer's Life Manual](http://amzn.asia/ft32LmL) (英語版)

* * *

![51WiLueukSL._SX258_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/68751/e7498bdd-aa52-52f0-866a-808655b60edf.jpeg)


本書には、ソフトウェア開発者がより良いソフトウェア開発者になるために必要なことが全て書かれている。しかし本書には良いコードの書き方やアルゴリズムなどのテクノロジーのことは書かれていない。「ソフトスキル」とはソフトウェア開発者が人生全般をより良く生きるためのスキルを指している。本書は「ソフトウェア開発者の生活」の様々な側面に注目し、実践的で行動に移せるアドバイスを提供している。それが1アドバイスにつき大体5ページ前後で纏まっているので、どこからでも手軽に読み始められる。

扱われるテーマは広く、具体的には、キャリア、マーケティング、学習、生産性、お金、健康、精神である。気を抜いている所は一つもなく、健康における食事に関するハックでは、卵を電子レンジで白身と黄身に分離する方法を教えてくれている。その一方で、独学能力や生産性を大幅に引き上げるとともに、燃え尽き症候群に対処する方法や大成功するブログの作り方を紹介している。本書は”成功を収めたエンジニアの頭脳のほぼ完全なダンプ”なのである。

筆者はまるで一般的なソフトウェア開発者の頭の中を全て見透かしているようだ。語りかけるような文章でありつつ、痛いところをついてくる。
> 多くのソフトウェア開発者は品質が基準に達しないときに、自分を高めてその厳しい基準をクリアする方向に努力するのではなく、基準を引き下げるという大きな過ちを犯してしまう。

これは常に高品質を志向し継続的に自己研鑽する「プロ」であるべしという内容なのだが、心当たりがありすぎる。<br>
第6部「やっぱり、体が大事」では健康の重要性を説き、フィットネスの目標設定やモチベーション維持から食事管理までと、まるでTarzanのようだ。こと筋トレに関するアドバイスはTarzanどころかマッスル・アンド・フィットネスを読んでいるのかと錯覚するレベルである。私は本書を読み、最近ほとんど行かなくなっていたジムにまた行き始めた。
> 筋肉肥大の効果をもっとも上げたい場合には、レップは8から12の範囲にする。この場合も、レップの回数だけ持ち上げられるウェイトのなかでももっとも重いものを持ち上げる。レップの範囲が大きくなると、筋肉が動かなくなるまでかなりの燃焼を感じるだろおおう。痛みなくして得るものなしということである。

こんな調子で、すでにソフトウェア開発者として成功者である筆者が惜しげもなく繰り出すアドバイスが本書には詰まっている。まさに「ソフトウェア開発者の人生マニュアル」としてソフトウェア開発者が生きることに迷ったときに傍らに置く本として相応しいだろう。<br>
取り扱われるテーマは広く、一見無関係なものが絡み合っているようだが、一つ一つはとてもシンプルに丁寧に纏められている。それもそのはず。筆者はソフトウェア開発者やITプロフェッショナル向けサイト「シンプルプログラマー」の設立者で、ビジョンは複雑な問題を単純なソリューションに変換することであるという。
さらに自らも卓越したプログラマーであり、プログラミング言語やテキストエディタに対するプログラマーが取る宗教的な態度といった、我々が興奮する話題もよく知っていて、読み手を楽しませてくれる。
そんな筆者は、不動産投資等の資産管理を通して33歳という若さで早期引退を手に入れたのだが、その知見を余すことなく、嘘偽りなく本書に書いている。

また、本書の装丁は最高レベルで美しい。筆者の並々ならぬこだわりを感じることができる。装丁をみるだけでも価値がある。挿絵もなかなか秀逸だ。（私は挿絵の最高峰は[リーダブルコード](http://amzn.asia/j61XyeU)であると考えている）カバーももちろん素敵であるが、英語版のほうが様になる気がする。

読後には、何か実行して「より良い人生」への一歩を踏み出すことになるだろう。ソフトウェア開発者はもちろんだが、より良い人生への手がかりがほしい人であれば誰でも本書から必ず何か役立つものを得ることができるであろう。<br>
書かれているのは人の生き方についてである。
より豊かな未来の自らの姿を想像する補助線に本書はなるかもしれない。
IMEを使う（Windows: IMM編）

WindowsのIMEとのAPIにはいくつかの実装があるのですが、今回は古のWIndows 2000以降ならフルで使えるInput Metod Managerについてです。
非常に優秀なIMEのAPIで、未確定文字列の描画をアプリケーション側で行わない場合には、それを肩代わりしてくれます。
また、変換候補についても自身で表示するかIME側に表示してもらうかを選択できます（たぶん）。

# Input Metod Manager概要
アプリケーション側でやることは主に2つです

- IMEに自身の情報を伝える
- IME関連のウィンドウメッセージを処理する

これだけです。
以降は、縦書きエディタで最低限実装するべきことについてざっくりとリストアップします。

## 共通
IME関連の処理をする際には

- `HIMC hImc = ImmGetContext(hWnd);`
- `hImc`を使って色々やる
- `ImmReleaseContext(hWnd, hImc);`

の順序になります。

## IMEに自身の情報を伝える

### 使用するフォントをIMEに伝える
縦書きにおいてはこれが何よりも重要なことになります。
これをすることで、IMEはアプリケーション側で文字列が縦書きになっているということを知ることができます。

- `LOGFONT logfont;`に適切なフォントデータを突っ込む
    - `logfont.lfEscapement = 2700;`する
        - 書字方向が上から下
    - `logfont.lfOrientation = 2700;`する
        - 文字を反時計回りに270.0度回す
    - `logfont.lfFaceName`のフォント名の先頭には`@`を付与する
        - 縦書き用の字形を使う
- `ImmSetCompositionFont(hImc, &logfont);`する

### 変換候補の位置を教える

## IME関連のウィンドウメッセージを処理する

### `WM_IME_SETCONTEXT`

- `lParam &= ~ISC_SHOWUICOMPOSITIONWINDOW;`
    - もし未確定文字列を自分で描画する場合
- `return DefWindowProc(hWnd, message, wParam, lParam);`

### `WM_IME_STARTCOMPOSITION`
これから未確定文字列がやってくるという予告。

### `WM_IME_COMPOSITION`

- 未確定文字列がやってきたとき
- 未確定文字列に変更があったとき
- 未確定文字列が確定されたとき

以上の3つのときに呼ばれ、アプリケーション側はIMEから未確定文字列や確定された文字列が取得できます。
未確定文字列の取得は少し面倒ですが、時間がないので省略です（すみません）。

### `WM_IME_ENDCOMPOSITION`
もう未確定文字列は無くなったという報告。

### `WM_IME_NOTIFY`, `WM_IME_REQUEST`
IMEからの通知です。
`ImmSetCandidateWindow(hImc, &form)`で変換候補ウィンドウの位置を教えるなどしましょう。

# おわりに
非常に使いやすいAPIで上のことをやれば動くと思います。
さて、明日は地獄のTSF（Text Services Framework）です。

ちなみにTATEditorではTSFのサポートを切って、IMMを使用することもできます。
特にメリットはありませんが、編集中のテキストへIME側からアクセスされなくなります。

参考：
https://msdn.microsoft.com/library/windows/desktop/dd318641.aspx
RancherでSoftLayerのマシンドライバーを利用してホストを追加する

Rancherのマネージャーサーバからマシンドライバーを利用してホストを追加する手順を記載します。

Rancherバージョン：V1.2.0
言語：日本語

# 1.環境の追加

GUIの管理コンソールにログインをして、「環境を追加」ボタンを押下します。

![rancher01.png](https://qiita-image-store.s3.amazonaws.com/0/61606/7f7a147c-4dcd-810e-5d94-86eff2260cd1.png)

「名前」に任意の名称を入力し、cattle、kubernetes、Mesos、Swarmから一つの環境テンプレートを選択して、「作成」ボタンを押下します。

![rancher02.png](https://qiita-image-store.s3.amazonaws.com/0/61606/940d129f-d137-7112-082e-627b11302e51.png)

# 2.ホストの追加

上部メニューから「インフラストラクチャ」-「ホスト」を選択します。

![rancher03.png](https://qiita-image-store.s3.amazonaws.com/0/61606/93793d5b-cc33-28be-0eb4-18281c12cc6a.png)

「ホストを追加」ボタンを押下します。

![rancher04.png](https://qiita-image-store.s3.amazonaws.com/0/61606/4358b05f-251e-3be1-83da-7c109f10c24f.png)

マシンドライバ選択で「Other」を選択し、「名前」に任意の名称を入力し、「ドライバー」でsoftlayerを選択します。

![rancher05.png](https://qiita-image-store.s3.amazonaws.com/0/61606/79c45246-cc32-37d7-6b88-a9030cdd9b7d.png)

以下の内容を入力します。入力する値はSoftLayerのCLIで指定する場合と同じ値になりますので、[こちら](http://softlayer-python.readthedocs.io/en/latest/cli/vs.html)を参考にしましょう。

|項目             |入力概要             |
|:-----------------|:-----------------|
|apiEndpoint             |https://api.softlayer.com/rest/v3             |
|apiKey             |softlayerの管理画面上部メニューの「アカウント」から「ユーザー」を選択し、対象ユーザ名をクリックして 、API アクセス情報の「認証鍵」の値をこちらに入力します。            |
|cpu             |cpuのコア数を入力します。             |
|diskSize             |ディスクサイズを入力します。GB単位です。            |
|domain             |ドメインを入力します。            |
|hostname             |ホスト名を入力します。            |
|hourlyBilling             |時間単位の請求にする場合はチェックを入れます。            |
|image             |SANではなくlocalDiskを選択する場合はチェックをいれます。            |
|localDisk             |利用するOSを入力します。            |
|memory             |RAMの容量を入力します。GB単位です。          |networkMaxSpeed             |アップリンク・ポート速度を入力します。入力できるのは、100Mbps、1Gbps、10Mbpsと思われます。           |
|privateNetOnly             |privateNetOnlyを選択する場合は、チェックを入れます。           |
|privateVlanId             |privateVlanIdの数を入力します。           |
|publicVlanId             |publicVlanIdの数を入力します。           |
|region             |データ・センターを入力します。           |
|user             |SoftLayerのアカウントを入力します。           |

![rancher06.png](https://qiita-image-store.s3.amazonaws.com/0/61606/eb9bc071-9590-ebde-b475-3ebe06b8c2ef.png)

拡張オプションについては、必要な場合は設定しますが、必須ではないのでここではデフォルトとします。

「作成」ボタンを押下します。

![rancher07.png](https://qiita-image-store.s3.amazonaws.com/0/61606/a7f2ac47-7383-e14f-4292-0513f4ba6512.png)

しばらくするとホストが追加されて、Rancherサーバの管理配下となります。

![rancher08.png](https://qiita-image-store.s3.amazonaws.com/0/61606/45bf6533-fc0c-4935-10fd-263351ca3546.png)

***
以上で、「RancherでSoftLayerのマシンドライバーを利用してホストを追加する」は完了となります。

Rancherには以下のマシンドライバーがあります。
※2016年12月現在v1.2.0

![rancher09.png](https://qiita-image-store.s3.amazonaws.com/0/61606/e5f80e48-bbe6-9db9-03b6-53b0cec83e41.png)

マシンドライバーは追加もできるので、他のクラウドとAPI連携させることも可能です。
Bundle install でMySQLのインストールに失敗した話

久々にRailsプロジェクトをBundle Installしようとしたらmysqlで怒られた:imp:

```
Using rb-inotify 0.9.5
Using sprockets 2.12.4
Using crack 0.4.2
Using debase 0.2.1
Using did_you_mean 0.10.0
Using notiffany 0.0.7
Using pry 0.10.3
Using guard-minitest 2.4.6
Using omniauth 1.3.1
Using hirb-unicode 0.0.5
Using mocha 1.1.0
Using minitest-reporters 1.0.20
An error occurred while installing mysql2 (0.3.16), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.16'` succeeds before bundling.
```


GemFileにてバージョンを指定したが、変わらず
```
gem 'mysql2', '0.3.16'
```

調べてみると以下のようにBundleのconfigを設定したところ無事インストールできました。
Rails使ったことないので無駄にはまってしまった。
最近クライアントばかりやっているのでやばい。ちょっと勉強します

```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```
Windowsコマンドラインにおける括弧の活用

#括弧の概説
コマンドプロンプト上での括弧"( )"は、主に囲まれた範囲をif文などでまとめて制御する為に使うものですが、実は標準入出力もまとめる効果があります。
例えばvar,set,dirコマンドの結果をoutput.txtに続けて出力する場合、リダイレクトだけを使って出力しようとすると…

```bat:括弧を使わない場合
ver >output.txt
set >>output.txt
dir >>output.txt
```
普通はこう書きますが、括弧を利用することで

```bat:括弧を利用した場合
(
ver
set
dir
)>output.txt
```
と一回のリダイレクトで記述することが出来ます。

普通にコマンドプロンプト上で実行（そのままconに出力）した場合は、
括弧を使わずに書いた場合と違いがわかりませんが、リダイレクトやパイプを使うと違いがわかります。

#応用例
###ヒアドキュメントもどき
sh系のシェルには[ヒアドキュメント](https://ja.wikipedia.org/wiki/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)という複数行テキストをスクリプトに埋め込む手法がありますが、コマンドプロンプトにはありません。
しかし括弧とechoを使うとと似たようなことが出来ます。~~正直エレガントではないですが仕方がない。~~

```bat:ヒアドキュメントもどき
(
echo.abc
echo.
echo.ghi
)>afile.txt
```
結果(afile.txtの中身)
>abc
>
>ghi

ECHOコマンドを連続記述し、最後に一回だけリダイレククトすれば、echo文毎にリダイレクトするよりも簡潔に記述することが出来ます。
なお、echoコマンドは引数を与えないと現在のecho状態が表示されてしまいます。これだと空白行を出力するのに不都合なため、echoコマンドの直後はスペースではなくピリオド(.)を入力しておくとecho状態が表示されません。

###ヒアドキュメントもどき・パイプ利用
パイプ | を利用し標準入力として別のコマンドに送りつけることも可能です。
例えばdiskpartをこの方法で制御すれば、外部ファイルを用意しなくても一つのバッチファイルで作業が完了します。
次の例はdiskpartで仮想HDDイメージをバッチ作成する方法です。

```bat:ヒアドキュメントもどき＋diskpartによるVHDバッチ作成
SET VDISK=%TEMP%\workdisk.vhd
SET VDRIVE=K
(
echo create vdisk file="%VDISK%" maximum=65536 type=expandable
echo select vdisk file="%VDISK%"
echo attach vdisk
echo clean
echo create partition primary
echo format fs=ntfs quick
echo assign letter=%VDRIVE%
)|diskpart
rem 例によってエラーは考慮していないので注意を。
```
このように記述することで同一のバッチファイルにスクリプトを埋め込んだり、むことが可能です。
環境変数を埋め込んだりすることができるのも、単なる外部ファイルでは出来ない強みです。
なお、環境変数を使う場合の注意点として、括弧の間で環境変数を変化させても括弧内からは利用できません。
これはコマンドインタプリタがバッチファイルを解釈する際、括弧を発見すると括弧内の環境変数を一括展開してからコマンドを解釈しようする為に起こる仕様です。
Event TimeとProcessing Timeについて

[Distributed Computing Advent Calendar](http://qiita.com/advent-calendar/2016/distributed-computing) 10日目担当のsitotkfmです。

当初は[Cyberagent Advent Calendar](http://www.adventar.org/calendars/1620)の[10日目](http://sitotkfm.hateblo.jp/entry/2016/12/10/222304,"ログを集める時に気をつけたいポイント")に書いてたんですが、あっちは内容が分散とかけ離れてしまっているのと個別に書いた方が良さそうな話題がだったので分けてこちらで書かせていただきます。Kafkaの話じゃなくてすみません。。。

# データの時刻

まずログは遅れます。
もちろん転送処理による遅延がほとんどなんですが、負荷高騰やログの詰まり、スマホアプリのオフライン時のログはバッファリングされオンラインになった時に送られてくることも多いです。
また転送のルーティングによっては先に生じたイベントログが次に生じたイベントの後に届くこともままあります。
このようにログの到達というのは遅延が生じ得るものなので順不同であるとみなされます。

解析処理はストリーミング処理(1イベントの逐次処理)とバッチ処理(イベントのまとまりに対する処理)に分けられますが、この2種類の処理どちらでも利用可能なデータ処理体系（ラムダアーキテクチャなど）を考えた時に、この順不同で送られるイベントどうを扱うのかというのが課題になっていました。

# Dataflowモデル

[Dataflow Model](http://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf)は順不同かかつ無限に流れるデータに対してストリーミング処理やバッチ処理を行う時のデータの管理について論じられています。
このデータ構造を利用したサービスは[Google Cloud Dataflow](https://cloud.google.com/dataflow/)として利用することができ、同じデータ構造を持つ[Apache Beam](http://beam.incubator.apache.org/)としてOSSで公開されています。
この論文の中では、そもそも**順不同で延々流れているデータに対してある時刻で確実に到達しているとみなすと仮定することを難しい**とし、時刻を**Event Time**と**Processing Time**に分けて扱うことを提案しています。

# 時刻の分類

**Event time**はその名の通り、そのイベントが生じた時刻です。
**Processing time**とはあるイベントに対して処理を行う時刻を指します。これはデータパイプラインを構築した場合、そのコンポーネントごとに変わります。例えばイベントがサーバログを解析する場合、HDFSにファイルとして書き出される時刻とそのファイルMapReduceジョブが処理を始める時刻は異なります。細かく言えばMapとReduceでもProcessing Timeは異なります。

Apache Flinkではこの二つの時刻に加えて**Ingestion time**というのが導入されています。これはFlink内のジョブのパイプラインの先頭にイベントが到達した時刻をIngestion Timeとするようです。
このIngestion Timeというのもストリーミング処理パイプラインを実際運用する際には非常に効果的なのですが、ここでも話が膨らむとアレなので今回は置いておきます。

# ストリーミング処理の時刻の扱い
ちょっと個人的にはストリーミングのログ転送の続き的な話なので今回はストリーミング処理の時刻管理についてとさせてください。
バッチの話やウィンドウ処理のときの時刻の管理もあるのですが、それは各自論文を読んでいただいて、、、。

ログを水と見立てたときに、データパイプラインの各コンポーネントにどこまでデータが流れてきたかを**Watermark**(水位)と呼びます。
<img width="723" alt="スクリーンショット 2016-06-09 午後3.58.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/149697/1cea1bf8-3911-f481-1c4f-58e354044614.png">
(DataFlow Modelの論文から抜粋)

これはあるストリーミング処理に送られたイベントのEvent TimeとProcessing Timeの分布の例です。 （丸の中の数字は今は意味がないので無視してください）イベントの発生順がX軸でシステムへの到着順がY軸で表されています。
Ideal Watermark(薄い点線)はEvent timeとProcessing Timeに差異がない場合、つまり転送のラグが全くない状態です。もちろんそんなことはあり得ないのでこのWatermarkを満たすようなイベントはありません。
実際のWatermark(Actual Watermark、濃い点線)はProcessing Timeが上に進む中で現れるイベントがを囲むように、右上に伸びるように進んでいきます。このWatermarkには順序が入れ替わっているイベントも含まれます。
このとき左上のイベントはWatermark内に含まれないことに注目してください。
Processing Timeが12:09のときにはEvent Timeは12:07に到達しているためこのイベントはWatermarkの後のイベントなのでストリーミング処理では無視されます。

Dataflowモデルのストリーミング処理は低レイテンシであることを優先させるため、このイベントを無視するという選択をしています。Dataflowはこのように二つの時刻を使って解析範囲を決めます。

#  まとめ

今回言いたかったのは時刻の扱いというのは処理によって変わるということと、Processing TimeやEvent Timeという二つの時刻はその手助けになるんじゃいかということでした。
Event TimeとProcessing Timeはよく考えれば当たり前のことなんですが、意外と同一に考えてしまっていることも多々あると思います。
Dataflowモデルまで行かなくても、例えばDBにTTLを設定するときにもEvent TimeなのかProcessing Timeなのかというのを考えておくといいと思います。
あとストリーミング処理に正確性を常に求めている人もいるかもしれないのですが、あくまでそれはレイテンシとのトレードオフということを意識していただければと思います。

ではみなさん今年も残り少ないですが、よい時刻をー。
Dockerized Zabbix 構築してみる

#はじめに
<a>検証用のzabbix</a href="http://qiita.com/ohayougenki/items/bc4acd2105797376b5a1">からDBデータを分離したコンテナ構成を作成


＃前提
centos7　//CentOS Linux release 7.2.1511 (Core)
Docker version 1.10.3, build cb079f6-unsupported　#インストール済みであること


#zabbix構築

##1)/var/lib/mysql用のvolumeを作成

```
docker run \
    -d \
    -it \
    -v /var/lib/mysql \
    --name zabbix-db-storage \
    busybox:latest
```

##2)Zabbix用のDBを開始する （デフォルトではinnodb_buffer_pool_sizeは１GB）
Zabbix用のDBのストレージとして1)で作成したvolumeを利用する

```
docker run \
    -d \
    --name zabbix-db \
    -v /backups:/backups \
    -v /etc/localtime:/etc/localtime:ro \
    --volumes-from zabbix-db-storage \
    --env="MARIADB_USER=zabbix" \
    --env="MARIADB_PASS=my_password" \
    monitoringartist/zabbix-db-mariadb
```

１分後にログから作成確認

```
docker　logs zabbix-db
```


##3)Zabbixサーバを開始する

```
docker run \
    -d \
    --name zabbix \
    -p <任意>:80 \
    -p 10051:10051 \
    -v /etc/localtime:/etc/localtime:ro \
    --link zabbix-db:zabbix.db \
    --env="ZS_DBHost=zabbix.db" \
    --env="ZS_DBUser=zabbix" \
    --env="ZS_DBPassword=my_password" \
    monitoringartist/zabbix-xxl:latest
```

１分後にログから作成確認

```
docker　logs zabbix
```


ブラウザから接続する

```
http://DockerホストIP:<任意で決めたport番号>/
※初期ID/PW：Admin/zabbix
```

#つづく
せっかくDB領域を別にしたので、
バックアップ/リストアまで調べたい
ですが、それはまた別の話。

5)zabbix設定変更
6)storageバックアップ
7)zabbix,zabbix−DBコンテナ削除
８)ストレージコンテナ削除
9)リストア
10)復旧確認

#参考
https://github.com/monitoringartist/zabbix-xxl/tree/master/Dockerfile/zabbix-xxl

http://ksaito11.hatenablog.com/entry/2016/04/09/221853
letsencrypt の 設定方法[メモ]

色々とオプションは存在するが、実行したコマンドと設定は以下の内容でメモとして記載しておく。

----

Ubuntu:
Distributor ID:	Ubuntu
Description:	Ubuntu 16.04.1 LTS
Release:	16.04
Codename:	xenial

NGINX:
nginx version: nginx/1.10.0 (Ubuntu)

GIT:
git version 2.7.4

----

install letsencrypt

```
# git clone https://github.com/letsencrypt/letsencrypt.git
```

make keys for ssl

```
# /root/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html/example.com -d example.com
```

add to crontab as root

```
# crontab -e

0 0 1 * * /root/letsencrypt/letsencrypt-auto certonly --webroot -w /var/www/html/example.com -d example.com --renew-by-default && service nginx restart
```

make dh param key (DH鍵交換用のパラメータキー)

```
# openssl dhparam -out dhparams.pem 2048
```

add to your using server directive of nginx.conf.

```
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
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-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/letsencrypt/live/example.com/dhparams.pem
```

=> SSLv3無効[POODLE対策]
=> 暗号化スイート明示

Configuring HSTS in NGINX

```
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
```

設定が完了したら、ここで確認して「A」だったらOKっしょ。
[SSL LABS - SSL Server Test](https://www.ssllabs.com/ssltest/index.html)

[注意]letsencryptはCertbotへ変更
[Certbot - Welcome to the Certbot documentation!](letsencrypt.readthedocs.io/en/latest/index.html)
Macのターミナルで急に画面が分割されるやつを元に戻す

MacのTerminal使ってるとたまに画面が分割されてテンパってた。

これの治し方は `Command + Shift + D` の同時押しらしい。
ほぇ〜。

逆に分割したかったら `Command + D` の同時押しらしい。
ほぇ〜。
vimでsudoを忘れてreadonlyで編集してしまった場合

`w !sudo tee%`
w : ファイルの保存
!sudo tee : ! にて コマンド「sudo tee」を指示
% : 現在開いているファイル
⇒　現在開いているファイルに対して、tee コマンドで強制的に上書きすることになります。

`q!`

http://tm.root-n.com/unix:command:vim:readlonly_write
Apache Solr 入門してみた

Solr Advent Calendar 2016 の11日目です。

## はじめに
9月に [改訂新版 Apache Solr 入門][book] を読み、Solrを触り始めました。
この記事では、Solrを2ヶ月ほど触った素直な感想について記載します。

[book]: http://gihyo.jp/book/2014/978-4-7741-6163-1

## 私の前提知識
形式言語のさわりと、自然言語処理のさわりの知識はありました。
そのため、検索エンジンでの重要な要素のひとつ「形態素解析」については既知でした。

検索エンジンを扱うにあたって重要な知識ではありますが、その知識は後述の入門書を読んでからのほうが良いです。
自然言語処理の基礎については、[この本][nlp]が良いです。
大学の教科書とのことですが、例示が豊富で、かつこの本で内容が簡潔しているため、おすすめです。
単語解析の章まで読めば十分です。

[nlp]: http://www.coronasha.co.jp/np/isbn/9784339024517/


## 改訂新版 Apache Solr 入門
「日本語で丁寧に説明されたSolr本はこれくらいだ」と言われて渡されました。
「検索エンジンとは」から始まり、ドキュメントの扱い、検索の仕方、...、クラスタリング、チューニングと、基本的な点は全て網羅されています。

まずは4章まで読めば検索できるようになります。
入門書に書いてあるとおりに操作すればSolrの起動から検索までできるようになります。

## その後
ここまでに示した内容のみで、かんたんな検索はできるようになります。
日本語の検索のみであれば上述の[本][book]を読めば解決します。

私が実感している「全文検索」以外のSolrの特徴として、空間検索が優秀という点が挙げられます。
MySQLの範囲検索とは異なり、地球が楕円球であること考慮したロジックが組み込まれているため、データの完全一致検索より柔軟な検索をしようとした場合は、絶対にSolr ないし何かしらの検索エンジンを用いた方が良いです。

## 最後に
まだ検索エンジンを学び始めて間もない身のため大したことを書けませんでした。
今年のSolr Advent Calendarでの他の方の投稿を見る限りでも、R&D寄り、職人気質のある内容が多いため、これからも修行していきます。

Solr 6の多次元データ構造を扱ってみたい...
Haskellの行列計算ライブラリの計算時間を比較

Haskellで行列計算をしようと思ったときに、どのライブラリを使ったら良いのか迷ったので、代表的なライブラリを使って行列積の計算時間を測定してみました。

# Haskellの行列計算ライブラリ

代表的な下記の3ライブラリを対象にします。

- [matirx](https://hackage.haskell.org/package/matrix)
- [hmatrix](https://hackage.haskell.org/package/hmatrix)
- [repa](https://hackage.haskell.org/package/repa)

# 行列積の計算プログラム

各ライブラリを使って、要素が1の1000行1000列の行列同士の積を計算して、900行900列目の値を表示するプログラムを用意しました。

## matirx

```haskell:matrix.hs
import Data.Matrix

main = do
    let
        a = matrix 1000 1000 $ \_ -> 1 :: Matrix Double
        b = matrix 1000 1000 $ \_ -> 1 :: Matrix Double
    print $ getElem 900 900 (a `multStd` b)
```

## hmatirx

```haskell:hmatrix.hs
import Numeric.LinearAlgebra

main = do
    let
        a = (1000 >< 1000) $ replicate (1000 * 1000) 1 :: Matrix Double
        b = (1000 >< 1000) $ replicate (1000 * 1000) 1 :: Matrix Double
    print $ (a <> b) `atIndex` (900, 900)
```

## repa

```haskell:repa.hs
import Data.Array.Repa
import Data.Array.Repa.Algorithms.Matrix

main = do
    let
        a = fromListUnboxed (Z :. 1000 :. 1000 :: DIM2) $ replicate (1000 * 1000) 1 :: Array U DIM2 Double
        b = fromListUnboxed (Z :. 1000 :. 1000 :: DIM2) $ replicate (1000 * 1000) 1 :: Array U DIM2 Double
    m <- (a `mmultP` b)
    print $ m ! (Z :. 900 :. 900)
```

# 計算時間の比較

[stack](https://github.com/commercialhaskell/stack)のghcでコンパイルして実行した結果は下記です。

## matirx

```bash
$ stack ghc matrix.hs
$ time ./matrix
( 1000.0 )


real	0m0.615s
user	0m0.486s
sys 	0m0.092s
```

## hmatirx

```bash
$ stack ghc hmatrix.hs
$ time ./hmatrix
1000.0

real	0m0.169s
user	0m0.240s
sys 	0m0.028s
```

## repa

ghcオプションに```-threaded```を指定して、実行オプションに```+RTS -N```を指定すると、自動的にCPUの全コアを使って並列計算してくれるみたいです。

```bash
$ stack ghc -- repa.hs -threaded
$ time ./repa
1000.0

real	0m2.796s
user	0m2.594s
sys 	0m0.112s
$ time ./repa +RTS -N
1000.0

real	0m1.652s
user	0m4.552s
sys 	0m0.639s
```

# 実行環境

## GHCのバージョン
```bash
$ stack ghc -- --version
...
The Glorious Glasgow Haskell Compilation System, version 8.0.1
```

## PCのスペック
```bash
$ system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro11,1
      Processor Name: Intel Core i5
      Processor Speed: 2.4 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 3 MB
      Memory: 4 GB
      ...
```

# まとめ

結果的にはhmatrixが圧倒的に速かったです。マルチコアの並列計算が可能なrepaに期待していたのですが、あまり速度は出ませんでした。repaの強みは2次元以上の配列を使う場合、もっと多くのコアを使った場合に出てくるのかもしれません。ひとまず、hmatrixを使うのが無難なのかなと思いました。


# 参考
- [Why is matrix multiplication faster with Repa than with hmatrix?](http://stackoverflow.com/questions/19733382/why-is-matrix-multiplication-faster-with-repa-than-with-hmatrix)
- [How to choose a Haskell array library](http://u.arboreus.com/2011/03/how-to-choose-haskell-array-library.html)
Docker よく使うコマンド

#Dockerでよく使うコマンドをまとめてみた

起動中のコンテナを一括で停止

```
sudo docker ps | grep ago | awk '{print $1}'| xargs docker stop
```

すべてのコンテナを一括で削除

```
sudo docker ps -a | grep ago | awk '{print $1}'| xargs docker rm -f
```

すべてのコンテナイメージを一括で削除

```
sudo docker images | grep ago | awk '{print $3}'| xargs docker rmi
```

コンテナ上でコマンドを実行

```
sudo docker exec -it <コンテナ名> /bin/sh
```
JavaScriptとBrushKnobでロボット動かすやつ 

# なんかアドベントカレンダー空いてるので！

![robot.png](https://qiita-image-store.s3.amazonaws.com/0/31758/de752b21-382c-9e57-8052-922b6b9f57dc.png)

急遽作りましたw
[Robot](http://mz4u.net/robot/)

# Brush Knob無いと遊べません

- [BrushKnob](https://www.indiegogo.com/projects/brushknob-speed-up-your-creation-workflow-painting-art#/) をなんとかして入手してくださいw

## 操作方法

- BrushKnobのボタン→ロボット出します
- BrushKnobのKnob→回すとロボットの流れるスピードが変わります！
- リターンキー→ロボットが消えます

<img width="1167" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/31758/fb1b6028-58f3-9bbd-00c6-0f9cee5aa65a.png">

# ソースコード

githubにあげるほどのものでもないので直リンクで。

- [index.html](http://mz4u.net/robot/index.html)
- [main.js](http://mz4u.net/robot/js/main.js)

[Pixi.js (ただしv3)](http://www.pixijs.com/) と [minified.js](http://minifiedjs.com/)を使ってます。
Elixirをこれから学びはじめる方に向けて

この記事は[Elixir Advent Calendar 2016の10日目](http://qiita.com/advent-calendar/2016/elixir)の記事です。

Elixirをこれから始めたいという方に自分がやったこと、感じたことを残します。
少しでも参考になればと思います。

## 時代背景

Elixir自体は、mizchi氏の[リアルタイムウェブな観点からElixir / Phoenix について](http://qiita.com/mizchi/items/e38d3f0461fe316021f7)あたりから興味を持ち始めました。
この記事を見て、Elixirを始めた人も多いのではないでしょうか。

http://elixir-ja.sena-net.works/
当時Elixirの情報で簡単にヒットするのは上記のサイトくらいだったと思います。
とはいえ、すでにある程度は日本語化されていて、（翻訳状況は今も昔も変わってなかった。）
こちらのサイトを見て、Elixirの基本的な言語仕様を学びました。
キャッチアップが早い人は翻訳がない状態で元サイトを翻訳しながら取り組んでいました。

当時は、ver1.1 でした。

## GETTING STARTEDの次

GETTING STARTEDではElixirの構文が学べました。（後半はプロセス、OTPもあるけど）

その状態で書いたコードがたぶん以下のあたりです。

[phoenixとRedisでAPI作成](http://qiita.com/astap/items/7f6647c364bf99447ca3)
[ElixirでSlackBotを簡単に作れるライブラリを作ったよ](http://qiita.com/astap/items/3e4dcf3e6fbb72f02df2)

ここらへんで、ErlangプロセスやOTPに関する知識が必要だなと感じ、そちらをやることにしました。
slackbotでマクロでDSLを作っているものの、マクロはソースが読めるくらいに書ければいいのかなって思います。（いまのところ）

## Erlangをやる

[learn you some Erlang](https://www.ymotongpoo.com/works/lyse-ja/index.html)
のサイトをところどころ読みました。
このサイトは、すごいErlangゆかいに学ぼうという本の元になったサイトの翻訳です。
ところどころ翻訳がわからなかったところもあるので、ちゃんとやる場合は本を買ったほうがいいと思いました。
OTPの使い方ではなく、OTPの成り立ちというか、
内部的にはこんな事をしているけど、これを毎回書くのは大変だから、OTPがあるんだよ。
的なことが書いてあるのが良いです。

[プログラミングErlang](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0Erlang-Joe-Armstrong/dp/4274067149)
をやりました。
いまのErlang/OTPのversion(OTP18でやった）だと動かないところもあり、
修正しつつやるのはつらめでしたが、良い本でした。
Erlangの強みである、ErlangNodeでクラスタを組んで分散処理を行う点や、
バイナリをパターンマッチで扱える点などが学べます。

Erlangを使う気はありませんが、Elixirのコードを読んでいるとたいていはErlangのライブラリに行き着きます。
自分でErlangを書くことによって、Erlangライブラリのコードを読めるようになったことがとても有益でした。
またElixirのGETTING STARTEDではあまり触れられていませんが、
ElixirからErlangの標準ライブラリを利用できるので（というか、GETTINGSTARTEDでも使われてるけど）、
Erlangの標準ライブラリに何があるか、どう使うか的なところは割りと重要だと思います。

Elixirの入門的な話しにはErlangのことをスルーすることが多いと思うのですが、
Elixirの標準ライブラリは、多くないです。
なぜ多くないかというと足りない部分はErlangの標準ライブラリを使う前提だからです。

## Phoenixのソースを読む

Phoenixを使うにあたり、内部で何をしているのかがわからなかったので、結構ソースを読んでました。
特にChannel周りで何を自分で気にする必要があるのか、
何をフレームワークが吸収してくれているのかがわからなくて調べてました。
結果的にcowboyのソースの一部まで追っていましたが、勉強になりました。

## Erlangのドキュメントを読む

主に、分散Erlangについて読んでいたと思います。
また、Phoenix内で使用されているErlangのライブラリのドキュメントも読んでいました。

## やった感想
Elixirは、従来の人気がある言語（Ruby,PHP,Java)とは、感覚が違うところも多く
簡単なスクリプトとして使えるようになる。
と
プロジェクトとして使用できるようになる。
では大きく差があるように感じました。

特にローカルで開発している分には問題ないですが、
プロダクションで使うことを想定すると、ErlangVMの世界になるので、
1.5言語（Erlang + Elixirで1.5と考える)分くらいやることがあるかもしれません。

とはいえ、
言語としては魅力的な部分が多いので、
たとえ、この先、業務で使うことがあるかないかわからない状況だったとしても、
従来の言語（Ruby,PHP,Javaなど）の経験しかない場合であれば、
違うパラダイムであるErlang（Elixir）を学ぶのは、良いことだと思います。