OmniAICreator/Qiita-1.07M huggingface dataset:
Node.jsの管理をHomebrewからnodebrewに変える

## Node.js のバージョンを切り替えて使いたい！

というわけで、今まで Homebrew で node パッケージをインストールしてきたのですが、[nodebrew](https://github.com/hokaccha/nodebrew) で好きなバージョンの Node.js を使えるようにしたいと思います。

### Homebrew の node パッケージをアンインストール

Homebrew で node をインストールしていない人は次項へ進んでください。

```bash
$ brew uninstall node
```

### nodebrew を Homebrew でインストール

nodebrew は Homebrew のパッケージになっていますので、brew install で入れてみます。

Homebrew を使わず、直接インストールしたい方は [nodebrew GitHub リポジトリの README](https://github.com/hokaccha/nodebrew) をご参照ください。 

```bash
$ brew install nodebrew
```

### nodebrew の初期設定

Homebrew からインストールした場合、完了する際に以下のようなメッセージが表示されます。

```bash
You need to manually run setup_dirs to create directories required by nodebrew:
  /usr/local/opt/nodebrew/bin/nodebrew setup_dirs

Add path:
  export PATH=$HOME/.nodebrew/current/bin:$PATH

To use Homebrew's directories rather than ~/.nodebrew add to your profile:
  export NODEBREW_ROOT=/usr/local/var/nodebrew
```

メッセージの通りに初期設定を行います。

```bash
$ /usr/local/opt/nodebrew/bin/nodebrew setup_dirs
```

（代わりに ```/usr/local/opt/nodebrew/bin/nodebrew setup``` を実行しても設定できるようです。実際 GitHub の README では setup を実行するよう書かれています。ここでは Homebrew のメッセージの方法を紹介しますが、今後変更があるかもしれません）

~/.bashrc に下記のとおり追記します。

```bash:.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
export NODEBREW_ROOT=/usr/local/var/nodebrew
```

~/.bashrc を読み込みます。

```bash
$ source ~/.bashrc
```

正しくパスが通れば、 nodebrew が使えるようになっているはずです。

```bash
$ nodebrew help
nodebrew 0.9.7

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install <version> (compile from source)
    nodebrew install-binary <version>     Download and install <version> (binary file)
    nodebrew uninstall <version>          Uninstall <version>
（以下略）
```

### nodebrew で Node.js をインストール

この時点ではまだ node はインストールされていません。node の最新版をインストールしたい場合は latest を指定してインストールします。

```bash
$ nodebrew install-binary latest
```

nodebrew にはインストールの方法が二通り用意されています。install と install-binary です。通常はバイナリをダウンロードしてインストールする install-binary を使う方が時間的に早く終わります。もしソースからコンパイルしたい場合は install を利用してみてください。

どのようなバージョンの node がインストール出来るかは下記のコマンドで確認できます。

```bash
$ nodebrew ls-all
```

Node.js のバージョンを指定して、node -v で確認してみましょう。

```bash
$ nodebrew use latest
use v9.0.0
$ node -v
v9.0.0
```

違うバージョンも入れてみます。例えば、Node.jsではver.6系が[LTS](https://github.com/nodejs/LTS)になっていますが、この系列の最新版を入れる場合は下記のように入力します。

```bash
$ nodebrew install-binary v6
$ nodebrew use v6
use v6.11.5
$ node -v
v6.11.5
```

今入っているバージョンを確認します。

```bash
$ nodebrew ls
v6.11.5
v9.0.0

current: v6.11.5
```

その他、nodebrewには便利なコマンドや利用法がありますので、ぜひ`nodebrew help`や[Qiitaのnodebrewタグ](http://qiita.com/tags/nodebrew)などをご覧ください。

## nodebrew ではなく ndenv　を使う

鹿野さん（@tonkotsuboy_com）の記事が参考になります。

- [Node.jsのバージョンを自動で切り替えられるndenvが超便利](https://qiita.com/tonkotsuboy_com/items/5322d226b6783d25b5df)

## 改版履歴

- 初稿（2015/02/09）
- バージョンなどを少々手直ししました（2015/12/31）
- バージョンの手直しと、LTSに関する記述を追加しました(2016/04/20)
- バージョンと、LTSに関する記述を更新しました(2017/01/26)
- nodebrew setupに関する編集リクエストをいただきましたので、記述を見直しました（@17number さん、ありがとうございます！）。バージョンと、LTSに関する記述もあわせて更新しました(2017/11/07)
tmuxを起動しようとするとexitedになる


## 課題
tmuxを起動しようとするとexitedと表示され、プロセスが立ち上がらない。

## 原因

window nameがreattach-to-user-namespaceになっていること。

```.tmux.conf
set-option -g default-command "reattach-to-user-namespace -l zsh"
bind C-q run-shell 'reattach-to-user-namespace tmux-pbcopy'
```

## 対策

reattach-to-user-namespaceをインストールする。

```
$ brew install reattach-to-user-namespace
```

## 参考
* [tmux exits with [exited] on mac os x](http://superuser.com/questions/397076/tmux-exits-with-exited-on-mac-os-x)
* [tmuxを起動できなくなったこととその対処の備忘録](http://qiita.com/takc923/items/018733112963b69b408b)
Ruby block_given?

```rb

def arithmetic_sequence(init: 1, diff: 1, count: 10)
  current = init
  if block_given?
    count.times do
      yield(current)
      current += diff
    end
  else

    # tapメソッドのブロックではArray.newに対して設定する
    Array.new.tap do |a|
      count.times do
        a << current
        current += diff
      end
    end
  end
end
 
# blockが渡された場合
arithmetic_sequence(init: 2, diff: 3, count: 5) do |n|
  puts n
end

=begin
結果 => 2
5
8
11
14
=end
 
# block渡されていない場合
p arithmetic_sequence(init: 2, diff: 3, count: 5)

# 結果 => [2, 5, 8, 11, 14]

```
VisualStudioの分析機能

VSの分析について、最近使う場面に出くわしたので簡単にメモを残します。
    public class サジェスト
    {
    　   public int 検索対象ワード = 0;
  　     public int 銘柄 = 0;
　       public string キーワード = "";
    }

上記のコードに対してコードメトリックスを計算した場合、コード数は3でした。

これに、プロパティの値を二倍にして返すtestメソッドを定義します。
public class サジェスト銘柄
{
　　    public int 検索対象ワード = 0;
    　　public int 銘柄 = 0;
   　　 public string キーワード = "";
 
　　   public int test()
    　　{
        　　　　return 銘柄 * 2;
    　　}
}
上記のコードに対してコードメトリックスを計算した場合、コード数は5でした。
値の計算と、リターンというステップが追加されたためかと思われます。

ちなみに、testメソッドを
public void test()
{
　　var test =銘柄 * 2;
}
のようなvoidにすると、リターンのステップがなくなるため、合計4ステップとなります。

LINQを使った場合の挙動や、その他機能についてはおって記述予定。多分。
簡単にできるCMSampleBufferRef→UIImage変換（420vもOK）

AVFoundationで頻繁にお世話になる```CMSampleBufferRef```型のサンプルバッファを、UIImageに変換したい場合の高速＆低負荷＆シンプルな方法が見つかったので、メモとして残します。

```objc
// サンプルバッファからピクセルバッファを取り出す
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// ピクセルバッファをベースにCoreImageのCIImageオブジェクトを作成
CIImage *ciimage = [CIImage imageWithCVPixelBuffer:pixelBuffer];
// CIImageからUIImageを作成
UIImage *image = [UIImage imageWithCIImage:ciimage];
```

なんとたったの３ステップ。iPhone 6(iOS 8.1.3)だと、720pの420vなサンプルバッファを僅か1ms程度(※後注参照)でUIImageに変換してくれます。いったんUIImageになってしまえば```UIImageJPEGRepresentation()```でJPEG画像にするのも簡単ですね。

もう、[Appleのこのサンプルコード](https://developer.apple.com/library/ios/qa/qa1702/_index.html)が使いたいがためにビデオフレームをBGRAフォーマットにしてパフォーマンスダウンに悩まされたり、シェーダーでやらせようとしたら```glReadPixels()```が遅いのでOpenGL ES3.0に手を出したり、[GPUImageがやっているようなIOサーフェスを使った方法](https://github.com/BradLarson/GPUImage/blob/master/framework/Source/GPUImageVideoCamera.m)に手を出したりして返り討ちにあうこともありません。

ちなみに、サンプルバッファの一部だけ取り出したい場合は```CIContext```クラスの```createCGImage:fromRect:```メソッドを使うのがお手軽です。いったんCGImageを作ってから、UIImageを作成します。

```objc
// ピクセルバッファからCIImageオブジェクトを作成
CIImage *ciimage = [CIImage imageWithCVPixelBuffer:pixelBuffer];

// レンダリングコンテキストを作成して、レンダリング
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef cgimage = \
    [context createCGImage:ciimage
                  fromRect:CGRectMake(0, 0,
                               CVPixelBufferGetWidth(pixelBuffer),
                               CVPixelBufferGetHeight(pixelBuffer))];
// UIImageを作成
UIImage *uiimage = [UIImage imageWithCGImage:cgimage];
```

この方法は、```CIFilter```クラスでピクセルバッファにエフェクトをかけたい場合にも使えます。

スケール・回転させたい場合は、```imageWithCIImage:scale:orientation:```メソッドを使うとよいでしょう。

## 注意
ピクセルバッファを使ってCIImage化するときの注意点として、CIImageの画像はただちに作られるのではなく、必要になったタイミングでレンダリングされる遅延評価の仕組みで作られていることは注意してください。
CIImage化したまましばらく保持しておくと、pixelBufferはいつまでも保持されたまま（フレームワークが使えないまま）になってしまいますし、場合によっては保持している内容が書き換わってしまうかもしれません。
Sketch から 生成される svg について

# sketch と svg 

最近何かと人気な svg と sketch
sketch からも勿論 svg はジェネレートできる。

# 生じた問題点

ある時、ジェネった svg の画像の両端が切れていることに気付く。
初めはリサイズで小数点分きれたのかな？とか思っていたがそうでもない。

# 確認

実際のところ、Adobe Illustrator で 開いてみたところあらま不思議
本当に切れてるじゃあありませんか。

![スクリーンショット 2015-02-05 10.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/68729/e4509258-ec78-91ad-4365-f04c794edf73.png)


# 原因
どうやら、sketch の Path には、stroke の設定に 
inside / outside / center
っていうのがあるらしい。
線をどこに描画するかという微細な設定なのだが、
これが outside(だったか inside だったか)
に設定されていると、書き出される view からはみ出してしまう！！！
ということだった。

# まとめ
ということで、svg で画像が切れるという現象が起こったらまずはパスの設定を疑いましょう。
google test (gtest) で、たまにしか発生しないエラーを追いかける

デバッガ上で、次のコマンドライン引数で動かすと、無限回実行してエラーでブレークしてくれる。

```
--gtest_repeat=-1 --gtest_break_on_failure
```

[→ドキュメント](https://code.google.com/p/googletest/wiki/AdvancedGuide#Repeating_the_Tests)

```--gtest_shuffle``` (実行順をランダムにする) をつけるのも良い。
OSXでC言語のアプリにmruby経由でtrusterdのHTTP/2サーバ機能を5分で組み込む方法

[C言語のアプリにmruby経由でtrusterdのHTTP/2サーバ機能を5分で組み込む方法 - 人間とウェブの未来](http://hb.matsumoto-r.jp/entry/2015/02/07/011237)をOSXで動かすには


# Homebrewを行儀よく使ってる方向け

## 必要なライブラリ

trusterdをビルドするのに以下のライブラリが必要でした。

```
brew install libev
brew install libxml2
brew install libevent
brew install zlib
brew install spdylay
```

nghttp2で必要なzlibは以前はシステムのライブラリでもよかったみたいですが、
最近のものはシステムのもだとバージョンチェックではじかれるようなので、新しいものが
必要でした。

## keg-only対策

Homebrewで入れているOpenSSL等のライブラリはシステムが提供している同様のライブラリとの競合を避ける為、以下のような環境変数や、一時的にシンボリックリンクを作らないと、configureから認識されないことがあります。

```
brew link openssl --force
```

```
export ACLOCAL_PATH=/usr/local/Cellar/libxml2/2.9.2/share/aclocal/
export PKG_CONFIG_PATH=/usr/local/Cellar/openssl/1.0.2/lib/pkgconfig:/usr/local/Cellar/zlib/1.2.8/lib/pkgconfig/
```

# 準備完了

バージョン等は、現時点で最新と思われる数字ですので、適当に。


これでOSXでもHTTP/2が楽しめるはず。

# 作業終わったら

```
brew unlink openssl
```
Ruby injectメソッド


injectメソッドは、ブロックを使って繰り返し計算を行うのに使います。ブロックに順に「要素1、要素2」、「ブロックの前回の戻り値、要素3」、「ブロックの前回の戻り値、要素4」、...を渡します。メソッドの戻り値はブロックが最後に返した値になります。

引数initで初期値を指定すると、ブロックに「初期値、要素1」、「ブロックの前回の戻り値、要素2」、「ブロックの前回の戻り値、要素3」、...を渡します。


```rb
a = [1, 2, 3]
a.inject(0) {|sum, i| sum + i }   # => 6
a.inject(:+)  # => 6

a.inject(:*) # => 6
a.inject(:-) # => -4

(1..10).inject(:+) # => 55

```

```rb

fib = [1, 1]
(0..10).each {|i| fib << fib[i] + fib[i+1]}
p fib # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
p (0..10).inject([1, 1]) {|fib, i| fib << fib[i] + fib[i+1] }

```


```rb
data = [:A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E]
h = Hash.new(0)
data.each {|key| h[key] += 1 }
p h # => {:A=>3, :B=>3, :C=>2, :E=>2, :D=>1}

data = [:A, :B, :A, :C, :E, :A, :D, :B, :B, :C, :E]
p data.inject(Hash.new(0)) {|h, key| h[key] += 1; h }

```
イテレーション(or週次)ミーティングは何曜日にやるのがよい？

# 最初に
イテレーションミーティングと週次ミーティングは別物
イテレーションは複週またぎの場合があるため

# やってみてわかった
土日を挟むとすべてを忘れる
月曜開催にすると前週の作業成果のことを忘れている
金曜開催にすると翌月曜日に先週決めた作業予定などの事項を忘れている

# 解決策を探した
主にブログや国内事例やアメリカのアジャイルチームの事例

# イケてるチームの結論
金曜と月曜に二回やる

金曜に当該期間の振り返りMTGとKPTをやる
月曜に当該期間の作業予定MTGをやる

決めた内容を忘れないから便利。
またメリハリがつく
Android Studioでプロジェクト全ファイルをフォーマット整形する

コーディングルールに沿ってないファイルを一気にフォーマット整形する方法です。超簡単です。
コードの入っているapp/srcディレクトリを選択して、`右クリック > Reformat Code`を押します。
ダイアログが出てくるので、`include sub directions`にチェックを入れてRunをクリックします。

![reformat_all3.png](https://qiita-image-store.s3.amazonaws.com/0/15267/88a85020-b15a-7322-741b-071fa825829b.png "reformat_all3.png")


全ファイルを一気にフォーマットかけてくれます。

![reformat_all2.png](https://qiita-image-store.s3.amazonaws.com/0/15267/85bdd655-4dab-9c84-b7e8-699cfeefb986.png "reformat_all2.png")


終わったら、diffを確認してみましょう。以上！
全角数字を半角数字に変換するお手軽な方法

これだけ

```rb
s = "０９８７６５４３２１"
s.tr!("０-９", "0-9")
p s	# => 0987654321
```
NKFとか使わなくても、数字くらいなら、trで変換するのがお手軽。
（カタカナとかになると、全半角で文字数も変わってくるのでtrでは難しい）
R データフレーム データ修正

&gt; x2
  Age BW
1  50 50
2  50 45
3  70 55
4  60 55
5  66 66
&gt; x2[4,]=c(67,76)
&gt; x2
  Age BW
1  50 50
2  50 45
3  70 55
4  67 76
5  66 66

fix関数でもよい
fix(x2)
MySQLまとめ　その3

##値の余り
select mod(123, 10);     結果     3
##四捨五入
select round(10.345, 1);     結果     10.3
select round(10.345, 2);     結果     10.35 
##切り捨て
select truncate(10.349, 2);     結果     10.34
##切り上げ
select truncate(10.345 + .9, 0);     結果     11
##平方根
select sqrt(2.0);     結果     1.4142135623730951 
##べき乗
select pow(2, 8);     結果     256

##文字列結合
select concat(123456, 789012);
##テーブル使用時
select concat(key1, data1) from testm;

##char 文字変換
select char(49);
ascii コード変換
select ascii('1');
##小文字化
select lower('ABC012');
##大文字化
select upper('abc012');

##左文字埋め
select lpad('abc', 5, '012');
##右文字埋め
select rpad('abc', 5, '012');
##サンプル
SELECT RPAD( 'MySQL', 10, '+' );     結果MySQL+++++

##左空白削除
select ltrim('          abc');
##右空白削除
select ltrim('abc          ');
##左右空白削除
select trim('          abc          ');

##文字列置き換え
select replace('a0a1a2', 'a0', 'b1');
##文字列切り出し
select substring('abc012', 3, 2);

##文字列検索
select locate('c0', 'abc012');
##文字列の長さ
select length('abc012');
##文字列を繰り返す
select repeat('abc012', 2);
##文字列数値変換
select concat(123456, 789012);

##多重判定
select key1,
  case
    when key1 = 'a001' then 'aaa'
    when key1 = 'b002' then 'bbb'
    when key1 = 'c003' then 'ccc'
    else 'xxx'
  end c1
  from testm
;

#システム時間・システム日付

select current_date;     結果     2015-02-09

select current_time;     結果     09:18:46  

select current_timestamp;     結果     2015-02-09 09:19:12 

select now();     結果     2015-02-09 09:20:39

select date_format(now(), '%y.%m.%d');     結果     15.02.09  

select date_format(now(), '%Y.%m.%d');     結果     2015.02.09

##日付切り捨て
select cast(substring(now(), 1, 10) as date);     結果     2015-02-09

##日付の差
select to_days(now()) - to_days('2013-09-01 00:00:00');     結果     526

##日付の加算
select date_add(now(), interval 3 day);     結果     2015-02-12 10:27:07

##テーブルのコピー
create table workw as
  select
    *
  from testm
  where key1 like 'a%'
;
alter table workw type=InnoDB;

##コピーしたテーブルの表示
select * from workw;

##URL

http://www.phppro.jp/school/mysql/
Apache: ModSecurity のメモ（リンクのみ）

http://www.websec-room.com/2014/03/29/1886
http://www.yukun.info/blog/2014/03/apache-modsecurity-install-setting.html
http://www.ipa.go.jp/security/vuln/waf.html
http://www.ipa.go.jp/files/000017312.pdf
NetBeansでコンパイル前でもlombokを有効にする方法

lombokはとても便利なのだけど、自クラス内で@Getterなgetterを使ったり、@AllArgusConstructorなコンストラクタを使おうとするとコンパイルエラーが出てしまう。
これを回避するためには以下の設定をすればOK

プロジェクトプロパティ→ビルド→コンパイルで
エディタでの注釈処理を有効にするにチェックを入れる

![スクリーンショット 2015-02-09 10.26.28.png](https://qiita-image-store.s3.amazonaws.com/0/6800/1b84f9e2-52e7-235d-948c-b9f49edd1c91.png)
R データフレーム　行の追加

行列で追加する
&gt; x2
  Age BW
1  50 50
2  50 45
3  70 55
4  60 55
&gt; x2[5,]=c(66,66)
&gt; x2
  Age BW
1  50 50
2  50 45
3  70 55
4  60 55
5  66 66
R データフレーム　列の追加

transform関数を利用する
transform(追加する元のデータフレーム,列タイトル=c(追加データ))
(例)
&gt;x <-data.frame(Age=c(50,50,70,60))
&gt;x2<-transform(x,BW=c(50,45,55,55))

&gt; x <-data.frame(Age=c(50,50,70,60))
&gt; x
  Age
1  50
2  50
3  70
4  60
&gt; x2<-transform(x,BW=c(50,45,55,55))
&gt; x2
  Age BW
1  50 50
2  50 45
3  70 55
4  60 55
電子回路 > オープンドレイン

オープンドレインについてのメモ。
自分が調べたものでわかりやすかった事項のまとめです。

<hr>

FETのドレインを回路内で何も接続せずに外部に引き出したものである。

<hr>
オープンドレインでない一般的に使われる出力の場合は、片方が0V、もう片方が5Vを出すとその間に大電流が流れてしまいICが故障してしまう。オープンドレインはこの問題を解消する。

[通信用語の基礎知識] (http://www.wdic.org/w/SCI/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%BF)

<hr>
オープンドレインでは、入力がLレベルの場合の出力はHi-Zになる。入力がHレベルの場合は出力はLレベルになる。

[FPGA用語集](http://www.fpga-net.jp/fpga/word/open_drain_output.html)

<hr>
トランジスタがOFFの時、GNDに電流が流れる。トランジスタがONの時、プルアップから電流が流れる。これにより、異なる電圧レベルのICを接続することができる。

[FPGA の I/O 機能 ～ Open Drain で電圧変換 ～]
(http://www.altima.jp/column/fpga_edison/13-r_opendrain_3.html)
scope を ActiveSupport::Concern を利用して共通化する

## <i class="fa fa-heart fa-fw"></i>概要

例えば User という Model に対してアソシエーション (`has_many users` あるいは `belongs_to user`) を持つ Model が複数存在するケースを想定します。
この場合、関連する User によってレコードを絞り込みたいときなどに `by_users(users)`, `by_user(user)` のような同じフィルタ系の scope が重複することがしばしばあると思います。
これを防ぐために scope の定義を concerns に切り出してみました。

## <i class="fa fa-star fa-fw"></i>例1

``` ruby:app/models/concerns/related_to_user.rb
module RelatedToUser
  extend ActiveSupport::Concern

  # user もしくは users というアソシエーションを利用して
  # users テーブルと INNER JOIN する。
  joins_users = lambda do |relation|
    association =
      relation.reflect_on_all_associations
        .map(&:name)
        .find { |a| a.match(/\Ausers?\z/) }

    break nil if association.nil?

    relation.joins(association)
  end

  included do
    scope :by_user, (lambda do |user|
      joins_users.call(self)
        .merge(User.where(id: user.id))
    end)

    scope :by_users, (lambda do |users|
      user_ids =
        if users.respond_to?(:pluck)
          users.pluck(:id)
        else
          Array(users).map(&:id)
        end

      joins_users.call(self)
        .merge(User.where(id: user_ids))
        .uniq
    end)
  end
end
```

```ruby:app/models/order.rb
class Order < ActiveRecord::Base
  include RelatedToUser

  belongs_to :user
end
```

```ruby:app/models/item.rb
class Item < ActiveRecord::Base
  include RelatedToUser

  has_many :user_items, dependent: :destroy
  has_many :users, through: :user_items
end
```

## <i class="fa fa-star fa-fw"></i>例2 より汎用的な方法 (追記)

もっと汎用的に使えるようにしました。

```ruby:app/models/concerns/scope_filter.rb
module ScopeFilter
  extend ActiveSupport::Concern

  module ClassMethods
    def scope_filter_by(association_name)
      reflection = reflect_on_association(association_name)
      return nil unless reflection

      class_eval do
        scope "by_#{association_name}", (lambda do |record_or_records|
          relation = joins(association_name)

          id_or_ids =
            if record_or_records.is_a?(ActiveRecord::Base)
              record_or_records.id
            elsif record_or_records.respond_to?(:pluck)
              record_or_records.pluck(:id)
            else
              Array(record_or_records).map(&:id)
            end

          relation.merge(reflection.klass.where(id: id_or_ids))
        end)
      end
    end
  end
end
```

```ruby:app/models/order.rb
class Order < ActiveRecord::Base
  include RelatedToUser

  belongs_to :user
  # by_user(user_or_users) という scope が定義される。
  scope_filter_by :user
end
```

```ruby:app/models/item.rb
class Item < ActiveRecord::Base
  include RelatedToUser

  has_many :user_items, dependent: :destroy
  has_many :users, through: :user_items
  # by_users(user_or_users) という scope が定義される。
  scope_filter_by :users
end
```


## <i class="fa fa-smile-o fa-fw"></i>お願い

まだまだ模索中ですので、もし他にいい方法、もしくは似たようなことを実現するための Gem 等があればぜひ教えて下さい。
息をするようにプルリクするための6つのGitの使い方

ブログ記事に「[息をするようにプルリクするための6つのGitの使い方](http://blog.enogineer.com/2015/02/05/git-for-light-pull-request/)」をまとめました。

こちらは短めにその概要です。元記事の方にはサンプルスクリプトや実行例を追加しています。

### 1. 最初は空コミット

`git commit --allow-empty`を実行すると空のコミットを作ることができます。

作業を始める時はまず空コミットでプルリクを作って、実装中のメモ書きをしたりしています。

なお、このプルリクにはWIP(Work in progress)ラベルをつけて作業中ということがわかるようにしています。

### 2. コミットメッセージにチケット番号を含める

`git commit -m 'TICKET-123 コミットメッセージ'`のようにコミットの先頭にチケット番号を追加するようにしています。

これでチケット番号でプルリクを検索しやすくなりますし、次のプルリクエストメッセージ作成の自動化にも役に立ちます。

なお、チケット番号の入力は[チケット番号を自動的に追加するgit hook](http://blog.enogineer.com/2014/09/06/git-hook-commit-ticket/)を使って自動化しています。

### 3. プルリクエストのテンプレートを使う

プルリクエストのタイトルや内容を毎回入力するのは面倒なので、テンプレートを自動作成するシェル関数を作っています。

例えば

    $ pr-url
    https://github.com/haracane/sample/compare/master...develop?title=TICKET-123&body=...

という感じにURLを出力するようにしていています。

### 4. レビューを受けたら`git rebase -i`で空edit

プルリクを出したら次の機能をどんどん作っていきます。

そうするとだいたいプルリク後にコミット追加した後でレビューが返ってくることになります。

レビュー内容を反映するには過去コミットを追加します。

具体的には`git rebase -i`で空editしています。

### 5. 過去コミットをpushする

レビュー内容を反映したらプルリク中のブランチが新しいコミットを指すように変更します。

### 6. masterと乖離して来たら遡って`git merge master`

チームで開発していると自分が変更中の箇所がmasterで変更されたりします。

そのままだとコンフリクトしてマージできなくなったりするので、`master`と乖離して来たら適宜解消します。

こういう時は遡って`git merge master`をしています。

具体的には`git rebase -i`して先頭行で`x git merge master`をします。
JSXでブラウザでユニットテストを実行する

JSX(altJSのほう)で、たまにブラウザごとに挙動が違ったりして、ブラウザでユニットテストを走らせたくなることがあります。普段はnode.jsで簡単に実行できるのですが、ブラウザで実行するにはちょっといろいろ手を加える必要があります。

まずは.jsファイルを生成します。

```bash
$ jsx --test --output test.js --add-search-path ./src test/test-xxhash-arraybuffer.jsx
```

`--test` オプションと、 `--output` オプションを使うと、ユニットテストのJSファイルが作れます。ただ、このままでは実行できませんので、生成されたファイルの先頭のshebung行(#!/usr/bin/env node)を削除します。

```js:test.js
#!/usr/bin/env node
// generatedy by JSX compiler 0.9.89 (2014-05-20 06:01:03 +0900; 8e8c6105f36f3dfe440ea026a3c93a3444977102)
var JSX = {};
(function (JSX) {
```

sedでやるなら

```bash
$ sed -e "1d" test.js > test2.js
$ mv test2.js test.js
```

ブラウザに読み込ませるHTMLを作ります。生成されたコードはnode.jsの `process.argv` にのみ依存しているので、ダミーの変数を作っておきます。

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <script>
            var process = {
                argv: ['node', 'test.js']
            };
        </script>
        <script src="test.js"></script>
    </body>
</html>
```

これをそのままロードしてもいいですし、Webサーバをローカルに起動して、それからロードしても良いです。フォルダ名が.jsxで、なおかつAdobe製品が入っていると、フォルダをJavaScript拡張として読み込もうとしてツライことになる(Finderで開けない)ので、今回はサーバ経由で。

```bash
$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 ...
```

ブラウザで http://localhost:8000 を開いて、コンソールを見ると、テスト結果が表示されています。Firefox開発版なら、コマンドのところに `console open` とタイプするとコンソールが開きます。

![Screen Shot 2015-02-09 at 9.03.55.png](https://qiita-image-store.s3.amazonaws.com/0/6105/2f0b4657-8a0e-29f8-0c7d-2d0655d57a57.png)
プルアップ抵抗について解説


# プルアップ抵抗とは?

> デジタル回路の信号としての電圧は、"Hi" または "Low" の電圧が常に印加されていなければならず、"Hi" と "Low" の中間電圧の状態では、誤動作を起こす場合がある。また、回路の入力端子がどこにも接続されていないような「浮いている」状態があると、周囲の静電気や電磁誘導による電流の侵入によって、高電圧が印加される場合もある。その対策として、プルアップ抵抗やプルダウン抵抗が用いられる。

[プルアップ抵抗 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AB%E3%82%A2%E3%83%83%E3%83%97%E6%8A%B5%E6%8A%97)

# MCLRを例に解説してみる

PICのMCLRは、電圧が **ローレベル** (VSSと等しい電圧) になった場合、PICがリセットされる端子

# PICにリセットスイッチを付けてみる

![Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png](https://qiita-image-store.s3.amazonaws.com/0/5329/ad69fdc8-d671-5cd8-17dc-2e961a5e8c53.png "Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png")

この場合、S1をONにするとMCLRに掛かる電圧がVSSとなってPIDがリセットされる

だけど...

# S1がOFFの場合どうなる?

S1がOFFの時、MCLRはどこにも繋がっていない(**オープンな**)状態となる
この時MCLRに掛かる電圧は **不定**
→ 周囲の回路からの電磁誘導や静電気等のノイズによって電圧が左右される不安定な状態

基本的に、デジタル回路の端子に掛ける電圧は、ローレベル(VSS)かハイレベル(VDD)のどちらかで無いとダメ
→ 不定な電圧が掛かると、挙動が不安定になる

そのため、S1がOFFの場合にMCLRがローレベルで無いことを保証するために、VDD(**ハイレベル**)と等しい電圧を掛ける必要がある

これを **プルアップ** という

![Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png](https://qiita-image-store.s3.amazonaws.com/0/5329/a3d6849a-d2b7-be6c-91d6-31d95ef01576.png "Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png")

ちなみに、逆にハイレベルでない時にローレベルで固定するのは **プルダウン** という

# プルアップ抵抗

上記ままの状態だと、S1をONにした時にVDDとVSSが直結されてしまう
抵抗がない状態で電圧を掛けると、オームの法則により無限の電流が流れる → **ショート**

```(VDD-VSS)/0Ω = ∞A```


実際は配線にも微細な抵抗があるので無限とは行かないが、非常に大きい電流が流れて、発熱やら機器の破損やらが発生する

そのため、適当な抵抗を挟んでS1がONの時にショートが発生しないようにする

![Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png](https://qiita-image-store.s3.amazonaws.com/0/5329/49d6764e-e5bf-e047-ba7e-75f31e3df251.png "Untitled_Sketch_fzz_-_Fritzing_-__回路図表示_.png")

# プルアップ抵抗の抵抗値ってどれくらいで良いの?

色々要因があるけど、大体10kΩで良いらしい

## 要因?

本当にいろいろある

### 抵抗値が大きい場合の問題

1. 極端に大きいとオープンにしているのと大差ない
1. あまり大きいと、スイッチOFF時にも **MCLRに掛かる電圧がHIGHとなる最低電圧** 以下になる
    - ```Vdd-Vss=5V```の場合、(4V)以上になるような抵抗値以下でなければならない
    - MCLRに流れる最大電流(5μA)より、```Rp < 1V/5μA = 200kΩ```
1. 2. 以下でも、制限ギリギリの抵抗値の場合、電磁誘導ノイズ等で回路電流が上下した時に、 **MCLRがHIGHとなる最低電圧** 以下になってしまう可能性があるので、余裕をもたせる必要がある
    * 特にスイッチと回路の間に距離がある場合、導線がアンテナになって色々なノイズを受けるので影響が大きい
    * [スイッチでのデジタル入力。その２ - Aitem-Lab -](http://www.aitem-lab.com/tc_interface0_004(1).html)
    * [用語解説　電磁誘導ノイズ 用語集 インバータ FREQROL　| 三菱電機 FA](http://www.mitsubishielectric.co.jp/fa/products/drv/inv/yogo/y_tl_078.htm)
1. 抵抗値が大きいと、素早くON/OFFを繰り返す場合、PICの浮遊容量(回路上に意図しない形で発生した擬似的なコンデンサの容量)の為に、パルスが減衰してしまい、誤動作の原因となる
    * [i2cのプルアップ抵抗値はどれくらいがよいのか (r271-635)](http://netlog.jpn.org/r271-635/2012/10/i2c_pullup_resistor.html)
    * [電子工作室](http://www.picfun.com/midi2c02.html)
1. 大きすぎると、```I=E/R``` より、回路に流れる電流が小さくなるため、スイッチに流れる電流が最低電流(性能を保証する電流値)以下なってしまう
    * [スイッチでのデジタル入力。その１ - Aitem-Lab -](http://www.aitem-lab.com/tc_interface0_003(3).html)

### 抵抗値が小さい場合の問題

1. 極端に小さいとショートしているのと大差ない
1. 抵抗が小さすぎると```I=E/R```より、スイッチON時の消費電流が大きくなる

# 参考

- [PIC12F683のデータシート](http://akizukidenshi.com/download/ds/microchip/pic12f683.pdf)
口を開くのも面倒なので、あいさつする君作った

# ダウンロード

* https://github.com/tukiyo/say_hello

# say_hello
あいさつする君

# 準備

* 
windowsで動かす場合は[Play Sound Command : Vector](http://www.vector.co.jp/soft/dl/win95/art/se154035.html)からplsnd.exeを
ダウンロードし、実行。playsnd.exeが出来ます。say_hello.exeと同じ場所に置いて下さい。

  * @mattn さんの活躍:beer:により外部exeが不要になりました 

* say_hello.exe を実行するとコマンドプロンプトに「Listening 8080 port」と表示され待ち受け状態となります。

## 「おはようございます」

* [http://localhost:8080/hi](http://localhost:8080/hi) にアクセス

## 「お疲れ様でした」

* [http://localhost:8080/bye](http://localhost:8080/bye) にアクセス

なお 0.0.0.0:8080 でLISTENしているのでリモートからどうぞ。

# 素材

* [MajyoOyaji](http://majyo3com.ddo.jp/)様の[WAV 倉庫](http://majyo3com.ddo.jp/List.files/WAV/WAVsouko.htm)から以下を使わせていただきました。
  *  Ohayou01   (「おはようございます」) -> hi.wav にリネームしました。
  *  Otsukare00 (「お疲れ様でした」) -> bye.wav にリネームしました。
サイト移転などの際に使える.htaccessによる301リダイレクト

今回はhtmlにwordpressを組み込みました。
その際に使用したもの。

■zirei○○.htmlをzireiにリダイレクト

　html版からwordpress版などに移行した際に使えます。

>RedirectMatch permanent /zirei(.*)\.html /zirei

<解説>
. : 何でもいい1文字
* : 直前の文字が0個以上繰り返されることを示す

→　.* : どんな文字列も対象


■. ○○.html をルートディレクトリにリダイレクト

>RedirectMatch permanent (.*)\.html $1/

<解説>
　(hoge) : hogeを$1の引数として渡す
　→　$1 = hogeとなります。


【追記】

Redirect と RedirectMatchの違いは
正規表現が使えるかどうか。

>Rediret : 正規表現使用不可
>RedirectMatch : 正規表現使用可
CapybaraとSeleniumを使ってGoogle検索するサンプルコード

## 概要

CapybaraからSeleniumを使う綺麗なコードが分からなかったので、
Rubyによるクローラ開発技法を参考に簡単なサンプルを残しておきます。

## 仕様

hit_numの引数に渡したワードで検索して検索結果の数を返します。
検索結果の件数がない場合は、allメソッドの返り値がnilなので、分岐しています。

## 実装

```rb
#! /usr/bin/env ruby

require "capybara"
require "selenium-webdriver"

Capybara.current_driver = :selenium

module Crowler
  class Google
    include Capybara::DSL

    def hit_num keyword

      visit URI.escape("https://www.google.co.jp/search?q=" + keyword)

      result_status = all("#resultStats")[0]
      unless result_status.nil?
        result_status.text.match(/(\d+,)*\d+/)[0].gsub(",","").to_i
      else
        0
      end
    end

  end
end

blowser = Crowler::Google.new
print blowser.hit_num "Capybara Selenium"
```

## 参考文献

[Amazon.co.jp： Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例: るびきち, 佐々木 拓郎: 本](http://www.amazon.co.jp/dp/4797380357?tag=sanryuu-22)
Laravel5のインストール方法とディレクトリ構成について

# Laravel5 安定版が公開されました
<blockquote class="twitter-tweet" lang="ja"><p>Nice to meet you, <a href="https://twitter.com/hashtag/L5?src=hash">#L5</a> <a href="http://t.co/jRc64aTvz8">http://t.co/jRc64aTvz8</a> … enjoy! :)</p>&mdash; Laravel (@laravelphp) <a href="https://twitter.com/laravelphp/status/562986210172616708">2015, 2月 4</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

早速・・・というわけでもないのですがインストールしてみたので手順を日本語で書き起こしておきます。
殆ど公式サイトのドキュメントに載っているので、英語は苦手という方向けの説明になります。
_http://laravel.com/docs/5.0_

# インストール方法
Laravel5のプロジェクト作成方法は2種類あります。
ひとつはlaravel newコマンドによる作成、もうひとつはcomposer create-projectによる作成です。
基本的にlaravelコマンドの方が爆速でプロジェクトが立ち上がるのでオススメですが、global requireとcreate-projectにかかる時間は同じですので、取り敢えずLaravelプロジェクトを立ちあげて試したい場合はcreate-projectでも良いかもしれません。

## laravelコマンド
こちらはCentOS 6.4での検証結果となります。
PHP5.4以上が必須となっているのでそちらも準備しておきましょう。
まずはcomposerをインストール。

```
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
```

/usr/local/binには基本的にパスが通っているので、composerコマンドをどこからでも使えるようになります。
そして次はcomposer global requireでLaravelのインストーラをcomposerのルートディレクトリに持ってきます。

```
$ composer global require "laravel/installer=~1.1"
```

そしてlaravelインストーラにパスを通します。

```
$ PATH=$PATH:~/.composer/vendor/bin
$ export PATH
```

これで準備は整いました。
プロジェクトを立ちあげたいディレクトリまで移動して以下のコマンドを打ちます。
ここではBlogという名前のプロジェクトを立ちあげます。

```
$ laravel new Blog
```

これでコマンドを打ったディレクトリにBlogという名前のLaravelプロジェクトが作成されます。

## create-project
composerをインストールした後、こちらのコマンドを打ちます。
コマンドを打ったディレクトリにLaravelという名前のプロジェクトが立ち上がります。

```
$ composer create-project laravel/laravel --prefer-dist
```

## public/にアクセス
以下のページが表示されたらインストール完了です。

![laravel.png](https://qiita-image-store.s3.amazonaws.com/0/33480/53bb0418-fc60-aa5d-f9a9-71dd9f682e48.png)

# Laravel5のディレクトリ構成と作成コマンド
Laravel4から大きくディレクトリ構成が変更されています。
個人的にはModelがapp直下に作成されるのがちょっと気持ち悪いです。
ただこれがデフォルトということは何らかの意味があるのでしょう。
位置は設定次第でいくらでも変えられるようなので、しばらくこれで使い続けてみてやっぱり不便だなと感じたらディレクトリを切ってみようと思っています。

## Controller
app/Http/Controllers
__php artisan make:controller TestController__

## Model
app/
__php artisan make:model TestModel__

## View
resources/views

# 5.0が公開されてはや5日
まだまだ日本語情報は少ない状況ですが、個人的に触ってみて躓いた部分等については逐一報告していこうと思います。
とりあえずTodoリストでも作ろうかな。
Excel向けにCSVダウンロード機能を簡単に追加する

## モチベーション
Excel向けにサイトにCSVダウンロード機能を付ける。良くあると思います。
JSONのAPIならあるのに！自動化したい！自動化できるサイト、CSV Downloaderというサイトを作りました。

http://ponkotuy.github.io/csv_downloader/

## やれること
JSON APIのURLを、CSV DownloaderのURLの後ろに追加すれば、あら不思議JSONがCSVに変換されて出てくる！

## 詳しい説明は
サイトに書いてあるよ

## issueとPullRequestは
https://github.com/ponkotuy/csv_downloader
#ifとConditional

デバッグ用の関数は#ifで中身を全部囲うよりも、
デバッグ用の関数にConditional属性をつけた方が、
関数呼び出し自体がされなくなる分パフォーマンスがいいらしい。

```csharp
private void Hoge()
{
#if DEBUG
    Console.WriteLine("Hoge");
#endif
}
```
よりも

```csharp
[Conditional("DEBUG")]
private void Hoge()
{
    Console.WriteLine("Hoge");
}
```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」物理演算スプライト

# 物理演算スプライトのパラメーター追加
物理演算スプライトを生成するには、

1. density
1. friction
1. restitution

と、必要に応じて、

1. size
1. radius
1. radius2
1. width
1. height

だけが指定出来ました。
そして、一度生成したスプライトはそのまま動き続ける以外に方法はありませんでしたが、オブジェクトのインスタンスメソッドとして、

1. applyForce(force)
1. applyImpulse(impulse)
1. applyTorque(torque)

の3つを追加しました。
これにより、一度生成した物理演算スプライトの動きを操作することが出来ます。

# 物理演算スプライトのCollider
box2d.enchant.jsには「contact」という衝突検知イベントがあります。
「イベント」と書いているのは、「衝突判定」ではなく、衝突した際の処理を記述しておく形になっているからです。
通常スプライトでは衝突判定なので整合性が取れないため、今までは物理演算スプライトの衝突判定はできませんでした。
今回、物理演算スプライトにも通常スプライトと同じように「collider」を設定することで、そのcolliderと当たり判定を取るように改修しました。
ですので、colliderを設定することで通常スプライトと物理演算スプライトの衝突判定を取ることも出来るようになりました。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
フォームから大きな文字列をpostする際の問題

# 事の起こり
管理画面を作っていた際、ファイルアップロードフォームで、
ファイルをD&Dで入力出来る領域を作って、postデータ内にJSONで埋め込んで送信しようとしていた所、firefoxでは送信出来るのにChromeでは送信出来なかった

# 現象
紆余曲折調べた所、同じファイルを送っているのにChromeだけ、ContentLengthが小さかった。

## 再現条件
* 動的にinput要素を作成(document.createElement("input"))している
* 要素のvalueが特定サイズ以上。
* http://www.w3schools.com/tags/att_input_maxlength.asp maxlengthの値と足りないときのContentLengthが同じなのでこの数値に起因しそう(同僚某氏thx
* 最初からHTMLに書いてあるInput要素のvalueにセットする場合には問題ない。

以上の条件で再現。

## 再現コード
postを受けるサーバが必要なのでPlackで実装。
9MB相当の文字列を作成して、HTML内に書き込んだ。

### パス説明
OKパターンのポストをするページ、NGパターンのポストをするページ、ポストされてきた内容から必要な物を出力するページを作った。

|キー名|パス説明|
| ---- | ---- |
| /ok |  9MB相当の文字列をHTML内に記述したinput 要素にJavaScriptで入力 | 
| /ng |  9MB相当の文字列をJavaScriptでcreateElement("input")で作成したinput 要素にJavaScriptで入力 |
| /post | 上記二点のアップロード先。ページ内にContentLengthを表示する。 | 

```perl:sample.psgi
use Plack::Request;

sub {
    my $req = Plack::Request->new($_[0]);
    my $s = "h" x 9_000_000;

    my $ok_html = <<"EOS";
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <meta name="viewport" content="width=device-width">
        <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    </head>
    
    <body>
        <form action="/post" method="post">
            <input type="hidden" name="name" id="input" value="">
            <button>push</button>
            <script>
                var input = document.getElementById("input")
                input.value = "$s";
            </script>
        </form>
    </body>
</html>
EOS

    my $ng_html = <<"EOS";
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=Edge">
        <meta name="viewport" content="width=device-width">
        <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
    </head>
    
    <body>
        <form id="form" action="/post" method="post">
            <button>push</button>
        </form>
        <script>
            var input = document.createElement("input")
            input.name = "name"
            input.value = "$s";
            input.type = "hidden";
            document.getElementById("form").appendChild(input)
        </script>
    </body>
</html>
EOS

    if($req->path eq "/ok") {
        $req->param('');
        return [200, ["Content-Type" => "text/html"], [$ok_html]];
    }
    if($req->path eq "/ng") {
        $req->param('');
        return [200, ["Content-Type" => "text/html"], [$ng_html]];
    }
    if($req->path eq "/post") {
        return [200, ["Content-Type" => "text/plain"], ['200 OK' , "   " , $req->env->{CONTENT_LENGTH}]];
    }
    return [404 , ["Content-Type" => "text/plain"], ['OTHER NG']];
};
```

### 結果

|ブラウザ|パス | 結果 | 可否 |
| ---- | ---- | ---- | ---- |
| firefox | /ok | 200 OK   9000005 | ○ |
| firefox | /ng | 200 OK   9000005 | ○ |
| firefox | /ok | 200 OK   9000005 | ○ |
| firefox | /ng | 200 OK   524293 | × |

# 対応
とりあえずInput要素は作っておいてJavascriptではValueに入力するようにした。
maxlengthってフォームで入力出来る文字数であってバイト数ではなかったと記憶しているが、滅多に使わないのでそんな物だったのかなあと思いつつ…
xubuntuでLineする方法 備忘録


# そもそもなんでxubuntuなのか
~~Windowsが嫌いだから~~単純にOctopressとかrbenvとかそういったもの管理するのにWinは窓から投げ捨てた。

# なぜLineなのか
iPhoneを手に取るのが面倒くさい。

# ubuntu Lubuntu Kubuntuと数ある中でなぜxubuntuなのか
軽いから、Lubuntuよりは多少重かろうが綺麗だから？
~~決してubuntu選ばないオレｶｸｲｲではない~~

まぁやることは簡単。

``` bash
sudo apt-add-repository ppa:ubuntu-wine/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apg-get autoremove
```

してから、synaptics 起動してwineを検索して、wine1.7を入れるだけ。
とりあえず下準備は完了。

著作権的にどうかはあえて触れないけど。

[Old-Line][1]にある適当な旧Lineを入れる。おすすめは3.2.3らしい。
ポップアップがうざいけど、既読の痕跡のこらないきがするけど。

後は起動して番号認証して終わり。
## ね、簡単でしょ？
以上。
[1]:http://line.jp.uptodown.com/old
MongoDBで古いドキュメントを自動削除する二つの方法

MongoDBでは古いドキュメントを自動削除する機能として、キャップ付きコレクション(Capped Collections)とTTLインデックス(TTL Indexes)という二つの方法がある。

## TTLインデックス(TTL Indexes)
http://docs.mongodb.org/manual/core/index-ttl/

ドキュメントのあるdate型の値に、期間を指定してTTLインデックスを張ると、そのdateの値が指定期間よりも古くなった場合に自動的に削除する。

詳細
* date型のデータがないと使えない
* 1分間隔で削除する（それより細かい間隔では削除できない）
* 複合インデックスでは使えない
* 削除はremoveクエリが発行される。そのため、指定期間通りにドキュメント消える事が保証される訳ではない。removeクエリが流れきるまではドキュメントは残る
* 普通のインデックスと同様に検索クエリのときに使える

## キャップ付きコレクション(Capped Collections)
http://docs.mongodb.org/manual/core/capped-collections/

あるサイズを指定してコレクションを作ると、そのサイズ以上にドキュメントが挿入された場合に、古いドキュメントを自動的に削除する。

詳細
* 中のドキュメントを削除できない
* 中のドキュメントサイズが大きくなる更新はできない
* シャーディング対象にできない
* アグリゲーションの`$out`にキャップ付きコレクションは指定できない。
* インデックスがなくても書き込みが早い
 
もっと細かい話

キャップ付きコレクションでは、書き込み順が、物理的に連続した領域に行われる（事が保証される）。そのため、ドキュメントの物理的な再配置が起こるのような更新はできない。削除できないのも同じ理由。
レプリカ環境だと特に注意が必要で、以下のような状況だとエラーになる。
キャップ付きコレクションをレプリケーションしていて、プライマリでドキュメントを小さくすると、プライマリのディスクには物理的には隙間ができる。しかし、それがセカンダリに伝わると、セカンダリ側では最初から小さい物理領域しか確保されない。その後、プライマリのドキュメントを大きくすると、プライマリ側では隙間が埋まるだけだが、セカンダリではその隙間はないため、エラーになる。

## 比較

||キャップ付きコレクション|TTLインデックス|
|---|---|---|
|期間の固定|×|○|
|サイズの固定|○|×|
|中のドキュメントの削除|×|○|
|中のドキュメントの更新|△|○|
|シャーディング対応|×|○|
|ドキュメントへの制約|○無し|△date型必須|
|書き込み性能|○|△Index更新が必要|
|削除時の負荷|○|△remove実行|
|途中での変更|△やや難|○容易|

全然別物ですねw
RSpec3.2でCapypara使ってて undefined method `visit’と出る時

[railstutorial3章](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-static_pages)を消化しててぶつかったところのメモ。
今使ってるrspecのバージョンが3.2だからか、rails generate integration_test static_pages で出力されるrspecコードが記載と異なっている。

そのまま動かすと、「undefined method `visit’」と出る。

対処法は、こちらのページを参考
[Capyparaで undefined method visit’と出る時の対処法](http://programming.ironsand.net/2014/how-to-solve-capypara-undefined-method-visit/)


```ruby:Gemfile
group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.2.0' #2.2.0に修正
end
```

```ruby:spec/rails_helper.rb
#以下を追記
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)

require 'rspec/rails'
require 'capybara/rspec'
require 'rspec/autorun'

RSpec.configure do |config|
  (略)
  config.include Capybara::DSL
end
```

取り敢えずこの対応で、
bundle exec rspec spec/requests/static_pages_spec.rb
は動いた。
MySQLのユーザ管理についての雑なメモ

Macで MovableType用にMySQLのインストールと設定をしたいと思って試行錯誤した記録です。

(趣味でやった作業なので雑です)

## 雑な手順
* homebrewでmysqlをインストール (http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d )
* mysql_secure_installationを実行。質問に対しては全部デフォルトenter。rootユーザのパスワードは適宜設定。
* (このあと、cpanm DBD::mysqlのテストがこけたので、shibayuさんの記事を参考にしてテストを通るようにした)
* mysqldumpしておいたダンプファイルからリストア。`mysql -u root -p < mysql.dump`

### ここで、ゴミみたいなユーザが複数作成されてしまったので、いちどユーザを全部消す。


rootでログインして、
```
$ mysql -u root -p
```
`mysql`というデータベースの`user`テーブルにユーザが入っているので削除

```
mysql> DELETE FROM mysql.user WHERE user='hoge';
mysql> FLUSH PRIVILEGES;
```

### ユーザを作り直す。

```
mysql> GRANT ALL PRIVILEGES ON myblog.* TO dqneo@localhost IDENTIFIED BY 'himitsu';
mysql> FLUSH PRIVILEGES;
```

この後、別のシェルからさっき作ったユーザ名でmysqlログインできればおｋ

```
$ mysql -u dqneo -p myblog
```
モナドについて勉強したことの整理

学習の素材は、
[関数プログラミング実践入門](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269)

> この表記は、私見・感想です。

[個別のモナド](http://qiita.com/rooooomania/items/4b5b0a5b184e006dc7e2)についても整理しています。

# モナドの用語整理
> モナドという聞きなれない言葉からは素直なイメージが湧かないが、ここでは **計算する上で生まれる特定の文脈を効率的に扱うための仕掛け** という理解をしておくことにする。

## モナド型クラス
モナドは型クラスであり、次のように定義されている。

```hs
class Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a
```

> モナドは型クラス、ということは、モナドという性質を実装したインスタンスが存在する、ということ。それがリストだったりMaybeだったりする。
> 

ここでまず、mとかaとかについて言い換えて整理しておきたい。

|記号|説明|サンプル|
|---|---|---|
|`m`|`Monad`クラスのインスタンス。何らかの文脈を持つことになる、多相型データ構造。|`[]`, `Maybe`|
|`a`|任意の型を表す型変数。|`Int`, `String`|
|`m a`|`m a`型のデータ構造。この型を返す関数を、特に **モナドmのアクション** と呼ぶ。|`[Int]`, `Maybe Double`|
| `(>>=)`|`bind` と呼ばれる演算子で、アクション同士の組み合わせ方。|`["3"] >>= \x -> [7 + read x]`|
| `return`|ただの`a`型の値にモナドmという文脈を持たせるための関数。命令型言語の`return`とは全然違う|`return "hoge"`|

```hs:(>>=)の例
--リストモナドのアクションを結合する
*Control.Monad> ["3"] >>= \x -> [7 + read x]
[10]
```


## モナド則
**モナド則** (monad laws) と呼ばれる性質を満たすようにインスタンスを作る。これらの規則を満たしていないインスタンスを作っても、それはモナドではないし、直感と反した動作をすることになる。例えば、規則2が満たされていないとして、`[1] >> return` が `[123]` となってしまったらとても気持ち悪い。

```hs
return x >>= f = f x		-- 規則1
m >>= return = m			-- 規則2
( m >>= f ) >>= g = m >>= ( \x -> f x >>= g ) -- 規則3

```
それぞれを do記法で表記すると、次のようになる。

```hs:規則1
do
    y <- return x
    f y
--  == f x
```

```hs:規則2
do
    x <- m
    return x
--  == m
```

```hs:規則3
--左辺
do
    x <- m
    do 
        y <- f x
        g y
--右辺
do y <- do x <- m
           fx
   g y
```

## do記法
文脈を伴う計算を、手続き/命令的に記述するための[構文糖衣](http://ja.wikipedia.org/wiki/%E7%B3%96%E8%A1%A3%E6%A7%8B%E6%96%87)

# 参考情報
[モナド則がちょっと分かった？](http://qiita.com/7shi/items/547b6137d7a3c482fe68)
>記事内容が大変に分かりやすかったです。
MongoDB 3.0アナウンスの要約と所感

2015年2月3日にMongoDB 3.0 がアナウンスされました。要約と所感をかきます。

https://www.mongodb.com/blog/post/announcing-mongodb-30

#　MongoDB 3.0 アナウンス 要約

####ストレージエンジンとして"WiredTiger"が導入される
* ドキュメントロックになり、書き込み性能7〜10倍UP
* ドキュメント圧縮が選べるようになり、最大80%圧縮

#### 既存のmmapベースの仕組みも、ストレージエンジンも"MMAPv1"という名前になって改善される
* データベースロックからコレクションロックに変更
* ジャーナルがよくなった

#### ストレージエンジンAPIを設けた。
* これによりWiredTigerとMMAPv1の二つをストレージエンジンを、同一レプリカ内に同居できる
* あたらしいストレージエンジンが出たらレプリカに追加して試すことができる
* **ストレージエンジン開発プラットフォームとしてのMongoDB** という考え方が生まれる。ストレージエンジンの開発者はアプリとのやり取りはMongoDBにまかせ、ストレージエンジンの開発に集中できる。

#### "Ops Manager"という管理機能
* 監視やバックアップといったオペレーションが95%削減される

#### MongoDB 3.0は"default database"をねらう

* MongoDB 3.0は"default database"をねらう

# 所感

ストレージエンジンAPIというのが最も重要なポイントだと思う。これでストレージエンジンの開発が活発になる事は間違いないので、今はできないトランザクションや日本語全文検索をサポートするストレージエンジンを、オープンソースとして誰か開発してくるのではないかと期待してしまう！

WiredTigerの導入は書き込み速度はもちろんだが、ディスク容量削減の効果に期待。今までのMongoDB 2系はJSONのキーも文字列として格納する必要があり、ディスク容量がRDBMSと比較して大きくなってしまう問題点があったが、圧縮できると嬉しい。

Opt Managerは、今でもMMSオートメーションで実現できている事の延長なので、それほど大きく変わらない気がする。
 
一番気になるのは、2系からのマイグレーションがどれだけスムーズにできるか。結局2.8は出ない、3.0にいくみたいなので下位互換性が保たれるか心配。
_.reduceで深い階層にあるプロパティにアクセスする


XMLをJSONに変換した時に深い階層のObjectになりがちで、ほしい値がちゃんと定義されているか確認するのが結構だるい。

```js
if (data.ResultSet && data.ResultSet[0] && data.ResultSet[0].Result && data.ResultSet[0].Result[0]) {
  // do something
}
```

かと言ってこれのために別途ライブラリ入れるのもなんか嫌なので、lodashの_.reduceで下記のような関数を作ると楽そう。

```js
function get(object, namespace, defaultValue) {
  try {
    return _.reduce(
      _.reject(namespace.split('.'), _.isEmpty),
      function (object, key) {
        var value = _.result(object, key);
        if (value) return value;
        throw new ReferenceError();
      },
      object
    );
  } catch (e) {
    return defaultValue;
  }
}
```
```js
var value = get(object, 'ResultSet.0.Result.0');
```
何故 Skype ではなく Slack なのか

# Slack 概要

Slack は企業内で使うことを目的としたチャットソフトウェアです。
2014 年頃から、技術系企業を中心に利用が広がっており、日本でも使われ始めています。

2015 年現在、Slack は「流行ってるし便利だしなんかイケてる新しいツール」として認識されていると思いますが、ただ何となく Slack を選ぶのは考えものです。
Skype の何が問題だったのか、Slack がそれをどう解決してくれるのかについて言語化し、それをチーム内でも共有してこそ、Slack を正しく活用し、情報共有をより良いものにできるようになるでしょう。

# Skype の問題点とそこから見える Slack の良さ

ちょっと色々長くなってしまったので、各項目ごとに最初に結論を書いていきます。

## Skype はチームの情報を分断しがち

**Slack の部屋 (Channels) は全て Team 内でパブリック。企業内の情報を、企業内においてよりオープンにします。**

企業内で Skype を使う場合、その会社だったり部署だったりの全員が参加する大部屋があるのが一般的だと思います。
また、大部屋の中で話すには細かすぎる話であれば、関係者だけで小部屋を作ったり、一対一での会話を行うようにすることもあるでしょう。

私は、Skype の最も大きな問題はここにあると考えます。
部屋が細分化すること自体はいいのですが、その小部屋の中で行われている会話は、その中の人にしか見えません。
それどころか、小部屋ができたということすら、外から観測することはできません。

Slack にも Channel というものがあり、これが部屋に当たります。
Slack における Channel の良さは、企業内に存在する Channel は全てパブリックで、自由に参加ができるという点です。
自分が参加すべき・参加したい Channel があればいつでもそこに参加できますし、そこで行われた過去の会話も全て閲覧できます。

## Skype は通知の設定が大ざっぱ

**Slack ではユーザ名による mention が可能。うまく使い分けることで、必要以上に集中力を阻害されない、気持ちの良いコミュニケーションが可能に。**

Skype にも通知の設定はいくつかありますが、メッセージの受信についての通知はする・しないの二択しかありません。
通知をする設定だと、大部屋内で行われるあらゆるメッセージについて通知が行われます。
もちろん、それが自分宛てであれば通知が行われて、すぐいにメッセージに気づけることは大事でしょう。
ですが、部屋ないの人数が増えれば増えるほど、自分に関係がないメッセージ・関係なくはないけど気が向いたときにでも読めばいい程度のメッセージも全て通知されます。

自分にはそれほど重要でないメッセージによる通知でイライラした覚えはきっと誰にでもあることでしょう。
もしくはイライラから、通知をしないような設定にした人もいることでしょう。

これは、前の「Skype はチームの情報を分断しがち」という問題にも関係していると考えられます。
大部屋から小部屋にわかれることでそこにいる人・いない人で情報が分断する、というのが趣旨でしたが、小部屋を作ること自体はむしろ善意によって行われているのではないか、と考えます。
あまり関係ない話で通知がなりまくっては迷惑だろう、という善意で小部屋を作られるということが少なからず起きていないでしょうか。

Slack においては通知設定は以下から選べます。

* 全てのアクティビティを通知する (デフォルト)
* ハイライトワードとプライベートメッセージのみ通知する
* 通知しない

どれを選ぶかは個人の好みでいいと思いますが、私は「ハイライトワードとプライベートメッセージのみ通知する」を強く進めます。
この「ハイライトワード」には自動的に自分のユーザ名も含まれます。

基本的にはどんな会話が行われようが通知は行われないので、メッセージを送信するときに他人の集中力を阻害することを心配する必要はありません。
それでいて、関係者には mention で通知することで気づいてくれやすくなりますし、Recent Mentions として一覧化することもできるので、うっかり見落としてもあとから気付くための方法がちゃんと用意されています。

注意しないといけないのは、これがデフォルトの設定ではないという点です。
最終的な判断は本人に任せるとしても、まずはこの設定を Team メンバー全員に推奨することで、円滑で気持ちの良いコミュニケーションができるのではと考えます。

![f73e64ea852c1ceefebb814cabe3c16d.png](https://qiita-image-store.s3.amazonaws.com/0/208/ae6e3297-3b7b-18ea-7b18-3e501b26bf85.png)

## Skype では過去の情報を活かしにくい

**Slack ではメッセージのパーマリンクなどでストック性をうまく補完しており、過去の情報を参照しやすい。**

一般的にチャットにおけるコミュニケーションはストックかフローかで言えばフローにあたります。
リアルタイムなコミュニケーションを行うことを主な目的としており、情報の蓄積という役割を担わせるのは向いていません。
そういった用途には、Wiki など別のツールを利用すべきでしょう。

Slack におけるコミュニケーションもフローには違いありませんが、それでいてストック性をうまく補完してくれています。
全てのメッセージにはパーマリンクが割り当てられており、そこを参照することで、そのメッセージと前後の文脈を後から追いかけることができます。

その他にも、前述の Recent Mentions や Starred Items により、自分にとって必要な情報を蓄積し、あとから参照することが可能です。

もちろん、だからと言って全ての情報を Slack に蓄積していくのが正しいということはなく、状況に応じてそれに適したツールを選択するべきでしょう。

# おまけ: Slack 用語集

## Team

Slack では Team ごとにサブドメインが割り当てられる。
企業等の組織ごとに Team を作り、そこに社員等のメンバーが登録していくことになる。

## Channel

チャットを行う部屋。
Team 内に存在する Channel は全てが Team 内においてパブリックになっており、入退出も自由にできる。
必要なメンバーを招待することもできる。

## Direct Message

一対一で行うチャット。
当事者以外のメンバーには一切見えない。

## Private Group

Channel に似ているがこちらは当事者以外には存在も内容も見えない。
CentOS6.6に php5.5をインストールしてみる。

CentOS6.6に php5.5をインストールしてみます。

環境
CentOS:6.6 (64bit)

# リポジトリを追加する
まずepelのリポジトリを追加します。

```
sudo rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
```

次にremiのリポジトリを追加します。

```
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

これでレポジトリの追加は完了です。

# CentOS-Baseリポジトリを一時的にきる
priorityなどで設定もできると思いますが、今回は一時的にCentOS-Baseリポジトリをきります。
これが有効だと 今ですと php5.3がインストールされてしまいます。 (2015/02/09現在)

```vi /etc/yum.repos.d/CentOS-Base.repo```

```vim:CentOS-Base.repo
[base]
enabled=0
[updates]
enabled=0
[extras]
enabled=0
[centosplus]
enabled=0
[contrib]
enabled=0
```

上記のように enabled の部分を 0 にすると無効にすることができます。
enabled= の記述がない場合は追記してください。

# php5.5をインストールする
では php5.5をインストールしていきましょう。

```
yum install --enablerepo=remi --enablerepo=remi-php55 php php-devel php-mbstring php-mcrypt php-mysql
```

上記でphp5.5がインストールできます。

errorがでて

```
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
```

のような表示が出た場合は

```
yum install --skip-broken --enablerepo=remi --enablerepo=remi-php55 php php-devel php-mbstring php-mcrypt php-mysql
```

でインストールができると思います。

# phpのバージョンを確認

```
php --version
PHP 5.5.21 (cli) (built: Jan 21 2015 15:35:14)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
```
最後にCentOS-Base.repoのenabledの部分を元に戻して完了です。
Kinect V2 を vvvv で使う！

この投稿は[「VVVV Advent Calendar 2014」](http://qiita.com/advent-calendar/2014/vvvv)の２３日目の記事です。

***

こんにちは。

vvvv でキネクトv2 の導入について、色々つまづく人が多いので、現時点での導入方法をまとめておきます。

## 必要環境
・Windows 8 か Windows 8.1 が必要
・64 bit 版のみで動作する
・DX11 pack の導入が必要

## 導入方法
### １）Windows 8
Windows 8 はなんとかして手に入れてください。

### ２）Kinect v2 SDK の導入
「[Kinect v2 公式サイト](http://www.microsoft.com/en-us/kinectforwindows/develop/)」から SDK をダウンロードし、インストールしてください。

### ３）64 bit 版 vvvv の導入
公式の [ダウンロードページ](http://vvvv.org/documentation/jp.downloads) から、「vvvv」の 64bit 版と、「addons」の 64bit 版をダウンロードしてください。
「addons」フォルダを、vvvv.exe があるフォルダに置きます。

### ４）DX11 pack の導入
Contributions の 「[DirectX11 Nodes Alpha](http://vvvv.org/contribution/directx11-nodes-alpha)」から、
「vvvv-packs-dx11-b33x-x64.zip」のような、「x64」と入っているバージョンをダウンロードしてきます。
で、「packs」フォルダを「addons」と同じく、vvvv.exe があるフォルダに置きます。

-

ここまでで、こんな感じ。「addonpack」と「packs」フォルダがありますね。

![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/59912/6785e73a-84ae-8aa1-a71a-ebb9f302f92c.jpeg)

### ５）Kinect2 Nodes の導入
Contributions の「[Kinect2 Nodes](http://vvvv.org/contribution/kinect2-nodes)」から、最新版を落としてきます。
これを vvvv でパスの通ったフォルダに移しましょう。
vvvv で contribution のパスを通す方法は [この動画](http://youtu.be/6FnpNWnAckg) で解説しています。

### ６）使う
あとは自由に使ってください。
Kinect2 ノードのヘルプ（F1)などを見ると使い方がわかると思います。

## よくあるトラブル
Skeleton や Hand ノードが赤くなって使えない場合がよくあります。こんな感じ。
>![0_5.png](https://qiita-image-store.s3.amazonaws.com/0/59912/dac63f06-4a92-14b5-f5c1-578807aa441a.png)
>（画像は hanabitheo の発言から引用）

その場合は、正式な Contribution ではなく、[ここ](http://vvvv.org/contribution/kinect2-nodes)の、noobusdeer の発言の .rar を落としてきて使うと多分動きます。
>(noobusdeer 11/11/2014 - 11:52)
>If some one want kinect2 nodes on latest kinect drivers and on 8.1 x64
>I have problems to use vux nodes so i rebuild them.
>Thanks vux for your work!
>https://www.dropbox.com/s/ptfyrj9j6ressll/kinect2.rar?dl=0


## おしまい
以上です。ばいばーい。
bashで複数の拡張子を一気に変更するalias

# bashrcにaliasを登録して、変換前後を任意に選択できるようにしたい。

実行例、TOKIOからSMAPへ

```bash:terminal
ren tokio smap
```
任意のディレクトリで実行すると

| 前 || 後  |
|:-----------|-------|------------|
| nakai.tokio|-> | nakai.smap |
| kimura.tokio |-> |kimura.smap |
|inagaki.arashi|-> | inagaki.arashi|

みたいに、指定したものだけ変わる。
以下コードを.bashrcに書き込んでsource ~/.bashrc

```bash:.bashrc
function ren(){
    for fname in *.$1;
    do
        mv $fname ${fname%.$1}.$2;
    done
}
```

こういう解説たくさんあったけど、aliasみたいに登録するのが見つけられなかったので書きました。使う場面はそう多くないかもしれないけれど。
僕は、railsでviewがerbで生成されてしまって、めんどくさいと思って探しました。これからrails自体の設定方法を探します。

それと、実際はaliasではなく、引数が必要なためにfunction()になりますが、僕がfunction()でやるんだというのを知らなかったから始めaliasで検索してしまったので、ここにaliasと書いてあります。僕みたいな初心者が幸せになりますように。

===== 追記 =====

結局、html2slimというgemが中身も変えてやってくれるらしい。

```bash:terminal
gem install html2slim
```
の後に、先ほどのソースのように

```bash:terminal
h2s erb slim
```
みたいに使うことにする。
当記事のソースに当てはめると

```bash:.bashrc
function h2s(){
    for fname in *.$1;
    do
        erb2slim $fname ${fname%.$1}.$2;
        rm $fname;
    done
}
```

できました。
(Docker + Sinatra)をAWS Elastic Beanstalkにデプロイ (デプロイ)

# 準備

```
mkdir sinatra && cd sinatra
```

# 各種ファイルの用意

```:app.rb
require 'sinatra'
get '/' do
  'Hello Docker'
end
```

```:config.ru
require './app.rb'
run Sinatra::Application
```

```:Gemfile
source 'http://rubygems.org'
gem 'sinatra'
gem 'foreman'
gem 'thin'
```

```:Procfile
web: bundle exec rackup config.ru -p 4567 -s thin -o 0.0.0.0
```

```:Dockerfile
FROM rneuo/docker-centos-base
MAINTAINER rneuo

RUN useradd --create-home -s /bin/bash webapp
RUN echo -n 'webapp:webapp' | chpasswd

ADD Gemfile /home/webapp/
ADD app.rb /home/webapp/
ADD config.ru /home/webapp/
ADD Procfile /home/webapp/
RUN chown -R webapp /home/webapp

USER webapp
WORKDIR /home/webapp
RUN bundle install --path vendor/bundle

VOLUME ["/var/log"]
EXPOSE 4567
CMD bundle exec foreman start -d . -p 4567
```
- rubyのインストールとかはベースのDockerイメージでやっています。
    - rneuo/docker-centos-base
       

```:Dockerrun.aws.json
{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "sinatra",
    "Update": "true"
  },
  "Ports": [
    {
      "ContainerPort": "4567"
    }
  ],
  "Logging": "/var/log/"
}
```

# コミット & プッシュ

```
git init 
git add .
git commit -a -m "add sinatra"
git aws.push
```