OmniAICreator/Qiita-1.07M huggingface dataset:
Tomcatプラグイン導入後の設定[eclipse]

この記事は、

①eclipse
②Apache Tomcat

↑の2点を使用する場合、必要な操作をまとめたものです。(Pleiadesの場合はもう少し違うらしい)


eclipseは普通にインストールし、
Tomcatのプラグインの導入手順は以下の記事が分かりやすいのでそのままリンクします。

http://java-reference.sakuraweb.com/java_env_eclipsetomcat.html


Tomcatプラグインが導入できたら次は設定に入ります。


<b>1.パースペクティブの変更</b>


Window→「Perspective」→「Open Perspective」→「other...」で<span style="color: #286f2c">Java EE</span>に変更。

基本は以下のタブ(?)から変更可能だと思います。

![スクリーンショット 2016-10-12 1.11.17.png](https://qiita-image-store.s3.amazonaws.com/0/124283/765eeeff-20e5-c34a-5c80-e6f62219f051.png)




最大化、最小化などでビューのカスタマイズが出来ますが、色々いじりすぎてビューを見つけられなくなった時はWindowからパースペクティブのリセットができます。


<b>2.文字コードの設定</b>


①Javaファイルの文字コードの設定


eclipse→環境設定→「General」→「Workspace」→Text file encodingでUTF-8など適したものを選択。

![スクリーンショット 2016-10-12 1.22.11.png](https://qiita-image-store.s3.amazonaws.com/0/124283/7fa6ed74-6a74-d38f-dcec-2ecbcd34f2cb.png)


↑左下のところ。



②JSPファイルとHTMLファイルの文字コード設定。


設定画面から「Web」→「JSP files」「HTML files」から適した文字コードに設定します。




<b>3.サーバの作成</b>



サーバービュー(下側のビュー)の「使用可能なサーバーがありません云々」をクリックして開いた画面で、Apache Tomcatを選択します。

こちらの記事が詳しい→http://qiita.com/deonathg/items/6bae10ccfe69207a18fc


<b>4.動的Webプロジェクトの作成</b>



file→「New」→「Dynamic Web Project」で作成。

project nameは実行の際URLで指定する必要があるので、半角英数にしてください。全角を使用した場合、別途設定が必要になります。



<b>4.プロジェクトをサーバに追加する</b>



①サーバービューのサーバーを選択し右クリック→「Add and remove...」を選択。

②サーバに追加したいプロジェクトを選択し、Addで「Configured」へ移動します。

![スクリーンショット 2016-10-12 1.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/124283/a0e14e7d-a305-4fe5-6312-b73676f30cb6.png)


こんな感じ。


サーバに追加された動的Webプロジェクトは、サーバ開始時に読み込まれ、Webアプリケーションとして実行できるようになります。

以上の準備が整ったら、JSPファイルやサーブレットクラスの作成ができます。



最初に行っておく設定はこんな感じです。
【Ubuntu】【Python】dlibを用いた物体追跡

OpneCVの物体追跡はちょくちょくサンプルを動かしたことがあるのだけど、
dlibは動かしたことがなかったため、ちょっとお試し。

モーションブラーとかにも付いて行ってて、結構性能良さそうな感じ。

動画は以下。
https://www.youtube.com/watch?v=ORgMddcNHvU
[![【Ubuntu】【Python】dlibを用いた物体追跡](https://img.youtube.com/vi/ORgMddcNHvU/0.jpg)](https://www.youtube.com/watch?v=ORgMddcNHvU)

ソースコードは以下。

```py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
correlation_tracker.py.

Usage:
  correlation_tracker.py [<video source>] [<resize rate>]
'''


import sys
import dlib
import cv2
import time
import copy

# マウスイベントハンドラ
mouse_start_x, mouse_start_y = 0, 0
mouse_end_x, mouse_end_y = 0, 0
selecting = False
tracker_start_flag = False
tracking_flag = False
def select_roi(event,x,y,flags,param):
    global selecting, tracker_start_flag
    global mouse_start_x, mouse_start_y
    global mouse_end_x, mouse_end_y
    if event == cv2.EVENT_LBUTTONDOWN:
        selecting = True
        mouse_start_x, mouse_start_y = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if selecting == True:
            mouse_end_x, mouse_end_y = x, y
        else:
            pass
    elif event == cv2.EVENT_LBUTTONUP:
        mouse_end_x, mouse_end_y = x, y
        selecting = False
        tracker_start_flag = True

# 引数解釈
try:
    fn = sys.argv[1]
    if fn.isdigit() == True:
        fn = int(fn)
except:
    fn = 0
try:
    resize_rate = sys.argv[2]
    resize_rate = int(resize_rate)
except:
    resize_rate = 1

# トラッカー生成
tracker = dlib.correlation_tracker()

video_input = cv2.VideoCapture(fn)
if (video_input.isOpened() == True):
    ret, frame = video_input.read()
    cv2.imshow('correlation tracker', frame)
    cv2.setMouseCallback('correlation tracker', select_roi)

while(video_input.isOpened() == True):
    ret, frame = video_input.read()
    temp_frame = copy.deepcopy(frame)

    # 処理負荷軽減のための対象フレーム縮小（引数指定時）
    height, width = frame.shape[:2]
    temp_frame = cv2.resize(frame, (int(width/resize_rate), int(height/resize_rate)))

    if tracker_start_flag == True:
        # 追跡開始
        tracker.start_track(temp_frame, dlib.rectangle(mouse_start_x, mouse_start_y, mouse_end_x, mouse_end_y))
        tracking_flag = True
        tracker_start_flag = False
    elif tracking_flag == True:
        # 追跡更新
        tracker.update(temp_frame)

    # 描画
    if selecting == True:
        cv2.rectangle(frame, (mouse_start_x, mouse_start_y), (mouse_end_x, mouse_end_y), (0, 0, 255), 2)
    if tracking_flag == True:
        tracking_point = tracker.get_position()
        tracking_point_x1 = int(tracking_point.left())
        tracking_point_y1 = int(tracking_point.top())
        tracking_point_x2 = int(tracking_point.right())
        tracking_point_y2 = int(tracking_point.bottom())
        cv2.rectangle(frame, (tracking_point_x1, tracking_point_y1), (tracking_point_x2, tracking_point_y2), (0, 0, 255), 2)

    cv2.imshow('correlation tracker', frame)

    c = cv2.waitKey(50) & 0xFF

    if c==27: # ESC
        break

```

以上。
JavaでScalaのライブラリを使うためTraitをデコンパイルした

とある事情でJavaからScala用のライブラリを使わなければならなくなりました。

そのライブラリはあるTraitをミックスインすることで、機能を自分でカスタマイズできます。そして今回、そのカスタマイズが必要になったため、JavaでそのTraitをimplementsしようと試みました。

しかしすんなりとはいかず苦戦を強いられました。そこでJavaではTraitとはどういった扱いになるのかをちょっと調べることにしました。

##JavaでTraitをimplements

まずこのScala用ライブラリの機能をカスタマイズするためにTraitをJava側で使うことにしました。
そのTraitは下記のようなものでした。（実際のソースコードではありません）

```
trait Trait_1 {

  val a: String

  val b: Int

}
```

```
trait Trait_1_1  extends Trait_1{

  val a: String = "a"

  val b: Int = 1

}
```

JavaではTraitというものはありませんが、書籍でTraitはinterfaceのようなものとあったのでとあったのでclassにimplementsしてみました。

```java:Class_1.java
public class Class_1 implements Trait_1_1 {
}
```


しかし、下記のエラーが。
 *Class 'Class_1' must either be declared abstract or implement abstract method 'a()'  in 'Trait_1_1'*

しかしTrait_1_1にはa()なんてメソッドはありません。

このメソッドなんだ？どこから出てきたんだ？
そういえばscalaではフィールドへのgetterやsetterが暗黙的に作られると聞いた気がする。

ここでようやくclassファイルをデコンパイルすることを思いつきました。

##Traitをデコンパイル

Traitの中身を知るために、ScalaでTraitを実装してコンパイルした後、作成されたclassファイルをjadを使ってデコンパイルしてみました。

まずはval変数を宣言しただけのTrait_1をデコンパイル。

```
public interface Trait_1
{

    public abstract String a();

    public abstract int b();
}
```

おお、a()メソッドが出てきましたね。これはおそらくgetterメソッドでしょう。
あとinterfaceになりました。

次に、Trait_1_1ですが、こちらはコンパイルしたところ、
Trait_1_1.class
Trait_1_1$class.class
と２つののclassファイルが作成されました。

それぞれをデコンパイルした結果がこちら。

```
public interface Trait_1_1
{

    public abstract void Trait_1_1$_setter_$a_$eq(String s);

    public abstract void Trait_1_1$_setter_$b_$eq(int i);

    public abstract String a();

    public abstract int b();
}
```

```
public abstract class Trait_1_1$class
{

    public static void $init$(Trait_1_1 $this)
    {
        $this.Trait_1_1$_setter_$a_$eq("a");
        $this.Trait_1_1$_setter_$b_$eq(1);
    }
}
```

Trait_1_1はinterfaceに、Trait_1_1$classはabstractクラスになりました。

Trait_1_1には新しいメソッドが出てきましたね。setterと書いてあることから、setterメソッドでしょう。　
Trait_1_1$classにはそのsetterメソッドを使用したinitメソッドがあります。scalaでval変数の定義をしたことが、javaではこういう形になるようです。　

ここまでの結果をまとめると、Trait_1はval変数の宣言しかせず、何の値も定義していないためgetterだけ、Trait_1_1は値を定義したためsetterが出てきたということでしょうか。

そして、これらのメソッドはabstractなので、実装を書かなければならないというのがエラーの原因だったようです。

ではこれらのabstractメソッドの実装をすればいけるのでしょうか？
それをしたのがこちら。

```java:Class_1.java
public class Class_1 implements Trait_1_1 {

    public String a () {
        return "a";
    }

    public int b () {
        return 1;
    }

    public void Trait_1_1$_setter_$a_$eq(String s){};

    public void Trait_1_1$_setter_$b_$eq(int i){};
}
```
getteメソッドは値を返すように、setterメソッドはひとまず中身なしのメソッドにしてみました。
一応これでコンパイルが通るようにはなりました。
react + fluxxor で "An action of type **** was dispatched, but no store handled it" と怒られた

react + fluxxor でごにょごにょしている時に、以下のWarningが出てきてイベントが正しくハンドルされなかった。

```
An action of type send-chat was dispatched, but no store handled it
```

結構悩んでたのにクソ凡ミスだった。

Store内でbindActionsする時に該当のイベントを入れ忘れていた。。。

```
// ↓これの引数に入れてなかった。
this.bindActions(
    constants.START_SELECT, this.onStartSelect,
    constants.END_SELECT, this.onEndSelect
);
```

以上。
Camera Serial Interface(CSI-2)のカメラを使う

カメラモジュールを組み込みの分野で使うときの選択肢に
Camera Serial Interface(CSI-2)　がある。

wikipedia[Camera Serial Interface](https://en.wikipedia.org/wiki/Camera_Serial_Interface)


MIPI [Camera Interface Specifications](http://mipi.org/specifications/camera-interface)


ご存知のとおり、RaspberryPi2 / RaspberryPi3では、USBカメラの他に、RaspberryPi用のカメラをCSI-2のインタフェースで利用することができる。Jetson TX1もCSI-2を利用できる。

USBインタフェースとCamera Serial Interfaceとを比べると、Camera Serial Interfaceの方が、カメラの性能を引き出せるインタフェースであり、同じカメラをつないだときのフレームレートがUSBカメラの場合よりも高い値となる。



秋月電子　[ＲａｓｐｂｅｒｒｙＰｉカメラモジュール（ｅｌｅｍｅｎｔ１４版）](http://akizukidenshi.com/catalog/g/gM-10476/)


[ソニー製センサーで800万画素と大幅に性能アップしたRaspberry Pi用カメラモジュールが登場](http://gigazine.net/news/20160426-raspberry-pi-8m-camera/)

Rasppberry Pi用のカメラが大幅に性能アップした件

Raspberry Piカメラのセットアップ方法
http://www.rs-online.com/designspark/electronics/jpn/knowledge-item/raspberry-pi-camera-setup
Raspberry_Pi_Camera実装
http://techstorage.interlink.ne.jp/?p=1038

Camera Serial Interface
https://en.wikipedia.org/wiki/Camera_Serial_Interface

RaspberryPiでは、専用のインタフェースでカメラモジュールを接続することができる。
ソニー製センサーで800万画素と大幅に性能アップしたRaspberry Pi用カメラモジュールが登場
http://gigazine.net/news/20160426-raspberry-pi-8m-camera/
![](http://cdn-img.auone.jp/spnews/image/ggz/2016/04/ggz_CLM201604260010/ggz_CLM201604260010_01_l.jpg)


Interface
緊急特集 ソニー技術者が徹底解説 
新型ラズパイ・カメラ
7月25日発売　定価 926円＋税
http://www.kumikomi.net/interface/contents/201609.php

![Interface](http://shop.cqpub.co.jp/hanbai/books/MIF/MIF201609.jpg)



[Raspberry PiとPiNoirカメラを組み合わせて夜間用カメラを作成する](https://jp.linux.com/Linux%20Jp/tutorial/432314-tutorial2015080701)


[Arduino & Raspberry Pi Camera Interface](http://www.electroschematics.com/11140/arduino-raspberry-pi-camera-interface/)


[Raspberry Pi Professional Camera Kit](http://www.mini-kossel.com/pi-camera-module)

![Raspberry Pi Professional Camera Kit](http://www.mini-kossel.com/image/cache/data/product/pi_cam_3.6mm_600x450-600x600.png)



eLinux [Rpi Camera Module](http://elinux.org/Rpi_Camera_Module)
  RaspberryPi でのサンプルプログラムの説明もあります。

---------------------------------------

eLinux /Jetson/Cameras [JetsonのCSI](http://elinux.org/Jetson/Cameras#Multiple_Cameras)
 eLinuxは組み込みのLinuxボードの情報がよく書かれているサイトです。
　どのようなカメラがJetsonで利用可能かが書かれています。
　CSI MIPIのカメラもその１つです。

e-CAM30_HEXCUTX2 - NVIDIA Jetson TX1 / TX2用の6つのFull HDカメラボード
https://www.e-consystems.com/jp/multiple-csi-cameras-for-nvidia-jetson-tx2-jp.asp



[AM5716	(開発中)](http://www.tij.co.jp/product/jp/AM5716)


付記：
MIPIという表現とCSIという表現とが同じ内容を指し示していることに気づきにくかったので、修正。

jetson nanoにも
Camera	1x  MIPI CSI-2 connector
インタフェースがある。
https://developer.nvidia.com/blog/ultimate-starter-ai-computer-jetson-nano-2gb-developer-kit/

Jetson Xavier NX Developer Kit
Camera	2x MIPI CSI-2 DPHY lanes
https://developer.nvidia.com/embedded/jetson-xavier-nx-devkit
現在のターミナルのサイズを調べるtputコマンド

普通に生きているとあんまり使わないけど、
ターミナル周りがなんかおかしくてデバッグしてると現在のターミナルのwidthとheightが調べたくなるときがあるんだ。
そんなあなたにtputコマンド。

```bash
$ tput cols
104
$ tput lines
57
```

すごい環境依存しそうだけど、とりあえずMacOSXとAmazonLinuxでは使えた。

参考：
http://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window
Google Cloud Vision API sample for python

この記事は、Google Cloud Vision API を使う為のサンプルコードとその解説です。このサンプルコードは、他のpythonコードにて import して使う事を想定しています。

動作確認を単体で行う場合は、##main 以下の部分のコメントアウトを外して単体テストしてください。

まず初めに、このサンプルを動かす為には Google Cloud Vision API の APIキーを取得しておく必要があります。また、解析したいサンプル画像は予め用意して実行するプログラムと同じ階層に data/sample.png として保存しておきます。

このコードを実行すると画像データを Google Cloud Vision API に送って、帰ってきた結果を画面表示してdescriptionの値をtmpに保存します。

応用として、update_json_fileのメソッドで帰ってきたJSONの値が違う場合のみ True を返すことで差異が発生したかを確認することができます。この値により、 twitter なり Line なり slack なりで bot 化して呟くという使い方ができます。

```python:googlecv.py
# -*- coding: utf-8 -*-

import requests
import json
import base64
import os

GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key='
API_KEY = 'YOUR-GOOGLE-CLOUD-VISION-API-KEY'
def goog_cloud_vison (image_content):
    api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY
    req_body = json.dumps({
        'requests': [{
            'image': {
                'content': image_content
            },
            'features': [{
                'type': 'LABEL_DETECTION',
                'maxResults': 10,
            }]
        }]
    })
    res = requests.post(api_url, data=req_body)
    return res.json()

def img_to_base64(filepath):
    with open(filepath, 'rb') as img:
        img_byte = img.read()
    return base64.b64encode(img_byte)

def get_descs_from_return(res_json):
    labels = res_json['responses'][0]['labelAnnotations']
    descs = []
    for value in labels:
        descs.append(value['description'])

    return json.dumps(descs)

def update_json_file(json_desc):
    fname = '/tmp/descs.json'
    if os.path.isfile(fname)==True:
        with open('/tmp/descs.json', 'r') as f:
            f_desc = json.load(f)
    else:
        f_desc = ''

    if json_desc != f_desc:
        with open('/tmp/descs.json', 'w') as f:
            json.dump(json_desc, f, sort_keys=True, indent=4)
        return True
    else:
        return False

##
## main
##
#dir = os.path.dirname(os.path.abspath(__file__))
#filename = os.path.join(dir, 'data', 'sample.png')
#print filename
#img = img_to_base64(filename)
#res_json = goog_cloud_vison(img)
#json_desc = get_descs_from_return(res_json)
#print json_desc
#update_json_file(json_desc)
```
マウスの動きで背景パララックス


デモ：http://codepen.io/mo4_9/pen/PGRjoX

動かしたい分だけ大きめの画像を設定

```css:20px大きめの画像
#bg{
  width: calc(100% + 20px);
  height: calc(100% + 20px);
}
```

レイヤーを複数重ねて視差効果を生む

```javascript
const ww = window.innerWidth;
const wh = window.innerHeight;
const hw = ww / 2;
const hh = wh / 2;
const pm = 20; // parallax margin

const $bg = $('#bg');
const $box = $('#box');

$(window).on('mousemove', (e) => {
  
  // 中心から端までの距離を、余分に大きくとった背景画像の分（ここでは20÷2=10px）に割り当てる
  const mw = ( e.clientX - hw ) / hw * ( pm / 2 ); // 0.0 ~ 10.0
  const mh = ( e.clientY - hh ) / hh * ( pm / 2 );
  console.log( mw, mh );
  
  $bg.css('margin-left', mw );
  $bg.css('margin-top', mh );
  
  // これでも同じ
  // $bg.css('left', hw + mw );
  // $bg.css('top', hh + mh );
  
  $box.css('margin-left', mw * -0.5 ); // 逆方向
  $box.css('margin-top', mh * 0.5);
  
})
```

ライブラリも発見
[Interactive BG (Background) by Pete R.](http://www.thepetedesign.com/demos/interactive_bg_demo.html)
sedでメールヘッダーの継続行を一行にまとめる

# はじめに

1メール1ファイルの状態で、To:やCc:に特定のメールアドレスを含むものだけ抽出したいとか、ときかくFrom:行だけ全部取り出したいとかやろうとすると、ヘッダーの継続行の扱いがけっこう面倒くさいですね。

普通ならPerlやPythonで書けばよいのだろうけれど、sed で継続行を一行にまとめる処理を書いてみました。

sedは読み込んだ行はパターンスペースに配置して、このパターンスペースが操作の対象となりますが、もうひとつホールドスペースというのを持っていて、これをうまく使うことで複数行を処理できます。

# サンプルコード

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ {.sed .numberLines}
:top
/^$/q
/^[A-Za-z]/{
/^[Ff][Rr][Oo][Mm]:/b concat
/^[Tt][Oo]:/b concat
/^[Cc][Cc]:/b concat
b next
:concat
h; n
:loop
/^[[:space:]]/{
H; x; s/\n[[:space:]]*/ /; x; n;
/^[[:space:]]/b loop
}
x; p; x;
/^[A-Z]/b top
}
:next
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# 解説

##### 1 行目

  ```sed
:top
```

  `:`で始まるのはラベル行です。

##### 2 行目

  ```sed
/^$/q
```

  ヘッダーにしか用はないので、ヘッダー部分が終了したら処理を打ち切ります。

##### 3 行目 〜 17 行目

  `/^[A-Za-z]/{` ... `}`

  ヘッダー行の先頭部分だったらこのブロックの中を実行します。

##### 4 行目 〜 7 行目

  ```sed
/^[Ff][Rr][Oo][Mm]:/b concat
/^[Tt][Oo]:/b concat
/^[Cc][Cc]:/b concat
b next
```

  `From:`, `To:`, `Cc:` のとき、`:concat`以降の結合処理にジャンプ(`b concat`)します。

  そうでなければ、`:next`のところにジャンプ(`b next`)します。

  `:next`以降にコマンドはないので、sed は次の行の処理に移ることになります。

##### 8 行目 〜 9 行目

  ```sed
:concat
h; n
```

  現在の行をホールドスペースにコピーして(`h`)次の行を読み込みます(`n`)。

##### 10 行目 〜 14 行目

  ```sed
:loop
/^[[:space:]]/{
H; x; s/\n[[:space:]]*/ /; x; n;
/^[[:space:]]/b loop
}
```

  継続行を1行にまとめる処理です。

  読み込んだ行が継続行であれば `/^[[:space:]]/{` ... `}` のブロックの中が実行されます。

  パターンスペースをホールドスペースに追加して(`H`)、改行と継続行先頭の空白を単一のスペースに置換します（`s/\n[[:space:]]*/ /`）。

  `x`はパターンスペースとホールドスペースを入れ替えるコマンドです。sedの操作はパターンスペースに対してのみ実行可能なため、このように入れ替えを行います。

  次の行を読み込んで(`n`)、さらに継続行であれば`:loop`のところにジャンプしてループを続けます（`/^[[:space:]]/b loop`）。

##### 15 行目

  ```sed
x; p; x;
```

  ホールドスペースには、1行にまとめられたヘッダー行が保存されているので、これを出力します。

##### 16 行目

  ```sed
/^[A-Z]/b top
```

  パターンスペースには次の行を読み込んであるため、ヘッダー行であれば先頭に戻って処理を続けます（`/^[A-Z]/b top`）。

# 注意

##### `[[:space:]]`

  `[:space:]`はPOSIX正規表現で空白を示すメタ文字列です。文字セット(`[]`)の中でのみ効果を持つため、`[[:space:]]`のように書きます。

  POSIX正規表現を理解しない、伝統的なsedでは `[` `スペース` `タブ` `]` といったように書きましょう。ただし、ターミナルに表示されているこの行を安易にコピー&ペーストすると、タブがスペースに展開されていたりしますので注意が必要です。

##### `b` コマンド

  ラベルの後に `;` で区切ってさらにコマンドを書くことができるのは GNU sed のみです。
#深層学習概要（自分用メモ）

#注意書き
この記事は私が深層学習の勉強をするにあたって読んだ書籍の内容をまとめたり、自分の中で解釈したことを記したものです。
機械学習自体も素人であるため、トンチンカンなことを書くこともあるかと思います。気になった点や、おかしなところがあれば指摘していただけると幸いです。

#深層学習とは
深層学習とは機械学習の手法のひとつであり、入力されたデータをもとにクラス分類や回帰を行う手法です。
ではそもそも機械学習とは何か？
機械学習自体は


>人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のこと（Wikipediaより引用）

とWikipediaでは定義されております。
人間が行っている「学習」というものを再現すべく、いろいろな手法が試されており、その中でも近年、極めて高い成果を上げて注目を集めている手法が「深層学習」というわけです。

#従来の機械学習との比較
では、何がほかの手法と異なるのか？
簡潔にまとめると、**どのような特徴を捉えれば高い性能を出すことができるのか自動的に獲得できる**というところです。

例えば、従来の手法だと画像を分類する際、画像の特徴はどこなのか、どこに着目すればよいのかを人が設計する必要がありました。
それに対して深層学習の場合は学習データを放り込めば自動的にデータのどこを特徴点としてとらえるべきかマシン側が勝手に決めてくれます。これが深層学習と従来の手法との処理の違いです。

#深層学習という概念
深層学習という言葉自体は概念で、一般的には深い層から構成されるネットワークを指します。
大きく分けると、深層学習は「パーセプトロン」を起源とするものと「ボルツマンマシン」を起源とするものの二つに分かれます。

パーセプトロンを起源とするもので、最も基本的な構成はパーセプトロンを多層に組み合わせた多層パーセプトロンです。その派生で、人の視覚野のような構成を取り入れた「畳み込みニューラルネットワーク（CNN）」が有名かと思います。こちらは学習データに正解となるラベルをセットにして学習させる教師あり学習です。

一方、ボルツマンマシンの方は、製薬ボルツマンマシンを多層にしたディープ・ボルツマンマシン、ディープ・ビリーフ・ネットワークです。こちらは正解を教えずに学習させる教師なし学習です。

今回はここまで。

#参考文献
山下隆義
イラストでわかるディープラーニング 講談社

新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
presentModalViewController:animated is deprecated in iOS 6.0

iOS 6.0から、以下の使い方は、警告出る。
[self presentModalViewController:controller animated:YES];

警告：
'presentModalViewController:animated:' is deprecated: first deprecated in iOS 6.0

対応方法：
以下のように変更すれば、警告がなくなる。
[self presentViewController:controller animated:YES completion:nil];

なお、以下も同じの対応方法です。
[self dismissModalViewControllerAnimated:YES];
から
[self dismissViewControllerAnimated:YES completion:nil];に変更。
XCode8で「Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'int'」警告

XCode8にて、「Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'int'」警告が出た場合あります。
その原因は、NSIntegerの持ちうる値が32bitか64bitかは処理系依存だから。
int型変数に値を代入する時はプログラマが明示的にint(32bit)と宣言する必要がある。
そして、NSIntegerはlong型 "または" int型をtypedefしたもの。

例えば、以下のような場合、警告がある。
変更前：
iTotalQuestion = [appDelegate.questions count];

変更後：
iTotalQuestion = (int)[appDelegate.questions count];
DB移行時に既存DBと新規DBのデータの差分をチェックする方法


### 経緯
サービスの移行を行うにあたってDBの移行をすることになったので。

### 方法と使ったもの
既存DBと新規DBをレプリケーションを使って同期をとることにした。
その際に、AWSのDMSを使って同期を取り続けることにした。

### 今回作ったもの
DMSで同期を取り続けた場合、定期的に既存のテーブルと、新規のテーブルの差分がなく、きちんとデータが移行されているかを確認するようにしたシェル。
ちなみにデータの中身は確認せず、各テーブル毎のcountを取得して比較するだけの簡単なシェル。
やっつけ的に作ったのであとは適宜直してください。

### 使い方
以下シェルスクリプトをコピペして、SOURCE_DB、SOURCE_OPTIONS、TARGET_DB、TARGET_OPTIONSを適宜変更して使ってください。
mysqlコマンドが使えることが大前提なのでご注意ください。

### その他
ちなみにAWS的には移行ツールは提供してくれるけど、データの整合性チェックツールは提供してくれていないらしい。
今後してくれるかどうかは不明。ちぇっ・・・。


### メイン
```db_check.sh
SOURCE_DB="source_db"
SOURCE_OPTIONS="-u test -h source_host -D $SOURCE_DB -ppassword"

TARGET_DB="target_db"
TARGET_OPTIONS="-u test -h taget_host -D $TARGET_DB -ppassword"

# 指定したデーベースのテーブル名を全て取得
CMD="echo 'show tables;' | mysql $TARGET_OPTIONS -N"
TABLES=(`eval $CMD`)

# 各テーブルごとにcountの結果を比較
for table in "${TABLES[@]}"
do
    SOURCE_SQL="select count(*) FROM $table"
    SOURCE_CMD="echo '${SOURCE_SQL};' | mysql ${SOURCE_OPTIONS} | head -2 | tail -n 1"
    SOURCE_TABLECOUNT=(`eval $SOURCE_CMD`)
 
    TARGET_SQL="select count(*) FROM $table"
    TARGET_CMD="echo '${TARGET_SQL};' | mysql ${TARGET_OPTIONS} | head -2 | tail -n 1"
    TARGET_TABLECOUNT=(`eval $TARGET_CMD`)

    if [ $SOURCE_TABLECOUNT = $TARGET_TABLECOUNT ]; then
      echo "OK is $table"
    else
      echo "NOT EQUAL $table SOURCE_DB count $SOURCE_TABLECOUNT  :  TARGET_DB count $TARGET_TABLECOUNT"
    fi
done
```
Linux/WindowsでもMacOSXみたいにopenでファイルを開きたい

[HTMLファイルをコマンドラインから開く](http://qiita.com/hkato/items/9ed477788633d1a62a7a)
って方法でやってたのですが、[Linux: Open a file with the default application](http://qiita.com/chen7897499/items/bf67313a26e8aeb23aaf)って記事を見たので再投稿。

# Linux
freedesktop.orgの[xdg-utils](https://portland.freedesktop.org/doc/xdg-open.html)を使う。ディスクトップ環境をインストールするとデフォルトで入っている様子。これにaliasを設定しておく

```bash
alias open=xdg-open
```

で

```shell-session
$ open hoge.html
```

# Windows

`explorer hoge.html` で開けるのでaliasしたい。Windowsでalias的なのはdoskeyなので、

```
> doskey open=explorer $*
```

起動時に自動読み込みさせるには、
[Windowsのコマンドプロンプトでaliasを設定する (cmderの設定含む)](http://qiita.com/little_hand_/items/91d6bcb680eba10da835)
を参照。

で

```
> open hoge.html
```
wordpressに動画を挿入するときに気をつけること（非エンジニア向け）

# つい先日のこと
私は今あるメディアに携わっている。そこではwordpressが使われていて、ライターさんがせっせと記事をカキカキしている。
あるときのことだった。ある記事を公開した途端、いい記事だったというのもあって、速攻でサーバーがダウンしてしまった:fearful:
そこで早速その記事を見てみると100MBくらいの超高画質の動画（わずか20秒程度だが）をそのまま記事に載せていた。しかも重すぎて誰も見れなそうだ。ちゃんと記事を確認していれば未然に防げたかもしれない。　
・・・ということで前置きが長くなりましたが、こんなことを防ぐためにwordpressでは動画をそのまま載せるよりも、YouTubeの埋め込みをした方がいいと私は考えています。そこで、非エンジニアにもわかるように、ちょっと鬱陶しいぐらいに感じるほど丁寧に、クソな私のイラストを添えて、**なぜ埋め込みをした方がいいのか**（埋め込みの方法ではない）を書いて見ました。ぜひ同じ境遇にあるような人は、この記事をライターさんに見せてみてください。


## 動画の『形式』について

動画や音楽には様々な「形式」というものがあります。例えば、ボールを考えてみましょう。ボールにはサッカーボールやテニスボールなど、一口にボールといっても様々な種類があります。それぞれのボールは大きさ、バウンド具合が様々で、それぞれのスポーツに適したように作られています。  
これと同様に音楽や動画でも、一口に音楽、動画といっても、それぞれの場合に適したように、様々な種類があります。皆さんも音楽の種類でmp3(えむぴーすりー)ということを聞いたことはありませんか？例えばmp3プレーヤーであるとか。。。mp3というのは携帯音楽プレーヤー用の音楽の種類で、軽量で比較的高音質なことが特徴です。  
したがって、動画をウェブサイトに載せる時は、ウェブサイトに適した種類の動画で載せる必要があります。そのために、元ある動画を他のファイル形式（他の種類）に変換しなければなりません。

![media_explain1.png](https://qiita-image-store.s3.amazonaws.com/0/119783/37e8119d-1322-4aed-d23c-40e07b68ab37.png)  



しかし、これがすごく難しいのです。 動画の種類といっても色々ありますし、何より時代によって適した種類は変わっていくものなのです。最近はどんどん通信技術が発達して、多くの人々がたくさん通信することができるようになりました。よって、少し前では容量が大きすぎて、動画がすぐ止まってしまったとしても、今では通信速度が速くなったために、全然ストレスなく動画がみれるという場合があります。  
だから、ウェブサイトに適した動画に変換するというのはとても難しいものなのです。 ここで登場するのがYouTubeです。簡単にいうと、YouTubeはそこらへんのめんどくさいことをだいたい、いい感じにやってくれます。皆さんもYouTubeを見ている時にストレスを感じた経験はあまりないと思います。さすが、世界一の動画サイト。やっぱり世界一だけのことはあります。  
これがブログにYouTubeに動画を埋め込むべき一つの理由です。  

## 通信制限を回避する

皆さんは自身のブログがどのようにして公開されるかご存知ですか？世界中のどこかに、あなたのブログのデータや記事が入ったデータを保存したパソコンがあります。そのパソコンにたくさんのユーザーがアクセスして、あなたのブログをみているのです。  
ここで一つの問題があります。それは、そのブログがあるパソコンに通信制限のようなものがあるのです。例えば、あなたもスマホでゲームをやりすぎたとか、YouTubeを見すぎたとかで通信制限にひっかかったことはありませんか？通信制限に引っかかるとちょっとインターネットを使おうと思っても、重すぎてイライラしますよね。 あたたが通信制限に引っかかったら我慢すればなんとかなりますが・・・  
あたたのブログが通信制限に引っかかると**悲惨**なことになります。せっかくアクセスしようとしてくれたユーザーが、アクセスが重くなって、イライラさせてしまう。そして最悪の場合、約一ヶ月ほど誰もアクセスできなくなってしまいます。基本的にあなたのブログに通信制限がかかる時は、あなたがすごくいい記事を書いて、たくさんのユーザーが見に来ようとしている時なので、ここでアクセスが重くなってしまうのは非常に勿体無い！  
ではあなたのブログを通信制限に仕向ける一番の悪人は誰か？そう、それが**動画**なのです。動画は文字データや画像データと違ってたくさんの通信を使います。ですから、動画は時にはもっとも悪いやつになりうるのです。あなたがスマホで通信制限にかかる多くの時は、YouTubeとかAbemaTVとかの見過ぎではないでしょうか。このように動画は通信を食いまくる食いしん坊なのです。  
![media_explain3.png](https://qiita-image-store.s3.amazonaws.com/0/119783/5e5476c8-fb78-c599-6153-197eb4490a46.png)

ここでYouTubeの埋め込みを使うとどうなるでしょう。見た目には動画をあなたのブログで見ているように思えますが、実際ユーザーはYouTubeと通信しているのです。ですから、ここでは動画はブログの通信を食っておらず、ブログの通信制限を回避することができます。これであなたもユーザーもみんなhappyですね。でもおそらく一番happyなのはYouTubeでしょうね。  

![media_explain2.png](https://qiita-image-store.s3.amazonaws.com/0/119783/23509597-62ae-b106-7e0b-cb3cbdf18e7f.png)


# まとめ
以上の理由からYouTubeの埋め込みをブログに使用した方がいいと私は考えています。実は画像も同じような問題を抱えているのですが、動画よりはるかに複雑で、めんどくさいので気が向いたら書きます。

そして、気になるYouTube埋め込みの仕方は・・・・・・・・
時間がある時に書きます。すいません:cold_sweat:（調べて見たら、すぐに見つかると思います。）
python numpy アレイへ添え字アクセス

# numpyのアレイへ添え字アクセス

## アレイ１要素の取り出し

``` python
>>> import numpy as np
>>> arr = np.arange(0,11)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> arr[5]
5
```

## アレイ１要素の取り出し

``` python
>>> import numpy as np
>>> arr = np.arange(0,11)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> arr[5]
5
```

## アレイをスライスで取り出し
``` python
>>> arr[0:5]
array([0, 1, 2, 3, 4]) #5はふくまれない
```

## スライス指定で代入
``` python
>>> arr[0:5]=100
array([100, 100, 100, 100, 100,   5,   6,   7,   8,   9,  10])
```

## アレイコピーのつもりが、参照（スライス使わなくても同様）
``` python
>>> slice_of_arr = arr[0:5]
>>> slice_of_arr
array([100, 100, 100, 100, 100])
>>> slice_of_arr[:]=10
>>> slice_of_arr
array([10, 10, 10, 10, 10])
>>> arr
array([10, 10, 10, 10, 10,  5,  6,  7,  8,  9, 10]) #元のアレイまで変更
```

## アレイコピー
``` python
>>> copy_arr = np.copy(arr[0:5])
>>> copy_arr
array([10, 10, 10, 10, 10])
>>> copy_arr[:] = 0
>>> arr
array([ 0, 10, 10, 10, 10,  5,  6,  7,  8,  9, 10]) #元のアレイ影響なし
```

## ２次元の添え字
``` python
>>> arr_2d = np.array(([0,1,2],[10,11,12],[20,21,22]))
>>> arr_2d 
array([[ 0,  1,  2],
       [10, 11, 12],
       [20, 21, 22]])
>>> arr_2d[0] #０行めを取り出す
array([0, 1, 2])

# 個別アクセス　arr_2d[row][col] or arr_2d[row,col]
>>> arr_2d[1][0] 
10
>>> arr_2d[1,0]
10 
```

## 添え字活用応用例
``` python
>>> arr2d = np.zeros((10,10))
>>> arr2d
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
>>> arr_length = arr2d.shape[1] #アレイの長さ
>>> for i in range(arr_length): arr2d[i] = i
>>> arr2d
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.,  5.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.],
       [ 8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.],
       [ 9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.,  9.]])

>>> arr2d[[2,4,6,8]] #偶数行だけ取り出す
array([[ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.,  8.]])
>>> arr2d[[6,4,2,7]] #順番を変えて取り出す
array([[ 6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.,  6.],
       [ 4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.,  4.],
       [ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.],
       [ 7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.,  7.]])
```
Play FrameworkのdistでAPIドキュメントを含めないようにする方法

公式ドキュメントに書いてあった内容をバージョンごとにまとめました。

# バージョンごとの設定
## 2.5.x
build.sbtに以下の内容を追記すればよいそうです。

```scala:build.sbt
sources in (Compile, doc) := Seq.empty

publishArtifact in (Compile, packageDoc) := false
```
https://www.playframework.com/documentation/2.5.x/Deploying


## 2.4.x
build.sbtに以下の内容を追記すればよいそうです。

```scala:build.sbt
sources in (Compile, doc) := Seq.empty

publishArtifact in (Compile, packageDoc) := false
```
https://www.playframework.com/documentation/2.4.x/Production


## 2.3.x
build.sbtに以下の内容を追記すればよいそうです。

```scala:build.sbt
doc in Compile <<= target.map(_ / "none")
```
https://www.playframework.com/documentation/2.3.x/ProductionDist


## 2.2.x 以前
2.2.x以前は公式ドキュメントには記載されていないようでした。


# distタスクについて
## distタスクの実体

```bash
$ play universal:package-bin
```

あるいは

```bash
$ activator universal:packageBin
```

## SBT Native Packager plugin
http://www.scala-sbt.org/sbt-native-packager/
Google Play で Android アプリの類似、サジェストキーワードを取得してCSV出力する

# やりたいこと
Google Play でよく検索されているキーワードと似ているキーワードを知りたい

# 課題
Google Play でもSEOと同様ダイレクトにキーワードを取得することはできない

# 近いものを出す方法
Google Play の検索でターゲットになるキーワードに対してサジェストで表示されるキーワードを取得する！

# 実装
## 環境

- Mac OSX ElCapitan(10.11.6)
- ruby (2.3.0)
- selenium-webdriver (今回はchromeを使用)


selenium driver を事前にDLしてパスを通す
https://sites.google.com/a/chromium.org/chromedriver/downloads

## スクリプト

```ruby:get_keywords.rb
require 'selenium-webdriver'
require 'csv'

@driver = Selenium::WebDriver.for :chrome # ブラウザ起動
@driver.navigate.to 'https://play.google.com/store?hl=ja' # URLを開く
@csv = CSV.open('keywords.csv', 'w')
# テキストフィールドへ入力・削除
def get_keywords(keyword)
  element = @driver.find_element(:name, 'q')
  element.send_keys(keyword)
  sleep(3) # 入力時間にタイムラグがあるので sleep
  elements = @driver.find_elements(:class, 'ac-row')

  elements.each do {|e| @csv << [keyword, e.text] }
  element.clear
end

original_keywords =  %w(キーワード1 キーワード2 キーワード3)

original_keywords.each {|k| get_keywords(k) }

@driver.quit
@csv.close

```

これで`keywords.csv`に元キーワードとサジェストキーワードが出力されます。
mecabで分かち書きコマンド

検索でヒットしなかったから投稿
当たり前すぎて書かれないだけかもしれない笑

## mecabで分かち書き

```
$mecab -Owakati
```
というコマンドで入力待ちになるので、分かち書きしたい文章を打つとしてくれる。

```
こんにちは。 今日は寒いですね
こんにちは 今日 は 寒い です ね
```


## 出力
```
$ mecab -Owakati >> mecab.txt
```
というコマンドで出力も出来る。


## python

```
# coding: UTF-8
import MeCab
mt = MeCab.Tagger("-Owakati")
print(mt.parse("こんにちは。今日は寒いですね"))


# => こんにちは 。 今日 は 寒い です ね 
```
【BoUoW】Apache起動時の「Failed to enable APR_TCP_DEFER_ACCEPT」

Bash on Ubuntu on Windowsで遊んでます。

Apacheを起動させる時の、
**Invalid argument: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT**
というWarningが気になったので、
/etc/apache2/apache2.conf
へ以下の2行を追加。

```apache
AcceptFilter http none
AcceptFilter https none
```

以下、助け＆参考になったページです。
http://stackoverflow.com/questions/36469527/installing-apache-on-windows-subsystem-for-linux
http://www.vintage.ne.jp/blog/2015/05/404
DbSetup + MySQLを利用したUnit Testで外部キー制約を一時的に無効化

# 概要

データベース操作を伴うUnitTestを書く時に、DbSetupを利用してテストデータの登録を行います。
その際データベースの制約（FKなど）のために、直接テストしたい処理と関係ないデータの登録が求められるケースがあると思います。

制約を満たすデータを用意する方が勿論よいとはいえ、効率等との兼ね合いでコストが高い場合に、一時的に制約等を向こうにしてテストデータを登録する方法についてまとめます。

# 前提

- DbSetup
- Spock
- (SpringBoot)

# 詳細

setupで外部キーを無効にし、cleanupで有効に戻すようにします。

```groovy
@Unroll
@SpringBootTest
class SampleRepositorySpec extends Specification {
    @Shared
    DataSourceDestination destination

    @Autowired
    DataSource dataSource

    def setup() {
        destination = new DataSourceDestination(dataSource)
        new DbSetup(destination,
                Operations.sequenceOf(
                        Operations.sql("SET FOREIGN_KEY_CHECKS = 0"),
                )
        ).launch()
    }

    def cleanup() {
        new DbSetup(destination,
                Operations.sequenceOf(
                        Operations.sql("SET FOREIGN_KEY_CHECKS = 1"),
                )
        ).launch()
    }

    def "何かしらのテスト"() {
        // 制約を無視したテストデータの登録
    }
}
```

上記ではdataSourceがSpringBootTestによってDIされることを想定していますが、本質的には関係ありません。

# おまけ

毎回SQLをハードコーディングするのも何なので、ユーティリティを用意してみます。

```java
public final class MysqlOperations {

  private MysqlOperations() {
  }

  public static Operation enableFkCheck() {
    return Operations.sql("SET FOREIGN_KEY_CHECKS = 1");
  }

  public static Operation disableFkCheck() {
    return Operations.sql("SET FOREIGN_KEY_CHECKS = 0");
  }
}
```

少しスッキリ書けるようになりました。

```groovy
    def setup() {
        destination = new DataSourceDestination(dataSource)
        new DbSetup(destination,
                Operations.sequenceOf(
                        MysqlOperations.disableFkCheck(),
                )
        ).launch()
    }

    def cleanup() {
        new DbSetup(destination,
                Operations.sequenceOf(
                        MysqlOperations.enableFkCheck(),
                )
        ).launch()
    }
```
Laravel 5.3のSocialiteに含まれていないLINEやYahoo!JAPANなどの認証サービスをcomposerを使ってサクッと実装する方法


## やりたいこと
* 表題の通り、laravel/socialiteで、twitterやfacebookのアカウント認証はできるようになったが、LINEやYahoo!JAPANのアカウントでも認証できるようにしたい。
* とりあえずは、[こんな面倒な手順](http://qiita.com/LowSE01/items/25be61b1039e54bc722b)に従えばできるんだけど、こんなこと毎度毎度やりたくないんだけど。どうにかならんもんかね？

## というわけで、つくりました
### Packagist
* https://packagist.org/packages/ringo-project/socialite


### 注意書き
* ご使用は自己責任でお願いします。
* コメとかで認証サービスの追加要望を頂いたら実装するかもしれません。
* プルリク頂いたらマージするかもしれません。
* 個人的にゆるくやってみた感じなんで、バージョン番号とかはへんなコミット履歴とかは温かい目で見てやってくださいw
* forkしたりコピーしたりってこともご自由にどうぞ。
* 今後もプロバイダとかはゆるゆると追加すると思います。

## 導入手順

### パッケージインストール

* 以下のコマンドを実行

	``` bash
	cd your/laravel/project/path
	composer require ringo-project/socialite
	```
	
### 設定変更

* SocialiteServiceProviderの向き先を変更する。

	``` php:config/app.php
	<?php
	
	return [
		// ...
		'providers'       => [
			// ...
			//Laravel\Socialite\SocialiteServiceProvider::class,	//除外
			RingoProject\Socialite\SocialiteServiceProvider::class,	//追加
			// ...	
		],
		// ...
		'aliases'         => [
			// ...
			'Socialite'    => Laravel\Socialite\Facades\Socialite::class,
			// ...
		],
	
	];
	
	```

* config/services.phpを編集する。

	``` php:config/services.php
	<?php
	
	return [
		
		// ...
		
		'line'   => [
			'client_id'     => env('LINE_CLIENT_ID'),
			'client_secret' => env('LINE_CLIENT_SECRET'),
			'redirect'      => env('LINE_REDIRECT'),
		],
		'yahoo'  => [
			'client_id'     => env('YAHOO_CLIENT_ID'),
			'client_secret' => env('YAHOO_CLIENT_SECRET'),
			'redirect'      => env('YAHOO_REDIRECT'),
		],
		
		// ...
		
	];
	
	```
			
* .env.xxxxxを編集

	``` .env.xxxxx
	# ...
	
	
	LINE_CLIENT_ID=(your-line-client-id)
	LINE_CLIENT_SECRET=(your-line-client-secret)
	LINE_REDIRECT=(your-line-redirect-url)
	
	YAHOO_CLIENT_ID=(your-yahoo-client-id)
	YAHOO_CLIENT_SECRET=(your-yahoo-client-secret)
	YAHOO_REDIRECT=(your-yahoo-redirect-url)
	
	# ...
	```

#### 認証実行

* あとは、[Laravel 5.3で外部アカウントを使用した認証機能を実装する方法](http://qiita.com/LowSE01/items/7bb479cfe3a9ba7723d4)に書いた[コントローラの作成](http://qiita.com/LowSE01/items/7bb479cfe3a9ba7723d4#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E4%BD%9C%E6%88%90)以下の手順を、それぞれのプロバイダ名に読み替えて実装すれば完成。
python numpy アレイの計算

# numpyで計算してみる

## アレイの掛け算(要素同士の掛け算）

``` python
>>> import numpy as np
>>> from __future__ import division #python2の場合。小数点以下も表示する
>>> my_array1 = np.array([1,2,3,4])
>>> my_array1
array([1, 2, 3, 4])
>>> my_array1*my_array1
array([ 1,  4,  9, 16])
```

## アレイの引き算

``` python
>>> my_array1-my_array1
array([0, 0, 0, 0])
```

## アレイのべき乗

``` python
>>> my_array1**2
array([ 1,  4,  9, 16])
```

## アレイの内積
``` python
>>> np.dot(my_array1,my_array1) #1*1+2*2+3*3+4*4
30
```
[メモ]頂点シェーダの行列(mat4)ひとまとめ

## まとめ

``` 
最終座標(vec4) = 投影行列(mat4) × ビュー行列(mat4) × モデル行列(mat4) × 頂点座標(vec4)
```

```
モデル行列(mat4) = 拡大縮小行列(mat4) × 平行移動行列(mat4) × Ｚ軸回転行列(mat4) × Ｘ軸回転行列(mat4) × Ｙ軸回転行列(mat4)
※一例
```

```
                    |  rx 0.0 0.0 0.0 | (rx: x方向拡大率)
                    | 0.0  ry 0.0 0.0 | (ry: y方向拡大率)
拡大縮小行列(mat4) = | 0.0 0.0  rz 0.0 | (rz: z方向拡大率)
                    | 0.0 0.0 0.0 1.0 |
```

```
                    | 1.0 0.0 0.0  dx | (dx: x方向移動量)
                    | 0.0 1.0 0.0  dy | (dy: y方向移動量)
平行移動行列(mat4) = | 0.0 0.0 1.0  dz | (dz: z方向移動量)
                    | 0.0 0.0 0.0 1.0 |
```

```
                    |  1.0   0.0    0.0  0.0 | (θ: 回転角)
                    |  0.0  cosθ  -sinθ  0.0 |
Ｘ軸回転行列(mat4) = |  0.0  sinθ   cosθ  0.0 |
                    |  0.0   0.0    0.0  1.0 |
```

```
                    |  cosθ  0.0  sinθ  0.0 | (θ: 回転角)
                    |   0.0  1.0   0.0  0.0 |
Ｙ軸回転行列(mat4) = | -sinθ  0.0  cosθ  0.0 |
                    |   0.0  0.0   0.0  1.0 |
```

```
                    | cosθ -sinθ  0.0  0.0 | (θ: 回転角)
                    | sinθ  cosθ  0.0  0.0 |
Ｚ軸回転行列(mat4) = |  0.0   0.0  1.0  0.0 |
                    |  0.0   0.0  0.0  1.0 |
```


## 参考文献
[回転行列]
https://ja.wikipedia.org/wiki/%E5%9B%9E%E8%BB%A2%E8%A1%8C%E5%88%97
phpでseleniumを使ったときのメモ

使用したselenium : selenium-server-standalone-3.0.0-beta4.jar
library : php-webdriver　(https://github.com/facebook/php-webdriver)

つまずいた点

- curl
 php-webdriverは内部でcurlを使用しているので、phpでcurlを使えるようにしておく。
 php.iniのextension=php_curl.dllの部分のコメントを外しておく。


- server起動時のwebdriverの指定
　server起動時にシステムプロパティでwebdriverを指定する。
　参考:(https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver#troubleshooting)
 java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone-3.0.0-beta4.jar
 なぜか環境変数ではうまくいかなかった。
 しかも、システムプロパティの指定は-jarの前でなければならないっぽい。
ブラウザアプリケーションで async/await を利用する(JavaScript)


いま現在(2016.10.11)だと Babel で先取りして利用する必要があります。

```sh:
$ npm install --save-dev babel-preset-es2015 babel-plugin-transform-async-to-generator babel-plugin-transform-runtime
```

> 上記 `runtime` のプラグインはブラウザでなく Node.js アプリケーションの場合は必要ありません。

`.babelrc` は次のとおり。

```json:.babelrc
{
  "presets": ["es2015"],
  "plugins": [
    "transform-async-to-generator",
    "transform-runtime"
  ]
}
```

これで async として定義した(もしくは Promise を返す)関数/メソッド/アロー関数の実行が完了するのを、await で待つことができます。

```javascript:app.js
// 指定ミリ秒後に Promise の resolve を返す関数
function sleep(msec) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve()
    }, msec)
  })
}

(async () => {

  await sleep(1000)

  console.log('aaa') // 1秒後に aaa を出力

  await sleep(2000)

  console.log('bbb') // 更に2秒後に bbb を出力

})()
```

> 上記で即時関数で実行している理由は、await は async として定義した関数/メソッド/アロー関数「内」でしか書けないためです。ややこしいのですが。

今回のフロントエンド環境は GitHub に置きました。よろしければ参照ください。
⇒ https://github.com/hkusu/browser-async-await-example

## その他の例

HTTP クライアントに [axios](https://github.com/mzabriskie/axios) を利用すれば、await でレスポンスを待つことが出来ます（axios のレスポンスは Promise を返すので）。

例えば Qiita の API で新着投稿の１件目のタイトルを取得しコンソールへ出力するコードは次のようになります。

```javascript:asyncな関数orメソッドorアロー関数の中のコード
// ...

const res = await axios.get('https://qiita.com/api/v1/items?page=1&per_page=10')

console.log(res.data[0].title)

// ...
```

また従来のコールバックを await で待つには、Promise で包んであげればよいです。
⇒ [コールバックを await で待ち受ける](http://qiita.com/hkusu/items/965c83fbe5832dd5292d)
PostgreSQLの「COPY」で特定のデータをダンプし別のDBに投入するメモ

## ダンプ

    db=# copy(select * from table_name where id > 320) to '/home/username/db_dump_20161011.dump';
    COPY 20

## ダンプしたデータの投入

copy句だと怒られる。

    db=> copy sample_table from '/home/username/db_dump_20161011.dump';
    ERROR:  must be superuser to COPY to or from a file
    HINT:  Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

取り急ぎ\copyで実行

    db=> \copy sample_table from '/home/username/db_dump_20161011.dump';
    COPY 56
AWSを利用した感想&発表用まとめ

# awsとは
AWSとは、Amazon.com社が主にWeb事業者・開発者向けに提供しているオンラインサービス群のAmazon Web Services（アマゾンウェブサービス‎）の略称。同社のショッピングサイトのインフラや商品データなどを外部に開放したもので、主にWebサイトやWebサービスの運営者や開発者が必要とするインフラ系のクラウドサービス（IaaS/PaaS/SaaS）を提供している。

最も有名なのは仮想サーバのレンタルサービスである「Amazon Elastic Computing Cloud」（Amazon EC2）で、これを指してAWSと呼ぶことも多い。同社の管理するデータセンター上に仮想化されたWebサーバを構築し、自らの開発したソフトウェアを自由に実行することができるサービスで、使用時間や外部へ送信されたデータ量に応じて課金される。
AWSは2006年3月から始まり、 急激に成長しているサービスで、アメリカでは政府機関が使っているほど高いセキュリティを保っています。

------
# 構成(chef構築がうまくいかず諦めた）
<img width="529" alt="諦め構成.png" src="https://qiita-image-store.s3.amazonaws.com/0/131136/7214a636-1733-91b6-d348-3f5b77ef0912.png">

------
# 構成
<img width="688" alt="最後の構成2.png" src="https://qiita-image-store.s3.amazonaws.com/0/131136/582171a8-85ec-fbc1-6165-1e84faace870.png">

* ①・・・githubにソースをアップロード（コミット）、ダウンロード（clone）
* ②・・・githubから取得したソースをfabricを使ってwebサーバにwebアプリケーションをdeploy。fabricを使ってwebサーバのセットアップ
* ③・・・webアプリケーションがmysqlとデータ連携
* ④・・・jenkinsの操作（構築時はteratermで接続して、構築作業してます）
* ⑤・・・webアプリケーションの操作（構築時はteratermで接続して、構築作業してます）
* ⑥・・・webアプリケーションが使うDBの操作（構築時はteratermで接続して、構築作業してます）

------
## PC
* OSはwindows8
* 主な用途はawsのコンソール、jenkins、github等の参照・操作に使います。全部ブラウザ（UI)から操作。またteratermを使ってlinuxで作業します。

## 開発サーバ
* 主な用途はgithubにソースをコミットするだけなので、CIサーバと同じサーバにします。構成はCIサーバ参照

## CIサーバ
* OSはamazon linux
* 主な用途はjenkinsを動かします。jenkinsでは
 - githubにソースがコミットされると、その資産を取得し、phpunitでテストを行い、問題がなければwebサーバに資産をデプロイします。デプロイはfabricの機能を使います。
 - webサーバの初期セットアップも行います。
* 主なミドルウェア：php、phpunit、apache、java、jenkins、fabric、git

------
## webサーバ
* OSはredhat
* 主な用途は自作アプリケーションを動かす　（ciサーバからデプロイされる）
* 主なミドルウェア：php、apache、mysql_client　（ciサーバからデプロイされる）

## RDS
* DBはmysql。テーブル作成は自力
* 主な用途は自作アプリケーションからこのDBを参照します。
 
## 外部サービス
* github　
* https://github.com/tmoritoki0227/test

------
# 感想 
* 基本的には勉強として利用するだけなら無料枠で利用可能である。有料サービスにおいても利用してない間は課金されない。月１０００円使用するには難しいと思われる。私の最大課金は月３００円。仮想マシンの1番低いスペックで１ｈ0.013ドル　10h-0.130ドル　100h-1.1ドル
* 当たり前だが自宅でも会社からでも利用可能なサービスである。勉強会で使うには便利。
* 仮想マシンを作成することが容易である。AWS上のUIからいくつか設定するだけで作成が可能。価格も安い。自前でサーバを用意することにメリットはもはや感じない。ただし、IPを固定化すると有料であるが、大した金額ではない。作ったサーバの複製も簡単である。仮想マシンは数分で作成可能である。
* 仮想マシンでだけでなく、データベース、ネットワークも容易に作成ができる。データベースはlinuxにインストールする手間はなく、どのデータベースを選ぶかだけである。mysql or oracle or ...。DBは１０分ぐらい作るのに時間がかかる。
* chefの環境を作ろうとしたが、chef serverとchef client(webサーバ）の連携ができずに断念。連携でエラーが出て解決できなかった。エラーメッセージからは対処が分からかなかった。マニュアル通りにはやったはずである。よって、サーバのセットアップする機能はfabricに変更した。

------

* 今回はgithubなどfabric,chefを利用したが、aws独自のソース管理システムやデプロイをする仕組みはあるようである。
* 個人的には今後システムを運営するにはデータセンター等でサーバを用意するよりかはawsのcloudサービスを利用した方が便利と感じる。ただし本当に細かい設定までしたい場合は自前でサーバを用意した方がいいと思うがそんなケースはまずないだろうと思う。
* awsの日本語マニュアルはきれいな日本語には見えるが意訳されたようには見えないので正直意味が分からない。商用サービスで使うときにはawsの日本人にサポートしてもらう必要があると感じる。もちろん英語がわかれば理解できるかと思う。
* cloudサービスに入門したい人には是非awsをお勧めしたい。クレジットカードが必要で、最初の登録作業が電話も使ったりして若干面倒だが、１年間無料なのでお勧めする。個人の勉強でやる分には課金されたとしても大したことはない。
* 全部無料枠内で実施しようとしたが、これにこだわると余計苦労する。IPは固定化しないと仮想マシン起動の度に面倒な目にあう。chefに至っては設定で非常に苦労する。設定ファイルにIPを記録するアプリケーションには向かない。
* 最後はデモをします。ファイルをgithubにコミットすると、phpunitでテストをして、アプリがwebサーバにデプロイされます。
* https://portal.aws.amazon.com/billing/signup?nc2=h_ct&redirect_url=https%3A%2F%2Faws.amazon.com%2Fregistration-confirmation
iOS10 xcode8+swift2.3で、UIButtonを角丸+影ありにするととてつもなく粗くなる。

iOS10のバグなのかなんのか、不明ですが、
UIButtonにつけていた角丸が急に粗くなった。。。


```swift:HogeViewController.swift

    let button = UIButton()

    //背景色
    button.backgroundColor = UIColor(red: 206, green: 186, blue: 167, alpha: 1)
    
    //角丸
    button.layer.cornerRadius = button.frame.size.width / 2
    
    //ボーダー幅
    button.layer.borderWidth = 0

    // 影
    button.layer.shadowOpacity = 0.5
    button.layer.shadowOffset = CGSizeMake(2,2)

```


こんな感じであらくなる

![image](https://qiita-image-store.s3.amazonaws.com/0/37406/b7f0324d-df38-d980-fbe3-a6e0628b045f.png)


※わかりやすく黒ボーダーで線を引いてます。白いところがはみ出てる。

解決方法はさがしましたがみつかりませんでした。
が、shadowを取ると粗さが消えました。。汗
下記のような感じ。

```swift:HogeViewController.swift

       //角丸
        button.layer.cornerRadius = button.frame.size.width / 2
        
        //ボーダー幅
        button.layer.borderWidth = 0
        //button.layer.shadowOpacity = 0.5
        //button.layer.shadowOffset = CGSizeMake(2,2)

```


こうう結果に。（ちょっと見づらい


![image](https://qiita-image-store.s3.amazonaws.com/0/37406/2d5be1b8-ff8f-1009-e0dd-0f72c10d45b0.png)

同じような内容で記事あがったおりました。
下記参考

http://stackoverflow.com/questions/39503661/cornerradius-stopped-working-in-swift-2-3-ios-10-xcode-8
LTVとはなんぞや？

# LTV とは

生涯顧客価値の事で、1ユーザがサービスを利用し生涯に渡ってどのくらいの利益を生むか予測したもの。

例えば、自動車ディーラの場合は、生涯に渡って平均何台乗り換えるかを計算し、自動車の平均単価を掛けて計算する。
この場合、顧客が販売店で用意しているメーカ以外の自動車が欲しくなり、他の販売店の顧客になった場合（チャーン）は、生涯の平均乗り換え台数は少なくなるため、いかに顧客を増やし、満足度を増やして、他の販売店へ移動させない事が重要になる。

# LTV に関わる属性

LTVを算出する重要な属性として、以下の4つがあります。

- Product Revenue(製品収益)
- Monthly Recurring Revenue(月間経常収益)
- Customer Churn Rate(顧客解約率)
- Customer Lifetime(生涯顧客期間)

## Product Revenue

Reveue(収益)にはProduct RevenueとService Revenue(一時収益)にわけられます。
Product Revenueは製品の基本機能を利用する際にかかる利用料金で、Service Revenueはコンサルティングやサポートなど一度だけかかる利用料金です。

WebサービスにおけるProduct Revenueは__月額・年額の利用料売上__となります。
Service Revenueは__課金特典のようなもの__となるでしょう。

## Monthly Recurring Revenue

MRRは定期的に生じる収益のことです。
一時的な収益であるService Revenueは含めず、Product RevenueだけをMRRに含めるべきです。
MRRを12倍したものをAnnual Recurring Revenue(年間経常収益)と呼びます。

## Customer Churn Rate

Customer Churn Rateはその月の顧客解約率です。
今月解約した顧客数と前月の全顧客数で割るって算出を行います。

以下のような計算式で求めることが可能です。

```math
\frac{今月退会したユーザ数}{前月の全月額課金ユーザ数}
```

## Customer Lifetime

どれだけの期間を顧客が利用してくれるかです。
Customer Churn Rateで月毎の解約率がわかるので月の解約顧客数がわかるので、現在の顧客数を月の解約顧客数で割ることで継続月数を調べることが可能です。

```math
\begin{align}
Customer Lifetime &= \frac{ユーザ数}{ユーザ数 \times Customer Churn Rate}
\\ &=\frac{1}{Customer Churn Rate}
\end{align}
```

## Lifetime Value

Customer Lifetimeにユーザ単位のMMRかけた金額です。
生涯顧客価値がわかります。

```math
\begin{align}
Lifetime Value &= Customer Lifetime \times Monthly ARPA (Average MRR per Account)
\end{align}
```

# LTVの価値を上げるには？

全ての属性が出揃いました。
これでLTVを上げるためには、どの属性をカイゼンしたらいいのかわかりますね。

1. 退会するユーザ数を減らす。
2. 月額課金ユーザ数を増やす。
3. 月額課金売上を増やす。

これらを改善できるような、施策を打っていきましょう！

# 参考文献

- [VCが重視する、スタートアップの売上の見せ方 \| 500 Startups Japan](http://500startups.jp/how-to-talk-about-revenue/)
- [スタートアップのお金と指標入門講座：収益 \(Revenue & MRR\) – Medium](https://medium.com/@tumada/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E3%81%8A%E9%87%91%E3%81%A8%E6%8C%87%E6%A8%99%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E5%8F%8E%E7%9B%8A-revenue-2e0b48d3c531#.yhmbb91cr)
- [スタートアップのお金と指標入門講座：チャーンレート \(Churn Rate\) – Medium](https://medium.com/@tumada/%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%81%AE%E3%81%8A%E9%87%91%E3%81%A8%E6%8C%87%E6%A8%99%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E3%83%81%E3%83%A3%E3%83%BC%E3%83%B3%E3%83%AC%E3%83%BC%E3%83%88-churn-rate-d97d2f7b24bc#.um7kiqouw)
- [SaaS Metrics 2\.0 \- Detailed Definitions \| For Entrepreneurs](http://www.forentrepreneurs.com/saas-metrics-2-definitions-2/)
【Swift】storyboardを利用しない必要最低限のテンプレート

# 概要
* storyboardを利用しない必要最低限のテンプレート（Swift）

# 目的
仕事でStoryboardを利用しないPJにJOINすることになったので、学んだことをまとめておきます。
Auto Layout設定（制約）は、PureLayoutという強力なライブラリを利用します。
PureLayoutのサンプルは次回以降Upします。

# 変更箇所
まずはXcodeでNew Project作成後に以下を実施
* Main.StoryBoard削除
* main.swift追加
* appDelegate.swift修正
* info.plist, assets, appDelegateを /Application配下に
* Build Setting(Use Legacy Swift Language Version: Yes）

# github
* https://github.com/menomoto/Sample_PureLayout
* xcode8, swift2.3

# PureLayout
https://github.com/PureLayout/PureLayout
Browserify & ReactでCSS in JS対応のHot Module Replacement

webpackの提供するHot Module Replacement(HMR)のBrowserifyでの対応についてです。

HMRの対応に[browserify-hmr](https://github.com/AgentME/browserify-hmr)、
CSS in JSのライブラリとして[Aphrodite](https://github.com/Khan/aphrodite)、
それとは別に、従来のCSSで記述する方法として[cssify]
(https://github.com/davidguttman/cssify)
をそれぞれ利用しています。

[サンプルプロジェクトのGitHubはこちらです](https://github.com/wordijp/browserify-hmr-with-cssinjs-sample)

# 操作画面

こちらはbrowserify-hmrによるJSとCSS編集画面です
![hmr-navidate.gif](https://qiita-image-store.s3.amazonaws.com/0/51728/2883aa87-5176-7ba3-ef31-cf3cd3952d91.gif)

# HMR対応について

.jsx内のHTMLタグは、browserify-hmrにより対応しています、内部で[react-transform-hmr](https://github.com/gaearon/react-transform-hmr)が動いており、それがHMRへの導線となっています、それと、操作画面には映ってないですが「Hello, world!」はjadeテンプレートで書いています、こちらもHMRの対象になっています。

CSSへの対応ですが、cssifyはCSSファイルをJSコードへと埋め込んでおり、それによりHMRの対象に出来ているようです、仕組みまで詳しく終えてませんが、JSコード化出来ている為にそれもHMR対象として拾ってくれてるのだと推測しています。

CSS in JS(Aphrodite)は最初からJSで完結してる為、仕組み的にはcssifyの時よりも分かりやすいかと思います(内部実装は難しいですが)。


# CSS Modulesは?

CSS Modulesライブラリは、CSSを別途bundle.cssファイルとして出力する為か、HMRの対象に出来なかった為この記事では扱っていません。


# Sass対応は?

sassifyやscssifyがあるのですが、それぞれ以下の理由で没となりました。

## sassify

HMRの対象にはなるんですが、styleの削除をしても以前の設定が残ったままとなる為、惜しいですが扱うのをやめにしました。
なお、利用の際は、cssifyと違いautoInjectがデフォルトでfalseの為、transformに渡す際にtrueを設定します。

    $ browserify -p browserify-hmr -t [sassify --auto-inject true]

## scssify

sassifyと同じくstyleの削除をしても以前の設定が残ったままとなります。

# postcss対応は?

*2016/12/29追記*

[browserify-postcss](https://www.npmjs.com/package/browserify-postcss)に[このパッチ(Gist)](https://gist.github.com/wordijp/840e5afcd7fe05083ea489bb9ab04882)を施せば対応できます。
パッチの内容はcssifyと同じで、cssに対応した一意な名前(cssへのフルパスのハッシュ値)を与え、hmrに対応しているcssifyに丸投げをしています。
PRを送っていないのは、postcss-import使用時の検証がまだ出来ていないためです。

```js:browserify-postcss/browser.js
module.exports = require('cssify')
```

```js:browserify-postcss/index.js
// パッチ
     processor.process(body, postCssOptions)
       .then(function (result) {
-        self.push(moduleify(result.css, opts.inject))
+        self.push(moduleify(result.opts.to, result.css, opts.inject))
         done()
       }, function (err) {

// 新規コード
function hash (str) {
  return '_' + stringHash(str).toString(36)
}

function moduleify(toName, css, inject) {
  var exp
  if (inject === 'base64') {
    exp = 'module.exports = require("' + path.basename(path.dirname(__dirname)) + '").byUrl("' + base64(css) + '")'
  } else if (inject) {
    // cssifyと同じ方法
    // NOTE : ブラウザ環境ではbrowser.jsがrequireされる(cssifyと同じロジックになる)
    exp = [
      "var inject = require('browserify-postcss');",
      "var css = '" + css.replace(/'/gm, "\\'").replace(/\n/gm, ' ') + "';",
      "inject(css, undefined, '" + hash(toName) + "');",
      "module.exports = css;",
    ].join('\n');
  } else {
    exp = 'module.exports = ' + JSON.stringify(css)
  }
  return exp
}
```

# 参考
[GitHub: revathskumar/browserify-hmr-example](https://github.com/revathskumar/browserify-hmr-example)
[Hot Module Replacementの設定と仕組みを理解する](http://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb)
[Reactと一緒に使う時のCSS in JSのライブラリ選定とか所感とか](http://qiita.com/inuscript/items/0cfdb1a0c1d172e27694#aphrodite)