OmniAICreator/Qiita-1.07M huggingface dataset:
BitbucketのPipeLineでAndroidをデプロイしてみた

# 結論
```bitbucket-pipelines.yml
image: uber/android-build-environment:latest

pipelines:
  branches:
    staging:
      - step:
          script:
              - mkdir -p "$ANDROID_HOME/licenses"
              - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
              - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
              - echo y | android update sdk --no-ui -a
              - ./gradlew assembleStagingDebug
```

こうなります。
これを、app直下に設置しておけば、push時にpipelineが起動します。
調べるのに、少し苦労しましたが、これでビルドすることができました。

# 解説
## Androidのビルド環境の準備
`image: uber/android-build-environment:latest`
Androidをビルドする時のお決まり。

## ブランチ指定
```
  branches:
    staging:
```

どのブランチにPushしたら動かすかを指定したい場合。
今回は、stagingって名前のブランチにpushされると動くようにしています。
特にない場合は、

```
  default:
```
だけにする。

## スクリプト
```
      - step:
          script:
```
これ以下に動かしたいスクリプトを記述


### ライセンスを書き込み、SDKをアップデートする
```
              - mkdir -p "$ANDROID_HOME/licenses"
              - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
              - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
              - echo y | android update sdk --no-ui -a
```
ここもBitbucketPipeLineで、Androidをビルドしようとすると、お決まりになります。
ライセンス情報ベタ書きワロスwwwwwとか思うかもしれないけど、みんな一緒なので問題ないです。
これがないと、ビルドに失敗します。

### さぁビルドしよう
```
              - ./gradlew assembleStagingDebug
```
よくあるビルドコマンドです。
ここは、それぞれの環境で変えて使ってもらうことになると思います。
テストの実行したり、Fabricにリリースしたり、マーケットにリリースしたり。

ちなみに、Bitbucketの処理実行時間の限界は、約２時間です。
120分動かしたところで、強制終了されちゃいました。

普通にビルドしたり、アップロードしたりするだけなら、十分ですね。

# 最後に
Bitbucketだと、~~CircleCIも~~[^1]TravisCI対応してないよーって状態ですよね。
Pipelineの登場で、お、自動デプロイいけるやも！
って思ったら、Androidデプロイの情報が英語でしかなくて、泣きそうだったので、今回書いておくことにしました。
どなたかのお役に立てば幸いです。

[^1]: CircleCIは結構前に対応していたようです。Githubでログインしっぱなしで気付かなかった・・・。
No space left on device とエラーが出るときの対処法

# 問題
CentOSでファイル操作をしようとすると、「No space left on device」と言われるようになった。
こうなると、もう何もできない。(Gitコマンド叩け無い、ファイル作れない等)

# 原因を探る
エラーメッセージをそのまま読むと「このデバイス、もうスペースが無いよ」である。
HDDを使い切ってしまったのかとdfコマンドを叩いてみるが、まだ3.4Gも残っている。

```
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda1              50G   44G  3.4G  93% /
```

色々調べているうちに、容量ではなくてinodeが足りない説が浮上した。

inodeとは、UNIX系OSで使用されるファイルシステムの名称で、ファイルの所有者やアクセス権、サイズ、作成日時、場所などを管理しているもののことだそうだ。

残りinodeは`df`コマンドに`-i`をつければ確認できるらしく、叩いてみると...ビンゴである。

```
$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/vda1            3276800 3276799       1  100% /
```

# 解決法
上記の原因から、減らすのは`容量`ではなく`ファイル数`であることがわかった。
以下のコマンドを実行すると、カレントディレクトリに存在するファイル数を再帰的に計算してくれる。(ルートディレクトリで叩くと鬼ヤバになるので注意したい)

```
$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
```

これを使って、たくさんのファイル数を消費しているディレクトリを探し当てましょう。
その中で、消しても問題なさそうなディレクトリを一括で削除すると宜しいと思います。
既存の作業ディレクトリから共有のgitリポジトリを作る手順

何度かググってしまったのでこちらにメモとして残しておきます。

### 手順

1. 既存の作業ディレクトリ（hoge）でgit init, git add ., git commit
2. リポジトリにしたいディレクトリを作成（ここでは仮にhoge.git）
3. hoge.gitでgit init --bare --shared
4. hogeでgit remote add origin hoge.git
5. hogeでgit push origin master
6. 【確認】git clone path/to/hoge.git hoge2
7. 【確認】hoge2にhogeの内容があればOK
Ruby | CASE文の中ではトリプルイコール ( === ) での比較がおこなわれる

# コード

```rb
case 1
  when Numeric then puts 'It is numeric!'
  when String then puts 'It is string!'
end

# => It is numeric!
```

```rb
case 'abc'
  when Numeric then puts 'It is numeric!'
  when String then puts 'It is string!'
end

# => It is string!
```

# 解説

それぞれ

```rb
Numeric === 1 # => true
```

```rb
String === 'abc' # => true
```

とかいう比較がおこなわれているっぽい。

ちなみにクラス名との比較は、左右を逆にすると `false` が返る。

```rb
1 === Numeric # => false
```

```rb
'abc' === String # => false
```

# 結論

case 文は与える値 ( `case ***` ) ではなく、判定条件 ( `when ***` ) の方を左辺に持ってくるようだ。意外だった。

# 環境

- ruby 2.3.1

# 参考

- http://stackoverflow.com/questions/948135/how-to-write-a-switch-statement-in-ruby








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qt5 + qmake + Windows + OpenGL でビルド

最近、MayaとQtを使った独自ビューワー組み込み検証の覚書です。
まずは、Qt5 + qmake + Windows + OpenGL を使用する環境でビルドを通すのに苦労したので、
必要な設定は、.pro ファイルに以下を最低限追加すればビルドが通りました。


開発環境
- Windows7 SP1 Pro
- VisualStudio2015 Pro
- Qt5.7


```qmake:opengl.pro
QT += opengl

win32 {

LIBS += opengl32.lib

}
```

参考にしたのは以下
http://stackoverflow.com/questions/31688370/qt-5-5-with-qmake-linker-cannot-resolve-opengl-function-calls
MySQL が起動しなくなった


## 構成
* VirtualBox 上のゲスト OS
* CentOS6.7
* MySQL14.14

## 結論
ディスク領域食いつぶしてた。
不要なファイル削除後に `service mysqld start` で無事起動。

## 道程

### ゲストOS起動時
なぜかやたらと遅かった。
ゲージが右端まで来ているのに、その次に進まない。
おそらくここで mysql の起動をしててタイムアウト待ちだったのだろう。

### 起動後にアプリが動作しなかった
mysql の起動に失敗しているのでそのせい。

### 起動ログを見よう
まず /var/log/messages を見にいった。
`tail /var/log/messages`
特に異常なし。

### mysql のログを見よう
`tail /var/log/mysqld.log`
怪しい行を発見する。
**[ERROR] Can't start server: can't create PID file: No space left on device**
意訳: デバイスに残りスペースがないのでPIDが作れなかったから起動できなかったよ。

### 容量チェック
`df -h`
/dev/mapper/vg_*************-lv_root の Use% が確かに 100% になっていた。
先日デプロイのテストをしたせいなのだろうが 6G 一気に使ったのか…。

### 適当に削除
不要なファイルを削除してまわり、無事起動。

## 教訓
ゴミファイルは消しましょう。
Apache Hadoopのユニットテストを回す


ユニットテストを回すオプションについてまとめました。開発者向けです。

## 普通に回す

```
$ mvn test -Pnative -Pshelltest
```

* `-Pnative`: ネイティブライブラリをビルドし、それが必要なテストを実行する
* `-Pshelltest`: シェルスクリプトのテストを実行する

このコマンドを実行すると全てのmoduleでテストしてくれるのですが、テストが失敗したmoduleで止まってしまい、全てのmoduleでテストを回すことができません。Apache Hadoopでは時々失敗するテストがいくつかあり、それが完全には修正されていないため、大抵はhadoop-hdfs moduleで落ちてしまい、それ以降のテストは実行されないということになります。各moduleのルートディレクトリに移動してテストをすればいいのですが、module自体が大量にあるので若干面倒です。

## 全moduleでテストを回す

