OmniAICreator/Qiita-1.07M huggingface dataset:
UIApplicationの変更通知一覧

UIApplicationの変更通知はObserverで受け取ることができます。
そこで受け取れる通知を下記にまとめました。

UIApplicationのNotifications（通知）一覧
-



|パラメータ|説明|
|---|---|
| UIApplicationDidEnterBackgroundNotification |アプリケーションがバックグラウンドに入る時に通知| 
|UIApplicationWillEnterForegroundNotification|アプリケーションがアクティブになる直前に通知| 
|UIApplicationDidFinishLaunchingNotification|アプリケーションが起動した直後に通知| 
|UIApplicationDidBecomeActiveNotification|アプリケーションがアクティブになった時に通知| 
|UIApplicationWillResignActiveNotification|アプリケーションがアクティブで無くなる直前に通知| 
|UIApplicationDidReceiveMemoryWarningNotification|メモリ使用量の警告の通知| 
|UIApplicationWillTerminateNotification|アプリケーションが終了される直前に通知| 
|UIApplicationSignificantTimeChangeNotification|日付の変更を通知| 
|UIApplicationWillChangeStatusBarOrientationNotification|デバイスの向きが変わる直前に通知| 
|UIApplicationDidChangeStatusBarOrientationNotification|デバイスの向きが変わった直後に通知| 
|UIApplicationWillChangeStatusBarFrameNotification|ステータスバーのサイズ変更される直前に通知| 
|UIApplicationDidChangeStatusBarFrameNotification|ステータスバーのサイズ変更された直後に通知| 
|UIApplicationBackgroundRefreshStatusDidChangeNotification|端末の[Appのバックグラウンド更新]がオフにされ、再度アプリがアクティブになった時に通知されます| 
|UIApplicationProtectedDataWillBecomeUnavailable|保護されたファイル(<font color="#ff0000">*1</font>)へコードからアクセス出来なくなる直前に通知| 
|UIApplicationProtectedDataDidBecomeAvailable|保護されたファイル(<font color="#ff0000">*1</font>)へコードからアクセスが可能になった時に通知| 

<font color="#ff0000">*1</font> 保護されたファイル(保護ファイル)については詳しくは「iOS App Programming Guid」の「Protecting Data Using On-Disk Encryption」の項目を参照

使用方法
-

オブザーバに変更通知を登録する

```objc:.m
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(hoge:)
                                                 name:UIApplicationDidBecomeActiveNotification
                                               object:nil];
```

変更通知を受け取る

```objc:.m
- (void)hoge:(NSNotification *)notification
{
    
}
```

通知を削除する場合

```objc:.m
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:UIApplicationDidBecomeActiveNotification
                                                  object:nil];
```

NSNotificationCenterに対する全ての通知を削除する場合

```objc:.m
    [[NSNotificationCenter defaultCenter] removeObserver:self];
```


参考元
-

