OmniAICreator/Qiita-1.07M huggingface dataset:
WEBアプリをNode.jsで書いてHeroku上にあげた話 [ 2 ]

[WEBアプリをNode.jsで書いてHeroku上にあげた話 1](http://qiita.com/hyde2able/items/91d0347a5a50b7ea173d)の続きです。

* * *

## [FireCommits](https://fire-commits.herokuapp.com/)
![スクリーンショット 2015-11-22 0.19.14.png](https://qiita-image-store.s3.amazonaws.com/0/85665/ac950b42-0101-092d-6a2d-2fa5727dddbd.png)
githubの草を撃ってシェアするゲーム。コミット数多い凄腕エンジニアの草ほど強い。
https://fire-commits.herokuapp.com/

Facebookで公開したよーって投稿する前に[Google Analytics](http://www.google.com/intl/ja/analytics/premium/)にだけ登録しておきました。設定方法はたしか[へいっ！Googleアナリティクス導入時の初期設定を一緒にやってみないかい？](http://websae.net/google-analytics-setup-20140416/)を参考にしました。これの真似をしてけば</head>の前にトラッキングコードを貼り付けるだけなのですが、Google Analyticsのサイトに飛ぶとリアルタイムのサマリーは変化するのに、ユーザのサマリーは0でえっ...なんで反映されてないの？ってなったけど、ユーザのサマリーの方は1,2日後に反映されるそうなので、あまり気にせず設置を完了しました。んで、公開しました。

訪問者はめちゃくちゃ！ってほど多くはありませんでしたが、
![tracking.jpg](https://qiita-image-store.s3.amazonaws.com/0/85665/4398dbd0-61b8-3d37-5e20-f552abdbe002.jpeg)
北は北海道、南は沖縄の人がアクセスしてくれて嬉しかったです :blush: 

## 公開してから気づいたバグ？的な何か
### データストアのデータを変数に格納して使ってた
今回実装したmilkcocoaを用いたランキングの疑似実装は、データストアに保存してある30人のスコアデータを一旦内部変数として保存して、ゲーム終了時に今回のスコアと内部変数に保存しておいたスコアデータとを見比べて、ランキング圏内ならデータを更新する　という流れで実装してました。
これってローカルで自分一人で開発してる時は、何も問題がなかったんです。だけど、公開してみんなが同時にアクセスすると、誰かのスコアがランキング圏内に入ってデータを更新しても、他の人の内部変数は更新はされないので、競合みたいにみんなで一番低いスコアの人のデータを更新しまくっちゃう！みたいな感じになっちゃいました。
なので、ランキングのスコアデータは更新する一歩手前で取得して確認！更新！というふうに変更したら、内部でスコアを持つ時間が短くなったので、競合的なのは起きにくくなりました。

### データストアにpushする前にバリデーションしてなかったんご
公開した日の夜、サイトにアクセスしてみると...
![hoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/85665/f888cc41-4712-bbec-b150-1857eb296a62.jpeg)
ってアラートが表示されました。えっこんなjs書いたっけ。。。

milkcocoaのデータストアを開いて見てみると、

```
{"name":"<script>alert('hoge');";</script>","image":"https://avatars0.githubusercontent.com/u/11733664…","count":140,"score":9999999999999}
```

と入ってました笑。まさに致命的なミス！当初ランキングを表示する時、データストアから取得したデータをそのままhtmlにブッ込んでいたので、nameに入ったスクリプト文が実行→ほげ　
浅はか過ぎました。これが怖いスクリプト文でなくてよかったとしか言いようがない。milkcocoaの設定で簡単にバリデーションと、許可するOriginを設定できるので、設定しました。最初は設定していなかったので、どこかしらのエンジニアさんに優しいスクリプト文を入れて警告してくれてありがとうございました。以後気をつけます。

動いてるjsの変数を書き換えれるって知っただけでも今回の公開はかなりの収穫でした。
[ブレイクポイントの編集を使ったちょっと変わったデバッグテク](http://qiita.com/umezo@github/items/6e5648831c214ae2cf14)
[Firebugを使って実行中のJavascriptの変数を書き換える](http://codaholic.org/?p=1158)
セキュリティももっと気にしてコード書ける人間になりたいなぁ。以上、あげた感想でした。
Lisp in Small Pieces 1.7 Global Environment Kindle版の誤植


ソースコードを画像化するときに失敗した様子。definitial の赤線の部分が不要です。
env.globalを更新して、'nameを返せばOKです。書籍版は問題ありません。



![lispin.png](https://qiita-image-store.s3.amazonaws.com/0/327/819f8db8-0f01-33a8-f5e1-b07365b2aac7.png)

追記　
その下の行もおかしいです。

```scheme
(define-syntax definitial 
  (syntax-rules ()
    ((definitial name)
     (begin (set! env.global (cons (cons 'name 'void) env.global))
            'name ) )
    ((definitial name value)
     (begin (set! env.global (cons (cons 'name value) env.global))
            'name ) ) ) )
```
こうですね。
cocos2d-x の Label で行間幅やフォントサイズを設定する

##困ってたこと
- cocos2-xの Label で改行してみた
- 行間幅が広すぎて、想定範囲に収まらなかった
- 見た目も悪かった

##設定できた

```
label->setLineHeight(幅の値);
```

v3.3で確認。
クラスリファレンスにも載ってますが、書いているサイトが見当たらなかったので備忘録です。
ちなみに行間幅は英語だと line spacingで検索出来る様です。
raspberry pi 2 setup (Ubuntu mate 15.10)


Raspberry Pi 2 Type B を購入。Ubuntu Mate 15.10 をインストール、セットアップした件

OSをSDカードにコピーするのはWindowsで実行。

# 起動まで

## IMG のダウンロード

https://ubuntu-mate.org/raspberry-pi/
から、imgをダウンロード

## IMG 解凍
ダウンロードしたファイルは、.img.bzなので、これを解凍。
解凍には7-zipを利用

## IMG のコピー
コピーは Win32 Disk Imager を利用。
これで、SDカードの準備はほぼ完了。


# ファイルシステムのリサイズ
上で準備したSDカードを利用して、RaspberyPiを起動。けど、このままだとファイルシステムのサイズが小さいので、リサイズの必要がある。

```
sudo fdisk /dev/mmcblk0
```
コマンドを実行して、
d,2の順番に実行で、パーティションを削除。
次に、n,p,2,Enter,Enter の順に実行して、パーティションの拡張。
最後にwを実行して保存する。

システムを再起動後に、

```
sudo resize2fs /dev/mmcblk0p2
```
を実行することで、サイズが拡張された。

```
hoge@raspi2:~$ df -m
Filesystem     1M-blocks  Used Available Use% Mounted on
/dev/root          14562  3309     11238  23% /
devtmpfs             459     0       459   0% /dev
tmpfs                463     0       463   0% /dev/shm
tmpfs                463     7       457   2% /run
tmpfs                  5     1         5   1% /run/lock
tmpfs                463     0       463   0% /sys/fs/cgroup
/dev/mmcblk0p1        64    20        45  31% /boot
tmpfs                 93     1        93   1% /run/user/118
tmpfs                 93     0        93   0% /run/user/1000
```
t2.microにdeploy中にプロセスが落ちてDeploy出来ない時にやるべき事

# Raisプロジェクトをt2.microにDeploy中にプロセスが落ちてDeploy出来ない！
何やらCSSとかJSのコンパイル中、image_optim実行中とかに落ちちゃう！
でも、調子がいいとDeploy出来る時もある（特にインスタンス起動直後とか）

そんな時にやった解決方法をメモしておきます。

# 落ちちゃう原因
原因は、コンパイル中にメモリ不足に陥ってプロセスが殺されてるから。

t2系インスタンスは、メモリのSwap領域が0に設定されてるんですね。しかもt2.microはDefaultのメモリが1GBしか無いので、すぐにメモリが枯渇して殺されてしまいます。

Sassのコンパイルはけっこうなメモリを食うようで、そこで落ちてしまったようです。
他にも、image_optimの実行中とか、JSのコンパイルとか、Deploy中に何かしらメモリを食う処理をすると落ちることがあるかも知れません。

# 解決方法：t2.microでSwapを使えるように設定する

t2.microでswapを使えるようにすれば、落ちずにきちんとDeploy出来るようになります。
Swapの設定は以下Qiita記事が参考になりました。
http://qiita.com/na0AaooQ/items/278a11ed905995bd16af

> 
```
# dd if=/dev/zero of=/swapfile1 bs=1M count=512
# chmod 600 /swapfile1
# mkswap /swapfile1
# swapon /swapfile1


開発環境とかお金かけたくないサーバーはこれで乗り切っちゃいましょう。
C++のムーブコンストラクタとアサインメントがいつ呼ばれるかを試すコード


```
#include <iostream>

using namespace std;
class Tester{
public:
    Tester(){
        cout << "constructed" <<endl;
    }
    
    ~Tester(){
        cout << "destructed" <<endl;
    }
    
    Tester(const Tester &a){
        cout << "copied" << endl;
    }
    
    Tester(const Tester &&a){
        cout << "move constucted" << endl;
    }
    
    Tester &operator=(const Tester &a){
        cout << "copy assigned" << endl;
        return *this;
    }
    
    Tester &operator=(const Tester &&a){
        cout << "move assigned" << endl;
        return *this;
    }
    
};

Tester returnTesterWithMove(){
    cout << "in func" << endl;
    Tester test; // local object in this function
    return std::move(test);
}

Tester returnTester(){
    cout << "in func" << endl;
    Tester test; // local object in this function
    return test;
}

int main(int argc, const char * argv[]) {
    Tester test1; // construct
    Tester test2 (test1); // copy
    test1 = test2; // copy assignment
    Tester test3 = std::move(test1); // move constructed
    test2 = std::move(test1); // move assigned because of std::move

    // with function.
    
    Tester test4 = returnTester(); // ????????????
    Tester test5 ;
    test5 = returnTester(); // implicit move assignment because of r value reference
    
    Tester test6 = returnTesterWithMove();
    Tester test7 ;
    test7 = returnTesterWithMove(); // implicit move assignment because of r value reference

    
    return 0;
}
```
Graphvizで図を描く

<http://www.graphviz.org/Home.php>

DOT言語でグラフを記述して、レンダリングできる。
グラフでなくても、ちょっとした図を描くときに便利。

```dot
digraph G {
	a -> b -> c;
	b -> d;
}
```

##コマンド
###インストール
macだったのでHomeBrewでインストールできた。

```sh
brew install graphviz
```

###画像に変換
gccでC言語のソースをコンパイルするような感じ

```sh
#hoge.dotをhoge.pngに変換して開く
dot -Tpng hoge.dot -o hoge.png && open hoge.png 
```

##DOT言語
<http://www.graphviz.org/doc/info/attrs.html#k:style>

とりあえず簡単な使い方だけメモ。`;`や`,`をどこに入れるべきなのかよくわかってないが、適当に書いても案外コンパイルできる。

###*例：オートマトン*
<http://www.graphviz.org/doc/info/shapes.html>

こういうのはレイアウトを気にせず簡単に書ける。むき出しで書いても良いが、引用符で囲んどいたほうが安全。

![20151010160030.jpg](https://qiita-image-store.s3.amazonaws.com/0/102093/b714065a-706b-c85e-8373-7e97687a2fa7.jpeg "20151010160030.jpg")

```dot
digraph G {
	rankdir=LR;
	empty [label = "" shape = plaintext];
	node [shape = doublecircle]; e1 e2;
	node [shape = circle];
	empty -> s0 [label = "開始"];
	s0 -> s1 [label = "1/a"];
	s0 -> e1 [label = "0"];
	s1 -> s2 [label = "2/b"];
	s1 -> s3 [label = "3/c"];
	s3 -> s2 [label = "2/d"];
	s3 -> e2 [label = "4"];
	s2 -> e1 [label = "0"];
	s2 -> s2 [label = "2"];
}
```

###*例：クラス図*
頑張ればUMLも記述できるが、さすがにしんどい。

![20151010160023.jpg](https://qiita-image-store.s3.amazonaws.com/0/102093/2df2bee6-f90c-a605-af0a-83d82a1d1805.jpeg "20151010160023.jpg")

```dot
digraph G {
	label = "図１：クラス図"
	fontsize = 12

	node [fontname = "Bitstream Vera Sans", fontsize = 8, shape = "record"]
	edge [fontname = "Bitstream Vera Sans", fontsize = 8]
	
	Animal [ label = "{\{abstract\} Animal|+ name : string\l+ age : int\l|\l}"]

	subgraph cluster_Animal {
		label = "Package animal.impl"
		
		Dog [label = "{Dog||+ bark() : void\l}"]
		Cat [label = "{Cat||+ meow() : void\l}"]
	}
	
	edge [arrowhead = "empty"]
	Dog -> Animal
	Cat -> Animal

	edge [arrowhead = "none", headlabel = "0..*", taillabel = "0..*"]
	Dog -> Cat
}
```
###*例：２部グラフ*

はじめに(サブ)グラフとノードの設定をする。
ノードのshapeをpointにするとラベル名が表示されないので、
サブグラフのshapeをplaintextにしてラベルを付け包んで点を表現してみた。
もっと簡単な書き方があるかも知れない。

![20151010160026.jpg](https://qiita-image-store.s3.amazonaws.com/0/102093/2a703a77-6c70-da7d-ae03-16db1ee1c4a7.jpeg "20151010160026.jpg")

```dot
digraph G {
	graph [style=rounded color=black shape=plaintext rankdir=LR];
	node [shape=point];
	
	subgraph cluster_source {
		subgraph cluster_p1 {
			label="p1" color=white shape=plaintext;
			p1
		}
		subgraph cluster_p2 {
			label="p2" color=white shape=plaintext;
			p2
		}
		subgraph cluster_p3 {
			label="p3" color=white shape=plaintext;
			p3
		}
	}
	
	subgraph cluster_sink {
		subgraph cluster_a {
			label="a" color=white shape=plaintext;
			a
		}
		subgraph cluster_b {
			label="b" color=white shape=plaintext;
			b
		}
		subgraph cluster_c {
			label="c" color=white shape=plaintext;
			c
		}
	}
	
	p1 -> a p1 -> c
	p2 -> b
	p3 -> c p3 -> a
}
```
Homebrewでrbenvインストール

##インストール

いれてたと思ってたら入ってなかったのでbrew install。

```sh
brew update
brew install rbenv ruby-build
```

バージョン確認しようとしたら`.rbenv`がないとか言われる

```sh
➜  ~  rbenv -v
/Users/hogehoge/homebrew/Cellar/rbenv/0.4.0/libexec/rbenv---version: line 17: cd: /Users/hogehoge/.rbenv: No such file or directory
```

`$RBENV_ROOT`を設定すれば良いみたい。
自分の場合だと⇩こんな感じ

```sh
export RBENV_ROOT=$BREW_ROOT/rbenv/
```

##環境確認

```sh
➜  ~  rbenv -v
rbenv 0.4.0
➜  ~  rbenv install -l #インストール可能なバージョン一覧
➜  ~  rbenv install 2.2.3 #インストール
➜  ~  rbenv local 2.2.3 #カレントディレクトリで利用したいバージョンを指定
➜  ~  rbenv versions #インストールしているバージョン一覧
  system
* 2.2.3 (set by /Users/hogehoge/.ruby-version)
➜  ~  rbenv rehash
➜  ~  gem env
```
マウスカーソルが表示されない

Mac版のopenFrameworks 0.8.4ではGLFWのバグでマウスカーソルが表示されないことがある。（最新の0.9.0ではこのバグは取り除かれている）

とりあえず以下のようにすれば回避できる。

```cpp

void ofApp::setup(){
    ofHideCursor();
}
void ofApp::mouseMoved(int x, int y ){
    ofShowCursor();
}

```

参考
[Mouse cursor invisible in osx - beginners - openFrameworks](http://forum.openframeworks.cc/t/mouse-cursor-invisible-in-osx/17929)
DynamoDBのQueryおよびScanの消費読み込みキャパシティについて

DynamoDBのGetやPutなどの通常操作であれば1レコード1ユニット単位での計算となるが、
QueryやScanの場合はどうなってたっけ？という疑問が湧いてきたので調べてみた。


## 前提：ユニットという単位について

DynamoDBでは ``ユニット`` という単位でスループットを計算する。
[ドキュメント](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html)によると以下のような仕様になる。

キャパシティーユニットの用途 | 計算方法
--- | ---
読み込み	| 1 秒あたりの項目読み込み数 × 4 KB の項目サイズ（結果整合性のある読み込みを使用する場合は、1 秒あたりの読み込み数が倍になります）
書き込み	| 1 秒あたりの項目書き込み数 × 1 KB の項目サイズ

例えば

- 1レコードが 3.5KB であれば 読み込みユニット数は 1レコード＝1ユニット
- 1レコードが 3.5KB であれば 書き込みユニット数は 1レコード＝4ユニット

という計算になる。
上記の例であれば、秒間100読み込みを保証したいのであれば100キャパシティを、
秒間100書き込みを保証したいのであれば400キャパシティを予約しておけば良い。

<br>

## Query および Scan の消費読み込みキャパシティについて

結論から言うと、通常のGetと計算方法が **異なる** 。
例えば以下のレコードを抽出しようとした時には以下の計算方法になる。

### シナリオ

項目 | 値
---|---
秒間あたりの取得レコード数 | 100
１レコード辺りのサイズ | 512byte

### 操作毎の計算方法

操作 | 必要とする秒間あたりのスループット
---|---
Get or BatchGetItem | 1ユニット x 100 = **100キャパシティ**
Query or Scan | (512 x 100) / 4KB = **12.5キャパシティ**

通常の操作では 「レコードベースの計算」に、 
QueryおよびScanでは「サイズベースの計算」となる。

## Ref

- [AWS Document: Amazon DynamoDB のプロビジョニングされたスループット](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html)
cakePHPで変数の中身をリアルタイムで出力する（初心者向け）



##エラーログを参照するタイミング
普段はViewに変数の中身を出力していたが、Viewを使わない関数（アクション）を実行するとViewがないため変数の中身をブラウザに出力して確認出来ない。
変数の中身をリアルタイムで監視したい。
そんな時はエラーログを上手く使うと問題点の発見がスムーズにいきます。



##cakePHPでerror.logの場所
htdocs/アプリ名/app/tmp/logs/error.log


##error.logを開いてみる
①ターミナルを起動します。
普段からターミナルを使用していない人には少し抵抗があるかもしれませんが、
慣れると便利です。

![スクリーンショット 2015-11-21 23.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/88163/ed7f9ba0-20e0-4939-ba6e-27791284515c.png "スクリーンショット 2015-11-21 23.06.15.png")


②ターミナルでerror.logの場所までいこう
僕の環境はMACでMAMPを使ってPHPを動かしているのでerror.logまでのパスは
Application/MAMPhtdocs/アプリ名/app/tmp/logs/です。
このlogsフォルダの中に入っているerror.logを実行します。

![スクリーンショット 2015-11-21 23.06.48.png](https://qiita-image-store.s3.amazonaws.com/0/88163/23ca9b06-e54f-9eab-0acb-3d5392f13f75.png "スクリーンショット 2015-11-21 23.06.48.png")


③ターミナルでerror.logを開く
今回、error.logを開くには「tail -f」というコマンドを使います。
tailコマンドについてはこちらを御覧ください。
http://www.webhtm.net/unix/cmd/tail_cmd.htm


```
tail -f error.log
```

![スクリーンショット 2015-11-21 23.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/88163/a1669f5a-4f6d-9540-a622-753e7c881ace.png "スクリーンショット 2015-11-21 23.07.26.png")


tailコマンド終了するにはcontrol＋Cを押します。


##cakePHP側の設定をする
設定をすると言ってもlog()関数にログファイルに吐き出したい変数を引数としていれて実行をするだけ。

```
$this->log(変数名);
```
例えば、

```php:TestsController.php
class TestsController extends AppController {

  //省略 


  function test(){
    
    $this->autoRender = false;

    $info = $this->Food->find('all');

    $this->log($info);

  }

}
```



##エラーログを吐き出してみる
TestsControllerのtestアクションを実行するとfoodsテーブルから登録されている情報が全て取得されます。
そしてそれが$infoに格納されるのですが、その時に格納された情報がターミナルにリアルタイムに表示されます。
ターミナルの画面にfoodsテーブルの情報が追加されました。

![スクリーンショット 2015-11-21 23.08.56.png](https://qiita-image-store.s3.amazonaws.com/0/88163/082676e4-607b-a635-693f-aac765a0f9ce.png "スクリーンショット 2015-11-21 23.08.56.png")

ターミナルの操作なんかは使っているうちにどんどん慣れてくると思いますので、まずは一度使ってみてください。
そのうちターミナル無しじゃ開発できなくなってしまう日が来ることでしょう笑
AutoLayoutをDSL風に記述できるSnapKit


レイアウトをInterfaceBuilderを使わずにコードで生成する場合に何とも可読性の低いコードになってしまいます。
そこでAutoLayoutをDSL風に記述できてしまう[SnapKit](https://github.com/SnapKit/SnapKit)を使ってみたよ、という記録。

##SnapKitインストール
まず適当にプロジェクトを作ってCocoaPodからSnapkitをインストールします。
以下のようなPodfileを用意します。

```Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

pod 'SnapKit', '~> 0.15.0'
```

そしてpod installします。

##使ってみよう

まず先頭で「import SnapKit」しておきます。
あとはこんな感じ。

```
let label1 = UILabel()
label1.font = UIFont.systemFontOfSize(32)
label1.numberOfLines = 4
label1.text = "古池や"
label1.textColor = UIColor.blackColor()
label1.sizeToFit()

self.view.addSubview(label1)
label1.snp_makeConstraints { (make) -> Void in
    make.leading.equalTo(view).offset(240)
    make.top.equalTo(view).offset(8)
    make.width.equalTo(45)
    make.height.equalTo(200)
}

let label2 = UILabel()
label2.font = UIFont.systemFontOfSize(32)
label2.numberOfLines = 4
label2.text = "蛙飛込む"
label2.textColor = UIColor.blackColor()

view.addSubview(label2)
label2.snp_makeConstraints { (make) -> Void in
    make.leading.equalTo(view).offset(180)
    make.top.equalTo(view).offset(48)
    make.width.equalTo(45)
    make.height.equalTo(200)
}

let label3 = UILabel()
label3.font = UIFont.systemFontOfSize(32)
label3.numberOfLines = 4
label3.text = "池の音"
label3.textColor = UIColor.blackColor()

view.addSubview(label3)
label3.snp_makeConstraints { (make) -> Void in
    make.leading.equalTo(view).offset(120)
    make.top.equalTo(view).offset(88)
    make.width.equalTo(45)
    make.height.equalTo(200)
}
```

これを動かすとこうなります。
![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/5976b063-967a-aad9-5a88-6f4fc6c68a7e.png "screen1.png")


NSLayoutConstraintを直接使う場合に比べるとかなり見やすいんじゃないでしょうか。
OSXで既存プロセスの標準出力をキャプチャする

```bash:~/.bashrc,&#32;~/.zshrc&#32;などに記述
capture() {
    sudo dtrace -p "$1" -qn '
        syscall::write*:entry
        /pid == $target && arg0 == 1/ {
            printf("%s", copyinstr(arg1, arg2));
        }
    '
}
capture-all() {
    sudo dtrace -p "$1" -qn '
        syscall::write*:entry
        /pid == $target && (arg0 == 1 || arg0 == 2)/ {
            printf("%s", copyinstr(arg1, arg2));
        }
    '
}
```

```shell-session:使用例
example@localhost:~$ php -r 'while (true) { echo "Hello\n"; sleep(1); }' >/dev/null &
[1] 97755
example@localhost:~$ capture 97755
Hello
Hello
Hello
Hello
...
```

#### 追記

El Capitan 以降の場合はリカバリモードで `csrutil enable --without dtrace` の設定が必要です。

#### 参考

- [GitHub wiki mivok/squirrelpouch - dtrace](https://github.com/mivok/squirrelpouch/wiki/dtrace)
- [Qiita - SIPをもっと深く知ってみよう！　〜SIPは一体何を保護しているのか〜](http://qiita.com/whitefox_105/items/0b70f7a504dcb72788e6)
MacでNode.jsのバージョン管理

# Node.jsのバージョン管理

当たり前の人にとっては当たり前の内容です。
ほとんど自身の備考録みたいなものとして残します。

そもそもなぜバージョン管理が必要か？

* Nodeのバージョンアップデートが激しい
    * 早く新しい機能を使いたいのと，安定した機能を使い続けたい，が半々
* 仕事とプライベートで使い分けたい
    * SWのシステム要件でサポートされるバージョンが違ったりする
* チーム開発時と，個人で使い分けなければならない(2番目と似たようなもん)

# 使用するツール
* 環境: Mac OS X 10.10.5
* homebrew
* nodebrew

## homebrew
Macで使用する様々なツールのパッケージ管理ツール

例えば，

* Cordova
* Docker
* Git
* etc.

インストールコマンド: `brew i Docker`
インストールされるディレクトリ: `/usr/local/Cellar`


## nodebrew
Macで使用するNode.js/io.jsのバージョン管理ツール

必要な複数のバージョンのNodeをインストールしておき，使いたい時に，任意のバージョンを指定すれば良い

# Macで使えるようにする

* homebrewのインストール
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

* nodebrewのインストール
`brew install nodebrew`
==> /use/local/Celler/にnodebrewディレクトリが生成される

* nodebrewのセットアップ
`nodebrew setup`
==> $HOMEに.nodebrewが生成される

* nodebrewのパスを通す
`export PATH=$HOME/.nodebrew/current/bin:$PATH`
==> $HOME/.bashrc(もしくは.bash_profile)に上記を追記

* 設定を有効化
`source .bashrc(.bash_profile)`

* 使いたいNode.js/io.jsを指定してインストール
`nodebrew install-binary v.4.2.2`
==> nodebrew ls-remoteで，リポジトリにあるバージョンを確認し，任意のバージョンを指定すれば良い

* 使用するバージョンを指定
`nodebrew use v4.2.2`

# まとめ
今回は，MacでNode.jsのバージョン管理のためのツール導入方法を書き残した。

homebrew > nodebrew > Node.js

このようにした理由は，以下の3つ

* あらゆるパッケージ管理をすでにhomebrewで行っており統一したい
* Node.jsに関しては複数バージョンを併用したい
* homebrewのリポジトリはNode.jsの欲しいバージョンがない(追加されるのが遅い)
#で始まるコメントを取り除く正規表現

goで設定ファイルのパーサを書いていた時に、
いわゆる行内の#から始まるコメントを除外したい時の正規表現が見つからなかったため、自作しました。

以下のパターンのコメントをサポートします。

```
A. 行頭コメント
# comment
key = value

B. 後置コメント
key = value   # comment

C. ダブルクォート内に#が存在する場合の後置コメント
key = "#value"  # comment
```

AとBのように、\#以降を単純に取り除く場合は、以下の正規表現にマッチする部分を削除するだけで問題無いと思います。

```
#.*$
```

今回は、Cに適用すると、残したい部分も含めて削除してしまうので、下記の様に書いてみました。
(ついでにシングルクォートも対応しました)

```
^((?:[^#'"]|"[^"]*"|'[^']*')*)(#.*)?$
```

この正規表現を用いて、置換を行い、$1だけ残します。
goで書くとこんな感じです。

```go
package main

import (
  "fmt"
  "regexp"
)

func main() {
  commentRegex := regexp.MustCompile(`^((?:[^#'"]|"[^"]*"|'[^']*')*)(#.*)?`)
  result := commentRegex.ReplaceAllString(`key = "#value" # comment`, "$1")
  fmt.Println(result)
  // Output: key = "#value"
}
```

注意点としては、見ての通り一行ずつ置換する必要があります。
2015/11現在のCocos2d-X(とCocosStudio)インストール方法最新版

2015年現在は名称が、CocosStudio 含む環境が Cocos と変わっていたので、まっさらな環境を作る手順をメモします。


### 前提条件
* Xcode最新版インストール済み（今回はv7.1）
* Android SDK/NDK をインストール済み(今回はAndroidStudio経由で入れましたが、どういう手順でもOKです）


### ダウンロード

http://www.cocos2d-x.org/download にアクセス

![Download Cocos2d-x Cocos2d-html5 Cocos Studio | Cocos2d-x 2015-11-11 16-21-28.png](https://qiita-image-store.s3.amazonaws.com/0/34573/7f175bac-5c08-a704-3d38-43aeb0aa07b3.png)



「FOR MAC WITH FRAMEWORK v2.3.2」をダウンロード(winの方は、FOR WIN..のほう）

本体のCocos2d-xのバージョンと、Cocosのバージョンの間は関係がないみたい。


### インストール

ダウンロードした.dmgを起動して、 Install Cocos を実行

![Cocos 2015-11-11 16-23-34.png](https://qiita-image-store.s3.amazonaws.com/0/34573/c31adfbb-f43d-4647-b4b4-54525933936a.png)

ウィザードにそって進めてください。


### 起動＆HelloWorld

![LPSpringboard 2015-11-11 16-26-37.png](https://qiita-image-store.s3.amazonaws.com/0/34573/c9274efa-ad1b-72ed-f444-659fffd38186.png)

Launchpad(もしくはアプリケーションフォルダ)にインストールされているので、「Cocos」を起動しましょう。


起動するとこんな画面が表示されます。


![New Project 2015-11-11 16-30-34.png](https://qiita-image-store.s3.amazonaws.com/0/34573/b0e5efac-5ad3-3080-39b1-c8f676809805.png)

1.のNew Project を押して
2.の Cocos Project を選択してください


![New Project 2015-11-11 18-23-10.png](https://qiita-image-store.s3.amazonaws.com/0/34573/a7970ecc-c3e1-5e7a-de7f-429d9318c12a.png)

プロジェクトの詳細を入力します。
とりあえずそのままでも問題無いです。


そうすると Cocos Studio が起動します。

![CocosProject - Cocos Studio 2015-11-11 18-35-16.png](https://qiita-image-store.s3.amazonaws.com/0/34573/adc53941-1265-bfa5-8a0b-0443dba9b1d4.png)


上部メニューから、上下の矢印みたいなところをクリックします（画像参照）。
![CocosProject - Cocos Studio 2015-11-11 19-02-20.png](https://qiita-image-store.s3.amazonaws.com/0/34573/54ff3f02-4f5e-7c9c-ba9a-247b28c41863.png)
（同じことが、メニューバーから "Project" -> "Publish and Package..." でもできます）




![Publish and Package 2015-11-11 19-06-25.png](https://qiita-image-store.s3.amazonaws.com/0/34573/9a5757bf-07db-b262-fe77-d89b5ee29672.png)

"Publish to Xcode" にチェックを入れます。

![CocosProject - Cocos Studio 2015-11-11 19-07-23.png](https://qiita-image-store.s3.amazonaws.com/0/34573/85ef9256-fc88-6396-0f4d-4a6e866862c8.png)

アイコンが XCodeのアイコンに変わります。これをクリックするとXcodeが立ち上がります。
これで、いつものようにXcodeから iOS シミュレータで実行ができます。


![ iOS 9.1 (13B137) 2015-11-21 22-23-41.png](https://qiita-image-store.s3.amazonaws.com/0/34573/f7fb96d9-97cb-dcaa-61c9-d9bd708d29aa.png)

新しいインストール方法では、環境構築が簡単になりましたね！
Windowsローカルで起動するゲームを作るときにJRE同梱した

# JREis何
Java実行環境

# なぜJRE同梱？
ゲームと一緒にJREを配ることで検証コストを低下させたい

# そんなこと言って、JavaはWrite Onece Run Anywehereだからそんなの必要ないんじゃない？
そうじゃなかったから同梱する羽目になった
各自で落として使えって言ったら起動しない報告多数

# どうやった
JRE内のjava.exeを直接コマンドラインから蹴るbatファイル書いてそれをexeでラップする形式
java.exeだけ単体で落ちてないので、JDKを解凍して少し処理してそれをファイル内に同梱

# 具体的な手順
ここみた
http://moruho.cocolog-nifty.com/blog/2014/02/windowsjdkexein.html

# サイズどれくらい？
160MBくらい。
必要な容量だと割り切った。
DockerのFluentd logging driverを使ってみた。

Dockerコンテナのログをfluentdで扱う時に、今まで/var/lib/docker/container以下をみていたのですが、なんか嫌だなーと思っていたら。Dockerにfluentd用のLoggind Driverが追加されたので使ってみました。
Docker v1.8から使えるみたいですね。とりあえずアップデートします。

```
sudo apt-get update
sudo apt-get install lxc-docker
```

ちなみに公式ドキュメントはこちら
http://www.fluentd.org/guides/recipes/docker-logging

あんまりfluentd側の書き方は慣れてないのですが。td-agent.confを編集します。log-collector.hoge.comは仮のログ集約サーバのホストです。

```xml
<source>
    type forward
    port 24224
    bind 0.0.0.0
</source>
<match docker.**>
    type forward
    <server>
      host logs.hoge.com
      port 24224
    </server>
</match>
```

Dockerコンテナ起動時に--log-driverオプションを加えます。

```sh
docker run --log-driver=fluentd {イメージ名}
```

これで、logs.hoge.com（集約サーバ）にコンテナのログが送られます。

こんな感じ

```
{"log":"log content","container_id":"f7d520f14333a16144748a44c0d0aa2c442b73d6d97a8335ed3b47b7852fa92d","container_name":"/test","source":"stdout"}
```


```docker logs```コマンドは使えなくなるみたいですね。

--log-driverでは他に、json-file、syslog、journald、gelfオプションがあるようです。

https://docs.docker.com/v1.8/reference/logging/overview/

### 参考

http://www.fluentd.org/guides/recipes/docker-logging
http://dev.classmethod.jp/cloud/docker-fluentd-logging-driver/
サンプルスクリプトが動かないときの対処例(OpenCV-Python) 

例題のスクリプトが動かないなと思ったときの対処

Python2.7からimport cv2としている状況においての自分の経験を話します。

###**１．入力画像がない。**
　スクリプトだけを入手しても、そのスクリプトが前提としている入力画像がなければ動きようがありません。
　'box.png','box_in_scene.png'など、使われている文脈に関連している画像をOpenCVの配布物の中にないか探して見ます。


###**２．関数が見つからない**
スクリプトを実行中にcv2.drawMatchesを呼び出した時点でエラーを生じたとします。
```>>> help(cv2.drawMatches)```
でもエラーを生じます。
```>>> cv2.__version__```
とすると、3.0.0以前の値が表示されているはずです。
OpenCV3での配布物もOpenCV2での配布物も共通にcv2.pydですので
どちらのバージョンを使っているのかを確かめます。
drawMatches()はOpenCV2には含まれてなくOpenCV3の配布物に実装している関数です。

Pythonのライブラリの置き場所(例　C:\Python27\Lib\site-packages、各自の環境に合わせて読み替えてください)に、
利用したい版のOpenCVのPythonバインディング cv2.pydをコピーしておきます。

その後、pythonを再起動させて、同様のことをすると、cv2.drawMatchesが見つかります。
\>>> import cv2
\>>> cv2.\_\_version__
'3.0.0-beta'
\>>> help(cv2.drawMatches)
Help on built-in function drawMatches:

drawMatches(...)
    drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]) -> outImg


###３．**関数が見つからない(名前が違っていた)**
Pythonで利用するOpenCVの版をOpenCV3にあげたのにもかかわらず
OpenCV3について書かれたスクリプトが動作しないことがあります。

ORB特徴量を計算するための検出器です。
\>>> cv2.ORB()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ORB'
\>>> cv2.ORB_create()
<ORB 064E4490>
\>>> 
 ```cv2.__version__```が'3.0.0-beta'では、関数名がcv2.ORB()ではなく、 cv2.ORB_create()になっています。

なぜ、cv2.ORB_create()だってわかったかだって？
[Python Documentation Server]を起動させる
[Open Browser]のボタンを押すとPythonのライブラリがブラウザに表示される。
[C:\Python27\lib\site-packages]
にリンクをたどり[cv2]を選択する。
そこで"ORB"でページ内検索して見つけました。

OpenCV3で追加になった機能は、まだ大幅に仕様が変わる可能性が高いと思われます。
(この文章の記述は、すぐに陳腐化して役立たずになるはずです。)

###**4.期待している動作になっていない？**
cv2.drawMatches(...) で目的のマッチング結果を2枚の画像に対して示してくれるはず、
一枚の画像しか表示されておらず、対応関係を示しているとは言いがたい。何がおかしい？

cv2.drawMatches　で検索してみると、drawMatchesを自作公開してくれている方がいらっしゃいました。

[OpenCV - SIFTを使った特徴量算出及びマッチング](http://toaru-gi.hatenablog.com/entry/2014/10/27/040843)

それを使わせていただいて、
無事、2枚の画像の対応点を直線で結んであるグラフが表示されました。
（しかし、間違った対応付けの点が多数見受けられます。それは、特徴点の記述子とマッチングアルゴリズムによるものです。）

付記：
例題のスクリプトが動かないなと思った元のサイトでは、絶えず改訂が行われているはずです。
そのため、このページでは、そのような不具合に出会ったときに、初心者・中級者が自力で問題を少しでも解決に近づけることができる考え方を示したつもりです。
C++で使える　音響合成ライブラリ

C＋＋で使える音響合成ライブラリ

・ゲームのための再生特化とはこれに入らない、例えばFMができるモジュールが用意されていないものとかは除外

・Gamma　C＋＋テンプレートが大好きな感じ、一通り揃ってるぽい
http://mat.ucsb.edu/gamma/

・Nsound FFTからフィルターまで一通り揃ってるが。。
http://nsound.sourceforge.net

・SndObj 
http://sndobj.sourceforge.net

・CSL - CREATE Signal Library (CSL)
http://fastlabinc.com/CSL/
 
・Ugen++ スパコ？　開発終わってる
https://code.google.com/p/ugen/
raspberry pi > LCDドライバ > adarfuit.comなどのLCDでテスト済み

RPi2でLCDを使う場合、こういうドライバを使うと楽だろう。

https://github.com/dbrgn/RPLCD

以下のように書き込めるようだ。

```
>>> from RPLCD import CharLCD
>>> lcd = CharLCD()
>>> lcd.write_string(u'Raspberry Pi HD44780')
>>> lcd.cursor_pos = (2, 0)
>>> lcd.write_string(u'http://github.com/\n\rdbrgn/RPLCD')
```

adarfuit.comなどのLCDでテスト済み。

色々な情報を表示する上ではこういうLCDを使うのもありかもしれない。


対応しているLCDはこのあたりか (HD44780搭載のLCD)。
https://www.switch-science.com/catalog/2448/
1,533円。

adafruit側の情報 https://www.adafruit.com/products/181
Swift 2.0でのプッシュ通知の設定(registerUserNotificationSettings)

# はじめに

プッシュ通知の初期設定でUIUserNotificationSettingsの記述方法がSwift 2.0で変わっていたのでメモ。

# Swift 1.2以前

```swift
let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
```

この記述ではSwift 2.0以降では以下のようなエラーになります。

```
Binary operator '|' cannot be applied to two 'UIUserNotificationType' operands
```

# Swift 2.0以降

UIUserNotificationTypeがOptionSetTypeになり記述方法が以下のように変わりました。

```swift
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound,], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
```

ちなみに、OptionSetTypeは以下のように型の名前まで書くこともできますが、.以降のみ記述する方が一般的のようです。

```swift
let settings = UIUserNotificationSettings(forTypes: [UIUserNotificationType.Alert, UIUserNotificationType.Badge, UIUserNotificationType.Sound,], categories: nil)
```
新しくなった eslint --init を試す

ESLint `v1.10.0` がリリースされました。

このリリースでは、ESLint の初期設定の面倒臭さを軽減するために `eslint --init` コマンドが改善されています。
具体的には、人気の共有設定から選択してインストールし、`.eslintrc` と `package.json` を自動的に更新するようになりました。

See Also: [共有設定でらくらく ESLint](http://qiita.com/mysticatea/items/dc35ced6bd5e782f50cd)

さっそく試してみます。

----

```:shell
> npm install -g eslint-cli
```

その前に、簡単のために `eslint-cli` を入れておきます。
See Also: [ESLint をグローバルにインストールせずに使う](http://qiita.com/mysticatea/items/6bd56ff691d3a1577321)

----

```:shell
> npm install --save-dev eslint
...(略)...
> eslint -v
v1.10.1
> eslint --init
```

インストールした ESLint のバージョンを確認 (`v1.10.0`以上) して、`eslint --init` コマンドを使います。
すると、まずは

```:shell
? How would you like to configure ESLint? (Use arrow keys)
> Answer questions about your style
  Use a popular style guide
```

```txt
? どうやって ESLint を設定しますか? (矢印キーで選択してください)
> スタイルに関する質問に答える
  人気のスタイルガイドを使う
```

設定の作り方を聞かれるので、矢印キーで `Use a popular style guide` を選んで Enter!

```:shell
? How would you like to configure ESLint? Use a popular style guide
? Which style guide do you want to follow? (Use arrow keys)
> Google
  AirBnB
  Standard
```

```txt
? How would you like to configure ESLint? Use a popular style guide
? どのスタイル ガイドを使いますか? (矢印キーで選択してください)
> Google
  AirBnB
  Standard
```

現在 (2015/11/21) は3つから選択することができます。
[共有設定でらくらく ESLint](http://qiita.com/mysticatea/items/dc35ced6bd5e782f50cd) のほうに簡単な解説がありますので御覧ください。

十字キーで好みの設定を選んで Enter!

```:shell
? How would you like to configure ESLint? Use a popular style guide
? Which style guide do you want to follow? Google
? What format do you want your config file to be in? (Use arrow keys)
> JavaScript
  YAML
  JSON
```

```txt
? How would you like to configure ESLint? Use a popular style guide
? Which style guide do you want to follow? Google
? どのフォーマットで設定ファイルを出力しますか? (矢印キーで選択してください)
> JavaScript
  YAML
  JSON
```

十字キーで好みのフォーマットを選んで Enter!

----

以上です。
この後 少し待つと `.eslintrc` (拡張子付き) が作られ、必要な共有設定とプラグインがインストールされ、`package.json` が更新されます。

なお、ここで設定したスタイルは後で変更したり、一部だけ上書きしたりできます。
詳しくは [ESLint 最初の一歩](http://qiita.com/mysticatea/items/f523dab04a25f617c87d#%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B) を御覧ください。
python > fileIO > Logフォルダがなかったら作る > import os.path / if os.path.isdir("Log") == False: / os.mkdir("Log")

```txt:動作確認
CentOS 6.5
```

line monitorでログをとるため、フォルダを作成したい。

参考
http://www.gesource.jp/programming/python/code/0008.html

```test.py
import os.path

if os.path.isdir("Log") == False:
	os.mkdir("Log")
```

上記コードで作成できた。
Method d in android.util.Log not mocked.に対する3つの対処法

# AndroidのUnit Tests
AndroidでUnit Testsを書いていると、次のようなエラーが出ました。
`java.lang.RuntimeException: Method d in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details.`
原因は、Unit TestsなのにAndroidのクラスである`Log.d()`を使っている場所があることです。

Androidに関係する部分と関係しない部分を明確に分けて書くことは、コードの見通しを良くしたり、Unit Testsをしやすくしたりする効果がありますが、Logなどはどうしてもいろいろなところに入ってきてしまうと思います。
そういう時に、テストをするための3つの方法を紹介します。

# testOptionsを設定する
[エラーログのリンク](http://g.co/androidstudio/not-mocked)にある方法ですが、build.gradleに以下を追加します。

```groovy:build.gradle
android {
    // ...
    testOptions {
        unitTests.returnDefaultValues = true
    }
}
```

これを設定すると、Unit Testsで全てのAndroidクラスが何もしないようになります。
しかし、気付かぬうちにAndroidのクラスを使っていると、テストの振る舞いが想定しているものと違うことになってしまい、はまってしまうことがあると思います。

# Robolectricを使う
[Robolectric](http://robolectric.org/)はAndroidのクラスをエミュレートすることで、エミュレータを起動せずにテストするものです。
build.gradleに以下を追加します。

```groovy:build.gradle
dependencies {
    // ...
    testCompile 'org.robolectric:robolectric:3.0'
}
```

テストクラスでは、以下のように書きます。

```java:HogeTest.java
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class HogeTest {
    // ...
}
```

これで、エラーは出なくなりますが、どうしても微妙に速度が遅くなるという問題はあります。

# PowerMockを使う
[PowerMock](https://github.com/jayway/powermock)は、static関数のMockを作ることができるライブラリです。
build.gradleに以下を追加します。

```groovy:build.gradle
dependencies {
    // ...
    testCompile 'org.powermock:powermock-module-junit4:1.6.3'
    testCompile 'org.powermock:powermock-api-mockito:1.6.3'
}
```

テストクラスでは、以下のように書きます。

```java:HogeTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest(Log.class)
public class HogeTest {
    @Test
    public void testHoge() {
        PowerMockito.mockStatic(Log.class);
        // ...
    }
}
```

これならば、LogクラスだけをMockすることができます。

# まとめ
いかがでしたでしょうか？
個人的にはPowerMockを使う方法が一番いいかなと思います。
ただ、公式で次のように言っているので、改善されることを気長に待つのがいいかもしれません。
>We are aware that the default behavior is problematic when using classes like Log or TextUtils and will evaluate possible solutions in future releases.
AFNetworking 2.6 で自己署名証明書（オレオレ証明書）SSLのhttps通信をする

2年前のこちらの記事の時代からは少し状況が変わっているようです。
http://qiita.com/sintario/items/44ce2161dfdd17001796

`AFHTTPRequestOperationManager`のプロパティ`securityPolicy`に`allowInvalidCertificates = YES`に加えて`securityPolicy.validatesDomainName = NO`の設定も必要なようです。

```objc
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.securityPolicy.allowInvalidCertificates = YES;
    manager.securityPolicy.validatesDomainName = NO;
```

ちなみに`[AFHTTPRequestOperationManager manager]`で取得したインスタンスでhttps通信できました。


ここの（公式？）Security Policyの情報だと
http://cocoadocs.org/docsets/AFNetworking/2.6.3/
```objc
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production
```
これだけで、できそうなのですが僕の環境ではこの設定だと通信エラーになりました。

こちらを参考にしました。
http://grandbig.github.io/blog/2015/10/02/afnetworking2-dot-6-0/
UIWebViewやWKWebViewでウェブページがロードされない


UIWebViewやWKWebViewで正しいコードを入れているはずなのに、全くページがロードされず画面が真っ白。何が問題か分からず数時間ハマってしまいました。
以前（iOS8）では同じコードで問題なく動いていたのに・・・

原因はiOS9から導入された[App Transport Security](http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/)でした。

上記のリンクのように、例外設定をしてあげるのが理想ですが、手っ取り早く動かしたいならinfo.plistの設定でApp Transport Securityをオフにしてあげるとひとまずウェブページがロードされるようになります。

```
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
```
line monitor > コア部分 (v0.5) > シリアル通信の遅さの対応

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

[動作検証](http://qiita.com/7of9/items/aa058dded74fdee2614c)を行ったところ、5行程度のテキストのCOM3からCOM5への通信に5秒程度かかっていた。

## pythonプログラムの修正
pythonのプログラムを見なおした。

[v0.5 @ github](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.5)

Serialのtimeoutを変更して対応した。

`con1=serial.Serial('/dev/ttyUSB1', 9600, timeout=0.1)`
から
`con1=serial.Serial('/dev/ttyUSB1', 9600, timeout=0.001)`
へ変更。　


## 動作確認

以下のようなテキストをCOM3からCOM5へ送信してみた。

```0sampleData.txt
//--------------------------
test, 115200bps
3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,
2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,
3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,
2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,
3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,
2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,
3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,3.1415926535897932384626,
2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,2.718281828,
```

このテキストで`22秒877ミリ秒`から`24秒124ミリ秒`の時刻変化(1.3秒)だった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/23672175-00d1-5aed-fd44-26eb41e80daf.png)
【GCM】Amazon SNS の「Create platform application」で登録できない件の回避策

## はじめに
アプリでのPUSH通知は自前のプログラムで送っています。
しかしAmazonSNSがいい感じなので使ってみようと思ったわけです。
とりあえずAndroidのGCMで。

ネットの先人達の記事を参考にやってみたところ、、「Create platform application」でエラーが出て思いっきり最初につまづきました。。

```
Invalid parameter: Attributes Reason: Platform credentials are invalid (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: ef9ae525-fb8e-5163-87e2-abefbbd1a1a0)
```

散々ネットで調べまくっても同じ問題を抱えている人が少ない！
と言うことはすごく基本的な問題じゃないかと思うけど、解決の糸口が全くわからない。。

解決のヒントはこの投稿。
2013年で古いけど問題の本質は同じであると思った。
[A valid GCM API key is not being accepted - SNS says it's invalid](https://proxy.piratenpartij.nl/forums.aws.amazon.com/thread.jspa?messageID=510166&#510166)

## 解決策

<img width="888" alt="スクリーンショット 2015-11-21 19.49.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/99694/817bcd32-c56d-c3d3-f421-79f68fa22f74.png">

サーバーAPIキーを作る時に、「リクエストを受け入れるサーバー IP アドレス」を**空欄にするだけ**でした・・・。
普通はセキュリティを意識するからIPアドレスを入れるわけですが、AWSの接続を受け付けるために解放しなければなりません。
CentOS7 で boot 時に シングルモード起動に切り替える

VirtulBox に CentOS7 を GUI Server としてインストールしたが、X-Windows の起動エラーが出た。

↓を参照して操作することで、シングルモードでのログインできた。

http://www.itzgeek.com/how-tos/linux/centos-how-tos/single-user-mode-in-centos-7-rhel-7.html
> Single User Mode in CentOS 7 / RHEL 7

> 1. boot 時に e キーを押す
> 2. 起動カーネルで rescure 用のものを選択する。
> 3. e キーを押す
> 4. 下から２行目中の ro を rw init=/sysroot/bin/sh に編集する。
> 5. ctrl-x で boot を開始する。

これから x-windows 起動でエラーになるかを調べる。
(環境: ThinkPad E450, Windows10, VirtualBox 5.0.10)
Packerを使用して自分仕様のboxを作成する


[自分仕様のboxファイルを作成する](http://qiita.com/darwin/items/c473b7c54e61b2acb7e5)で自分仕様のboxファイルを作成したけど、かなり省略しているので、vagrantで使用するには、実用上好ましくありませんでした。

そこで、調べたらPackerっていうのがあるんですね。
Packerを使ってマシンイメージを自動ビルド出来るようにしておけば、かなり楽になりますね。

ただ、このPackerは設定ファイルをJSONで書く必要があるんですが、相当面倒っぽい。そこで、更に調べたら、bentoの設定ファイルがgithubにありました。

[bentoのgithub](https://github.com/chef/bento)

早速ダウンロードしてJSONファイルを編集したりして、ビルドして出来ました。

私は、virtualboxのイメージが作成出来れば良かったので、以下のコマンド使ってビルドしました。


`/usr/local/bin/packer build -only=virtualbox-iso centos-7.1-x86_64.json`

上記のgithubから落としたファイルを探せばキックスタートインストールのファイルも入ってます。OSのJSONファイルですが、centos、debian、fedora、freebsd、macosx、rhel、sles、ubunts、solarisのJSONがありました。

2017/02/20　追加
MacのParallels Desktop 12 Proで以下を行うと、vagrantでParallelsのゲストOSが作成出来た。

`packer build -only=parallels-iso centos-7.3-x86_64.json`
line monitor > 動作検証 (151121) > 動いたけど処理が遅い

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

全部つなげた状態でのテスト。

## 接続形態

接続形態は以下とした。
[block diagram @ mindmup](https://atlas.mindmup.com/2015/11/081fb6b072650133ca0d378ca51caa79/linemonitor_blockdiagram_151121/index.html)

上記において「DSUB9 <-> USB」の記載はUSBシリアルケーブル。以下を利用した。

- VE488 (Wiretek) x 2本
- SRC06-USB (バッファロー) x 1本
- USB-RS232 (TFTEC JAPAN) x 1本

## 使用プログラム

- [python line monitor v0.4](https://github.com/yasokada/python-151113-lineMonitor/releases/tag/v0.4) on RPi2
- [unity line monitor UI v0.3](https://github.com/yasokada/unity-151117-linemonitor-UI/releases/tag/v0.3) on 304SH (android)

## 環境と設定

- RPi2 > IP: 192.168.10.7, command port=7000
- 304SH > IP: 192.168.10.3, monitor port=9000
- Win8.1 + TeraTerm (CRLF terminating) [COM3]
- Win8.1 + TeraTerm (CRLF teminating) [COM5]
- CentOS for setting through UDP port7000

CentOSから以下を実行して設定しておく。

```
$echo "set,mon,192.168.10.3,9000" | nc -w 1 -u 192.168.10.7 7000
$echo "set,combaud,115200" | nc -w 1 -u 192.168.10.7 7000
```

304SHにてlinemonitor UIを起動しておく。

Win8.1にてTeraTermを立ち上げる(COM3)。通信速度を115200baudにする。CRLF送信設定する。
もう１つTeraTermを立ち上げて同様の設定をしておく(COM5)。

(通信速度は9600, 19200, 115200で確認済。他の速度でもlinuxのドライバで処理しているので、問題ないと思われる)

## 動作確認

以下のファイルをCOM3側のTeraTermの「ファイル送信」機能で送信した。

```0sampleData.txt
//--------------------------
test, from 1, 115200
3.1415926535
2.718281828
6.022
1023
```

同様に、COM5側のTeraTermの「ファイル送信」機能で送信した。

結果、以下のように304SHにてモニターできた。
また、Win8.1上でもCOM3からCOM5への通信、COM5からCOM3への通信ができた。

しかしながら、１行ごとに１秒程度の遅れが出ている。COM3からCOM5へループバックした場合はこのような遅延は起きない。python側のプログラムの改善が必要だと分かった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6f88101f-714a-0ced-0e24-6e394dfbc519.png)
[Java] Iteratorと配列の処理時刻比較

#概要
Javaにおいて，Iteratorと配列に対して，それぞれシーケンシャルにアクセスした場合の処理時間を比較しました．
#コード
```lang:main.java
import java.util.Iterator;
import java.util.Arrays;
import java.util.ArrayList;


public class main {
	public static void main(String[] args) {
		long t1,t2,t3;
		int l = 100000000;
		long procTimeArray, procTimeIter;
		int counter1 = 0,counter2 = 0;
		Object temp;
		Integer [] array = new Integer [l];
		System.out.println("Array  / Iterator (ms)");
		System.out.println("----------------");
		
		for(int trial = 0; trial < 10; trial++){
			Iterator it = new ArrayList<Integer>(Arrays.asList(array)).iterator();
			t1 = System.currentTimeMillis();
			for ( int i = 0; i < l; i++ ){
				temp = array[i];
			}
			t2 = System.currentTimeMillis();
			while ( it.hasNext() ){
				temp = it.next();
			}
			t3 = System.currentTimeMillis();
			
			procTimeIter = (t3 - t2);
			procTimeArray = (t2 - t1);
			System.out.println(procTimeArray+" / "+procTimeIter);
			counter1 += procTimeArray;
			counter2 += procTimeIter;
		}
		System.out.println("----------------");
		System.out.println("Average:" + (int)counter1/10+" / "+(int)counter2/10);
	}

}

```
#結果
```
Array  / Iterator (ms)
----------------
7 / 19
27 / 18
0 / 16
0 / 14
0 / 14
0 / 14
0 / 14
0 / 14
0 / 19
0 / 14
----------------
Average:3 / 15
```
Groongaで学ぶ全文検索 2015-11-20



# 日本語の検索

## 全文検索おさらい
全文検索は下記のようにキーワードにマッチした文書を出力として返す仕組み
マッチした文書を探す際に単純に頭から検索していると時間がかかるためインデックスを作成して
インデックスから対象の文書を検索する。


``` 
入力（キーワードなど）→全文検索→出力(マッチした文書)
```

## インデックス
インデックスは下記のようにキーと値を持っていて、キーに入っているものだけが検索可能

| キー| 値 |
|:-----------|------------:|
| Groonga  |       [文書A,文書C]|
| Mroonga     |      [文書A,文書B]|


英語は空白で区切られているのでキーの決め方が簡単だが

日本語の場合下記の例のように区切りが曖昧なのでキーの決め方が難しい。
例)
「東京都」を検索したい場合に
東京都、東京どちらも使う可能性がある。

## 日本語検索には大きく分けて2種類のアプローチがある

###1.単語をキーにするアプローチ：形態素解析

* 意味のある単語に区切りキーに登録する
例)
花が咲いた
「花」
「が」
「咲いた」

* 日本語は区切りが曖昧なので難しい
例)
ここではきものをぬいでを区切る場合
ここで/はきものを/ぬいで
ここでは/きものを/ぬいで

* 検索の際に手数が少なくすむ
* 代表的なソフトウェアにMeCabがあり文書を解析する際に文書が長くなるとリソースが足りなくてエラーになる。
Groongaでは長くなり過ぎたら切ってMeCabに渡すオプションがある。

### 2.なんでもキーにするアプローチ：N-gram

* 意味を考えずに区切る
例)
花が咲いた
「花が」
「が咲」
「咲い」
「いた」

* 2文字で区切る2gram(バイグラム)、3文字で区切る3gram(トリグラムなどがある
* 検索するときにもキーワードを区切る
* キーワードを見つけてからandを取る必要があり、さらに隣り合っているかを見つける必要がある。
* 隣り合っているかを判断するためにインデックスの中に順序の情報を入れる
* キーワードが連続しているかどうかをチェックをする検索のフレーズ検索が必須。
例)
下記のA,Bの文書から「咲いた」を2gramで検索する場合
「咲い」「いた」でキーワード区切る
A.もB.もキーは存在するがB.は位置が隣り合っていないので目的の文書では無い。
文書A.花が咲いた
文書B.花が咲いていた、いた。

| キー | 文書と位置| 
|:-----------|------------:|
| 花が  |       A[1],B[1]|
| が咲     |      A[2],B[2] |
| 咲い     |      A[3],B[3] |
| いて     |      B[4] |
| いた     |      A[4],B[5,6] |

※実際にはサイズを抑えるために格納方法を工夫している
go1.5のインストール

go1.5のビルドにはgo1.4が必要になったそうで
セットアップ手順をまとめてみる。

# go1.4のビルド

```bash
$ cd
$ git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
$ cd $HOME/go1.4/src
$ ./make.bash
```

# go1.5のビルド

```bash
$ cd
$ wget https://storage.googleapis.com/golang/go1.5.1.src.tar.gz
$ tar xf go1.5.1.src.tar.gz
$ mv go go1.5
$ cd go1.5/src
$ ./make.bash

```

# 環境変数

```bash
$ echo "PATH=\$PATH:\$HOME/go1.5/bin" >> ~/.bashrc
$ echo "PATH=\$PATH:\$HOME/.go/bin" >> ~/.bashrc
$ echo "export GOPATH=$HOME/.go" >> ~/.bashrc
$ source ~/.bashrc
```

# godocのインストール

```bash
# yum install mercurial
$ go get golang.org/x/tools/cmd/godoc
$ godoc fmt
```


# 参考

Go 1.5 以降のビルド手順 - Qiita
http://qiita.com/orociic/items/b285cf205f75b7291a9d
調子に乗ってUSキーボードに慣れた俺がwindowsでもmacキーボードでus配列ライフを楽しむ

## モチベーション
MACBOOKのusキーボード版を使っていたら、usキーボードに慣れてしまった。。
※　spotlight最高だし。
command + spaceで入力モード変えるぜー！ってテンションだったけど、windowsを触らざるを得なくなった。　
・・・もう、作業がし辛くてしょうがないのです。
usキーボードを買ってきて、使いやすいようにしてwindowsで作業したろ！　が最初
もう今この瞬間も違和感満載でタイプしてる・・・。

## やりたいこと
+ Command + C、Vでコピー＆ペーストする
+ Command + スペースでIMEの切り替え

これだけでとりあえずいいや。

## 買ったもの
[これ](http://www.yamada-denkiweb.com/5084302019?adpcnt=4gs_3ceR&gclid=CLen-rOYockCFdgRvQodn1oBVg) usキーボードのusb版。

## 参考
[ここ①](http://www.sakyou.com/ManualShop/Windows/06_keyboard/03_101keyboard/17_Win7PRO/)と[ここ②](http://qiita.com/daichi87gi/items/fefb7f9bbb4f86ebb670)

## 作業
### ここ①の設定
これでusキーボードとして認識してくれる。

### ここ②の設定
keyswap.zipを落として解凍。
keyswap.exeを実行して、以下を変えた。
【左Ctrl】と【左Win】(DB)
【左Win】と【左Ctrl】(1D)
※　DBとか1Dってなんぞや。。。

謎はあるけど、再起動したら「Command + C、Vでコピー＆ペーストする」は実現できた。良し良し。

### IMEの変換設定
IMEのプロパティ→全般→編集操作で変更を押して、「IME オン/オフ」にCommand + spaceを割り当てればOK。

とりあえずこれで２つできるようになった。

+ Command + C、Vでコピー＆ペーストする
+ Command + スペースでIMEの切り替え

たぶんまだまだ作業し辛いことが多いと思うから、随時更新しよう。
CakePHP の活用パッケージ

忘れずにメモします！
## Aura for PHP
Composer は PHP の世界において、パッケージ管理ツールのデファクトスタンダードとなっています。[Aura](http://auraphp.com/framework/2.x/ja/) フレームワークにおいても同じです。
[githutでのAura](https://github.com/auraphp/installer-default.git)
## AWS SDK for PHP
PHP アプリケーションを Amazon S3、Amazon Glacier、Amazon DynamoDB などの AWS サービスと容易に統合できる最新のオープンソース PHP ライブラリです。
[Use Amazon Web Services in your PHP project](http://aws.amazon.com/sdk-for-php/)

## Phinx
PHP向けのマイグレーションツールです。
–　インストールや設定が簡単
–　フレームワーク依存ではない
–　軽い
–　ORM/SQL文の両方の記述に対応
–　MySQL/PostgreSQL/SQLite/SQL Serverに対応
[Database Migration plugin for CakePHP 3.0 based on Phinx](https://packagist.org/packages/cakephp/migrations)

##Guzzle
PHPのHTTPクライアントライブラリです。
[Guzzle is a PHP HTTP client library](http://guzzlephp.org/)

##Image processing
[Image processing for PHP 5.3](http://imagine.readthedocs.org/)

## password_compat
[password hashing algorithm](https://github.com/ircmaxell/password_compat)

## Mobile_Detect
[Mobile_Detect is a lightweight PHP class for detecting mobile devices](https://github.com/serbanghita/Mobile-Detect)

## Symfony mechanism
[Symfony mechanism for exploring and dumping PHP variables](https://symfony.com)

## Handle HHVM/PHP environments
[Provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths](https://github.com/sebastianbergmann/environment)

##Snapshotting
[Snapshotting of global state](http://www.github.com/sebastianbergmann/global-state)

##psysh
[A runtime developer console, interactive debugger and REPL for PHP.](http://psysh.org)

## Mock Object library
[Mock Object library for PHPUnit](https://github.com/sebastianbergmann/phpunit-mock-objects/)

## PHP code coverage information
[Library that provides collection, processing, and rendering functionality for PHP code coverage information](https://github.com/sebastianbergmann/php-code-coverage)

## PHP parser
[This is a PHP 5.2 to PHP 7.0 parser written in PHP. Its purpose is to simplify static code analysis and manipulation.](https://github.com/nikic/PHP-Parser)

## CakePHP Debug Kit
[DebugKit provides a debugging toolbar and enhanced debugging tools for CakePHP applications.](https://github.com/cakephp/debug_kit)
Elixir/Phoenix Framework ubuntu/trusy64 導入メモ

Phoenix Frameworkの開発環境をVagrant上に構築したときのメモです。

参考：http://www.phoenixframework.org/docs/installation

# Vagrantfile を作成

以下の内容でVagrantfileを作成しました。
Boxは`ubuntu/trusty64`を使いました。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.network "forwarded_port", guest: 4000, host: 4000
  config.vm.network "private_network", ip: "192.168.33.10"
end
```

Vagrantを起動してSSHに接続しましょう。

```console
$ vagrant up
$ vagrant ssh
```

# Elixirの導入

provisioningで設定するのが良いですが、とりあえず初めて構築するので手動で設定していきます。

http://elixir-lang.org/install.html#unix-and-unix-like を参考に構築しました。

```console
$ wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
$ sudo apt-get update
$ sudo apt-get install elixir
```

# PostgreSQLの導入

こちらを参考にしました。
http://qiita.com/ibara1454/items/40ce2d82926f48cf02bc

vagrantというRoleを作成し、パスワードもvagrantにしました。


```console
$ sudo apt-get install -y postgresql-9.3
$ sudo service postgresql start

$ sudo -i -u postgres
$ psql
postgres=# ALTER ROLE postgres LOGIN PASSWORD 'postgres';
```


# Hex package manager の導入

はじめに、HexというElixirのパッケージマネージャーを導入する必要があります。
Hexを使う事で、Phoenixのアプリケーションで利用する依存パッケージを管理することができます。

```console
$ mix local.hex
```

# Phoenix の導入

Phoenixのパッケージはmix archiveとして提供されています。mix archive自体はzipファイルで、beamファイルにコンパイルされたライブラリのコードが含まれています。

```console
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.0.3/phoenix_new-1.0.3.ez
```

# Node.jsの導入

PhoenixではJavaScriptやCSSなどのアセットコンパイルにbrunch.ioを使用しています。
そのため、Node.js 0.12.0以上の導入が必要です。

```console
$ sudo apt-get install nodejs npm nodejs-legacy
```

# inotify-tools の導入

Phoenixではライブコードリロードのために、Linuxではinotify-toolsが必要なようです。

```console
$ sudo apt-get install inotify-tools
```

# Phoenixプロジェクトを作成する

参考：http://www.phoenixframework.org/docs/up-and-running

```console
$ cd /vagrant
$ mix phoenix.new hello_phoenix
```

新規プロジェクトがサブディレクトリにできてしまったので、、、

```console
$ mv hello_phoenix/* ./
$ mv hello_phoenix/.gitignore ./
```

```console
$ mix ecto.create
$ mix phoenix.server
```

http://localhost:4000/ にアクセスして、Welcome to Phoenix! と表示されたら正常にサーバが起動しています。


# 完成版Vagrantfile

11/28 追記

プロビジョニングも自動で行うVagrantfileが完成したので、以下に掲載しておきます。

```rb:Vagrantfile
$script = <<SCRIPT
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get -y update
sudo apt-get -y install elixir nodejs npm nodejs-legacy inotify-tools postgresql-9.3

# postgresユーザにパスワードpostgresをつける
sudo -u postgres sh -c "echo \\"ALTER ROLE postgres LOGIN PASSWORD 'postgres';\\" | psql"

# install Hex
yes | mix local.hex
# install Phoenix
yes | mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v1.0.3/phoenix_new-1.0.3.ez
SCRIPT

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.network "forwarded_port", guest: 4000, host: 4000
  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provision 'shell', inline: $script
end
```