OmniAICreator/Qiita-1.07M huggingface dataset:
UILocalNotificationのregion通知（Geofencing）において、出た時もしくは入った時のみ通知を出す方法 #iOS #Swift

#iPhone(Swift)でGeofencing！
通常SwiftでGeofencingをやろうとするとUILocalNotificationのscheduleLocalNotificationを活用した例が出てきます。

しかしこの状態だと出入りした時２つのイベントを拾ってしまいます。
場合によっては、入った時もしくは出た時のイベントのみ欲しいと時もあると思います。

```:AppDelegate.swift
//指定したフェンスに出入りした時に通知を出す

func notifications() {
    let coordinate = CLLocationCoordinate2DMake(character.latitude,character.longitude)
    let radius = 3000.0
    let identifier = character.id
    let notification = UILocalNotification()
    notification.regionTriggersOnce = false
    notification.alertBody = "指定したフェンスを出入りしたよ！"
    notification.regionTriggersOnce = true
    notification.region = CLCircularRegion(center: coordinate, radius: radius, identifier: identifier)
    
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
```

#解決方法
CLRegionのコードを読んだら定義を発見しました。

```:CLRegion.m
    /*
     *  notifyOnEntry
     *
     *  Discussion:
     *    App will be launched and the delegate will be notified via locationManager:didEnterRegion:
     *    when the user enters the region. By default, this is YES.
     */
    @available(iOS 7.0, *)
    public var notifyOnEntry: Bool
    
    /*
     *  notifyOnExit
     *
     *  Discussion:
     *    App will be launched and the delegate will be notified via locationManager:didExitRegion:
     *    when the user exits the region. By default, this is YES.
     */
    @available(iOS 7.0, *)
    public var notifyOnExit: Bool

```
CLCircularRegionの（notifyOnExit）もしくは（notifyOnEntry）をそれぞれ設定するだけ

```:.swift
let region = CLCircularRegion(center: coordinate, radius: radius, identifier: identifier)
    region.notifyOnExit = false
    region.notifyOnEntry = true
```

#notifyOnExitとnotifyOnEntryを実装したコード
```:AppDelegate.swift
//指定したフェンスに入った時のみ通知をだす

func notifications() {
    let coordinate = CLLocationCoordinate2DMake(character.latitude,character.longitude)
    let radius = 3000.0
    let identifier = character.id
    let region = CLCircularRegion(center: coordinate, radius: radius, identifier: identifier)
    region.notifyOnExit = false
    region.notifyOnEntry = true
    let notification = UILocalNotification()
    notification.regionTriggersOnce = false
    notification.alertBody = "指定したフェンスに入ったよ！"
    notification.regionTriggersOnce = true
    notification.region = region
    
    UIApplication.sharedApplication().scheduleLocalNotification(notification)
}
```