全moduleでテストを回すには、qbt(quality build tool)というツールを使うのが楽だと思います。[Apache Yetus](https://yetus.apache.org/)というプロジェクトで開発されており、Apache Hadoopコミュニティのdaily buildにも含まれています。

* https://builds.apache.org/job/hadoop-qbt-trunk-java8-linux-x86/

  * この結果が毎日common-dev@hadoop.apache.orgに流れてくるので、そのメールを辿ることで、あるテストがいつから失敗しているのかがわかります
  * `git bisect`する際のヒントとして有用ですし、場合によってはわざわざ`git bisect`しなくても一発で原因がわかることもあります
  * また、時々失敗するテストを特定したい場合には、[`dev-support/determine-flaky-tests-hadoop.py`](https://github.com/apache/hadoop/blob/trunk/dev-support/determine-flaky-tests-hadoop.py)が有用です

以下のコマンドを実行すると、ローカルでテストを回すことができます。

```
$ dev-support/bin/qbt <path to the patch> --run-tests
```

コア数に余裕がある場合は、`--test-parallel=true`オプションをつけるとよいでしょう。

```sh:dev-support/bin/qbt
BINDIR=$(cd -P -- "$(dirname -- "${BASH_SOURCE-0}")" >/dev/null && pwd -P)
exec "${BINDIR}/yetus-wrapper" qbt --project=hadoop --skip-dir=dev-support "$@"
```

Apache Hadoopの`dev-support/bin/qbt`の実体はたったこれだけです。内部では、`yetus-wrapper`がApache Yetusをダウンロードして、そこに入っている`qbt`を実行します。

checkstyleなども一緒に回ってくれるので、開発者としては非常に便利です。試しに手元で動かしてみたときの実行ログをgistに貼っておきました。

* https://gist.github.com/aajisaka/348cd569b49af98c76248bd1627608d8

## 全てのmoduleのテストを回す必要性について

Apache HadoopのJenkins precommit job(パッチを投稿したら自動的に回るジョブ)では、投稿されたパッチによって変更されたmoduleに含まれるテストのみ実行します。通常の場合これは非常に有用で、不要なテストをスキップすることで、ジョブの時間短縮に非常に役立っています。ただし、あるmoduleの変更が他のmoduleに影響する場合、実行してほしかったテストが実行されない、という問題に引っかかります。例えば、[HADOOP-13514](https://issues.apache.org/jira/browse/HADOOP-13514)でmaven-surefire-pluginのバージョンを上げたのですが、それが原因で大量のユニットテストが失敗するようになってしまいました。他にも、YARNの変更によってMapReduceのユニットテストが失敗する、といったことはよく見かけられます。このように、他のmoduleにも影響しそうなパッチをコミットする前には、あらかじめ全てのテストを実行しておくことが必要です。

## (注意)ここから先の内容について

ここから先のオプションは、私が実際に試したことがないので、説明も少なめです。

## もっと高速にテストを回す

dist_testを使いましょう。

* https://github.com/cloudera/dist_test
* https://blog.cloudera.com/blog/2016/05/quality-assurance-at-cloudera-distributed-unit-testing/

GCEやEC2インスタンスを大量に立ち上げて、一気にテストを回すツールです。Apache Hadoopのテストは全部で1700以上あって、全てを回すのに8時間以上かかります。8コアで並列処理しても単純計算で1時間以上かかるのですが、このツールを使うと10分以内で終わらせることができます。

## S3クライアントのテストを回す

当然ですが、S3を利用するテストはデフォルトでは実行されません。設定方法は以下のドキュメントに書いてあるので読んでください。(丸投げ)

* https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html

Azure StorageやOpenStack Swiftのクライアントのテストについても同様です。

* Azure Storage: https://hadoop.apache.org/docs/stable/hadoop-azure/index.html#Testing_the_hadoop-azure_Module
* OpenStack Swift: https://hadoop.apache.org/docs/stable/hadoop-openstack/index.html#Testing_the_hadoop-openstack_module
perlとロケール

外部コマンドをガシガシ実行するスクリプトで、
日本語でインストールしたCentOSで、コマンド実行時だけ、
実行結果は全部英語で受け取りたい（受け取った文字列をチェックしたりするとして、、、）

実行後に$ENVで設定を変えておけば、とりあえず英語で結果を受け取れるけど、、、
runuserで別ユーザーでコマンド実行、とかすると、ダメだったので、
-cで実行するコマンドの最初に、exportで環境変数を設定した。。。

```perl:a.pl
#! /usr/bin/perl -w

use strict;
use warnings;

# CentOS6を、日本語でインストールした環境

# これは日本語で結果が出る。
system(qq(date));

$ENV{'LC_ALL'} = 'C';
$ENV{'LANG'} = 'C';

# 環境変数を変えてコマンドを実行

# これは英語で結果が出る。
system(qq(date));

# runuserで別ユーザーでコマンド実行、とかすると、
# 環境変数が変わるので、呼び出し元で環境変数いじってても、意味がない。
# これは日本語で結果が出る。。。
system(qq(runuser -l postgres -c 'date'));

# 仕方ないので、-cで実行するコマンドの最初に、
# exportあたりで、ロケールの設定を変えてから、
# コマンドを実行する。
# これは英語で結果が出る。
system(qq(runuser -l postgres -c 'export LC_ALL=C LANG=C; date'));

```

```text
[root@localhost ~]#
[root@localhost ~]# ./a.pl
2016年 12月  5日 月曜日 16:17:11 JST
Mon Dec  5 16:17:11 JST 2016
2016年 12月  5日 月曜日 16:17:11 JST
Mon Dec  5 16:17:11 JST 2016
[root@localhost ~]#
[root@localhost ~]#
```
認証済みのiOSアプリから、Safariへ認証用Token/Cookieを渡す方法

### 結論

Safariで開くURLに、One Time Passwordのような仕組みを利用した、一時的なTokenを埋め込む。
- 開くURLは基本httpsに限定すべき
- URLが漏れたとしても、有効期限が過ぎたら無効になる

### 調査した内容
- WebViewには、HeaderやCookieにTokenを渡せるが、Safariには出来ない
- 一時htmlファイルを書いて、その中にjavascriptでTokenをターゲットURLにPostする案もある。但し、この場合、該当一時htmlは公開領域に置く必要あり、脆弱性になり兼ねない

##### 参考：
http://stackoverflow.com/questions/7997010/open-request-in-safari-with-custom-http-headers
http://stackoverflow.com/questions/13196192/open-url-hosted-using-post-method-in-safari-using-sharedapplication-openurl-meth
http://stackoverflow.com/questions/9880922/ios-is-it-possible-to-open-nsurlrequest-directly-in-safari/9881108#9881108
Pythonの演習問題

## 問題
　ある$n$桁の自然数$m$、1桁目の数字は$a_1$と、2桁目の数字は$a_2$と、...$n$桁目の数字は$a_n$とします。次の条件が満たされる$m$をすべて見つけなさい。
$$m=a_1^n+\cdots+a_n^n$$

## 答え
桁数$n$は2から7まで取って計算してみました。

```
n=2

n=3
153 370 371 407 
n=4
1634 8208 9474 
n=5
54748 92727 93084 
n=6
548834 
n=7
1741725 4210818 9800817 9926315  
```

```code.py
for n in range(2,8):
    print("\nn=%d"%n)
    for i in range(10**(n-1), 10**n):
        x = sum((i // 10**j % 10)**n for j in range(n))
        if(x == i):
            print("%d "%i,end="")
```
ElectronでJSONデータを保存／読み込みする方法

Electronのアプリ開発において、ローカルファイルだけで完結する場合のデータ保管方法です。SQLite3でやろうか、ymlでやろうかいろいろ調べていたのですが、JSONが比較的扱いやすいようなので、JSONでデータを管理する方法を選択する方は参考にしてみてください。

## 材料
- electron-json-storage

前提としてElectronでHello World程度の環境は整っているものとします。

## 手順

### 1. NPMのパッケージをインストールする
プロジェクトルートのShellで以下コマンドを入力してインストールします。

```
npm install --save electron-json-storage
```
### 2. クライアントのJavascriptファイルに記述する
以下、サンプルプログラムとなります。

```
const storage = require('electron-json-storage');

var data = { // 仮のJSONデータの材料
    site_name: "Sample site",
    site_url: "http://sample.com"
};
storage.set('config.json', data, function (error) {　// 書き出し（sample/config.jsonとディレクトリを指定することも可能）
    if (error) throw error;
});
storage.get('config.json', function(error, data) { // 読み込みしてHTMLに書き出す
    if (error) throw error;
    document.getElementById("site-name").innerHTML = data.site_name;
    document.getElementById("site-url").innerHTML = data.site_url;
});
```
これで読み書きすることが可能。

### 3. データの保存先
ローカルで開発しているときには物理的にファイルが生成されているわけではないのか、参照先がみつかりません。パッケージ化してからファイル名で検索すれば保存場所がわかると思われます。

## まとめ
これは便利。fs.とかFile APIでゴニョゴニョやることもできますが、ローカルファイルの読み書きって結構面倒で、逆にhttp通信とかに乗せたほうが楽なんてこともあります。気軽にローカルデータを扱う方法として誰かの役にたったらいいなと思っております。

## （追記:2016年12月5日18:00）
２つ追加でお伝えしたいことがあります。

### ファイルの保存場所
#### MacのJSON保存場所
```
/Users/(username)/Library/Application Support/appname/
```
今回は勝手ながらmacOSアプリをつくっているのでWindowsは割愛します。

### 上記ディレクトリ内のパスを分けたい場合
保存場所がわかったところで、strage.setとstrage.getの第一引数に<code>'sample/sample.json</code>という具合にディレクトリパスを記述してもelectron-json-strageはmkdirしてくれませんので、そんなときはelectron-strageの方が良かった。（パッケージ化してみて確認、ディレクトリができていないことに気づき、別の方法を模索）
electron-json-strageの代わりに以下を試してみてください。

```Shell:Shell
npm install --save electron-storage
```
```Javascript：anywhere.js
const storage = require('electron-storage');

storage.get('mydir/sample.json', (err, data) => {
  if (err) {
    console.error(err)
  } else {
    //ここに処理
  }
});

storage.set('mydir/sample.json', data, (err) => {
  if (err) {
    console.error(err)
  }
});
```
これでパッケージ化してみると、こんなローカルディレクトリ構成になります。

```
/Users/(username)/Library/Application Support/appname/mydir/sample.json
```
これでJSONを用途に併せてディレクトリで分けて保存できますね。以上。
Eclipseを使ったgeb環境構築

以前チームでgebを使って自動回帰試験を試してみようという話になり、
担当者を決めてgroovy＋gradle＋spockのローカル開発環境を作ってみたはいいものの、
ローカル開発環境構築を担当したメンバーの趣味に偏りすぎて根付かずそのまま放置状態・・・。

当時のみんなの反応は以下のような感じ。。。
１． 普段eclipseみたいな統合開発環境でコーディングしているため、普通のエディタとコマンドラインで開発するのキツイ。
２． ビルドツールもmavenを使っているためgradleに馴染みがない。
３． java＋junitでもできるって聞いたけど・・・　。groovy＋spockにするメリットは？

食わず嫌いになる前に「お、動いた面白い！！」って感じてもらえるのが大切！！
すこしでも慣れ親しんだ環境で、まずは動かして見るところから始めようかと。
（２と３に関しては別途まとめてみようかと思います。）

ってわけで今回はチームで使い慣れたeclipseで開発環境を整えて見ようかと思います。。。
（本当はgradleなんかもちゃんとインストールしてコマンドラインから使えるようにしたほうがいいのかもしれないけど、今回はecliseのプラグインだけ入れれば使えるようにしようかと思います。）


##開発環境構築
・Eclipse　NEON（４．６．０）

###必要なEclipseプラグイン
・Buildship Gradle プラグイン
※　gradleプロジェクトを作成できる。gradleファイルをコマンドから作成するのがめんどくさい場合は、このプラグインが便利。
![image](https://qiita-image-store.s3.amazonaws.com/0/53143/ae4b647e-0be2-e8db-f817-e4bfcf232077.png)


・Gradle IDE Packプラグイン
※　必須ではないけどEclipseのメニューからrunしたりgradleファイルにエラーがある場合、エラー箇所を表示してくれるので便利。
※　IDE　packに入っているSTSプラグインでもプロジェクト作成できるけど、gradleファイルが微妙なので上記のBuildshipでプロジェクト作成したほうが良さげ。

![image](https://qiita-image-store.s3.amazonaws.com/0/53143/7963e937-3629-6cad-cbf5-6c3ab710a915.png)


・Groovyプラグイン
Marketplaceから探してみたけどバージョンが古い。。。ん〜どれ入れればいいんだ・・・。
とりあえず正式リリースではないが公式サイトにあるやつを手動で入れてみる。
https://github.com/groovy/groovy-eclipse/wiki
![image](https://qiita-image-store.s3.amazonaws.com/0/53143/72c2efb2-72be-2c39-412e-b43e817891b3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/53143/55d2f186-54f2-8333-2e0d-348eccdc7268.png)


##プロジェクト作成
####Gradle Projectからプロジェクトを新規作成
※先にも書いたけどSTSで作成すると内容がいろいろ変わってくるので注意。。。

![image](https://qiita-image-store.s3.amazonaws.com/0/53143/0cd4e80b-a742-f1c5-3ca9-36a901e17c60.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/53143/d53974b9-387e-2cf5-94e2-e38fb745cd88.png)


っであとはGroovy Projectに変換すればライブラリもろもろが設定されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/53143/e90c3a22-543a-a9fc-e84f-731d1e620efd.png)


##次回は
build.gradleにgroovyやspockの設定をしつつ、プロジェクトのパッケージ構成について考えていこうかと。
使うGem、使わないGem：個人的まとめ


## 個人的選定基準

### 良い

- 1つのGemで1つの機能など、やる事と使い所がシンプル
- 最悪Gemを外そうと思ったら外せる
  - 自分で書こうと思ったら書ける、Gem無しでも書けるっちゃ書ける
      - => 楽をする為にGemを使う
  - 外す時に何をやれば外せる／外せそうか分かる

### 悪い

- 1つのGemで多くの事をやっている、やろうとしている
- 一度入れたら実質、後から外せない
- Gem固有の知識、ノウハウが多い

## よく使うGem

- [action_args](https://github.com/asakusarb/action_args)
- [kaminari](https://github.com/amatsuda/kaminari)
- [ridgepole](https://github.com/winebarrel/ridgepole)
- [sidekiq](https://github.com/mperham/sidekiq)
- [config](https://github.com/railsconfig/config)
- [rails_admin](https://github.com/sferik/rails_admin)
- [exception_notification](https://github.com/smartinez87/exception_notification)
- [bullet](https://github.com/flyerhzm/bullet)
- [tapp-awesome_print](https://github.com/esminc/tapp-awesome_print)

## 極力使わないGem

- [devise](https://github.com/plataformatec/devise)
- [cancancan](https://github.com/CanCanCommunity/cancancan)

## Gemまとめ参考過去記事

- [Rails開発で有用な便利Gem一覧：2014年版 - Qiita](http://qiita.com/shu_0115/items/b9dd17c01e1e6bd65e71)
- [Rails開発で有用な便利Gem一覧：2013年版 - Qiita](http://qiita.com/shu_0115/items/f5f79154dd4e30a78fcd)
- [Rails開発で有用な便利Gem一覧 - Qiita](http://qiita.com/shu_0115/items/2378ed4549542c68ef46)
Xcode8でswiftc 2.3を起動する

競技プログラミング(主としてAtCoderやpaiza)でSwiftを使おうとすると、バージョン間の問題が出ます。
この2つに入っているSwiftは2.2で、Xcode8のSwiftは3であり、Swift3は2と互換性がないためです。
Xcode8には2.2ではありませんが2.3が入っているため、これを使うことで互換性問題を回避することができます。

`TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftc`
か、
`xcrun --toolchain com.apple.dt.toolchain.Swift_2_3 swiftc`
か、
`/Applications/Xcode.app/Contents/Developer/Toolchains/Swift_2.3.xctoolchain/usr/bin/swift`
で起動できます。symlinkを作るなら最後の方法が良いでしょう。

実際の開発でSwift2.3を使うにはXcodeプロジェクトの設定を変更します。そちらの情報は広く出回っているので割愛します。
Pugで属性に変数を使うやり方が変わってた

WordPressにはトップページにはhome、他ページにはIDやらスラッグ（要カスタマイズ）とかそういうのが設定されるbody_classという関数があります。

自分の作業フローとして、最初にHTML→WP化するというようなフローが多いのですが、そういうときにJadeだとJSONを読み込ませて、

```jade
//pathは変数
body(class='#{path}')
```
としてやることで、ページごとにbodyにclassを設定することができ、ページごとに変わるような部分を無理やり対処することができます。（なぜかフッターとコンテンツのマージンが特定ページだけ違う、特定ページだけコンテンツ部分のフォントカラーが違う、特定ページのコンテンツ部分のフォントが違うなどなど…）

他にもループする部分などに対して属性値に変数をセットすることが多かったのですが、Pugでは上記のコードは使えなくなってしまっていました。
ここが解決できないと思っていたのでPugへの移行はまだまだ先だな〜とか思っていたのですが、Github（たしかpugのIssue）を見てたら解決方法が載っていたためPugに移行することができました。

## 解決策

```jade
//pathは変数
body(class=path)
```

上記のコードで対応することができました。（もしかしたらJadeで昔からできてたのかもしれませんが、）これによりJadeで変数を用いてループする部分などをPugに置き換えることができてよかったという感じです😂

## 追記

butchi_yさんにコメントしてもらったのですが、PugはES2015記法に対応したみたいでバッククオートも使用できるようです。

```jade
//pathは変数
body(class=`${path}`)
```

また、参考にしたIssueのページも見つかりましたので掲載しておきます。
参考：[escaping variables, behavior has changed for attributes](https://github.com/pugjs/pug/issues/2302)
第8回つぶやき勉強会 ~ `||=` に魅せられて ~

**※今回の問題は、解答に確証も自信もありません。**

=> 正解らしいものを教えてもらったので、末尾に追記しました。


```rb
a ||= 1
```

上と同じことを、別の書き方で実現してください。


----

不正解 その1

```rb
a || (a=1)
# => NameError: undefined local variable or method `a' for main:Object
```

----

不正解 その2

```rb
a = (a||1)
```

これは、次のようなクラスがあった場合異なります。

----

恣意的で捻くれたクラスですが....

```rb
class Hoge
  def v
    @v ? nil : 1
  end
  
  def v=(val)
    @v = val
  end
end
```

----

ぼくなりの解答

```rb
(a=1 unless a) || a
```

いまのところ合っていると思ってるのですが、間違っているかもしれません。ぜひ反例を教えてください。 :bow_tone4:

別解答

```rb
if defined?(m) && m then m else m = 1 end
```

----

# 以上です。ありがとうございます。


----

# 追記

https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators

上のリンクに以下のような記述がありました。

```rb
x = "(some fallback value)" unless respond_to? :x or x
```

たぶん、これが正解で、ぼくの解答は少し間違っていると思います。ただ、反例を導き出す元気が今はありません。 m(..)m
Sunnychatの1年を振りかえる

この記事は[Supership株式会社 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/supership)の5日目の記事になります。

Supership新規サービス開発室のデザイナー@ottieeです。

[@astapi](https://twitter.com/astapi)、@t-kashimaに続きまして、3連続となりますが弊社サービスSunnnychat （[iOS](https://itunes.apple.com/jp/app/sunnychat-chaohappinachatto/id1134862745?mt=8)/ [Android](https://play.google.com/store/apps/details?id=space.amigo&hl=ja)）について書かせていただきます。

こんなこと話します。

- Sunnychatの歴史
- 開発スタイル
- 良かった点
- 悪かった点
- おわりに

## Sunnychatの歴史
![sunnychat_1024x500.png](https://qiita-image-store.s3.amazonaws.com/0/75363/ecec999c-d142-20f4-a20c-249e43122822.png)

SunnychatはもともとAmigoというサービスとして開発されていて、こちらのファーストリリースは2015/10/14です(Android先行)。そこから考えると、リリースしてから1年以上経過していることになります。

![1024x500.png](https://qiita-image-store.s3.amazonaws.com/0/75363/c1d9390c-f76e-289d-9fa7-2c31ee6401d3.png)
<strike>(Amigo時代のビジュアル、もはや別物)</strike>

動画をきっかけにコミュニケーションを生み出す、という軸はぶれていないのですが、ユーザーのフィードバックを得ながらすばやく直す、というスタイルで開発しているため、過去には

- 位置情報を使って近くの友達がわかる
- 自分の動画をアップすると初めて友だちの動画がみれる
- 投稿した動画はすべての友だちに公開される
- 起動すると自動で動画が撮影される
- 投稿した動画にだれでもスタンプやテキストをのせられる

のような機能がありましたが、今はすでに無きものとなり、現在はグループを軸にした、よりコミュニティに近い方向性へ進化していっています。

ちなみに、サービス名が変わったのは、商標の問題や、言葉のイメージが男性すぎるという指摘があったりしたためなのですが、Sunnychatという言葉の響きは気に入っています。

なお、Sunnychatとしての正式リリースは2016/8/1となっています。
http://jp.techcrunch.com/2016/08/02/supership-sunnychat/

## 開発スタイル
### 考え方
開発スタイルとしてはLEAN UXに近しいやり方です。大事にしていた考えは以下のようなところです。

- サービスの仮説検証のために不要なことは削ぐ
- 初期のデザインは間違っているという認識を持つ
- ユーザー体験を判断基準として物事を決める

### 作り方
小さく作り、フィードバックを得て、素早く直すスタイルで進めています。

Sunnychatチームでは、機能や仕様に関するおおざっぱな議論を終えたら、すぐに画面デザインに入ります。
そして完成系に近いデザインを元に、メンバーで意見を出し合い、さらに詳細を詰めていきます。「作ってみないとわからないから作っちゃおうぜ！」スタイルです。

### 進め方
現在では2週間単位のイテレーションでスクラム開発していますが、間隔などは柔軟に調整しています。情報共有や仕様の検討などはGitHubのIssueに集約、タスクは物理かんばんで管理しています。

## 良かった点
1年を振り返って、良かった点を振り返ります。

### 開発の速度
初期段階から比較して、チームメンバーは倍以上になっていますが、チームとしての開発速度はキープできていたように思います。ミーティングが少ない、というのも要因の一つだったかと思います。

### メンバーに恵まれていた
- 得意分野がきちんとある
- 得意分野以外の周辺知識がある
- 主体性がある
- ユーザーのことを考えながら開発できる

運良くこういうメンバーばかりの開発チームなので助かっています。サービス開発はメンバーがフィットするかが一番重要、と思っています。

### デザインから始める開発
デザインを起点にメンバー間であーだこーだ議論しつつ進められたのは良かったと思います。どこの開発現場でも適応できるかは未知ですが、Sunnychatチームにはあっていたように思います。エンジニアからUIの提案がばしばし出てくるとか最高です。

## 悪かった点
続きまして、悪かった点を振り返ります

### Androidファーストでやってしまった
振り返ると、これが最大の失敗でした。エンジニアがいなかったとか、Appleの審査リスクを恐れすぎていた、という理由からの判断でしたが、これはあきらかにミスでした。

理由としては、

- 動画系のサービスなのでAndroidの非力さに対応するのに余計なコストがかかる
- ターゲットにしているユーザー層はAndroidを使っていなかった

2番目の理由の方が致命的で、ユーザーテストがそもそも困難、社内テストでも参加者の確保が難しい、そのためユーザーのフィードバックを得られる機会が少ない、という悲しみがありました。現在はiOSもリリースされているので、この問題は回避できています。

### ドキュメントの無
今でこそGitHubで集約する形になりましたが、人が増える前のタイミングで整備しておけば良かったな、と思っています。新メンバーに初動の混乱を与えてしまったと反省してます。

## おわりに
Sunnychatは動画をきっかけにコミュニケーションを楽しむサービスです。動画系のサービスは続々と出ていますが、ぜひSunnychatも使ってみていただければ幸いです。

[iOS](https://itunes.apple.com/jp/app/sunnychat-chaohappinachatto/id1134862745?mt=8)
[Android](https://play.google.com/store/apps/details?id=space.amigo&hl=ja)

[Supership株式会社 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/supership)、6日目はSupershipが誇るiOSエンジニア、@koogawaです！お楽しみに！
Nimで拡張子検索ツールを作ってみる

# 概要

指定したフォルダ内に含まれるファイルの拡張子をカウントした結果をコンソールに出力するユーティリティを作成してみます。
ほとんどソースのみですいません。

## ソース

```nim:lsext.nim
# 指定フォルダ配下の拡張子とその数を取得する

import os
import tables
import algorithm
import future

# 指定フォルダを再帰で探索し、(拡張子：個数)を返却する
proc get_ext_list_impl(startPath:string): Table[string,int] =
  result = initTable[string,int]()

  # 再帰で探索
  for f in startPath.walkDirRec :
    if f.existsFile :
      let (_,_,ext) = f.splitFile
      var ext2 = ext
      # 拡張子なしもカウントする
      if ext == "" :
        ext2 = "noext"
      # 既に格納されているか確認
      if result.contains(ext2) == false :
        result[ext2] = 0
      # カウントアップ
      result[ext2] += 1

# メイン関数
proc main(args:seq[string]):int =
  # メイン処理
  result = 1
  # 対象パスを特定(対象フォルダを１つだけ指定)
  # 対象パスがない場合は、カレントディレクトリを検索対象とする
  let path =
    if args.len == 1: args[0]
    else: "."

  # ディレクトリチェック
  if path.existsDir == false :
    echo "directory(",path,") is not exists"
    # プログラム終了
    return

  # フォルダを探索し、拡張子と頻度を取得
  let ret = get_ext_list_impl(path)

  # 内包表記で、キー一覧を取得
  let keys = lc[ k | (k <- ret.keys), string ]

  # キーをソートして、カウンタを表示する
  for k in keys.sortedByIt(it):
    echo k,"\t",ret[k]

  # main関数の戻り値
  result = 0

when isMainModule:
  # 引数を取得
  let args = commandLineParams()
  # メイン関数を実行
  quit(main(args))
```

```
# 実行結果
# (noext(拡張子なし)が３２個あるのは.gitフォルダ内のファイルでした)
$ lsext .
.c	14
.json	2
.md	1
.nim	5
.o	14
.sample	9
noext	32
```
Atomでコーディング中にPug（旧Jade）でEmmetが発動しないのをどうにかする

タイトルそのままなのですが、Jade→Pugに環境を切替えた時に、Emmetが発動しなくて非常にストレスが溜まっていました。（最初にJadeで作成し、Pugに拡張子を変更する。やってられないのでJadeにするなど。）

まあ対応するまで待てばいいか〜っていう気持ちだったのですが、なんかいつまで待っても対応してくれそうにないのでググって解決方法を探したらありました。

## 解決法

[file-types](https://github.com/execjosh/atom-file-types#extension-matchers)というプラグインを導入し、*.pugを*.jadeとして認識させてあげます。

Atom→個人設定（config.cson）に、

```coffeescript
"file-types":
  pug: "source.jade"
```

を貼りつけ、保存した後Atomを再起動します。

![index_pug_—___github_ore_no_base.png](https://qiita-image-store.s3.amazonaws.com/0/39134/230ae1c1-b046-8ef5-42ae-ef066239d1fc.png)

いままでタブを押してもEmmetが発動せず、スペースやタブが入力されていたものがEmmetで展開されるようになりました😂

参考：[Emmet to Jade in Atom?](https://github.com/emmetio/emmet-atom/issues/354)
Angular2 の quickstart を試していたら GET /traceur 404 (Not Found) が出て二進も三進も行かなくなった場合の対応方法

取り急ぎ、

```
$ npm install plugin-typescript --save
```

`plugin-typescript` をインストールして、 

```
$ git diff systemjs.config.js
diff --git a/systemjs.config.js b/systemjs.config.js
index ...
--- a/systemjs.config.js
+++ b/systemjs.config.js
@@ -4,9 +4,28 @@
  */
 (function (global) {
   System.config({
+    transpiler: 'ts',
+    typescriptOptions: {
+      // Copy of compiler options in standard tsconfig.json
+      target: 'es5',
+      module: 'commonjs',
+      moduleResolution: 'node',
+      sourceMap: true,
+      emitDecoratorMetadata: true,
+      experimentalDecorators: true,
+      lib: [ 'es2015', 'dom' ],
+      noImplicitAny: true,
+      suppressImplicitAnyIndexErrors: true
+    },
+    meta: {
+      typescript: {
+        exports: 'ts'
+      }
+    },
     paths: {
       // paths serve as alias
       'npm:': 'node_modules/'
     },
     // map tells the System loader where to look for things
     map: {
@@ -24,8 +43,10 @@
       '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',

       // other libraries
       rxjs: 'npm:rxjs',
+      ts: 'npm:plugin-typescript/lib/plugin.js',
+      typescript: 'npm:typescript/lib/typescript.js',
       'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js'
     },
     // packages tells the System loader how to load when no filename and/or no extension
     packages: {
       app: {
-        main: './main.js',
-        defaultExtension: 'js'
+        main: './main.ts',
+        defaultExtension: 'ts'
       },
       rxjs: {
         defaultExtension: 'js'
```

`systemjs.config.js` を修正する。
VirtualBoxを使う時の枝葉末節

# SSHへのポートフォワーディング

Windows上でVirtualBoxでCentOS等を動かしているが、そこへTeratermなどでSSHする時の設定。

「仮想マシン」メニュー →「設定」
→「ネットワーク」
→「アダプタn」(NATで割り当てているアダプタ、「高度」を開く)
→ ポートフォワーディング

以下の感じで設定する。

| 名前 | プロトコル | ホストIP | ホストポート | ゲストIP | ゲストポート |
|------|------------|----------|--------------|----------|--------------|
| ssh  | TCP        |          | 3333         |          | 22           |

そして他の端末からこのWindowsのIPアドレスのポート3333にSSHすると、ゲストの中に入ることが出来る。

# 時刻合わせ

VirtualBoxでLinuxを立ち上げたまま、ノートPCをサスペンドして移動して、再度開きなおした時、大幅に時間がずれていることがある。

これはExtension Packを入れることで解決できるそうだが、自分以外のVirtualBox利用者と条件を合わせるために余計なものを入れたくないので、てっとり早くNTPを使用して時刻を合わせている。

自分はbashで以下を定義をしている。

```
alias adjust-date='sudo ntpdate -s -v <社内NTPサーバ>; tail /var/log/messages; date'
alias adjust-date-global='sudo ntpdate -s -v 133.243.238.164; tail /var/log/messages; date'

```
会社内だと上を使う。
社外にいるときは下を使う。133.243.238.164はntp.nict.jpのアドレス。名前が引けるなら名前の方で書けばよい。
mac購入後の開発環境整えるメモ

+ chromeインストール
    + AutoMator にて chrome のオブプション起動設定
    + `/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --allow-file-access-from-files --disable-web-security`
+ [隠しファイル表示](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html)
+ [拡張子表示](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-the-filename-extension-of-a-file-always-in-macos.html)
+ キーボード設定
    + ファンクションキーを使用するに設定
    + キーリピート最速
    + リピート開始時間最短
    + 修飾キー caps lock を control に変更
    + 入力ソース google 日本語入力 へ変更
+ マウス設定
    + [Logicool Option](http://support.logicool.co.jp/ja_jp/product/options) インストール(MX-Master用)
    + [Mouse Acceleration](http://triq.net/articles/mouse-acceleration-preference-pane-mac-os-x) インストール
+ [homebrew](http://brew.sh/index_ja.html)
+ [Docker](https://www.docker.com/products/docker#/mac) インストール
+ [git](https://git-scm.com/download/mac) インストール
    + [ssh登録](http://qiita.com/Mitsunori_Tsukada/items/6886f1f28d9485484822)
    + [tig](http://qiita.com/kenju/items/13313429df707fecfadf)
+ [Dropbox](https://www.dropbox.com/ja/install)
+ Slack - App Store にてインストール
+ [Sublime Text 3](https://www.sublimetext.com/3)
    + Preferences -> Browse Packages -> Userディレクトリにテーマファイルを入れる
    + Package Control
    + Abacus
    + [BracketHighlighter](https://packagecontrol.io/packages/BracketHighlighter)
    + GitGutter
    + Origami
    + SyncedSideBar
+ Xcode - App Store にてインストール
+ [google drive](https://www.google.com/intl/ja_jp/drive/download/)
+ [Hyper Switch](https://bahoom.com/hyperswitch)

sublimeのkeybind

```
[
    { "keys": ["ctrl+shift+tab"], "command": "prev_view" },
    { "keys": ["ctrl+tab"], "command": "next_view" },
    { "keys": ["ctrl+l"], "command": "move", "args": {"by": "characters", "forward": true } },
    { "keys": ["ctrl+h"], "command": "move", "args": {"by": "characters", "forward": false } },
    { "keys": ["ctrl+j"], "command": "move", "args": {"by": "lines", "forward": true } },
    { "keys": ["ctrl+k"], "command": "move", "args": {"by": "lines", "forward": false } }
]
```
EC-CUBEの勉強会に参加してみよう

EC-CUBEで相談したいことがあるのだけど、どうしたらいいのだろう？
EC-CUBEでネットショップ運営している仲間が欲しいけど、どこに行けばいいのだろう？

そんな方におすすめしたいのがEC-CUBEユーザーグループの勉強会です！
というわけで、最近参加した名古屋ユーザーグループのレポートも兼ねてご紹介したいと思います。

## EC-CUBE名古屋ユーザーグループの勉強会に参加してきました

2016/12/3(土)に開催されたEC-CUBE名古屋ユーザーグループの勉強会に参加してきました。

今回のテーマはこちら▽
<b>【EC初心者向け】ECコンサル夫にしごかれながら、デザイナー妻がECサイトをはじめてみる | EC-CUBE名古屋 vol.38</b>
https://ec-cube-nagoya.doorkeeper.jp/

ECサイトをオープンすることになったWebデザイナーの奥様が、
「こういう人たちに向けて商品を売って行きたい」
「サイト構成は最近のECサイトのデザインで、値段は他のサイトを参考にしてこれぐらいで～」
といった内容をECコンサルのご主人にプレゼンしたところ「絶対に失敗する」と言われたところが始まり。
`3C分析`や`MQ会計`を使い、どのように商品の売り方やサイト構成を決めていったのかを紹介してもらいました。

私自身はお店を運営しているわけではありませんが、
実際にEC-CUBEを利用されているユーザーの方が、どのように考え、分析して、サイト構築行っていくのかを知れたのは良い勉強になりました。
（残念ながら今回は突っ込んだお話が多くスライドは公開されていませんが）

今回のように名古屋のEC-CUBE勉強会は、幅広いテーマ(エンジニア～ショップ運営者向け)のお話を聞けるのが特徴です。
実際にEC-CUBEでショップを運営者されている方の参加者がほとんどでした。

名古屋のEC-CUBE勉強会は毎月開催されており、はじめての方でも参加しやすい勉強会です。
EC-CUBEのメインコミッターである[@nanasessさん](https://github.com/nanasess/)も毎回参加されていますので、質問などもできますよ。
勉強会後の懇親会(飲み会)もありますので、ぜひ一度参加されてみてはいかがでしょうか？

## 全国のEC-CUBEユーザーグループ

全国のEC-CUBEユーザグループの情報はFacebookグループのページで見つけることができます。
勉強会以外にイベントの情報なども投稿されていますので、まずはFacebookグループに参加してみてはいかがでしょうか？

#### EC-CUBE関西ユーザグループ
勉強会を不定期開催。もくもく会なども。
EC-CUBEコミッターの参加が多く質問できます。
https://www.facebook.com/groups/358761007526519
https://ec-cube-kansai.doorkeeper.jp/

#### EC-CUBE名古屋ユーザーグループ
毎月勉強会を開催。
技術面だけでなく、EC運営についてのお話も聞けます。
はじめての方でも参加しやすい雰囲気の勉強会です。
https://www.facebook.com/groups/eccube.nagoya.user
https://ec-cube-nagoya.doorkeeper.jp/

#### EC-CUBE東京ユーザーグループ
毎月１回開催。
技術者向けと初心者向けを隔月で開催しています。
https://www.facebook.com/groups/283598911686452

#### EC-CUBE千葉ユーザーグループ
2019年に立ち上がりました！
EC-CUBEの話題だけでなく「業務の無駄を省いて1%でも利益率を上げよう！」といったEC全般に関わるテーマでも開催されています。
https://www.facebook.com/groups/eccube.chiba/

#### EC-CUBE九州ユーザーグループ
https://www.facebook.com/groups/493909040638938

## 活動してくださっているEC-CUBEユーザーの方

#### EC-CUBEさいたま
埼玉でしらこさん([@96ssbike](https://twitter.com/96ssbike))が中心となってEC-CUBEの勉強会をされています。
もし興味がある方はtwitterで声をかけてみてはいかがでしょうか？
Ruby Vectorで2点間の距離を求める


```ruby
require "matrix"

v1 = Vector[14.0, 21.0]
v2 = Vector[17.0, 17.0]
(v2 - v1).r
  # => 5.0
  # (v2 - v1).magnitude
  # (v2 - v1).norm
  # も同じ
```
IntelliJとかの tool window（左右や下にあるやつ）の横方向と縦方向の優先順位みたいなやつの設定


普段、下のメッセージとかを表示するツールウィンドウを、ウィンドウの横幅いっぱいまであるレイアウトにしておくことが多いけど、左右のほうをウィンドウの高さいっぱいにするレイアウトにもできるらしい。  
で、特に極端なワイドスクリーンというわけでもないのに、後者のレイアウトにしてしまっていて、どこで設定を治すのかわからなかったので、調べた結果のメモ程度に書いた。

## よくみるほうのレイアウト（normal layout）
普段よく見る感じのレイアウトっていうのは、これのこと。

![よくみるほうのレイアウト.png](https://qiita-image-store.s3.amazonaws.com/0/29233/eeae3757-8a72-971b-a144-59af5906da0d.png)

## ワイドスクリーン用のレイアウト（widescreen tool window layout）
横長な画面のときは、こっちのほうが需要があるらしい。しらんけど。

![ ワイドスクリーン用のレイアウト.png](https://qiita-image-store.s3.amazonaws.com/0/29233/9d643d1d-81de-0b30-d4eb-40d41de87754.png)

## 設定する場所
以下の設定項目をon/offすると切り替えられる。

> Settings (Preferences on Mac) | Appearance & Behavior | Appearance | **Widescreen tool window layout**

![Widescreen tool window layout.png](https://qiita-image-store.s3.amazonaws.com/0/29233/b88e9291-361b-9530-f767-c08e041e3479.png)

## 参考
[IDEA dock window layout(stack over flow)](http://stackoverflow.com/questions/4244815/idea-dock-window-layout)
[IDEA-110618 Allow left or right tool windows to dominate layout](https://youtrack.jetbrains.com/issue/IDEA-110618)
確率微分方程式


```math
```

# 定義
確率空間とは、三つ組 $ \( \Omega, \mathcal{F}, P\) $ である。
$\Omega$は根源事象$\omega \in \Omega$からなる集合、$\mathcal{F}$は$\Omega$上の$\sigma$-加法族、$P$は$A \in \mathcal{F}$に確率$P(A)$を対応させる関数である。
```math
dX_t = \mu(X_t)dt + \sigma(X_t)dW_t
```
R / RStudio > 処理したテーブルをcsv形式で出力する > Open Frame使用のマニュアル作業

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

処理したテーブルの特定の行をcsv形式で出力したい。
出力対象となるデータは160列になる。

### ファイル書き出し (失敗偏)

参考
http://cse.naro.affrc.go.jp/takezawa/r-tips/r/45.html

xtableに読込んだファイルを16行目から1列飛ばしでsigに格納する。
そのsigをcsvに出力しようとした。

```
sig<-xtable[c(seq(16,ncol(xtable),2))]
for (i in 1:(length(sig)-1)) {
   out <- cbind(out, sig[i]) 
   out <- cbind(out, ",")
}
out <- cbind(out, sig[length(sig)])
write(out, file="new.txt", ncolumns = 2*length(sig))
```

以下のエラーが出た。勉強不足。

>Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class "c("file", "connection")" to a data.frame


### 別の方法

以下は思いつきの方法

1. View(sig[c(1:100)])
2. 右クリック「Open Frame」
   - テーブルのみのウィンドウが開く
3. 該当行を選択
4. Ctrl+c
5. 新規テキストにCtrl+v
6. １列ごとに改行となるので、改行('\n')を','に置換
7. View(sig[c(101:ncol(sig))])に対しても手順1-6を繰り返す。

1行だけ抜き出したいときには使える。複数行に対しては面倒。

Rのファイル処理の勉強はまた今度。
GSON使ってみる

# はじめに
GSONとはJSON文字列とJavaのオブジェクトを相互に変換（シリアライズ/デシリアライズ）するためのライブラリです。Google製。

# Androidプロジェクトに導入
build.gradleに書きましょう
書いたらSync Project with Gradle Filesして完了。

```text:build.gradle
dependencies {
    compile 'com.google.code.gson:gson:2.4'
}
```

# Modelクラス定義
こんな感じで。
ここらへん確認しとけばいいでしょう。
変数名とJsonのキー名が完全一致している場合、@SerializedNameアノテーションは指定しなくても問題ないです。
SubModel.mDataみたいに一致しないときはJsonのキー名を指定してあげましょう。

```Java:GsonSampleModel
import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

class GsonSampleModel {
    int num;
    float floatNum;
    String data;
    List<String> dataList;
    ArrayList<String> dataArrayList;
    HashMap<String, String> dataHashMap;
    InnerModel subModel;
    List<InnerModel> innerModelList;
    ArrayList<InnerModel> innerModelArrayList;
    HashMap<String, InnerModel> innerModelHashMap;

    class InnerModel {
        @SerializedName("data")
        String mData;

        InnerModel(String data) {
            mData = data;
        }
    }
}
```

# 使い方
お手軽ですねー

```Java:GsonTest
import com.google.gson.Gson;

public static void main(String[] args) {
    // Model生成
    GsonSampleModel model = createModel();

    // Gson初期化
    Gson gson = new Gson();

    // GsonSampleModel→Stringへの変換（シリアライズ）
    String json = gson.toJson(model);
    Log.d("sample", json);

    // String→GsonSampleModelへの変換（デシリアライズ）
    GsonSampleModel deserializedModel = gson.fromJson(json, GsonSampleModel.class);
    Log.d("sample", deserializedModel.toString());
}

private GsonSampleModel createModel() {
    GsonSampleModel model = new GsonSampleModel();
    model.num = 100;
    model.floatNum = 100.11f;
    model.data = "データ";
    model.dataList = Arrays.asList("でーた１", "でーた2");
    model.dataArrayList = new ArrayList<>(model.dataList);
    model.dataHashMap = new HashMap<>();
    model.dataHashMap.put("1", "でーた1");
    model.dataHashMap.put("2", "でーた2");
    model.subModel = new GsonSampleModel().new InnerModel("いんなー");
    model.innerModelList = Arrays.asList(
            new GsonSampleModel().new InnerModel("いんなー1"),
            new GsonSampleModel().new InnerModel("いんなー2")
    );
    model.innerModelArrayList = new ArrayList<>(model.innerModelList);
    model.innerModelHashMap = new HashMap<>();
    model.innerModelHashMap.put("1", new GsonSampleModel().new InnerModel("いんなー1"));
    model.innerModelHashMap.put("2", new GsonSampleModel().new InnerModel("いんなー2"));

    return model;
}
```
New Relic APM を使ってシステムの全体像からアプリ連携の問題箇所を簡単に特定しよう

アドベントカレンダー５日目。New Relic APM のサービスマップ機能についての説明です。

サービスマップは、システムで複数のサービスやアプリを連携して使っている際に、非常に便利な機能となっています。

サービスマップは、以下のようなシステムの全体像を俯瞰して確認できるマップです。

![qiita_service_map.png](https://qiita-image-store.s3.amazonaws.com/0/46003/b39faee1-3271-e1ff-fab2-07bbd65c572f.png)

- どのサービスが連携しているのか？
- 各サービスの状態はどうか？（アラートが出ていないか？）

と言ったことが確認できます。

このマップは自動的に作成され、同じ New Relic アカウントで管理しているアプリであれば、このマップを見れば、全体像を把握できます。
そのため、複数部署に分かれて開発されている場合でも、なるべく同じアカウントでアプリを管理することをオススメします。

## 何が嬉しいのか？

このマップの一番の利点は、例えば、サービスAがサービスBを呼び出していた場合に、サービスAで何かアラートが出た場合に、それが、サービスAの問題だけの問題なのか？サービスBで障害が起きており、その結果、サービスAも影響をうけて、サービスAでもアラートがでているのか？が一目で分かることです。そのため、サービスAを散々しらべた結果、実際は、サービスBの問題だったと分かるといったことが減ります。

これにより、複数チームで開発している場合は、マップを共有することで、同じコンテキストでトラブルシューティングができるので、コミュニケーションがスムーズに進みます。

これは、アカウントで管理しているアプリ間だけでなく、外部サービスを利用していた場合も同じです。但し、これらのアラートの状態を正しく把握するのには、適切にアラート設定がされていることが必要となります。

アラート設定に関しては、アドベントカレンダー４日目の記事「[新アラートサービス: New Relic Alerts と今後予定されているアラートの新機能に](http://qiita.com/kumatronik/items/df67b28a2064a188d758)」をご覧ください。

また、連携しているデータストアの正常性を把握できます。こちらに関しては3日目の記事「[New Relic APM でデータストアをインスタンス単位でパフォーマンスを表示](http://qiita.com/kumatronik/items/9f5f20cf6c164064721a)」に詳しく解説していますので、そちらをご覧ください。

### 簡単に各サービスのパフォーマンスもチェックできる

サービスマップでは、各サービスの状態だけでなく、現在の具体的なパフォーマンスも簡単に見ることができます。各サービスをクリックすると、以下のように直近30分のパフォーマンスの概要が簡単に見れます。そのため、いちいち、各アプリの Overview ページなどに移動しなくても、全体像を見ながら、各サービス、レイヤーのパフォーマンスを確認できます。

![qiita_service_map_2.png](https://qiita-image-store.s3.amazonaws.com/0/46003/b425a39c-eec0-2d70-0cde-e23cd65850a6.png)


## 誰が使えるの？

サービスマップは、PRO プランを使っている方のみが利用できます。

## 併せてよみたい

サービスマップに関する詳しい説明はドキュメント「[サービスマップ: アプリケーションのアーキテクチャ全体を視覚化して監視する](https://newrelic.degica.com/docs/data-analysis/service-maps/get-started/service-maps-visualize-monitor-your-apps-entire-architecture)」もご覧ください。

## まとめ

どうでしたでしょうか？ 現在のソフトウェアは、モノリシックな方向から、マイクロサービス（とまではいかなくても）など複数サービス連携が当たり前となってきています。そのような状況に非常に適した機能となっています。

この機能を、効率よく問題を特定し、チーム間で問題を共有し、素早く問題を解消することに役立てみてはいかがでしょうか。
Firebase の Remote Config

はじめまして、masaoです。
今回は「[Firebase](https://firebase.google.com/)」の「[Remote Config](https://support.google.com/firebase/answer/6386651)」という便利機能を紹介しようと思います。
私はAndroid開発をメインでしているので、基本javaでコードは書きますが、iOSでもできるので安心してください。

「[Firebase](https://firebase.google.com/)」とは何かというと、Mobile Backend as a Service(MBaas)の一つなのですが、
アカウントを作成し、SDKをアプリに導入するだけで、サーバのセットアップやメンテナンスをする必要がなく、
簡単にオンラインデータベースを使用したり、アナリティクスを使って分析をすることができるサービスです。

## Remote Config

### Key Value
Remote Configとはなにかと言うとシンプルなKeyValueストアです。
例えば、ストアに`{ hoge: fuga }` を登録しておいて、Androidアプリで

```java
 firebaseRemoteConfig.getString("hoge");
```
と設定すると、`fuga`を出力してくれます。
これらは何に役に立つのかというと、WEBコンソール上で設定することができて、公開を押すだけでアプリに反映されます。
例えば、チュートリアルのダイアログをだしていたとして、その文言や内容を変更しようとしたとき、
アプリに直接記述している場合はアプリをリリースしなければなりません。

ですが、チュートリアルの文言を `{ tutorial1: ここをタップしてください }` と言った具合に登録しておけば、
変更したい場合にアプリをリリースする必要がなく、コンソール上で変更して公開するだけで完了します。

```java
firebaseRemoteConfig.activateFetched();
```
を設定してあげれば、値を更新してくれます。ただし、Firebaseのプランによっては1日あたりのFetch回数に制限があるので気をつけてください。
また、デフォルト値を読み込みたい場合は以下を設定するとストアのデフォルト値を読み込んでくれます

```java
firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);
```

機能紹介にあるように `#000000` みたいにカラーコードを設定してあげれば、コードを変更せずに、
画面の背景色等を変更することができます。


### A/Bテスト
そのほかの機能としてABテストの機能があります。
登録したKeyValueの編集ボタンを押すと右上に「条件値を追加」があるのでクリックしましょう。
すると下記のような画面がでるので、アプリを選択して、条件名と適応する条件を設定しましょう。
下の場合だと30%のユーザーに適応する設定になっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/99977/21ab518f-1278-6f79-4581-5a4f5674179f.png)

そして、条件を作成すると先程設定した条件が出てくるので、
条件に当てはまるユーザーに表示するValueを設定しましょう。
今回は「fugafuga」を設定しました。これで条件を満たしたユーザーには「fugafuga」が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/99977/d2ca71cb-2820-29b0-9877-96cd7bcda480.png)

このように、条件を追加すればA/Bテストを簡単に行うことができます。
コード上で難しいif文やcase文を使わなくても良くなるし、テストが終われば、条件を削除すればいいだけなので、
A/Bテストを始める時、終える時にリリースは必要ないのです。

条件も様々な条件を設定することができ、自分で設定した[ユーザープロパティ](https://firebase.google.com/docs/analytics/ios/properties)や言語、バージョンなど様々な条件があるので非常に使いやすいです。


## おわりに
ここまで紹介しておいて何なのですが、私のプロジェクトにはまだ Remote Config は導入できていません...汗
ですが、非常に便利な機能なので、ぜひ皆さん活用してみてください！
Autoprefixerでベンダープリフィックス自動付与する

ここまでで、PostCSSの仕組みとそのプラグインはどういうものなのか、そしてPostCSSのAPIを使ってASTを操作する方法と、プラグインの作り方を説明しました。

Webアプリを作る業務では、実際にASTを変換してCSSに独自の処理をおこなうのではなく、既存のプラグインを組み合わせることが多いです。今日から何日かは、PostCSSのプラグインとしてよく使われているものを紹介していきます。

## Autoprefixer

PostCSSのプラグインとして最も有名なのが [Autoprefixer](https://github.com/postcss/autoprefixer) でしょう。「PostCSSは知らなかったけど、Autoprefixerは使っている」という人も少なくないと思います。PostCSSも元々はAutoprefixerを作るために生まれました。

```css
.example {
  display: flex;
  user-select: none;
  -webkit-border-radius: 3px;
  border-radius: 3px;
}
```

例えば、上記のようなCSSを下記のように変換します。

```css
.example {
  display: -ms-flexbox;
  display: flex;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
  border-radius: 3px;
}
```

`display` プロパティの値としてIE用のベンダープリフィックスとして `-ms-flexbox` が追加されていることがわかります。他にも `user-select` プロパティには `-webkit-`, `-moz-`, `-ms-`プリフィックスが付与されています。また、入力となるCSSには `-webkit-border-radius` というプロパティが書かれていますが、最近のChromeやSafariでは `border-radius` プロパティにベンダープリフィックスは必要ないので、これは削除されています。


### 使い方

AutoprefixerはPostCSSのプラグインとして実行する他に、それ単体での実行も可能で、Rails上で実行するためのRailtieとしての実装、静的サイトジェネレーターのMiddlemanの拡張としての実装もあります。

- [autoprefixer-rails](https://github.com/ai/autoprefixer-rails)
- [middleman-autoprefixer](https://github.com/middleman/middleman-autoprefixer)

今回はPostCSSのプラグインとして、1日目で説明した [postcss-cliで実行する方法](http://qiita.com/morishitter/items/405fa14999737407dbb8#postcss%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95) を説明します。

まずは、npmからautoprefixerをインストールします。

```bash
$ npm install -D autoprefixer
```

そして、`.postcssrc.json` を以下のように記述します。

```json
{
  "use": [
    "autoprefixer"
  ],
  "input": "input.css",
  "output": "output.css"
}
```

### オプションでサポートブラウザを指定する。

Autoprefixerはオプションで、ベンダープリフィックスを付与する対象となるブラウザのバージョンを指定することができます。

- `last 2 versions`: 全てのブラウザの最新2バージョン
- `last 3 iOS versions`: iOS Safariの最新3バージョン
- `> 5% in US`: USで `5%` 以上のシェアがある全てのブラウザバージョン

上記のように、自然言語風の文字列でサポートブラウザを指定することができます。

postcss-cliでは、プラグイン名でプロパティを追加し、その下にそのプラグインのオプションを記述することができます。

```json
{
  "use": [
    "autoprefixer"
  ],
  "input": "input.css",
  "output": "output.css",
  "autoprefixer": {
    "browsers": [
      "ie >= 11",
      "last 2 Edge versions",
      "last 2 Firefox versions",
      "last 2 Chrome versions",
      "last 2 Safari versions",
      "last 2 Opera versions",
      "last 2 iOS versions",
      "last 2 ChromeAndroid versions"
    ]
  }
}
```

---

今日はAutoprefixerの紹介と、使い方を説明しました。明日は少し掘り下げて、Autoprefixerの仕組みや実装について述べます。
初めてのSTS(Helloworld)

# Helloworld
**目的：ブラウザからアクセスしてHelloworldが表示される。**

-----
STS環境前提
Version: 3.8.2.RELEASE
Build Id: 201610040743
Platform: Eclipse Neon.1 (4.6.1)

-----

以下、プロジェクト作成時に作成されるmainクラス。

```HelloworldApplication.java
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloworldApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloworldApplication.class, args);
	}
}


```

新規クラスを作成し、以下のように変更する。

```HelloworldApplication.java
package com.example;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
  
    @RequestMapping ("/hello")
    public String hoge() {
      System.out.println("HelloWorld!!");
        return "HelloWorld!!";
    }
}
```

STSにて以下を実行。
・プロジェクト右クリック－実行－Spring Boot アプリケーションを選択して実行する。
![sts_hello1.png](https://qiita-image-store.s3.amazonaws.com/0/31363/70a26ae9-3193-ca1e-6a5c-4030d7ee43eb.png)


コンソールにSpringのアスキーアートが表示される。
![sts_hello2.png](https://qiita-image-store.s3.amazonaws.com/0/31363/31c03a97-596b-b989-26c8-99b01a8b5fd6.png)


ブラウザで[localhost:8080/hello]にアクセスする。
![sts_hello3.png](https://qiita-image-store.s3.amazonaws.com/0/31363/1bd4c301-10c5-afb8-90cc-e89a9b1e39ad.png)


# @SpringBootApplication
このアノテーションを付けたパッケージ以下をコンポーネントスキャンの対象としてくれるため、アノテーションベースの開発が簡単に行える。

@SpringBootApplicationが@Configuration、@EnableAutoConfiguration、@ComponentScanを呼び出す。
@ComponentScanで@Componentを全部使えるようにしてくれるので、@Componentを含む@Controllerが有効になる。

# @RequestMapping
URLとメソッドのマッピングを行う。method属性によって同一URLのリクエストでもPOSTリクエスト時に処理するメソッドとGETリクエスト時に実行するメソッドといった細かなマッピングを行うことができる。
Monodevelopの補完がおかしい問題


Completion mode
↓↑ 
Suggession mode

Completion modeだと、補完候補からしか選べない。Suggession modeなら新しい名前の後スペース押しても大丈夫。

メニュー/Edit/Toggle〜から切り替えられる
Suggession mode で運用してみることにする

---
検索ワード
補完が効きすぎる
スペースで決定
今更だけど、Zephirに立ち上がる勇気をもらった（気がする）PHPerの話

私は最近はずっとゲームのバックエンドAPI開発をPHPでずっとしてきたエンジニアなのですが、
ここ一年くらい他の言語を主体にする企業様が増えていまして。
PHPはリテラルの自由度が高すぎるけど、動作的にはメモリ管理とか楽なんだけどなぁ。
そろそろ他の言語に切り替えないと食い扶持なくなるかな・・・と思っていたところでした。

でも、なんとなく後ろ髪に引かれてる部分があり、
先日のPHPカンファレンス2016で耳にしたZephirをちょっと見てみたところ、
ほんとに敷居が低く、楽しくPHPExtensionが作れたので、始めてQiitaに記事を書いてみました。

エンジニアリングは楽しいの大事です！

ちなみに作ったものなのですが、記事のタグにつけましたが、
最近のゲーム案件では結構欠かせないものながら自分では作ったことがなかった
fluentdにポストするモジュールです。

##Zephirとは
文法はPHPとほぼ同じで、コードを書いた後ビルドをかけると
C言語経由でそのままPHPExtensionの作成までを一気通貫でできる
魔法のような言語＋コンパイラです。
[Zephir Language](https://zephir-lang.com/)

私もQiitaの記事を参考にしてインストールしたくらい皆さんが記事を投稿されているので
詳細は省略させていただきますが・・・。

##開発環境
いわゆるよくある、MacOSの上でVirtuaBox動かして、共有ディレクトリ上でコーディングしました。
実際にコンパイルなどしたゲスト環境は
`CentOS6.5＋PHP7.0.13+gcc4.4.7`
です。

ZephirにはSublimeText向けのシンタックスハイライトがあるのでエディタはSublimeText使いました。

##ちょっとだけ引っかかったところ

少しだけ勝手が違うので、やはり慣れるのに多少の時間は要りますが、
とりあえず動くところまでなら本当に学習コストが低かったです。
文法の違いも[公式ドキュメント]("https://docs.zephir-lang.com/en/latest/index.html")で結構事足ります。
（あ、でもどなたかPHP自体の定義済み定数を取得する方法を知っていたら教えてください・・・。）

あと、私の場合Zephirのコードを書き始めてからは、
Extensionを読み込むconfigをいじったり、php-fpmをリスタートするのが面倒だったので
コマンドライン用のテストコードを用意して、`zephir build` → `php test.php`を繰り返していました。
ただ、全くオススメできなくて
（当然なのですが）コードが正しくない状態でbuildするとphpがsegfaultで落ちて、
コンソールでは何も起きなかったかの様に振る舞われます（苦笑)
同じようなことをしている方がいたらお気をつけください。

##結果

https://github.com/Tsuchiy/SimpleFluent-Zephir

こんな感じの物が出来ました。
まだテストもあまり完全ではないですし、ベンチも取ってない状況ですが、
ファイルをincludeしないだけでもそこそこ嬉しいんじゃないかな、と期待しています。
隙を見て検証とかできたら、また続きを書きたいな、と思います。
Alpine Linuxにphp7-opensslをインストール

Dockerを使用する際、ベースイメージとしてAlpine Linuxを採用することは多いと思います。

そこで、php7パッケージをインストールするには
リポジトリ設定(/etc/apk/repositories)に
http://dl-4.alpinelinux.org/alpine/edge/community
を追記するのですが、php7-opensslの場合はそれだけでは足りません。

理由は、
libcrypto.so.38
libssl.so.39
上記2つの共有ライブラリのインストールが必要となるからです。

ですので、まずは
http://dl-4.alpinelinux.org/alpine/edge/main
http://dl-4.alpinelinux.org/alpine/edge/community
を
/etc/apk/repositories
に記述したうえで
apk update
apk add php7 php7-openssl
という流れになります。
すると、libressl2.4-libcryptoパッケージがインストールされ、
libcrypto.so.38 / libssl.so.39が/usr/libに追加されます。

もちろん
apk add --update php7 php7-openssl
でも可能ですし、実運用上では、インストール後にキャッシュ削除するように
apk add --update --no-cache php7 php7-openssl
となるでしょうか。
Monitでプロセスを監視してスラックで通知する

<h1>Monit</h1>

https://mmonit.com/monit/

インストール
<code>sudo yum install monit</code>

起動
<code>sudo systemctl start monit.service</code>
停止
<code>sudo systemctl stop monit.service</code>
再起動
<code>sudo systemctl restart monit.service</code>

OS起動時に自動起動させる
<code>sudo systemctl enable monit</code>

確認
<code>sudo systemctl status monit</code>

設定ファイル
<code>/etc/monit.d/monit.conf</code>

プロセス名を正規表現で監視

```
check process XXXXXX with matching "XXXXXX"
  start program = "プロセスの開始コマンドorスクリプト"
  stop  program = "プロセスの開始コマンドorスクリプト"
  if does not exist
    then exec "実行したいスプリプト名"
  else if succeeded for 1 cycle then exec "実行したいスプリプト名"
  group XXXXXX
```


開始したいコマンドやスクリプトは環境変数を引き継いてくれないので
スクリプトで環境変数を設定するもしくは

/bin/su - ユーザー -c などで実行すること

スラック投稿するスクリプト
 - そこらへんにいっぱいあるので適当に拾ってくる
    - 実行したいスクリプト経由で実行させておいたほうが良い
[Rails] rakeタスクのオプションが使えない with Zsh

# [Rails] rakeタスクのオプションが使えない with Zsh

仕事でRakeタスクにオプションをつけたいなと思って,コマンド打ってみたら
```zsh: no matches found: ...```ていうエラーが出たのでその時の対処法のメモ


```rb:ex)
rake task[option]
```

## 環境
zsh

## 対処方法

```
rake 'task[option]'
```

のように ''で囲ってあげるとうまくいくらしい
phpenvでPHPをインストールする。


## 環境
* MacBook Pro (13-inch, Late 2016, Two Thunderbolt 3 ports)
* macOS Sierra (10.12.1)
* anyenvでphpenv導入済み


## ビルドエラー
インストールを行う際、以下のエラーでインストールができませんでした。以下の手順で解消しました。

```bash
-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
                 int (* _Nullable)(void *));
                                        ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/stdio.h:475:6: warning: pointer is missing a nullability type specif
ier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness]
FILE    *funopen(const void *,
        ^
/var/folders/tq/0b16gfr93wg2042hvph16nl40000gn/T/php-build/source/5.6.28/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
#include <openssl/evp.h>
         ^
324 warnings and 1 error generated.
make: *** [ext/openssl/openssl.lo] Error 1
-----------------------------------------

```

## 解決手順

* xcode commandline Toolsをインストール
* opensslをインストールする

```bash
$ brew install homebrew/versions/openssl101
```
* libxml2をインストールする

```bash
$ brew install libxml2
```

* リンクを更新するもうまく行かず

```bash
$ brew link --force homebrew/versions/openssl101
$ brew link --force libxml2
```

* オプションを指定してインストールする

```bash
$ PHP_BULID_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml=$(brew --prefix libxml2)" phpenv install [install_version]
```

これでなんとかコンパイル時に発生するエラーを回避して、インストールができました。

## 参考URL
* [El capitan(OSX 10.11)に上げたらローカルのPHP環境移行で困ったことのいくつかメモ](acoo.com/diagrams/?spaceId=10464)
* [Mac OS X El Capitan上でphp-buildするメモ](http://qiita.com/hnw/items/62380e713d318906f0cd)