OmniAICreator/Qiita-1.07M huggingface dataset:
よく使うのでDocker ComposeでElasticsearchとKibanaを一撃で起動する

※こちらの記事は[個人ブログ](https://tech.tsukapah.com/docker-compose-elasticsearch-kibana/)に移行しました

Docker Composeは複数のコンテナをまとめて定義・実行するためのツールです。
Docker Composeを使わないで個別に起動する方法は[こちら](http://qiita.com/tsukapah/items/24bab0f5ab9bb4e12309)です。

# 実行環境
![DockerEngine.png](https://qiita-image-store.s3.amazonaws.com/0/32208/b1a56210-672a-88ea-e5cf-09ca1ee46c6c.png "DockerEngine.png")

```bash
$ uname -v
Darwin Kernel Version 15.6.0: Thu Sep  1 15:01:16 PDT 2016; root:xnu-3248.60.11~2/RELEASE_X86_64
$ docker --version
Docker version 1.12.1, build 6f9534c
$ docker-compose --version
docker-compose version 1.8.0, build f3628c7
```

# クラスタの定義
```docker-compose.yml
kibana:
  image: kibana
  links:
    - elasticsearch:elasticsearch
  ports:
    - 5601:5601

elasticsearch:
  image: elasticsearch
  ports:
    - 9200:9200
    - 9300:9300
```

# クラスタ起動(デタッチモード)
```bash
$ docker-compose up -d
Creating kibanacluster_elasticsearch_1
Creating kibanacluster_kibana_1
```

# 起動状態の確認
```bash
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
eecb811cb144        kibana              "/docker-entrypoint.s"   17 minutes ago      Up 17 minutes       0.0.0.0:5601->5601/tcp                           kibanacluster_kibana_1
1c60a47ffd10        elasticsearch       "/docker-entrypoint.s"   17 minutes ago      Up 17 minutes       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   kibanacluster_elasticsearch_1
```

# 接続確認
```bash
$ curl localhost:9200
{
  "name" : "shyHA8G",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "9I82GX3XSRCaPzRwXwD04A",
  "version" : {
    "number" : "5.0.0",
    "build_hash" : "253032b",
    "build_date" : "2016-10-26T05:11:34.737Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.0"
  },
  "tagline" : "You Know, for Search"
}
$ open http://localhost:5601
```
![Kibana5.0.0.png](https://qiita-image-store.s3.amazonaws.com/0/32208/4cd881d1-4e5d-6f27-4a28-a9fd1623f931.png "Kibana5.0.0.png")

# クラスタの停止
```bash
$ docker-compose stop
Stopping kibanacluster_kibana_1 ... done
Stopping kibanacluster_elasticsearch_1 ... done
```

# コンテナの削除
```bash
$ docker-compose rm
Going to remove kibanacluster_kibana_1, kibanacluster_elasticsearch_1
Are you sure? [yN] y
Removing kibanacluster_kibana_1 ... done
Removing kibanacluster_elasticsearch_1 ... done
```
[sql]指定した単語を除外してデータを取得する方法~not inとnot likeで試してみた~

#やりたいこと
sql文を用いて、あるカラムに指定した単語(文字列)が含まれていたらそれを除外してデータを取得したい！

ex: userテーブルのnameカラムに「サンプル」or「sample」と入っていたら除外したい。

[table:userの構造]

| カラム名 | データ型 | 
|:-:|:-:|:-:|
| id  |  int |   
| name|  varchar(255) |   

[table:userの中身]

| id | name |
|:-:|:-:|
|  1 | 山田太郎  |
|  2 | サンプル1  |
|  3 |  qiita |
|  4 |  sample2 |
|  5 |  キー太 |
|  6 |  sample |

#実行方法(sql)と実行結果

①
`SELECT * FROM users WHERE name not in ('sample') and name not in('サンプル ')`


| id | name |
|:-:|:-:|
|  1 | 山田太郎  |
|  2 | サンプル1  |
|  3 |  qiita |
|  4 |  sample2 |
|  5 |  キー太 |

②
`SELECT * FROM users WHERE name not like 'sample' and name not like 'サンプル';`

| id | name |
|:-:|:-:|
|  1 | 山田太郎  |
|  2 | サンプル1  |
|  3 |  qiita |
|  4 |  sample2 |
|  5 |  キー太 |

③
`SELECT * FROM users WHERE name not in ('%sample%') and name not in('%サンプル% ')`

| id | name |
|:-:|:-:|
|  1 | 山田太郎  |
|  2 | サンプル1  |
|  3 |  qiita |
|  4 |  sample2 |
|  5 |  キー太 |
|  6 |  sample |


④
`SELECT * FROM users WHERE name not like '%sample%' and name not like '%サンプル%'`

| id | name |
|:-:|:-:|
|  1 | 山田太郎  |
|  3 |  qiita |
|  5 |  キー太 |


#やったこと

まず①番②番のsqlでは、not in ('sample')、 not like 'sample'というように、
ワイルドカード(%)で挟むのを忘れていたために上手く除外できていなかったのだと思い、
次にワイルドカードを使って③と④を試した。
⬇︎
しかし、③番のnot in ('%sample%')は上手くいかず、
④番のnot like ('%sample%')でようやく上手くいった!!

#解説

①番②番のsqlでは、id=6,name=sample のデータだけ除外された。
これは、このデータがそれぞれnot in('sample'),not like('sample')
にひっかかった結果が実行されたからであった。

③番ではどのデータも除外されず、すべてのデータが取得された。
これは、not in ではワイルドカードが使えないからであった。

④番では完全一致のid=6のデータだけではなく、部分一致のid=2とid=4も合わせて、
つまり「sample」または「サンプル」という文字列が含まれているデータは全て除外され、
今回やりたいことが上手く実行できた！！


#まとめ

どうやら、**「not in」ではワイルドカードは使えず、**
これを使う場合には**完全一致の場合のみ使うべき**であると思われる。
**部分一致の場合のみ**除外したい場合は、
**ワイルドカードが使える「not like」**を使うことをお勧めする。

#余談。

実は今回の試みでは最初論理演算子も間違っていたために、
どこで間違えているのかがわかりにくく、④の結果にたどり着くまで非常に時間がかかった。笑

正解：
`SELECT * FROM users WHERE name not like '%sample%' and name not like '%サンプル%'`

間違い：
`SELECT * FROM users WHERE name not like '%sample%' or name not like '%サンプル%'`

⬆️[間違い]とされているsqlでは全てのデータが取得されてしまった。
なぜなら、論理演算子「OR(または)」は「　どちらか一方の条件に一致していればよい」わけであるから
例えば、id=2のname=サンプル1については、一つ目の条件である['sample'に部分一致しない]にひっかかりデータを取ってきてしまう。

日本語で考えると”「sample」または「サンプル」を除外”となるから間違いやすいが、
両方の条件に一致しなくてはならない、論理演算子ANDを使うべきであった！
（...ということで以上余談でした。ちゃんちゃん♩）
JUnitでよく使う基本的なアノテーションをまとめた

# はじめに
Javaの開発で単体テストとしてよく使われるJUnitの中で、
個人的によく使うアノテーションを備忘録がてらここでまとめてみた。
基本的にJUnitは可読性を重視しており英語に近い形を目指しているようだ。

## @test 

テスト実施時に実行されるテストメソッドに対して付与する。

## @Before
前提条件など、テストを実行するために必要な処理に対して付与する。
特に複数のテストコードで共通する前提条件などをまとめておくことで**可読性**が向上する。
慣習的にメソッド名を**setUp()**とすることが多い。

## @After
全てのテストが終わった後で実施される処理に対して付与する。
リソースの解放などが該当するが、一般的にJavaの場合ではガベージコレクションがあるため特に気にする必要はない。明示的に書きたい場合に使うのかもしれない。慣習的にメソッド名を**tearDown()**とすることが多い。
テストの成功・失敗に関わらず必ず実行される点に注意。

##@Theory
パラメータ化テストの際に@Testの代わりに使う。

##@DataPoint
パラメータ化テストでパラメータを定義するときに付与する。変数ごとに付けてあげる。
JUnitでテストが実行される際に内部での目印になるのかもしれないが、人間が見ても非常に分かりやすく何をしているのかが一目で分かるのが嬉しい。
配列など、複数のパラメータを定義する際には**@DataPoints**(複数形)にする。
OpenCvSharpで動画を再生するとMemoryAccessViolationが発生する。

OpenCvSharpのライブラリを使用する箇所でスレッドの競合が起こっていたため。
OpenCvSharpのライブラリを使用する箇所、動画の再生や早送り、巻き戻し、停止する箇所にlockを追加するなどして動画を操作するスレッドが一つだけになるようにする。
Mistel Barocco キープログラム設定方法

全てのキーがプログラム可能な分割キーボード **Mistel Barocco** の設定手順です。
詳細はマニュアルに記載されていますが、公開された内容が無いので取り敢えず備忘録です。

# 配列変更
**Fn+A** でQwerty, Dvorak, Colemakに変ります。
LED1で状態を示しています(青:Dvorak, 緑:Colemak, 消灯: Qwerty)

# 矢印キー
**左Win+右Alt+スペースキー** で右Shift、FN, PN, 右Ctrlを矢印キーに変更出来ます。

# Escキー 
**左Shift+Esc** → **~**
**Fn+Esc** → **`**

# キーのプログラム方法

変換後も元のキーで指定します。

1. **Fn+<**, **Fn+>**, **Fn+/** のいずれかでレイヤーを指定する。
1. **Fn+右ctrl**でプログラムモードにする。
1. プログラムしたいキーを押下する(LED3が青になる)
1. プログラム内容を入力し**PIN**キーを押下する。(LED3が青で点滅になる)
1. 3、4を繰り返す
1. **Fn+右Crtl**を押下してプログラムモードから出る。(LED3が消灯する)

途中で**Fn+T(15ms)**, **Fn+G(0.1s)**, **Fn+B(0.5s)** の遅延を入れられます。
最大32ストローク入力可能です。

# FN又はPNポジション変更
手順は記載されていますがうまく出来ないのでここでは記載しません。
apkをjavaにguiでできるapk2javaをつくった。

apkをjavaにするのは手順が長そう(3段階くらいある)ので、再設定や実行をguiでできるようにするapk2javaをWPF+C#でつくった。
まずjsonファイルに、実行ファイルのパスや、入手先、実行時のフォルダ、出力先、引数を記述する。これをProcessとして実行すれば、GUIで操作できるというわけ。

####jad.json

```json:jad.json
{
  "ExecuteFullPath": "jad158g.win/jad.exe",
  "ExefileURL": "http://varaneckas.com/jad/",
  "args": "-d [resultfolder] -s java -r [dataroot]Source_class/**/*.class",
  "ResultFullPath": "Source_Java"
}
```

####JSONを読むクラスを作る。

```csharp
namespace apk2java {
	public class ExeArg {
		public string ExecuteFullPath { get; set; }
		public string ExefileURL { get; set; }
		public string args { get; set; }
		public string ResultFullPath { get; set; }
	}
}
```

####JSONを読む。

```csharp
	private string filepath;
	private string dataRoot;
	public ExeArg jsonresult;

	public Section(string filepath, string DataRoot) {
		InitializeComponent();
		this.filepath = filepath;
		this.dataRoot = DataRoot;
		jsonresult = ReadJSON(this.filepath, DataRoot);
	}

	private ExeArg ReadJSON(string filepath, string DataRoot) {
		string jsonstring = File.ReadAllText(filepath, Encoding.UTF8);
		ExeArg exearg = null;
		try {
			exearg = JsonConvert.DeserializeObject<ExeArg>(jsonstring);

			ExecuteFullPath.Text = DataRoot + exearg.ExecuteFullPath.Replace("/", @"\");
			ExefileURL.Text = exearg.ExefileURL;
			args.Text = exearg.args;
			ResultFullPath.Text = DataRoot + exearg.ResultFullPath.Replace("/", @"\");
		}
		catch (Exception exception) {
			string error = filepath + "\r\n"+exception.Message;
		}
		return exearg;
	}
```

もし、実行ファイルがなかったら、URLからとってこよう、みたいな。
実行したらうまくいった。
なっかなかです。
deopleteの補完候補を自動で選ぶ


## 設定方法
neocompleteのときは
`let g:deoplete#enable_auto_select = 1`
のようにしていましたが、

deopleteでは
`set completeopt+=noinsert`
するとできるようです

## 参考
https://github.com/Shougo/deoplete.nvim/pull/16
Firefox自身のJavaScriptをデバッグする

大学の実験「大規模ソフトウェアを手探る」で，Firefoxのソースコードを手探った際に，Firefox自身のJavaScriptファイルをデバッグしたくなったので，その方法について調べたものをまとめます．

# JavaScriptのデバッグ

例えば，"Firefox javascript debug"などで検索して見ると，多くのそれらしいサイトがヒットしますが，その多くが"Firefoxを用いて，Webサイト上のJavaScriptをデバッグする"内容になっており，Firefox自身のデバッグについては扱っていません．


しかし，"mozilla javascript debug"で検索すると，[Debugging JavaScript][debug]というサイトがヒットし，このサイトはFirefox自身のデバッグについて記述してあります．

# 必要な設定と起動方法

まずは，Firefoxからデバッガを使うための設定を行う必要があります．上述のサイトに書いてありますが，ここでも説明します．

1. URLBarに"about:config"と入力し，Firefoxの詳細設定画面を出します．
2. 検索ウィンドウに"devtools.chrome.enabled"と入力すると，同名の設定項目が表示され，"false"となっているところを"true"に変更します．
3. "devtools.debugger.remote-enabled"についても同様に検索し，falseの所をtrueに変更します．
4. 一度Firefoxを再起動すると，一番上のメニュー画面からTools/Web Developer/BrowserToolboxという項目が利用可能になり，これを選択します．
5. リモートデバッグ接続要求という表示が出ますが，OKを押します．すると次のような画面が出てきます．

![スクリーンショット 2016-11-06 21.35.29.png](https://qiita-image-store.s3.amazonaws.com/0/143819/b7383afa-71a9-bf77-c1d0-7781d6d1d105.png "スクリーンショット 2016-11-06 21.35.29.png")

# 使い方

使い方は一般的なデバッガと同じです．
インスペクタ，コンソール，デバッガ…とありますが，このうちデバッガを選択すると，左にソースのツリー表示，右にソースコード表示が現れます．
左のツリー表示からブレークポイントを設置したいファイル名をクリックして開き，コードの行番号の部分をクリックすると，ブレークポイントが設置されます．
Firefox側で対応した動作をすると，そのブレークポイントで止まることが確認できると思います．

止まったら，左上にある4つのボタン（run/pause, stepover, stepin, stepout）を駆使して，作業を行います．

# 最後に

おそらくこのデバッガは多くの機能を備えていると思われますが，今回私が使用したのは必要最低限の機能だけでしたので，このまとめでも必要最低限の機能しか説明しておりません．
Firefox自身のソースを見ることはアドオンでも作らない限り滅多にないことかと思いますが，この際にデバッガで追いながらソースコードを読んでみてはいかがでしょうか？

[debug]:https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_JavaScript
AWSを利用してLAMP環境作成_01.AWS会員登録及びEC2インスタンス生成


# 1. AWSサイトにて会員登録

![スクリーンショット 2016-11-06 13.57.57.png](https://qiita-image-store.s3.amazonaws.com/0/122648/1c6050c0-0afa-236f-26c9-c917b3489804.png)

右上の`まずは無料で始める`ボタンをクリック

![スクリーンショット 2016-11-06 14.00.49.png](https://qiita-image-store.s3.amazonaws.com/0/122648/0a674dcd-0979-77de-2052-aaec243e04bd.png)

必要な情報を入力して、次に移動

> 英語で入力しないといけないので、グーグル先生に英語のアドレスを聞きましょう！

![スクリーンショット 2016-11-06 14.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/122648/d17fb948-41f5-f231-3730-319bf4da1271.png)

クレジットカードの情報入力

![スクリーンショット 2016-11-06 14.06.19.png](https://qiita-image-store.s3.amazonaws.com/0/122648/3b38319c-2f0f-159c-4a1c-616f7b0a5428.png)

本人確認のため、ページの指示に従って、段階を進めてください。

![スクリーンショット 2016-11-06 14.09.07.png](https://qiita-image-store.s3.amazonaws.com/0/122648/13298f28-7101-3e98-8e6a-67cc5f202649.png)

まずはベージックを選択しましょう。

![スクリーンショット 2016-11-06 14.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/122648/40919ca9-f27a-60d8-a593-15e5cc70a303.png)

上の画面が表示されたら会員登録は完了！

# 2. EC2 Instance生成

## 2.1. Instanceとは

1つのコンピュータをインスタンスと言います。

例えば、`4つのインスタンスを生成する`ことは4つのコンピュータをAWSインフラ上に生成することを意味します。

## 2.2. 生成

![スクリーンショット 2016-11-06 14.14.45.png](https://qiita-image-store.s3.amazonaws.com/0/122648/a83bf322-4270-2079-7df0-595d32339796.png)

`コンソールにサインインする`をクリックしてログインしましょう。

![スクリーンショット 2016-11-06 19.09.21.png](https://qiita-image-store.s3.amazonaws.com/0/122648/ace5165c-5606-3db1-7069-cde1953a167b.png)

AWSサービス > コンピューティング > EC2をクリック！

![スクリーンショット 2016-11-06 19.10.34.png](https://qiita-image-store.s3.amazonaws.com/0/122648/e4ed46b9-691e-9774-f9bb-8c6fd6b86723.png)

右のインスタンスをクリックしてください。

![スクリーンショット 2016-11-06 19.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/122648/fd765a3e-6c51-c2fc-8f50-686cc93945ea.png)

インスタント生成ボタンをクリック

![スクリーンショット 2016-11-06 19.29.36.png](https://qiita-image-store.s3.amazonaws.com/0/122648/2f14c201-5f7f-f671-48b7-d6d88c7552a7.png)


Amazon Linuxを選択

![スクリーンショット 2016-11-06 19.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/122648/2004d1fe-5723-5474-835b-089663214db3.png)

デフォルトで選択されているタイプを選択しましょう。

![スクリーンショット 2016-11-06 19.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/122648/7d7e736a-bd31-d81a-5ca3-86e829cb9132.png)

キーペアの設定の画面が表示されたら、設定してください。

これでインスタンスの生成は終わりです！

![スクリーンショット 2016-11-06 21.43.13.png](https://qiita-image-store.s3.amazonaws.com/0/122648/166adc6e-0e2e-272b-7e19-93bf93a35a44.png)

下のインスタンスの表示ボタンを押すと、インスタンスの確認ができます。
[Lazurite 920J #4] 電源供給

さあ、そろそろ無線通信をテスト、、、したいところですが、mini writerを1個しか買っておらず、同時に1個しかLazurite 920Jに電源供給できません。
そこで、mini writerを使わずにLazurite 920Jに電源供給しようと思います。

#接続用ピンソケットを入手
Lazurite 920Jにリード線を直接ハンダ付けしても動くといえば動きますが、やっぱりピンヘッダにコネクタを介して接続したいところ。
![20161106A.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/4dd1ae18-408a-0606-062d-4c3d6233e4d4.jpeg)

どのピンが電源か確認していませんが、Lazurite 920Jには1.27mmピッチの1x10ピンヘッダと2x5ピンヘッダが載っているだけなので、[千石電商](https://www.sengoku.co.jp/)でハーフピッチのピンソケットを購入してきました。
1.27mmピッチ1x40ピンソケット。
![20161106B.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/4cd74104-7280-e43f-39cf-1c804c1f63c6.jpeg)

#ピンソケットを接続
さあ、接続してみましょう。

1x10ピンヘッダに接続してみた。なんか、ちょっとユルい感じもするが、接続できます。
![20161106C.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/9dd504e1-70ba-6116-1106-cd34c4b0c86e.jpeg)

では、2x5ピンヘッダに接続、、、**はまらない**。
![20161106D.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/3e40a9d4-4137-dc98-b56d-072475192904.jpeg)

側面が隣のピンに引っかかってはまらない。
![20161106E.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/92413dc8-2a0c-da24-a7a1-dd776e22c59d.jpeg)

Oh...なんという初歩的ミス...orz

#接続用ピンソケットを調査
（気を取り直して）ちゃんと調査することに。
[Lazurite 920J 端子配置図](http://www.lapis-semi.com/lazurite-jp/lapis_admin/wp-content/uploads/Lazurite-920J_pin_info.pdf)に、ピン配置と使用しているピンヘッダの型式が載っていました。
電源は2x5ピンヘッダのPin1,2,3,4から供給します。
![20161106F.png](https://qiita-image-store.s3.amazonaws.com/0/109634/5ca8d7ea-1e57-f2a1-db44-634d230e4914.png)

2x5ピンヘッダのパーツ番号はPSS-720102-05。
![20161106G.png](https://qiita-image-store.s3.amazonaws.com/0/109634/75e2391e-2928-0a24-ed7c-41c83687fb3f.png)

廣杉計器の[PSS-72](http://hirosugi.co.jp/products/N/PSS-72.html)です。（リンク先の2列 H=1）
[クイックセレクター表](http://hirosugi.co.jp/technical/pn-code/pinheader_5.html#2_127)から、対応するソケットは[FSS-72](http://hirosugi.co.jp/products/N/FSS-70.html#bx2)であることがわかりました。

[ココ](http://www.hirosugi-net.co.jp/shop/g/g18855/)から購入可能みたい。

> 廣杉計器さん、以前は購入最小単位が10個でしたが、ヒロスギネットというのが出来て、もっと少量でも購入できるようになったんですね。

#代わりに使えそうなピンソケットを入手
代わりのものがすぐに手に入らないか、パーツショップを徘徊。
ありました！マルツの[HW103-2X10FLAME](http://www.marutsu.co.jp/pc/i/64987/)。
![20161106H.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/7e700aeb-a3f1-8c25-5c6e-7a1a98f69065.jpeg)

2x10なので、カッターで切って、切断面をヤスリがけして、2x5に加工。
![20161106I.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/9b362da8-f391-dc23-f6db-6802f0ffa21f.jpeg)

Lazurite 920Jに取り付けてみました。
バッチリです。
![20161106J.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/e6c2e8dc-8a52-5e53-3a94-acaa2c128692.jpeg)

#電源供給
秋月電子の[単三2本電池ボックス](http://akizukidenshi.com/catalog/g/gP-00310/)をピンソケットにハンダ付けして、無事、Lazurite 920Jを単体で給電することができた。
![20161106K.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/b5d36c76-e11d-1e7b-cb3a-27b7fe3bd102.jpeg)

#あとがき
* Lazurite 920Jへの電源供給は、2x5ピンヘッダ。対応するソケットは廣杉計器の[FSS-72](http://hirosugi.co.jp/products/N/FSS-70.html#bx2)。
* ソケットはマルツの[HW103-2X10FLAME](http://www.marutsu.co.jp/pc/i/64987/)でも代用可能。
* 電源電圧は1.8~5.5V。ただし、2.7V以下だと無線出力が弱くなる。
球面座標系によるカメラの操作（TPS,FPS向け）

# TPS
`target`に設定したオブジェクトを中心として球体座標移動するスクリプトです。
クリックしている間だけ移動するようになっています。

```C#:CameraController
using UnityEngine;
using System.Collections;

public class CameraContollerScript : MonoBehaviour
{
    public Transform target;
    public float spinSpeed = 1f;
    float distance = 10f;

    Vector3 nowPos;
    Vector3 pos = Vector3.zero;
    public Vector2 mouse = Vector2.zero;

    void Start()
    {
        // 初期位置の取得
        nowPos = transform.position;
    }

    void Update()
    {
        // マウスの移動の取得
        if (Input.GetMouseButton(0))
        {
            mouse += new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * Time.deltaTime * spinSpeed;
        }

        mouse.y = Mathf.Clamp(mouse.y, -0.3f + 0.5f, 0.3f + 0.5f);

        // 球面座標系変換
        pos.x = distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Cos(mouse.x * Mathf.PI);
        pos.y = -distance * Mathf.Cos(mouse.y * Mathf.PI);
        pos.z = -distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Sin(mouse.x * Mathf.PI);

        pos *= nowPos.z;

        pos.y += nowPos.y;

　　　　 // 座標の更新
        transform.position = pos + target.position;
        transform.LookAt(target.position);
    }

}
```

#FPS

カメラにつけるだけ。
クリックしている間だけ移動するようになっています。

```csharp:CameraController
using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour
{
	public float spinSpeed = 0.5f;
	float distance = 10f;

	Vector3 pos = Vector3.zero;
	public Vector2 mouse = Vector2.zero;

	void Start()
	{
		mouse.x = -0.5f;
		mouse.y = 0.5f;
	}

	void Update()
	{
		// マウスの移動の取得
		if (Input.GetMouseButton (0)) {
			mouse += new Vector2 (Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse Y")) * Time.deltaTime * spinSpeed;
		}

		mouse.y = Mathf.Clamp(mouse.y, -0.3f + 0.5f, 0.3f + 0.5f);

		// 球面座標系変換
		pos.x = distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Cos(mouse.x * Mathf.PI);
		pos.y = -distance * Mathf.Cos(mouse.y * Mathf.PI);
		pos.z = -distance * Mathf.Sin(mouse.y * Mathf.PI) * Mathf.Sin(mouse.x * Mathf.PI);

		// 座標の更新
		transform.LookAt(pos + this.transform.position);
	}

}
```

# 追記

参考にさせて頂きました。
[[Unity]マウスによる球体座標のカメラ移動](http://qiita.com/maitonn/items/e7f4c2b2297c28daf8f4)
Vimで/Users/ユーザー名/*を/Users/user_name/*に置換する

ブログを書く時などに、 `/Users/ユーザー名/*` 部分を匿名化したい。

# 置換コマンド

```vim
:%s/\(\/Users\/\)\w\+/\1user_name/g
```

# コマンド化

```vim
command! ChangeUsersDirName :%s/\(\/Users\/\)\w\+/\1user_name/g
```

後は `:ChangeUsersDirName` で呼び出すだけ!!!


## 追記(2016/11/07 01:22):

簡略化しました
spacemacs melpa connecting error 対応(Windows10)

## 環境
* Windows10 64bit
* NTEmacs64
 * chuntaro様の [Windows 版 Emacs (通称 NTEmacs) の 64bit 版](https://github.com/chuntaro/NTEmacs64) を参考に導入いたしました。

## エラー
初回起動時のパッケージ取得時に下記エラーが発生しました。
```error: Package `Package-build-' is unavailable```

公式レポジトリ [syl20bnr/spacemacs](https://github.com/syl20bnr/spacemacs) に対応策が記載されていました。
> Launch Emacs. Spacemacs will automatically install the packages it requires. If you get an error regarding package downloads then you may try to disable the HTTPS protocol by starting Emacs with
>```emacs --insecure```

## 対応
ショートカットを作成し、オプションをつけて起動しました。
![Emacs.PNG](https://qiita-image-store.s3.amazonaws.com/0/146452/2c543b29-0ab4-6eb0-7be7-05d22ece8a14.png)

## 反省
ちゃんと公式サイトのインストール手順を見よう。
FreeTypeによるcv::Matへの文字描画機能をOpenCVのモジュールにまとめた(opencv_contrib)

どうしたら使いやすいかなーと考えて、opencv_contribに新規モジュール追加という形でまとめてみた。

https://github.com/Kumataro/opencv_contrib/tree/freetype2
https://github.com/Kumataro/opencv_contrib/tree/freetype2/modules/freetype

ここからチェックアウトして、contribのコンパイル手順に従ってopencv+contribでコンパイルすれば使えるはず。
最新版とマージしたい場合は、freetypeのフォルダをもっていけばできるはず。
cmakeを実行する際にcontribを指定するオプションはお忘れなく。

```test.cpp
#include <opencv2/opencv.hpp>
#include <opencv2/freetype.hpp>

int main(){
    cv::freetype::FreeType2 ft2;
    ft2.loadFontData("./mplus-1c-thin.ttf", 0);

    cv::Mat src = cv::Mat::zeros( 480, 640, CV_8UC3 );
    ft2.putText(src, "ABCDEFGHIJKLNMNOPQRSTUVWXYZ",  cv::Point(  0, 80), 30, cv::Scalar(0,0,255),  -1, CV_AA, true );
}
```

こんな感じで使えるはず。

性能検証は行っていないが、

小サイズのBITMAP ＜ 小サイズのパス　＜　大サイズのパス　＜　大サイズのBITMAP

になるはず。

Thicknessの値がマイナスならばBITMAPになるし、プラスならばその線幅のOutlineになるから、両方ともで使えるようになっている。

#前回からの差分
## Iに隙間が・・・
なんか"I"の右側空きすぎ問題は、こちらのposに相当する部分のパラメータが違ってましたね…
gPos.xで計算するべきだったのに、org（起点）で計算してたのでダメでした。

``` https://github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/src/freetype.cpp
                            if ( ( (cl >> bit) & 0x01 ) == 1 ) {
                                int pos = gPos.x + col * 8 + (7 - bit);
                                ptr[ pos ][0] = mColor[0];
                                ptr[ pos ][1] = mColor[1];
                                ptr[ pos ][2] = mColor[2];
                            }
```

## Outlineが変な場所に飛ぶことが…
パラメータdeltaを初期化してなかったのでダメでしたね…

``` https://github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/src/freetype.cpp
            mFn.shift    = 0;
            mFn.delta    = 0;
            mFn.move_to  = FreeType2::mvFn;
```

## CMakeListsの書き方(FreeType2 依存関係)
https://github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/CMakeLists.txt
このファイルの書き方がいろいろ悩んだ…。
結果、こうなりました。

``` https://github.com/Kumataro/opencv_contrib/blob/freetype2/modules/freetype/CMakeLists.txt
set(the_description "FreeType module. It enables to draw strings with outlines and bitmaps.")

pkg_search_module(FREETYPE freetype2)

if(NOT FREETYPE_FOUND)
  message(STATUS "freetype2:   NO")
else()
  message(STATUS "freetype2:   YES")

  include_directories(${FREETYPE_INCLUDE_DIRS})

  ocv_define_module(freetype opencv_core opencv_imgproc WRAP python)
  target_link_libraries(opencv_freetype ${freetype2_LIBRARIES} )
endif(NOT FREETYPE_FOUND)
```

pkg-config freetype2 --cflags 相当にするのに、いろいろ試行錯誤しまくりました結果が、こんな感じです。

ポイントは、以下３点。
1. pkg-config対応しているならば、pkg_search_module()で対応可否判断できる
2. include_directoriesを指定する事で、--cflagsオプション相当に必要なインクルードパス追加になる
3. target_link_librariesに指定する事で、--libsオプション相当に必要なライブラリ追加になる

## contrib開発における興味あるモジュールだけコンパイル。
単純に`make -j 8`だけだと、他のモジュールのコンパイルも待たされてしまいます。コンパイルが通るか、通らないかの検証とかだけでも待たされるのは非常に嫌ですね・・・　

`make opencv_freetype -j 8` ならば、今開発しているfreetypeだけを再コンパイルするので超早かったです。

（もしかして、これを某アドベンドカレンダーにしてしまえばよかったのでは・・・）

以上でございます。
ベイズ初心者でも分かるMCMC入門

なかなかMCMCが理解できなかった自分がベイズ統計の本や人から教えてもらってはじめて理解できた表現をまとめている自分用メモ。ベイズ統計の基本は色々良い本やサイトがあるので最低限に止めてます。初心者なので間違えにお気づきでしたら指摘頂けると助かります。

##ベイズ統計学とは

- ベイズの定理というたった一つの公式から大抵の理論が導かれる

```math
P(\theta|D)=\frac{P(\theta)P(D|\theta)}{P(D)}
```

- P(θ)=事前確率、P(θ|D)=事後確率、P(D)=正規化定数(右辺の確率総和を1にしてくれる)、P(D|θ)=尤度
- 母数は確率変数（=分布を持っている）で、モデリングが必要
- 伝統的な統計学では母平均は確定している前提で特定の値が含まれる確率を考えたりしていたが、ベイズでは母平均が分布しているという考えを持つ
 - 点数の分布がN(50,10)の試験で80点以上の人は何人いるか？

##MCMC（マルコフモンテカルロ連鎖法）とは
**ある確率分布から乱数を取り出すことにより、汎用的な数値積分を実現するための手法**

書籍などで初めてこの解説をみたとき全く意味がわかりませんでした（例：確率分布がわかってるのに何のために積分するのか？）
ものすごく噛み砕いて言うと、MCMCは**ベイズ統計学の計算を色々簡単にしてくれるツール的なもので、期待値を簡単に求めたりできる**手法。
例えば下記のような確率密度関数f(x)があったとして、仮に正規分布なら期待値E(X)を簡単に算出できるが、実際の事象はもっと複雑なことが多いので積分するのが大変。

```math
E(x)=\int_{a}^{b}x f(x)dx
```

ちゃんと積分しないでも点をランダムに打ちまくって点の数を求めれば大体その分布の期待値(E(X))が分かるのでは？という数値積分の考えで、物理学などベイズ統計以外の様々な場面でも使われています。

ちなみに、有限個の乱数を生成して積分することをモンテカルロ積分といいます。例えば1辺が2cmの正方形に内接してる円の面積を求める時、3.14を知らなかったらどうするか。点を打ちまくって円の部分とその外側の点の数の比率を求めれば分かるよということだそうです。ただ、やたらめったらに点を打っていても効率が悪いので、あらかじめそれっぽいと思われる確率分布を調べておいて、その確率分布におさまるよう賢く値が収束していくのがMCMCの良いところ。

ここでさらに疑問がうまれた。**分布が大体わかってるならそんなまどろっこしいことせずにそのパラメータを使えばよくない？**この疑問を解くヒントはベイズの定理にあります。

```math
P(\theta|D)=\frac{P(\theta)P(D|\theta)}{P(D)}
```

この公式で分母の P(D) をとっぱらって、P(θ|D)はP(θ)P(D|θ) に比例していることまでは比較的簡単に分かります。つまり、事後分布の形はなんとなく分かっている状態なのです。ここから、正確な期待値E(X)を求めたいのでMCMCをやってるわけです。

（つづく。。かも）
TypeScript & Stateless Component でchildrenプロパティを扱う

# 目的

 TypeScript + React + JSXを利用している開発環境で
`Stateless Component`(React.Componentを継承しないコンポーネント)内で
`children`プロパティを利用する


# 問題

以下のソースで`children`プロパティを利用しようとするとエラーが発生する。

```
import React from 'react';

// Stateless Component
const MyStatelessComponent = ({ children }) => <div>{children}</div>; // (1)

// 親コンポーネント
class MyApp extends React.Component<{}, {}> {
  render() {
    return (
      <MyStatelessComponent>   //
        Learn Javascript       // (2)
      </MyStatelessComponent>  //
    )
  }
}
```

エラー内容は次の通り

> Error TS2324: Property 'children' is missing in type 'IntrinsicAttributes

`MyStatelessComponent`にchildrenプロパティを設定する必要があるよう。
しかし、今回は通常の`React.Component`を継承したコンポーネントと同様に
(2)の方法で記述を行いたい。


# エラー回避策

(1)の部分で、childrenのデフォルト値を設定する

```
const MyStatelessComponent = ({children = null}) => <div>{children}</div>;
```

上記のようにすることでエラーは発生しなくなった。

 - 2016/11/14 追記

いただいたコメントにより、

```
const MyStatelessComponent: React.StatelessComponent<React.Props<{}>>
    = ({ children }) => <div>{ children }</div>
```
と、Reactが提供する`StatelessComponent`インタフェースを実装することで、問題が解決できることがわかりました。
`children`以外のプロパティを追加する場合は、`React.Props`を継承したクラスを作ることで対応できます。
ご指摘ありがとうございました。


# 参考
 - [JSX Stateless Functional Components Property 'children' is missing in type. #7992](https://github.com/Microsoft/TypeScript/issues/7992)
RSpec の letとlet!とbeforeの挙動と実行される順番

let　と let! の違いは何となく理解していたが、
let! と before　の実行順まで把握していなかったので、
この機会に備忘録的にそれぞれをまとめてみました。

## let
let は **最初にメソッドが呼ばれた時** に評価されます。

なので例えば
User が複数の Article　を持つ場合

```◯◯_spec.rb
describe 'let' do
  let(:user) { create(:user) }
  let(:user_article) { create(:article, user_id: user.id) }

  specify 'User が Article を持っていること' do
    expect(user.articles.first).to eq user_article
  end
end
```
とやるとテストが通らない。。。はず。(面倒臭くて実際にはこのコード書いてない。すみません。)

 この場合、

```
let(:user_article) { create(:article, user_id: user.id) }
```
が呼ばれるのは

```
expect(user.articles.first).to eq user_article
```
の中で "user_article" が呼ばれた時で

"user.articles.first" が処理される時にはまだ実行されていないので "user.articles.first" は空となりテストは通りません。

## let!
let! は letが遅延評価であるのとは違い、各サンプルが実行される前に評価されます。
つまり各 it とか specify が実行される直前に評価されるので

先程のテストコードは

```◯◯_spec.rb
describe 'let' do
  let!(:user) { create(:user) }
  let!(:user_article) { create(:article, user_id: user.id) }

  specify 'User が Article を持っていること' do
    expect(user.articles.first).to eq user_article
  end
end
```
このように let を let! に置き換えると specify のブロックが実行される前に

```
let!(:user)
let!(:user_article)
```
の両方が処理されるのでテストが通るようになります。

## before、before(:each)
let! と同じ。
"before(:each)" と "before(:all)" の違いなどは今は書いていないので
<a href="http://qiita.com/kiyodori/items/5862efd9c5a5ed699f81" target="_blank">別の記事</a>あたりを参考にしていただければと

## それぞれの実行される順番
let と let! は先程述べたタイミングで処理されるので
それぞれの定義の順番は関係ありません。

let! と before の実行タイミングは同時なので、
定義の順番通りに実行されます。

下記のコードの場合

```◯◯_spec.rb
before { create(:user) }
let!(:user_article) { create(:article, user_id: user.id) }
before { create(:user_2) }
```

上から順に処理が行われていく(サンプルコード悪くてすみません。)


## さいごに
まだまだわかったようで理解しきれていない部分もあると思うので、
またわかることあれば追記していきたいと思います。

また、不備等あれば教えていただければ幸いです。
医療×IT

初めまして。とある総合病院（急性期病院）の医療情報部門で働く医療情報技師のホリウチです。ここでは日々の業務の中で感じたこと、提案したいことをコツコツ書いていきたいと考えております。

今後やりたいことは現時点では以下の通りです。

・DPC分析
・DPC分析ツール開発
・DPC分析コミュニティ立ち上げ
・診断支援システム開発
など
特にDPC分析コミュニティ立ち上げに関しては、熱意を持っています。藤森研司氏が10年くらい前から提唱しているようですがあまり活性化していない模様です。http://homepage3.nifty.com/huhp-medmane/
googleで「DPC SQL」で検索しても大したものが出てきません。最近は私の友人が始めたDPC分析ブログが上位に食い込んできます。http://stagira.hatenablog.com
他には、
DPC、SQL、R、を中心に分析とかのblog
http://gothamcity-dpc.blog.jp

東京大学　堀口裕正
http://www.slideshare.net/tanpoponet/20110723-11483845

くらいでしょうか。私も負けていられません。

今のところ自院ではHBV再活性化対策クエリの開発がひと段落しました。今度の医療情報学会（2016年11月21日〜＠パシフィコ横浜）http://36th.jcmi.jp
で発表してきます。タイムテーブルの14:00ちょい前ポスター10運用支援の所で発表します。http://36th.jcmi.jp/wp-content/uploads/2016/10/JCMI_36th_timetable_d3_tentative3_20161013.jpg
会場の様子もこちらのブログで共有できればと考えております。
ビギナー向けbeame-insta-ssl使用ガイド

This is a translation of beame-insta-ssl Beginner's Guide. The Japanese version of the Readme is here: https://github.com/beameio/beame-insta-ssl/wiki/Japanese-Translation-of-beame-insta-ssl-Readme

beame-insta-sslは、web 開発者だれもが、暗号化することでセキュリティで保護された通信を利用可能にします！
beame-insta-ssl は、 beame subdomainの下にのあなた独自の完全修飾ドメイン名（FQDN)を取得します。それは次のようになります。: https://ypxf72akb6onjvrq.ohkv8odznwh5jpwm.v1.p.beameio.net/insta-ssl また無料の独自 SSL 証明書 (GlobalSign ルート CA)も取得します。 
これによって安全なHTTPによるトンネルが可能です。 
トランスポート層セキュリティ (TLS)を利用するか否か選択できます。以下をご参照ください。


**ステップ1: 当社の SSL で保護された webサイトにサインアップし、届いたメールを確認してください。**
![1.png](https://qiita-image-store.s3.amazonaws.com/0/145262/8cec5d17-e166-1080-c676-7f1aeae1b196.png)

SSL 証明書の申し込みフォームは、次のとおりです。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/145262/7bad8a2d-f45d-c947-77e1-67a653181757.png)

**ステップ 2: 登録確認のEメールが届きます。**
(from sophia@beame.io)

![email.png](https://qiita-image-store.s3.amazonaws.com/0/145262/e3aa1771-4342-4957-f7cc-cf056f6b77b2.png)

**ステップ 3: まず初めにこのコマンドを実行してください。`npm install -g beame-insta-ssl`**

正常に実行するために、次のものがインストールされているかご確認ください：
Nodejs、npm (node package manager) (npmはnodeと一緒にインストールされています)

Mac上で既にインストールされているか確認するには、ターミナルで次を実行: `node –v `。
Windows上で既にインストールされているか確認するには、Powershellで次を実行: `node –v`

ツールが欠けている場合は、次のようにインストールします：
Mac上で Node.jsをインストールする場合、ターミナルで次を実行: `brew install node`  
Windows上でNode.jsをインストールする場合:こちらのインストーラーを使用してください： https://nodejs.org/en/download/current/

**Step 4: ステップ４：Eメールの中のコマンドをコピーアンドペーストして実行させてください。**

こちらはシステムによる完全修飾ドメイン名（FQDN)とSSL 証明書の発行時に表示される画面のスクリーンショットです。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/145262/3e4444d0-604c-4918-b92b-ce265704823d.png)

** ステップ5：ターミネイティングトンネルとノンターミネイティングトンネル（Terminating and non-terminating tunnel）の選択方法。弊社ではどちらも提供しています。**

どちらのトンネルも同じコマンドを使用します。

デスティネーション(DESTINATION_PROTO と呼ばれる) が HTTP の場合、トンネルは暗号化せずに接続し、HTTPのリクエストに沿って変換されます。これによって、既存の HTTP サーバーを変更することなく使用可能です。
デスティネーションがHTTPSの場合、トンネルはすべてにおいて暗号化されます。

**ターミネイティングトンネル（Terminating tunnel）**

ターミネイティングトンネルは、スタンダード (簡単)な構成です。つまりBeameがTLS接続を可能にします。ターミネイティングトンネルを使用すれば、既存のサーバー にBeame証明書をインストールする必要はありません。beame-insta-sslがHTTPを介してあなたのサーバーに証明書とトンネル トラフィックを取得します。

ターミネイティングトンネルのインストール：
`beame-insta-ssl tunnel 8008 http`

指定したポートでこのコマンドを実行してください。上記例では、8008を使用。

**ノンターミネイティングトンネル * （Non-terminating tunnel）** 
ノンターミネイティングトンネルは、より安全です。私たちが暗号化するのではないからです。つまり、トンネルからHTTPSのウェブサイトに行くまですべてにおいて暗号化されます。この場合、beame-insta-sslのノンターミネイティングモードを実行する必要があります。(DESTINATION_PROTO as HTTPSと指示してください) その後、beame-insta-sslによって発行された証明書を、既存のサーバーにインストールしてください。

この場合は、コマンドのようになります。

`beame-insta-ssl tunnel 192.168.0.200:8443 https –hostname web200.localdomain`

This is a translation of beame-insta-ssl Beginner's Guide. The Japanese version of the Readme is here: https://github.com/beameio/beame-insta-ssl/wiki/Japanese-Translation-of-beame-insta-ssl-Readme

![4.png](https://qiita-image-store.s3.amazonaws.com/0/145262/2f3b965b-5708-0837-5ee5-15823c92a07c.png)
いろんな言語でexp(log(0))

数学的な定義はともかく、エンジニア的にはおそらく、

```math
\exp(\log(0))=0
```

であってほしいところですね。

# JavaScript (Node.js 7.0.0)

```
$ node
> Math.exp(Math.log(0))
0
```

# Python (Python 3.5.2)

```
$ python
Python 3.5.2 (default, Jul 21 2016, 02:38:09)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.exp(math.log(0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error
```

# Ruby (Ruby 2.3.0, irb 0.9.6)

```
$ irb
irb(main):001:0> Math.exp(Math.log(0))
=> 0.0
```

# Perl (Perl 5.18.2)

```
$ perl -le 'print exp(log(0))'
Can't take log of 0 at -e line 1.
```

# Perl6 (Perl 6.c, Rakudo Star 2016.10)

```
$ perl6 -e 'say exp(log(0))'
0

$ perl6 -e 'say 0.log.exp'
0
```

# Awk (Awk 4.0.1)

```
$ awk "BEGIN {print exp(log(0))}"
0
```

# PHP (PHP 5.5.9-1)

```
$ php -r 'echo exp(log(0));'
0
```

# C (GCC 4.8.4, glibc 2.19)

```
$ cat <<EOF > explog.c
> #include <stdio.h>
> #include <math.h>
> int main() {
>   printf("%f", exp(log(0)));
>   return 0;
> }
> EOF
$ gcc explog.c -o explog -lm
$ ./explog
0.000000
```

# Java (OpenJDK 1.7.0_111)

```
$ cat <<EOF > explog.java
> import java.io.*;
>
> class explog {
>   public static void main (String[] args) {
>     System.out.println(Math.exp(Math.log(0)));
>   }
> }
> EOF
$ javac explog.java
$ java explog
0.0
```

# Julia (Julia 0.5.0)

```
$ julia -e 'println(exp(log(0)))'
0.0
```

# 結果

| 言語 | 結果 |
|:-:|:-:|
| JavaScript | 0 |
| Python | **エラー** |
| Ruby | 0.0 |
| Perl | **エラー** |
| Perl6 | 0 |
| Awk | 0 |
| PHP | 0 |
| C | 0.0 |
| Java | 0.0 |
| Julia | 0.0 |

言語の追加歓迎。
Node.jsの導入（CentOS7）


## 環境

CentOS7.1

## インストール

[参考ページ](http://qiita.com/akippiko/items/3708016fc43da088021c)を参照してnvmとnode.jsをインストールしHelloWorldまでやる。


## Heroku

デプロイ環境はHerokuを使う。Herokuの登録は[公式ページ](https://www.heroku.com/)から行う。

### Heroku Toolbeltのインストール

[参考ページ](http://qiita.com/satomyumi/items/ea5e1b144620ffc4acca)を参照してインストールする。

参考ページ通りにStandaloneのソースを使用しインストールする。

```
$ wget -qO- https://toolbelt.heroku.com/install.sh | sh
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> .bash_profile 
$ source .bash_profile 
```

バージョン確認（実行するとheroku-cliのインストールが始まります。）

```
$ heroku version
heroku-cli: Installing CLI... 22.45MB/22.45MB
heroku-toolbelt/3.43.13 (x86_64-linux) ruby/2.0.0
heroku-cli/5.4.8-eee5ec9 (linux-amd64) go1.7.1
You have no installed plugins.
```

ログイン

```
$ heroku login
Logged in as hoge@mail
```

## 参考

* [centos + node.js + npm + nvm インストール](http://qiita.com/akippiko/items/3708016fc43da088021c)
* [[vagrant 1.5] Vagrant 上の CentOS 6.5 から Heroku を使うには。](http://qiita.com/satomyumi/items/ea5e1b144620ffc4acca)
* [ビギナーのための Node.jsプログラミング入門](http://libro.tuyano.com/index2?id=1115003)
ruby 2.3.1をCentOS7にインストールする方法（CentOSのminimal環境に対応）


## rbenvとruby-buildでRubyのインストール環境を揃える
- gitをインストール

```yum install -y git```

- gitをインストールしたら次にrbenvをインストール

```git clone https://github.com/sstephenson/rbenv.git ~/.rbenv```

```echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile```

```echo 'eval "$(rbenv init -)"' >> ~/.bash_profile```
```source ~/.bash_profile```

## ruby-buildをインストール
```git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build```
```cd ~/.rbenv/plugins/ruby-build```
```./install.sh```

## Ruby 2.3.1をインストール
```rbenv install -l```

実行結果
  2.3.1
  2.4.0-dev
  .
  .
  .

はじめにrubyの依存パッケージをインストール
```yum install -y bzip2 make gcc openssl-devel readline-devel zlib-devel```

rubyをインストール
```rbenv install 2.3.1```

gemでインストールした実行ファイルを実行するようにする
```rbenv rehash```

globalでrubyの実行versionを指定
```rbenv global 2.3.1```

最後に確認
```ruby -v```
```ruby 2.3.1p112 (2016-04-26 revision 54768) ```

※ whichが無い場合は```yum install -y which```
```which ruby```
```~/.rbenv/shims/ruby```

```which gem```
```~/.rbenv/shims/gem```


## 参考文献
ruby 2.3.1をCentOS7に導入する。
http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb#rbenv-ruby-buildでrubyの導入環境を揃える
spring-boot で開発環境でだけ有効なプロファイルを作る

Spring Boot で開発環境だけで有効な Profile を作りたい。

| 環境 | プロファイルが有効になってほしいか |
|:-:|:-:|
| IDE (IntelliJ) とかの組み込み機能で Debug/Run 実行  |  Yes |
| Gradle bootRun  |  Yes |
| assemble した jar を実環境で run  | No |

重要なのは、これをデフォルトで（特にユーザーが何かをする必要無く）やりたいって事です。

たどり着いた方法がこれ

* spring-boot-devtools を入れておく
* build 時に devtools jar を取り除く。 gradle なら以下の用に書く。<br />

```groovy:build.gradle
springBoot {
    excludeDevtools = true // fat jar にまとめたときには、devtools を取り除く
}

dependencies {
    // ...

    runtime 'org.springframework.boot:spring-boot-devtools:1.4.1.RELEASE'
    // 間違って使わないように、runtime スコープに入れた方がいい
}
```

* spring-boot-devtools クラスが存在するかどうかで、条件分岐。<br />例えば、

```java:Application.java
@SpringBootApplication
public class Application {
    public static void main(String... args) throws Exception {
        final SpringApplication springApplication = new SpringApplication(Application.class);
        if (isDeveloping()) { // 開発環境では
            springApplication.setAdditionalProfiles("developing"); // developing プロファイルを追加
        }
        springApplication.run(args);
    }

    private static boolean isDeveloping() {
        return ClassUtils.isPresent("org.springframework.boot.devtools.settings.DevToolsSettings",
                                     ClassLoader.getSystemClassLoader());
        // DevToolsSettings クラスがあれば、開発中。
    }
}
```
KyotoTycoonをDockerで使用する

# 概要
KyotoTycoonを使用しているサーバのOSが古くなってしまったので、
新しくしようとしたついでにDocker化しよっかなというのがきっかけです。
Dockerの良い部分の一つとして同一ホスト内で環境を分離できる特性がありますので、それを活かして延命を図ります。
ログをホストに転送したいという希望があったのと、KyotoTycoonがデータとログを同じディレクトリに作成していることもありまして、データはホストのディレクトリを使用するようにしています。
（ご利用の場合は必要に応じてデータコンテナを使用する等してください）


# Dockerfile
Alpine Linux3.4ベースで作成しています。
https://github.com/takexi/KyotoTycoon/blob/master/Dockerfile

コンパイルを通すために1行ほどヘッダを弄っている箇所があります。
コンパイル時にwarningが結構でますが、特段問題ないと思われます。

# 使い方
### Ex1:dockerで

```bash
docker build -t kyototycoon ./
docker run -v /var/ktserver:/var/ktserver -p 1978:1978 --name kt -d -t kyototycoon
```

### Ex2:docker-composeで
kyototycoonディレクトリを作成して、その中にDockerfileを置いて以下ファイルを作成。

```yaml:docker-compose.yml
kyototycoon:
    container_name: kyototycoon
    build: ./kyototycoon/
    ports:
      - "1978:1978"
    volumes:
      - /var/ktserver/:/var/ktserver/
    tty: true
```

その後docker-composeを実行。

```bash
docker-compose up -d --build
```
PyQt5とpython3によるGUIプログラミング

ページが増えてきたので、目次を作ります。
[PyQt5とpython3によるGUIプログラミング［０］](http://qiita.com/kenasman/items/55505654823e9d040e6e)
MacとWindowsのインストール方法です。

[PyQt5とpython3によるGUIプログラミング［１］]
(http://qiita.com/kenasman/items/70a3ef914b0e7e55a123)
PyQt５のサンプルコードです。

[PyQt5とpython3によるGUIプログラミング［２］]
(http://qiita.com/kenasman/items/73d01df973a25ae704e4)
PyQt５のサンプルコードその２です。

[PyQt5とpython3によるGUIプログラミング［３］]
(http://qiita.com/kenasman/items/794d2874d56d0dc37aea)
MVCのマニュアルの日本語訳です。

[PyQt5とpython3によるGUIプログラミング［４］]
(http://qiita.com/kenasman/items/3119efb6ee1c53dbd877)
MVCのサンプルコードです。

[PyQt5とpython3によるGUIプログラミング［５］]
(http://qiita.com/kenasman/items/4da65dd4dd4192f30c21)
PyQt5_Examplesのコードを紹介していきます。

[PyQt5とpython3によるGUIプログラミング［６］]
(http://qiita.com/kenasman/items/765457d440b923f4e555)
Qt DesignerでのGUI作成サンプルです。

[PyQt5とpython3によるGUIプログラミング［7-1］]
(http://qiita.com/kenasman/items/87c12f3a8b63f5948153)
Paint Systemの翻訳です。

[PyQt5とpython3によるGUIプログラミング［7-2］（編集中）]
(http://qiita.com/kenasman/items/b3d5b7c8cd442c3c4429)
QGraphicsItem Classの翻訳です。

[PyQt5とpython3によるGUIプログラミング［８］（編集中）]
(http://qiita.com/kenasman/items/fb3f1260c355585a5dce)
Painting Examplesの翻訳です。

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-84964934-1', 'auto');
  ga('send', 'pageview');

</script>
Karma で走らせたテストの結果を CircleCI で集計する

CircleCI の案内に Karma が無かったので書いておく．

# 前提
Karma 1.3.0 以上
CircleCI は 2016/11/06 時点

# karma-junit-reporter を追加
CircleCI では Cucumber JSON か JUnit XML の形式がサポートされているので, JUnit 形式で出力してくれる npm パッケージを npm の依存関係に追加する．
```bash
npm install karma-junit-reporter --save-dev
```

# karma.conf.js を編集
注意するのは，CircleCI のレポート出力先は環境変数で指定しなければいけないので，Karma の設定ファイル内で環境変数を読む必要があるところ．Node.js の process.env が使える．
ローカルで回したときはレポート用の JUnit は必要ないけれども，一応ビルド成果物の出るディレクトリ (下の例なら `dist`) に吐き出しておく．

```diff
 module.exports = function(config) {

+  var reportDir = process.env['CIRCLE_TEST_REPORTS'] || 'dist/tests';

   config.set({
     ...
     plugins: [
       ...
+      'karma-junit-repoter'
     ],
     ...
     reporters: [
       'dots',
+      'junit'
     ],
+    junitReporter: {
+      outputDir: reportDir + '/junit',
+      outputFile: 'test-results.xml',
+      suite: '',
+      useBrowserName: false
+   },
  ...
   })
 }
```
Linuxカーネル怖近、ブートローダ怖近な人が試すべきGentooインストールのススメ

GentooというLinuxディストリビューションをインストールした時に考えたことのメモベースの入門案内です。
ススメと言っているがインストールしたばかりの初心者だから全く詳しくないし間違っててもてへぺろ。

# ススメたい人
- UbuntuをCDとかからGUIでインストールするくらいはできる
- Linuxユーザとして表面は多少使える（Rails動かせるとか）
- __カーネルとかgrubとか`/dev/sda`とか怖近__って人

# Gentooとは? + そのインストールとは?
## GentooはLinuxのディストリビューション
- 入ってしまえばUbuntuのCUIみたいな感じで__それなりに普通に使える__
    - 癖はあるというか、アプリケーションは一つずつ全部自分で入れる必要がある
- 今回他人から__使うことよりインストールに意味がある__と聞いて試してみた
- FreeBSD版のGentooもあるらしい（よくわかってない）

## Gentooのインストールは色々学べる
- Ubuntuインストーラーで、新機能スライドを見ながら待機している間に行われていることを__だいたい自分でやる__
    - GentooのインストールCDは、そのための__最小限のツール郡が整えられたGentoo__が入っている
- かなり__詳しく書かれたチュートリアル__が__日本語__で用意されている
- ブラックボックスだった__パソコンやLinuxOSの低レイヤー部分__の透けて見える
    - より明確にいえば__Linuxの起動する流れとそのためのファイル配置と設定__が分かるようになる
        - システムコールとかプロセスとかシェルとかttyみたいな中盤部分は全く見えません
    - 透けて見えるだけで結局ちゃんとしたことは勉強するしかないだろうが、でも__取っかかりやすくなる__思う

# 実際に試してみようとなったとき
3時間ぐらいあれば準備とかはほとんど要らないので思い立った時にやろう

## 手順
- [VirtualBox](https://www.virtualbox.org/)をインストールする
- 仮想マシンを立てる: 名前はGentoo、ディスクは16GB（genkernel使ったら8GBでギリギリ足りなかった）
- あとは詳細なハンドブック（[amd64用はこちら](https://wiki.gentoo.org/wiki/Handbook:AMD64/Full/Installation/ja)）に従うだけ。
    - 大まかな流れは以下の通り
        1. CD上のGentooを起動してネット接続する
        2. HDDの設定をしてマウントし読み書きをできるようにする
        3. HDD上に、stage tarballをダウンロードし展開し、基本的な
        4. Linuxカーネルをコンパイルする
            - コンパイルのための環境設定
            - ソースコードのダウンロード
            - システムに合わせたカーネル設定
            - コンパイル
        5. Linuxシステムの各種設定をする
        6. ブートローダをインストール・設定して起動時にHDDのLinuxを読み込むようにする
        7. CDを取り外して再起動し、HDDからGentooが起動することを確認する

## 各ステップの注意点
#### 1. CD上のインストール用の小さなGentooを起動してネット接続する
- このGentooを利用して用意した仮想ディスク（HDD）にGentooを入れるのが目標
- VirtualBoxはCDに書き込まなくてもisoファイルをそのままCDとして読み込める
- ネットは最初からつながっている
- sshdを起動し、VirtualBoxのポートフォワーディング機能などを利用してssh接続で操作すると、作業しやすい

#### 2. HDDの設定をしてマウントしHDDの読み書きをできるようにする
- VirtualBoxのファームウェアはUEFIではなくBIOS（多分）

#### 3. HDDの中に、stage tarballをダウンロードし展開する
- stage tarball: 必要なディレクトリ構成とファイルとが一式入ったtarball
- tarballの中身は面白くないがざっくり確認しておくとよい

#### 4. Linuxカーネルをコンパイルする
- 設定を自動でしてくれる`genkernel`というのがあり、無駄な設定が多くなるが、最初は成功体験のためにもこちらで試すとよい

# Gentooは3回インストールするべき
３回と言わず__Gentooは定期的にインストールしたくなる__と言っている友人もいるが先ずは3回かなって思った。

1. VM上でとにかく何も考えず一通りインストール
    - カーネルのインストールは`genkernel`で
    - それでも失敗しうるし（冒頭にあげたレベル感であれば）分からなくて調べることは沢山あるはず
2. VM上であれこれ考えながらインストール
    - カーネルのインストールは`menuconfig`で
    - 省ける部分を省く、手順をちょっと入れ替えてみるなどという方針を持って考えるとよい
3. 自作PC上でインストール
    - __やってないけど__やると良さそうだなと


# 以上です
ぶっちゃけ分からんことばっかりだ。ご指摘ください。
LJの力計算のSIMD化ステップ・バイ・ステップ その4

# はじめに

前回までで4倍展開したループのSIMD化が完了した。いよいよ実測である。

* [その0](http://qiita.com/kaityo256/items/5be3ce71a6ff9522a0e6) 
* [その1](http://qiita.com/kaityo256/items/4d34bf144122b78fcf49)
* [その2](http://qiita.com/kaityo256/items/e6c41b94c5cc5189c5cc) 
* [その3](http://qiita.com/kaityo256/items/7f16ab7f2281bb03e83e) 
* [その3.5](http://qiita.com/kaityo256/items/b145b2d83becccd0aa53) 
* [その4](http://qiita.com/kaityo256/items/636c5a407f5a6c61bb21) ←イマココ
* [その5](http://qiita.com/kaityo256/items/dacbe5a16abbc83eb107)
* [その6](http://qiita.com/kaityo256/items/34c371c6d040be1bdc30)

コードは
https://github.com/kaityo256/lj_simdstep
においてある。

# SIMD化完了

4倍展開したSIMD化が完了した。基本的に4倍展開されたループのSIMD化はほぼ自明だが、少しだけ非自明なのは、4倍展開して得られた4つの相対距離を一つのYMMレジスタにまとめ、力の計算を4ペア同時に行ってから、またバラす作業。まずまとめるところ。

```cpp
    v4df vr2_13 = _mm256_unpacklo_pd(vr2_1, vr2_3);
    v4df vr2_24 = _mm256_unpacklo_pd(vr2_2, vr2_4);
    v4df vr2 = _mm256_shuffle_pd(vr2_13, vr2_24, 12);
    v4df vr6 = vr2 * vr2 * vr2;
    v4df vdf = (vc24 * vr6 - vc48) / (vr6 * vr6 * vr2);

    v4df mask = vcl2 - vr2;
    vdf = _mm256_blendv_pd(vdf, vzero, mask);
```

`vr2_1`から`vr2_4`までには、(r2_1, r2_1, r2_1, 0)みたいなデータが入っている。ここから(r2_1, r2_2, r2_3, r2_4)を作るのに、unpack二回とshuffleを使っている。その後は普通に計算している。ただし相互作用範囲外のペアの処理が必要となるため、blendv_pdでマスク処理をしている。

次にバラすところ。

```cpp
    v4df vdf_1 = _mm256_permute4x64_pd(vdf, 0);
    v4df vdf_2 = _mm256_permute4x64_pd(vdf, 85);
    v4df vdf_3 = _mm256_permute4x64_pd(vdf, 170);
    v4df vdf_4 = _mm256_permute4x64_pd(vdf, 255);
```
計算された力(df1,df2,df3,df4)から、(df1,df1,df1,df1)〜(df4,df4,df4,df4)を作っているこうすると力積ベクトルの計算がスムーズなので。非自明なところはこれくらいだと思う。

# 結果

| 計算手法 | 実行時間[sec] |備考 |
|:-:|:-:|:-:|
| pair  | 8.176446  |  ペアごとにループをまわしたもの |
| pair_swp  | 6.995374  |  上記をソフトウェアパイプライニングしたもの |
| pair_swp_intrin  | 4.276301   |  上記を4倍展開してSIMD化したもの |
| sorted_intrin| 3.882854| i粒子でソートしたものをSIMD化したもの|

・・・ソートバージョンのSIMD化に負けた　○|￣|＿

それなりに加速したものの、ソートバージョンに低密度でも負けたので、ループ長が短いところで「ゴミがほとんど生じない」メリットは、メモリアクセスが増えるデメリットに負けたようだ。

調べてみると、ソートしてソフトウェアパイプライニングしたのの(SIMD化前)のIPCが2.12なのに対し、ソートしないでソフトウェアパイプライニングしたもの(SIMD化前)のIPCが1.99と若干低く、かつ命令数が増えてしまっているのが敗因のようだ。

残念ながら、今回の方針では早くならなかった。参考にならないだろうが、コードは

https://github.com/kaityo256/lj_simdstep/tree/master/step4

においておく。

[次回に続く](http://qiita.com/kaityo256/items/dacbe5a16abbc83eb107)。
LJの力計算のSIMD化ステップ・バイ・ステップ その3.5

# はじめに

LJのSIMD化の試み。4倍展開したループをSIMD化するが、その途中経過。

* [その0](http://qiita.com/kaityo256/items/5be3ce71a6ff9522a0e6) 
* [その1](http://qiita.com/kaityo256/items/4d34bf144122b78fcf49)
* [その2](http://qiita.com/kaityo256/items/e6c41b94c5cc5189c5cc) 
* [その3](http://qiita.com/kaityo256/items/7f16ab7f2281bb03e83e) 
* [その3.5](http://qiita.com/kaityo256/items/b145b2d83becccd0aa53) ←イマココ
* [その4](http://qiita.com/kaityo256/items/636c5a407f5a6c61bb21)
* [その5](http://qiita.com/kaityo256/items/dacbe5a16abbc83eb107)
* [その6](http://qiita.com/kaityo256/items/34c371c6d040be1bdc30)

コードは
https://github.com/kaityo256/lj_simdstep
においてある。

今回、ようやくAVX2命令が出てきた。

# デバッグ

ループが4倍展開されているので、SIMD化するのはわりと「そのまま」できる。だが、ymmの上位と下位がごっちゃになったり、依存関係を間違えてロードしてしまったりとバグを入れることがすごく多い(経験談)。というわけで、SIMD化の「途中」のコードを晒しておく。誰かの参考になれば。

# 実例1

以下は相対座標を計算するコードである。

```cpp
  double dx_b1 = q[j_a1][X] - q[i_a1][X];
  double dy_b1 = q[j_a1][Y] - q[i_a1][Y];
  double dz_b1 = q[j_a1][Z] - q[i_a1][Z];
```
先に述べたように、データ構造が[x1,y1,z1,0,x2,y2,z2,0, ...]と並んでいるので、xyz座標をload_pd一発で持ってこられる。そこで、左辺と右辺をそれぞれ取得し、引けば上記のSIMD化は完成である。

```cpp
  v4df vqi_a1 = _mm256_load_pd((double*)(q + i_a1));
  v4df vqj_a1 = _mm256_load_pd((double*)(q + j_a1));
  v4df vdq_b1 = vqj_a1 - vqi_a1;
```

デバッグ用に`print256`という関数を用意してある。これでv4dfベクトル(ymmレジスタ)を表示し、たしかにこれが(dx_b1, dy_b1, dz_b1, 0.0)というベクトルになっているかを確認する。

# 実例2

以下は４倍展開の1番目のペアの相対距離の計算ルーチン。

```cpp
const double r2_1 = (dx_a1 * dx_a1 + dy_a1 * dy_a1 + dz_a1 * dz_a1);
```
先程、ymmレジスタには(dx,dy,dz,0)という形で相対ベクトルが入っている。これを自乗すると(dx^2, dy^2, dz^2)になる。
これを`_mm256_permute4x64_pd(vr2_1x, 201)`で (dy^2, dz^2, dx^2, 0)に、`_mm256_permute4x64_pd(vr2_1x, 210)`で (dz^2, dx^2, dy^2,0)にして、全部足すと (r2_1, r2_1, r2_1, 0)になるはずである。

そこを確認しているコードが

```cpp
    v4df vr2_1x = vdq_a1*vdq_a1;
    v4df vr2_1y = _mm256_permute4x64_pd(vr2_1x, 201);
    v4df vr2_1z = _mm256_permute4x64_pd(vr2_1x, 210);
    v4df vr2_1 =  vr2_1x + vr2_1y + vr2_1z;
    /*
    printf("%.10f\n",r2_1);
    print256(vr2_1);
    exit(1);//ここまでOK
    */
```

いちいち表示して`exit(1)`しては「ここまでOK」とチェックをしている。地道な作業である。まぁ、世の中print文デバッグは基本なのである。こうして全ての計算をスカラ計算とベクトル計算で同時に行い、全ての結果が正しいことを確認したところまでが

https://github.com/kaityo256/lj_simdstep/tree/master/step3.5

にある。

こういう「SIMD化作業途中」のコードが晒されることってあまりなさそうなので晒してみた。

[次回に続く](http://qiita.com/kaityo256/items/636c5a407f5a6c61bb21)。
spring-boot-devtools には automatically disabled when running a fully packaged application と書いてあるけどそうではない話し

https://github.com/spring-projects/spring-boot/issues/7328

2016/11/06時点の最新版である、1.4.1.RELEASE についての話しです。

A. [ドキュメントによれば、jar とかでは自動的に無効になるって書いてあるけど、そうなってないですよね？](https://github.com/spring-projects/spring-boot/issues/7328)
Q. Duplicates [#7014](https://github.com/spring-projects/spring-boot/issues/7014) → 7014 によれば、「ドキュメントの方を変える必要があるかも (We may just need to fix the documentation.)」とのこと。

```groovy
springBoot {
    excludeDevtools = true
}
```
で対応するのが筋よさそうだ。
PCとSPが同一URLのサイトのフロント実装のTIPS(pugを使用)

## 経緯
PCとSPでURLの階層が違うサイトでは問題は起こらないですが、PCとSPで同一URLのサイトを作成する場合、ちょっと開発環境でつまづきました。
これは実装者、そしてクライアントへのプレビューなども円滑に行うためのTIPSです。

## 公開までの流れ
こちらでフロント側の実装を行う
⬇︎
こちら側のテストサーバーでプレビュー
⬇︎
PC,SPのデータをそれぞれ納品する
⬇︎
クライアントのほうで納品されたhtmlをサーバーサイドに組み込む（独自のシステムか何か）
⬇︎
サーバーサイド側でユーザーエージェントを判別してコンテンツを描画するのでURLは１つ.
http://hoge/aaa/

## 開発環境
- gulpとgulp-pugを使う、ローカルサーバーはnodeで立てる
- でもテストサーバーは apache

## やりたいこと

<b>・PCとSPのhtmlは同一階層に生成したい</b>
<b>・ローカルでも同一URLで見たい</b>


## やったこと

pugで、同一階層にそれぞれPC,SPのデータを出す、でもデフォルトではhtmlしか出せないので少し工夫が必要。
PC→ .html  SP→ .htm にすることにしました。

```javascript:gulpfile.js

  gulp.task('pug_pc', function(){
    gulp.src([paths.root + '/**/*.pug', "!"+ paths.root + '/**/sp_*.pug',"!"+ paths.root + '/**/_*.pug'])
      .pipe(plumber())
      .pipe(pug({
        pretty: true
      }))
      .pipe(gulp.dest(paths.dist))
  });

  gulp.task('pug_sp', function(){
    gulp.src([paths.root + '/**/sp_*.pug'])
      .pipe(plumber())
      .pipe(pug({
        pretty: true
      }))
      .pipe(rename(function(path){
        path.basename = path.basename.replace("sp_","");
        path.extname = path.extname.replace(".html",".htm");
      }))
      .pipe(gulp.dest(paths.dist))
  });

```

index.pug
sp_index.pug
のようにして、それぞれ、index.html,index.htm
が生成されるようにしました。


次にローカルでのプレビューですが、以下のようにしました。

```javascript:gulpfile.js
// server
gulp.task("server",function(){
    browser.init({
      server: {
        baseDir: paths.dist,
        middleware: [
          ssi({
            baseDir: paths.dist,
            ext:".html"
          })
        ]
      }
    })
});


gulp.task("server_sp",function(){
    browser.init({
      server: {
        baseDir: paths.dist,
        middleware: [
          ssi({
            baseDir: paths.dist,
            ext:".htm"
          })
        ]
      }
    })
});
```
タスクをPCとSPで分けたので、
それぞれ、 http://localhost:3000/ とかで見ることができます。


ローカルだとこのままでいいのですが、テストサーバー（apache上）だとこうはいきません。
このままだと、

http://hoge/aaa/ (PC)
http://hoge/aaa/index.htm (SP)

のようになってしまい、例えば、スマフォサイトのaタグ（href="/bbb/"）をクリックするとPCページへ飛びます。
このままではスマフォのプレビューはURLを直で叩くしかありません。

なので、.htaccessに以下のような記述を追加しました。

```javascript:.htaccess
RewriteEngine On

# スマフォはhtmにリライト
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone|iPad|Android|Windows\ Phone)
RewriteCond %{REQUEST_URI} /$
RewriteRule (.*) $1/index.htm
```
これを行うことでスマフォで以下のURL にアクセスすると
http://hoge/aaa/
URLはそのまま、で
http://hoge/aaa/index.htm
のデータを描画してくれます。


## 結果
これによって

以下を叩くと、PCだとPCのSPだとSPのデータを読み込む。
http://hoge/aaa/

以下を直接叩くとPCが見える
http://hoge/aaa/index.html
以下を直接叩くとSPが見える
http://hoge/aaa/index.htm

テスト環境でのプレビュー用としては申し分ないと思います。