#参考資料
[Remove fired Location-Based notification when user exits region](https://firebase.google.com/docs/crash/　"Firebase Crash Reporting")
AWS API-Gateway でLambdaの結果に合わせてリダイレクトする



ほぼ表題で言い切っちゃってるんですが、そういうことやりたいです。

## tl;dr

* Lambda がリダイレクト先のURLを含めたJSONデータを返す
* メソッドレスポンスを302(あるいは301)にして、レスポンスヘッダーに `Location` を定義する
* 統合レスポンスで302に対して、ヘッダーのマッピングで `Location` に `integration.response.body.location.フィールド` を指定する

## やることその１：リダイレクトURLを含んだ結果を返すLambdaをAPI-Gatewayに通しておく

Lambdaとしては、例えば `{"location":"http://example.com/"}` といったレスポンスを返せばOKです。
フィールド名は適当に `location` としてますが、それこそ `redirect_url` でもいいし `hoge` でも `fuga` でもお好きにどうぞ。

例えばこんな感じのLambdaをそれこそ適当に用意して、
API-Gatewayから呼び出すようにしておきます。

```js
exports.handler = function(event, context) {
  context.succeed({location: 'http://example.com/'});
};
```

## やることその２： リダイレクトのためのメソッドレスポンスを作る

API-Gateway の設定画面で「メソッドレスポンス」を開くと、
デフォルトで200が定義されてると思いますが、今回はリダイレクトさせたいので、
200はおもむろに消します。

「＋レスポンスの追加」をﾎﾟﾁｰっとして、「HTTPステータスコード」のところに「302」（301でもいいよ）を入力して「✔」ボタンをポチります。
「▼ 302」が増えるはずなので「▼」をﾎﾟﾁｰっとして、「ヘッダーの追加」をポチーっとすると、名前を入力するところがでてきます。
そこに「 `Location` 」を入力してください。

これで、レスポンスヘッダにLocationが含まれることが定義されています。
が、これだけだと何の値が返るかは未定義なので、統合レスポンスで値を定義します。

## やることその３: レスポンスヘッダLocationに値をマッピングする

やりたいことは、Lambdaが返した `{location: 'http://example.com/'}` の `location` フィールドの値を、
「メソッドレスポンス」で定義した「 `Location` 」にマッピングしたいわけです。

統合レスポンスの設定を開いて、ここでもデフォルトで200が定義されていますが、
それはおもむろに削除して、「統合レスポンスの追加」を行います。

* Lambdaエラーの正規表現: `.*`
* メソッドレスポンスのステータス: 302

追加したら「ヘッダーのマッピング」に　`Location` があると思いますので、
「マッピングの値」のところに `integration.response.body.location` を定義します。

Lambdaの返り値を `integration.response.body` で参照できるようになっていますので、
これで `Location: http://example.com/` なマッピングができる事になります。

デプロイして確認すると、リダイレクトされることを確認できます。めでたしめでたし。


## 参考
* [Amazon API GatewayがLambdaのレスポンスからのリダイレクトとかに対応してた](http://b.denkizakana.com/2015/12/amazon-api-gatewaylambda.html)
* [HOW TO: HTTP REDIRECTS WITH API GATEWAY AND LAMBDA](https://rpgreen.wordpress.com/2016/01/04/how-to-http-redirects-with-api-gateway-and-lambda/)
Unity5.3.x等のプロジェクトをUnity5.4.xで開いた後で、再度Unity5.3.xで開くとシェーダーがおかしくなっている時のヘルプ

# 再度開いたら、シェーダーが赤紫色…？

Unity5.3.x等で作成したプロジェクトをUnity5.4.xで開いた後、再度Unity5.3.xで開き直した時に、シェーダーが赤紫色になっていることがあります。

![0720-10_06.png](https://qiita-image-store.s3.amazonaws.com/0/12313/65a65f91-9b07-d385-f3e4-e328eb53498d.png)

これは、5.4.x以前のバージョンのUnityで作成されたプロジェクトをUnity5.4.xで開いた場合、Shader auto updaterが適用されてシェーダーファイルが書き換えられているのが原因です。

一度、書き換えが行われると、Unity5.3.xとの互換性がなくなってしまいますので、以下の手順で直してみてください。なお修正には、IDEもしくはテキストエディタが必要ですので、元のシェーダーファイルはバックアップしておいたほうがよいでしょう。

# エラーが出ているシェーダーを確認する

まずはエラーが出ているシェーダーファイルを確定しましょう。
エラーが出ているシェーダーファイルをInspectorで確認すると、Errorという欄に大体の情報が出ています。

![0720-10_01.png](https://qiita-image-store.s3.amazonaws.com/0/12313/87653dd2-fa81-2597-486a-b6c5c5891fb7.png)

この場合、「unity_ObjectToWorld」という単語が宣言されていないので、認識できないということを示しています。

次に該当するシェーダーファイルを、IDEやテキストエディタで開きます。
すると１行目に以下のようなコメントがあります。

![0720-10_02.png](https://qiita-image-store.s3.amazonaws.com/0/12313/eb157bcc-cad5-0c9a-3a70-440cffd7feba.png)

このコメントは、Unity5.4.xのShader auto updaterが書き換えた部分を示しています。
この場合、元の「_Object2World」を「unity_ObjectToWorld」で書き換えたという意味です。

書き換えられた「_Object2World」という命令は、Unity向けのシェーダーの中では良く使われる命令ですので、この部分が書き換えられてしまったためにエラーが出ているということです。

# IDEで書き換えられた部分を全置換する

再修正すべき部分が特定されれば簡単です。該当部分を元に戻すように全置換すればOKです。
今回はVisual Studioでやってみました。
Ctrl+Hを押して、クイック置換ウィンドウを出します。
メニューから出す場合には、以下の手順です。

![0720-12_02.png](https://qiita-image-store.s3.amazonaws.com/0/12313/359d3720-7d15-8b8d-4447-f2a67c848b28.png)

![0720-10_03.png](https://qiita-image-store.s3.amazonaws.com/0/12313/096b05f2-2966-1fd0-149a-576f3c8efb28.png)

置換が終了し、シェーダーファイルをセーブした後で、Unity5.3.xに戻ってくるとシェーダーファイルのエラーが消え、表示も元通りになっていることが確認できます。

![0720-10_05.png](https://qiita-image-store.s3.amazonaws.com/0/12313/3863f578-68dd-85e7-59d1-1325edd4ae47.png)

# 新バージョンを試す時には、必ずプロジェクトのバックアップを取っておこう！

Unity5.4.x以前で作成したプロジェクトをUnity5.4.xで開く場合、それ以前のバージョンのUnityでも開く可能性がある場合には、Unity5.4.xで開く前に必ずバックアップをとっておくことをお勧めします。

もし誤って書き換えをしてしまった場合で、シェーダーにエラーが出ている時にはこちらの手順を参考に書き換えが行われたポイントを特定してみてください。

特に今は、Unity5.4.xへの移行期かと思いますので、十分注意した上で、新機能をお試しください！

Enjoy Your Happy Unity Life :-)

※本記事は、Unity5.3.5f1とUnity5.4.0f1で検証しています。
突然Bitbucketにgitで接続できなくなったらIPv6関連を疑ってみるとよいかも 2016/07/20

## 発生した問題
本日突然MacからBitbucketへの通信ができなくなりました。
git push や git clone のレスポンスが帰ってきません。

## 原因と解決方法
なぜかIPv6で接続するようになってしまったためで、強制的にIPv4で接続するようにすることで解決しました。
強制的にIPv4で接続するには下記の設定を行います。

```text:~/.ssh/config
Host bitbucket.org
  HostName bitbucket.org
  AddressFamily inet
```

## git の通信を調べる方法

下記のstackoverflowに書いてあった方法です。
http://stackoverflow.com/questions/16906161/git-push-hangs-when-pushing-to-github

1. 下記のようなファイルを用意して実行権限をつけます。

```bash:~/sshv.sh
#!/bin/bash
ssh -vvv "$@"
```

2. GIT_SSH環境変数にシェルのパスを指定して、gitコマンドを実行します。

```bash
GIT_SSH=~/sshv.sh git fetch --verbose origin
```

## 追記

2016/07/20 17:50 現在にはこの問題は当方の環境では発生しなくなりました。
また、このような問題が起きた場合、GIT_TRACE_PACKET=1 というGIT環境変数を設定すると問題解決に役立つかもしれないとbitbucketの中の方に教えていただきました。
パケットレベルでの通信内容がわかるらしいです。
【メモ】Promiseの書き方の自分ルール

この文書は
---

JavaScript Promiseに関する個人的なメモです。

Promise初心者の悩み
---

Promiseはチェーンでコールバックスパゲティを避けていい感じに書けます。

しかし、Promiseには、Promise.resolve()などの省略メソッドや、return値の自動Promiseラッピングの機構などなど見えない機構がもろもろ含まれています。
さらにサンプルごとにこれらの組み合わせが異なっていて、結果的にうまく書かないと、あれ？どうすればいいかわからないぞ？となったりしたので、自分なりに編み出した自分ルールをメモしときます。

失敗コード
---

初心者（自分）のコードと脳内はこんな感じでした。

```bad.coffee
# コールバックを受け付ける非同期関数
func1 = (f) ->
  setTimeout () ->
    f('result1')
  , 500

func2 = (f) ->
  setTimeout () ->
    f('result2')
  , 500

value = []

new Promise (resolve, reject) ->
  func1 (result) ->
    # ここはthenじゃないから引数がないのか
    # チェーンの外のローカル変数valueに直接アクセスするか
    # なんか気持ち悪いけどまあいいか・・・
    value.push(result)
    
    # ここはOK
    resolve(value)
.then (arg) ->
  func2 (result) ->
    # ここはthenの引数でvalueにアクセスができる。
    # なんか統一性がないなぁ・・・
    arg.push(result)
    
    # あれ？resolveできないぞ？
    # func2のcallbackの中だからreturn Promise.resolve()とかやってもだめだ
    # チェーンが切れる・・・
.then (arg) ->
  # 呼ばれない
  console.log(value)
```

### 問題点１：thenの中でresolveできない・・・

resolveしたいんですが、あれ？thenのなかからresolve呼べないの？となってます。
各種サンプルではreturn Promise.resolve()とやっているコードが出てきたりしますが、コールバックの中からはreturnができません。(コールバックの戻り値になってしまうため）

thenの中でコールバックが出てこなければPromise.resolve()でいいんですが、わざわざPromise使う理由はコールバックの連鎖をきれいに書きたいからなので・・・。

### 問題点２：チェーンの中から外側のローカル変数にアクセスしている・・・

まあいいんですが、結合度が高くてなんか気持ち悪い。

今のコード
---

今は下記のような書き方をするようにしています。

```good.coffee
# コールバックを受け付ける非同期関数
func1 = (f) ->
  setTimeout () ->
    f('result1')
  , 500

func2 = (f) ->
  setTimeout () ->
    f('result2')
  , 500

Promise.resolve([])
.then (arg) ->
  return new Promise (resolve, reject) ->
    func1 (result) ->
      arg.push(result)
      resolve(arg)
.then (arg) ->
  return new Promise (resolve, reject) ->
    func2 (result) ->
      arg.push(result)
      resolve(arg)
.then (arg) ->
  return new Promise (resolve, reject) ->
    # 呼ばれる
    console.log(arg)
    resolve(arg)
```

自分ルールは下記の感じ。

* チェーンの始まりはPromise.resolveにしてチェーン内で引き回すパラメータを渡す
* すべてのthenの中でPromiseをnewしてreturnする
  * Promiseでない値をreturnすることはしない
* コールバックパラメータの方のresolveで解決を明示する
  * return Promise.resolve()は使わない

終わりに
---

この書き方に統一して下記の改善を得ました。

* コールバックの中からresolveが呼べる
* チェーンの外側の変数に直接アクセスしないでよくなり、結合度が下がる

でも毎回thenの中でnew Promiseを書くの面倒だな・・・。
thenのパラメータあたりにresolve, rejectが自動的に渡ってくればいいのに。

追記
---

* コメント欄にてアドバイスをいただき、promisifyすることでいい感じに書けるという情報を得ました
* promisifyすることで魔法のような現象がおきました
    * 勝手に戻りがPromiseになる
    * 自動でresolveされる
    * しかもresolveの引数にはthenの戻り値が入ってくれる（＝次のチェーンの引数になる）
* ひと手間かかりますが、これは素晴らしい

#### promisify版

```promisify.coffee
# コールバックを受け付ける非同期関数
func1 = (f) ->
  setTimeout () ->
    f('result1')
  , 500

func2 = (f) ->
  setTimeout () ->
    f('result2')
  , 500

promisify = (f) ->
  return ->
    new Promise (resolve) ->
      f(resolve)

funcP1 = promisify(func1);
funcP2 = promisify(func2);

Promise.resolve([])
  .then (arg) ->
    funcP1().then (result) ->
      arg.push(result)
      return arg
  .then (arg) ->
    funcP2().then (result) ->
      arg.push(result)
      return arg
  .then (arg) ->
      console.log(arg)
```
EmacsがRubyに差し込むMagic Commentを一掃する

Ruby2.0以降.rbファイルのデフォルトのエンコーディングがutf-8になったので以下のようなマジックコメントはいらなくなりました。

```rb:user.rb
# -- coding: utf-8 -*-
class User < ActiveRecord::Base
  # ...
end
```

まずEmacs側で再発するのを防ぎます。
[Emacsのruby\-modeでマジックコメントの自動挿入を停止する \- Qiita](http://qiita.com/ongaeshi/items/5b2544d81146a000e638)

```el:init.el
(custom-set-variables
 '(ruby-insert-encoding-magic-comment nil))
```

次に既存のコードベースを綺麗にします。
sedで掃除をしようとすると、[改行を取り除く構文がしんどい](http://qiita.com/hidekuro/items/56acc773db777100bf09)のでPerlを使いました。
Perl便利ですね。

```bash
find . -type d ( -name "vendor" -o -name "tmp" -o -name "public" )\
 -prune -o -type f -name '.rb' | xargs perl -pi -e "s/# -\- coding: utf-8 -*-\n//g"
```

こんな感じで一掃しました。Rubocopにも設定を加えておくとなお良い。
これでautocorrectも効くようになる。

```yaml:.rubocop.yml
  Style/Encoding:
    Enabled: true
    EnforcedStyle: never
```
Javaだけで、webのフロントとサーバが作れるGWTを始めませんか？

みなさん、こんにちは、最近では、webアプリケーションではフロントとサーバが分かれて作業することは当たり前なのですが、はっきり言って、覚えることがおおすぎませんか？

GWTなら、webアプリケーションのフロントとサーバをjavaだけで作成できます。

GWTはもともと、Googleが提供していたツールで、Google Web　Toolkitというものを略して、GWTとしています（ぐいっと）と発音。
GWTは、javaから各ブラウザに対応した、javascriptを最適化した形で自動生成します。
また、ブラウザ間の互換性を保ちつつ作成できるので、IE,Chrome,Firfox,safariなどのブラウザ互換問題をかなりクリアできます。

また、GWTはJavaをベースに作成するので、比較的大きなアプリケーションも作成できます。
現在GWTはオープンソースとして公開され、誰でも利用する事ができます。
実際に私もちいさなものから、非常に大きなアプリケーションまで作成できております。

http://www.gwtproject.org/

http://gwt.keicode.com/
読書感想文 : 減らす技術

私の友人がブログでこの本を紹介していたので読みました。

私は片付けが好きで、定期的に洋服を捨てたり本を売ったりして家にある物を少なくしているわけですが、この本では、物理的なことだけではないところまで書かれています。
だから「捨てる」技術ではなく、「減らす」技術なんですね。


# 本質に迫る

~~~
はじめにしっかりと選んでから、それ以外の余計な部分を減らす。ただやみくもに減らすだけでは、大事なところまで削ぎ落としてしまいかねない。

p.44
~~~

自分は何を大事にしたいのか？ それを決めて、初めてスタート位置に立てる、といったところでしょうか。
私はまだ…分かっていません😱 スタート位置に立てていない状態なのでこの本に書いてあることをまだあんまり実践できていないです。

# 習慣化

~~~
あなたが起こした前向きな変化を長続きさせること。人生の改善には不可欠だ。

p.72
~~~

実践できていない？いやそんなことはなかった。
この本を通勤中に読んで朝会社に来て速攻でデスクの周りを片付けましたし、あとシングルタスクを心がけるために、メールは開きっぱなしにしないことにしたのと、仕事中は私用のiPhoneの電源をきりました。それらは既に習慣化している（かも？）

毎日続けないと達成できないことって沢山ありますよね？
例えば、健康になりたい！だったら、ランニングを毎日続けることが大事だよね？
朝起きたら歯磨きをするぐらいに習慣化してしまえばこっちのもの…という感じで、習慣化するためのノウハウも教えてくれています。
本の著者は、何を習慣付けすればいいか分からない迷える子羊たちに、「12の基本習慣」を勧めています。ここにそれを書いちゃうと営業妨害になりそうな気がするので、気になる方は本を読んでみてください。

# まとめ

まとめますと、この本は私のバイブルになりそうです。
何かを習慣付けしたいなーとか、何かを成し遂げたいなーと思ったときにこの本に書いてあることを実践してみるのが最短経路になるんじゃないでしょうか。
この本を読んでいて「これも同じようなことかな」と思ったのが、会社のすごいプログラマーが言っていた一言：

~~~
「これは必要かもしれない」は、要らない
~~~

アプリの機能を作る時に、この言葉を思い出すようにしてむやみやたらに新機能を作らないように心がけています。
やりすぎ注意ですがw
キックオフで伝えるべきこと①

キックオフをするとき用の備忘です。

伝えるべきことは以下の通り

# 目的
このプロジェクトの目的を共有する。
たとえば、

- 「○○システムをローンチする」
- 「ユーザー数を○○人増加させる」
- 「○○キャンペーンを成功させる」

などがあります。

考え方的には、
「これ（目的）が達成されたら解散。」
というものを掲げる。


# 目標
このプロジェクトで成し遂げる目標を共有する。
たとえば、
「品質を確保し、期日内にローンチする」
など。

期限が厳しいものであれば、品質を犠牲にすることもあるので、
関係者で合意の上
「致命的なBugは0件、軽微な不具合は、ローンチ後1か月以内に改修する」
というものもあります。

※ この場合のプロジェクト解散は、ローンチ時点ではなく、ローンチ後の改修完了時点となります。

考え方的には、
目的と合っているものを掲げる。

目標は具体化されたもの(目標値を明示する)という考え方もありますが、
私は必須ではないと思っています。


# 背景
このプロジェクトが発足した経緯などを共有します。

たとえば、

- 「○○業務の効率化をしたい。」
- 「○○サービスの魅力を高めたい。」
- 「○○部門の新しいビジネスを○○年以内に立ち上げたい。」
など。

考え方的には、
「なんで　このプロジェクトをやろう　ということになったか？」
という事を話すとよいと思います。

「メンバーに理解してもらうことで、目標や目的の理解度を高められるようなこと。」
だとよりよいです。

# つづく

前半は以上です。

いかがでしょうか？

書いてみると意外と理解が不足しているものなので、キックオフ前に資料を整理しておくと、当日スムーズです。

後半では、

- 体制
- 役割分担
- スケジュール

について書いていきたいと思います。
【プログラマーのための数学】ベクトルの内積

## 目次
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)

## ベクトルの内積とは
ベクトルの内積とは2つのベクトルの要素を順番にひろって、それらを掛け合わせたものを全部足したもののこと。スカラー積とも呼ばれる。

```
a→・b→ = a1b1 + a2b2 + a3b3 + ・・・ = Σ[i=1 to n] x[i]y[i]
```

内積は、a→・b→このように「・」を使って表します。
[外積](http://qiita.com/Esfahan/items/6cf3e270e61d1f514433)は、a→×b→このように「×」を使って表します。

- 平面ベクトルの場合

```
a→ = (a1, a2)
b→ = (b1, b2)
a→・b→ = a1b1 + a2b2
```

- 空間ベクトルの場合

```
a→ = (a1, a2, a3)
b→ = (b1, b2, b3)
a→・b→ = a1b1 + a2b2 + a3b3
```

- a→・b→のなす角が90°のとき

```
a→・b→ = 0
```


## 公式

a→,b→のなす角をΘとするとき、下記の公式で内積を求められる。
0°< Θ < 90°

```math
a→・b→ = |a→| |b→|cosθ
```

証明の仕方を知りたい方はこちら
[内積の値の幾何学的検討](http://w3e.kanazawa-it.ac.jp/math/category/vector/henkan-tex.cgi?target=/math/category/vector/naiseki_no_zutekirikai.html)


## 図で解説

![vector_002.png](https://qiita-image-store.s3.amazonaws.com/0/105936/8b927165-ffaa-5842-5c19-d219ff46f948.png)
出典：http://d.hatena.ne.jp/Zellij/20130216/p1

左の箱にFの力が加えられたとき、箱はd進む。このとき、この箱になされた仕事は、Fとdの内積と等しいという。

### ヨットの例
![vector_003.gif](https://qiita-image-store.s3.amazonaws.com/0/105936/508f804f-4b09-2ecc-94f1-35d62aca51ff.gif)
出典：http://naop.jp/topics/topics14.html

風速1mの風で3m進むヨットがあるとする。
ヨットの進行方向に向かって60°の方向へ風速2mで風が吹いたとする。
この場合、ゴールに進むのに役立つ風は1mしかない。（2×cos60°=1）
b→という風は，a→の方向に1m分の仕事をしたということになる。
この「1m」という数値がa→とb→の内積である。

### bが90°のとき
bが90°の風ではヨットは進まないので、
内積は 2×cos90°×3より「0」。
　「垂直ならば内積が0」

90°より大きい風が吹いた場合は、ヨットはマイナスに進む。


## まとめ

```math
a→・b→ = |a→| |b→|cosθ
```

|b→|cosθという部分は、b→が，a→の方向にどれだけの影響を与えるかということを意味している。

[参考]
[KIT数学ナビゲーション](http://w3e.kanazawa-it.ac.jp/math/category/vector/henkan-tex.cgi?target=/math/category/vector/naiseki.html)
[Hatena::Diary](http://d.hatena.ne.jp/Zellij/20130216/p1)
[naop.jp](http://naop.jp/topics/topics14.html)

[関連記事]
[プログラマーのための数学 - 目次](http://qiita.com/Esfahan/items/ab63e7c5bcf812dff2a9)
rpmとかyumとかよくわからず使ってないか？


## はじめに

yum, rpm。使えるし、何となく分かる。
よくわからないエラーもstack over flowのQAを見たら何となくうまくいった。
そんな状況になってませんか？

何を隠そう、それが私です。
そろそろ理解しておかないとまずいし、意外と同士が多いんじゃないかと思い、
この記事を書くことになりました。

### パッケージってなんだ？

yumやrpmは所謂パッケージ管理ツールです。

パッケージは今と昔で少し異なります。

#### 昔のパッケージ

* ソースコードだけ提供
* コンパイルは自分でやって使う

#### 最近のパッケージ

* コンパイル済みのバイナリ・依存関係のあるファイルを提供
* インストールしたらすぐ使える

色んな変化を遂げてきた訳ですが、これらをひとまとめにしたものをパッケージと呼びます。

## rpmとyum

パッケージ管理ツールには2大勢力があります。
それがrpmとyumです。

### rpm

* redhat package managerの略
* パッケージ間の依存関係は分かってるが、自動的に解決はしない

### yum


* Yellow Down Updater Modifiedの略
* パッケージの依存関係を自動解決
	* 依存するパッケージも一緒にダウンロードしてくれる
	* これはrpmにはない嬉しい機能

##### リポジトリってなんだ？

yumを使ってると、remiとか、epelとかいろんな`リポジトリ`という言葉がよく出てきます。
簡単に言えば、リポジトリはパッケージの置き場所です。

OS上には`/etc/yum.repos.d/`というディレクトリがあり、ここのリポジトリの情報を参照して、インストールしている。

基本的には、`/etc/yum.repos.d/CentOS-Base.repo`ここに書かれている設定を参照するため、
yum search等で探しに行くときは、ここの書かれたリポジトリを探しに行ってます。

次の章で話しますが、よくyumでパッケージをインストールしようとした時に、見つからなかったり、
古いものしかなかったりします。
そんな時はリポジトリを変更したりしてインストールします。

### 別のリポジトリを使う

yuｍでは、他にもepelやremi等のリポジトリがあり、そっちのリポジトリにはソフトウェアが存在してる場合があります。
その際には、下記のように`--enablerepo`オプションをつけて、使うリポジトリを明示的に指定します。

`yum install --enablerepo=remi,epel php`


## yumでよく使うコマンド一覧

* インストールする
	* `yum install ソフトウェア名`
* 今までダウンロードしたパッケージを削除
	* `yum clean packages`
* ソフトウェアを更新する
	* `yum update ソフトウェア名`
* ソフトウェアをアンインストールする
	* `yum remove ソフトウェア名`
* すでにインストール済みのソフトウェア一覧を確認する
	* `yum list installed`
* インストール可能なソフトウェア一覧を表示
	* `yum list`
* インストールしたソフトウェアでアップデートが出来る一覧を表示
	* `yum list uddates`
* ソフトウェアの詳細情報を表示
    * `yum info {ソフトウェア名}`
文書群におけるIDFの算出時には対数の底を1.5前後にするといい感じになった


TF-IDF cos類似度を利用したコンテンツベースのレコメンドエンジンを開発しようとしているのですが、素人ゆえになかなか上手く事が運びません。

今日はIDFの算出で四苦八苦しました。ちなみに今回は、 "評価対象の文書群 = IDF算出に用いる文書群" です。IDF算出は基本的に以下と式としています。

```rb
# Nは全文書数。nは特定の単語が出現する文書数。
idf = log(N/n) + 1
```

最初は何も考えずに、対数の底をe(自然対数の底)として計算しました。しかし・・・

## 底が**e**だとレアワードの重みづけが不十分

文書群の中でごくごく僅かな数の文書中でしか出現しない単語は、十分大きな重みづけがなされるべきです。ですが、底がe(自然対数の底)だと、他の単語と比較して十分な差が出にくいです。希少な単語を特徴として含む文章をクエリとして、類似度の高い文書を選出させた際に、納得のいく結果が得られませんでした。

## 底を1.5前後にするといい感じに！

ケースバイケースだとは思いますが、自分が扱っている文書群(約4万)の場合だと、IDF算出時の底を**1.5前後**にすると、理想に近い結果が得られました。まだまだ試行錯誤が必要ですが・・・

## おまけ：Rubyで対数の底を指定する場合

[Math.log](http://docs.ruby-lang.org/ja/2.1.0/class/Math.html#M_LOG) は第二引数で底を指定することができます。

```rb
# nは単語の出現回数
idf = Math.log(n, 1.5)
```
iTerm2でスクロールしても出力ログが遡れない時になんとかする方法

## iTerm2でスクロールしても出力ログが遡れない！

ターミナル上でコマンドを用いてシステムログなどを確認していると、そのログをメモすることってありますよね？
どこかのファイルにそのログを吐き出していたら簡単にコピペすることは可能ですが、例えばそれがどこかのサーバへのデプロイ結果のログだったり、インストールしたあとのログだったり……ファイルに残らない出力ログをメモしたいときは、出力されたあとにコピペする必要があります。

また、`ls -l`したり`tail`したりしていると、目当ての出力ログがどんどん後ろに追いやられてしまい……ターミナルをスクロールしても「これ以上スクロールできない！」ということがありました。

そんなとき、iTerm2には、開いているターミナルの過去のログを再現することができる **インスタンスリプレイ** という機能があることを知りました。

## インスタンスリプレイしてみる

まず再現したいターミナルを開きます。そして、「`command + Alt + B`」を押すと、以下のようにウィンドウの下にバーが表示され、バーを動かすとその時間の時のターミナルの状態が表示されます。

![823edf4f-eaeb-944f-f7a3-cc4b2df9b2ed.png](https://qiita-image-store.s3.amazonaws.com/0/42852/376780a8-e660-a64d-c184-64b1507e3173.png)

矢印ボタンで動かすと1アクションずつ遡れるので、文字を入力している最中の様子も見ることができます。`history`に残らない作業を確認したいときも使えますね！
ASO(アプリストア最適化）の基礎知識

# 概要
ASOとは、App Store Optimization(アプリストア最適化）の略で、
アプリのダウンロード効率を上げる取り組みのことです。

# 最適化方法
1. 検索キーワードの見直し（単キーワード、複合キーワード）
2. アプリダウンロード数
3. アプリ平均評価
4. アプリレビュー数
5. ディープリンク等からの流入

## キーワードのコツ
・できるだけ多くのキーワードを含める
・短いキーワードを入れる
・打ち間違いしやすいキーワードも含める
・アプリ名は含めない（自動で入るため）
・開発者名は含めない（自動で入るため）

### 競合アプリの比較サイト
・SimilarWeb
・SeachMan
・AppAnnie
・tune.com
・Mobile app marketing tools

## ダウンロードさせるコツ
・アイコンは重要（文字はいらない）
・スクリーンショットは重要（最初の2枚が特に大事！）
・説明文は重要（最初の5行が特に大事！）
・App Indexingを活用する
・ディープリンクを活用する

# まとめ
検索キーワードとアプリの品質が大事なようです。

できることとしては、下記の3つでしょうか。
1. 競合アプリの比較サイトで現状を把握し、検索キーワードから見直す
2. ダウンロード施策を考える
3. アプリの品質を上げる
StoryboardやxibでUIViewの枠線・角丸設定をする（Swift）

## やること

UIViewの枠線・角丸設定ってよくあると思います。
いちいちコードで書くの面倒くさいですよね。
こちらをStoryboardやxibといったInterface Builder側で設定できるようにしたいと思います。

本記事はSwift版です。
Objective-C版は[こちら]です。



## 対応方針

UIViewのextensionを作成して、UIViewのサブクラスにおいてIB側での枠線・角丸設定を可能にします。

## サンプルコード

IB上で設定したいプロパティを記載していきます。
今回は枠線・角丸に関する下記プロパティを追加しました。

```swift:UIView+Border.swift
import UIKit

extension UIView {

    // 枠線の色
    @IBInspectable var borderColor: UIColor? {
        get {
            return layer.borderColor.map { UIColor(CGColor: $0) }
        }
        set {
            layer.borderColor = newValue?.CGColor
        }
    }

    // 枠線のWidth
    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    // 角丸設定
    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }
}
```

枠線の色については、CGColorですのでご注意ください。
IB側ではUIColorが設定されるため、setterでCGColorにしています。

## IBInspectable

上記コードのようにプロパティにIBInspectableを付与すると、
Xcodeのユーティリティーエリア(右ペイン)のAttributes Inspectorで上記プロパティが追加されます。

<img width="440" alt="View1.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/771d0914-ddb4-5b3b-52dc-93392becaa06.png">

あとはIB上で設定していくだけです。
枠線・角丸設定のコードはいらなくなりますし、その設定のためだけのIBOutletも不要になります。

<img width="440" alt="View2.png" src="https://qiita-image-store.s3.amazonaws.com/0/102583/423deb70-5fc7-0bf5-193b-72121a606c76.png">


## 最後に

これまでは上記設定をコードで行っていました。
でも、その設定のためだけにIBOutletでの紐付けをしたり、同じようなコードを何回も書くのは非効率的だと思うように。
どうにかならない？と同僚に相談したところ、本記事のようなことができることを教わりました。
それを実際に試してみたのがきっかけです。

UIViewを継承しているクラスであれば、部品を追加しただけで汎用的に使えるのがいいところだと思います。

本記事のObjective-C版は[こちら]です。

[こちら]:http://qiita.com/ktaguchi/items/92b6bd5856ab489fea22
Geanyで文字単位での行の折り返し（コンパイルを伴います）

[Geany](http://www.geany.org/)の好きなところは以下のところです。

- 正規表現で検索・置換ができる
- BOMが付いている付いていないが確認できるだけでなく変更もできる。
- エンコーディングがSJISなどの日本語対応している。
- 改行コードの変更ができる。
- 各行の改行コードをCR, LF, CRLFで表示できる。
- 矩形選択ができる。
- まぁまぁ軽い。

そんな事もあってgeditと比べると多少重たいもののぼちぼちと使うエディタのひとつなんですが、行の折り返しがワード単位なのでアルファベットと日本語を含むファイルを含むとこんなふうになってしまいます。
![geanyFrom.png](https://qiita-image-store.s3.amazonaws.com/0/128670/9106653d-b9b5-12f3-489e-a62da3cfb613.png)
（文の内容はRuby 2.3.0 リファレンスマニュアル > オブジェクト から引用）

geditならこんな感じです。
![geanyToGedit.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/007beae3-74f8-7f19-da00-88b2e0b6b9b3.jpeg)

それがどうも好きになれなくて[gedit](https://wiki.gnome.org/Apps/Gedit)や[Brackets](http://brackets.io/)を優先して使っていたのですが、ある日、ふと、それなら折り返し処理のところを変更ちゃえば良いじゃない、ソースコードも公開されているハズだし、と基本的な事に気づいたので変更してみました。

##環境について
今回は、Ubuntu 12と14 + Geany 1.28で動作確認を行なっています。

##Geanyのコンパイル
[Geany](http://www.geany.org/)からソースコードをダウンロードし解凍します。

```console
$ tar xvfz geany-1.28.tar.gz
```

コンパイルします。

```console
$ cd geany-1.28
$ ./configure
$ make
```

私の環境では何もエラーがでることなく順調にコンパイルできましたが、ライブラリがないといったエラーが出る場合は必要に応じてインストールします。`build-essential` `pkg-config` `libgtk2.0-dev` `intltool`あたりのパッケージが入っていれば良さそうですので、以下のコマンドを叩いてあげればだいたい揃うと思います。

```console
$ sudo apt-get install build-essential
$ sudo apt-get install pkg-config
$ sudo apt-get install libgtk2.0-dev
$ sudo apt-get install intltool
```

##Geanyの修正
ソースコードを見たところGeanyは[Scintilla](www.scintilla.org/)を使っているようです。Scintillaは文字単位の折り返しはもともとサポートされますので、ちょこっと修正するだけでいけそうです。

`SC_WRAP_WORD`を`SC_WRAP_CHAR`に変えるだけの本当にちょこっとの変更です。

```diff:src/sciwrappers.c
@@ -146,7 +146,7 @@ void sci_set_visible_white_spaces(Scinti
 void sci_set_lines_wrapped(ScintillaObject *sci, gboolean set)
 {
 	if (set)
-		SSM(sci, SCI_SETWRAPMODE, SC_WRAP_WORD, 0);
+		SSM(sci, SCI_SETWRAPMODE, SC_WRAP_CHAR, 0);
 	else
 		SSM(sci, SCI_SETWRAPMODE, SC_WRAP_NONE, 0);
 }
```

再度コンパイルします。

```console
$ make
```

##パッケージの作成とインストール
インストールした後でアンインストールする事も考えるとパッケージした方が楽ですのでパッケージ化します。
今回は`checkinstall`というツールを使ってパッケージを作成します。`checkinstall`がイントールされていない場合は`sudo apt-get install checkinstall`でインストールして下さい。

以下のコマンドでパッケージを作成します。

```console
$ sudo checkinstall
checkinstall 1.6.2, Copyright 2009 Felipe Eduardo Sanchez Diaz Duran
           このソフトウェアはGNU GPLの下でリリースしています。
（省略）

**********************************************************************

 Done. The new package has been saved to

 /home/hachi/geany-1.28/geany_1.28-1_i386.deb
 You can install it in your system anytime using: 

      dpkg -i geany_1.28-1_i386.deb

**********************************************************************

$ 
```

作成されたら古いGeanyを削除して、先程作成したGeanyをインストールします。実際のところ`checkinstall`実行時にインストールされてしまっていますのでをインストールは必要ないと言えばないのですが…

```console
$ sudo apt-get remove geany
$ sudo gdebi geany_1.28-1_i386.deb 
```

先ほどのファイルを開いてみると…おおっ！いい感じです。
![geanyTo.jpg](https://qiita-image-store.s3.amazonaws.com/0/128670/befbbb4e-7304-ba84-a8cf-0e6c9d4aa063.jpeg)
Processing / ControlP5 > C++ BuilderのTMemoに相当するものを実装

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
```

## 欲しい機能

C++ BuilderのTMemoのように、複数行のテキスト表示機能が欲しい。
テキストの行数が多くなった時点で、上の行が消えて新規の行が追加されるという機能。

ProcessingやControlP5関連でAPIを探したが、それらしいものを見つけられなかったので実装してみた。

## code

split()という関数があったので、それを使った。

```java
import controlP5.*;

String dispLabel = "";
int count = 0;

void setup() {
  size(700,400);
  frameRate(1);
}

String suppressToNLines(String srcstr, int nlines)
{
  String[] wrk = split(srcstr, '\n');
  int loop = min(wrk.length, nlines + 1);
  
  int strt = 0;
  if ( wrk.length == (nlines + 1) ) {
     strt = 1; 
  }
  
  println(loop);
  
  String res = "";
  for(int idx = strt; idx < loop; idx++) {
    if (res.length() > 0) {
      res = res + '\n';
    }
    res = res + wrk[idx];
  }
  return res;
}

void draw() {
  background(255);
  count++;
  
  if (dispLabel.length() > 0) {
    dispLabel = dispLabel + "\r\n";
  }
  dispLabel = dispLabel + str(count);
  dispLabel = dispLabel + "  3.14  2.718  6.022  1023";
  dispLabel = suppressToNLines(dispLabel, /*nlines=*/5);

  if (dispLabel.length() > 0) {
    fill(50);
    text(dispLabel, 10, 10, 700, 80);
  }
}
```

## 結果

それなりに動いている気がする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1b9514ca-0370-7efa-5c4c-34115412c65a.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f32386f3-3369-7d7a-0526-dcaadee8d779.png)
技術英語 > the menu that controls the tabs [is] intentionally [made less prominent].


https://processing.org/reference/environment/
の
Tabs, Multiple Files, and Classes

> Tabs are intended for more advanced users, and for this reason, the menu that controls the tabs <font color=red>is</font> intentionally <font color=red>made less prominent</font>.

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

> but such a description shall be made less prominently
> より目立つこと がないように表記し
UE4 Multiple Build

#はじめに
エクスプローラを立ち上げて、左上にswarmを打ち込んで探す。

#SwarmAgent.exeを実行する
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/25895/5377625c-5b21-97e1-05cc-8097862a48fd.png)


#IPなどの設定
最低必要数を購入したら、検証いたします。

#Try and Error
![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/25895/58311f55-7c4a-dea3-935e-2ffd8eb2e8d8.png)
Unityのエディタ拡張でコルーチン処理をする


StartCoroutineが使えなくても大丈夫。

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

public class TestEditor : EditorWindow {

	[MenuItem("Test/Go")]
	static void Go() {
		GetWindow<TestEditor> ();
	}

	void OnGUI() {
		EditorGUILayout.LabelField ("Test");
		if (GUILayout.Button ("Push")) {
			Debug.Log ("Pushed");
			IEnumerator t = Test ();
			while (t.MoveNext ()) {
				Debug.Log ("Current: " + t.Current);
			}
		}
	}

	public IEnumerator Test() {
		Debug.Log ("Test 0");
		yield return "Test 1";
		Debug.Log ("Test 2");
		yield return "Test 3";
		Debug.Log ("Test 4");
	}
}
```
Raspberry Pi ３で、Android-6.0.1

\# 2016.9.2: Android 7のイメージを公開してくれた方がいる模様<br>> [Android 7.0 Nougat on Raspberry Pi 3](http://geektillithertz.com/wordpress/index.php/2016/08/26/android7-raspberry-pi-3/)
\# 2016.12.19: [android_releases_rpi3](https://github.com/Android-RPi3/android_releases_rpi3)は、消えてしまったようです。.. Page not found - 404 .. なむなむ..

![IMG_5861.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/d069189e-3c7c-20a6-b44b-39afe58eeafb.jpeg)
## 環境
- Raspberry Pi 3 (本体のwifiはOK。有線LANは使えないっぽい?)
- microSD 8GB (Class 10)

## 手順
1. イメージのダウンロード
[android_releases_rpi3](https://github.com/Android-RPi3/android_releases_rpi3)から、[Downloadページ](https://github.com/Android-RPi3/android_releases_rpi3/releases)へすすんで、イメージをダウンロード
\>  [android_rpi3_11.07.2016.img.xz](https://github.com/Android-RPi3/android_releases_rpi3/releases/download/11.07.2016/android_rpi3_11.07.2016.img.xz)

2. .xzを解凍して、microSDに焼く。いつもRaspbian焼いてるツールでOKだと思う。
3. らずぱい３にさして、起動。待つ。

## 動機

- [RaspAnd](http://raspex.exton.se/?tag=raspand)というとこで、RaspberryPi2/3向けのAndroid 6.0.1をいろいろ設定して、イメージを売ってるひとがいる。($9.00USD ＝ 900～1000円くらい?)
 
    > **My sources**
    > My work/build is the outcome of the [Community Open Source Project](https://groups.google.com/forum/#!forum/android-rpi).

    と書いてある

- => [Android-rpi](https://groups.google.com/d/forum/android-rpi)という Google Groups
- 記事:[AOSP android-6.0.1_r54 (build MTC19Z) for RPi3](https://groups.google.com/d/msg/android-rpi/3VdUcm65HXg/tz13gZCvBQAJ) で、 https://github.com/Android-RPi3/android_releases_rpi3　にてイメージを公開している


# その他
- Androidの使い方がわからない。
- `Unfortunately, Google Play services has stopped.`の対処...
- 遅い..
- らずぱい３で、ましゅまろ、、、というタイトルをつけようとしたが、やめた。


# スクショ
- 起動中
![IMG_5859.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/47e0ecd5-08f0-0ca6-df0b-3a5a30cdca7c.jpeg)

- 起動直後
![IMG_5861.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/d069189e-3c7c-20a6-b44b-39afe58eeafb.jpeg)

- Google Play services ... マウスカーソルが化け化け(Chromeアイコンの左上のやつ)
![IMG_5863.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/3f5c5f3c-6f9b-dcb7-8050-7759cb934897.jpeg)

- Chromeで、インターネット
![IMG_5864.JPG](https://qiita-image-store.s3.amazonaws.com/0/75594/bca126cc-d556-8609-765e-318bccc09bca.jpeg)
メモ for GoogleEE #3: 30mDEから水を取り除く


GoogleEE上ではSRTMの30m標高データが利用できる．このデータでは，北緯60度以南がカバーされている．

さてこのSRTM，そのまま使うと水面も標高データとして含まれているため，地表面の標高だけを使いたいときに困るケースが出てくる．


なので，水面データをマスクしてやれば良い．
例えば，"Hansen Global Forest Change"というデータセットに水面データが入っているので，今回はそれを使う．

```
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2013');
var data = hansenImage.select('datamask');
var watermask = data.eq(1);
```

こんな感じで読み込んだやつを，後は標高データにマスクしてやればよい．
例えば：

```py
var De30 = ee.Image('USGS/SRTMGL1_003');
// SRTM_1の読み込み

var maskDe30 = De30.mask(watermask);
// 上で挙げた水面データを被せる

Mask.addLayer(maskDe30);
// 表示
```

これで水と陸地が区別される．
初心者のDocker入門1

Dockerを個人的に使用する機会があり、なぜか興味を持ったのでDockerを本格的に勉強することにしました。

Docker初心者が勉強したことのアウトプットです。

#Dockerとは
コンテナと呼ばれる環境にアプリケーションをパッケージング・デプロイ・実行できるソフトウェア。
クライアント・サーバ型のアーキテクチャで実装されており、DockerクライアントがDockerデーモンとやり取りを行うことにより、コンテナのパッケージング・デプロイ・実行を行う。

#メリット
- 軽量
    - ホストOSのカーネルを利用するため、オーバーヘッドが少なくコンテナの立ち上げが早い
- 移植性
    - 環境の内容をコードで記述しておける
    - 異なるホストでも同じ環境を再現できる。

#デメリット
- Linuxのカーネルを使用するため、Linuxでしか動作しない。（2016/7現在、Docker for Windowsがβ版で提供されている。また、Windos Serverでも提供される予定）
- Dockerデーモンをroot権限で動かす必要があり、DockerクライアントとDockerデーモンがソケットかRESTful APIを使用して通信を行うため、セキュリティに注意をはらう必要がある。

#参考URL
- Docker ドキュメント日本語化プロジェクト
    - http://docs.docker.jp/index.html
- Docker入門
    - http://docker.yuichi.com/about/strength/index.html
- SOTA
    - http://deeeet.com/writing/2015/02/17/docker-bad-points/  

#次回
Dockerで使用出来るツールに関してアウトプットする予定です。
fswatchの使い方覚書 ＋ fswatchでフォルダを監視して自動commitする

>**環境**
- MACOSX:10.11.5
- fswatch:1.9.2

# fswatch
ディレクトリの中身を監視して、変更結果を次の処理に渡してあげることでいろんなことができます。
[公式ホームページ](https://emcrisostomo.github.io/fswatch/)
[How to User fswatch](https://github.com/emcrisostomo/fswatch/wiki/How-to-Use-fswatch)

## インストール
```bash
brew install fswatch
```

## 基本の使い方
自分が使うときに調べた分は以下に書きたいと思います。残りについては公式の[ドキュメント(1.9.2)](http://emcrisostomo.github.io/fswatch/doc/1.9.2/fswatch.html/)に詳しくまとまっているのでそちらをご参照ください。

```bash
fswatch -o [path] | xargs -n1 -I{} [program]
```

この```[path]```に監視したいディレクトリのパスを入れてもらって、```[program]```に実行したい処理を書きます。
ちなみに```-I{}```を取り除くことで、```fswatch```で取得したファイルのパスが```[program]```で使えるようになります。つまり、

```bash
fswatch -o [path] | xargs -n1 cat
```
で変更のあったファイルへのパスが標準出力へ出力されます。

# fswatchでフォルダを監視して自動commitする
```bash
fswatch -0 . -e "\\.git.*" | xargs -0 -n 1 -I{} git commit -am "edit file"
```
この記事の本題です。
.gitファイルの変更は除外するために```-e (execlude)```を使いました。```-e```は正規表現を使って監視から除外するものを指定できるようです。

ドキュメントや論文をWordで書いているとき、Wordの履歴機能が心もとないことに加えて、でもGitで管理しようとすると、いちいちWordから離れてcommitするのが面倒くさい。
そんな２つの理由からfswatchを使おうと思いました。
ただ今となっては、Dropboxの履歴管理機能で十分だったなと思っています。

もしも使う場合は、みなさまご自身の責任で利用してください。
>Git勉強中であることと、チーム開発をあまりしないので確信はもてませんが、チームで開発しているのに変更を全てcommitなんてしたらお怒りになる方も多いと思います。。。
[Guard で Git コミットを自動で行う](http://qiita.com/a-suenami/items/bd9a669d5779d9910fec)
こちらの記事で自動コミットについてコメントされている方がいらっしゃいました。

以上です。
Jsonデータ（半構造データ）の各種データベース検索操作

こんにちは。
各種データベースで、Jsonデータ（ドキュメントデータ、半構造データ）の検索操作を試してみました。

**ArangoDB**:

```js
[arangsh]> db._query('for doc in [{"x":1}] return doc.x < 2')
   -->  [true]
```

**Azure Cosmos DB (DocumentDB)**:

- SELECT 文の書き方は、

```
SELECT d.x < 2 FROM doc AS d
   -->  [true]
```

**PostgreSQL**[^1]:

```postgres
[psql]> select (jb->>'x')::integer < 2 from (select '{"x":1}'::jsonb as jb) tab_dummy;
   -->  t (true)
```

[^1]: 比較の際に型を一致させないといけないそうです。

**PostgreSQL with jsquery[^2] extension**:

```postgres
[psql]> select jb @@ 'x < 2' from (select '{"x":1}'::jsonb as jb) tab_dummy;
   -->  t (true)
```

[^2]: [jsquery](https://github.com/postgrespro/jsquery) (GitHub)

**MySQL**:

```mysql
[mysql]> select json_extract(js, '$.x') < 2 from (select '{"x":1}' as js) tab_dummy;
   -->  1 (true)
```

**MySQL Shell**[^3] [^4] :

```js
[mysql-js]> db.collection.add({"x":1})
[mysql-js]> db.collection.find('x<2')
   -->  [{"x":1}]
```

[^3]: 参考：「[MySQL Shellを入れてみた](http://qiita.com/ryouma_nagare/items/7cb8643e4d81e09064b7)」
[^4]: [MySQL Shell](https://dev.mysql.com/downloads/shell/) (dev.mysql.com)

**MongoDB Shell**:

```js
[mongo]> db.collection.insert({"x":1})
[mongo]> db.collection.find({x:{$lt:2}}, {_id:0})
   -->  [{"x":1}]
```

**RethinkDB in javascript**:

```js
r.db('my_db').table('my_table').insert{"x":1}).run(conn)
r.db('my_db').table('my_table').filter(r.row('x')).lt(2)).run(conn, callback);
   -->  [{"x":1}]
```

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

* ほかに、 「[JSON エコシステム](https://qiita.com/kkdd/items/d88d40d0956c7ecef084)」
AGAL入門 #7 : 記述のちょっとしたコツ その１

いくつかStarling2でAGALコードを書いてみて、オリジナルなテクニックというかコツのようなものが見えてきたので、いったん記事にまとめてみようと思います。なお、トークン数が少ないとか速く動作するとかその方向は現状目指しておらず、わかりやすく間違いのない書き方をしようという目標でやっていますので、パフォーマンス的には無駄がある事に留意してください。

#TIPS:なるべくAGALで計算しない
いきなりそこかという感じですが、AGALでなくActionScript側で計算できる事はそちらで行ってから定数でAGALに渡したほうがデバッグがしやすいのでよいです。AGALコード中でレジスタがどのような値になっているかは基本的にわからないので。。例えばエフェクトの強さを渡すとして、計算の最中で必ず２で割ってから1を引くなどしている場合(結果それが何の値なのかはっきり言えなくなっても）AS側でやってしまえばいいのです。

#TIPS:定数は余裕を持って使う
（Starling2の場合フィルターでなく、スタイルを作る場合は制限がきついのでそうもいきませんが）定数レジスタは数多く使える(AGAl2なら、vcが250もレジスタでfcが64レジスタ、AGAL1ならvcが128レジスタ、fcが28レジスタ)ので、一つのレジスタのxyzwそれぞれの値をみっちり使う必要はないです。最初のtipsと絡めて言うと、事前計算前の値と事前計算途中の値と事前計算結果の値とすべて定数で渡したって、よいのです。AGAL側で四則演算するのも疲れるので。

#TIPS:受け取った定数レジスタを最初にテンポラリレジスタに移動してしまう
AGALでは定数同士の演算は行えません。引数を１つしか持たない命令は内部処理の都合か、定数１つ指定しただけでエラーになるようです。テンポラリレジスタはそこまで数が多くない(AGAL2ならvtもftも26レジスタ、AGAL1なら各8レジスタ)ので場合にもよりますが、最初にmove命令でテンポラリレジスタに値をコピー（移動)してしまえば、複雑な計算途中でエラーになる事がなくなり無駄なコード書き換えをしなくてすみます。この用途では添字の大きいテンポラリレジスタから使っていくとコードの見通しが良くなりそうです。

#TIPS:どうしても値が知りたかったらカラーとして出力する
フラグメントシェーダー限定の処理になりますが、何がおかしいのかわからない場合の最終手段としてレジスタの値をカラーとして出力してしまう技が使えます。0~1の範囲限定となるので、出力前に演算が必要になるかもしれませんがここで値が3になっているはず！みたいな場合は1/3の値をカラー出力してしまえば、結果を画面キャプチャーしてRGB値を調べれば255/3=85みたいに値の確認ができます。rgbaの４チャンネルあるので、４つの値を同時に確かめられますね。

#TIPS:基本的な数値は使おうが使わまいがまず定数で渡してしまう
AGAL内には数値のリテラル記述ができないので、0とか1とか2とか簡単な値であっても定数として受け渡してやらないと扱う事ができません。必要になってから受け渡すコードを書くのは面倒くさいので、ここはもう毎度のお決まりにして、固定で渡してしまえばいいと思います。気になるなら動作確認後の最後の段階で使わなかったものを消去すればいいのではないかと。

#TIPS:AGAL2を使う
前のif分岐についての記事にも書きましたが、特別な状況でない限りAGAl1の制限下でコードを書く必要はないと思います。if分岐が書けるのと書けないのでかなりの差があります。AGAL2の`Standard Constrained`プロファイルであれば、メジャーなスマホとデスクトップ環境はほとんどカバーできます。

#TIPS:イディオムを作っていく
Math.floorに値する命令はないですが、数値の少数部分をえる命令(frc)はあるのでいったん別レジスタに少数部を得て、それを元の値から引いて間接的に整数部をえる、みたいな感じです。このあたりの具体例は別途記事にまとめてみようと思います。

#TIPS:無理にパラメータを増やさず、別クラスを検討する
（これはStarlingのフィルタやスタイルを作る場合の話ですが）１つのフィルターやスタイルがパラメータ変更で表現を変えられるのは便利ですが、あまり対応するとAGALコードもどんどん長くなって、コードの複雑さも増してしまいます。コンスタラクタ時に指定した後はほとんど変更しないようなパラメータであれば、いっその事フィルターやスタイル自体を別のものと分けてしまったり、AGALコード自体パラメータに合わせて一部分をごそっと違うものに入れ替えるなど、動的な変更をあきらめる対応をとったほうが良さそうです。（自らハードルを上げるなという事で、これは自分に対して言っております。）

#まとめ
まだありそうですが、とりあえずはこんな感じです。具体的なコードのテクニック（自分の頭でひねり出したレベルで大したものではないですが）は別記事でそのうちまとめようと思います。
Swift リファクタリング 実践 Tips2


今回は、[「使うまでに初期化されていることが保証できる + defer = 最後までに絶対に値が指定される」](https://gist.github.com/ezura/bd16fc09e9711ed195672b25788bc59c)を用いて、処理の意図をコンパイラ(処理系)に保証させたリファクタリング例です。

この記事のおすすめの読み方
1. before の例を見て、その処理が何をしたいのか概要を読み取る
2. after を見て before との印象の違いをみてみる

## 例
```swift:before
var state: State = .Normal

func reload() {
    state = .Loading
    
    guard /* condition */ else {
        state = .Normal
        return
    }
    
    // do somethig
    
    guard /* condition */ else {
        state = .Error
        return
    }
    
    // do somethig
    
    state = .Normal
}
```

```swift:after
var state: State = .Normal

func reload() {
    let resultState: State
    
    state = .Loading
    defer { state = resultState }
    
    guard /* condition */ else {
        resultState = .Normal
        return
    }
    
    // do somethig
    
    guard /* condition */ else {
        resultState = .Error
        return
    }
    
    // do somethig
    
    resultState = .Normal
}
```

変数 `state` に注目してみると、「処理の開始時と終了時に `state` を更新する。(ただし、状況や処理の結果によって終了時に `state` に指定する値は異なる)」処理のようです。
before では、全体を見て処理の意味に確信が持てますが、after では、最初に処理の概要が簡潔に表現され、かつ、 **コンパイラ(処理系)によって処理の意図が保証** されています。

after でコンパイラ(処理系)が保証してくれること:
* 最後に `state` の値を更新すること
* 終了時の `state` に与える値を必ず判断すること (指定し忘れた場合、コンパイルエラーになる)

```swift:after(最後に`state`の値を指定し忘れた場合)
func reload() {
    let resultState: State
    
    state = .Loading
    // ❗️error: constant 'resultState' used before being initialized
    defer { state = resultState }
    
    guard /* condition */ else {
        resultState = .Normal
        return
    }
    
    // do somethig
    
    guard /* condition */ else {
        // missing 😦
        return
    }
    
    // do somethig
    
    resultState = .Normal
}
```

## もう少し詳しく
Swift では変数を宣言後、「変数の値を使用する前に初期化済みであること」が要求されます。もし、その制約が満たされていない場合、コンパイルエラーとなります。

```swift:初期化の挙動
func sample() {
    let /* var */ v: Bool
    // ❗️error: constant 'v' used before being initialized
    print(v)
}
```

これを踏まえて、下記のように defer を使うと、 **「スコープを抜ける直前には必ず値が与えられている」ことが処理系によって保証** されます。
余談ですが、defer のブロック内で使用する変数は後で宣言しても良いです。

```swift:deferと変数の値
// deferの前で変数宣言
func sample() {
    let a: Int
    defer { print(a) }
    a = 1  // 指定しないと error
}

// deferの後で変数宣言
func sample() {
    defer { print(a) }
    let a: Int
    a = 1  // 指定しないと error
}
```

## おわりに
今回紹介した方法の大きな利点として、「人ではなく、処理系によって意図が保証されること」に価値があると思います。これによって、人が払うべき注意の一部を処理系に任せることができ、仲間の負担を減らせそうです。

[前回 (Swift リファクタリング 実践 Tips1)](http://qiita.com/ezura/items/b34537343869d4cc5f76)
GitLab Issues のスタイルシートをカスタマイズ


## はじめに

GitLab Issues は一覧画面、詳細画面ともにタイトルが少し見づらいイメージがあります。
一覧画面にはタイトルとそれ以外の情報が２行で表示されていますが、１行目をもう少し目立たせたい。
詳細画面ではタイトルと詳細の間に空白を入れたい。
そこで、GitLab のスタイルシートをカスタマイズして調整してみます。
なお、試したバージョンは `GitLab-CE 8.9.6` で、OS は CentOS7です。

## 変更前と変更後のスタイル

一覧ページでは、１行目の文字色、文字の多きさ、２行目の文字色を、詳細ページではタイトルの文字色とアンダーラインの付加、詳細との間に空白を入れます。また、フォントはメイリオにします。以下は変更前と変更後の画面です。

### 変更前

* 一覧画面

![2016-07-19-gitlab-issues-custom-css-001.png](https://qiita-image-store.s3.amazonaws.com/0/133092/6b99c2f1-fb0b-f11a-c0e7-567915f10bc2.png)

* 詳細画面

![2016-07-19-gitlab-issues-custom-css-002.png](https://qiita-image-store.s3.amazonaws.com/0/133092/88a62bfe-79bc-25cd-2c1f-1193d0a69c86.png)

### 変更後

* 一覧画面

![2016-07-19-gitlab-issues-custom-css-003.png](https://qiita-image-store.s3.amazonaws.com/0/133092/88aba47f-fb32-9041-1c81-0ba21ee7dd16.png)

* 詳細画面

![2016-07-19-gitlab-issues-custom-css-004.png](https://qiita-image-store.s3.amazonaws.com/0/133092/2148774e-834f-a3aa-e1e5-4083957c70de.png)

### 「えー、イマイチじゃない？」
そんなこと言わないで。

## Issues 画面のスタイルシート

一覧ページと詳細ページのスタイルシートは `/opt/gitlab/embedded/service/gitlab-rails/public/assets` に入っています。
ここにある css は SCSS からコンパイルされたもので、ソースファイルは以下の場所にあります。

### 一覧用スタイルシート

	/opt/gitlab/embedded/service/gitlab-rails/app/assets/stylesheets/pages/issues.scss

### 詳細用スタイルシート

	/opt/gitlab/embedded/service/gitlab-rails/app/assets/stylesheets/pages/detail_page.scss

これらのファイルを編集して反映させます。

## issues.scss

以下の内容をファイル末尾に追加します。

```css
.issue-title-text {
    font-family: "メイリオ";
    font-size: 12pt;
    a {
        color: #b92a2c !important;
        &:hover {
            color: #b92a2c !important;
        }
    }
}

.issue-info {
    color: #aaa;
    a {
        color: #aaa !important;
        &:hover {
            color: #aaa !important;
        }
    }
}
```

## detail_page.scss

`.detail-page-description` のところを以下のように書き換えます。

```css
.detail-page-description {
    .title {
        margin: 0;
        font-size: 16px;
//      color: $gl-gray-dark;
        color: #b92a2c;
        padding-bottom: 8px;
        margin-bottom: 16px;
        font-family: "メイリオ";
        border-bottom: 1px dotted #999;
    }
    ・・・
}
```


## 変更の反映

css を作りなおすには `gitlab-rake` でコンパイルし直します。
以下のコマンドを実行します。

```
gitlab-rake assets:clean assets:precompile
```

そうすると、以下のようなエラーが出ます。

```
rake aborted!
Errno::EACCES: Permission denied @ rb_sysopen - /opt/gitlab/embedded/service/gitlab-rails/public/assets/application-c648926c9d8a8939cebb4416841c41fe5cfaed87c8cc16110b52113026c41fd5.css.66282720.7223.147474
...
```

パーミッションが許可されていないようです。
そこで、コンパイルするときだけパーミッションを変更し、コンパイルしたら元に戻します。
そして、再作成したスタイルシートを反映させるため、GitLab をリスタートします。

※この解決策は以下を参考にしました。  
[GitLab Omnibusロゴ差し替えスクリプト](http://qiita.com/hiconyan/items/7c5cdc6965c7eb44f1b5)

```
chown -R git:git /opt/gitlab/embedded/service/gitlab-rails/public/assets
gitlab-rake assets:clean assets:precompile
chown -R root:root /opt/gitlab/embedded/service/gitlab-rails/public/assets
gitlab-ctl restart
```

再アクセスしてみると、変更していることが確認出来ます。

## 最後に

あとは好きなようにスタイルをいじりましょう。
参考になれば幸いです。
Python+OpenCVで顔検出とコラ作成

諸事情でOpenCVの勉強をしなくてはならなくなり、色々調べるとOpenCVで簡単に顔検出できるというのを見かけたので実践してみました。似たような記事は沢山あると思いますが。
例として、検出した顔領域に[これ](https://qiita-image-store.s3.amazonaws.com/0/134222/4fa9cdf1-ebd4-cf9d-e367-85293969e5b1.png)を貼り付けるコードを作成してみました。
#貼り付けイメージの作成

```
image: 貼り付け先の画像
left, top: 貼り付け位置。顔検出の結果を受け取る。
size: 顔領域のサイズ。これも顔検出の結果を受け取る。
def kurumirize(image, left, top, size):
    # クルミル画像を読み込み
    image_kuru = cv2.imread('kuru.png', cv2.IMREAD_UNCHANGED)
    # クルミル画像を顔領域のサイズに合わせてサイズ変更
    image_kuru = cv2.resize(image_kuru, (size, size)) 
    # 変更後のサイズを取り出す（sizeと同じ）
    width, height = image_kuru.shape[:2]
    # 画像のアルファチャンネルだけ取り出す
    mask_ = image_kuru[:,:,3]
    # アルファチャンネルの値をBGRに格納したndarrayを作る
    mask = np.ones((width, height, 3))
    for i in range(len(mask)):
        for j in range(len(mask[0])):
            mask[i][j] = np.ones(3) * mask_[i][j]
    # 0~1になるように規格化
    mask = mask / 255.0
    # 値をfloatにキャストしておく。
    image = image.astype('float64')
    # アルファチャンネルはもういらないのでそれ以外を取り出す
    image_kuru = image_kuru[:,:,:3]
    # 指定の位置に画像を貼り込んで返す
    image[top:top+height, left:left+width] *= 1 - mask
    image[top:top+height, left:left+width] += mask * image_kuru
    return image
```

コードの大部分は
[python/OpenCVで透過pngをオーバレイする](http://blanktar.jp/blog/2015/02/python-opencv-overlay.html)を参考にしました。
自分の環境だとなぜかcv2.cvモジュールを呼ぶことができなかったので、アルファチャンネルの値を3つ重ねた配列を作るときに面倒なことをしています。

#顔検出
```
# 画像の読み込み
image = cv2.imread('image.jpg')
# グレースケールに変換
image_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 出来合いのカスケード分類器を読み込む
cascade_path = "haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(cascade_path)
# 顔を検出して顔領域の正方形を取得
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
if len(facerect) > 0:
    #検出した顔を囲む矩形にクルミルを貼り付ける
    for rect in facerect:
        image = kurumirize(image, rect[0], rect[1], rect[2])
    #認識結果の保存
    cv2.imwrite("out.png", image)
```

こちらはそれこそ何も考える必要がなさそうです。
拾ってきたカスケード分類器をcv2.CascadeClassifierに読み込ませただけ。
この分類器は上記のファイル名まんまでググると出てきます。
(2016/7/20追記: 参考にしたページを書き忘れていました。
[python+OpenCVで顔認識をやってみる](http://qiita.com/wwacky/items/98d8be2844fa1b778323))

んで最終結果は[こちら](https://qiita-image-store.s3.amazonaws.com/0/134222/f5463e4f-fe8d-6607-f83e-97e1483e4a90.png)
一応この画像では上手くいってますが、
[これ](https://qiita-image-store.s3.amazonaws.com/0/134222/b5842a17-35b5-dbc1-9f6a-2c67ec0af5a8.png)や[これ](https://qiita-image-store.s3.amazonaws.com/0/134222/6c0ce808-c016-c6ea-d97b-fcfa118159b3.png)を見るとどうも誤検出が多いみたいです。
もっと別の方法を実装した時に改めて色々ためしてみるつもりです。
chromium os on ubuntu

chrome OS をウィンドウマネージャー上で起動する方法を試したのでメモ。

### 概要
chromium osは結局のところlinux kernel上で動作するweb browserなので、
ubuntu上で実行するか動作確認してみた。

### 環境
```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
```

### 手順
chromium osをdownloadする。
https://download-chromium.appspot.com/

以下のコマンドを実行する。(実行しないとcoredumpする。)

```bash
$ bsudo cp ~/chrome-linux/chrome_sandbox /usr/local/sbin/chrome-devel-sandbox
$ sudo chown root:root /usr/local/sbin/chrome-devel-sandbox
$ sudo chmod 4755 /usr/local/sbin/chrome-devel-sandbox
$ export CHROME_DEVEL_SANDBOX=/usr/local/sbin/chrome-devel-sandbox
```

chromium osを起動する。

```bash
$ chrome --disable--setuid-sandox --open-ash
```

### 結果
問題なくchromiumをubuntu上で実行できた。
dockerのログをローテートする

docker-composeでログローテとする方法

```yaml
version: "3"
services:
  app:
    image: your-app-image
    logging:
      options:
        max-size: "10k"
        max-file: "5"
```

```console
root@dinghy:~# ls -l /var/lib/docker/containers/1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e/
total 84
-r--------    1 root     root        6.5K Jul 19 14:38 1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e-json.log
-r--------    1 root     root        9.8K Jul 19 14:38 1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e-json.log.1
-r--------    1 root     root        9.9K Jul 19 14:38 1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e-json.log.2
-r--------    1 root     root        9.8K Jul 19 14:38 1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e-json.log.3
-r--------    1 root     root        9.8K Jul 19 14:38 1fe87eeef61e63244269bfd089501208f2772a615baefd0828e8fbe8cc6c964e-json.log.4
```
"git status"まとめ

## git status

最もよく多用して、最もバラエティに乏しいコマンド

- git status
- git status -s

オプション付きの方は簡易的な表示をしてくれます。

よく見るステータスは下記の通り

![](http://ikenji.tech/wp-content/uploads/2016/07/status1.png)

```git status``` は、特によく使うので
エイリアスを設定して楽をしましょう。

![](http://ikenji.tech/wp-content/uploads/2016/07/status2.png)

### エイリアスの設定方法

#### .bashrc

'g' 一文字で 'git' と認識させます。

```
$ echo 'alias g='git'' >> ~/.bashrc
```

#### .gitconfig

"[alias]" で git の各コマンドをオプション付きで設定しておきます。

```
$ vim ~/.gitconfig
```

![](http://ikenji.tech/wp-content/uploads/2016/07/status3.png)

## 終わり

基本は, ```g s``` ですが、リモートとのコミット差など、詳しい情報がほしい時は ```git status```を使ってます。
Railsでテスト時のみRoutingを追加する

# 環境

- Rails 4.2.6, 5.0.0で確認

# 方法

`ActionDispatch::Routing::RouteSet#draw`を使って`Rails.application.routes`に追加します。
ただし`#clear!`と`#finalize!`が走ると以前の Routing が消えてしまうので、それを抑制するフラグを切り替える必要があります。

```ruby
# spec/support/additional_routes.rb
class DummiesController < ActionController::Base
  def show
    render plain: 'hi!'
  end
end

Rails.application.configure do
  routes.disable_clear_and_finalize = true
  
  routes.draw do
    resource :dummy, only: %i(show)
  end
  
  routes.disable_clear_and_finalize = false
end
```

rspec-rails を使っているなら、だいたいは feature spec でのみ必要となると思うので type のメタタグを基準に読み込めれば良いです。
RSpec 3.5 ならこんな感じで必要に応じて読み込ませることができます。

```ruby
# spec/rails_helper.rb
RSpec.configure do |config|
  config.when_first_matching_example_defined(type: :feature) { require 'support/additional_routes' }
end
```

# 参考リンク

- [rails/route_set.rb at 4-2-stable · rails/rails](https://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/routing/route_set.rb#L408)
【Python】DataFrameでシリアル番号ごとに処理したい

次のようにシリアル番号ごとに時系列データを持つような場合に，シリアル番号ごとに処理をしたいときのループの書き方。

```py
import pandas as pd

df = pd.read_csv('sample.csv')
df
          Date  Serial_No      Var1      Var2      Var3
0   2016-04-01          1  0.708636  0.014882  0.765210
1   2016-04-02          1  0.211528  0.012070  0.071375
2   2016-04-03          1  0.745620  0.211446  0.593242
3   2016-04-04          1  0.378551  0.249341  0.899383
4   2016-04-05          1  0.692113  0.800209  0.573121
5   2016-04-01          2  0.942247  0.047866  0.476508
6   2016-04-02          2  0.440591  0.098763  0.998441
7   2016-04-03          2  0.339409  0.784255  0.918570
8   2016-04-04          2  0.867678  0.691103  0.820591
9   2016-04-05          2  0.281377  0.627040  0.328517
10  2016-04-01          3  0.493448  0.628469  0.728271
11  2016-04-02          3  0.792600  0.546174  0.519287
12  2016-04-03          3  0.537685  0.235136  0.509063
13  2016-04-04          3  0.691400  0.028834  0.663123
14  2016-04-05          3  0.625309  0.734726  0.077092
```

例えば，シリアル番号ごとにVar1を規格化（平均0，標準偏差1）したい場合。インデックスをシリアル番号にして，シリアル番号でインデクシングする。

```py3
df.index = df['Serial_No']
for sn in set(df.index):
    mean = df.ix[sn, 'Var1'].mean()
    std = df.ix[sn, 'Var1'].std()
    df.ix[sn, 'Var1'] = (df.ix[sn, 'Var1'] - mean) / std
```

次のような書き方をすると，コピーされたDataFrameに対して処理をしてしまい，データの更新ができていないため注意。

```py3
df = pd.read_csv('sample.csv')
for sn in set(df['Serial_No']):
    mean = df[df['Serial_No'] == sn]['Var1'].mean()
    std = df[df['Serial_No'] == sn]['Var1'].std()
    df[df['Serial_No'] == sn]['Var1'] = (df[df['Serial_No'] == sn]['Var1'] - mean) / std # これはダメ