OmniAICreator/Qiita-1.07M huggingface dataset:
C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（２）　DB作成編

今回は、学習データベース作成のお話。

# 概要
Caffeで学習を行うときは、以下の2種類のデータ（以下、「学習データベース」と呼びます）のどちらかから読み込むことになります。

- leveldb
- lmdb

これを作成するモジュールが「convert_imageset.exe」です。

※「lebeldb」「lmdb」については[ここ](https://hiro99ma.blogspot.jp/2015/10/caffelmdb.html)とか[ここ](http://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207)などを参照してください

今回は複数の画像から学習データベースを作成することを想定して話を進めていきます。

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/74380913-b379-0ffd-8d10-9e70817358fe.png)

# 引数
「convert_imageset.exe」のシンタックスは以下のようになっています。

```
convert_imageset [FLAGS] ROOTFORDER/ LISTFILE DB_NAME
```

## FLAGS
代表的な引数は以下の通りです。
（全てを知りたい人は「convert_imageset -help」を実行）

| FLAGS | 意味 | 設定例 |
|:--|:--|:--|
| -backend | データベースの種類 | -backend lmdb |
| -resize_height | 登録する画像の高さを指定 | -resize_height 256 |
| -resize_width | 登録する画像の幅を指定 | -resize_width 256 |
| -shuffle | 画像の順番をランダムに入れ替えるか（指定するとtrueになる） | -shuffle |

あらかじめ画像サイズをそろえておくのもよいですが、ここでそろえたほうが楽です。
ただしあまり大きくし過ぎると処理が重くなる（GPU使用の場合はエラーになることも）ので注意が必要です。

画像の順番をランダムに設定するのは、非常に重要です。

## ROTFOLDER
用意した画像ファイルがあるフォルダ名を指定します。
最後の「/」を付け忘れないように。
このフォルダが基準となり、次の「LISTFILE」や「DB_NAME」にファイル名やフォルダ名を指定します。

## LISTFILE
学習に使用する画像ファイルをすべて指定したテキストファイルを用意し、そのファイル名を指定します。（ROOTFOLDERからの相対パス）

フォーマットは、以下の2項目をスペース区切りで指定します。

- パス（ROOTFOLDERからの相対パス）
- 分類番号

こんな感じです。

```
data/segment0/image1.jpg 0
data/segment1/image1.jpg 1
```

分類ごとにフォルダ分けしておいた方が、作りやすいし、メンテナンスもしやすいです。

分類番号は0スタートです。
後で学習するときに、分類番号と分類名を関連付けるファイルを読み込むことになります。（1行目が0、2行目が1といった感じのファイルになります）

## DB_NAME
学習データベースのフォルダ名（ファイル名ではない！）です。
こちらもROOTFOLDERからの相対パスで指定します。

# その他
この学習データベースは、「トレーニング用」と「テスト用」の2種類用意します。
トレーニング用で学習を行い、テスト用で誤差率を計測します。
同じデータを使うと正しく精度がでませんのでご注意ください。
ファイル数の比率は5:1～10:1ぐらいがよいかと思います。