下記のサイト、ブログを参考にしました。
[■[iPhoneプログラミング]UIApplicationのNotificationsの一覧](http://d.hatena.ne.jp/nakamura001/20111107/1320680842) - 強火で進め
[【iOS】続・アプリがバックグラウンド・フォアグラウンド状態になった時の実行処理](http://nvtrlab.jp/blog/mashi/xcode%EF%BC%9A%E3%80%90%E7%B6%9A%E3%80%91%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%83%BB%E3%83%95%E3%82%A9%E3%82%A2%E3%82%B0.html) - 日本VTR実験室
[■ [iPhone][develop] アプリ終了時に呼ばれるメソッドをAppDelegate以外にも登録する](https://iphone-dev.g.hatena.ne.jp/paella/20090802/1249223841) - Ni chicha, ni limona - 平均から抜けられない
MongoDB メモ

MongoDBの起動コマンド・エラー時のメモ
Homebrewでインストール。



```
$ mongod --version
db version v3.2.0
$ brew --version
Homebrew 0.9.5

```

## 起動コマンド
`mongod --config /usr/local/etc/mongod.conf`

▼シンボリックリンクの設定
・参考 [macにbrewでいれたmongodbが突然動かなくなった人のためのヒント](http://qiita.com/hidesuke/items/56a87d827708c8c770da)
 
```
$ sudo mkdir /data
$ sudo chmod 777 /data
$ ln -s /usr/local/var/mongodb /data/db
```
mongodのみで起動できるようになります。
これ便利でした。


## ログイン時の起動設定

自動起動を設定
`ln -fs /usr/local/opt/mongodb/homebrew.mxcl.mongodb.plist ~/Library/LaunchAgents/`

すぐに起動する場合
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist`



## エラー
[WARNING: soft rlimits too low] がでたとき
`/Library/LaunchDaemons/limit.maxfiles.plist`
`/Library/LaunchDaemons/limit.maxproc.plist`
を追加
[Improve ulimit doc (Mac OS X section)](https://github.com/basho/basho_docs/issues/1402)


### 参考
- [macにbrewでいれたmongodbが突然動かなくなった人のためのヒント](http://qiita.com/hidesuke/items/56a87d827708c8c770da)
- [ [WARNING: soft rlimits too low] mongoDB起動時の警告の意味がわからないので、教えてください。](https://teratail.com/questions/11307)
- [Improve ulimit doc (Mac OS X section)](https://github.com/basho/basho_docs/issues/1402)
ROMAのwrite-behind機能

ROMAにはlogとは別に指定したコマンドの実行履歴を記録するwrite-behind機能があります

# 設定方法
## 方法その1(起動後にコンソールから指定)
### コマンド
` wb_command_map {:command=>x}`

### Example
```rb
> wb_command_map {:set=>1, :delete=>2}
{"localhost_10002"=>"{:set=>1, :delete=>2}", "localhost_10001"=>"{:set=>1, :delete=>2}"}

> stat wb
stats.wb_command_map {:set=>1, :delete=>2}
```

## 方法その2(configファイルで指定)
config.rbに記述してしまえば、起動毎に設定をしなおす必要がなくなります
以下の1行をconfig.rbに追加する

```rb:config.rb
WB_COMMAND_MAP = {:set=>1, :delete=>2}
```

この指定をした状態でsetやdeleteコマンドが実行されると、それらの実行履歴を指定したwbディレクトリに出力します

# write-behindファイル
write-behindの出力先はconfig.rbで指定できますが、デフォルトの場合はカレントディレクトリにwbディレクトリが作成されています

## ファイル内容
内容はバイナリで保存されています
例えば以下のような処理をした場合、

```rb
> set foo 0 0 3
bar
STORED

> delete foo
DELETED

> set foo 0 0 4
> fizz
STORED
```
write-behindファイルを内容はvim等で直接開くと以下のようになります
(実際にファイルに出力されるにはタイムラグがあります。balseでクラスターを終了させるとその時点のwrite-behindの内容をすぐにファイル出力します)

```:./wb/localhost_10001/roma/20151222.0.wb
Vx<9e>，^@^A^@^@^@^Cfoo^@^@^@^CbarVx<9e>?^@^B^@^@^@^Cfoo^@^@^@^CbarVx<9e>C^@^A^@^@^@^Cfoo^@^@^@^Dfizz
```

## バイナリ変換
### Array => Binary
ROMA側では以下のようにbinary化しています
`[t.to_i, cmd, klen, key, vlen, val].pack("NnNa#{klen}Na#{vlen}")`
https://github.com/roma/roma/blob/master/lib/roma/write_behind.rb#L56

- N: ネットワークバイトオーダー(ビッグエンディアン)のunsigned long
- n: ネットワークバイトオーダー(ビッグエンディアン)のunsigned short
- a*: ASCII文字列(null文字を詰める)

### Binary => Array
binaryのままで使用する場合はこのままでよいですが、arrayに戻したい場合は以下のような感じで再変換します

```rb:rubyの場合
def read_wb(fname)
  ret = []
  open(fname, 'rb') do |f|
    until f.eof?
      b1 = f.read(10)
      last, cmd, klen = b1.unpack('NnN')
      key = f.read(klen)
      b2 = f.read(4)
      vlen = b2.unpack('N')[0]
      val = f.read(vlen)
      ret << [last, cmd, key, val]
    end
  end
  ret
end

puts read_wb(#{wbファイル名})
```
ちなみに上のwbファイルを再変換すると、以下のように出力されます

```rb
1450745528 # 実行日時(UNIX_TIME)
1 # configで指定したコマンド番号({:set=>1, :delete=>2}なので今回はset)
foo # key
bar # value

1450745535
2
foo
bar

1450745543
1
foo
fizz
```

# prevオプション
コマンドを指定する際にシンボルにサフィックス(__prev)を追加することでコマンド実行前のデータも出力できます
## 例

```rb:config.rb
WB_COMMAND_MAP = {:set=>1, :delete=>2, :set__prev=>3, :delete__prev=>4 }
```

このwrite-behind機能を使えば、Oracleののように何日に処理したデータを限定して読み出したり、一定期間中のデータの変更推移などが集計しやすくなる
サーベルが振りたかった

# おきまりの
CYBIRDエンジニア Advent Calendar 2015 22日目 担当のホームページビルダー @cy-yuto-kurosawa です。
かっこいいアカウント名つけとけばよかった。
週末に書くつもりが月曜日まで寝込んでて当日朝に書いてます :japanese_ogre:

昨日はかつて共に不良(ゲームの開発)をしていた @segasho 君の [量産型ゲームのサーバー運用をMSPに委託する話](http://qiita.com/segasho/items/97463b5b795eccb478db) だったよです。
まだよんでないけどもじつにきょうみぶかいですね :exclamation:
 
## この話の対象
* ライトよりビームな人
* セーバーよりサーベルな人
* 落書きを読むのが好きな人
* --
* 革新的なことはしてません

## 何の話？
先週いろいろなところで話題になっていた[Lightsaber Escape](https://lightsaber.withgoogle.com/) が面白かったので、
とりあえずケータイ振り回すとPC上の何か棒状のものが連動して動くところまでやってみようと

思っただけで前日まで経過しちゃってました。

## 道具立て
* [Phoenix Framework](http://www.phoenixframework.org/) v1.1.0
* [three.js](http://threejs.org/) r73

### Phoenix
デフォルトのビルドシステムの [Brunch](http://brunch.io/) に馴染みがなかったのでGulpを使いました。
こっちもあんま知らないけれど、日本語の情報が探しやすかったので。
寝こむ前に `mix phoenix.new` した時点の最新版はv1.0.4だったのですが、WebSocketを受け持ってくれる`phoenix.js` をバベる際にエラーが出たため、このファイルだけGithub上の開発ブランチから最新のものを落として使用しました。
その翌日くらいに1.1.0がリリースされ、babelのエラーも解消されていたので意味の薄い検証でしたが・・

ケータイから受け取った`deviceorientation`, `devicemotion`をPCに渡すだけなので、
公式ドキュメントの [channel](http://www.phoenixframework.org/docs/channels) の内容ほぼそのままです。

`mix phoenix.server` 後はケータイ用にQRを出すため、localhostではなくプライベートIPで開きます。
多分設定ファイルでどうにかできるんだろうけど大した手間じゃないので調べてません。

### three.js (とJavascript)
ジャイロセンサに合わせて動かすのはまぁなんとかそれらしくできましたが、
加速度センサの値を移動にどう当てはめればいいのやら・・ぜんぜんわかりません。

`requestAnimationFrame` で「ケータイから送信」を行っているので、ものすごい頻度で通信してます。
どうにかしようとセンサのデータを間引いてから投げつけてみたりもしたのですが、これだとビームサーベルが瞬間移動してしまったため断念しました。
間引いた部分を描画時に何となく埋めるか、投げるのを配列にしてなんとかすればいいんですかね・・

## もの
[.](https://github.com/cy-yuto-kurosawa/ohige)


## まとめ
られるほどできてませんごめんなさい

## 最後に
そで余ってる系では忍野扇ちゃんがいいです。愚か者呼ばわりされたい

----

さて、明日は @cy-mitsuki さんの 「DevToolsのTimelineパネルを見ながら、レンダリングの仕組みを理解する」です。
DevToolsいいですね。僕は右出し派です
PHPでvar_dumpの結果をログなど画面外に出力する関数

PHPの`var_dump`はApacheなどであれば、レスポンスに出力されてしまい、Ajaxのサーバ側のデバッグがやりにくい。JavaScriptのconsole APIのように、PHPにも画面外に出力するAPIが欲しいところ。無いので実装してみた。

もっとも手軽なのは`file_put_contents('...', var_export($val, true))`だが、インスタンスが`__set_state`として表示されたり、再帰参照はエラーになったりと、デバッグには使い勝手が良くない。

`var_dump`を使うとなると出力を一旦受け止めないといけないので、Output Bufferを使うことになる。次の実装がシンプルな例。

```php
function console_log()
{
	ob_start();
	call_user_func_array('var_dump', func_get_args());
	file_put_contents('php://stderr', ob_get_clean());
}

console_log($foo, $bar, $buz);
```

ただこの実装では、var_dumpの出力結果がメモリ上限に達すると何も出力されなくなってしまう問題がある。
この問題に遭遇したら、`ob_start`の第一引数に関数を指定して、バッファに貯めずにログに出力するといった回避策もある。

```php
function console_log()
{
	ob_start(function ($buffer) {
		file_put_contents('php://stderr', $buffer);
		return '';
	}, 1);
	call_user_func_array('var_dump', func_get_args());
	ob_end_clean();
}
```

あと、お好みでこのログ関数に、コール元の情報を追加してもいいかも。


```php
	$caller = debug_backtrace()[0];
	echo date('Y-m-d H:i:s'), ' ', basename($caller['file']), ':', $caller['line'], " "; 
```
Objective-cでENUMに対応する文字列を定義する

Objective-cでは列挙をENUMで表す際に文字列で定義する事ができないので、
ENUMに対応できるマクロを作成することで対応しました。

列挙型の宣言と対応するマクロの作成
-

```objc:.h
typedef NS_ENUM(NSInteger, HogeType) {
    HogeType1,
    HogeType2,
    HogeType3
};

// HogeTyoeから文字列を取得
#define GetHogeTypeText(type) HogeTypeTextList[type]

// 文字列からHogeTyoeを取得
#define GetHogeType(typeText) (HogeType)[HogeTypeTextList indexOfObject:typeText]

// HogeTyoeの文字列リスト
#define HogeTypeTextList @[@"first",@"second",@"third"]
```

使用例
-

```objc:.m
    HogeType hogeType = HogeType1;
    
    // HogeTypeから文字列を取得
    NSString *hogeTypeText = GetHogeTypeText(hogeType);
    
    // 文字列からHogeTypeを取得
    HogeType getHogeType = GetHogeType(hogeTypeText);
    
    NSLog(@"HogeTypeの文字列 : %@",hogeTypeText);
    NSLog(@"文字列から取得したHogeType : %d",getHogeType);

```

もちろんENUMを切っている分でswichで使用する事もできるので、
項目を追加するときの漏れを防止できます。

```objc:.m
    NSString *hogeTypeText = @"first";
    
    // 文字列をHogeTyoeに変換
    HogeType hogeType = GetHogeType(hogeTypeText);
    
    // Switchで処理
    switch (hogeType) {
        case HogeType1:
        {
            break;
        }
        case HogeType2:
        {
            break;
        }
        case HogeType3:
        {
            break;
        }
    }

```

最後に…
-

今までは変換用のメソッドを共通クラス等で作成したのですが、
こちらの方がスマートで使いやすいと思います。

他にいい方法や、間違っている所があればコメント頂けると幸いです。
業務を加速させるバーチャルキーパッド

業務システムでは、入力の速さを求められます。一方で、本当かどうか分かりませんが、「システム利用者はリテラシーが低いこと」を前提に機能要求が積み上がることが多いです。

そんなIMEの辞書のカスタマイズによる入力速度の向上など期待しない中で、入力を速く行えるようにするには…と考えると、フォームごとに専用のキーパッドを用意するとよい場合があります。

また、タブレットで業務システムを使うケースも増えてきました。その入力のしにくさを考えると、やはり専用のキーパッドを用意するとよい場合があります。

## keypad

色々、選択肢はあるのですが、カスタマイズしやすいものとなるとあまり見当たりません。[jQuery keypad](http://keith-wood.name/keypad.html)は割と老舗でカスタマイズに関してももよく考えられています。
http://keith-wood.name/keypad.html

このjQuery keypadをベースに、キーパッドを設置するとよいケースについて考えてみます。

## キーパッドを設置するとよいケース

### 半角カナ

半角カナしか受けつけない入力フォームは、未だバックオフィス系にはかなりの数存在します。PCから入力する際は問題ありませんが、スマフォ(特にiPhone/iPad)から入力するとなると、かなり工夫が必要です。そんなとき、半角カナのキーパッドを用意すると、入力が楽になります。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/4734069d-cdf2-fb98-8f90-2a1ca13a7847.png)

```js
$("#furigana").keypad({
  layout: [
  	'ｱｶｻﾀﾅﾊﾏﾔﾗﾜｧｬﾞ',
    'ｲｷｼﾁﾆﾋﾐ'+ $.keypad.SPACE + 'ﾘ' + $.keypad.SPACE + 'ｨ' + $.keypad.SPACE + 'ﾟ',
    'ｳｸｽﾂﾇﾌﾑﾕﾙｦｩﾕｰ',
    'ｴｹｾﾃﾈﾍﾒ'+ $.keypad.SPACE + 'ﾚ' + $.keypad.SPACE + 'ｪ' + $.keypad.SPACE + '･',
    'ｵｺｿﾄﾉﾎﾓﾖﾛﾝｫｮｯ'
  ],
  keypadOnly: false
});
```

### テンキーパッド

スマフォの場合、`<input type="number">`になっていると、数字キーボードがでます。だからといって、郵便番号のような"数値"でないフィールドに、このnumberタイプを使うと、フォームをPOSTするときに先頭0が送信されないことがあります。iOS Safariは途中でこの挙動が変わって、郵便番号にnumberを使っていた人が、新しいiOSでのSafariのバグだ！と叫んでいる人がいましたが、仕方のないことですね。

そんな数値ではなくても、数字しか入力しないようなフィールドの入力補助として、テンキーパッドをつけるのは、小さなスマフォ向けには便利だったりします。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/7c4ac19c-12df-4980-dca1-80df5cbef143.png)

```js
$("#postal").keypad({
  layout: ['789','456','123','-0'+$.keypad.BACK],
  keypadOnly: false
}).keypad('option', 'backText', '⌫');
```

### 特殊な記号や敬称などの入力

会社名などのように決まりきった文言を付け足すことがあります。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/e7c7ccda-6dd7-76d1-4d4d-54eabc0af1c9.png)

```js
$("#company-name").keypad({
  separator: '|',
  layout: ['㈱|㈲'],
  keypadOnly: false
});
```

### 選択肢+その他

フリー入力なんだけど、よくある回答を選択肢にしたい、というケースは業務システムでよくあります。そして、よく見かけるUIは、選択肢をラジオボタンにして、"「その他」を選んだ人は、次の入力フィールドに内容を記述して下さい"みたいなものです。これは入力する側にもストレスを与え、値をシステム的に集計するのも大変です。

選択肢ボタンでよくないですか?

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/cb34dbcd-a4ea-26c7-7357-ff27db324a5c.png)

```js
$("#excuse-for-being-late").keypad({
  separator: '|',
  layout: ['電車遅延|寝坊', '体調不良|ギックリ腰'],
  keypadClass: "excuse-keypad",
  keypadOnly: false
});
```

### 定型文の入力

だいたい決まりきった文言を入力することが多い場合は、定型文の入力に短縮ボタンを割り当てると便利です。

### 暗証番号の入力

これまでのとは毛色が違いますが、セキュアなシステムで要求されるキーロガー対策も、jQuery keypadを使って簡単に実装できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/abc69b16-81dd-655d-99e8-c57a6af99989.png)

```js
$("#passcode").keypad({
  randomiseNumeric: true
});
```

## まとめ

ちょっとした工夫で、業務効率は大きく変わる(と言われます)。バーチャルキーパッドの設置は、労力はそんなにかからないので、入力難のあるフォームには導入検討してみるとよいのではないでしょうか。
記事中のExampleの全量は↓にあります。
https://jsfiddle.net/kawasima/7Lt99avm/
Qiita のように使える Knowledge を動かしてみた

## 良い点

* セットアップが簡単

## 今ひとつな点

* 編集履歴が見づらい(前の記事がそのまま表示されるだけでdiff表示されない)
* 記事の編集ボタンが、ページ一番下にあり編集に移りづらい
* 記事の目次がない

## dockerで動かす

```bash:
docker run -d --name knowledge \
-p 8080:8080 \
-v /data/knowledge/.knowledge:/root/.knowledge \
tukiyo3/knowledge
```

* http://localhost:8080 にアクセス
    * ID:Pass = admin : admin123
mythingsのトリガーをnode-redで受ける

#概要
mythingsのトリガーをnede-redのmqtt inで受ける。
#写真
![meshblu.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/a002ccb3-3e26-f539-df45-f767534098b1.jpeg)
#設定
```
url: you .jp-east.compute.idcfcloud.com
user: action-1 uuid
pass: action-1 token
topic: action-1 uuid
payload: {"topic": "message", "data": { "devices": [action-1 uuid], "payload": "ohisama", "fromUuid": owner uuid}}
```
React Native - Examples/UIExplorer 

React Nativeで開発していて、困ることの一つにUIコンポーネントがどのように動くのかドキュメントを読むだけではわからないことです。そこで、React Nativeのレポジトリの中にExamples/UIExploreというサンプルが入っていて、それをシミュレーターで動かすことで動きを確認することができます。

# Examples/UIExplorer

## Install

`git clone`してnpmモジュールをインストールする。

```
 $ cd /tmp
 $ git clone git@github.com:facebook/react-native.git
 $ cd react-narive
 $ npm install
```

## 起動方法
### iOS

Xcodeから`Examples/UIExplorer/UIExplorer.xcodeproj/`を開いて、`Run`する。


![スクリーンショット 2015-12-22 7.21.40.png](https://qiita-image-store.s3.amazonaws.com/0/13663/2eb3b69e-c941-5a97-b805-7b8c19dfb226.png)


propertyの情報とそのUIを確認できる。

![スクリーンショット 2015-12-22 7.23.59.png](https://qiita-image-store.s3.amazonaws.com/0/13663/a935639d-2ec6-5a4b-e53b-710dd9548db6.png)

### Android

3日目のエントリの[React Native - Android開発のはじめの方](http://qiita.com/shohey1226/items/816a6bf094bba12f8651)で説明したようにSDK等をインストールしておく。Examples起動には別途、NDKが必要なので、[ここ](http://developer.android.com/ndk/downloads/index.html#download)からダウンロードして、展開する。

```
 $ chmod a+x android-ndk-r10e-darwin-x86_64.bin
 $ ./android-ndk-r10e-darwin-x86_64.bin
```

これをsdk同様に/usr/local/optあたりに配置。(optは../Cellarへのシンボリックリンクだったので同じように作る。

```
 $ cd /usr/local/Cellar
 $ mkdir android-ndk
 $ mv ~/Download/android-ndk-r10e /usr/local/Cellar/android-ndk/r10e
 $ cd /usr/local/opt
 $ ln -s ../Cellar/android-ndk/r10e android-ndk
```

`.bash_profile`に環境変数を追加

```
# .bash_profile
export ANDROID_NDK=/usr/local/opt/android-ndk
```

Genymotionなどのデバイスを起動後に下記のコマンドでUIExplorerをPush。

```
$ cd /tmp/react-native
$ source ~/.bash_profile
$ ./gradlew :Examples:UIExplorer:android:app:installDebug
```

すると、アプリ一覧に表示されるので起動する。

![スクリーンショット 2015-12-22 8.00.24.png](https://qiita-image-store.s3.amazonaws.com/0/13663/672adf44-1b65-6f26-d5e5-1a2385dc4008.png)


![スクリーンショット 2015-12-22 7.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/13663/c887e2a0-0fb3-9d4c-9b86-165f9e66e026.png)
![スクリーンショット 2015-12-22 7.58.57.png](https://qiita-image-store.s3.amazonaws.com/0/13663/8a302cac-e7b7-a289-eabe-7b5531d46add.png)

## Summary

今回はExamples/UIExplorerを説明しました。設計時にどのUIコンポーネントを使うかを考えるのに非常に便利なデモアプリです。React Nativeのバージョンが上がるとコンポーネントも増えてる可能性があるので、最新のものを適宜見ていくのが良いと思います。
[関連レコードへ移動] スクリプトステップについて書いてみる



[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の22日目

# [関連レコードへ移動] スクリプトステップについて書いてみる

## [関連レコードへ移動] スクリプトステップとは？
関連レコードへ移動
> 目的 
このスクリプトステップがアクティブなポータル内の行で使用されている場合を除き、関連テーブル内の現在の関連レコードに移動します。
構文 
関連レコードへ移動 [テーブル:「<テーブル名>」; 使用するレイアウト 「<レイアウト名>」]

## 簡単な検証をしてみる
FMC2Goスケジューラーでは
![151221-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/762e7f05-e80f-2973-ef4f-7c63396118e8.png)
こんな感じなんですが...

### ミニマムな環境を作ってみる
![151222-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/b3318fb0-9d98-e109-8db1-ee0aaa51523d.png)

![151222-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/b103f5aa-6da5-c5bc-7366-79d8f0e400ee.png)

![151222-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/73d11339-6d14-adad-54cf-5e24fd11b09f.png)

![151222-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/d40ed2f8-743d-7eef-3360-d17389b562c4.png)

###  ミニマムなスクリプトを書いてみる
![151222-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/319e511d-6720-2c87-87d9-cbced28aa19f.png)

### 動作を確認してみる
IDを入力して[抽出]ボタンを押すと「関連レコードへ移動」によって絞り込みが行われます
![151222-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/bdf96e10-b898-d22f-76aa-deeb68d36c3a.png)
こうなるのは容易に想像つきます

IDを2つ入れてみる
![151222-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/dcf184c3-0520-abbc-8865-c485006facb9.png)
2行抽出されました

IDを3つ入れてみる
![151222-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/f198ec52-7839-7c4e-6513-4a5d2c768937.png)
3行抽出されました

[関連レコードへ移動] スクリプトステップは対象レコードの絞り込みに使える

## 対象レコードを絞り込むには？
対象レコードを取得する方法で思いつくのは
### 検索モードに移行して検索条件を設定して検索実行
![151222-09.png](https://qiita-image-store.s3.amazonaws.com/0/89027/d2682655-62de-4b36-ff7c-dccc8dd65369.png)

### Loopでレコードを舐めて検索条件に該当しないものを対象外へ
![151222-10.png](https://qiita-image-store.s3.amazonaws.com/0/89027/01660552-d514-96d2-b668-8c65b08c034b.png)

そして今回取り上げた
### 関連レコードへ移動
![151222-11.png](https://qiita-image-store.s3.amazonaws.com/0/89027/ee6a6734-95ad-7a52-6faf-a3a5e10dc86b.png)

## 「関連レコードへ移動」が便利だなと思う使い方
### 1件だけ対象レコードにする
FileMakerで処理が対象レコードに対して行われようとした時にアワワってなる時ありませんか
例えば「印刷」
印刷するときにの印刷が「対象レコード」になっているのに全レコードが対象になっていて...
ちゃんと印刷が「現在のレコード」になっていればいいのですが
そんな時に簡単に現在のレコード1件だけを対象レコードにしてしまうこんな書き方
![151222-14.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2750a873-6338-05b6-a494-5216044923cd.png)
まあ現在のレコードを対象外にして、対象外のみ表示してもいいのですが..
ただしこの場合は先に全レコードを表示しておかないとおかしいことになる場合もあります

### 検索結果の保存(検索条件の保存ではない)
なにか処理をするのにユーザーが絞り込んだ対象レコードを壊してしまわないといけない
そんなときはユーザーが絞り込んだ結果を保持して、こっちの処理が終わったら戻してあげればいい

検索結果を保持するスクリプト
![151222-12.png](https://qiita-image-store.s3.amazonaws.com/0/89027/f97c0002-b7c5-a5c3-14ae-bb94c763ec9f.png)

検索結果を復元するスクリプト
![151222-13.png](https://qiita-image-store.s3.amazonaws.com/0/89027/3cb2e77d-35e5-c9de-e014-c07d4da58dda.png)

今日はここまで
gst-launch でエレメント間のレイテンシーを測る方法


これは [How to measure intra GStreamer/gst-launch latency](http://stackoverflow.com/questions/34338676/how-to-measure-intra-gstreamer-gst-launch-latency/34363085#34363085) のご紹介です。

----

GStreamer で開発していると「遅延は 0.x 秒まで」というような要求仕様に当たることが、しばしばあります。

例えば、以下のようなMP4 で mux してネットワーク配信をするパイプラインなどは、「遅延しているが、どこで遅延しているのか、見当がつかない。」そんな典型的な例です。

```sh:server
v4l2src ! videoconvert ! x264enc ! qtmux ! rtph264pay ! udpsink
```

```sh:client
udpsrc ! rtpbin.rtpsrc \
rtpbin. ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink
```

この場合、わたしはいままで `identity` を使って「どのエレメントの処理に時間がかかっているか」を調べてきました。

参考までに [ここ](https://users.atmark-techno.com/sites/users.atmark-techno.com/files/forum/enctime.c)に `identity` を使った計測コードがあります。

しかし、"エレメントを変えるたびにコンパイルしなければならない", "gst-launch では使えない" など、面倒な点がいくつかありました。

これを解決してくれそうなのが [gstreamer_timestamp_marking](https://github.com/mpekar/gstreamer_timestamp_marking/commits/master) です。

README にある通り `markout` を export して

```
$ export GST_DEBUG=markout:5
```

`markin`と`markout`で測定したい区間を囲って実行するだけ。

```
$ gst-launch-1.0 -f -e videotestsrc pattern=ball ! video/x-raw,width=320,height=240 ! markin name=moo ! videoscale ! markout ! video/x-raw,width=1280,height=720 ! ximagesink
```

とっても簡単ですね :)
Node.js 実践講座 事例編 その1 | EJSによるCSV出力

# はじめに
この記事ではテンプレートエンジンであるEJSを使用してCSV出力を実装する方法を紹介します。

# EJSとは
EJSはJavaScriptのテンプレートエンジンの一つです。EJSの書き方はPHPに似ており、HTMLの他にも様々な形式に対応することができる汎用性の高いテンプレートエンジンです。

EJSを使用したテンプレートの一例を下記に示します。

```
氏名: <%= user.name %> さん
年齢: <%= user.age %> 歳
身長: <%= user.height %> cm
体重: <%= user.weight %> kg
備考:
<% user.tags.forEach(function(tag) { -%>
- <%= tag.name %>: <%= tag.value %>
<% }) -%>
```

上記のテンプレートに対して下記のコンテキストを与えるとします。

```
{
  "user": {
    "name": "長岡 太郎",
    "age": 25,
    "height": 170,
    "weight": 65,
    "tags": [
      {
      	 "name": "出身",
      	 "value": "新潟県"
      },
      {
      	 "name": "趣味",
      	 "value": "プログラミング"
      }
    ]
  }
}
```

描画の実行結果を下記に示します。

```
氏名: 長岡 太郎 さん
年齢: 25 歳
身長: 170 cm
体重: 65 kg
備考:
- 出身: 新潟県
- 趣味: 北海道
```

# ワークスペースの作成
ワークスペースの作成コマンドを下記に示します。

```
mkdir -p ~/workspace/js/practice/01-csv-export
touch ~/workspace/js/practice/01-csv-export/index.js
```

# EJSのインストール
EJSのインストールコマンドを下記に示します。

```
npm install ejs
```

# EJSの使用方法

## ソースコード
サンプルプログラムのソースコードの内容を下記に示します。

```index.js
'use strict';

var ejs = require('ejs')

var template = [
  'Name,Age',
  '<% users.forEach(function (user) { -%>',
  '<%= user.name %>,<%= user.age %>',
  '<% }) -%>',
].join('\n')

var options = {
  users: [
  	{ name: 'A', age: 20 },
  	{ name: 'B', age: 25 },
  	{ name: 'C', age: 30 },
  	{ name: 'D', age: 35 },
  	{ name: 'E', age: 40 },
  ],
}

var result = ejs.render(template, options)

console.log(result)
```

## 実行コマンド
実行コマンドを下記に示します。

```
node index.js
```

## 実行結果
実行結果を下記に示します。

```
Name,Age
A,20
B,25
C,30
D,35
E,40
```

## 解説
EJSのテンプレートを描画するには`ejs`の`render`関数を呼び出します。第1引数にはテンプレートを文字列として指定し、第2引数にはコンテキストをオブジェクトとして指定します。

JavaScriptのコードを実行したい範囲を`<%`と`%>`で囲みます。なお、`<%`と`-%>`で囲むことによって改行を抑制することができます。

JavaScriptのコードを実行し、さらにその実行結果を出力したい場合には`<%=`と`%>`で囲みます。

# おわりに
次回はJadeを使用して帳票出力を実装する方法を紹介します。
proxmox4.1でLXDを動かす

ubuntuはパッケージが用意されているが、debianには用意されていないので調査した。

## 参考

* [lxc/lxd · GitHub](https://github.com/lxc/lxd)

## インストール

```diff:/etc/apt/sources.list.d/pve-enterprise.list
- deb https://enterprise.proxmox.com/debian jessie pve-enterprise
+ deb http://download.proxmox.com/debian jessie pve-no-subscription
```

```bash:lxdビルドに必要なパッケージ
apt-get install \
  pkg-config golang lxc-pve-dev build-essential
```

## ビルド

```bash:~/.bashrc
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin/
```

```bash:
source ~/.bashrc

mkdir ~/go
go get github.com/lxc/lxd
cd $GOPATH/src/github.com/lxc/lxd
make
```

* `~/go/bin/lxd`が生成される。

## LXDデーモン起動

```bash:起動
sudo -E $GOPATH/bin/lxd --group sudo
```

### cronで起動する場合

* [/etc/sudoersの#includedirの#はコメントアウトじゃない - Qiita](http://qiita.com/mikeda/items/ddd4c59d6cadeb94ff01)
* [sudoers - How to allow user to preserve environment with sudo? - Super User](http://superuser.com/questions/636283/how-to-allow-user-to-preserve-environment-with-sudo)

```bash:/etc/sudoers.d/user1
user1 ALL=(ALL) NOPASSWD:SETENV: /home/user1/go/bin/lxd
```

```bash:~/bin/lxd-daemon-start.sh 
export GOPATH=/home/user1/go
export PATH=$PATH:$GOPATH/bin/
sudo -E $GOPATH/bin/lxd --group sudo
```

```bash:crontab(user1の)
@reboot ~/bin/lxd-daemon-start.sh
```

----

# ネットワーク設定

```bash:
lxc profile edit default
```

```diff:
name: default
config: {}
devices:
  eth0:
    nictype: bridged
-   parent: lxcbr0
+   parent: docker0
    type: nic
```

----

# データの場所

* /var/lib/lxd/ にコンテナのデータが格納される。
* `/`スライスの空き容量が気になるので、/var/lib/vz/lxdに移動する。

```bash:
cd  /var/lib/
mv lxd vz
ln -s vz/lxd .
```

# LXDコンテナ起動

```bash:
lxc remote add images images.linuxcontainers.org
#lxc launch images:centos/7/amd64 centos
lxc launch images:ubuntu/xenial/amd64 ubuntu
```

```bash:ubuntuコンテナに接続
lxc exec ubuntu -- /bin/bash
```

# ubuntuコンテナのネットワーク設定

* proxmoxのdocker0が`172.17.0.1/24`とする。

```bash:ubuntuコンテナで実施
ip addr add 172.17.0.222/24 dev eth0
ip route add default via 172.17.0.1
echo "nameserver 8.8.8.8" > /etc/resolv.conf
```

のようにIPを手で設定しても良いが、自動で設定されるように設定する。

```bash:/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 172.17.0.222
    netmask 255.255.255.0
    gateway 172.17.0.1
    dns-nameservers 8.8.8.8 8.8.4.4
```

```bash:
lxc restart ubuntu
lxc list
```

IPアドレスが設定されたことを確認。

```bash:確認
$ lxc list
+--------+---------+---------------------+------+-----------+-----------+
|  NAME  |  STATE  |        IPV4         | IPV6 | EPHEMERAL | SNAPSHOTS |
+--------+---------+---------------------+------+-----------+-----------+
| ubuntu | RUNNING | 172.17.0.2 (eth0)   |      | NO        |         0 |
+--------+---------+---------------------+------+-----------+-----------+
```
技術英語 > he'll keep his eyes open / keep my eye's on you / make somebody down as xxx

August 17, 2012

http://loe.org/shows/shows.html?programID=12-P13-00033
>he'll keep his eyes open

http://idioms.thefreedictionary.com/keep+eyes+open
> to remain <font color=red>alert and watchful</font> for someone or something

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

> keep my eyes on you.

「常に見ているよ」というフレーズとして使う。

ドラマのエピソードであやしいことをしそうな人に対してけん制の意味で使われているのを見たことがある。

http://ejje.weblio.jp/content/keep+one's+eyes+on
> 注目する

「目星を付ける」という意味もあるのか。

<hr>
目星をつける

http://ejje.weblio.jp/content/%E7%9B%AE%E6%98%9F%E3%82%92%E4%BB%98%E3%81%91%E3%82%8B

From the beginning the detective <font color=red>marked the woman down as the kidnapper</font>.
phina.jsで便利なシーン管理「ManagerScene」の使い方

#はじめに
以前tmlib.jsを仕事で半年ほど使用していましたが、
なんと！

さらにパワーアップした正式な後継ライブラリ

[phina.js](http://phinajs.com/)

なるものがリリースされたと聞き、簡単ではありますが、
記事を書かせて頂ければと思います。

本来はなにかしらゲームを作った記事にしたかったのですが、
なかなか本業が忙しく、ゲームを作り始めようとして気になったところを
書いてみようかと。

コードはweb上で手軽にプログラミングをすることができる

[Runstant Lite] (http://lite.runstant.com/)

を使っていこうかと思います。
めちゃくちゃ便利なので。

#準備
phina.jsを使ってゲームプログラミングを始めるのに一番簡単な方法ですが、

色々調べてみた感じ、Runstant Liteのテンプレートからが一番簡単かなと思います。

http://lite.runstant.com/collections/templates

の左側のメニューを少し下にスクロールすると

[phina.js](http://lite.runstant.com/collections/templates#game%2Fphina.js)

という項目があるので、クリックするだけ。

他にも色々なテンプレートがあるみたいなので、面白そうです。

実際にphina.jsのテンプレートページを開くと下記のように表示されるかと思います。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/58681/99f52ee1-6b97-eea8-7f70-80bfa01f3c8a.png)


ここまできたらあとは好きにコードを変更して好きなゲームを作り始められます。

#phina.jsのサンプルシーン
phina.jsでは少しでも簡単にゲームプログラミングが始められるように、

スプラッシュやタイトルといったシーンはサンプルが用意されているみたいです。

```js
phina.main(function() {
  var app = GameApp({
    startLabel: 'title', //ここでタイトルを指定している
  });
  
  document.body.appendChild(app.domElement);
  app.run();
});
```

上記コードの

startLabel:'title'

でシーンの名前（ラベル）を指定することで
最初に表示するシーンを決めることができるのですが、

titleと呼ばれるシーンは実際自分では作成していないのに
左の画面では表示されています。

この画面がphina.jsで事前にサンプルとして作成されているシーンになります。

タイトルのほかにも

'splash'と変えてみると、かわいい鳥のスプラッシュ画像が表示されます。

#全部のシーンを自分でつくりたい

ここからが本題になります。

やっぱりゲームを作るなら全部自分で作りたい！
と思う方もいるかと思います。
実際、僕自身そうしようと思って準備を開始しました。

ただ、シーンを管理するのって結構大変だったりします。。。

が、

phina.jsには便利な機能がありました。

ManagerSceneなるものが

ただ、いざ使ってみようと思ったところ、

まだリリースしたてでドキュメントが少なく、

実際テンプレートからどう記述すれば使えるのか、僕自身迷った箇所であったので、

紹介できればと思います。

#ManagerSceneの使い方

使い方を紹介しますが。。。

実際ものすごく簡単です。

先ほどのphina.jsからManagerSceneを使用してシーン管理をできるようにしたサンプル画像が下記になります。
![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/58681/4729daed-855c-622b-79d0-0620044ce75b.png)
![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/58681/a5d4cbfc-591f-410b-5c49-77991bbbe4f7.png)
[コードはこちら](http://goo.gl/W8fwij)
画面をクリックするとシーンが切り替わります。

オリジナルのシーンをそれぞれ、

・MyTitleScene
・MyMenuScene
・MyMainScene

として作成し、これらのシーンを管理する

・MyManagerScene

を作成しました。

このMyManagerSceneは、2枚目の画像の下のほうにある

app.replaceScene(MyManagerScene());

で実際に使えるようにしています。

これで動いているのであっているかと思うのですが、
もし間違ってましたらご一報頂けますと。。。

ManagerSceneの詳細な使い方については下記の記事が分かりやすいかと思います。
「[ManagerSceneでゲームの流れを管理しよう](http://github.dev7.jp/b/2015/12/01/phinaadvcal20151202/)」

#おわりに
大変なシーン管理もphina.jsを使えば簡単に実装できるため、
経験のない方でも、気軽にゲームプログラミングができるのではないかと思います。

今は本業が忙しくあまり詳しくコードの説明ができませんでしたが、
年明けあたりには「phina.jsでゲームをつくってみた」記事を書ければなと思っています。

簡単な内容ではありますが、お役に立てれば幸いです。
SlackのTogetter風アプリ「Togelack」をHerokuにデプロイする

## 前回までのあらすじ
- [Togetter的な社内Slackまとめサイトをつくった話 - Qiita](http://qiita.com/ru_shalm/items/32160b23df535ed78967)

紹介の記事は書いたけどデプロイ方法がどこにも書いてなかった。[^1]
今回はHerokuにデプロイをする手順をまとめます。

[^1]: それどころか不備があってデプロイするとバグってたよ٩(๑❛ᴗ❛๑)۶　（1件もまとめが無いとバグる不具合があったｗ）

## Herokuにデプロイをする前に準備する

### 事前準備1：Herokuのアカウントを用意する
インターネットで調べてください :pray:

### 事前準備2：SlackのAPIキーを発行する

- https://api.slack.com/web#authentication

上のページで発行できます。まだ一度も発行してない場合は「Create token」という緑のボタンがあるので押してください。
赤字で表示されてる `xoxp-xxxxxxxxxxxxxxx` みたいな文字列がAPIキーです。なんでもできて危ないので大事にしてね。

![APIキー](https://qiita-image-store.s3.amazonaws.com/0/25109/d1e482e8-c977-9331-180e-5539988211e9.png)


### 事前準備3：Slackのアプリケーションキーを発行する

- https://api.slack.com/applications

Twitterのアプリケーション登録みたいなやつです。
上のページから「Create a new application」ボタンで新規作成ができます。

「App Name」などそれぞれの項目は自由に埋めていただければ大丈夫です。
ただし、一番最後の「Redirect URI(s)」の欄は必ず

```
デプロイする予定のURL/auth/slack/callback
```

で登録してください。 `https://togelack-demo.herokuapp.com` にデプロイするなら `https://togelack-demo.herokuapp.com/auth/slack/callback` です。
ここをちゃんと設定しないと、ログインしようとしてもSlackちゃんが激おこになってログインできません。

## Herokuにデプロイを始める

事前準備は以上なのでさっそくデプロイを始めます。

- [rutan/togelack](https://github.com/rutan/togelack)

とはいえ、上記ページのREADMEにHerokuボタンが付いているのでポチっとすると各種、設定入力画面に行って各種入力をするだけでデプロイ完了です。Herokuボタンべんり。

### SLACK_TOKEN
さっき発行したAPIキーを入力してください。
主にカスタム絵文字の取得とかのために使ってます。

### SLACK_CLIENT_ID / SLACK_CLIENT_SECRET
先ほど作成したSlackのアプリトークンを入力してください。

![Client ID](https://qiita-image-store.s3.amazonaws.com/0/25109/52572ecd-45af-6d13-6aa9-e165750e12f1.png)

SLACK_CLIENT_IDが左のやつ、SLACK_CLIENT_SECRETが右のやつです（Showボタンを押すと表示されるよ）

### SLACK_TEAM_ID / SLACK_TEAM_NAME
- TEAM_ID: Slackの内部的なチームID
- TEAM_NAME: xxxx.slack.com のxxxx部分

チームIDの確認はSlackのAPIを叩くとわかります。
めんどくさい！という方はSlack公式の↓のページにアクセスするとWeb上からAPIを実行できるので、チーム名を選択して送信ボタンを押すとチーム名がわかります。

- [team.info method | Slack](https://api.slack.com/methods/team.info/test)

```javascript
{
    "ok": true,
    "team": {
        "id": "T02ENE13K",   // ← チームIDはここの部分だよ
        "name": "toripota",  // ← チーム名はここの部分だよ
        "domain": "toripota",
    ...
```

よく考えたら、SlackのAPIトークン入力してるんだし、アプリ側で取得すればよかったんじゃ……という気もしてきた。そのうち自動化します。

### SLACK_CHANNEL （オプション）
設定しなくても動きます。

まとめを作成した際にSlackに通知を飛ばす場合はここにチャンネルの名前を設定してください（`general` とか）。基本的にpublicチャンネルであることが前提です。
未設定の場合は通知をしません。

↓こんなのが出ます

![通知](https://qiita-image-store.s3.amazonaws.com/0/25109/d444b991-6cca-b5ed-a0a1-54577fbe6be5.png)

### SLACK_ICON （オプション）
設定しなくても動きます。

Slack通知時のアイコン画像を設定します。
`:hoge:` の絵文字スタイルと画像のURLを指定するスタイルの2パターンがあります。

![togelack.png](https://qiita-image-store.s3.amazonaws.com/0/25109/d8aaf2bd-0817-941f-e742-b9b6e4ecb850.png) < Herokuボタンのデフォルトでは「トゲトゲサボテンちゃん」といういろいろヤバそうなキャラが設定してあります。

### REDIS_URL （オプション）
設定しなくても動きます。

サーバのキャッシュにRedisを使いたい場合は設定してください。

### デプロイボタンﾎﾟﾁｰ
デプロイが始まります。

- [成功イメージ（Togelack デモ版）](https://togelack-demo.herokuapp.com/)

### よくある質問

#### ログインできない
アプリ作成時のログインのコールバックURLをちゃんと指定しないとログインできないのです＞＜；

#### アイコンが表示されない
ユーザーがアイコン設定を変更するとURLが変わってしまうので、画像が表示されなくなることがあります。
そのユーザーの情報が更新されれば直るので、気長に待ってあげてください＞＜；

#### バグがあった
プルリク待ってます＞＜； https://github.com/rutan/togelack/pulls
Chrome Loggerを使ってPHPのデバッグをコンソール画面から確認してみる。

こんにちは。LIGアドベントカレンダーの22日目は@yasuo424が担当します！

今回はPHPのデバッグをより便利にしてくれるChrome Loggerというエクステンションの導入方法を紹介したいと思います。

# Chrome Loggerとは？？
google Chromeのエクステンションで、javascriptだけでなく、サーバーサイド言語のログ出力もChromeのコンソール画面で確認できるようにしてくれるとても便利なエクステンションです。

今回はPHPでやってみましたが、他にもこんな言語もサポートしてくれてます。

* Python
* Ruby
* Node.js
* .NET
* ColdFusion
* Go
* Java
* Perl

それではさっそく導入していきましょう！

# エクステンションをインストール
なにはともあれChromeのエクステンションをインストールしましょう。
https://chrome.google.com/webstore/detail/chrome-logger/noaneddfkdjfnfdakjjmocngnfkfehhd

公式サイトはこちら
https://craig.is/writing/chrome-logger

インストールが終わったら、logを出したいページでコンソールのマークをクリックします。
![toggle.gif](https://qiita-image-store.s3.amazonaws.com/0/21703/596b6764-13fc-98ac-832a-c581f6361374.gif)

あとは公式サイトのGithub上からダウンロードできるChromePhp.phpをサーバーに設置して
デバッグしたいコードの前にこんな風にincludeするだけ。

```php:debug_log.php
include 'ChromePhp.php';
ChromePhp::log('Hello console!');
ChromePhp::log($_SERVER);
ChromePhp::warn('something went wrong!');
```

これをコンソールで確認すると、、、

![スクリーンショット 2015-12-22 3.27.41.png](https://qiita-image-store.s3.amazonaws.com/0/21703/64262ef4-5e3e-4b7e-8d9d-94768ed03b1c.png)


これで変数の中身を確認したり、スーパーグローバル変数の中身を確認したりできます。
var_dumpやprint_rなどとは違って、画面上の表示を崩さずにコンソール画面で確認できるとこも手軽でよいですね。

知っておくとけっこう便利に使えるのではないでしょうか。
State Monad (すごいハスケル本より）

#はじめに
Monad の（数学的な）理解とHaskell のMonad インスタンスがわかっているかどうかは全く違って、私は現在後者でつまずいています。

State Monadの勉強を[Stateモナドで遊んでみよう](http://qiita.com/tsukimizake774/items/9c60c9e06ebc56b648b7)でさせてもらいながら、[こっち](http://learnyouahaskell.com/for-a-few-monads-more#making-monads)を読んでいます、そこで出会った不思議な警告文の紹介です。


##State Monad を勉強中に出くわした不思議な現象。
[ここで](http://learnyouahaskell.com/for-a-few-monads-more#making-monads)扱っているのは

```lang:type
[(a,Rational)]
```

なる型で与えられる、何か値(a)とそれにくっついている確率(Rational)のリストを素朴にラップしてタプルのひとつ目の要素（と確率が確率でいられるようにキチンと処置を施したもの）を目標にMonadにしましょうということです。

まずはFunctor のインスタンスにしなくてはいけませんが、これは簡単で確率（タプルの二個目)には触らずタプルの一個目だけに作用させるという方針で実装します。

そのあとreturn とbind(>>=) を定義するわけですが、定義しただけだと次のように怒られました。

```
[2 of 2] Compiling FAFMM_14         ( FAFMM_14.lhs, interpreted )

FAFMM_14.lhs:1183:12:
    No instance for (Applicative Prob)
      arising from the superclasses of an instance declaration
    In the instance declaration for ‘Monad Prob’
Failed, modules loaded: AFOM_13.
```

該当する箇所はここ。

```file:FAFMM_14.lhs
1183 > instance Monad Prob where
1184 >   return x = Prob [(x,1%1)]
1185 >   m >>= f = flatten (fmap f m)
1186 >   fail _ = Prob []

1190 > -- instance Applicative Prob where
1191 > --  pure x = Prob [(x,1%1)]
1192 >   -- (<*>) :: Applicative f => f (a -> b) -> f a -> f b
1193 >   -- (Prob f) <*> (Prob xs) = 
```

仕方ないのでApplicative のインスタンスを定義しようと考えてる途中で手癖でファイルを閉じた時に発見しました。
すなわち1190行のインスタンスとしての宣言だけコメントアウトをほどくと

```
FAFMM_14.lhs:1190:12: Warning:
    No explicit implementation for
      ‘pure’ and ‘<*>’
    In the instance declaration for ‘Applicative Prob’
Ok, modules loaded: FAFMM_14, AFOM_13.
```

となり、定義は空だけど通るという謎現象。

確かヒエラルキー的には

```math
Monad \subset Applicative \subset Functor
```

なのだが、Haskell にはApplicative があとから導入された経緯があって、Monad のインスタンスが必ずしもApplicative のインスタンスじゃなくても良かったということだというのがここの部分の念頭にあるのだと理解しているのだが、いつの間にかちゃんとこのヒエラルキーを踏襲しましょうとなったのだろうか？

#疑問点
今のところApplicative のインスタンスの定義が書けなくてどうしようか考えているところです。
どなたかいい案があれば教えていただけませんか？
（Monad インスタンスから決まりそうな気がするのですがこんがらがっていて、、、もう少し考えてみます）

また設計段階でMonad しか使わん、Applicative としては使わないとわかっている場合この警告を消せる”良い”宣言方法、どなたがご存知ありませんか？
今のところインスタンスが空なApplicative の宣言だけが放置されているので大変気持が悪くって困っています。
【Objective-C】textFieldにおけるバリデートのかけ方

#### textFieldに入力値の妥当性をチェックする機能を作った際に心がけたことを自分用メモとして。。

## 結論

想定外の値が入力された場合に、その値をきちんとシステムから除外してあげる仕組みを作ること

## 概要

たまたま作っていたiOSアプリに税率を入力する機能を実装することになった。厳密に正規表現で書いても実現はできたが、もっとシンプルに作れないかと考えた。正規表現が嫌いなわけではない。

A. 入力モード : 数字のみ

まず、Objective-Cにはキーボードを文字入力、数字の入力などに切り替えることができる。当然数字のみ入力できるモードも存在する。ここでは数字のみの入力モードを使用する。

```sample.m
self.txtfield = [[UITextField alloc] initWithFrame:CGRectMake(XX, XX, XX, XX)];
self.txtfield.keyboardType = UIKeyboardTypeNumberPad
```

とした。

B. 桁数制限

3桁も考えたが、税率が100%はありえないため、桁数を2桁まで入力できるように制御するようにした。

```sample.m
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    // 最大文字列長を2桁に設定する    
    NSInteger maxLength = 2;
    self.txtfield = [self.txtfield stringByAppendingString:string];
    return [[self.txtField.text stringByReplacingCharactersInRange:range withString:string] length] <= maxLength;
}

```

C. 不正文字の除去

あとは、入力される文字に不正な文字列が混入しないかを考慮すれば良い。
２桁かつ先頭に0が付くものを除外する。

```sample.m
if (valid) {
   BOOL valid = [self.saleField.text hasPrefix:@"0"];
   if ([self.txtField.text length] == 2) {
      self.txtField.text = [self.txtField.text substringFromIndex:1];
   }
}
```

ポイント

+ 入力モードを数字のみにする
+ 文字列長のチェック
+ 不正文字への考慮

## 備考
実装するバリデータの役割に対してやることを予め書き出しておくとスムーズに実装できる。その際には考慮もれが無いようにデータパターンを洗い出しておく必要がある。
Nightmare で スタイルシートを適用する action をつくる

nightmare 2.1.0 で確認

``` javascript
Nightmare.action('css', function(css, done){
   this.child.emit('css', css);
   done();
});

/* 使用例
  yield nightmare.goto('http://example.com').css(`
    body { font-family:"Comic Sans MS" !important; }
  `).wait(1000);
*/
```
underscoreコードリーディング（shuffle）

underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##shuffleとは


###[underscorejs.orgのshuffle](http://underscorejs.org/#shuffle)

こんな説明。
>####_.shuffle(list) 
>Returns a shuffled copy of the list, using a version of the Fisher-Yates shuffle.


```javascript

_.shuffle([1, 2, 3, 4, 5, 6]);
=> [4, 1, 6, 3, 5, 2]

```

------------- 
listのコピーをシャッフルして返す。Fisher-Yates shuffleを用いる。

###[underscore.shuffle](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L348)

コード的にはこのあたり。


```javascript
  // Shuffle a collection, using the modern version of the
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
  _.shuffle = function(obj) {
    var set = isArrayLike(obj) ? obj : _.values(obj);
    var length = set.length;
    var shuffled = Array(length);
    for (var index = 0, rand; index < length; index++) {
      rand = _.random(0, index);
      if (rand !== index) shuffled[index] = shuffled[rand];
      shuffled[rand] = set[index];
    }
    return shuffled;
  };
```

(Fisher-Yates shuffle)[https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC_-_%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB]
を用いている。

いつものようにisArrayLikeを用いて、配列/連想配列かの判定を行う。
配列だった場合はそのまま、連想配列だった場合は_.valuesを用いて連想配列の値のみをsetに代入する。
その配列の数をlengthに代入する。
returnするためのシャッフルした値をいれるための配列shuffledを宣言する。配列の個数はobjに準ずる。

あとはfor文で回す。
for文では_.randomを用いて、0からindexまでのランダムな値をいれる。
randがindexと同値ではない場合、shuffled[index]にshuffled[rand]を代入する。
その後、shuffled[rand]に元の配列のindex番目の値を代入する。



ちなみに_.randomは以下。minとmaxの間の値をランダムに返される。
最速のシャッフルといわれるのは、アルゴリズムが配列の個数N-1しか試行回数(オーダー)が　ないことからである

(_.random)[https://github.com/jashkena
s/underscore/blob/1.8.3/underscore.js#L1322]

```javascript
  // Return a random integer between min and max (inclusive).
  _.random = function(min, max) {
    if (max == null) {
      max = min;
      min = 0;
    }
    return min + Math.floor(Math.random() * (max - min + 1));
  };

```
PukiWiki Plus!の進捗をslackに通知するプラグインを書いた

この記事は [animateLAB Advent Calendar 2015](http://qiita.com/advent-calendar/2015/animatelab "animateLAB Advent Calendar 2015 - Qiita") 22日目の記事です。

@kariaです。いい加減ポエムばっかり書いてないでコードを書きなさい！という声が聞こえた気がしました。

皆さんはチーム内のドキュメント共有にどのようなツールをお使いでしょうか。ブラウザからサクッと書いたり更新したりできるツールですと、古くからあるところでは[PukiWiki](https://pukiwiki.osdn.jp/ "FrontPage - PukiWiki-official")や[WordPress](https://ja.wordpress.org/ "WordPress › 日本語")、最近のイケてるサービスだと[Qiita:Team](https://teams.qiita.com/ "Qiita:Team - みんなが手軽に書ける情報共有ツール")や[esa](https://esa.io/ "esa.io - Expertise Sharing Archives for motivated teams.")などが有名でしょうかね。Google Docsもイイ感じに共有状態で文書を書けますね。

わたしはドキュメント共有にPukiWikiやその派生版である[PukiWiki Plus!](http://pukiwiki.cafelounge.net/plus/ "PukiWiki Plus!")を利用しているチームに遭遇したことがありますが、PukiWikiの問題点として複数人で同じ記事を同時に更新すると**更新の衝突**が発生することが知られています。一応PukiWikiが更新差分を表示してくれるものの、長大な記事で衝突が発生するとなかなかマージが面倒臭いものです。

ということで、PukiWiki Plus!での編集の進捗をslackに通知してくれるプラグインを書きました[^1]。

https://gist.github.com/karia/0964e6a1f71143cb65ac

この `pukiwiki.cls.php` をPukiWiki Plus!の `lib` ディレクトリ配下に置き、 `plugin/edit.inc.php` の進捗を知りたい箇所に以下のようなコードを仕込みます。

```php
$t = new slack();
$t->notice("[編集開始]".$page, $_SERVER['PHP_AUTH_USER']);
```

すると、以下のように編集状況がページ名と共にslackに通知されます。やったー！

![slackの様子](http://g.side2.net/e1e7b6b955c3a2debfc3c3106b58ca81.png "e1e7b6b955c3a2debfc3c3106b58ca81.png (slackの様子)")

このプラグインの利点は、（チャットをちゃんと見ているという前提で）誰がどのページを更新中かわかるため、同時に更新して衝突する事故が発生しにくいということです。編集開始通知が来たあと長時間放置されている場合、その人にmentionを送って「進捗どうですか？」などと確認してあげるとよいでしょう。また、上記画面の例では更新画面を開いたあと何もせずキャンセルボタンを押すことで、明示的に編集を中止した旨を通知しています。

PukiWikiおよびPukiWiki Plus!は古くから利用されているツールではありますが、PHPで書かれていることもあってこのようなプラグインもサクっと書けるのが良いところと感じています。

ちなみに、 `plugin` ではなく `lib` 配下に置いてるのでこれは厳密にはプラグインとは呼べないのかもしれませんが……というオチ。

[^1]: 元々はIRCへの通知プラグインだったものを大幅に改造したものです（原著作者へ公開する旨および記事にする旨の許可を得ています）。
vagrant の中の docker サービスに(vagrant の)ホストから docker-fabric で接続してイメージをビルドする

# はじめに

docker-fabric は、名前の通り、 fabric で対象サーバーに操作を行う時に、 docker のコマンドをいろいろ使えるようにする python パッケージです。 Docker-Map (そして docker-py ) を拡張して定義されている形になっています。

# インストール

docker-fabric のインストールは、 pip を使って行いました。

```shell-session
sudo pip install docker-fabric
```

# ファイル用意

```py:fabfile.py
from fabric.api import run
from fabric.api import env
from fabric.api import task
from dockerfabric import tasks as docker
from dockermap.api import DockerFile
from dockerfabric.apiclient import docker_fabric

env.docker_tunnel_local_port = 22024
env.docker_api_version = "1.20"

@task
def my_task():
    dockerfile = DockerFile('ubuntu', maintainer='ME, me@example.com')
    dockerfile.run('echo hello wolrd > /hello-world.txt')
    docker_fabric().build_from_file(dockerfile, 'hoge_img')
```

# 実行

`fab -H vagrant@127.0.0.1:2222 my_task` を実行すると、 vagrant のパスワードを聞かれるので、 `vagrant` を入力。`hoge_img` イメージが、 vagrant 内の docker イメージとしてビルドされる。
可変長引数をもつ関数(printf, ioctl, etc..)をラップする方法まとめ

可変長引数を持つ関数をラップする方法を調べました。
C++11以降であれば variadic templates を使うのが良いと思われます。

```cpp:test.cpp
#include <stdio.h>
#include <stdarg.h>

// [C++11 ~] variadic templates
template <typename ... Args>
void Printf(const char *format, Args const & ... args) {
    // int printf(const char *format, ...);
    printf(format, args ...);
}

// [C/C++] stdarg
void vPrintf(const char *format, ...) {
    va_list va;
    va_start(va, format);
    // int vprintf(const char *format, va_list ap);
    vprintf(format, va);
    va_end(va);
}

// [C/C++] macro __VA_ARGS__
#define PRINTF(format, ...) printf(format, __VA_ARGS__)

// [C/C++][GCC only] macro ##__VA_ARGS__
#define PRINTF_GCC(format, ...) printf(format, ##__VA_ARGS__)

int main(int argc, char const* argv[])
{
    // [C++11 ~] variadic templates
    Printf("%s : %d\n", "Printf", 20);

    // [C/C++] stdarg
    // va_listをサポートしている必要がある
    vPrintf("%s : %d\n", "vPrintf", 20);

    // [C/C++] macro __VA_ARGS__
    PRINTF("%s : %d\n", "PRINTF", 20);

    // __VA_ARGS__は最低１個引数が必要な仕様なため、カンマが入ってしまい以下はエラーになる
    // PRINTF("PRINTF format only\n");

    // [C/C++][GCC only] macro ##__VA_ARGS__
    // GCC拡張であれば未指定の場合最後のカンマを除去してくれる
    PRINTF_GCC("%s : %d\n", "PRINTF_GCC", 20);
    PRINTF_GCC("PRINTF_GCC : format only\n");

    return 0;
}
```
```shell-session:実行結果
$ g++ -std=c++11 test.cpp && ./a.out
Printf : 20
vPrintf : 20
PRINTF : 20
PRINTF_GCC : 20
PRINTF_GCC : format only
```

# 参考
[本の虫: Variadic Templatesの解説](http://cpplover.blogspot.jp/2010/03/variadic-templates.html)
[c++ - 可変長引数関数のラッピング方法 - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/11487/%E5%8F%AF%E5%A4%89%E9%95%B7%E5%BC%95%E6%95%B0%E9%96%A2%E6%95%B0%E3%81%AE%E3%83%A9%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E6%96%B9%E6%B3%95)
[[C言語] 可変引数マクロの作り方 - Qiita](http://qiita.com/saltheads/items/e1b0ab54d3d6029c9593)
[C／C++での可変引数（stdarg他）](http://www.02.246.ne.jp/~torutk/cxx/tips/varargs.html)
ディストリビューション名の取得方法

``.zshrc``を各ディストリビューション毎に分割していて、以前調べたのでメモ代わりに書きます。

##OSXかLinuxか判別

```.zshrc
case "${OSTYPE}" in
	*darwin*)
		# OSXの場合
		;;
	*linux*)
		# Linuxの場合
		;;
esac
```
OSXかどうかはこれだけでおk
問題はLinux、お前や…
CentOSもUbuntuも、``echo ${OSTYPE}``したら``linux-なんちゃら``と表示されどれなんだかわからない。


##Linuxのディストリビューション名の取得
調べたところ2通りの方法があるようだが、``/etc/``の中にある``os-release``というファイルの中から抜き出すのが良さげ

```.zshrc
distribution=`cat /etc/os-release | awk -F'["]' 'NR==1{print $2}' | awk '{print $1}'`
```

これで万事解決！！
なんてことはない小ネタでした。
littleBits Arduinoを使ってハマったこと



## littleBitsとは

http://littlebits.cc/

- 電子回路モジュール
- 磁石でくっつけて電子回路を完成させる
    - スピーカー・モーター・ファン・LEDなどアウトプットはいろいろ

動画：https://youtu.be/QixV_Hlh2CM

## littleBits Arudino

- ベースはArduino Leonardo
- ボタンやつまみも入ってます
- モーターも入っている

http://jp.littlebits.com/kits/arduino-coding-kit/

![スクリーンショット 2015-12-21 16.43.29.png (336.5 kB)](https://img.esa.io/uploads/production/attachments/409/2015/12/21/1759/17db560e-9372-41d1-a469-d06556f2f80d.png)


![スクリーンショット 2015-12-21 16.46.39.png (226.5 kB)](https://img.esa.io/uploads/production/attachments/409/2015/12/21/1759/e73db97f-3f3c-4102-b385-da2d0784da27.png)


こちらが本体です。手のひらに乗るサイズ。


## 触っていてハマったところ

 littleBits Arduino + [シンセサイザーKit](http://shop.zettalinx.co.jp/?pid=86438871)で[MOZZIライブラリ](http://sensorium.github.io/Mozzi/)を使って音を鳴らしたりしました（その時の資料は[こちら](https://esa-pages.io/p/sharing/409/posts/461/2ce07a4c9936b28de6df.html)）

そこでハマったのが

- **インプットモジュール（青いモジュールです）をつけないとポートが読み込まれない**
    - USBから電源供給されません。

- **Analog or pwmの切り替え**
    - 基板にスイッチが付いているからちゃんと切り替えましょう
   
## 感想

短い内容でしたが、littleBits Arduinoでハマった点です。Arduinoを触ったことある方でしたら、詰まらず触れるんじゃないかなと思います。
littleBitsを使えば回路モジュールを入れ替えるだけで簡単に動かすことができるので、プロトタイプするならLittle Bitsはおすすめです！モーターからシンセサイザーまでなんでもやれちゃいますよ！今ならホリデーセールが行われているのでぜひチェックしてみてください〜！
http://www.korgonline.com/products/list.php?category_id=80
ログの監視時にログを自動改行させる


tail -fでログを監視している時にログが詰まり過ぎるとどこまで見ていたかが分からなくなるから

Enterで改行させて
またログ出たら改行させて
またログ出たら改行させて
………

の繰り返しがとにかく面倒なので自動で改行を入れてくれるコマンドを実行する

#10秒毎に一回改行させる場合
```
while :;do echo; sleep 10; done & 
```

すると…
![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/8113/16d23ead-eb5d-9059-fddb-f511f972d489.gif)



これでEnter押しまくって改行させる手間がなくなる!!
え、less？そんなの知りません！！

エイリアスとして登録しておくと更に便利感がアップ。
プロセスをkillするまで止まらないところとか最高。

。（あまり使い勝手が良くないので、もっとスマートなやり方あるといいのですが、、
結婚式2016/1/4までの道のりをBitbucketで管理している話


この投稿は<a href="http://qiita.com/advent-calendar/2015/atlassian">Atlassian Advent Calendar 2015</a>20 daysの記事です。

# はじめに

来年、2016年1月4日に入籍をして、晴れて人妻になります。嬉しいですね。
嬉しいことだらけなんですが、入籍までに下記のタスクが発生します。
## 2016年1月4日 入籍PJで発生するタスク
* 100_婚姻届を貰いに行く
* 200_婚姻届の承認の署名および押印をもらう
 * 201_新郎側
 * 202_新婦側
* 300_戸籍謄本取り寄せ
 * 301_新郎本籍
 * 302_新婦本籍
* 400_婚姻届提出先選定
* 500_氏名変更手続き
 * 501_銀行口座
 * 502_ケータイ電話
 * 503_ネット契約（多分まだ私のまま）
 * 504_生命保険
 * 505_会社届け（年金手帳、健康保険証）
 * 506_パスポート
 * 507_奨学金
 * 508_クレジットカード

だいたいこんなところでしょうか。
苗字変わると手続き的な問題で面倒くさいですが、 **苗字をリファクタリングすることは小さい頃からの憧れ** だったので、ちょっとだけワクワクしています。ちょっとだけ…
（戸籍変更におけるRename機能の実装はまだですか…）

以上が入籍プロジェクトだとしたら、次に挙式プロジェクトもタスク管理する必要があります。
入籍の3ヶ月後に結婚式披露宴を執り行うのですが、まぁほんとにやることがいっぱい！
なので、今回は割愛します。

上記をBitbucketのタスクにします。
<img width="400" alt="課題を作成できる画面" src="https://qiita-image-store.s3.amazonaws.com/0/86461/4a15202f-84e0-b77e-c9f9-ee306657d1c3.png">

# 入籍における戸籍変更のGitFlow

入籍で発生する手順や関係する人を考えると、Git Flowは下記のよう定義して運用できるかと思います。
<img width="400" alt="Branchの種類は4つ。MasterBranch, ReleaseBranch, FuturesBranch A, FuturesBranch Bとわけるとする。" src="https://qiita-image-store.s3.amazonaws.com/0/86461/6afc7f0a-02e6-53e5-d6a3-79384414c2e6.png">
<img width="400" alt="Branchの種類は4つ。MasterBranch, ReleaseBranch, FuturesBranch A, FuturesBranch Bとわけるとする。" src="https://qiita-image-store.s3.amazonaws.com/0/86461/ab94953a-9274-15de-6e94-6eac435648ed.png">

以上をBitbucketで運用してみます。

# SourceTree×Bitbucketでの運用
## 1. まず、localにRepositoryをcloneします。
<img width="400" alt="新規にクローン" src="https://qiita-image-store.s3.amazonaws.com/0/86461/4f3760c0-a146-d1af-b7e7-2dc7366177f2.png">

## 2. 手に入れた婚姻届をcloneした自分のRepositoryに入れてpull/commitします。ちゃんと取ってきたよコメントを入力します。
<img width="580" alt="20151220_06.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/06d86501-dbbc-61e0-27ba-7fdef9a27bbc.png">

## 3. ブラウザのBitbucketでcommitされてることを確認します。
<img width="940" alt="20151220_07.png" src="https://qiita-image-store.s3.amazonaws.com/0/86461/f0d8646a-f629-6406-3fdf-078c43a4f3b4.png">

しまった、commitするときにタスクNo.を記載してるとベストだった〜〜！
次からは気をつけたいです。

# さいごに

まだまだタイミング的に先のタスクがあるので、またまとまったら報告したいです。その頃には綺麗なGitBranchで入籍への道順ひけてるんだろうなあ！楽しみです。

年末に実家へ帰って父親の署名をもらってきます。
私の勝負は入籍してからの手続きですわ…
git diff -bとgit diff -wの違いを調べた

## はじめに

`git diff`のヘルプを読んでみた。

```
-b, --ignore-space-change
           Ignore changes in amount of whitespace. This ignores whitespace at line end, and considers all other sequences of one or more whitespace characters to be equivalent.

-w, --ignore-all-space
           Ignore whitespace when comparing lines. This ignores differences even if one line has whitespace where the other line has none.
```

要約すると
`git diff -b`はスペースの違いを無視する(ignore-space-change)
`git diff -w`は全てのスペースの差分を無視する(ignore-all-space)

ふむふむなるほどよく分からん。
`-w`の方は全てを無視するから単純で理解しやすい。
`-b`の方はもう少し挙動を調べる必要がある。

## git diff -bの挙動

```
a = b
  ↓
a =                      b
```
ってやっても差分は出ない
ただし

```
a=b
 ↓
a=     b
```

ってやると差分が出る
要するに既にあるスペースにいくらスペースを足しても差分として無視するけど、新規のスペースは無視しないっていう感じっぽい

## おわりに

違いが分からずに使っていて差分もよく分からず見ていたけど挙動が分かってスッキリ
NSDecimalNumberを切り捨て(floor)する

# Solution

```swift
func floorDecimal(number: NSDecimalNumber) -> NSDecimalNumber {
  let behavior = NSDecimalNumberHandler(roundingMode: .RoundDown, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
  return number.decimalNumberByRoundingAccordingToBehavior(behavior)
}

floorDecimal(NSDecimalNumber(string: "55.55")) // => 55
```

# 参考

[How to split a NSDecimalnumber between decimal & integer & back](http://stackoverflow.com/questions/488376/how-to-split-a-nsdecimalnumber-between-decimal-integer-back)