OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby]Windowsで環境セットアップからTDD開発サンプルまで その３

前回でRSpecが動いたので、今回はいよいよ作るぞー…と行きたいところですが。
まずはSublimeを使える状態にしちゃいます。
そしてここでもかーなーりつまづきました…。

#環境作り　～Sublime Textのセットアップ
##Sublime Text本体のインストール
Sublime Textは高機能なテキストエディタで、ちゃんとセットアップするとIDEにかなり近いことまでできるようです。
ただ、最新版は現時点で3なのですが、3だとエラーが出てどーしてもRSpecが上手く連動してくれないので、ここはあえて2を使います。
まずは本体をインストール。
[Sublime Text2](http://www.sublimetext.com/2)のサイトからインストーラをダウンロードして、実行します。
さすがにここではつまづいてないっ。

##Package Controlのインストール
前回のRubyインストールでもやりましたが、最近はパッケージ管理はついてて当たり前みたいですね。
実際ツールとか多すぎて忘れますしね！
ということでSublime Text2用のPackage Controlもインストールします。
リンク先の[Package Control Installation](https://sublime.wbond.net/installation#st2)にも説明がありますが、
メニュー＞View＞Show Console でコンソールを表示し、Sublime Text2の方をコピペします。
sublimeを再起動してください的なメッセージが出たら、素直にsublimeを一旦閉じて起動しなおします。

![ruby13.png](https://qiita-image-store.s3.amazonaws.com/0/46625/dcc733ec-8118-6b3f-e376-36068eb38fe7.png)

メニュー＞PreferencesにPackage Controlのメニューが表示されていたらインストール成功です。

![ruby14.png](https://qiita-image-store.s3.amazonaws.com/0/46625/546f342e-2f70-772d-ae49-a08083d1853e.png)

##その他のパッケージ
必要なパッケージを入れていきます。
メニュー＞Preferences＞Package Controlを起動して「Package Control:Install Package」を選択し、から文字列を絞りこんで選んで入れます。

![ruby15.png](https://qiita-image-store.s3.amazonaws.com/0/46625/3b837bee-374f-1399-09fd-2abd7af5473b.png)

今回に関連して以下のものが必須なので、その中で追加設定が必要なRubyTestだけ説明します。

| Package | Memo |
|:--------|:-----|
| ConvertToUTF8 | 通常シフトJISのファイルを扱えないので、自動でUTF8に変換してくれます |
| SublimeCodeIntel | ユーザー定義変数、関数の補完や定義元ジャンプ |
| SublimeLinter | 構文エラーをチェックしてくれます |
| RubyTest | RSpecを連動してくれます（設定あり）※これのためにSublimeが2に… |

どちらでもいいけど入れとくと無難そうなものが以下。（こちらは説明しません）
日本語を扱う上では必須のものとかもありますが、今回は扱いません。
使いながら、使いやすくなるように導入していくのがオススメです。

| Package | Memo |
|:--------|:-----|
| Japanize | 日本語化（設定ありだが、ReadMe通りで簡単にできる） |
| IMESupport | 日本語入力時に変換候補が変なとこに行くのを修正してくれます |
| TrailingSpaces | 全角文字を強調 |
| BracketHiLighter | 対応するカッコをハイライト |
| AutoFileName | ファイル名の入力を補完 |

##RubyTestの設定
設定と言ってもそんな大層なものじゃないです。
デフォルトの設定が
　メニュー＞Preferences＞Package Settings＞RubyTest＞Settings - **Default**
にあるので、開いて内容を全てコピーし、ユーザ設定である
　メニュー＞Preferences＞Package Settings＞RubyTest＞Settings - **User**
を開いて内容をペーストします。
sublime2ならデフォルトの設定を変更することもできますが、いざというときに元の設定に戻すことも考えて、ユーザ設定で変更しましょう。

今回の換気用ではbundlerを使っているので、下のように変更します。

```rb
-  "check_for_bundler": false,
+  "check_for_bundler": true,
```

ここだけです！

![ruby16.png](https://qiita-image-store.s3.amazonaws.com/0/46625/d5878263-7c72-edc6-bd4b-c94ee134794c.png)

保存して閉じて、前回作成したRspecTest_spec.rbをsublime2で開きます。
メニュー＞Tools＞RubyTest、もしくはファイル上の適当なところで右クリックメニュー＞RubyTestから「Run All Tests」を実行します。

下のように、コマンドから実行したのと同じような結果が出たらOKです。

![ruby17.png](https://qiita-image-store.s3.amazonaws.com/0/46625/83ab8b72-8e4c-ec88-37a8-78e3c686121d.png)

ここまでで環境セットアップが終わりです！
***
sublime3で上手くできる方法をご存知の方がいたら教えていただけるとめっちゃ喜びます。
ちなみに出てるエラーはdecode errorです。
対策探してみたけど、実際にはデコード絡みではないらしく…謎。
ソースコードの方のビルドは通るので余計謎…。
RuboCop | Style/WordArray

# RuboCop | Style/WordArray

## 概要

RuboCopの「Style/WordArray」警告について。

文字列配列を %w / %W 記法で記述しているかどうかチェックする。
デフォルトでは、文字列の配列の場合はすべて %w / %W 記法 で記述する必要がある。

*MinSize* を設定することで、任意のサイズまでブラケットによる配列の記法も許容される。

## WordArray

### 検証プログラム

~~~ruby:word_array.rb
print ['hoge', 'hige', 'hage']
print ['hoge', 'hige', 'hage', 'hege']
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
WordArray:
  MinSize: 0
~~~

~~~bash
$ rubocop word_array.rb
Inspecting 1 file
C

Offenses:

word_array.rb:1:7: C: Use %w or %W for array of words.
print ['hoge', 'hige', 'hage']
      ^^^^^^^^^^^^^^^^^^^^^^^^
word_array.rb:2:7: C: Use %w or %W for array of words.
print ['hoge', 'hige', 'hage', 'hege']
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 2 offenses detected
~~~

### 実行結果 MinSize を 3 にした場合

~~~yaml:.rubocop.yml
WordArray:
  MinSize: 3
~~~

~~~bash
$ rubocop word_array.rb
Inspecting 1 file
C

Offenses:

word_array.rb:2:7: C: Use %w or %W for array of words.
print ['hoge', 'hige', 'hage', 'hege']
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1 file inspected, 1 offense detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/word_array.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/word_array_spec.rb

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
右辺値は型ではない

C++ の右辺値について混乱していたので、右辺値と右辺値参照についてメモしておく。

# value category

C++ の式は、型とは別に _value category_ というものを持つ。value category は _prvalue_, _xvalue_, _lvalue_ のいずれかであり、prvalue と xvalue をまとめて  **右辺値** と呼ぶ。(prvalue, xvalue, lvalue については後述)

注意すべき点として、

- 同じ型を持つ式でも、異なる value category を持つことがある。
- 同じオブジェクトを返す式でも、異なる value category を持つことがある。

例えば、

```cpp
string s = string("hello ") + string("world");
strint t = s;
```

というコードにおいて、1行目の `string("hello ") + string("world")` の型と、2行目の右辺の `s` の型は同一(`string` 型)であるが、value category は異なっている (それぞれ prvalue と lvalue)。

ひどい例として、以下のような場合、

```cpp
string&& r = string("hello");
string t = r;
```

`r` の型は `string` への右辺値参照だが、2行目の `r` という式の value category は lvalue になる。

左辺値の式から無理やり右辺値を作りたい場合は `std::move` 関数を使ってキャストする。

```cpp
string s("hello");
string&& r = move(s);    // move(s) は xvalue (右辺値の一種)
```

# 関数のオーバーロードと右辺値

```cpp
string hoge = "piyo";
string x = ???;
```

という式を考える。

`???` の部分が `hoge` のような左辺値だった場合、string のコピーコンストラクタが呼び出される。一方、`???` の部分が `move(hoge)` のような右辺値の式だった場合、string のムーブコンストラクタが呼び出される。

一般に、ある関数 `f` が「左辺値参照を取るバージョン」と「右辺値参照を取るバージョン」の2通りにオーバーロードされていて、かつ `f` の引数が右辺値の式になっている場合、右辺値参照を取るバージョンの `f` が呼び出される。コピーコンストラクタ vs ムーブコンストラクタの例は、このルールのスペシャルケースになっている。

# prvalue, xvalue, lvalue について

## prvalue

prvalue (pure rvalue) は一時オブジェクトを生じさせる式。

例：

- 文字列以外のリテラル (`100` とか `nullptr` とか)
- 戻り値の型が参照型でない関数呼び出し式
- 組み込みの算術式、論理式、比較式など

## xvalue

xvalue (eXpiring value) は move 元のオブジェクトを表す式。

例：

- 戻り値の型が右辺値参照である関数呼び出し
- 右辺値参照へのキャスト式
- xvalue である式の non-static クラスメンバへのアクセス式

## lvalue

lvalue は一時的でないオブジェクトを表す式。

例：

- 変数名
- 戻り値の方が左辺値参照である関数呼び出し
- 代入式
- 文字列リテラル
Tips: DockerfileでADDするとき、ADD先ディレクトリ名を "/" で終えないとエラーになる


```Dockerfile
ADD setup.sh /tmp
```

のように、ADD先ディレクトリ名の末尾に```/```がない場合、```docker build``` 時に

```
Step 1 : ADD setup.sh /tmp
2014/08/05 13:35:51 lchown /var/lib/docker/devicemapper/mnt/84b70e369a27406ece9515a286ec2ae6bb261ce2111640b9684da38d92a8f80c/rootfs/tmp/setup.sh: not a directory
```

のようなエラーが発生する。


↓のように```/```を付ければOK

```Dockerfile
ADD setup.sh /tmp/
```

[Dockerfile Reference](https://docs.docker.com/reference/builder/#add) にも書いてあった(^^)
[Ruby]Windowsで環境セットアップからTDD開発サンプルまで その２

前回はRubyの最低限のベースを作るところまでやったので、今回はその続きです。
やっとTDDの環境作成に入ります。
そして実はこの辺りがつまづきまくった部分でもあります。
調べてると特に難しいこともないような感じで皆様書いてるので、私だけなのか…？

#環境作り　～RSpecのセットアップ
##プロジェクト階層の作成
まずはRSpecがちゃんと動くことを確認したいので、RSpecの確認用のプロジェクトを作ります。
めっちゃ安直に「rspectest」で作りました。
作り方はコマンドラインでも右クリックから新規作成でもお好きな方で。

##bundlerの初期化
プロジェクト階層である「rspectest」に移動して、bundlerの初期化をします。
普通にコマンドプロンプト起動してもいいのですが、ここで唐突に、フォルダを開いたときの上部にあるパスのエリアをクリックし、「cmd」と入力しEnterするとその階層に移動された状態でコマンドプロンプトが起動するというちょープチTIPSを紹介しておきます。
すでによく知られてそうだけど…。

![ruby6.png](https://qiita-image-store.s3.amazonaws.com/0/46625/0b3d0fc9-8289-3189-cdee-33b89d2b59b6.png)
![ruby7.png](https://qiita-image-store.s3.amazonaws.com/0/46625/b0947c4e-3f14-1e3b-8b74-4afff06aa7d8.png)
![ruby8.png](https://qiita-image-store.s3.amazonaws.com/0/46625/c94fbaba-f09d-ea52-5f8a-21b5dab9a21b.png)
微妙にちょっとだけラクに！

前置き（おまけ？）がえらい長くなりましたが、ここで`bundle init`を実行すると、「rspectest」階層の直下にGemfileが作成されます。
このGemfileがその１で説明したbundlerのプロジェクトで使うgemをまとめてくれる設定ファイルになっているようです。
エディタで開けますので、開いてRSpecを使う用にちょめちょめと直します。

```rb
- # gem "rails"
+ gem "rspec", ">= 3.0.0"
```

簡単に言うと、Ver.3.0.0以上のRSpecを使うよ！ってことらしいです。

![ruby9.png](https://qiita-image-store.s3.amazonaws.com/0/46625/c0217a23-76a4-04c7-d1ff-d9943a6a2b82.png)
こんな感じ。

##RSpecのインストール（bundle install）
Gemfileの修正ができたら、bundlerを使ってRSpecをインストールします。
コマンドプロンプトの「rspectest」階層から`bundle install --path .bundle`を実行して、終了を待ちます。
`--path`は指定しないで説明しているサイトも多かったのですが、どうも付けておいた良さそうです。
深い理由は知りません！（※後で調べるかも）

##RSpecの初期化
さて、やっとRSpecがプロジェクトにインストールされたはずなので、今度は初期化です。
コマンドプロンプトの「rspectest」階層から`bundle exec rspec --init`を実行…なんですが、私の環境ではいろいろ試してみても以下のようになってしまい、かなり詰まりました。

![ruby10.png](https://qiita-image-store.s3.amazonaws.com/0/46625/fec930e1-2624-64b8-5de3-bc9d7e17815b.png)

わからん！調べてもさっぱり出て来ない！
ということで暴挙に出まして、「Ruby200\bin」にインストールした「ruby.exe」と「rubyw.exe」をコピーして「rspectest\\.bundle\ruby\2.0.0\bin」に持ってきました。
ないって言ってるんだからあればいいんだろ！（自棄）
…理由と正しい対処をご存知の方は教えていただけるとありがたいですorz
とりあえず暴挙に出て上記対応を行うと正常っぽく動きますので、そのまま進めることにします。

![ruby11.png](https://qiita-image-store.s3.amazonaws.com/0/46625/36f85dfa-0d2b-8b22-089d-b12e58f41e6e.png)

コマンドを実施すると「rspectest」階層に「spec」フォルダと「.rspec」というファイルができています。
「spec」フォルダの中に「spec_helper.rb」ができているので、これを編集します。
正直細かいことはちんぷんかんぷんですが、要は長いコメントアウトを消したいので`=begin`と`=end`を消して保存。
…難しいことは追々でいいんですっ。
ちょっと長かったですが、ここまででRSpecの初期化が終わりました。

##RSpecおためし
まずはRSpecを動かしてみること自体が目的なので、最初から動くものを準備してしまいます。
以下の2ファイルを作成しました。

```rb:RspecTest.rb
class RspecTest
  def message
    "rtest"
  end
end
```

```rb:spec\RspecTest_spec.rb
require 'bundler'
Bundler.require

require_relative '../RspecTest'

describe RspecTest do
  it "test" do
    expect(RspecTest.new.message).to eq "rtest"
  end
end
```

rspectest.rbがソースコード、spec\rspectest_spec.rbがテストコードです。
なお、テストのファイルは_specと付けるのがお約束のようです。
できたらコマンドプロンプトの「rspectest」階層から`bundle exec rspec`を実行します。

![ruby12.png](https://qiita-image-store.s3.amazonaws.com/0/46625/49083419-bb41-cfd7-2d4b-4f6406b1114b.png)

エラーが出ずに、テストされてるっぽい画面が出たらRSpecさんはちゃんと動いてくれています。
エラーが出た場合は相対パスとかその辺りを調べてみるといいかもしれません。
***
ちなみに私は作業始めてからここまで**つまりまくった挙句、1週間かかりました**。
きっと皆様はもっとすいすいですよ…。
[妥協]WindowsのCygwinでgem install knife-soloがffi-yajlのエラーでこける件

最近、環境を作り直していたところエラーが出るようになりました。。

```lang:bash
$ gem install knife-solo

中略
/home/example/.rbenv/versions/2.1.0-rc1/lib/ruby/gems/2.1.0/gems/ffi-yajl-1.0.1/ext/ffi_yajl/ext/encoder/encoder.c:28: undefined reference to `yajl_gen_config'
collect2: error: ld returned 1 exit status
Makefile:232: recipe for target 'encoder.so' failed
make: *** [encoder.so] Error 1

make failed, exit code 2
```

どうもffi-yajlというnative extensionのエラーのようです。
knife soloというより、chefの方のパッケージの依存関係が更新されたようです。

今まで、jsonのパースにはyajl-rubyというパッケージを使っていたところ、ffi-yajlというのに切り替わったようです。
11.14.0.alpha.4 から 11.14.0.rc.2 でかえられているようです。

https://rubygems.org/gems/chef/versions

取り急ぎ入れたい場合は、一つ前の11.12.8をバージョン指定で入れておけばいいのでしょうか、、、
knife-soloと一括で入れないとだめっぽいので、bundleコマンドでいれました。


```lang:bash
$ gem install bundler
$ bundle init
$ vi Gemfile
source 'https://rubygems.org'
gem 'chef', '11.12.8'
gem 'knife-solo'
$ bundle install
```

いい方法あったら教えてください、、
※windows以外、Cygwin以外でも出るかもしれませんが試してはいません。
Vagrant sahara pluginチートシート

# 概要
Vagrant sahara pluginのチートシート．
# saharaとは？
vm imageのスナップショットを保存したり，前の状態に戻すことができるプラグイン．
# インストール
~~~
$ vagrant plugin install sahara
~~~
# チートシート
|command|概要|
|---|---|
|sandbox on|sandboxモード開始|
|sandbox off|sandboxモード停止|
|sandbox commit|今の状態を保存|
|sandbox rollback|変更を破棄|
# tips
## commitの高速化
一度vagrant haltで停止してからcommitを行う．
## 変更を加えてcommitせずにoff
off時にcommitが自動的に行われる．もし保存しなくない場合は，rollbackで戻してからoffするよう気をつける．
[Ruby]Windowsで環境セットアップからTDD開発サンプルまで その１

元々はC#使いなんですが、ずっとRubyに興味があったんですよ。
まとまったお休みが取れた際に環境作っていじってみようとして、
**「セットアップとか楽勝楽勝！」**
とか高括ってたら **全 然 楽 勝 じ ゃ な か っ た** のでメモ的な感じに残しておきます。
**最短で最適な情報ではない可能性があることは先にご了承ください。**
HOWTOと言えるかどうかも怪しい代物だけど、近い境遇の人には参考になるかも？

#前提条件
* 本業がC#使いなので、Windowsに環境作る（勉強のしやすさのため）
* RubyMineが気になってるけど、最初はとりあえずSublimeで頑張る
* Rails触ると覚えることがカオスになりそうなのでまずはnot Railsで始める
* TDD環境（RSpec）を使えるようにする
* TDD開発でFizzBuzzを作るまでが今回のゴール
* 当方の環境はWindows7(32bit)です

#環境作り　～基本部分のインストール
##まずはRubyのインストール
さすがにこれがなくちゃ始まらない。
[RubyInstaller](http://rubyinstaller.org/downloads/)からRubyInstallerをダウンロードします。
最新（これを書いてる時点ではRuby 2.0.0-p481）をゲット。
そして素直に実行。
途中で選択が出てきましたが、とりあえず**真ん中だけチェック**しました。

![ruby.png](https://qiita-image-store.s3.amazonaws.com/0/46625/f3b3f97a-c2be-80d0-4b86-1fbd27457c67.png)
足りなかったら後で入れればいいや的発想。

インストール階層は少なくともスペースを含むフォルダはNGのようですので、デフォルトのままで。
とりあえず何事もなくインストールが終わったら、コマンドプロンプトから`ruby -v`と打ってバージョンが表示されればOK。

##RubyGemsの更新
RubyGemsってのはRubyInstallerの場合は標準で含まれているパッケージ管理システムらしいです。
タイミングによってはRubyGemsの最新版が出ていることもあるので一応更新。
コマンドプロンプトから`gem update --system`を実行して、終了するまで待ちます。
終わったっぽいメッセージが表示されればOK。

##Rakeの更新
Rakeってのは同じくRubyInstallerの場合は標準で含まれているビルドツールらしいです。
ということで、前項と同じく一応更新。
コマンドプロンプトから`gem update rake`を実行します。
コマンドを見ると、早速更新したばかりのgemさんが使われてますねー。
途中、下のように「上書きしていい？」と聞かれるので、「y」と答えてあげます。

![ruby4.png](https://qiita-image-store.s3.amazonaws.com/0/46625/10532e6c-1401-ebb9-327c-da75b0881d88.png)

その後、終わったっぽいメッセージが表示されればOK。

##Bundlerのインストール
Bundlerってのはプロジェクトで使うgemをまとめて管理するツールのようです。
っていうとピンと来ないですが、例えば
**「このプロジェクトではAツールのVer1.2、BツールのVer2.5を前提で使います」**
ということになったとき、Ruby本体やAツール、Bツールのアップデートがかかってしまったり、微妙に違うバージョンの環境だったりすると、作ったシステムが動かなくてうぎゃー！という可能性もあります。
そこで、Bundlerであらかじめ前提とする環境を作っておいてあげると、その心配がない、と。

と言うことで、コマンドプロンプトから`gem install bundler`を実行します。
終わったっぽいメッセージが表示されればOK。
これは新規インストールしたので、正常にインストールされたかを確認しておきましょう。
`bundler -v`を実行して、バージョンらしきものが表示されたらOKです。
コマンドに-vと付けるとバージョン表示みたいですねー。
なお、このとき「**DL is deprecated, please use Fiddle**」というエラーっぽいものが出ることがありますが、**特に問題ないようなのでスルーします**。
***
とりあえず本当に最低限ということで、まずはここまで。
はじめてのElm その１


# 公式
http://elm-lang.org/

オンラインエディタで色々試しながら遊べる。

最終的にHtmlとJSに落ちるっぽいけど、文法はHaskellライクでかなーりとっつきにくい。なので、ExampleとLearnで遊んだ結果をメモとして残していこうと思います。

# ListとRecord

http://elm-lang.org/Learn.elm

この中のBeginner Classesが動画で一番とっつきやすかったので、その中のList and Recordsについて

### 動画の内容
データ構造としてListとRecord（Hashライクな構造体）を用意し、主にリストに対して再帰的に処理をかける関数を作り、それらの部品をmapを使うことによってさらに複雑なデータの操作が出来るところまで。

### List

普通に書く

```
list = [1,2,3,4,5]
```

:: を使って値を追加できる(:: : a -> [a] -> [a])

```
list = 1 :: 2 :: 3 :: 4 :: [] //[1,2,3,4]と等価
```

合計値を返すsum関数を作る

```
sum numbers =
  case numbers of
	[] -> 0
	hd :: tl -> hd + sum tl
```

caseはちゃんとインデント取らないと動かない！

ついでに長さを返すlengthも

```
length numbers =
  case numbers of
	[] -> 0
	hd :: tl -> 1 + length tl
```

これで平均値を返す関数も作れる

```
average numbers =
  sum numbers / length numbers
```

### Record

名前と点数のリストを持つ生徒Recordを作る

```
evan = { name = "Evan", grades = [90, 85, 30, 100] }
tom = { name = "Tom", grades = [70, 65, 10, 90] }
```

recordの要素はドットアクセス可能

```
evan.name // "Evan"
tom.grades //[70, 65, 10, 90]
```

生徒を複数持つ先生Recordを作る

```
snape = { name = "Snape", students = [evan,tom] }
```

生徒を受け取り、平均点を返す関数を定義

```
averageGrade student = average student.grades
```

クラスの平均点をmapを使って出す

```
classAverage teacher = 
  average (map averageGrade teacher.students)
```

mapは良くある定義

```
map sqrt [1,4,9] // [1,2,3]
```

関数とコレクションを受け取り、関数を各要素に適用した結果のコレクションを返す(List.map以外にもたくさんあった。)
Sinatraでセッションの情報が定期的にクリアされる問題


現在作成しているWebアプリケーションで定期的(数分位？)にセッション情報(sessionsに保存してたはずの情報がnilになっている)が消える問題に遭遇。
自分のWebアプリケーションは実環境ではnginx+passenger+sinatraっていう構成で動かしている。ただし、ローカル(thin+sinatra)では現象が発生してはいない。
nginxのログを見ているとセッションの情報が消えるタイミングで丁度passengerのプロセスが切り替わっている(PassengerPoolIdleTimeを経過したから？)ように見えた。これらの状況からマルチプロセスな環境で起きる問題っぽいと推測。
でもSinatraのセッション情報はデフォルトだとRack::Session::Cookieが使われるのでマルチプロセスであってもセッション情報は共有できるんじゃないのか...
と思ってSinatraのドキュメントを見返してたら以下の文章を見つけた。

```
セキュリティ向上のため、クッキー内のセッションデータはセッション秘密鍵(session secret)で署名されます。Sinatraによりランダムな秘密鍵が個別に生成されます。しかし、この秘密鍵はアプリケーションの立ち上げごとに変わってしまうので、すべてのアプリケーションのインスタンスで共有できる秘密鍵をセットしたくなるかもしれません。
...
```

けど明示的にsession secret指定してるから大丈夫なはずなんだけど、、、ってコード見返したら見事に指定の仕方間違えてた。
これを指定してから問題再現しなくなったので恐らくこれが問題だったのかと...


Sinatra - セッションの使用
http://www.sinatrarb.com/intro-ja.html#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%BF%E7%94%A8

Phusion Passenger users guide, Nginx version - PassengerPoolIdleTime
https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html#PassengerPoolIdleTime
Atom の Packages メモ


|名前|メモ|
|-----|-----|
| file-icon | ファイルが区別しやすくて便利 | 
| Sublime-Style-Column-Selection | 矩形選択 | 
| recent-files | File -> Recent |
| git-blame | あれ？これちょっと実装者に質問したいなってときに便利 |
| html2haml | erb から haml に変換してくれて便利 |
| language-haml | haml が見やすくなって便利 |
| rails-latest-migration | 作ったばかりの migration が見やすくて便利 |
| rails-rspec | 実装ファイルとrspecファイルの切り替えだできて便利 |
| autocomplete-plus | autocomplete されて便利 |
| zen | zen mode になって便利かも |
Herokuの環境変数を設定し見せたくない値を隠す。

GitHubなどPublicで公開しているプロジェクトをHerokuで動かしている場合、TwitterのAPIのキーやその他見せたくない設定などが丸見えになってしまう。

##Herokuの環境変数を使う
####設定　
```$ heroku config:set {KEY}={VALUE} {KEY}={VALUE}```  
**※ Add-onは追加すると自動的にここに値がセットされる**

####確認

```$ heroku config```
ダッシュボードからも確認できる。
https://dashboard.heroku.com/

####railsから呼び出す
``` ENV["KEY"] ```

####削除
```$ heroku config:unset {KEY}```

これでGitHubに上がっても大丈夫。


参照)
https://devcenter.heroku.com/articles/config-vars
OSXのbrewコマンドを使って最新のansibleインストール


使いたいモジュールがバージョン1.7以降しか対応してなかった。
brew install ansibleだとバージョン1.6.10しか入らない。


1.7を使うためには--HEADオプションをつければ良いみたい。

```sh:インストールコマンド
$ brew install ansible --HEAD
==> Cloning https://github.com/ansible/ansible.git
Updating /Library/Caches/Homebrew/ansible--git
==> Checking out branch devel
==> Downloading https://pypi.python.org/packages/source/p/pycrypto/pycrypto-2.6.tar.gz
Already downloaded: /Library/Caches/Homebrew/ansible--pycrypto-2.6.tar.gz
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD/libexec
==> Downloading https://pypi.python.org/packages/source/P/PyYAML/PyYAML-3.10.tar.gz
Already downloaded: /Library/Caches/Homebrew/ansible--pyyaml-3.10.tar.gz
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD/libexec
==> Downloading https://pypi.python.org/packages/source/p/paramiko/paramiko-1.11.0.tar.gz
Already downloaded: /Library/Caches/Homebrew/ansible--paramiko-1.11.0.tar.gz
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD/libexec
==> Downloading https://pypi.python.org/packages/source/M/MarkupSafe/MarkupSafe-0.18.tar.gz
Already downloaded: /Library/Caches/Homebrew/ansible--markupsafe-0.18.tar.gz
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD/libexec
==> Downloading https://pypi.python.org/packages/source/J/Jinja2/Jinja2-2.7.1.tar.gz
Already downloaded: /Library/Caches/Homebrew/ansible--jinja2-2.7.1.tar.gz
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD/libexec
==> python setup.py install --prefix=/usr/local/Cellar/ansible/HEAD
==> Caveats
If you need Python to find the installed site-packages:
  mkdir -p ~/Library/Python/2.7/lib/python/site-packages
  echo '/usr/local/lib/python2.7/site-packages' > ~/Library/Python/2.7/lib/python/site-packages/homebrew.pth
==> Summary
?  /usr/local/Cellar/ansible/HEAD: 904 files, 10M, built in 24 seconds
```
バージョンの確認

```sh:バージョン確認
$ ansible --version
ansible 1.7
```
Atomってcolor pickerついてるんだね！


# いきなりgif

便利そうー
クリックするとそのままテキストとして入力してくれる

`command` + `shift` + `c`

![atom-color.gif](https://qiita-image-store.s3.amazonaws.com/0/17518/86b6d055-4ff6-84e6-0b29-30d2adfb4764.gif "atom-color.gif")



Color Picker ってパッケージをインストールすると使えます
IE操作とスクリーンショット撮りを自動化するExcelVBAモジュールを書いた。

#概要
法人向けのシステム開発業務では、セキュリティの観点から自動テストのフレームワークを導入できない事があります。
そのような環境でもUIの自動テストを行えるように、ExcelVBAでIE操作とスクリーンショット撮りができるクラスモジュールを用意しました。
MITライセンスで公開致しますので、ご自由にご改修下さい。
※内容に関しては、製作時間5時間なので色々とご容赦下さい。

#コード
https://gist.github.com/nezuQ/421dc273ab20bde2e170
　※SJISのコードは日本語が文字化けする為、UTF8に変換したコードも載せました。
　※クラスモジュールのエクスポートファイルの拡張子が.cls、標準モジュールのが.basです。それらのエクスポートファイルはVBEからインポートできます。

#注意事項
##参照設定が必要です。
・Microsoft HTML Object Library
・Microsoft Internet Controls
##32bit版PCで使う時はコード修正が必要です。
keybd_event関数とShowWindow関数は、
実行PCが32bit版か64bit版かで関数の書き方が変わります。
64bit版の関数を使い、32bit版の関数はコメントアウトしています。
##動作確認は自PCでのみ行いました。
・Windows7(64bit版)
・Excel2010


#API
##開く（第1引数：URL文字列）
IEを最大化画面で起動し、指定のURLのWebサイトを開きます。

##フォーカスを当てる（第1引数：画面コントロールのID）
ID指定した画面コントロールにフォーカスを当てます。

##入力する（第1引数：テキストボックスのID, 第2引数：値）
ID指定したテキストボックスに値を入力します。

##ラベルで選ぶ（第1引数：ドロップダウンリストのID, 第2引数：ラベル）
ID指定したドロップダウンリストで指定項目を選択状態にします。
ラベル（表示名）で指定します。

##番号で選ぶ（第1引数：ドロップダウンリストのID、第2引数：番号）
ID指定したドロップダウンリストで指定項目を選択状態にします。
番号（インデックス）で指定します。

##値で選ぶ（第1引数：ドロップダウンリストのID, 第2引数：値）
ID指定したドロップダウンリストで指定項目を選択状態にします。
値（Option.Value）で指定します。

##クリックする（第1引数：画面コントロールのID）
ID指定した画面コントロールをクリックします。

##型と値でクリックする（第1引数：画面コントロールの種類, 第2引数：画面コントロールの値）
画面コントロールの種類(ex.input)と値(Value)で指定した画面コントロールをクリックします。

##待つ（第1引数：秒数）
指定した秒数だけ処理を止めます。

##全体を撮る(第1引数：シート名, 第2引数：セル名)
スクリーンショット（全体）を撮り、指定のシート名・セル名の場所に貼り付けます。

##アクティブ画面を撮る(第1引数：シート名, 第2引数：セル名)
スクリーンショット（アクティブ画面）を撮り、指定のシート名・セル名の場所に貼り付けます。

##評価する(第1引数：関数名, 第2引数：引数1, 第3引数：引数2)
上記の関数を名前（文字列）で呼び出します。
第2引数は呼び出し先の第1引数に、第3引数は呼び出し先の第2引数に渡されます。
ワークシートに関数とその引数を書き連ねて実行していきましょう！

#スクショ（デモ実行の結果）

先のクラスモジュールには、デモ実行のコードも付けています。
その実行結果をスクショで残します。

IEが起動し、[指定画面](http://search.nicovideo.jp/video/search/)が開かれる
![1.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/00df662f-0f8e-3222-c6c8-b8d04179326c.gif)

検索欄に値が入力され、又、表記替えボタンが押される
![2.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/e2f8f84e-35a1-d34d-3611-bb8778cf70e5.gif)

並び順の選択が変わる
![3.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/57ab1aee-f82d-0324-ce33-8a51fbce92b4.gif)

検索ボタンが押される
![4.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/5e0bb2f1-b50f-044f-44a4-eb4386c9716b.gif)

#感想
最初スクショを撮らずに記事を書いたけど、説得力がなくてビビった。
先のコードで本当に話している通りの動作ができるのか納得できない。
写真を提示された時の説得力は違う。

#追記（2014/08/11）
ExcelVBA製のInternetExplorer向けUIテストツールを作ってみました。
■nezuQ/PaperTester
https://github.com/nezuQ/PaperTester
Redis-traffic-statsの使い方とtcpdumpのおさらい


# redis-trafic-stats

- Redisのクエリーアナライザー "redis-traffic-stats" を書きました
http://d.hatena.ne.jp/hirose31/20140227/1393470729

- redis-traffic-stats 
https://github.com/hirose31/redis-traffic-stats

keyやcommandごとの発行数、データの転送量合計がわかる。
redis-fainaに比べて転送量がわかるのがポイント。
monitorによる劣化もないので普段のデータを気軽に集めておくのにとてもよい。


## 基本

~~redisへ接続するclient上で実行する。~~ -pオプションで指定するportは宛先である（default:6379）。

```
# tcpdumpを直接行ったあと分析
## 30秒間
./redis-traffic-stats -t 30 -p 6379
## 1000パケット
./redis-traffic-stats -c 1000 -p 6379

# 別途実行したtcpdumpのpcapファイルを分析
redis-traffic-stats -r output.pcap -p 6379
```

pcapファイルの分析時も想定するport番号の指定は必須。
※(追記)redis上でできないと勝手に思ってましたけど普通に出来ました。


## エラー

```
## Summary
* Duration:
    * 2038-01-19 12:14:08 - 1970-01-01 09:00:00 (1s)
* Total Traffic:
    * 0 bytes (0.00 bytes/sec)
* Total Requests:
    * 0 requests (Avg 0.00 req/sec, Peak 0.00 req/sec)
```

直接・ファイル読み込みいずれの場合でも、このように分析データが空表示される場合、tcpdumpのオプションか分析したいポート番号の指定が間違っている（ストリーム中にredisのパケットがない）。

# tcpdump

細かい分析にはtcpdumpを直接取得した後分析した方が便利です。

- X分ごとに分析
- 複数のredisをport番号で使い分けている場合

後者の場合は、複数port宛のデータを含む1つのpcapファイルをportごとに複数回分析すればよい。データの取得は1度で済む。

```
# 基本
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0
## 1000パケット
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0 -c 1000

# portrangeオプション
tcpdump -s 65535 tcp portrange 6379-6380 -w redis.pcap -i eth0 -c 1000

# 想定ホスト同士の通信に絞る等
tcpdump -s 65535 "tcp port 6379 and (src and dst net 192.168.0.0/16)" -w redis.pcap -i eth0 -c 1000

```

## 一定時間ごとにdump/指定回数rotateする(-G/-W)

```
# 60秒 * 5回 rotateし、%Y%m%d-%H%M形式で保存。
tcpdump -s 65535 tcp port 6379 -w redis.pcap -i eth0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap 
```

rotate後のファイル保存先がtmpでない場合、書き込み権限が問題になることがある。777またはtcpdumpユーザーを書き込み可能にするか、-Zオプションでrootを指定する。

```
# 書き込み時のユーザーをrootにする(権限を降格しない)
tcpdump -Z root -s 65535 tcp port 6379 -w redis.pcap -i eth0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap 
```

## postrotate コマンド実行(-z)
本来圧縮するためのオプションだが、redis-traffic-statsを含むスクリプトに引き渡したりも出来る。

```
# 圧縮
tcpdump -s 65535 tcp 6379 -i bond0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap -z gzip

# 指定コマンドへ引き渡し
tcpdump -Z root -s 65535 tcp 6379 -i bond0 -G 60 -W 5 -w redis_%Y%m%d-%H%M.pcap -z /usr/local/bin/redis-analyse.sh
```

コマンドが実行されるユーザーも-Zのオプションが引き継がれる。


## 分割したdumpファイルの再結合(mergecap)
rotateで分割して保存しておいたpcapファイルを結合してから改めて分析してもいい。

```
# install
yum install wireshark

# 結合
mergecap -F modlibpcap -w output.pcap in_cap1.pcap in_cap2.pcap in_cap3.pcap...
```
※redis-traffic-statsで分析したい場合、output formatにmodlibpcapを指定すること

# tcpdump + redis-traffic-stats

## 運用時のメモ
- tcpdumpでrotateする場合、条件に該当するpacketが発生していないとrotateのタイミングが想定通りにならないことがある。
- 複数のclient host上から取得したpcapデータをすべてmergecapして分析することも可能。
- redis-traffic-statsのslowコマンド実行時間はpcapからの値なので、アプリがauth->set->get->quitなどを一つのセッションで行う場合合計値が表示される。
- 実際に問題のあるクエリを解析する場面ではmonitorログでkeyと突き合わせる等の確認が必要。同じ時間帯でredis-traffic-stats/monitorそれぞれデータを取得し、redis-fainaと適宜使い分ければよい


# 参考リンク

- tcpdump コマンドの使いかたをまとめてみた
http://blog.livedoor.jp/sonots/archives/18239717.html

- tcpdumpについて知らない可能性のあるトップ10
http://uni-id.nri.co.jp/ncsirt/2010/0609.html
goxでGoをクロスコンパイルする

Goには、ひとつの端末上でMacやLinux、Windowsなど他のOS向けのバイナリをコンパイルする、クロスコンパイルの機能があります。ただしこのクロスコンパイル、Goをインストールしただけでは利用できず初期設定が必要、かつクロスコンパイルのインターフェイスも覚えにくいなど、やや使いにくいところがあります。

- [Go のクロスコンパイル環境構築 - Qiita](http://qiita.com/Jxck_/items/02185f51162e92759ebe)

しかし本稿で紹介するgox(ミシェルハシモトさん作)を使えばセットアップもクロスコンパイルも簡単に実行でき、かつ複数のプラットフォーム向けのバイナリを同時・並列にコンパイルする事も出来ます。

- [mitchellh/gox](https://github.com/mitchellh/gox)

# goxをインストール+ツールチェインをビルド

```shell-session
$ go get github.com/mitchellh/gox
$ sudo gox -build-toolchain
Password:
The toolchain build can't be parallelized because compiling a single
Go source directory can only be done for one platform at a time. Therefore,
the toolchain for each platform will be built one at a time.

--> Toolchain: darwin/386
--> Toolchain: darwin/amd64
--> Toolchain: linux/386
--> Toolchain: linux/amd64
--> Toolchain: linux/arm
--> Toolchain: freebsd/386
--> Toolchain: freebsd/amd64
--> Toolchain: openbsd/386
--> Toolchain: openbsd/amd64
--> Toolchain: windows/386
--> Toolchain: windows/amd64
--> Toolchain: freebsd/arm
--> Toolchain: netbsd/386
--> Toolchain: netbsd/amd64
--> Toolchain: netbsd/arm
--> Toolchain: plan9/386
```
これでgoxが使えるようになりました。

# クロスコンパイル(全てのプラットフォーム)
``gox``コマンドで、サポートされている全てのプラットフォームのコンパイルが実行される。

```shell-session
$cd $GOPATH/src/github.com/matope/helloworld
$gox
Number of parallel builds: 8

-->      darwin/386: github.com/matope/helloworld
-->    darwin/amd64: github.com/matope/helloworld
-->       linux/386: github.com/matope/helloworld
-->     linux/amd64: github.com/matope/helloworld
-->       linux/arm: github.com/matope/helloworld
-->     freebsd/386: github.com/matope/helloworld
-->   freebsd/amd64: github.com/matope/helloworld
-->     openbsd/386: github.com/matope/helloworld
-->   openbsd/amd64: github.com/matope/helloworld
-->     windows/386: github.com/matope/helloworld
-->   windows/amd64: github.com/matope/helloworld
-->     freebsd/arm: github.com/matope/helloworld
-->      netbsd/386: github.com/matope/helloworld
-->    netbsd/amd64: github.com/matope/helloworld
-->      netbsd/arm: github.com/matope/helloworld
-->       plan9/386: github.com/matope/helloworld
$ ls
helloworld_darwin_386        helloworld_freebsd_amd64     helloworld_linux_amd64       helloworld_netbsd_amd64      helloworld_openbsd_amd64     helloworld_windows_amd64.exe
helloworld_darwin_amd64      helloworld_freebsd_arm       helloworld_linux_arm         helloworld_netbsd_arm        helloworld_plan9_386         main.go
helloworld_freebsd_386       helloworld_linux_386         helloworld_netbsd_386        helloworld_openbsd_386       helloworld_windows_386.exe
```

# 特定プラットフォーム用にコンパイル
Mac用とLinux用のバイナリを同時にコンパイルします。

```shell-session
$ gox --osarch "linux/amd64 darwin/amd64"
Number of parallel builds: 8

-->     linux/amd64: github.com/matope/helloworld
-->    darwin/amd64: github.com/matope/helloworld
$ ls
helloworld_darwin_amd64 helloworld_linux_amd64  main.go
```

# プラットフォーム
Go 1.3で利用可能なプラットフォーム表記一覧

- darwin/386
- darwin/amd64
- linux/386
- linux/amd64
- linux/arm
- freebsd/386
- freebsd/amd64
- openbsd/386
- openbsd/amd64
- windows/386
- windows/amd64
- freebsd/arm
- netbsd/386
- netbsd/amd64
- netbsd/arm
- plan9/386
他人のdotfilesとvimrcをコード・リーディングする


公開されているリポジトリやファイルをダウンロードするスクリプトを実行します。

##dotfiles

```bash:
$ curl -O https://gist.githubusercontent.com/syui/fd3ea4192b8c61b4b0d1/raw/dotfile_download.sh

$ chmod +x !$:t

$ ./!$
```

新しい`dotfiles`を見てくてくださった場合は、`sort .dotfiles -uo .dotfiles`して`fork`でもしてくださればと思います。よろしくお願いします。

https://github.com/syui/dotfiles/blob/master/.dotfiles

##vimrc

vimrcは、`vimrc読書会`のものを使います。一回目の`curl`が何故か失敗する事例がありますので、念のため。

```bash:
$ curl -O https://gist.githubusercontent.com/syui/b8176fc83d42c105c7f8/raw/vimrc_download.sh

$ chmod +x !$:t

$ ./!$
```


> curl http://vim-jp.org/reading-vimrc/json/archives.json
cakephp 【DB接続エラー】 

【備忘録】 cakephp導入時の設定

cakephpを導入、諸々の初期設定、DBの作成後、bakeを実行するとMysqlに接続できないとエラー

```shell-session:ターミナル
Error: Database connection "Mysql" is missing, or could not be created.
```

cakephpのルートでは緑文字で

```
Your database configuration file is present.
```

と出ていて、Mysqlの接続は確認済み。

PDOの設定の問題かと思いphpinfo()で確認するも設定済み


--------------------------------------------------------------------
■対策

database.php内の"host"を、"localhost"→"127.0.0.1"に変えることで解決

```php:database.php
	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => '',
		'password' => '',
		'database' => '',
		'prefix' => '',
		'encoding' => 'utf8',
	);
```
これを下記に変更

```php:database.php
	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => '127.0.0.1',
		'login' => '',
		'password' => '',
		'database' => '',
		'prefix' => '',
		'encoding' => 'utf8',
	);
```
DBを直接削除しただけでは、マイグレーションはうまく動かない



最初からマイグレーションし直したくて、直接DBを削除してしまった場合に、
以下のようにうまく動作しない。

```bash:shell
$ php oil r migrate
Already on the latest migration for app:default.
```

DBにある`migration`テーブルがないので、
直感的にうまくいきそうだけどうまくいかない。

なぜなら、DBの`migration`テーブルの他に、
以下のファイルにもマイグレーション情報が記述されているから。

```php:fuel/app/config/development/migrations.php
<?php
return array(
	'version' => 
	array(
		'app' => 
		array(
			'default' => 
			array(
				0 => '001_create_customer',
				1 => '002_create_users',
			),
		),
		'module' => 
		array(
		),
		'package' => 
		array(
			'auth' => 
			array(
			),
		),
	),
	'folder' => 'migrations/',
	'table' => 'migration',
);
```

version.app.defaultの部分を空にする必要がある。

```php:fuel/app/config/development/migrations.php
<?php
return array(
	'version' => 
	array(
		'app' => 
		array(
			'default' => 
			array(
			),
		),
		'module' => 
		array(
		),
		'package' => 
		array(
			'auth' => 
			array(
			),
		),
	),
	'folder' => 'migrations/',
	'table' => 'migration',
);
```

この編集をした後に、マイグレーションコマンドを実行すれば正常に完了する。


そもそも最初からやり直したい場合は、
直接DBを削除するのではなくて、
以下のマイグレーションコマンドを実行したほうが良い。

```bash:shell
$ php oil r migrate:down -v=0
```
VirtualBoxで各種OSを安全にSSH接続する方法


##VirtualBoxの設定

まず、VirtualBoXの設定です。Cmd+,を押して、VirtualBoxのネットワーク設定を行います。具体的には、NATネットワーク、ホストオンリーネットワークに設定を追加します。追加する項目は、デフォルトでいいでしょう。設定には、DNSなども含まれるため、アドレスを固定したい場合などは、適時変更してください。


次に、ゲストOSのネットワーク設定です。簡単には、ゲストOSのネットワーク設定でアダプタ1をNAT、準仮想化ネットワークにします。次に、アダプタ2でホストオンリーアダプター、準仮想化ネットワークにします。



アドレスの固定方法ですが、VirtualBoxの設定からの方法が最も簡単です。

> ネットワーク –> ホストオンリーネットワーク
> 
> vboxnet0, vboxnet1, vboxnet2 のように複数作成します。
>
> 各自アドレスを変更します。ゲストのアドレスは、ホストのアドレスと合わせてください。
>
> 先ほど設定したホストオンリーネットワークのvboxnet”n”を各種OSのネットワーク設定に指定します。



この設定により、接続コマンドを固定できます。

##ゲスト側の設定

設定を終えたら、ホストからゲストに通信ができるかを確認してみましょう。

まずは、LAN Address(アドレス)の確認からですね。基本的に、Arch Linuxにはifconfigが入ってないので、インストールしておきましょう。

```bash:
$ sudo pacman -S net-tools openssh

$ ifconfig

$ ifconfig | tr ' ' '\n' | grep 192
```

では、次に、SSH Server(サーバー)の設置と、場合によっては、Firewall(ファイアウォール)の設定を変更しなければなりません。

具体的には、SSH ServerをDaemon(デーモン)で起動し、サーバーに設定した接続ポートへのアクセスをFirewallに許可させなければなりません。

SSH Serverの設定を変更します。ここでは、デフォルトのままで良いです。変更したい方は、`/etc/ssh_config`を変更して下さい。


```
$ sudo systemctl start sshd
```

SSH Serverを起動時に有効にします。

```
$ sudo systemctl enable sshd.service
```

一応、ホストからアクセスできるか確認してみましょう。

```
$ ssh manjaro@192.168.56.101
```

Firewallを有効にし、ステータスを確認します。

```bash:
$ cp /etc/iptables/{simple_firewall,iptables}.rules

$ systemctl enable iptables.service
```

ゲスト側の設定を`/etc/ssh/sshd_config`にて行います。最低限のセキュリティを強化します。


```bash:/etc/ssh/sshd_config
Port 55010

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

PasswordAuthentication no
```


##SSHの設定


公開鍵の発行と受け渡しです。ホスト側で行います。一般的なスクリプトを使います。

```
$ ssh-keygen -t rsa

$ brew install ssh-copy-id

$ ssh-copy-id -i ~/.ssh/id_rsa.pub manjaro@192.168.56.101
```


SShデーモンの再起動は以下のコマンドを実行します。ゲスト側で行います。

```bash:
$ sudo systemctl restart sshd
```

接続は、以下の様な感じで行えます。

```bash:
$ ssh manjaro@192.168.56.101 -p 55010
```

##Cygwinの設定

CygwinのOpenSSHを利用し、SSH Serverを立ち上げてみます。これにより、Cygwinを導入しているWindowsにもSSH接続可能になります。便利です。

```bash:
$ apt-cyg install openssh

$ ssh-host-config -y

$ cygrunsrv -S sshd

$ passwd
```

ファイアウォールの設定を変更します。ポート22を開けましょう。これは、Windows側の設定で行います。

試しに接続してみましょう。

```bash:
ssh -v username@192.168.56.101
```

次に、サーバーを停止し、設定ファイルを編集します。

```bash:
$ cygrunsrv -E sshd

$ vim /etc/sshd_config
```

あとは、サーバーを起動し、クライアントから接続するだけです。

```bash:
# サーバー(ゲスト側)
$ cygrunsrv -S sshd

# クライアント(ホスト側)
$ ssh username@192.168.56.101 -p 55101
```

###Windowsの自動ログイン

ちなみに、パスワードが設定されると、自動でログインできなくなります。Windowsの自動ログインを解除するには、以下の手順が必要です。

- [スタート] ボタンをクリックし、「netplwiz」と入力して、Enter キーを押します。
- [ユーザー アカウント] ダイアログ ボックスで、自動的にログオンするときに使うアカウントをクリックします。設定を変更できる場合は、[ユーザーがこのコンピューターを使うには、ユーザー名とパスワードの入力が必要] チェック ボックスをオフにします。
- [OK] をクリックします。
- [自動ログオン] ダイアログ ボックスでユーザーのパスワードを 2 回入力し、[OK] をクリックします。
[ChatOps] サーバサイドで起きた諸々の事象をSlackbotに通知してもらう

（2014/09/09追記）

こちらも併せてご覧下さい。

コード1行でBotがSlackへ通知してくれるGemを公開しました - Qiita
http://qiita.com/kidachi_/items/debfd0474d0888e5b1f1



## 概要

Qiita::Teamでも連携対応された[Slack](https://slack.com/)。
http://blog.qiita.com/post/88252533014/qiita-team-slack

最近は[HipChat](https://www.hipchat.com/)との比較で、デザインが良い／後発だけに出来ることが多い等、
[話題に上がる](http://rebuild.fm/52a/)ことも多いですね。

基本的なAPIは用意されているので、タイトル程度の内容なら[hubot](https://hubot.github.com/)を使わずとも実現可能です。

## APIトークンの生成

まずは準備として、各種APIを利用するために

https://api.slack.com/#auth

よりAPIトークンの発行を行います。

Slack内にサインインし、かつ何らかのteamに属していれば、以下のように`Create token`を押下するだけで発行可能です。

![Slack_API___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/48274/9dad2e26-2171-3a74-1a02-102ae49d1890.png "Slack_API___Slack.png")


※もしteamに属していない場合は
`Please log into your team and then reload this page to view your tokens.`
といったメッセージが表示されています。
まずはteamを作成（もしくはどこかのteamに招待を依頼）し参加しましょう。


## APIの選定

上記Authenticationの項目の下に様々なAPIが載っています。

今回は、シンプルに指定のchannelにメッセージを投げてくれる
`chat.postMessage`
https://api.slack.com/methods/chat.postMessage
を使います。

インターフェースを見ると、以下を構築してgetで叩くだけで良さそうです。

```rb
https://slack.com/api/chat.postMessage?channel=<channel_name>&text=<text>&token=<your_token>&username=<bot_name>
```

## 実際に利用する

今回はRubyで書いてみます。

```ruby
require 'addressable/uri'
require 'net/http'

endpoint = 'https://slack.com/api/chat.postMessage'
token='hogehoge'
channel='#slack_bot_test'
text='hello,slackbot!'
username='slackbot'

uri = Addressable::URI.parse(endpoint)
query = {token: token, channel: channel, text: text, username: username}
uri.query_values ||= {}
uri.query_values = uri.query_values.merge(query)

Net::HTTP.get(URI.parse(uri))
=> "{\"ok\":true,\"channel\":\"C02EZTYKS\",\"ts\":\"1407134492.000010\"}"
```


## 結果
![Slack_と_1__rails_c__ruby_.png](https://qiita-image-store.s3.amazonaws.com/0/48274/3918c056-802e-8daf-6aef-da8310954bb3.png "Slack_と_1__rails_c__ruby_.png")


出来ました。

自分はこれをサーバ側で何らかの例外が吐かれる時に叩かせて、チャット上に通知してもらっています。

記事のタイトルは`サーバサイドで起きた諸々の事象を〜`としましたが、
getのAPIを叩くだけなのでどんなシーンでも利用できそうですね。

インタラクティブな作業（チャットからbotにデプロイを依頼するなど）はhubotが必要になりますが、
まずはお手軽なChatOpsの第一歩として、こちらもぜひ試してみてください。
Cygwinで使える裏ワザ vol.1


Cygwinでは、`cygstart`というLinuxでいう`open`コマンドが存在します。また、セットアップファイルには、いくつかのコマンドオプションが用意されていて、引数を渡すと、動作してくれます。(エイリアスとかも設定されているかもしれません

例えば、以下のコマンドは、セットアップファイルから`wget`などをインストールするコマンドになります。


```bash:
$ cygstart /cygdrive/c/Cygwin/cygwinsetup -q -P wget, curl
```

ちなみに、`cygdrive`は、Cygwinの仮想ディレクトリではなく、本来のWindowsドライブにアクセスするポイントになります。

そして、`wget`などが使えるようになると、`apt-cyg`というパッケージ管理スクリプトを使えるようになるので、便利です。

```bash:
$ wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg

$ chomd +x apt-cyg

$ mv apt-cyg /usr/bin
```

ただし、`powershell`や`cmd`上から実行する場合は、普通に実行ファイルを指定するだけでOKです。

```bash:
> C:\Cygwin\cygwinsetup.exe -q -P wget
```
C++のラムダ式の参照キャプチャは危険がいっぱい？

JavaScript でこんな感じにクロージャーを使うと、

```js
function get_func()
{
    var val=0;
    return function(){
        return ++val;
    };
}
```

カウンタのように動作しますが、

```js
var a = get_func();
var b = get_func();

console.log(a()); // 1
console.log(a()); // 2
console.log(b()); // 1
console.log(b()); // 2
```

C++ のラムダ式で次のようにすると動作しません。

```cpp
#include <iostream>
#include <functional>

std::function<int()> get_func()
{
    int val = 0;
    return [&]() -> int {
        return ++val;
    };
}

int main()
{
    auto a = get_func();
    auto b = get_func();

    std::cout << a() << std::endl;
    std::cout << a() << std::endl;
    std::cout << b() << std::endl;
    std::cout << b() << std::endl;

    return 0;
}
```

クロージャーじゃないので `get_func()` 関数を抜けた時点で `val` は無くなっており、ラムダ式が参照キャプチャしている `val` は不正な位置を指しているからです。

次のようなコードがダメなのと同じです。

```cpp
#include <iostream>

int* get_func()
{
    int val;
    return &val;
}

int main()
{
    auto a = get_func();
    auto b = get_func();

    std::cout << ++*a << std::endl;
    std::cout << ++*a << std::endl;
    std::cout << ++*b << std::endl;
    std::cout << ++*b << std::endl;

    return 0;
}
```

C++ な人にはごくごく当たり前のことだし、同じに考えるほうがオカシイのだろうけど、他の言語になれた人は引っかかりそうな気がします。

---

最初の JavaScript のようなことを C++ でやりたければどうすべきなのでしょうかね・・・


こんな感じ？

```cpp
#include <iostream>
#include <functional>

std::function<int()> get_func()
{
    class func
    {
    public:
        func() : val(0) {}
        int operator()()
        {
            return ++val;
        }
    private:
        int val;
    };

    return func();
}

int main()
{
    auto a = get_func();
    auto b = get_func();

    std::cout << a() << std::endl;
    std::cout << a() << std::endl;
    std::cout << b() << std::endl;
    std::cout << b() << std::endl;

    return 0;
}
```
CentOS5でdockerのベースイメージを自作する


CentOSのdockerベースイメージ自作はCentOS6だとよく見かけるのですがCentOS5では見かけないのでチャレンジしてみました。

## febootstrapのインストール

CentOS5ではepelからじゃないとfebootstrapをインストール出来ないので、yumリポジトリにepelを追加し、febootstrapをインストールします。

## ブートストラップの作成

インストールしたfebootstrapはVer.3.x系なので、CentOS6(febootstrap Ver.2.x系)の場合と勝手が違います。

```bash:
$ febootstrap --names yum bash coreutils -o bootstrap
```

``--names``で必要なパッケージを列挙します。多分``bash``とか``coreutils``はいらないかもしれません(試していない)。
``-o``で出力先のディレクトリを指定します。

febootstrap 2.xであればこの時点でbootstrapの中身をtar.xzにしてやることでdockerにimportさせられるのですが、febootstrap 3.xでは違う形式のため、まだまだ続きます。

作成後のディレクトリには以下の2ファイルがあります。

```bash:bootstrap/
$ ls bootstrap
base.img	hostfiles
```

``base.img``はスケルトン状態のファイルシステムを内包したcpio形式のファイル、``hostfiles``はホストからコピーされるファイルの一覧のテキストで、superminでは最低でもこれら2つのファイルを使ってイメージを構築するそうですよ。(詳しくはfebootstrap3のmanで)


## febootstrap-supermin-helperでベースイメージを構築する

Fedoraな方ですと以下の様感じでsuperminコマンドを使用すれば良いようです。

```bash:
$ supermin --build --format chroot bootstrap -o appliance.d
```

が、CentOS5ではsuperminが使えないっぽいので、febootstrap-supermin-helperを使用します。
febootstrap-supermin-helperではフォーマットが``cpio``か``ext2``しかなく、``chroot``が選べません。なので``ext2``を指定してディスクイメージを作成し、マウントさせて中身をいただくという手段を取ります。

```bash:
$ sudo febootstrap-supermin-helper -u root -g root -f ext2 bootstrap/ i686 appliance/kernel appliance/initrd appliance/root
```

64bit環境の場合、``i686``のところを``x86_64``にしてください

## 作成したディスクイメージをマウントさせ、中身をアーカイブする

febootstrap-supermin-helperを実行した結果、``appliance``ディレクトリには以下のファイルがあります。

```bash:
$ ls appliance
initrd	kernel	root
```

この内、``root``が目的のディスクイメージです。マウントして中身をアーカイブします。

```bash:
$ sudo mount -t ext2 -o loop appliance/root mnt/
$ sudo tar cf centos5.tar -C mnt/ .
$ suto xz -v centos5.tar
```

あとはdockerを使っている環境にファイルを持って行き、importすればOKです。

```bash:
$ cat centos5.tar.xz | docker import - local/centos:5
```

これで一応dockerイメージを作れましたが、もっと良い方法があるんじゃないかと思うほど面倒な手順なので、ひょっとしたら気づいてないだけでみんなもっと簡単に作っているのではないかと思っています。
gitを使って変更したファイルのみを取り出す方法。

## git archiveを使う
ユーザーのpeperonという場所に、「html.zip」という形式でファイルを出力する例。
```
$ git archive --format=zip HEAD `git diff master --name-only --diff-filter=AM` -o C:\User\peperon\html.zip
```

masterと現在のブランチを比較し、削除されたファイルを除き、変更があったファイルをアウトプット（-o）しています。（コマンドライン慣れてない人、半角スペース注意。）

以上、エンジニアさんに聞いた方法です。
納品ファイル漏れで始末書にならずに済むので、きっと便利。
Android-ViewPagerIndicatorのおさらいをしておこう

# Android-ViewPagerIndicator

```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　やつを追う前に言っておくッ！
　　　　　　　　　　　　　　　　　　　　おれは今ViewPagerIndicatorをほんのちょっぴりだが体験した
　　　　　　　　　　　　　　　　　　い…いや…体験したというよりはまったく理解を超えていたのだが……
　　　　　　　　 ,. -‐'''''""¨¨¨ヽ
　　　　 　 　 (.＿＿_,,,... -ｧァﾌ|　　　　　　　　　　あ…ありのまま 今　起こった事を話すぜ！
　 　 　 　 　 |i i|　 　 }!　}} /／|
　　　　 　 　 |l､{　 　j}　/,,ｨ//｜　　　　　　　『おれはViewPagerIndicatorを入れていたと
　　　　　　　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　　　　　　　　思ったらいつのまにかブリッジしていた』
　　　　　　　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |
　　 　 　 ／´fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人　　　　　　　　な…　何を言ってるのか　わからねーと思うが
　　　　 /' 　 ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ　　　　　　　　おれも何をされたのかわからなかった…
　　　　,ﾞ　 ／ )ヽ iLﾚ 　u' |　| ヾｌﾄﾊ〉
　　 　 |／_／　 ﾊ !ニ⊇　'／:} 　V:::::ヽ　　　　　　　　頭がどうにかなりそうだった…
　　　 /／ 二二二7'T'' ／u'　__ /:::::::/｀ヽ
　　　/'´r　-―一ｧ‐ﾞＴ´　'"´ ／::::／-‐ 　＼　　　　催眠術だとか超スピードだとか
　　 / // 　 广¨´ 　/'　　 ／:::::／´￣｀ヽ ⌒ヽ　　　　そんなチャチなもんじゃあ　断じてねえ
　　ﾉ ' /　 ノ:::::`ー-､___／:::::／/ 　 　 　 ヽ　　}
_／｀丶　/::::::::::::::::::::::::::￣`ー-{:::...　　　 　　　ｲ　 もっと恐ろしいものの片鱗を味わったぜ…
```

ViewPagerでいい感じの位置を表示してくれるライブラリ。
結構前からあるし有名だけどこうカスタムしろっていう記事がないので書いておく。
サンプルコード嫁とか言われたらめんどくせーっていう人へ。

# AndroidStudio、Gradleで導入
http://stackoverflow.com/questions/21130003/using-viewpagerindicator-library-with-android-studio-and-gradle
> Jake Wharton hasn't released it in maven as an aar. There's a group though that has made an aar of it available through their server, you can set it up like this in your build.gradle:


ということなので、

```
repositories {
    maven { url "http://dl.bintray.com/populov/maven" }
    mavenCentral()
}
```
Mavenのリポジトリ定義してるところに、上の順番を守ってbuild.gradleに書きます。

そしてdependenciesにも下記を書きます。

```
dependencies {
    // ...
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    // ...
}
```

これで問題なくsyncできるはずです。

# 使い方
Activityにどう書くとかは是非下記見ていただきたいのですが、
https://github.com/JakeWharton/Android-ViewPagerIndicator

CirclePageIndicatorの見た目のカスタムをちょろっとやったのでメモしておきます。

styleを定義します。

```
    <style name="CustomCirclePageIndicator">
        <item name="fillColor">@color/red</item>
        <item name="centered">true</item>
        <item name="pageColor">@color/dark_gray</item>
        <item name="strokeColor">@color/clear</item>
        <item name="radius">6dp</item>
    </style>
```

fillColorは動く◯の色。
pageColorは動かない横並びの◯の色。
strokeColorはpageColorの周りの色っぽい？今回入らないので透明に。
radiusは動く◯の大きさ（半径）。

レイアウトには下記のように設置。

```
    <com.viewpagerindicator.CirclePageIndicator
        android:id="@+id/circles"
        style="@style/CustomCirclePageIndicator"
        android:padding="10dp"
        android:layout_alignParentBottom="true"
        android:layout_height="wrap_content"
        android:layout_width="match_parent" />
```

paddingはこの場合、最下部からの距離。
他にもいろいろいじって遊んでみよう。
PhalconでNew Relicのトランザクション解析機能を使う

パフォーマンス監視サービスの [New Relic](http://newrelic.com/) 使ってますか？ 便利ですよね。

しかしながら、残念なことにPHPのMVCフレームワークのPhalconには標準対応しておりません。そこで、dispatcherの設定をいじって対応する方法をまとめておきます。

# 設定方法

`public/index.php`（MultiModuleの場合は`Mudule.php`）のdispatcherを設定している箇所を以下のように書き換えます。

```php:public/index.php
// Registering a dispatcher
$di->set('dispatcher', function () {
    $dispatcher = new \Phalcon\Mvc\Dispatcher();
    $dispatcher->setDefaultNamespace('Your\NameSpace');
    if (extension_loaded('newrelic')) {
        $manager = new \Phalcon\Events\Manager();
        $manager->attach('dispatch', function ($event, $dispatcher) {
            $controller = $dispatcher->getControllerName();
            $action     = $dispatcher->getActionName();
            newrelic_name_transaction($controller . '/' . $action);
        });
        $dispatcher->setEventsManager($manager);
    }
    return $dispatcher;
});
```

# 参考URL

https://docs.newrelic.com/docs/agents/php-agent/features/php-frameworks-integrating-support-new-relic
Android広告IDを取得してみる


Androidアプリで広告用に各社色んなIDを使っているかと思うけど、2014年8月1日以降のGooglePlayに申請のあるアプリは、advertising IDを使用しなきゃダメだよっていう規約になっております。というわけで、どんな感じでadvertising IDが取得できるのかやってみます。

## 参考

- https://support.google.com/googleplay/android-developer/answer/6048248?hl=ja
- https://play.google.com/about/developer-content-policy.html#ADID

おそらく、Android2.3以降でないと対応できない…と思われます。

# Android広告IDを取得してみる

AdvertisingID（以降、広告IDと表記統一）の実装は、Googleのドキュメントにも書かれているように、とても簡単。注意しなくちゃいけないのは、メインスレッド以外で取得してねっていう所と、Google Play Servicesが必要っていう所。

## Google Play Servicesの対応

EclipseなどからAndroid SDK Managerを起動して、Extrasの中にあるGoogle Play Servicesを選択肢てインストールします。

### Google Play Servicesのインストール

![Android_SDK_Manager_と_Java_-_Sample_src_jp_basicinc_match_MainActivity_java_-_Eclipse_-__Users_zaru_Documents_workspace.png](https://qiita-image-store.s3.amazonaws.com/0/2152/1fe6af60-1e76-2b85-f408-c0322dd3c0ba.png "Android_SDK_Manager_と_Java_-_Sample_src_jp_basicinc_match_MainActivity_java_-_Eclipse_-__Users_zaru_Documents_workspace.png")


### Google Play Servicesのインポート

EclipseのFile -> Import -> Existing Android Code Into Workspaceを選択。下記ディレクトリをコピーインポート。

- /android_sdk/extras/google/google_play_services/libproject

あとは、対象のAndroidアプリプロジェクトのプロパティを開き、Androidの項目で、ライブラリとしてGoogle Play Servicesを読み込みます。

![Properties_for_Sample_と_Java_-_Sample_src_jp_basicinc_match_MainActivity_java_-_Eclipse_-__Users_zaru_Documents_workspace.png](https://qiita-image-store.s3.amazonaws.com/0/2152/a0cfae9f-fba1-402d-f808-0d67544d1c04.png "Properties_for_Sample_と_Java_-_Sample_src_jp_basicinc_match_MainActivity_java_-_Eclipse_-__Users_zaru_Documents_workspace.png")

これで前準備は完了。

## 広告IDを取得する

メインスレッドじゃダメだよって書いてあるので、new Threadして取得します。

```MainActivity.java
public void getAdId() {
	Thread adIdThread = new Thread(new Runnable() {
		@Override
		public void run() {
			Info adInfo = null;
			try {
				adInfo = AdvertisingIdClient
						.getAdvertisingIdInfo(getApplicationContext());
				final String id = adInfo.getId();
				final boolean isLAT = adInfo.isLimitAdTrackingEnabled();
				Log.d("DEBUG", "AndroidAdID : " + id);
				Log.d("DEBUG", "OptoutFlag : " + String.valueOf(isLAT));
			} catch (Exception e) {
			}
		}
	});
	adIdThread.start();
}
```

参考 : https://developer.android.com/google/play-services/id.html

isLimitAdTrackingEnabled() というのは、各ユーザが「Google設定」アプリから設定が可能な「インタレストベース広告をオプトアウト」にチェックをつけているかどうかのフラグです。

この広告ID自体を無効にするっていうのはできないっぽい…。リセットが精一杯の抵抗ってことになるのかな。
Google Play Services 5.0.77 が光の彼方へ消し去られた件

追記あり

```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　やつを追う前に言っておくッ！
　　　　　　　　　　　　　　　　　　　　おれは今やつのアップデートをほんのちょっぴりだが体験した
　　　　　　　　　　　　　　　　　　い…いや…体験したというよりはまったく理解を超えていたのだが……
　　　　　　　　 ,. -‐'''''""¨¨¨ヽ
　　　　 　 　 (.＿＿_,,,... -ｧァﾌ|　　　　　　　　　　あ…ありのまま 今　起こった事を話すぜ！
　 　 　 　 　 |i i|　 　 }!　}} /／|
　　　　 　 　 |l､{　 　j}　/,,ｨ//｜　　　　　　　『おれは奴のアップデートでライブラリを入れていたと
　　　　　　　 i|:!ヾ､_ﾉ／ u {:}//ﾍ　　　　　　　　思ったらいつのまにか無くなっていた』
　　　　　　　 |ﾘ u' }　 ,ﾉ　_,!V,ﾊ |
　　 　 　 ／´fト､_{ﾙ{,ィ'ｅﾗ　, ﾀ人　　　　　　　　な…　何を言ってるのか　わからねーと思うが
　　　　 /' 　 ヾ|宀| {´,)⌒`/ |<ヽﾄiゝ　　　　　　　　おれも何をされたのかわからなかった…
　　　　,ﾞ　 ／ )ヽ iLﾚ 　u' |　| ヾｌﾄﾊ〉
　　 　 |／_／　 ﾊ !ニ⊇　'／:} 　V:::::ヽ　　　　　　　　頭がどうにかなりそうだった…
　　　 /／ 二二二7'T'' ／u'　__ /:::::::/｀ヽ
　　　/'´r　-―一ｧ‐ﾞＴ´　'"´ ／::::／-‐ 　＼　　　　催眠術だとか超スピードだとか
　　 / // 　 广¨´ 　/'　　 ／:::::／´￣｀ヽ ⌒ヽ　　　　そんなチャチなもんじゃあ　断じてねえ
　　ﾉ ' /　 ノ:::::`ー-､___／:::::／/ 　 　 　 ヽ　　}
_／｀丶　/::::::::::::::::::::::::::￣`ー-{:::...　　　 　　　ｲ　 もっと恐ろしいものの片鱗を味わったぜ…
```

昨日まで普通にビルドできていたのが、今日になって突然ビルドエラーになるという症状が出てしまいました。

```
FAILURE: Build failed with an exception.

  > Could not find com.google.android.gms:play-services:5.0.77.

＿人人人人人人人人人人人＿
＞　突然のビルドエラー　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

全く身に覚えのないビルドエラー。どうやら Google 先生がまた何かをしたようです。

というわけで調べてみると、SDK Manager でインストールされる`Google Repository`が Revision.10 になり、これの影響がありそうだということがわかりました。というかこれぐらいしか影響のありそうなものがありません。

どういう変更があったかは公式にはどこにもなく、アップデートをインストールして、自分でローカルに入っているリポジトリを眺める以外に無いのですが、どうやら、Revision.10 で Google Play Services のバージョンが新しくなったようです。新しくなったのはいいのですが、新しいものをリリースしたついでに古いものを消してしまったようです。

ので、以下のように依存を修正します。

```groovy
- compile 'com.google.android.gms:play-services:5.0.77'
+ compile 'com.google.android.gms:play-services:5.0.89'
```

(2014/08/06 追記)
公式には、5.0.77 には重大な問題があり、取り下げたということのようです。
詳細は[こちらのスレッド](https://groups.google.com/forum/#!msg/adt-dev/NPCx-2udgDk/5jZCkTcQ380J)にて語られています。
ParseでQueryをfindする方法(JavaScriptを使う)

Baasの中では[Parse](https://parse.com/)は有名かと思いますが、Javascript SDKでDBからデータを見つける方法を書いている人があまりいないので、メモしておきます。

## SampleのDB
以下のようなDBがあるとします。ParseのClass名をUserSettingsとします。

### UserSettings

| objectId | UserName | EnableHoge |
|:---------|---------:|:----------:|
| 1m31ipuy |   Bob    |     true   |
| c23japfv |   Mike   |    false   |
| opapsc13 |   May    |     true   |
| poiua123 |   Sakura |      false |
| qPaf2f0f |   Bob    |      false |

objectIdはParse.Objectに設定されるIdです。

## ParseのDBの概要
ParseはParse.Objectというオブジェクトでデータが保存されます。上のそれぞれの行が１つのParse.Objectに相当します。

## Parse.Objectを１つ取り出す場合(ObjectIdが既知の場合)
簡単です。前提条件として、ObjectIdがわかっているとします。   

```Javascript:
var UserSettings = Parse.Object.extend("UserSettings");
var query = new Parse.Query(UserSettings);
query.get("opapsc13", {
  success: function(userInfo) {
    // The object was retrieved successfully.
  },
  error: function(userInfo, error) {
    // The object was not retrieved successfully.
    // error is a Parse.Error with an error code and description.
  }
});
```

## DBから検索して条件に完全に一致するものを取得する場合
Parse.Queryのメソッドを駆使すると色々とできますが、複数の条件に完全一致したデータをとる方法です。
equalToを使います。equalToはParse.Queryを返すので、以下のように連鎖できます。

```Javascript:
    var UserSettings = Parse.Object.extend("UserSettings");
    var query = new Parse.Query(UserSettings);
    query.equalTo('UserName', 'Mike').equalTo('EnableHoge', true)
    query.find({
        success: function(results) {
            // resultsには一致したParse.Objectの配列がかえります。
            console.log("find:"+results.length); // この場合はresults.length === 1
			 console.log("Parse.Object:"+results[0]); //results[0]はParse.Object
			// この場合は、一行目のBob (ObjectId: 1m31ipuy)が取得できます。最下行のBobは取得されません。
        },
        error: function(error) {
        }
    });
```

上の２つの基本を覚えれば、後は応用が効くと思います。私はParse.Object.extendで取得したObjectをnew Parse.Queryで初期化するところで失敗してはまりました。   
また、queryに対してequalToやlessなどで色々と検索条件を追記して、最後にfindで実際の検索を行うので、そこが注意点でしょうか。