# 参考資料
[http://caffe.berkeleyvision.org/](http://caffe.berkeleyvision.org/)

# 関連記事
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（１）](http://qiita.com/mine820/items/37862e45aa66c2ad8b80)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（３）](http://qiita.com/mine820/items/f4395a3ac734085e5ed1)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（４）](http://qiita.com/mine820/items/41347cd99278d0dc6715)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（５）](http://qiita.com/mine820/items/e8857fee3fa0b4ada170)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（６）](http://qiita.com/mine820/items/01a275d1065d299702fc)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（７）](http://qiita.com/mine820/items/1e100330d163f9959c65)
[C++プログラマがWindows上でCaffeを使ってDeep Learningするお話（８）](http://qiita.com/mine820/items/30fcc4e5f794c42b4bd7)
UnityのuGUIで画像をタイリング表示するには


## はじめに
ゲームを作る際に背景等をあるパターン画像でタイリング表示（同じ画像を敷き詰めるような表示）したい場合があります。uGUIには簡単にこの処理ができる機能があるため紹介したいと思います。

## 前提
* Unityのバージョンは5.4.2f2で確認

## 手順
タイリングさせたい画像をUnityプロジェクトにインポートし、Inspectorウィンドウ内の「Texture Type」を「Sprite (2D and UI)」に変更し「Apply」をクリックします。

![Kobito.Z7iX7u.png](https://qiita-image-store.s3.amazonaws.com/0/5879/94b4a8e4-82b5-b987-b706-ca9a2eae73ee.png "Kobito.Z7iX7u.png")

Hierarchyウィンドウ内で「Create」→「UI」→「Image」をクリックするとタイリングさせたい画像を配置するImageオブジェクトが作成されます。別の方法でImageオブジェクトを作成しても構いません。

![Kobito.wlYZVk.png](https://qiita-image-store.s3.amazonaws.com/0/5879/50ac3c60-f1d1-6038-2d24-b9d22e34aa20.png "Kobito.wlYZVk.png")

Imageオブジェクトを選択し、Inspectorウィンドウ内のImageの「Source Image」に先ほどインポートした画像を設定し、「Image Type」を「Tiled」に設定します。

![Kobito.I64tAm.png](https://qiita-image-store.s3.amazonaws.com/0/5879/98170da3-e876-d2c2-2fec-0d15d83f939e.png "Kobito.I64tAm.png")

Sceneウィンドウ内で画像の四隅にある青い丸をドラッグして大きさを調整すればタイリング表示を確認することができます。

![Kobito.MJYAys.png](https://qiita-image-store.s3.amazonaws.com/0/5879/c0925e7d-6c86-b014-8ccb-91bed8b9d163.png "Kobito.MJYAys.png")


## 参考
* https://docs.unity3d.com/ja/current/ScriptReference/UI.Image.Type.Tiled.html
Swift3.0の変更で目にするようになった関数の引数についている_ アンダースコアについて


Swift3.0から引数にアンダースコア（ _ <-こいつ）をつけることが多いと思うのでその説明


### Swift2.3以前の実装

```
func hoge(a:int){...}
hoge(10)
```

### Swift3.0
Swift3.0からは引数が１つでも引数名を追記しないといけない。

```
func hoge(num:int){...}
//こんな感じに
hoge(num:10)

```

ただ、Swift2.3からの移行ではこれを全部書くのは大変なので以下のようにアンダースコアを追記すれば今まで通り引数が省略できる。

```
func hoge(_ a: Int) {...}
card(1) //省略ver
```

ただ、可読性を高める高めに新しく書く場合にはアンダースコアを入れずに書いていきたい。
privateとfileprivateの違いについて


Swift3.0からfileprivateが増えました。
**fileprivateはSwift2.3までのprivateと同じです**
なのでSwift2.3からprivateを書き直すとfileprivateになります。

Swift3.0ではprivate(+public)の振る舞い、意味が変わっています。
fileprivate: 同じソースファイルのみアクセス可能
private: 定義されたクラス内などのスコープ内のみでアクセス可能
fileprivate > private
【Swift3】UITableViewで一番下までスクロールしたことを検知する

UITableViewで一番下までスクロールしたら次の20件を表示する、というようなことを実現する方法。

UITableViewはUIScrollViewを継承しているので、scrollViewDidScrollメソッドを使って、
一番下までスクロールしたことを検知します。

ちなみにscrollViewDidScrollメソッドはスクロールする度に呼ばれるので、一番下までスクロールした時のみ実行されるようif文で制御する必要があります。


# コード
```.swift

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    if tableView.contentOffset.y + tableView.frame.size.height > tableView.contentSize.height && tableView.isDragging {
        print("一番下に来た時の処理")
    }
}

```

**<font color="red">※tableView.isDraggingがないと画面遷移するときも呼び出されてしまうので注意が必要です。</font>**
技術英語 > and trying to diagnose the problem with only one test case often doesn't diagnose [the root problem] / the root cause of the problem

@ Code Complete (No. 17604 / 36077)

> and trying to diagnose the problem with only one test case often doesn't diagnose <font color=red>the root problem</font>

http://ejje.weblio.jp/content/root+problem
> 根本問題

<hr>
関連して思い出したのは

the root cause of the problem

http://www.linguee.jp/%E8%8B%B1%E8%AA%9E-%E6%97%A5%E6%9C%AC%E8%AA%9E/%E7%BF%BB%E8%A8%B3/root+cause+of+problem.html

>  and try to correlate information across different sources of information to find root cause of problems. 

rootの前にtheがつく用法をよく見かけるが、上記の例文にはtheはない。typoかも。
DynamoDBが更新されたらS3にJSONを吐いてGETで呼べるようにする



前回記事[S3へ保管したメールをパースしてDynamoDBへ入れてみる](http://qiita.com/foxtrack/items/f4617eff910235a10c0a) の続きです。

これまでの記事でAWS SESで受信したメールをパースして、Lambdaを使ってDynamoDBヘ格納できるようになりました。

# 図解

![Kobito.l7e8Li.png](https://qiita-image-store.s3.amazonaws.com/0/142489/96130ab5-482b-bc4f-293d-ff99d36f78e1.png "Kobito.l7e8Li.png")

だいぶ荒いですが、図解するとこんな感じです。

# 主旨
今更ですが主旨としては「福岡市の消防車や救急車が出動したら配信されるメールをクラウド上で受信して、情報を整理して直近10件の情報を返すAPIを作ろう！お金ないしサーバレスにしよう！」というものです。

# 今回やる事
今回はついにAPIっぽい感じに出力します。
手段としては、DynamoDBの「トリガー」を使い、DynamoDBに更新がかかったらLambdaをキックし、DyanmoDBから直近10件のデータを取得してS3にJSONファイルとして書き込みます。

![Kobito.rf6Zwf.png](https://qiita-image-store.s3.amazonaws.com/0/142489/6813f1cf-a35a-d102-161b-0ac00f465094.png "Kobito.rf6Zwf.png")

図にするとこの6番ですね。

# DynamoDBのトリガー

DynamoDBに更新がかかったらLambdaがキックされるように設定します。

![Kobito.OzyFMc.png](https://qiita-image-store.s3.amazonaws.com/0/142489/82169e28-4a48-29b0-1bd3-351ad8906bf7.png "Kobito.OzyFMc.png")

トリガータブから「トリガーの作成」を選びます。
新規でLambdaを作成するか、既存のLambdaを選択することが可能です。
今回は既存のLambdaを呼びます。

![Kobito.166a6B.png](https://qiita-image-store.s3.amazonaws.com/0/142489/47518611-6d7b-0b0a-547d-b93e204ac487.png "Kobito.166a6B.png")
シンプルでいいですね。実行したいLambdaとバッチサイズを選びます。
バッチサイズとは、同時にLambdaに投げられる数らしいです。
1件ずつ処理したい場合は1とかにすればいいと思いますが、今回は最新の状態が維持できればいいので100でいいのかなと。（データ取り直してるし。。。）

# Lambda
今回はこんな感じのコードになりました。

```
'use strict';

var request = require('request');
var aws = require('aws-sdk');
var unmarshalItem = require('dynamodb-marshaler').unmarshalItem;
var tableName = "Dispatches";
var dynamo = new aws.DynamoDB();
var s3 = new aws.S3();

var param = {
    TableName: tableName,
    Limit: 10
};

exports.handler = (event, context, callback) => {
  dynamo.scan(param, function(err, data) {
    if (err) {
      context.fail(err);
    } else {
      var items = data.Items.map(unmarshalItem);
      s3.putObject({
        Bucket: YOUR_BUCKET_NAME,
        Key: YOUR_FILE_NAME,
        ContentType: 'application/json',
        Body: JSON.stringify(items)
      }, function(err, data){
          if(err){
              console.log("error" + err);
          }else{
              console.log("worked, data: "+JSON.stringify(data));
          }
      });
      context.succeed(items);
    }
  });
};
```
DynamoDBから10件取ってきて、S3にPUTしているだけですね。シンプル。

![Kobito.oWeXWh.png](https://qiita-image-store.s3.amazonaws.com/0/142489/a8400631-2f72-2684-8b1c-1e3be1e39cf8.png "Kobito.oWeXWh.png")

メールの受信を待ってみると、無事にJSONファイルがS3に吐かれました。
ちなみにこのS3のバケットは静的ウェブサイドホスティングを有効にしているので、GETで呼べます。簡易API！！

![Kobito.7BJdWo.png](https://qiita-image-store.s3.amazonaws.com/0/142489/fc5a66e6-7e3a-e3e6-2ddc-de8ce4e8249e.png "Kobito.7BJdWo.png")

静的ウェブサイドホスティングについては[AWSのS3で静的Webサイトを公開する手順まとめ](http://qiita.com/nabettu/items/1605f78977d9909b5182)をご参照ください。

このような手法を取ると、簡単なデータ処理やAPI提供はサーバレスな感じで（安価で）提供できそうですね。

と思ったらこれ。。。直近10件になってないですね。。。修正しないと。。。
Makefileを使ったデータ処理テンプレート

# 動機

自然科学系の多くの分野で要求されるデータ処理には、以下のような特徴が一般的だと思います。

1. 互いに依存関係のある複数の処理を順番に行う
1. コードを試行錯誤しながら反復的に実行する。出力された図や数値を人間が見てコードを修正し、必要なステップを再実行する必要がしばしば生じる
1. 処理間で渡されるデータの形式が決まっておらず、ファイル数も多くなりがち

個人的には2番目の特徴が厄介で、コードの実行漏れやコードとデータの乖離を防ぐためにこれを自動化したいと前々から思っていました。

特徴1,2だけを見ると、愚直にMakefileにファイルの依存関係を書いて利用すれば解決できそうですが（参照に挙げたGNU Make for Reproducible Data Analysisがこの例）、3つ目の特徴によりファイルの依存関係をMakefileに書いてしまうと、頻繁にMakefileを修正する必要があり効率的ではありません。

そこで、以下のような対案を実装したところ使い勝手が良かったので共有します。

* やりとりされるデータファイルではなく、処理そのものに着目した依存関係をMakefileに記述する

# サンプル (Makefile）
※コピペするとインデントがスペースになるので注意。タブに直してください。

```
#================================
# STEP_ALL : スペース区切りで全ステップ名。数字以外も使用可能
# src_[step] : 実行判断に利用されるソースファイルや実行プログラム
# dep_[step] : 依存するステップ名
# out_[step] : 出力ファイル（ワイルドカード可）。実行には関係ないが、make cleanで消去できるので書いておくと便利。
# cmd_[step] : 実行コマンド
#================================

STEP_ALL = 1 2

src_1 = src1.sh # echo xxx > out1.txt
dep_1 =
out_1 = out1.txt
cmd_1 = sh src1.sh

src_2 = src2.sh # cat out1.txt >> out2.txt
dep_2 = 1
out_2 = out2.txt
cmd_2 = sh src2.sh

# ===============================================
# 以下、利用時に編集の必要なし
# ===============================================

VPATH = .make
all: $(STEP_ALL)

# 依存関係のテンプレート
define rule_comm
$1: $(src_$1) $(dep_$1)
	@echo "STEP $1:"
	$(cmd_$1)
	@mkdir -p $(VPATH)
	@touch $(VPATH)/$1
endef

# 各ステップ分の依存関係を作成する
$(foreach i, $(STEP_ALL), $(eval $(call rule_comm,$i)))

clean:
	rm -rf $(foreach i,$(STEP_ALL),$(out_$i))
	@rm -rf $(VPATH)

.PHONY: all clean
```

簡単なサンプルとして2ステップのものを掲載しましたが、より実用的な依存関係の例としてはこんな感じでしょうか。（src_, cmd_, out_も各ステップ分追加する必要があります。）

```
STEP_ALL = compile1 exec1 plot1 compile2 exec2 plot2 latex

dep_compile1 =
dep_exec1    = compile1
dep_plot1    = exec1
dep_compile2 = 
dep_exec2    = compile2
dep_plot2    = exec2
dep_latex    = plot1 plot2
```


# サンプルコードの解説
カレントディレクトリに隠しディレクトリ.makeを作成し、その中に各ステップの実行時刻を変更時刻(mtime)に持つ空ファイルを作成します。Makeが src_\* の更新及び dep_\* の新規実行を監視して必要最低限のコマンドを実行してくれます。

実行時にMakeに引数を渡してやれば、任意のステップのみを実行することも可能です。

```
$ make       # 全ステップと必要な依存関係が更新される
$ make plot1 # plot1とその依存関係のみ更新される
```

GNU Make 3.81で動作確認をしています。

# 課題
上記サンプルの問題点と対策案

* スパコンなどで利用されるバッチ型ジョブスケジューラとの連携
  1. sleep等を利用しつつジョブを監視し、終了時に続きを実行する
  1. ジョブを投げた時点でmakeを終了。ジョブの末尾でmakeを起動するようにしておいて再帰的に実行する（すでに終了しているプロセスは自動的にスキップして続きから実行される）
  1. スケジューラが要るような大きなジョブは（安易に投げられない＝あまりご利益がないので）別管理にする

# 参照
makeを使ったデータ処理。
http://www.slideshare.net/HirofumiSaito/osc2015-tokyo-spring20150228

GNU Make for Reproducible Data Analysis
http://zmjones.com/make/
ASP.NETでLessを利用する方法

#パッケージのインストール
パッケージマネージャーコンソールにて、下記の2つパッケージをインストールする
>PM> Install-Package dotLess
>PM> Install-Package System.Web.Optimization.Less



#ファイルの編集
Shared/_Layout.cshtml　ファイルに下記を追加する

```html:Shared/_Layout.cshtml
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title - My ASP.NET MVC Application</title>
        <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
        <meta name="viewport" content="width=device-width" />
        @Styles.Render("~/Content/less")  <!-- この行を追加する -->
        @Scripts.Render("~/bundles/modernizr")
    </head>
.
.
.
```


BundleConfig.cs　ファイルに下記を追加する

```csharp:App_Start/BundleConfig.cs
public class BundleConfig {
    public static void RegisterBundles(BundleCollection bundles) {
      bundles.Add(new LessBundle("~/Content/less").Include("~/Content/*.less")); // この行を追加する
    }
}
```


#参考
http://www.brendanforster.com/blog/yet-another-implement-less-in-aspnetmvc-post.html
ファイルリストをHTTP GETメソッドで取得する

#はじめに
[DataSpiderサーバをテンポラリとして利用する方法](http://qiita.com/appresso_wakino/items/560e2e20548eb0685bd0)のもうひとつの機能である、ファイルリストの取得を実装してみます。
処理としては非常に簡単で、`ファイル名一覧取得`コンポーネントを使って一覧を取得したあと、JSONフォーマットに置き換えるだけ。

事前準備として取得したいjsonフォーマットを決めてDataSpider上に保存しておきます。<br>今回はこんな形式にしました。<br>

```json
[
  {
	"file_name": "",
	"file_size":"",
	"updated":""
  }
]
```


#スクリプトの実装

1. 完成図<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/5ab1a2fa-134f-c37a-e175-0201f7a65066.png)
2. `ツールパレット`→`ネットワーク`→`REST`→`GET実行`をキャンバスにドラッグ&ドロップします。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/3a8e327c-1992-b895-80d7-ae2afc549351.png)<br>`レスポンス設定`タブのデータ形式を`JSON`にして`JSONファイルを指定して出力スキーマを設定...`から、事前に準備しておいたJSONファイルを指定して設定完了です。
3. `ツールパレット`→`ファイル`→`ファイル操作`→`ファイル名一覧取得`をキャンバスにドラッグ&ドロップします。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/2a0a0b54-b53f-d718-c0e5-5ab0ad9414c9.png)<br>ファイルの保存先を指定して設定は完了です。
3. `ツールパレット`→`変換`→`基本`→`マッピング`をキャンバスにドラッグ&ドロップします。
    4. `出力データ`の`list xml`を右クリックして`スキーマを読み込む`を選択します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/d25451a5-34c6-4d62-ea9e-145aec0a1c70.png)
    5. スキーマの読み込みで`コンポーネントから選択`を選択し、`execute_http_get（RESTアダプタ）`を選択します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/6939dc22-ea8e-b19a-f00e-683a5f157c7b.png)
    6. まずはファイルの取得条件を設定します。（青い線の部分です）<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/a4f336b8-093f-89aa-c5a4-3c0b70a530de.png)<br> - `ツールパレット`→`繰り返し`→`条件指定`→`条件による抽出`をキャンバスにドラッグ&ドロップします。<br> - `ツールパレット`→`文字列`→`基本`→`単一行文字列定数`をキャンバスにドラッグ&ドロップし、`file`を設定します。<br> - `ツールパレット`→`条件`→`文字列`→`同じ`をキャンバスにドラッグ&ドロップし、図のように線をつないでいきます。<br>`ファイル名一覧取得`コンポーネントでは指定するディレクトリ配下のディレクトリ名、ファイル名のすべてを取得しますので、この条件式で、ファイル名だけ取得することができるようになります。
    7. 次にJSONフォーマットを指定します。（赤い線の部分です） <br> - `ツールパレット`→`文字列`→`基本`→`単一行文字列定数`をキャンバスにふたつドラッグ&ドロップし、取得したいJSONフォーマットの通り`array`と`object`を設定し、`type`属性につなぎます。
    8. 最後に必要なカラム同士を結んでマッピング設定は完了です。
9. あとは完成図の通り、`Start`から`end`まで線を結んで、プロジェクトをサービスに登録したらスクリプトの作成は完了です。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/fabab476-0c5e-cd55-994a-b8658dd29619.png)
10. メニュー→`マイトリガー`から`新しいHTTPトリガー`を作成します。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/d371dee5-80e5-aad3-a229-f600a36d84bc.png)<br> - ここでは実行パスを`/filelist`としました。<br>`レスポンス設定`のContent-Typeを`application/json`に設定します。
11. 実行パスの設定が終わったら次へ進んで登録したサービスと紐付けます。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/99b066f1-1716-3d96-6efb-fba76ec9d794.png)<br>あとは保存したら終了です。

#実行
生成されたURLに対してGETメソッドでファイルを送ってみます。
ここではDHCというChromeのプラグインを利用しています。<br>![image](https://qiita-image-store.s3.amazonaws.com/0/35843/762ec0df-1fe5-f144-db14-958f60fabfe4.png)<br>正しく取得できているようです。
Haskell: ghcでスタティックリンクする

基本的に`ghc -O -static -threaded -optl-static Main.hs`でビルドすればいいらしい。
しかしArch Linuxだとlibgmpなどのスタティック版が存在しなくて自分でビルドする必要があったのでその記録。

まず普通に上記コマンドでビルドするとこのようなエラーが出た：

```
[~:1]# ghc -O -static -threaded -optl-static Main.hs
Linking Main ...
/usr/bin/ld: -lgmp が見つかりません
/usr/lib/ghc-8.0.1/rts/libHSrts_thr.a(Linker.thr_o): 関数 `internal_dlopen' 内:
(.text+0x3a5): 警告: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/bin/ld: -lffi が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
`gcc' failed in phase `Linker'. (Exit code: 1)
```

libgmpとlibffiのスタティック版が存在しないようなので、ソースを落としてきてビルド
https://gmplib.org/download/gmp/gmp-6.1.1.tar.xz
ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
どちらも`./configure && make && make install`で問題なくビルド通って`/usr/local/lib`にインストールされる。

今度は成功：

```
[~:1]# ghc -O -static -threaded -optl-static Main.hs
Linking Main ...
/usr/lib/ghc-8.0.1/rts/libHSrts_thr.a(Linker.thr_o): 関数 `internal_dlopen' 内:
(.text+0x3a5): 警告: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
```

`dlopen`を使っているから実行時にも同じバージョンのライブラリが必要だよと出ている。
`/usr/lib/ghc-8.0.1/rts/libHSrts_thr.a`とやらの中で明示的に`dlopen`を呼んでいるということなのだろうか？そうだとしたらghcではgolangと同じような完全ポータブルなシングルバイナリを作るのは無理ということなんでしょうかね？

試しにArch（glibc 2.24-2）からAmazon Linux（glibc 2.17）へ持っていったらちゃんと動いた。でも、そもそもスタティックリンクしなくてもAmazonでなら動いた。

## 参考

https://ro-che.info/articles/2015-10-26-static-linking-ghc
http://www.edofic.com/posts/2014-05-03-ghc-arch-static.html
ハードウェアに関する基本的な用語

## ■ CPU(Central Processing Unit)

プロッサー、中央処理装置とも呼ばれる。
コンピューターにおける「制御・演算」装置。
人間の体で例えると脳にあたる。

IntelとAMDなどがCPU製造メーカーとして有名。

### ● コア

CPUの中心部品で、単体でCPUとして動作する電気回路。

* デュアルコア
1つのCPUの中に、2つのコアがあるもの

* クアッドコア
1つのCPUの中に、4つのコアがあるもの

### ● クロック周波数

CPUの処理速度を示す。

●●[GHz:ギガヘルツ]という形式で表され、
秒単位でどの位の量の計算ができるかを示す。
●●の部分の数字が高ければ高い程、処理速度は早くなる。

周波数とは単位時間あたりに発生する、音波や電波などの振動回数。
単位がヘルツの場合は、1秒あたりに発生する振動回数。


### ● アーキテクチャ

ハードウェアの基本設計や設計書思想を示す用語だが、intel, ARMなどのCPUの種類という意味で用いられる。

## ■ 記憶装置

### ● メモリ

CPUがソフトウェアの実行のために必要なプログラムやデータを
記憶しておくための記憶装置。
一時的なデータを記憶する短期的な記憶装置。

### ● ストレージ

長期的なデータを保存する記憶装置。

https://www.slideshare.net/kazuhisa/osc2011-do

#### ○ HDD(Hard Disk Drive)
記憶媒体が磁気ディスクである記憶装置。

メリットは、
* 容量が大きい
* 価格が安い
~~書き込み寿命が長い~~

デメリットは、
* 書き込み速度が低速


#### ○ SSD(Solid State Drive)
USBメモリなどと同様に、
記憶媒体が半導体メモリである記憶装置。

メリットは、
* 書き込み速度が高速

デメリットは、
* 容量が小さい
* 価格が高い
~~書き込み寿命が短い~~

* https://navi.dropbox.jp/ssd-hdd-difference
* [SSD故障事例](https://www.rescue-center.jp/explanation/ssd/failure.html)
* [SSD故障事例2](http://eetimes.jp/ee/articles/1406/11/news010.html)

#### ○ ブロック (セル)

分割したストレージの区画のこと。

### ● メモリカード

カード上の補助記憶装置。

#### ○ MMC(Multi Media Card)

MMCは、Siemensが考案し、SanDiskと共同で開発した小型のメモリカード規格。
フラッシュメモリーに属するメモリーカード。

#### ○ SDカード

1999年にSanDisk社、松下電器産業、東芝の3社が共同開発したメモリカードの規格
フラッシュメモリーに属するメモリーカード。
MMCをベースにセキュア（セキュリティ）機能を実装したもの。

https://www.tjsys.co.jp/embedded/nand/feature.htm

## ■ デバイス

コンピューターを構成するハードウェアのこと。
プリンタやマウスなどの周辺機器や、CPUやハードディスクなどの部品などもデバイスとなる。

### ● デバイスファイル

デバイスファイルはデバイス（ハードウェア）にアクセスする際のインターフェースとなるファイル。
OSはデバイスファイルへの読み書きを通して、アクセスを行う。
デバイスファイルは/devディレクトリ以下にある。

### ● デバイスドライバ

ベンダが提供しているOSがデバイスを制御・操作するためのソフトウェア。

### ● クラスドライバ

Linuxシステムに最初から導入されている汎用のデバイスドライバ。

### ● udev(userspace device management)

Linuxカーネル用のデバイス管理ツール。

デバイスがコンピューターに接続されると、カーネルがそれを検知して、
/sysディレクトリ以下にそのデバイス情報を作成する。
そのデバイス情報を参照して、/devディレクトリ以下にデバイスファイル作成する。
/etc/udev/rules.d以下の設定ファイルを編集することで、特定のデバイスのデバイスファイル名を任意の名前に変更するなど独自の設定ができる。

### ● リザーブ(予備)領域

rootだけが利用できる予約領域が設定されている。
通常は、パーティッション領域全体の5%が予約領域になっている。

http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=ext3%2Fext4%A4%CE%CD%BD%CC%F3%CE%CE%B0%E8%A4%CB%A4%C4%A4%A4%A4%C6

## ■ ハードウェアクロック (RTC)

マザーボード（ハードウェア）が持つ内部時計であり、
端末の電源が落ちている間でも、内部電池により、時刻を刻む。

システム(ソフトウェア)が持つ時刻をシステムクロックという。


内蔵時計、RTC(リアルタイムクロック)、BIOSクロック、CMOS(コイル電池)クロックなどとも呼ばれる。

### ● タイムゾーン(時間帯)

グリニッジ標準時や、日本標準時のように基準としている時間帯のこと。

### ● ローカルタイム

UTC(協定世界時)に対して、JST(日本標準時)などのように、各地域において、標準としているタイムゾーンのこと。

日本の場合はJSTで、UTC + 9時間となる。

http://www.atmarkit.co.jp/ait/articles/0812/26/news120.html

http://park12.wakwak.com/~eslab/pcmemo/clock/

https://linuxjm.osdn.jp/html/util-linux/man8/hwclock.8.html

http://park12.wakwak.com/~eslab/pcmemo/clock/clock3.html

### ● ローカルクロック
NTPを使用しているケースにおいて、
外部NTPサーバの時刻に対して、端末自身（クライアント側）の時刻のこと。

http://linux.kororo.jp/cont/server/ntp.php

ハードウェアクロックのことなのか、システムクロックを示すのかはOSの種類などにより、ケースバイケースらしい
Atom でコメントカラーのみ変更する

# 概要

Atom で気に入ったテーマを見つけても、コメントは緑色にしたいなと思う事があります。
そこで、コメントカラーのみを変更してみようと思います。

# 方法

File > Settings を開きます。

Themes タブを開き、your stylesheet をクリックします。
![atom_stylesheet.png](https://qiita-image-store.s3.amazonaws.com/0/44967/964a02e0-b878-934e-faed-f418a3f7c82d.png)

開かれた styles.less を編集することで、テーマを上書きすることができます。

コメントを緑色にしたいので、末尾に次のコードを追記します。

```css:styles.less
atom-text-editor::shadow .comment {
  color: lime;
}
```

保存すると即座に反映されます。

# まとめ

styles.less を編集することで、コメントカラーに限らず、スタイルを好きにカスタムすることができます。
[Swift] 名前が衝突したときに呼び出すグローバル関数を明示する


# TL;DR
`モジュール名.グローバル関数名`で呼び出せる。（標準のモジュール名は`Swift`）

```swift
Swift.min(1, 2) // => 1
Foo.bar() // Note: Foo is framework
```

# Swift 3.0 でのAPI名変更

Swift 3.0 では標準ライブラリのAPI名がガイドラインに沿って見直しがされました。
例えば`SequenceType`の`.minElement()`は`.min()`へと変更されています。

これは大した話ではないと感じますが、以下のコードがコンパイルエラーになります。

```swift
extension Array {
    func foo() {
        let x = min(1, 2) // Compile error: Extra argument in call
        print("x: \(x)")
    }
}
```

上記はグローバル関数の`min()`を呼び出すつもりが、`SequenceType.min()`が名前解決されてしまい、意図しない関数が呼び出されてしまっています。

このように名前空間が衝突した場合に、グローバル関数を明示的に呼び出すには以下のように頭に`Swift.`を追加すればOKです。

```swift
extension Array {
    func foo() {
        let x = Swift.min(1, 2) // OK
        print("x: \(x)")
    }
}
```

同様に、`Foo`モジュールの`bar()`という関数を呼び出す場合には以下のようにすればOKです。

```swift
Foo.bar()
```

# グローバル関数が重複した場合

さきほどの例では`Array`のextensionにおいて、`SequenceType`の関数とグローバル関数の名前が衝突し、前者のほうが意図した呼び出しだと名前解決されました。

では、グローバル関数がモジュール間で重複した場合はどうなるのでしょうか？

（おそらく想像通りかと思いますが）結論から言えば、自身のモジュール内の関数が優先して名前解決されます。

```swift
// モジュール（プロジェクト）`Hello`に宣言されたグローバル関数
func bar() -> String {
    return "bar in Hello"
}

// モジュール`Foo`に宣言されたグローバル関数
public func bar() -> String {
    return "bar in Foo"
}

// `Hello`内でのコード
bar()       // => bar in Hello
Hello.bar() // => bar in Hello
Foo.bar()   // => bar in Foo
```

ここまで説明の都合上、グローバル関数を例に上げましたが、グローバル定数などのグローバルシンボルについても同様です。

```swift
let FOO_BAR:        String = "FOO_BAR in Hello"
public let FOO_BAR: String = "FOO_BAR in Foo"

FOO_BAR       // => FOO_BAR in Hello
Hello.FOO_BAR // => FOO_BAR in Hello
Foo.FOO_BAR   // => FOO_BAR in Foo
```

# まとめ

- 明示的にグローバルシンボルにアクセスする場合は`モジュール名.シンボル名`と書く
- Swift標準のモジュール名は`Swift`
- 名前解決は自身に近い位置から行われていく

# 蛇足

冒頭にあげた`Array`のextensionのケースでコンパイルエラーになって「なんで？」って躓いたので、他にも躓く人がいるかもと思って書いてみました。
JavaでXMLを取り込んでいろいろ

何かと便利なXMLをJavaで扱うことができる。そのXMLを取り込んでいろいろやってみる。それぞれのクラスのインスタンス化が特殊なのが特徴。

# java.xml.parsers編
## DocumentBuilderFactory抽象クラス
XMLドキュメントからDOMツリーを生成するパーサーを取得できるファクトリAPIを定義する抽象クラス（Javadocより）。

まず、このクラスをインスタンスするには

```java:
DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
```

のようにnewせずにメソッドで（DocumentBuilderFactoryは抽象クラスのため、newでインスタンスを生成できない）インスタンスを生成する。

さらにちょっとした設定は

```java:
documentbuilderfactory.setIgnoringComments(true);
documentbuilderfactory.setNamespaceAware(true);
documentbuilderfactory.setXIncludeAware(true);
```

のようなメソッドを使って設定できる。

後述する、DocumentBuilder抽象クラスをインスタンスを生成するにはこのクラスで定義されているnewDocumentBuilderメソッドで次のようにインスタンスを生成する。

```java:
DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
```

このクラスも抽象クラスなので、newでインスタンスを生成することはできない。

### newInstanceメソッド
DocumentBuilderFactoryクラスをインスタンス化するためのメソッド。

### setIgnoringCommentsメソッド
パーサー中にコメントを無視するか指定するメソッド。デフォルトではfalseになっており、無視されないようになっている。

### setNamespaceAwareメソッド
パーサー中に名前空間をサポートするか指定するメソッド。デフォルトではfalseになっており、サポートされないようになっている。

### setXIncludeAwareメソッド
XIncludeを発見したときの処理を指定するメソッド。デフォルトではfalseになっており、XIcludeが見つかっても無視する。

### newDocumentBuilerメソッド
DocumentBuilder抽象クラスをインスタンス化するための抽象メソッド。

## DocumentBuilder抽象クラス
XMLドキュメントからDocumentインスタンスを取得するための抽象クラス。

このクラスからDocumentを取得するときはnewDocumentメソッドでDocumentインターフェースをインスタンスするか、parseメソッドでDocumentオブジェクトを返すかである。

例えば、

```java:
Document document = documentbuilder.parse(new FileInputStream("test.xml"));
```

のように取得したいファイル（XMLとか）を指定して、Documentオブジェクトを取得できる。

### parseメソッド
指定された内容をXMLドキュメントとして構文解析して、Documentオブジェクトを返すメソッド。

# org.w3c.dom編

## Documentインターフェース
HTML文書またはXML文書を表すインターフェース。

DocumentオブジェクトからElementオブジェクトを取得するには

```java:
Element element = document.getDocumentElement();
```

のようにgetDocumentElementメソッドを使うと良い。

### getDocumentElementメソッド
ドキュメントから要素を取得して、Elementオブジェクトを返すメソッド。

## Elementインターフェース
HTML文書またはXML文書内の要素を表すインターフェース。
このインターフェースでようやくXMLからタグを取得することができる。

タグの名前の取得方法は

```java:
element.getTagName()
```

で取得できる。

### getTagNameメソッド
要素の名前を取得するメソッド。

## NodeListインターフェース
順序付けられたノードのコレクションを扱うためのインターフェース。

例えば、リストのノードごとに項目を取得するには

```java:
for(int i = 0;i<nodelist.getLength();i++)
{
	nodelist.item(i);
}
```

のような感じ。

### itemメソッド
リスト集合内での指定した番号の項目を返すメソッド。

### getLengthメソッド
リスト内のノード数を返すメソッド。

## Nodeインターフェース
DOMツリーのノードを表すためのインターフェース。

例えば、XMLで親要素が子要素があるかどうか確認するには、

```java:
Node node = nodelist.item(i);
Element prop = (Element)node;

if(prop.hasChildNodes())
{
	System.out.println("子要素あり");
}
```

これで取得した要素に子要素が存在するとturuを返す。

### hasChildNodesメソッド
ノードが子ノードを持っているかどうかを判断するメソッド。子ノードがあるときはtrueを返す。

## さいごに
まだまだJavaでXMLを扱うものは存在する。
Sublime Text2 でTexのビルドがCommand+Bで出来なくなった

#環境

- Sublime Text2 (Version 2.0.2, Build 2221)
- MacOS Sierra 10.12.1

#現象

- TexファイルをCommand + Bキーでビルドしようとしても反応しない。
- Tools -> Build からのビルドはできる。
- 他の言語のソースファイル （cppなど）のビルドもできる。
- 他のショートカット（Command+Sなど）は動く。

#解決方法 (暫定版)
0. Sublime Text2 -> Preferences -> Key Bindings - User
0. `{ "keys": ["super+b"], "command": "build" }`を追加
0. 治ったことを確認

# 原因
- 不明。何らかのアップデートか？
-  Preferences -> Key Bindings - Defaultにも同様のキーマップがあるが、これが機能していない。原因はわからず。
プロキシ利用時のAWS CLIで Unable to locate credentials 発生時の対応

#■状況
EC2インスタンス内でPROXY接続している場合、
IAMロールで許可されているのに権限エラーが発生する。


#■結論
対応方法としては、
Linux, OS X, or Unix
`export NO_PROXY=169.254.169.254`
Windows
`set NO_PROXY=169.254.169.254`
を実行すればよい。

#■参考
Using an HTTP Proxy
http://docs.aws.amazon.com/cli/latest/userguide/cli-http-proxy.html


#■何故この設定で動作するのか？
AWSのドキュメントによると、

インスタンスメタデータからセキュリティ認証情報を取得する
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#instance-metadata-security-credentials

>AWS SDK、AWS CLI、および Tools for Windows PowerShell は EC2 インスタンスメタデータサービスから自動的に認証情報を取得して使用します。

とのことなので、インスタンスメタデータから
IAMロールの認証情報を取得できず、
AWS CLIの実行でエラーが発生するということなのでしょう。

#■確認
実際に確認してみました。

環境：
AmazonLinux
　Amazon Linux AMI release 2016.09
AWS CLI
　1.10.56

##■PROXY設定なし の場合
![image](https://qiita-image-store.s3.amazonaws.com/0/143854/a8ca59b0-0958-5d62-ad9a-42797eaee2bd.png)

##■PROXY設定あり かつ NO_PROXY設定なし の場合
![image](https://qiita-image-store.s3.amazonaws.com/0/143854/4b2ba56c-82eb-f766-e235-53cf98935c20.png)

##■PROXY設定あり かつ NO_PROXY設定あり の場合
![image](https://qiita-image-store.s3.amazonaws.com/0/143854/6a36fc40-b29d-6f1e-defd-6c1e8be21152.png)

##■結果
確かに、
PROXY設定を付与するとIAMロールで許可されていても認証情報がないといわれ、
その状態でNO_PROXY設定を付与すると問題なくIAMロールの認証情報が使用されることが確認できました。
re:dash 初めてのクエリ（サンプル）

## Install

- [「Re:dash」を「Docker for Mac」で動かしてみた \- Qiita](http://qiita.com/tbuchi888/items/275bb2ed341c2936c9c3)
- re:dash 0.11.1+b2095


## Structure Overview

```
Dashboard
\
 `- Widget
    \
     `- Query 
        \
         `- Chart
            \
             `- Query Result (Table)
                \
                 `- Query Code
                    \
                     `- Data Source
```


## Data Sources

- 右上のディスク積み上げたアイコンからデータソース設定画面へ
- `+ New Data Source`
- 今回は Heroku で動いている PostgreSQL 環境があったのでそこを使う
- データベース内のテーブル等の情報はクエリ作成画面にある

![Data Source Types](https://qiita-image-store.s3.amazonaws.com/0/47035/33d0720a-9fd6-2d27-6f5e-a803527bc4f8.png)

- Web 上のデモ版だと選べるデータソースが限られている


## Query

- クエリ名や補足の編集は文字列をクリック
- X 軸を Date 型にしたら時系列にできた

![クエリ サンプル](https://qiita-image-store.s3.amazonaws.com/0/47035/d595e73f-a0d4-bfbb-e00d-9008ea52357d.png)


## Dashboard

- 適当にダッシュボードを作成して右のボタンから Add Widget を選んで、上で作ったクエリを選択

![Dash.png](https://qiita-image-store.s3.amazonaws.com/0/47035/44d5b924-bc64-1220-cfb4-32c6ca9bc748.png)

おわり
electron-packagerが遅くて待てない時の回避策

# 概要
electronに入門しようとしたら、electron-packagerが終わらなくて挫折しかけた。。。
という訳で、electron-packagerがちっとも終わらない時の回避策を書いておきます。

# 原因
止まっている訳ではなく、裏でelectronをダウンロードしようとして時間がかかっている様子。
試しに手動でダウンロードしようとしたが、時間帯によるのか凄く遅い時があった。

# 回避策
使用するelectronがv1.4.6、環境がwindowsの64bitの場合。

0. electron-v1.4.6-win32-x64.zipをアーカイブサイト等で入手する。
0. zipを適当なフォルダ(./cache)に入れる。
0. electron-packagerの引数にdownload.cacheを付けて実行する。

```
node_modules/.bin/electron-packager . app --version=1.4.6 --platform=win32 --arch=x64 --download.cache=./cache
```

以上。
Electron用のlaunch.json

VisualStudioCodeからElectronを起動するためのlaunch.jsonの書き方。
GitHubで検索して見つかる基本パターンは下記。

```json:launch.json
{
    "version": "0.1.0",
    "configurations": [
        { 
            "name": "Launch Electron App",
            "type": "node",
            "program": "${workspaceRoot}/main.js",
            "stopOnEntry": false,
            "args": [],
            "cwd": "${workspaceRoot}",
            "runtimeExecutable": "${workspaceRoot}/node_modules/electron-prebuilt/dist/electron.exe",
            "env": { }, 
            "sourceMaps": false
        } 
    ]
}
```

一方、electron-prebuildをinstall -gした場合は、これでは動かないので、以下のように書き換える必要がある。

```json:launch.json
{
    ...
            "runtimeExecutable": "[nodeのルートフォルダ]/bin/electron.cmd",
    ...
}
```

起動の仕方とかは下記の記事などを参照。
[Visual Studio CodeでNode.jsデバッグ](http://qiita.com/kuniken/items/a6341297a97925f5081a)
Dockerを使ってアプリケーションサーバーをたててみたときのメモ

#初めに

##やること
DockerのCentosのイメージから、
phpとphalconを入れて、Congratulations!を表示させる。


##ホスト側環境
Dockerはインストール済みということで。
foderaでやってます

```
cat /etc/redhat-release
```
->Fedora release 24 (Twenty Four)

#開始!

##Centosに諸々を入れる的なDockefile
中身はこんな感じ

```
FROM centos:7
RUN yum -y update && \
#git
yum install -y git && \
#epel
yum -y install epel-release && \

#remi
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm  && \

#httpd
yum -y install httpd && \

#php7
yum -y install --enablerepo=remi-php70 php && \

#関連モジュール
yum -y install --enablerepo=remi-php70 php-devel php-pear && \
yum -y install --enablerepo=remi-php70 php-mysqlnd php-mbstring && \

#Zephir
yum -y install --enablerepo=remi-php70 zephir && \

#phalcon3
yum -y install --enablerepo=remi-php70 php-phalcon3 && \

#Phalcon Devtools
git clone https://github.com/phalcon/phalcon-devtools.git /usr/local/src/phalcon-devtools && \
#コマンド化
ln -s /usr/local/src/phalcon-devtools/phalcon.php /usr/bin/phalcon && \
chmod ugo+x /usr/bin/phalcon

EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

```

#ビルド

```
docker build -t phalcon3 ./
```

#起動

```
docker run -d -p 80:80 --name testp3 phalcon3
docker exec -it testp3 /bin/bash
```

#phalconプロジェクト作成

```
cd /var/www/html && phalcon create-project phalcon
```
##1.ドキュメントルートをいじる
（もっといい方法があるはず。。）

```
vi /etc/httpd/conf/httpd.conf
```

```
150行目くらいにデフォルトのドキュメントルートの設定箇所がある
↓
# Further relax access to the default document root:
ここの、AllowOverrideの設定を
AllowOverride Noneから
AllowOverride Allに変更する
```

##2.権限変える
apacheに所有権渡して、ついでにその他がアクセス出来無いようにする。
（@3upjpさんありがとうございました！）

```
cd /var/www/html/
ls -l
```
権限はrootなので、、

```
chown -R apache:apache /var/www/html/
find /var/www/html/ -type d -exec chmod 770 {} \;
find /var/www/html/ -type f -exec chmod 660 {} \;
```

もう一回見てみると。。
```
ls -l
```
apacheに変わった！！（感動！）

##3.抜けて、再起動
```
exitして、、
docker stop コンテナ
docker start コンテナ
```


#コンテナのアドレス確認

```
docker inspect --format="{{ .NetworkSettings.IPAddress }}" コンテナID
```

ブラウザで上記アドレスにリクエスト(ip/phalcon/にリクエスト)
Congratulations!みたいなやつが出たら成功。
終わり！
次回はDBサーバーと連携させたい!

#感想。
##(よくわからないのも含めて、今後の課題など)
selinuxの使いどころがわからん。。
--privilegedオプションがうまくいかない時があったりと、
vitualboxとかでやった方がええんかなとか思ったりした。

virtualhostとかapacheのアクセス許可とかその辺弱いわ。。
分からんこと多い。

apacheの再起動するのにコンテナストップさせるとかイケてない気が。。

nginxでやりたかった。とりあえず詰まりまくったので、後日！

#参考サイト
[Phalcon 3.0.1 ドキュメント](https://docs.phalconphp.com/ja/latest/reference/install.html)
[Phalconインストール(CentOS7.2 + PHP7.0)](http://blog.pleeds.com/web/phalco-install-centos7-2-php7-0)
[Dockerでつくる開発環境【php-fpmコンテナ編】](http://blog.flup.jp/2016/02/13/devenv_php_phalcon_with_docker/)
[CentOS7.1でnginxを用いたウェブサーバの構築](http://qiita.com/ksugawara61/items/0fcf3f72cc905bb6d654)
[CentOS7(Vagrant)でPHP7+Phalcon3環境を構築する]
(http://qiita.com/shiromegane/items/b782ce64f5c54fd54a60)
[CentOS7.0にPhalconのインストール]
(http://w.builwing.info/2015/03/31/centos7-0%E3%81%ABphalcon%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
[web開発のためのapacheやコンテンツディレクトリのパーミッション関連まとめ]
(http://egapool.hatenablog.com/entry/2013/11/29/184300)
webpackでdevelopmentとproductionの判定

よく見かけるのはwebpack.production.config.jsファイルを生成して使い分けしますが二重管理が面倒になってくるので1ファイルでまとめてみました。

## サンプルコード

私はgulp+webpackの環境を作ってるのでそのサンプルになりますが基本的にはwebpack単体でも同じような記述でいけるはずです。

### gulp

```js:gulpfile.js
var gulp = require("gulp"),
	webpack = require("webpack"),
	gulpWebpack = require("gulp-webpack"),
	path = require("path");

// 環境情報から状態を判定
var PROD = JSON.stringify(process.env.NODE_ENV === "production");

gulp.task("js", function() {
	gulp.src("")
		.pipe(gulpWebpack({
			context: path.join(__dirname, "js"),
			entry: {
				app: "./app.js"
			},
			output: {
				filename: "[name].min.js"
			},
			// 圧縮処理
			plugins: PROD ? [
				new webpack.DefinePlugin({
					"process.env.NODE_ENV": JSON.stringify("production")
				}),
				new webpack.optimize.DedupePlugin(),
				new webpack.optimize.UglifyJsPlugin({
					compress: {
						warnings: false,
						screw_ie8: true
					}
				}),
				new webpack.optimize.OccurenceOrderPlugin(),
				new webpack.optimize.AggressiveMergingPlugin()
			] : [],
			module: {
				loaders: [
					{
						test: /\.js[x]?$/,
						exclude: /node_modules/,
						loader: "babel",
						query: {
							presets: ["react", "es2015"]
						}
					}
				]
			},
			// ソースマップの出力
			devtool : PROD ? "source-map" : "",
			resolve: {
				extensions: ["", ".js", ".jsx"]
			}
		})
		.pipe(gulp.desc("../js"));
});

gulp.task("defualt", function() {
	gulp.watch("./js/**/*.*", ['js'])
});
```

修正した箇所は単純にNODE_ENVの変数を受け取って処理を分けています。

### npm script

```json:package.json
"scripts": {
	"build": "NODE_ENV=production gulp js"
}
```

## 使い方

```bash
# 開発時はそのままgulpを実行
> gulp

# 納品時はnpm scriptを実行
> npm run build
```

## まとめ

webpackのUglifyJsが遅くて開発のときから常に圧縮してるとストレスになるので初めはproduction用のファイルを生成していましたが書いてる内容がほぼ一緒なのでそれはそれで面倒になってきます。
是非試してみてください。
raspberry pi 3にOpenCV3.1.0を入れpython3でサンプルを実行するまでの壁：ImportError:No module named cv2の解決

###ようこそ
***

環境
・Raspberry Pi3 Model B 

人が前を通ると映像が流れるというものを製作するため、まずは開発環境を整えようとしています。プログラミングや電子工作に関しては、ほぼ初心者なので、行程があてずっぽうなのですが、ひとつ問題を解決できたのでメモします。



###動画を扱う環境を整えるためopenCVを入れる
***
[Raspberry Pi 2 ★ OpenCV 3.1.0 のインストール 〜 C++ & Python サンプルでのカメラ動作確認まで](http://homemadegarbage.0t0.jp/raspberry-pi-opencv3-1-0)
こちらのブログ記事がとてもわかりやすかったので、参考にさせて頂き上から書いてある通りのことを行った。但し環境がRaspberry pi3、pythonもバージョンが3であるため、ディレクトリなどは修正しつつ作業を行った。途中に突然のフリーズも挟み３時間はかかる。

###問題発生
***

諸々のインストールが終了しいざサンプル「video.py」を動作させようとすると、
```ImportError:No module named cv2
```が発生。確かに、openCVフォルダ内の「modules」フォルダ内にcv2というファイルは見つからない。（でもそういうことなんだろうか）
とりあえずcv2でファイル検索をかけるも、見つからない。

###対策１
***

####pipというものを入れてみる

[Import Error : No module named cv2 on windows 7](http://stackoverflow.com/questions/40191866/import-error-no-module-named-cv2-on-windows-7)
こちらのQ&Aで似たような症状の人を発見。アンサーに「pipを使え」と言われている。pip・・・？
[Pip(Pythonのパッケージ管理)]
(http://make.bcde.jp/python/pippythonのパッケージ管理/)
pipは、pythonのライブラリ管理ツールだということらしいのでこちらのページを参考に、pipを導入。

上記の記事内の「パッケージ検索」を実行しcv2の存在を確認。「インストールしたパッケージの一覧を表示」を行い、現在の所持パッケージリストにcv2が入っていなかったため、「パッケージ名を指定してインストール」にてダウンロードを試みるも、どうもうまくいかない。

`$ sudo pip install cv2
Collecting cv2
Could not find a version that satisfies the requirement cv2(from versions: )
No matching distribution found for cv2
`

引き続き解決方法を探す。。

###対策２
***

####python-opencvというものを入れる
[[python] ImportError: No module named cv2を解決する](http://nc30mtd.oops.jp/blog/2016/07/importerror-no-module-named-cv2.html)
こちらの記事を発見。

`$  sudo apt-get install python-opencv
`こちらのコマンドを試す。

また、
[Python - cannot import OpenCV module?](http://raspberrypi.stackexchange.com/questions/29148/python-cannot-import-opencv-module)
こちらのフォーラムのアンサーにあった、
`$  sudo apt-get install libopencv-dev
`こちらも入れてみる。

###解決！
***

無事サンプルが動くようになる。よかった！
【初心者向け】テスト駆動開発とRspecについて調べてみた

##目次
・TDD(テスト駆動開発)とは
・TDDの主な目的
・Rspecとは
・Rspecの使い方

##TDD(テスト駆動開発)とは
■TDDとは以下の手順で開発を行っていく手法である
1.プロダクトコードを書く前にテストコードを書き、それが失敗することを確認する (レッド)
2.テストに成功するようにプロダクトコードを書く (グリーン)
3.プログラムの振る舞いを変えないように、プロダクトコードの重複などを整理する (リファクタリング)
(最初に戻る)

またTDDには以下の原則がある
・テストに失敗しない限り、プロダクトコードを書いてはいけない。
・プロダクトコードはテストを通るように書く。
・テストは少しずつ書き進めていく。

■TDDの主な目的
テストを最初に書くことで、自分が作るべきプログラムが明確化されるとともに、実行工数を15％から25％増加させる代わりに、欠陥密度を4割から9割低下させてデバッグや手戻り工数を減少させ、トータルの総工数を削減する事が出来る。
他にも以下のようなメリットがあると言われている。
・テストコードが必ず作成される。
・実装前に仕様を決めることでメンバーが仕様を明確に把握した状態で開発に取りかかれる。
・仕様齟齬に気づくタイミングが早い。

##Rspecとは
これまでのRailsのテスト駆動開発で使われてきたTest::Unitを代替するフレームワークである。

ソフトウェア設計とは次の２つからなるという考えをもとに、プロダクトコードを書く前に、プログラムの振る舞いを動作可能なサンプルとして書くことを既存のxUnitフレームワークに比べて全面に押し出したもの。
・テストコード: プログラムがどのように振る舞うべきかを定義したもの
・プロダクトコード： テストコードで定義された振る舞いを実装したもの

##Rspecの使い方

■インストール方法
以下のコマンドで簡単にインストール出来る。
```
gem install rspec
```

■実行方法
rspecコマンドの引数として振舞を定義したスペックファイルを与えるとRSpecを実行が可能。

```
rspec ***_spec.rb
..


Finished in 0.047857 seconds

2 examples, 0 failures
```
・-fdオプションをつけることでテスト毎の成否が確認できるようになる。

■Specファイルの記述の仕方
specファイルにはプログラムに期待する振る舞いを記述する。
it 〜 endのなかに一つのテストケースを書く

```
spec/models/class_spec.rb
describe "テスト対象" do
  it "期待するプログラムの振る舞い"
    # ...
  end

  context 条件 do
    it "contextの条件下で期待する振る舞い" do
      # ...
    end
  end
end
```

■テストケースを簡単に記述するためにRspecが用意してくれているもの
matcher : 期待値と実際の値を比較して、一致した（もしくは一致しなかった）という結果を返すオブジェクト
・eq(x)：xと等しいか
・not_eq(x)：xと等しくないか
・be [true/false]：trueかfalseか
・be < x：xより小さいか
・be_between(x, y).inclusive：数値がxとyの範囲内か(xとyも範囲に含む)
・respond_to(:{メソッド名})：そのメソッドが存在しているか
Visual StudioなしでC#【コマンドラインアプリでHello World編】

# 概要

以前の仕事の環境上、いろいろ制限があったので
Visual StudioなしでC#でプログラム組む方法についてまとめました。

## 必要なもの
* Windows OS
* .Net Framework 2.0以上
* テキストエディタ（なんでも）

# コンパイラの準備

まずはなんにせよ、コンパイラを準備しないと始まりません。
C#用のコンパイラはcsc.exe。標準なら`C:\Windows\Microsoft.NET\Framework\<バージョン>`にあるはずです。

コマンドプロンプトを開き、`csc`と叩いてバージョン確認します。
ちなみにエクスプローラをShiftキー＋右クリックで、開いているディレクトリをカレントにしてプロンプトを開けます。

```:ver.2.0の場合
C:\Windows\Microsoft.NET\Framework\v2.0.50727>csc
Microsoft(R) Visual C# 2005 Compiler version 8.00.50727.8670
for Microsoft(R) Windows(R) 2005 Framework version 2.0.50727
Copyright (C) Microsoft Corporation 2001-2005. All rights reserved.

fatal error CS2008: 入力が指定されていません。

C:\Windows\Microsoft.NET\Framework\v2.0.50727>
```

```:ver.4.6.1の場合
C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc
Microsoft (R) Visual C# Compiler version 4.6.1038.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework, 
but only supports language versions up to C# 5, which is no longer the latest version. 
For compilers that support newer versions of the C# programming language,
see http://go.microsoft.com/fwlink/?LinkID=533240

warning CS2008: ソース ファイルが指定されていません。
error CS1562: ソースのない出力には、/out オプションを指定しなければなりません。

C:\Windows\Microsoft.NET\Framework\v4.0.30319>
```

バージョンによってちょっと内容が違うかもしれません。
エラーも出ているが、ソースコード指定していないので仕方ないと思います。一応実行は出来ているのでこれで問題ありません。

コンパイラは見つかったので、ここへパスを通します。

環境変数のPATHの設定方法はここでは省略させていただきます。
Google先生に聞かなくても分かるよね？？

環境変数の修正もはばかられる場合は、スクリプトを組んでしまうとよいでしょう。

```bat:build.bat
@echo off
setlocal

set PATH="C:\Windows\Microsoft.NET\Framework\v2.0.50727";%PATH%

csc.exe %*

endlocal
```

実行する時は`build.bat source.js`とコマンドを叩くか、ソースファイルをバッチスクリプトにドロップすればOKです。

# Hello World!!

さて、まずは恒例のHello Worldです。
とりあえず以下のようにソースコードを書いてみました。

```csharp:HelloWorld.cs
namespace HelloWorld
{
    public static class Program
    {
        public static void Main(params string[] args)
        {
            System.Console.WriteLine("Hello world!!");
        }
    }
}
```

つぎのコマンドでビルドできます。

```
> build.bat HelloWorld.cs
```

ビルド後、同じディレクトリに`Program.exe`ができているので、実行してください。

```
> Program.exe
Hello World!!
```

# おわりに

うまく実行できたでしょうか？？
最初にやってみた時は意外と簡単にできて驚きました。
いや、当たり前なんですけどね。。。でもVisual Studioの大きさからすると意外な簡単さだったので、驚いたんです。

次はmsbuildに挑戦してみたいと思います。

## ここまでの経緯

※個人的私情挟んでいる話なので、以下読む必要ないです。

金融系SEの現場なんかでよくあること。

* インターネット閲覧制限あり（google検索結果のリンク先は大体社内規定でブロックされてる）
* 許可ソフトウェア以外のインストール禁止（フリーorシェア無関係、バージョン違いもダメ）
* OSはWindows 7のみ

とまぁ、いまどきの開発者に対して結構手厳しい現場も多い。

> それでもプログラマらしくちょっとしたツールなんかプログラム組みたい！
> でもExcel VBAはちょっとなー、、メンテが面倒だ、、
> PowerShellは、、ちょっと遅い、、
> cmdだとすぐ限界迎える
> COBOLで組むのもなー、、、

といった気持ちにかられ、でた結論。

> よし、.Net Frameworkだ！

.Net Frameworkなら標準で入っているし、C#なら個人的にも使っている。
ただVisual Studio（以下VS）はもちろん入れられないので、VSなしでテキストエディタのみでコーディングしていく。
そのやり方について振り返りつつ備忘録としてまとめてみた。
JavaScriptで少数を桁指定で丸める

浮動小数点を少数位以下何桁で丸めたいとする。ちょっと検索すると次のようなコードを使えという記事がごろごろしている。

```js
Math.round(f*100)/100
Math.ceil(f*100)/100
Math.floor(f*100)/100
```

それぞれ四捨五入だの切り上げだの切り捨てだのという話はあるが Number.toFixed の話に触れてない記事が多い。そんな最近実装された機能だろうかと疑問に思ったがECMA 3rd には入っていたので相当昔である。toFixedの丸め方は厳密ではないにしろずらずら長い数値を表示したくないというだけなら十分である(他の言語のsprintfでできるレベルで良いという話)。

* https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
機械学習を始めて２週間、機械学習を始めるのに必要だったこと

## はじめに

ここ最近、趣味で機械学習の勉強はじめたら、様々な技術が必要なのでものすごいスキルがついた！
始めるのに必要なタスクをシェアします！
※ 具体的な手段については、別途投稿します。

# 機械学習に必要なこと

## 必要なスキル
はじめにもし独学で始めるなら必要なスキルを書いておきます。

```
・ ビジネススキル
  ・ビジネスに対する深い理解
　・ロジカルシンキング
　・ドキュメンテーション/プレゼンテーション
　※ 多くの場面でデータ集めから理論的な説明が必要になります。

・ ITスキル
　・幅広いIT知識
　・大規模データ処理に関する知識
　・データベースに関する深い知識
　・プログラミング
　※ 本当に範囲が広いのでインフラからロジックまでフルスタックにできる人が必要になります。

・ 統計解析スキル
　・数学
　・データ分析手法の理解
　・データ分析ソフトウェアのスキル
　※　確率・統計、微分積分、行列などが必須になります。
　　 記号が多いので最初自分はぜんぜん理解できませんでした。

```
この記事がわかりやすい。
[そろそろデータサイエンティストの定義とスキルセットについて本気で考えてみる - Qiita](http://qiita.com/hik0107/items/f9bf14a7575d5c885a16)

## 本題のタスクについて
### マーケティング
機械学習において、これが一番重要でしょう！

なぜなら、データを集めるにしてもその業界に詳しい人がいないと集めるべきデータがわかりません。
今回は自分はいろいろアドバイスをもらってやりましたが、データ不足で何度も集め直しをしました！

### データ収集
これも大変な作業。1,000件〜10,000件くらいまでだったら手作業でもなんとかなるかもしれませんが、少なくとも100,000件くらいあったほうが勉強になると思います。
自分は1,300,000レコードを集めてはじめました！
####集め方について
　[自分でやる]
　　WEBスクレイピングで無料で情報を集める。
　　トレードオフとして開発する時間とスキルが必要となる。

　[クラウドソーシング]
　　これは安価でいいと思えるが、情報の質が下がる可能性がある。

　[買ってくる]
　　時間もかからず手っ取り早いが、割りと高い（情報にもよる）。

### 情報のクレンジング
集めてきたデータは一部が欠落している場合やイレギュラー情報が入ってる可能性があります。
なので分析しやすいように情報を整理する必要があります。
ここではSQLなどのデータベースのスキルとBigData処理（分散処理など）に対するスキルが必要。
大量データを処理するので、ある程度時間をかけてやる必要があります。

### 分析・分類
機械学習で予測を始めるには、先ず現状データを分析する統計のスキルが必要となります。
データの特徴を見極めたり、予測に必要なデータを推測する必要があります。
この辺は常識などの定性的なものに頼らず定量評価が必要となります。

### 学習モデル作成
データの特徴から未来を予測するためのモデルを作成します。
ここではプログラミングのスキルが必要となります。
Pythonなどの開発言語は前提になりますが、パラメータのチューニングなどもおすすめを出してくれるのもあるので、そこまでハードルは高くありませんが、データの種類や目的によってアルゴリズムを選択しなければなりません。
　[機械学習ライブラリ一覧]
　　TensorFlow:https://www.tensorflow.org/
　　Chainer:http://chainer.org/
　　Caffe:http://caffe.berkeleyvision.org/
　　Theano:http://deeplearning.net/software/theano/index.html
　　Torch:http://torch.ch/
　　scikit-learn:http://scikit-learn.org/stable/
　　PyML:http://pyml.sourceforge.net/
　　Pylearn2:http://deeplearning.net/software/pylearn2/
　　PyBrain:http://pybrain.org/pages/home

### 予測と実験
訓練データを基に作成した学習モデルを用いて予測をします。
学習〜テスト予測を何度も繰り返して実験していく必要があります。
また、ここでの精度が良いからといって過学習の可能性があります。

本当にうまくいくかは実際のデータで実験を繰り返す必要があります。

### 最後に
まだまだ機械学習のエンジニアが多いとは言えるような状況ではないので、アルゴリズムの選択やパラメータの選択や正規化の手段など、なかなか人に相談できず孤独を感じることもあります。
ただ、新しく覚えることがとても多く刺激的です。
皆様にもぜひおすすめです。

いま勉強中のスキルで未来予測の実験しているサイトがありますので、ぜひお時間ある時に見ていただけたらと思います！
 ［facebook］
  https://www.facebook.com/AIkeiba/
 ［Twitter］
  https://twitter.com/Siva_keiba
Makefileでrunするときに引数を渡す


```Makefile
a:	a.c
	gcc -o a a.c

run: a
	./a
```


みたいな感じになってたときに`make run`でaに引数を渡して実行したい。

Makefileを書き換える

```Makefile
ARG = foo

a:  a.c
    gcc -o a a.c

run: a
    ./a ${ARG}
```

これで```make run ARG=hoge```とかやると```./a hoge```を実行できる。

Makefileの```ARG = foo```よりも、実行時の```ARG=hoge```の方が優先される。
ローカルからリモートのXサーバにウィンドウを飛ばす

## はじめに
リモートでX11アプリケーションを起動して、そのウィンドウをローカルのディスプレイに表示させることは、SSHでX11フォワーディングを使えばできますよね。

「じゃあ逆にローカルでX11アプリケーションを起動して、そのウィンドウをリモートのディスプレイに表示させることってできないかな？」と思ってやってみたのですが、罠にはまって苦労したのでメモしときます。

## ローカルからリモートへウィンドウを飛ばす
ここでは、リモートからローカルのディスプレイへウィンドウを飛ばすのではなく、逆にローカルからリモートのディスプレイへウィンドウを飛ばすということを行います。

今回は次のような環境を想定しています。
* ローカルホスト(ホストA) : 192.168.10.10 (ホスト名: hostA)
* リモートホスト(ホストB) : 192.168.10.11 (ホスト名: hostB)
* ホストAでxeyesを起動し、そのウィンドウをホストBのディスプレイ(:0.0)に表示させる

まず、ホストB側でXサーバの設定を行います。
(ホストBでは0番Xサーバと0番スクリーンを使うものとします)

```bash
# 環境変数DISPLAYの設定
$ export DISPLAY=hostB:0.0
# ホストAからのXサーバへのアクセスを許可
$ xhost +hostA
```

次に、ホストA側で環境変数DISPLAYの設定とxeyesの実行を行います。

```bash
# 環境変数DISPLAYをリモートのディスプレイに設定
$ export DISPLAY=hostB:0.0
# xeyesを実行
$ xeyes
```

これでホストBのディスプレイに表示される…はずが
　`Error: Cant open display: hostB:0.0`
と表示されるだけで、ホストBのディスプレイに何も表示されませんでした。ホストBのファイアウォールを止めてやり直してみましたが、それでもやっぱりダメでした。

調べてみると、以下のサイトに原因が書いてあるのを見つけました。
http://blogger.fastriver.net/2016/09/startx-xorg-6000-listen.html
__どうやらデフォルトだとstartxを実行する際、-- -nolisten tcpというオプションがついた状態でXサーバが立ち上がるので、Xの通信に使う6000番ポートが閉じてしまっていたようです。__

ポートを開いた状態でXサーバを立ち上げるには、以下のようなコマンドを実行すればOKです。(`init 3`は起動中のXサーバを起動し直したい場合に実行してください)

```bash
# ランレベルを変更して起動中のXサーバを停止(Xサーバを起動し直す場合)
$ init 3
# ポートを開いた状態でXサーバを起動
$ startx -- -listen tcp
```

__ファイアウォールの設定を変更して適切なポートを開けておくのも忘れないようにしましょう。__

```bash
# 6000番ポートを開ける
$ sudo firewall-cmd --add-port=6000/tcp
```

2016/11/14：追記
勘違いがあったので追記しときます。上のコマンドで開くポートは6000番とは限らないようです。ディスプレイ番号の値によって、開くポートが変わるようですね。
上のコマンドでstartxを開いたら、まずディスプレイ番号をチェックします。

```bash
$ printenv DISPLAY
```

すると`:2`のようにディスプレイ番号が表示されるはずです。__これが開いているポート番号の1の位になります。__
例えば`:2`だった場合は開くポートは6002番になるわけです。
ファイアウォールの設定をする際にはこのことに気をつけてください。

ホストB側で適切なポートを開けた状態のXサーバが立ち上がったら、上と同様に`xhost`などの設定を行いましょう。
これでホストAで実行したxeyesのディスプレイがちゃんと開くようになるはずです。

## おわりに
デフォルトで6000番ポートが開かないようになっているのは、セキュリティ上の理由からです。
6000番ポートが開きっぱなしになっていると、外部からディスプレイを操作されたり、スクリーンショットを撮られたりする危険があります。これを防ぐために、デフォルトでは6000番ポートを閉じているのです。

ググってみたところ、6000番ポートを開いた状態をデフォルトにしてXサーバを開くための設定の仕方も出てきました。しかし上記の理由からあまりオススメはしません。(筆者の個人的な意見です)

何か間違ってる点などに気づかれましたら、コメントでお知らせください。
Python + OpenCV で顔切り出し

#目標
TensorFlowで顔認識を実装したいので．顔データを集めて正規化するために，画像から顔をトリミングしたい

本気の備忘録
#環境
jupyter notebook
OpenCV3.0
Python3.5

.pyファイルと同じディレクトリにレナさんとhaarcascade_frontalface_alt.xmlを入れるか，パス書き直してください．

#コード
```python:trimming.py
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

#画像読み込み
src_image = cv2.imread('lenna.jpeg')
#グレースケールに変換
dst_image = cv2.cvtColor(src_image,cv2.COLOR_RGB2GRAY)
#Haar-like分類器読み込み
cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
#カスケード実行して検出した顔の座標情報をfacerectへ格納
#[四角形の左上X座標,四角形の左上Y座標,顔画像のX軸方向への長さ,顔画像のY軸方向への長さ] ここあってるか不安
facerect = cascade.detectMultiScale(dst_image, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
#顔が１つ以上検出された時
if len(facerect) > 0:
    for rect in facerect:
        dst_image = dst_image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
#顔が検出されなかった時
else:
    print("no face")
#これしとくとグレースケールになる．謎
dst_image = cv2.cvtColor(dst_image,cv2.COLOR_GRAY2RGB)

plt.imshow(dst_image)

```

#まとめ
imread()で読み込んだカラー画像をimshow()でグレースケールで表示する時は，
cvtColorでRGB→グレーにして，もう一度cvtColorでグレー→RGBにしないといけないらしい．多分

この辺もわかり次第追記しようかと思います．


#2016/11/30追記
これじゃあ保存してねえよな？ってことで
トリミングして保存する機構を作りました．jupyterとはおさらばして，
PyCharmで作業しています．pycharm便利

```python:trimming.py
import cv2

cascade_path = "./haarcascades/haarcascade_frontalface_alt.xml"
origin_image_path = "画像のフォルダパス"
dir_path = "画像の保存先パス"

i = 0

for line in open('テキストファイルのパス','r'):
    line = line.rstrip()
    print(line)
    image = cv2.imread(origin_image_path+line,0)
    if image is None:
        print('Not open : ',line)
        quit()

    cascade = cv2.CascadeClassifier(cascade_path)
    facerect = cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=1, minSize=(10, 10))

    if len(facerect) > 0:
        for rect in facerect:
            # 顔だけ切り出して保存
            x = rect[0]
            y = rect[1]
            width = rect[2]
            height = rect[3]
            dst = image[y:y + height, x:x + width]
            save_path = dir_path + '/' + 'image(' + str(i) + ')' + '.jpg'
            #認識結果の保存
            cv2.imwrite(save_path, dst)
            print("save!")
            i += 1
print("Finish")
```

画像が入っているフォルダで```$ls > hoge.txt```することで，テキストに１行ずつ書き込める
書き込んだ画像の名前を読み取りながらあったら開いてトリミング，保存という流れ

rstrip()噛ませないとなぜか画像が読み込めず．．．



でもこれ，画像のリサイズとかしてなくね？(続く)



#参考サイト
像の一部を切り抜いて保存
http://clngn.hatenablog.com/entry/20120113/1326442326
Pythonで遊んでみる -part1- (OpenCVで顔認識)
http://www.takunoko.com/blog/python%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B-part1-opencv%E3%81%A7%E9%A1%94%E8%AA%8D%E8%AD%98/
sklearn.feature_selection.chi2

[sklearn.feature_selection](http://scikit-learn.org/stable/modules/feature_selection.html)は名前からして素性選択のためのモジュールと思われるのですが、

```
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import chi2
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)
```

というサンプルコードが何をしているのかパッと理解できなかったので、いろいろ調べてみました。備忘のため、メモしておきます。


#### X_newはどうなってる？

```py3
print(X[0])
print(X_new[0])

# [ 5.1  3.5  1.4  0.2]
# [ 1.4  0.2]

print(X[1])
print(X_new[1])

# [ 4.9  3.   1.4  0.2]
# [ 1.4  0.2]

```

どうやら3番目と4番目のfeatureが選択されているようです。



#### SelectKBest

> Select features according to the k highest scores.

最もスコアのよいK個のfeatureを選択する、とのこと。
score_func は f_classif や chi2 などが指定できるようです。

#### chi2

> Compute chi-squared stats between each non-negative feature and class.
> 
> snip...
> 
> Recall that the chi-square test measures dependence between stochastic variables, so using this function “weeds out” the features that are the most likely to be independent of class and therefore irrelevant for classification.


超適当な訳ですが、「それぞれのfeatureとclass間のカイ二乗統計量を計算する。（中略）カイ二乗検定は確率変数間の依存を測るので、この関数はクラスと独立である可能性が高いfeature（言い換えると、分類には役立たないfeature）を捨てることとなる」とのこと。


実際に[Source Code](https://github.com/scikit-learn/scikit-learn/blob/a5ab948/sklearn/feature_selection/univariate_selection.py#L171-L227)を読むと、期待度数(expected)と観測度数(observed)からカイ二乗統計量を計算していることがわかります。


## まとめると...

サンプルコードがやっているのは、4つのfeatureのうちlabelと依存関係の強い上位2つのfeatureを選択することだ、ということがわかりました。