OmniAICreator/Qiita-1.07M huggingface dataset:
[C++] 行列演算ライブラリ「Eigen」のリファレンスを読む際の注意

# 結論

密な（通常使う）[^1]行列型（`Matrix**`）やベクトル型（`Vector**`, `RowVector**`）に対して使えるメソッドは、以下のページを見ればよい。

- [Eigen::Matrix型のリファレンス](http://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html "Eigen: Matrix&lt; _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols &gt; Class Template Reference")
  - （「行列同士の演算結果」[^2]などではない）単一の行列でないとできない処理はここにある。Map処理（全要素に対する繰り返し処理）など。
- [Eigen::MatrixBase型のリファレンス](http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html "Eigen: MatrixBase&lt; Derived &gt; Class Template Reference")
  - 一番お世話になるのはたぶんここ。行列に対する演算（加算、乗算、内積、ノルムなど）は主にここを見ればよい。
- [Eigen::DenseCoeffsBase型のリファレンス](http://eigen.tuxfamily.org/dox/classEigen_1_1DenseCoeffsBase_3_01Derived_00_01ReadOnlyAccessors_01_4.html#afe8b8d098bee05012ae2eb95e0621323 "Eigen: DenseCoeffsBase&lt; Derived, ReadOnlyAccessors &gt; Class Template Reference")
  - メソッド数少数。「●行■列の要素を取得」などのメソッドはここ。
- [Eigen::EigenBase型のリファレンス](http://eigen.tuxfamily.org/dox/structEigen_1_1EigenBase.html#a76f5bc8a03ec105ab4be1f2b91b7b5d5 "Eigen: EigenBase&lt; Derived &gt; Struct Template Reference")
  - メソッド数少数。「行列の行数・列数を取得」などのメソッドはここ。

[^1]: Eigenにおける行列やベクトルの表現方法には、各要素にメモリをすべて割り当てる「密な（Dense）」ものと、0でない要素のみにメモリを割り当てる「疎な（Sparse）」ものが存在する。Sparseのほうは、0でない要素のみにメモリを割り当てるとはいえ「どこに0でない要素があるか」の情報も必要なため、単純にDenseに比べて要素数の比でメモリ消費が減るわけではなく、また各種演算のコストも高くなる。そのため、本当にかなりの大部分を0が占めるという場合でなければDenseなものを使えばよい。
[^2]: それを表現するためのクラスもある。実際の演算を本当に必要になったときに遅延評価するための機構である。

# 経緯

仕事の関係で、C++の行列演算ライブラリ「[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page "Eigen")」を利用している。
これのリファレンスのうち、行列型に使えるメソッドを調べたかったのだが、最初に目が行った`Eigen::MatrixBase`型のリファレンスを見ても、**当たり前にありそうな「行数・列数を得るためのメソッド」が見当たらなかった**のである。

「これはおそらく継承関係の都合で表示されていないんだろうな」と思いつつ、とりあえずその方法は別の場所で把握したのでしばらく放置していたのだが、思い立って「じゃあ使えるメソッドを全部見るにはどうすればいいんだろう」と考えて調べてみた。

# 調査の流れ

まず、行列型はどのような継承関係にあるのかを把握しないとならない。これはリファレンス内に、まさにそのままの名称のページ「[The class hierarchy](http://eigen.tuxfamily.org/dox/TopicClassHierarchy.html "Eigen: The class hierarchy")」というのがあった。
これを見ると、継承関係は親クラスから順に

- `EigenBase<Matrix>`
- `DenseCoeffsBase<Matrix>`
- `DenseBase<Matrix>`
- `MatrixBase<Matrix>`
- `PlainObjectBase<Matrix>`
- `Matrix`

となっていた。ただ、リファレンスを見ていると、`DenseBase`にあるものは`MatrixBase`にも基本的にあったし、`PlainObjectBase`にあるものは`Matrix`にも基本的にあった（オーバーロードの関係で若干の差はあるが、それ以外は一致していた）。なので見る必要があるのは`DenseBase`と`PlainObjectBase`を除いた四つということになる。

ちなみに、先程の「行数・列数を得るためのメソッド」は`EigenBase`クラスで定義されていたとわかったわけなのだが、このクラスはAPIとして提供されているメソッドが非常に少なく（[Eigen::DenseCoeffsBase型のリファレンス](http://eigen.tuxfamily.org/dox/classEigen_1_1DenseCoeffsBase_3_01Derived_00_01ReadOnlyAccessors_01_4.html#afe8b8d098bee05012ae2eb95e0621323 "Eigen: DenseCoeffsBase&lt; Derived, ReadOnlyAccessors &gt; Class Template Reference")）、主に使うのは`rows`（行数）、`cols`（列数）、`size`（全要素数）の三つのメソッドぐらいであろう。また`DenseCoeffsBase`クラスについても、定義されているもので主に使うのはほとんど「●行■列の要素を取得」などであった。

こういった形で継承関係を設計することで、柔軟性の高いAPIの提供ができるというのはもちろんあるのでしょうけど、リファレンスの一覧性が低いのは改善してくれるとうれしいな、という話でした。

----
jsfiddleでconsole.logを出力しよう


みんな大好き「jsfiddle」。
console.logを出力してほしいの。



左サイドメニューののExternal Resourcesのところで、以下のJSのURLを入れて、RUN!
console.logの状況がみれます

https://getfirebug.com/firebug-lite-debug.js

![fiddle.png](https://qiita-image-store.s3.amazonaws.com/0/32215/fa1ca154-0bfc-b4e2-f4eb-c0e08b031a41.png)



### おまけ

東洋経済オンラインで「エンジニア夫婦のあるある日記」を連載中です

[エンジニア夫婦のあるある日記](http://toyokeizai.net/category/diary)

![あるある日記.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/14d59814-449c-7cec-c463-59650d3ab1a3.jpeg)
SCSS



[Variables 変数]
変数を一元管理して使用すればスタイルに一貫性があり修正に強いサイトができる

     <scss側>
     $hensu: #ffffff;
     body {
          color: $hensu;
     }

     ↓　コンパイルする

     <css側>
     body {
          color: #ffffff;
     }
＊コーポレートカラーを変数に代入しておくとカラー変更などの時にすぐに対応が出来る

[Nesting ネスト]
モジュール単位でCSSを管理する
     <scss側>
     .oya {
          color: #000;
               .kodomo {
                    color: #111;
                    .mago {
                         color: #222;
                    }
               }
           }

     ↓　コンパイルする

     <css側>
     .oya {
          color: #000;
     }
     .oya .kodomo {
          color: 111;
     }
     .oya .kodomo .mago {
          color: #111;
     }

[Mixins ミックスイン]
     <scss側>
     @mixin marumi($hankei) {
          -moz-border-radius: $hankei;
          -webkit-border-radius: $henkei;
          border-radius: $hankei;
     }
     .box {
          border: 1px #000 solid;
          @include marumi(4px);
     }

     ↓　コンパイルする

     <css側>
   .box {
     border: 1px #000 solid;
     -moz-border-radius: 4px;
     -webkit-border-radius: 4px;
     border-radius: 4px;
     }

これをCompassで記述してみると…
     <scss側>
     .marumi {
          @include border-radius(4px);
     }

     ↓　コンパイルする

     <css側>
     .marui {
          -webkit-border-radius: 4px;
          -mozt-border-radius: 4px;
          -ms-border-radius: 4px;
          -o-border-radius: 4px;
          border-radius: 4px;
     }
＊最初からMixinsを作るよりもCompassのMixinsを使う方が良い
http://compass-style.org/search/?q=mixins

[Selector Inheritance 継承]
     <scss側>
     .message-box {
          padding: 5px 10px;
          border: 1px black solid;
          font-size: 14px;
          font-weight: bold;
     }

     .alert-box {
          @extend .message-box;
          border: 1px red solid;
          color: red;
     }

     ↓　コンパイルする

     <css側>
     .message-box, .alert-box {
          padding: 5px 10px;
          border: 1px black solid;
          font-size: 14px;
          font-weight: bold;
     }
     .alert-box {
          border: 1px red solid;
          color: red;
     }
＊モジュール単位でうまく継承できればコードを格段に削減することが出来る

最後に…近い将来CSSでも変数を定義できる日がくるみたい
Homebrew


##参考URL
>[Homebrew — OS X用パッケージマネージャー](http://brew.sh/index_ja.html)

>[Homebrew Cask](http://caskroom.io)

>[homebrewとは何者か。仕組みについて調べてみた](http://qiita.com/omega999/items/6f65217b81ad3fffe7e6)

##Homebrewの基本操作
* パッケージ検索

```
$ brew search <パッケージ名>
```

* パッケージインストール・アンインストール

```
$ brew install <パッケージ名>
$ brew remove <パッケージ名>
```

* パッケージの有効化・無効化

```
$ brew link <パッケージ名>
$ brew unlink <パッケージ名>
```

* パッケージ一覧の更新

```
$ brew update
$ brew upgrade
```

* パッケージされたリストの表示

```
$ brew list
```

* デッドリンクになっているものを削除

```
$ brew prune
```

* インストールの問題をチェック

```
$ brew doctor
```

* brewの設定確認

```
$ brew --config
```

##Homebrew install

###1 Homebrewをインストールする。

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

###2 .bashrcと.bash_profileを作成

```
$ touch .bash_profile .bashrc
```

###3 .bash_profileを編集する

```
$ vi .bash_profile

//以下.bash_profile内容
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

###4 以後の設定を.bashrcに記述する。
Homebrew でインストールするものは、「/usr/local/bin」または「/usr/local/sbin」に格納される。ここへパスを通しておく。

```
$ vi.bashrc

//以下.bashrc内容
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH
export HOMEBREW_CASK_OPTS="--appdir=/Applications"shrci
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

###5 brew install

```
$ brew install git
$ curl -L git.io/nodebrew | perl - setup
```


##Homebrew cask install

###1 Homebrew Caskをインストールする。

```
$ brew install caskroom/cask/brew-cask
```

###2 シンボリックリンクを/Applicationsに貼る。

```
$ vi.bashrc
export HOMEBREW_CASK_OPTS="--appdir=/Applications
```

###3 brew cask install

```
$ brew tap caskroom/homebrew-versions
$ brew cask install sublime-text3
$ brew cask install mamp
$ brew cask install dropbox
$ brew cask install firefox
$ brew cask install google-chrome
$ brew cask install google-japanese-ime
$ brew cask install iterm2
$ brew cask install teamviewer
$ brew cask install vlc
$ brew cask install adobe-creative-cloud
$ brew cask install skype
$ brew cask install flash-player
$ brew cask install java
$ brew cask install appcleaner
$ brew cask install imagemagick
```

###4 homebrew-fonts

```
#!/bin/bash

# Add repository
brew tap caskroom/fonts

# fonts
fonts=(
    font-m-plus
    font-source-code-pro
    font-clear-sans
    font-roboto
)

# install fonts
echo "installing fonts..."
brew cask install ${fonts[@]}
```
ダウンロード可能なフォントは，[ここ](https://github.com/caskroom/homebrew-fonts/tree/master/Casks)から確認できる
underscoreコードリーディング（delay）


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



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


##とは


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

こんな説明。
>####.delay(function, wait, *arguments) 
>Much like setTimeout, invokes function after wait milliseconds. 
>If you pass the optional arguments, they will be forwarded on to the function when it is invoked.

```javascript
var log = _.bind(console.log, console);
_.delay(log, 1000, 'logged later');
=> 'logged later' // Appears after one second.
```
------------- 
setTimeoutととても似ています。関数はwaitのミリセカンド分待ってから呼びだされます。
もしargumentsをワアした場合、それらは関数が呼び出されるときに受け渡されます。

###[underscore.delay](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L763)
コード的にはこのあたり。

```javascript

  // Delays a function for the given number of milliseconds, and then calls
  // it with the arguments supplied.
  _.delay = function(func, wait) {
    var args = slice.call(arguments, 2);
    return setTimeout(function(){
      return func.apply(null, args);
    }, wait);
  };

```

argumentsをsliceしたものをargsに格納する。
第二引数にwaitを渡したsetTimeout内でargsを渡したfunc.applyを返す。
setTimeoutを返す。
単位球面に一様分布する乱数版SphericalSpreadパッチを作った

# ランダム版SphericalSpreadをつくった

元ネタは[少し前に書いたProcessingの記事](http://qiita.com/clomie/items/e5dd35dcfcba082b2a7f)。vvvvには元々[SphericalSpread](https://vvvv.org/documentation/sphericalspread-(spreads))という単位球面上の等間隔な座標を生成してくれるめっちゃ便利なSpreadノードがあるんだけど、それのランダム版を作ってみた。

だいたいこんな感じ。比較用にSphericalSpreadと同じ入力を突っ込んだものを並べてみた。
![usage1.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/18abfbf1-71bb-9e43-86d8-9c2bf9bc78f1.png)

![usage2.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/d7aee4f9-1ea6-7de2-89bb-910f1969227c.png)


おおよそSphericalSpreadと同じように使えるようにしたつもりだけど、SphericalSpreadのFactorピンについては座標計算にどう組み込めば実現できるのか、ぱっと思いつかなかったので実装していないです。


# 実装について
前回のコピペだけど、「z軸の値」と「角度」を乱数から生成して、そこからx, yを計算で求める。
x,yの値を求める数式はこんな感じ。詳しくは[前の記事](http://qiita.com/clomie/items/e5dd35dcfcba082b2a7f)とか[このPDF](http://apollon.issp.u-tokyo.ac.jp/~watanabe/pdf/prob.pdf)とかを参照してください。

```math
\begin{aligned}
x & = \sqrt{1 - z^2} * cos(φ) \\
y & = \sqrt{1 - z^2} * sin(φ) \\
\end{aligned}
```

出てきた値に半径を掛けてあげれば座標値がでてくる。乱数の生成は[RandomSpread](https://vvvv.org/documentation/randomspread-(spreads))、三角関数なり平方根なりの計算は[Expr](https://vvvv.org/documentation/expr-(value))ノードを使って実装した。

パッチ全体はこんな感じ。
![patch.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/985d68a2-17e9-21d5-4416-4cbe1dd479c6.png)

z値と角度のRandomSpreadのSeedが同じ値になると球体を描かなくなってしまうし、かと言って両方のSeedをInputピンにするのも気持ち悪かったので、一番上のRandomSpreadで生成した2つの乱数をGetSliceしてそれぞれのRandomSpreadのSeedに入れる、という実装になっています。このあたりはもうちょっとシンプルにしたかったけどうまいやり方が思い浮かばなかった。

ノードを繋いでないピンの値などは実際にパッチを見てもらえれば。
https://github.com/clomie/vvvv-sandbox/blob/master/RandomizedSphericalSpread.v4p


# Spreadまわりのノードに関するTips

## RandomSpreadについて

inputピンの入力値を中心に、プラスマイナス方向にそれぞれwidth / 2の分だけ振れる。今回の場合は
z値側のRandomSpreadはinputに `π` 、widthに `2π` を繋いでいるので、出力は `0` ～ `2π`
角度側のRandomSpreadはinputに `0` 、widthに `2` を入れているので、出力は `-1` ～ `1`
の範囲で値を生成するように設定した。

## Spreadの生成について

任意の長さの連続した(1,2,3,……,n のような)値がSpreadでほしい時は、[Iノード](https://vvvv.org/documentation/i-(spreads))を使う。
任意の値が任意の長さ分繰り返された(1,1,1,……,1 のような)値がSpreadがほしい時は、[Select (Value)](https://vvvv.org/documentation/select-(value-vector))を使う。
Iノードは公式の[Spread Generators](https://vvvv.org/documentation/spread-generators)にも載っているので特に迷わなかったけど、SelectについてはSpreadからいくつかの値を抜き出す用途で使うノードとして載っていたので、しばらくどうすればいいかわからなかった……。

![spread.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/c011bb3a-48de-59d3-f78d-6eac73d47642.png)
munin note


# Set 1 min interval!
Set `graph_data_size` @ munin.conf not only `update step 60`.
Of cource , /etc/cron.d/munin set interval 1min
 
```:munin.conf
update_rate 60
graph_data_size custom 1d, 5m for 1w, 15m for 1y, 1h for 5y
# you should set custom ! normal & huge don't sopport 60 sec step

```

# Convert 5min to 1min
see it.
http://www.sekuda.com/changing_munin_2_to_collect_data_every_minute
http://www.justinsilver.com/technology/linux/change-interval-munin-existing-rrd-data/

1. rrdtool dump -> xml at step 300
2. conv python script xml setp 300 => step 60
3. rrdtool load -> rrd-file setp 60

# windows munin-node
## bins

## metrics
The best way is from WMI.
This munin-node for Windows support WMI plugins.

http://stephenfritz.blogspot.jp/2014/06/windows-server-performance-monitoring.html
http://pastebin.com/C2qykS6m
UE4 でレンダリングへの長い道のりーラフネスとライティングー

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
レンダリングの基礎の基礎
マテリアルのパラメータ「ラフネス」についてのまとめ

# 本文
## ラフネスとは
UE4 のラフネスとは、マテリアルの「粗さの度合い」を 0.0 ～ 1.0 で示すパラメータです。
スムーズ( 0.0 ) <- 中間( 0.5 ) -> ラフ( 1.0 ) という分布になります。
では、ここで言う「粗さ」とは何でしょうか？
答えは、反射光のぼやけ具合の事を指します。即ち、スムーズなものは反射光のぼやけ具合が
低く、ラフなものは反射光のぼやけ具合が高いと言えます。

## 微細表面とは
反射光のぼやけ具合を決める要素は、微細表面(マイクロファセット)という物体表面の非常に
微細な凹凸です。凹凸というと、ポリゴンの法線や法線マップを連想するかもしれませんが、
単位としてはもっと小さいもので、肉眼での視認はできません。しかし、視認できなくても
物体の表面には存在しますし、物理ベースレンダリングにおいてはレンダリング結果に反映
されます。
微細表面の凹凸が少ないほど、光は 1 方向に反射します。同じ方向に反射される為、反射光
のぼやけ具合は小さくなります( 光が収束するイメージです )。逆に、微細表面の凹凸が多い
ほど、光は他方向に反射します。バラバラに反射される為、反射光のぼやけ具合は大きくなり
ます。

## ラフネスの設定例
![Roughness1.jpg](https://qiita-image-store.s3.amazonaws.com/0/106724/025f8738-4a91-372d-efac-adbdb0b243e9.jpeg)
マテリアルエディタからラフネス 0.5 を設定してみました。
球体に当たっている反射光が少しぼんやりしているのが分かると思います。

![Roughness2.jpg](https://qiita-image-store.s3.amazonaws.com/0/106724/06fd037b-9815-b486-6930-a752be559cb6.jpeg)
こちらは、ラフネス 0.0 を設定してます。
球体に鋭いハイライトが見えます。
表面がつるつるな素材だと、このような艶が出ます。

![Roughness3.jpg](https://qiita-image-store.s3.amazonaws.com/0/106724/9d7df3f5-77ba-f18c-592a-6f499498ebe4.jpeg)
こちらは、ラフネス 1.0 を設定してます。
こちらは、球体にハイライトはほとんど見えません。
表面がざらざらな素材だと、このようなマットな感じの表現になると思います。
GoのgRPCでRemote IPを取得する方法

## 結論

`context`の中に`peer`の情報があるのでそこに`net.Addr`が入っている。

```
import (
	"google.golang.org/grpc/peer"
)

func foo(ctx context.Context, ...) {
	var addr string
	if pr, ok := peer.FromContext(ctx); ok {
		addr = pr.Addr.String()
	}
}
```

## 詳細

gRPCのgo実装である[grpc-go](https://github.com/grpc/grpc-go)はサーバ側でリクエストを受け取ってprotobufで生成されたハンドラを呼び出す部分とhttp2自体の実装部分とに分かれています。前者は[server.go](https://github.com/grpc/grpc-go/blob/master/server.go)、後者は[htt2_server.go](https://github.com/grpc/grpc-go/blob/master/transport/http2_server.go)になります。

Remote IPは接続元の情報([Peer](https://github.com/grpc/grpc-go/blob/master/peer/peer.go#L46))としてhttp2の実装側でstreamの中のcontextに格納されています。格納しているのは[ここ](https://github.com/grpc/grpc-go/blob/5da22b92e9485c15a6b284d52cc54d6580864c99/transport/http2_server.go#L179)。

あとはハンドラの第一引数として`context.Context`が渡されるので`peer.FromContext(ctx)`でPeerを取得します。peerのAddrが`net.Addr`なのでそのままString()でも良いですが、IPアドレスのみを取得したい場合は`*net.TCPAddr`に変換すると良いでしょう。

```
import (
	"google.golang.org/grpc/peer"
)

func (s *EchoServer) Echo(ctx context.Context, in *echo.EchoRequest) (*echo.EchoResponse, error) {
	var addr string
	if pr, ok := peer.FromContext(ctx); ok {
		if tcpAddr, ok := pr.Addr.(*net.TCPAddr); ok {
			addr = tcpAddr.IP.String()
		} else {
			addr = pr.Addr.String()
		}
	}
	log.Printf("remote addr: %v", addr)

	return &echo.EchoResponse{Message: in.Message}, nil
}
```
RubyGems



rubyのライブラリはgemで管理されており、RubyGemsはパッケージシステム

RubyGems.orgにgemの形で様々なライブラリが保存されている

# ライブラリをインストール
```
$ gem install hoge
```

# ライブラリを探す
hogeに関するライブラリを探す

```
$ gem search -r hoge
```

hogeに関するライブラリをローカルから検索する

```
$ gem search -l hoge
```

インストール済みのライブラリのリストを得る

```
$ gem list
```
【しずおかアプリ部】活動ログ　第14回

![しずおかアプリ部2.jpg](https://qiita-image-store.s3.amazonaws.com/0/88105/0b676b17-ae43-a84b-caa1-98ec69de5946.jpeg)

■タイトル
第１４回


■開催日
２０１６年１月２３日（土）　１６：００～１８：００


■参加者
１１名


■活動内容（概要）
・菅原プレゼン「Unityはじめるよ　～すごいよサウンド機能　実践編～」

・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第3回 シリアル通信編」

・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～引っ張り具合に上限をつける編～」

・小学生が作ったゲームの紹介



■活動内容（詳細）

・菅原プレゼン「Unityはじめるよ　～すごいよサウンド機能　実践編～」

　Unity5で拡張されたオーディオ機能を実演を交えて紹介。
　ゲームオブジェクトにオーディオリスナーと、オーディオクリップをアタッチする方法。
　オーディオミキサーの作り方と使い方。
　スナップショット機能の利用方法とスクリプトからの切り替え方法。
　
　資料：<a href="http://monolizm.com/sab/pdf/第14回_プレゼン資料(Unityはじめるよ～すごいよサウンド機能 実践編～).pdf">第14回_プレゼン資料(Unityはじめるよ～すごいよサウンド機能 実践編～).pdf</a>
　<a href="http://monolizm.com/sab/voice/14sugawara.mp3">プレゼン音声</a>




・部員さんプレゼン「Arduino入門 ～センサとUnityをつないで遊んでみよう～」
　「第3回 シリアル通信編」

　シリアル通信の仕組み。通信速度の設定が重要。
　ArduinoとPCの接続方法。USBに変換するICが載っている。
　ArduinoとPCとのデータの送受信方法と動作確認方法。シリアルモニタを使う。
　ArduinoとUnityとのデータの送受信方法。Unity側の設定方法、送受信のスクリプト紹介。

　資料：<a href="http://monolizm.com/sab/pdf/第14回_プレゼン資料(シリアル通信編).pdf">第14回_プレゼン資料(シリアル通信編).pdf</a>
　<a href="http://monolizm.com/sab/voice/14member.mp3">プレゼン音声</a>




・保坂プレゼン「Cocos2d-xで作る物理演算ゲーム　～引っ張り具合に上限をつける編～」

　チキンを飛ばすための引っ張り線を一定の長さを超えないようにプログラムで調整する。
　三平方の定理を用いて、線の長さが一定値を超えたら描画をやめる方法。　->　指の動きを追従できないため×
　三平方の定理＋比率の計算を使い、一定値の線分を求める方法。 -> 成功！

　資料：<a href="http://monolizm.com/sab/pdf/第14回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム～引っ張り具合に上限をつける編～).pdf">第14回_プレゼン資料(Cocos2d-xで作る物理演算ゲーム～引っ張り具合に上限をつける編～).pdf</a>
　<a href="http://monolizm.com/sab/voice/14hosaka.mp3">プレゼン音声</a>




・小学生が作ったゲームの紹介

　体験入部で訪れた小学生。
　スクラッチを使って独学でゲームの作成をしていた。
　作ったゲームを紹介させてもらったが、作ったゲームの数も多いし、
　弾幕ゲームなどクオリティが高く、小学生とは思えないセンスの良さ、ゲーム作りの才能を感じた。
[C++] コンマ演算子はオーバーロードできる、ということを知った

# きっかけ

そもそものきっかけは、C++における行列やベクトルを扱うライブラリ「[Eigen](http://eigen.tuxfamily.org/index.php?title=Main_Page "Eigen")」を使ったことであった。

Eigenでは、行列やベクトルの値を直接指定するために、次のようなコードが使えるのである。

    // 各要素がfloat型である3次ベクトル
    Vector3f v1;
    
    // 3つの値を設定する
    v1 << 1, 2, 3;

（参考：[Eigen: Quick reference guide](http://eigen.tuxfamily.org/dox/group__QuickRefPage.html "Eigen: Quick reference guide")）

これを見たとき、最初「コンマは処理を順に行うだけのはずだけど、どうやったら実現できているのだろうか」と気になったのである。で先程ふと「もしかして、コンマ演算子はオーバーロードできる？」と思い至って調べたらまさにその通りであったのである。

# 簡単なコード例

以下のような使い方ができるクラス`ValueList`を考える。これは`int'の値を以下のように指定できるクラスである。

```C++
int main(void){
    ValueList foo;
    
    foo << 1, 2, 3, 5, 8, 13, 21;
    
    // 値を順に出力
    foo.foreach([](int val){
        std::cout << val << std::endl;
    });
}
```

これを実現するためには、方針としては

- `ValueList << value`という演算の結果は、「後ろに`, value`」を続けられる型（仮に`CommaInput`とする）でなければならない
- その`CommaInput`もまた、「後ろに`, value`」を続けられる型でなければならない

ということになる。

まず`ValueList`。`<<`をオペレーターオーバーロードし、`CommaInput`型を生成するようにしている。

```C++
class ValueList{
    std::vector<int> values_;
    
public:
    ValueList(){}
    
    CommaInput operator <<(int value){
        // values_の中をvalue一つだけにする
        values_.assign(1, value);
        
        // その後にコンマ区切りで値が渡せるよう、そのためのクラスを返す
        return(CommaInput(*this));
    }
    
    template <class LambdaType>
    void foreach(const LambdaType & lambda){
        for(std::vector<int>::iterator it = values_.begin(); it != values_.end(); ++it){
            lambda(*it);
        }
    }
};
```

次いで`CommaInput`。これに`ValueList`への参照を保持しておき、カンマ区切りで値が与えられたら実際に値の追加を行う。

```C++
class CommaInput{
    ValueList & vl_;

public:
    CommaInput(ValueList & vl) : vl_(vl) {}

    // オペレーターオーバーロード
    // valueを実際にリストに追加し
    // また続けてカンマ区切りで値を指定できるように自身を返す
    CommaInput & operator ,(int value){
        vl_.values_.push_back(value);
        return *this;
    }
};
```    

ソースコード全体はこちら。（動かすには、C++11のラムダ式に対応したコンパイラが必要です） https://gist.github.com/maraigue/d7b3029b88b28f6c090d

# 参考記事

- [C++ tips 3 カンマ演算子編](http://www.slideshare.net/wraith13/c-tips-3 "C++ tips 3 カンマ演算子編")
  - コンマ演算子のよい使い方についての解説だが、最後にコンマ演算子をオーバーロードする話が出ている。「初期化リストの代わりになるような類いのもの実装可能」とする一方、「見た目からはオーバーロードされていることが予測し辛い為、容易くメンテナンス性の悪いコードになってしまいますので、乱用は厳禁です」とも述べている。
- [GESブログ C++でパラメータ配列を実装する](http://ges.blog.shinobi.jp/c--%E5%AE%9F%E7%94%A8/c--%E3%81%A7%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E9%85%8D%E5%88%97%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B "GESブログ C++でパラメータ配列を実装する")
  - 可変長引数に近いものを実装するために、コンマ演算子のオーバーロードを利用する例。
- [c++ - When to Overload the Comma Operator? - Stack Overflow](http://stackoverflow.com/questions/5602112/when-to-overload-the-comma-operator "c++ - When to Overload the Comma Operator? - Stack Overflow")
  - コンマ演算子をオーバーロードすることが有効な例など。
Rails で Locale をちゃんと使うぞって時に仕込む initializer

大抵の場合 locales をまともに保守しなくなるのは、開発時に『locale 再読み込みの為に Rails 再起動するのめんどくさいし view にベタ書きでもいいよね』ってなるか、『ja.yml 長すぎて保守したくない』とか言う時なので、`.yml` は `app/locales` 以下に置く、と決めて

```ruby:config/application.rb
  config.i18n.load_path += Dir[Rails.root.join('app', 'locales', '**', '*.{rb,yml}').to_s]
  config.i18n.default_locale = :ja
  config.i18n.fallbacks = [:ja, :en, :default]
```

こういうコードと

```ruby:config/initializers/locale_reloader.rb
if Rails.env.development?
  class LocaleReloader
    def initialize(app)
      @app = app
    end

    def call(env)
      I18n.load_path += Dir[Rails.root.join('app', 'locales', '**', '*.{rb,yml}').to_s]
      I18n.load_path.uniq!
      I18n.backend.reload!

      @app.call(env)
    end
  end

  Rails.application.config.middleware.use(LocaleReloader)
end
```

こういうコードを仕込むことにしてる。

リロードがちょっと遅くなるけど、まぁ開発中目的の解決法だしおっけーおっけー。
EaselJS内のDisplayObjectを画像ファイルとして取得する


EaselJSの[createjs.DisplayObject](http://www.createjs.com/docs/easeljs/classes/DisplayObject.html)の要素を画像ファイルとして保存するには、```cache()```メソッドを使用すると便利です。

cache()メソッドを呼び出すとEaselJS内部ではCanvasを生成し、DisplayObjectに描画されているグラフィックスをCanvas上に再度描画し、グラフィックスをCanvasで置き換えて、次回の描画以降はそのCanvasを表示するようになります。その時に生成されるCanvasは```cacheCanvas```プロパティとして取得できます。

cacheCanvasはCanvasのため、```toDataURL()```メソッドを呼び出すことができるので、そこで取得した文字列を、例えばwindow.open()したり、IMGタグのsrcとして指定することで画像として扱う事ができるようになります。

```
var container = new createjs.Container();

〜ほにゃらら〜

// 位置(0,0)からサイズ(200px,200px)分だけCanvasに描画する
container.cache(0,0,200,200);

// 「data:image/png,〜」
var dataUrl = container.cacheCanvas.toDataURL('image/png', null);

window.open(dataUrl);
```

その後、注意しなければいけないこととして、DisplayObjectの**描画を再更新させるには、```uncache()```メソッドを呼び出してDisplayObject内にあるCanvasの参照を破棄させることが必要になります**。

# 全体のソースコード
http://jsdo.it/nyamogera/UReM
ESP8266 > IPアドレスを圧電ブザーで通知

```txt:動作確認
ESP-WROOM-02
圧電ブザー LF-PB30W25C
```

関連 http://qiita.com/7of9/items/844bbedb2dbf20e042b9

## 接続

- IO4 : 圧電ブザーの赤線
- GND : 圧電ブザーのGND

## code (v0.2)

```eps8266_160123_notifyIpadr.ino
#include <ESP8266WiFi.h>
#include "wifiConfig.h"
/*
 * Define your SSID and WiFi password at [wifiConfig.h] using [TemplateWifiConfig.h]
 * 
 */

/*
 * v0.2 2016/01/23
 *   - can notify 4th IP address by sound 
 * v0.1 2016/01/23
 *   - can beep 
 */

static const int kPinSound = 4;
static IPAddress s_myIpAddress;

void sound5()
{
  digitalWrite(kPinSound, HIGH);
  delay(500);
  digitalWrite(kPinSound, LOW);
  delay(100);
}

void sound1(int maxloop)
{
  for(int loop=0; loop < maxloop; loop++) {
    digitalWrite(kPinSound, HIGH);
    delay(100);
    digitalWrite(kPinSound, LOW);
    delay(100);
  }
}

void soundLastIp(int lastIp)
{
  int workIp = lastIp;
  if (workIp >= 5) {
    sound5(); 
    workIp -= 5;
  }
  sound1(workIp);
}

void setup() {
  WiFi.begin(kWifiSsid, kWifiPass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }
  Serial.begin(115200);
  
  pinMode(kPinSound, OUTPUT);

  s_myIpAddress = WiFi.localIP();
}

void loop() {
  soundLastIp(s_myIpAddress[3]);
  delay(5000);
}
```

### 別途必要なファイル

wifiConfig.h > WiFi接続設定を記載したファイル

参考 http://qiita.com/7of9/items/a61999a914ae02673b8d

### 実行

5秒おきにIPアドレスの4番目が圧電ブザーの音で通知される。

これで単体動作時にESP8266のIPが分かる (1から3番目のIPは同ネットワークに接続のPCやMacやLinuxから知ればいい)。
Arduino > Link > IPAddressクラス / IPアドレスの各値を取得 > [0]..[3]

```txt:動作確認
ESP-WROOM-02
```

IPアドレスを圧電ブザーで通知しようとしている。

WiFi.localIP()からIPアドレスの最後の数値を取得しようとして、ひっかかっていた。

https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/IPAddress.h
にIPAddressクラスのメソッドが記載されている。

このヘッダーファイルから理解したのが以下のような使い方で、各値が取得できるとのこと。

```
IPAddress ipadr = WiFi.localIP();
Serial.println(ipadr[0]);
Serial.println(ipadr[1]);
Serial.println(ipadr[2]);
Serial.println(ipadr[3]);  
```
dotfileの更新を楽にしてみた

dotfileはgitで管理しているのですが、編集した後のコミットが面倒でついつい後回しに。
vagrantの中で変更してたりすると、`$ vagrant destroy`と共に電子の彼方へなんて事も。

というわけで、何処からでもコミット出来るdotfileコマンドを作ってみました。
[ryog/dotfiles](https://github.com/ryog/dotfiles/blob/master/bin/dotfile)
作ってみたといっても、自分の環境で使う専用です。

真面目にシェルスクリプトを書いたことがなかったので、rbenvを参考というか丸パクリ。
こんな真面目に作らないでも、DOTFILE_DIRとか用意してcdすればいいんだろうけどさ。

シェルスクリプトの勉強にもなったので結果オーライです。
ESP8266 > 圧電ブザーを鳴らす

```txt:動作確認
ESP-WROOM-02 (ESP8266)
```

http://qiita.com/7of9/items/844bbedb2dbf20e042b9
でRPiでやったことをESP8266で行う。

GPIOの使い方は以下を参考にした。
http://qiita.com/exabugs/items/a08282b47cf46614fb5e

### 接続

ESP-WROOM-02の右下のIO4に圧電ブザーの赤線を接続した。

### code (v0.1)

```esp8266_160123_buzzer
static const int kPinSound = 4;

void setup() {
  Serial.begin(115200);
  pinMode(kPinSound, OUTPUT);

  digitalWrite(kPinSound, HIGH);
  delay(500);
  digitalWrite(kPinSound, LOW);
}

void loop() {

}
```

起動時に音がなった。　

### code (v0.2)

長音と短音の実装。

```esp8266_160123_buzzer
static const int kPinSound = 4;

void sound5()
{
  digitalWrite(kPinSound, HIGH);
  delay(500);
  digitalWrite(kPinSound, LOW);
  delay(100);
}

void sound1(int maxloop)
{
  for(int loop=0; loop < maxloop; loop++) {
    digitalWrite(kPinSound, HIGH);
    delay(100);
    digitalWrite(kPinSound, LOW);
    delay(100);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(kPinSound, OUTPUT);

  sound5();
  sound1(4);
}

void loop() {

  while(1) {
    sound5();
    sound1(4);
    delay(3000);
  }
}
```
SetConsoleCtrlHandlerで登録したハンドラ関数を実行するスレッド

Windows APIのSetConsoleCtrlHandler()で登録したハンドラ関数が呼び出される際、メインスレッドとは別のスレッドが新たに生成されて実行されます。以下、確認用のコード。

```c:ConsoleCtrlTest.c
#include <stdio.h>
#include <windows.h>

BOOL WINAPI HandlerRoutine(__in DWORD dwCtrlType);

int main(int argc, CHAR *argv[])
{
    SetConsoleCtrlHandler(HandlerRoutine, TRUE);

    printf("main : %d\n", GetCurrentThreadId());

    for(;;);

    return 0;
}

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
    printf("HanlerRoutine : %d\n", GetCurrentThreadId());

    return FALSE;
}
```

#参考文献

1. [MSDN : SetConsoleCtrlHandler 関数][1]

[1]: (https://msdn.microsoft.com/ja-jp/library/cc429733.aspx)
Rails 多対多の関連先をcheckboxのformにする

※この記事の内容は以下の記事を自分で解釈してまとめ直しただけです。
http://qiita.com/hamichamp/items/8cf980e6d5ca9fd7e96f

## 概要

例は、本とタグ(予め用意された母集団からチョイスするUI）を想定。

```text:ER図っぽいもの
book 1-* book_tag *-1 tag
```

多対多で関連を貼ると、「参照先_ids」というプロパティが作られる。
そいつにIDの配列を渡すと、nested_attributesを使うまでもなく、関連を作成できる。
formのhelperとしては collection_check_box が便利。

# サンプル

```ruby:model
class Book
  hasmany :book_tags
  hasmany :tags, through: :book_tags
end

class BookTag
  belongs_to :book
  belongs_to :tag
end

class Tag
  hasmany :book_tags
  hasmany :books, through: :book_tags
end
```

```ruby:controller
class BooksController < xxx
  # ~中略~
  def book_params
    params.require(:book).permit(
      tag_ids: [],
    )
  end
end
```

```ruby:view(_form.html.slim)
= form_for @book do |f|
  .field
    = f.collection_check_boxes :tag_ids, Tag.all, :id, :name do |ff|
      = ff.label { ff.check_box + ff.text }
  
  = f.submit
```
RacketでSICP

SICPの問題を実行するのに、Racketというlispの統合開発環境を使っている。
(以前PLT SchemeやDrRacketという名前だった)
素の状態でも1章の問題には対応していて、以下のようにrequireでプラグインを指定することで2章の図の問題も実行できる。これはアインシュタインを表示する。

```scheme
#lang racket
(require (planet soegaard/sicp:2:1/sicp))

(paint einstein)

```

以下は古い形式。

```scheme
#lang racket
(require (planet "sicp.ss" ("soegaard" "sicp.plt" 2 1)))

```

線分もひける。

```scheme
(paint (segments->painter (list (make-segment (make-vect 0 0) (make-vect 1 1)))))
```

インストールされていなければネットワーク上から持ってくる仕組みになっているぽい。すばらしい。manualはここにある。
https://planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/sicp-manual.txt
https://github.com/sicp-lang/sicp/blob/master/sicp-pict/sicp-manual.txt


以前のバージョンだと、neilさんのsicpパッケージが定番だったが、図の関数の一部が動かなかった。
neil/sicpの使い方は、先頭に

```scheme
#lang planet neil/sicp
```

か、または、

```scheme
#lang racket
(require (planet neil/sicp:1:17/main))
```

のいずれかを書く。アインシュタインも表示できる。
ただし、線分を引くのは失敗した。

```scheme
#lang planet neil/sicp

(paint (segments->painter (list (make-segment (make-vect 0 0) (make-vect 1 1)))))
```

これは expected: list? というエラーになる。
neil/sicp環境だと (cons 1 2) は (mcons 1 2) と表示される。どうやらconsやlistがmconsというmutableなオブジェクトになるようで、普通のlistを作って渡すことができなかった。

ちなみにRacket 5.3.6までだと、neil/sicpをインストールすることで、言語にPLT Schemeが追加される。
その状態だと #lang を書かなくてよく手軽である。
RPi > 圧電ブザーで音を鳴らす > LF-PB30W25C / LF-MB12B06 

```txt:動作環境
Raspberry Pi2
```


圧電ブザーを2種類買ってきた。


### 圧電ブザー1 > LF-PB30W25C

とりあえず試したのが以下。

- LF-PB30W25C
  - http://eleshop.jp/shop/g/gB6N361/
  - メーカー > ARIO
  - 216円
  - 動作電圧 > 3Vから30V
  - 消費電流 > 9mA
  - 電圧が変わると音の大きさが変わる

### 接続
[element14](http://www.element14.com/community/servlet/JiveServlet/previewBody/73950-102-4-309126/GPIO_Pi2.png)のGPIO参照

- Pin # 06 : ブザーのGND
- Pin # 10 : ブザーの赤線

### code (v0.1)

```buzzer.py
#!/usr/bin/env python

import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BOARD)

GPIO.setup(10, GPIO.OUT)

GPIO.output(10, True)
time.sleep(0.5)
GPIO.output(10, False)
```

「ピーっ」と鳴った。

### 用途

圧電ブザーの用途は２種類

1. Vivadoの処理が終わった時の通知に使う
2. ESP8266のIPアドレス通知用 (４つめの数値のみ)

### code (v0.2)

用途２のための実装をした。

長音が５を表し、短音が１を表す。その組み合わせでIPアドレスの４つめの数値（モバイル環境では１０未満を想定）が分かる。

```buzzer.py
#!/usr/bin/env python

import time
import RPi.GPIO as GPIO

pinSound = 10

def sound5():
    GPIO.output(pinSound, True)
    time.sleep(0.5)
    GPIO.output(pinSound, False)
    time.sleep(0.1)

def sound1(loop):
    for idx in range(1, loop+1):
        GPIO.output(pinSound, True)
        time.sleep(0.1)
        GPIO.output(pinSound, False)
        time.sleep(0.1)

GPIO.setmode(GPIO.BOARD)
GPIO.setup(pinSound, GPIO.OUT)

# 9
sound5()
sound1(4)
```

### 圧電ブザー2 > LF-MB12B06

http://eleshop.jp/shop/g/gB6N363/

- 動作電圧：3～7V
- 消費電流：30mA(max)

上記の接続とコードで試してみた。
音がでかく夜に使うのはだめだ。

道具箱直行。
BFGを使ってgitリポジトリから巨大なファイルを削除してみた

# BFGを使うべき状況

- gitに機密情報（パスワード、AWSのキー、秘密鍵）をコミット、pushしてしまったのでリポジトリから完全に削除したいとき
- 巨大なファイルを削除してリポジトリを軽量化したいとき
- `git filter-branch`のコマンドは複雑で間違えそう

# 特徴

- Scalaで書かれているのでJavaが必要
- gitより速い
- 使い方がシンプル

BFG公式サイト
https://rtyley.github.io/bfg-repo-cleaner/
githubの公式ページでもBFGを使う方法が紹介されている。
https://help.github.com/articles/removing-files-from-a-repository-s-history/

使い方は基本的にBFG公式サイトの「Usage」に書いてある通りだが、試しに一通りやってみた。以下はその記録。

# やってみた記録

まずBFGをダウンロードして、シェルでaliasを設定する。

    wget http://repo1.maven.org/maven2/com/madgag/bfg/1.12.8/bfg-1.12.8.jar
    alias bfg='java -jar bfg-1.12.8.jar'

テスト用リポジトリをcloneしてくる。このとき`--mirror`をつける。

    git clone --mirror git@github.com:aosho235/gittest.git
    cd gittest

試しに大きなファイル（bfg-1.12.8.jar 14MB）をコミットしてみる。

    cp ../bfg-1.12.8.jar .
    git add bfg-1.12.8.jar
    git commit -m "add bfg"

BFGを実行してみる（10MBより大きなファイルを削除）。

    cd ..
    bfg --strip-blobs-bigger-than 10M gittest

```
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Using repo : /home/aoyama/gittest/.git

Scanning packfile for large blobs: 1Scanning packfile for large blobs: 20
Scanning packfile for large blobs completed in 23 ms.
Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed?
Please specify tasks for The BFG :
bfg 1.12.8
Usage: bfg [options] [<repo>]

  -b <size> | --strip-blobs-bigger-than <size>
        strip blobs bigger than X (eg '128K', '1M', etc)
  -B NUM | --strip-biggest-blobs NUM
        strip the top NUM biggest blobs
...
```

BFGは安全のためデフォルトではHEADに変更を加えないという仕様なので、何も削除されなかった（と思ったが、単に後述のようにpackされてないから削除されなかったのかも）。

ではjarを削除してコミットしてみる。

    cd gittest
    git rm bfg-1.12.8.jar
    git commit -m "remove"

もう一度BFGを実行する。

    cd ..
    bfg --strip-blobs-bigger-than 10M gittest

さっきと同じメッセージが出る。まだ削除されないようだ。
「does the repo need to be packed?」と言っているので、`git gc`してみる。

    cd gittest
    git gc

もう一度BFGを実行する。

    cd ..
    bfg --strip-blobs-bigger-than 10M gittest

```
...
Deleted files
-------------

    Filename         Git id
    -----------------------------------
    bfg-1.12.8.jar | abbfd6bd (13.9 MB)


In total, 3 object ids were changed. Full details are logged here:

    /home/aoyama/gittest.bfg-report/2016-01-23/18-52-18

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
...
```

今度は削除された。
「BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive」
というメッセージが出ている。
この時点では`du -h`してもまだディスク使用量は減っていない。
言われたとおりのコマンドを実行してみる。
    
    git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
完全に削除され、`du -h`でディスク使用量が減っていることが確認できた。

最後にgithubにpushする。

    git push

cloneしたときに--mirrorをつけていたので、このpushで全てのrefがpushされるらしい。
全ての開発者にcloneし直してもらう。
Railsとdeviseで複数のモデルを管理するときのstrong parametersの設定方法


#Railsとdeviseで複数のモデルを管理するときのstrong parametersの設定方法
deviseのwikiとかにも書いてあるんだけどそれじゃ実装できなかったので、一応ここにまとめておく
deviseで扱うモデルがUserだけじゃなくて複数ある場合のstrong parametersの設定方法
[この記事](http://easyramble.com/strong-parameters-on-rails-devise.html)に1つのモデルの時と複数のモデルの時のだいたい方法書いてあるんだけど、複数のモデルのやつが本当に若干違うのでまとめておく。
まとめというか補足情報的な感じ
開発環境

```
ruby '2.2.0'
rails '4.2.1'
devise '3.5.1'
```
## 「独自のサニタイザーを定義する方法の部分」を変更
Devise::ParameterSanitizerを継承してサニタイザーを定義する。

```
変更前
class User::ParameterSanitizer < Devise::ParameterSanitizer
  def sign_in
    default_params.permit(:username, :email)
  end
end

変更後
class UserParameterSanitizer < Devise::ParameterSanitizer
  def sign_up
    default_params.permit(:name, :email, :password)
  end
end
```
とする。
要するに

```user_parameter_sanitizer.rb
User::ParameterSanitizer
#を
UserParameterSanitizer
#にしないとエラーが出るのと、
#登録する時のメソッドを定義し直さないといけないから
sign_in
#から
sign_up
#にする。
```
以上。

あとは[この記事](http://easyramble.com/strong-parameters-on-rails-devise.html)にあるように

```application_controller.rb
protected

  def devise_parameter_sanitizer
    if resource_class == User
      UserParameterSanitizer.new(User, :user, params)
    else
      super # Use the default one
    end
```
を追加するだけ。



### Sanitizerをどこに置くのが正解なのかわからなかった
Sanitizerをどこに置くのが正解なのかわかんなかったからとりあえずlib/の下に置いた。
どこに置くのが適切なのか教えて下さい。。m(_ _)m
lib以下のautoloadの仕方とか命名規則的なのは[この記事](http://easyramble.com/auto-load-rails-lib.html)に載ってるので参考にしてくだされ。



## 参考記事一覧
[Rails の認証プラグイン Devise での Strong Parameters について](http://easyramble.com/strong-parameters-on-rails-devise.html)
[Rails4 で lib ディレクトリの自作ライブラリを autoload](http://easyramble.com/auto-load-rails-lib.html)
[Rails 4 + Custom Devise attributes — ParameterSanitizer Error - Stackoverflow](http://stackoverflow.com/questions/20527235/rails-4-custom-devise-attributes-parametersanitizer-error)
初心者用gitを運用する際のコマンドまとめ


## はじめに
会社でもプライベートでもgitを利用する機会が増えてきました。
git-flowとはなんぞやって問いにすぐに答えられるほど堪能ではありませんが、
gitを利用する際によく使うコマンドをまとめます。
主に自分用。


## 時系列でのコマンドまとめ
### プロジェクト開始時点

```terminal
git init
```


プロジェクトのルートディレクトリで上記コマンドを実行すると、
.gitファイルが作成されます。

### リモートリポジトリにアップロード
最初にどこかのホスティングサービス(github, bitbucket)で
アカウント取得やリポジトリの作成を行います。
だいたいそこに書いていますが、こんな感じでホスティングサービスにアップします。

```terminal
git remote add origin <ホスティングサービスから与えられるURL>
```

remoteリポジトリの指定です。
originって名前でURLを指定するよって意味と思ってる。


### ファイルをステージングアップ、コミット、リモートへアップロード
今の所、branchを切ってないのでmasterブランチにいるはず。


```terminal
git add . # サブディレクトリも含めたファイルをインデックス領域へアップ
git commit -m "message" # ローカルリポジトリへコミット
git push origin master # masterブランチの内容をoriginへアップロード
```

### ブランチの作成
git-flowみたいな運用を目指して


``` terminal
git branch develop # developブランチ作成
git checkout develop # developブランチへ移動
git checkout -b develop # developブランチを作成・移動
git branch # 自分のいるブランチに*がついてる
git push origin develop # リモートリポジトリにブランチ登録
```


上記を利用してfeature-testブランチを作成したていで
以下記載。


### ブランチのマージ

```terminal
git checkout develop # feature-testブランチからdevelopへ移動
git merge feature-test # feature-testブランチをdevelopへマージ
git branch -d feature-test # feature-testブランチ削除
```

### masterへ統合、タグ付与

``` terminal
git checkout master # masterブランチへ移動
git merge develop # developブランチをmasterブランチに取り込む
git tag v0.1 -m "message" # タグv1.0を付与、メッセージ付き
git tag # タグの確認
```

### masterをpush, タグもpush

``` terminal
git push origin master # masterブランチをリモートリポジトリへ反映
git push origin v0.1 # タグv0.1もリモートへ反映
```

### 作業ディレクトリの変更を元に戻す

``` terminal
git checkout .
```


## 最後に

何かと開発の際はgitが主役になってきました。
が、まだまだsubversionが自分の周りには多いです。
そのため、ひさびさに使う際は毎回ググってたので
基本的すぎるコマンドたちですがまとめてみました。

※変更履歴
2016/01/25 作業ディレクトリの変更を元に戻す　追加
Xcodeで、Enable Bitcodeの設定が表示されない場合の対策方法

CordovaのGoogle Admob Pluginを追加後に実機で実行できなくなったため、原因を調査したところ、以下のページがヒット。

「Cordova で Archive 時に bitcode 周りでエラーが出た際の対処法」
http://phiary.me/cordova-bitcode-error-xcode-setting/

＞Xcode の build setting で bitcode を検索して YES になっているところを NO に変更します.
との事なので、早速bitcodeをさがすと・・・

<img width="660" alt="ss1.png" src="https://qiita-image-store.s3.amazonaws.com/0/87709/adac3e21-8a27-9705-ec6b-c92406ed60ab.png">

更に調査した結果、以下の箇所を「Basic」から「All」に変更したら表示され、無事にエラーも解消しました。
<img width="617" alt="ss2.png" src="https://qiita-image-store.s3.amazonaws.com/0/87709/b65fff1d-5487-98dd-7c94-67419a57fc75.png">
Golang Interfaceの使い方 その2

[Golang interfaceの使い方]
(http://qiita.com/TakaakiFuruse/items/6130ec2e7de1a38f7470)という記事を書いたが､ちょっと難しく考えすぎていたかもしれない｡

JavaScriptでthisとPrototypeを使ってOOPするのとおなじように考えれば理解しやすいのかも｡

#問題
[ここから引用](http://www.freecodecamp.com/challenges/repeat-a-string-repeat-a-string)

文字列と数字を渡すと数字の文だけ文字列を繰り返して出力しろ
例えば　"abc" と　3　だと　"abcabcabc"のようになる｡

##解法への考え方
単純に引数を食わせてやればいいのだが､GoでFunctionに文字列と数字のように違ったタイプの引数を食わせるやり方が良くわからなかった｡

で､いろいろ考えた末にInterfaceを使ってみた｡
(ちゃんとしたやり方はコメント欄を参照のこと｡)

#テストコード

```go
package repeatString

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func Test(t *testing.T) {
	assert.Equal(t, Repeat{words: "*", num: 3}.repeat(), "***", "1")
	assert.Equal(t, Repeat{words: "abc", num: 3}.repeat(), "abcabcabc", "2")
	assert.Equal(t, Repeat{words: "abc", num: 4}.repeat(), "abcabcabcabc", "3")
	assert.Equal(t, Repeat{words: "abc", num: 1}.repeat(), "abc", "4")
	assert.Equal(t, Repeat{words: "*", num: 8}.repeat(), "********", "5")
	assert.Equal(t, Repeat{words: "abc", num: -2}.repeat(), "", "6")
}
```

#コード

```go
package repeatString

type Repeat struct {
	words string
	num   int
}

func (r Repeat) repeat() string {
	var s string

	for i := 1; i <= r.num; i++ {
		s += r.words
	}
	return s
}
```

回りくどいがJSでやるとこんな感じ

```js
function repeat(str, num) {
    doRepeat = new Repeater(str, num)
    doRepeat.doRepeat()
}

function Repeater(str, num) {
    this.str = str
    this.num = num
}

Repeater.prototype.doRepeat = function() {
    var s = ""
    self = this
    for (var i = 1; i <= self.num; i++) {
        s += self.str
    };
    console.log(s)
    return s
}
```
evilの/?nNでmigemo検索

evilの/?でmigemo検索をしたいので調べました。

```el
(setq evil-regexp-search nil)
```
でいけるかと思ったのですが、n/Nコマンドでの再検索がうまくいきませんでした。

いろいろ試行錯誤した結果、結局関数を再定義しました。

```el
(defun evil-search-function (&optional forward regexp-p wrap)
  "Return a search function.
If FORWARD is nil, search backward, otherwise forward.
If REGEXP-P is non-nil, the input is a regular expression.
If WRAP is non-nil, the search wraps around the top or bottom
of the buffer."
  `(lambda (string &optional bound noerror count)
     (let ((start (point))
           (search-fun ',(if regexp-p
                             (if forward
                                 're-search-forward
                               're-search-backward)
                           (if forward
                               'migemo-forward
                             'migemo-backward)))
           result)
       (setq result (funcall search-fun string bound
                             ,(if wrap t 'noerror) count))
       (when (and ,wrap (null result))
         (goto-char ,(if forward '(point-min) '(point-max)))
         (unwind-protect
             (setq result (funcall search-fun string bound noerror count))
           (unless result
             (goto-char start))))
       result)))
```

search-forward/search-backwardをmigemo-forward/migemo-backwardにしただけです。
何かもっと良い方法があればと思うのですが、なかなか難しいです。
RubyMineでのGit操作「作業を取り消したい」

# 想定環境

- Mac OS X 10.11
- RubyMine 8.0.3

プロジェクトディレクトリは次のパス。

```
/Users/kyoshida/RubymineProjects/eslplayer
```

# 課題

使用頻度の高いと思われる Git 操作について、次の内容を簡単に解説している。

- RubyMine での作業方法
- Version Controll ウインドウの Console タブの出力内容から実際に実行されている git コマンド

## 未コミットの変更を取り消し

コミットしていないファイルを編集したあとで、その変更を取り消したい。

### 方法

Version Controll ウインドウで対象のファイルを右クリックして、Revert... を選択する。
![revert1.png](https://qiita-image-store.s3.amazonaws.com/0/36122/a690e767-1551-266d-cbdc-298cba115dec.png)

ダイアログが表示されるので、取り消したいファイルにチェックされている事を確認して Revert ボタンをクリックするとそのファイルの取り消しが行われる。
![revert2.png](https://qiita-image-store.s3.amazonaws.com/0/36122/13091395-5917-3e43-cb58-e284eb736114.png)

### Console

```
cd /Users/kyoshida/RubymineProjects/eslplayer
git -c core.quotepath=false rm --cached -f -- eslplayer.rb
cd /Users/kyoshida/RubymineProjects/eslplayer
git -c core.quotepath=false checkout HEAD -- eslplayer.rb
```

1. プロジェクトディレクトリに移動
2. ファイルを管理対象から削除
3. プロジェクトディレクトリに移動
4. ファイルをHEADに戻す

`-c core.quotepath` はパスを表示する際の表示オプション。UTF-8環境でパスやファイル名に日本語などの文字がある場合にエスケープされて表示が意図しないものになるため、`false` にて回避している。

- [git-config(1)](https://www.kernel.org/pub/software/scm/git/docs/git-config.html)

## コミット済みの変更を取り消し

コミットしたあとで、そのコミットを取り消したい。

### 方法

Log タブからひとつ前のコミットハッシュを取得する。戻りたいコミットを右クリックして、Copy Revision Number を選択する。これでコミットハッシュがクリップボードにコピーされる。
![reset1.png](https://qiita-image-store.s3.amazonaws.com/0/36122/9c136f1f-51b9-93dd-3dff-68fe6339bbaa.png)

VCS -> Git -> Reset HEAD.. メニューを選択する。
![reset2.png](https://qiita-image-store.s3.amazonaws.com/0/36122/386e169d-4a89-2ade-e2af-aca76b2ef202.png)

To Commit 欄に先ほど取得したコミットハッシュを入力して、Reset ボタンをクリックすると、入力したコミットに戻る。
![reset3.png](https://qiita-image-store.s3.amazonaws.com/0/36122/f9e0e767-7f51-c361-c8b4-62f740ccc976.png)

Reset Type については次のページが参考になる。

- [git reset についてもまとめてみる - murankの日記](http://d.hatena.ne.jp/murank/20110327/1301224770)

### Console

```
cd /Users/kyoshida/RubymineProjects/eslplayer
git -c core.quotepath=false reset --mixed HEAD --
```

## コミットメッセージのみ変更

コミットした内容は良いが、そのメッセージのみを変更したい。

### 方法

不明。

- [Commit Changes Dialog](https://www.jetbrains.com/idea/help/commit-changes-dialog.html)

によると Commit Changes ダイアログに表示されそうだが、表示されない。

コマンドラインで代用する。

```
git commit --amend
```

> インデックスにファイルを登録していない状態で --amend オプションを指定して再コミットを行います。コメントの入力画面が表示されるので、コメントを修正します。

- [コミットログ操作 | 逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/log.html)
python: locals()とglobals()の使い方

#locals()
`locals()`は自身のローカル領域の変数の値を全て辞書形式で返してくれる。

```
def addspam(fn):
	def new(*args):
		print("spam. spam. spam")
                print(locals())
		return fn(*args)
	return new

@addspam
def useful(a, b):
	print(a**2 + b**2)

useful(3,4) # spam, spam, spam\n{'args': (3, 4)}
```

#globals()

も同様な形でグローバル変数を返してくれる

```
>>> y = 30
>>> globals()
{..., 'y': 30} #Pythonが自動的に作るグローバル変数が他にも表示されるが省略
```

#参考リンク

- [Pythonのデコレータを理解するための12Step](http://qiita.com/_rdtr/items/d3bc1a8d4b7eb375c368#2-11)
- [What's the difference between globals(), locals(), and vars()?](http://stackoverflow.com/questions/7969949/whats-the-difference-between-globals-locals-and-vars)
animate.css で何回もアニメーションさせたいがremoveClass()でうまく行かなかった話


```js
function doSomething(elem){
  elem.removeClass('animated bounceIn').addClass('animated bounceIn');
}
```

で `doSomething()` を呼び出すたびにアニメーションさせようとしてもできなかった。

```js
elem.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
  elem.removeClass('animated bounceIn');
});
elem.addClass('animated bounceIn');
```

とする必要があるらしい。

長ったらしいので

```animate.js
var animate = {
  do: function(elem, type){
    elem.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
      elem.removeClass('animated '+ type);
    });
    elem.addClass('animated '+ type);
  }
}
```

というの作って `animate.do(elem, 'bounceIn')` で呼び出せるようにして解決した
Git rm をしようとすると「Argument list too long」と出る時の対処法

# 概要
[あとからまとめて.gitignoreする方法](http://qiita.com/yuuAn/items/b1d1df2e810fd6b92574)
上の記事で、gitignoreを参照し、ファイルをまとめてレポジトリーから削除しようとした時に、
```-bash: /usr/bin/git: Argument list too long```
と、なってしまう問題の対処法

# 方法

以下のコマンドで実行する

```git ls-files --full-name -i --exclude-from=.gitignore | xargs git rm --cached```
iOS 9.0 Cordovaに更新したら、ajaxが動かなくなりました


アプリのバージョンアップを行った際に、ajaxが動かなくなりましたので、その解決方法を調べました。

## info.plistを調整する
```plist
<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key><true/>
</dict>
```

## 参考サイト
http://stackoverflow.com/questions/32706656/ajax-not-working-in-ios-9-0-cordova

## 実装済みアプリ
* [FXAlert - 外為のアラート通知アプリ](http://www.itmarlin.com/page-fx-alert.html)
Rails delayed_jobのworker数を変更してrestartするときの注意

# delayed_jobのworker数を変更してrestartすると前に起動していたプロセスが消えない

## [現象]Capistranoでdeployする時にdelayed_jobのワーカー数を変更すると古いワーカーが残ってしまう

最初にワーカーを1個にしてdeployしておいて、処理数が足りなくなってワーカーを2個に増やした場合、

```
delayed_job.0 (新)
delayed_job.1 (新)
delayed_job (古)
```
という状態になる。

ちなみにワーカーを3個から2個に減らすと

```
delayed_job.0 (新)
delayed_job.1 (新)
delayed_job.2 (古)
```
となる。

## [原因]number_of_workersオプションの挙動

### number_of_workersオプション無しで実行する
delayed_jobというプロセスが起動する

```
$ bundle exec bin/delayed_job start
delayed_job: process with pid 7665 started.

$ ps aux | grep [d]elayed_job
ubuntu    7665 32.9  7.9 731312 322824 ?       Sl   15:42  11:41 delayed_job
```

### number_of_workersオプションありで実行する
suffixが付く

```
$ bundle exec bin/delayed_job --number_of_workers 2 start
Use "rmagick" instead
delayed_job.0: process with pid 7881 started.
delayed_job.1: process with pid 7887 started.

$ ps aux | grep [d]elayed_job
ubuntu    7881 33.9  5.4 564336 220212 ?       Sl   16:19   0:04 delayed_job.0                                   
ubuntu    7887 31.4  5.4 564692 220324 ?       Sl   16:19   0:04 delayed_job.1
```

### オプションありで実行したあとに、オプション無しでrestartしてみる

suffixが付いているプロセスは生きたままで、新たにdelayed_jobというワーカーが生まれる。

```
$ bundle exec bin/delayed_job restart
delayed_job: warning: no instances running. Starting...
delayed_job: process with pid 7939 started.

$ ps aux | grep [d]elayed_job
ubuntu    7881 42.2  7.6 653708 309632 ?       Sl   16:19   0:46 delayed_job.0                                   
ubuntu    7887 41.9  7.6 653896 309740 ?       Sl   16:19   0:45 delayed_job.1                                   
ubuntu    7939 41.4  5.5 568964 224836 ?       Sl   16:21   0:12 delayed_job
```

### ソース
ここ。
1個以上の場合にはプロセス数にsuffixを付ける。
stopする時には、stopの時に渡されたnumber_of_workersからプロセスを探すので、stopから漏れるワーカーが生まれる。
https://github.com/collectiveidea/delayed_job/blob/master/lib/delayed/command.rb#L97

# Capistranoでの対策
## capistranoでdeployする時の対応
config/deploy.rb内で、今起動しているワーカーの全pidを探して来てTERMを送るようにする。
これでうまく動いた。
ソースの一部は、daemonsというgemでワーカーをstopする時のものを拝借。

```config/deploy.rb
(snip)
  task :stop_all_delayed_job do
    on roles(:worker) do
      within release_path do
        begin
          pids = capture(:cat, "tmp/pids/delayed_job*")
        rescue
          info "there is no delayed_job process."
          next
        end
        pids.split("\n").each do |pid_s|
          pid = pid_s.to_i
          begin
            execute(:kill, '-s', 'TERM', pid)
            Timeout.timeout(5, TimeoutError) do
              while (execute(:kill, '-s', 'EXIT', pid) rescue false)
                 sleep(0.1)
              end
            end
          rescue ::Exception => e
            puts "exception while trying to stop monitor process #{pid}: #{e}"
          end
        end
        begin; File.delete("tmp/pids/delayed_job*"); rescue ::Exception; end
      end
    end
  end
  
  after 'restart', 'stop_all_delayed_job'
  after 'stop_all_delayed_job', 'delayed_job:start'
(/snip)
```

# まとめ
みんな困ってるんじゃないかと思ったので、公式に解決策があるんじゃないかと思いつつもこれで解決。