OmniAICreator/Qiita-1.07M huggingface dataset:
phpenvで複数のPHPのバージョンを管理する


## はじめに

phpenvを利用して複数のバージョンのPHPを管理する方法を記述します。
PHPのインストールには、php-buildを使用しますが、phpenvのプラグインとして導入します。

## 環境

* CentOS 6.4
* git 1.7.1

## phpenvのインストール

```shell
$ sudo yum install git
$ mkdir -p repos/git
$ cd repos/git
$ git clone https://github.com/CHH/phpenv.git
$ cd phpenv/bin
$ ./phpenv-install.sh
Installing phpenv in /path/to/.phpenv
remote: Counting objects: 1889, done.
remote: Total 1889 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1889/1889), 297.15 KiB | 155 KiB/s, done.
Resolving deltas: 100% (1182/1182), done.
Success.

export PATH="/path/to/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

Add above line at the end of your ~/.bashrc and restart your shell to use phpenv.
```

```bash:~/.bashrc
...(省略)...
export PATH="/path/to/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

```shell
$ source ~/.bashrc
```
## php-buildのインストール

php-buildを.phpenv/pluginsディレクトリへインストールします。
phpenvインストール時は、pluginsディレクトリが存在しないようなので、
gitからcloneする際にpluginsディレクトリも作成します。

```shell
$ git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
```

* インストール可能なPHPのバージョンの確認

```shell
$ phpenv install --list

5.2.17
5.3.10
5.3.11
...(省略)...
5.6.0RC4
5.6snapshot
master
```
## PHPのインストール

* epelリポジトリの追加

libmcryptが必要となるため、epelリポジトリを追加しておきます。

```shell
$ sudo yum install wget
$ wget http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum localinstall epel-release-6-8.noarch.rpm
```

* 必要なパッケージのインストール

```shell
$ sudo yum install gcc bison libxml2 libxml2-devel openssl-devel   \
    libcurl-devel libjpeg-turbo-devel libpng-devel libmcrypt-devel \
    readline-devel libtidy-devel libxslt-devel
```

* PHP5.3.29をインストール

```shell
$ phpenv install 5.3.29
```

* PHP5.4.32をインストール

```shell
$ phpenv install 5.4.32
```

* PHP5.5.16をインストール

```shell
$ phpenv install 5.5.16
```

* インストール済みのバージョンの確認

```shell
$ phpenv versions
  5.3.29
  5.4.32
  5.5.16
```

## 利用するPHPのバージョン切替

* PHP5.4.32を指定

```shell
$ phpenv local 5.4.32
$ phpenv version
5.4.32 (set by /path/to/.php-version)
$ phpenv versions
  5.3.29
* 5.4.32 (set by /path/to/.php-version)
  5.5.16
$ php --version
PHP 5.4.32 (cli) (built: Sep  5 2014 01:04:26)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans

```
* PHP5.5.16へ変更

```shell
$ phpenv 5.5.16
$ phpenv version
5.5.16 (set by /path/to/.php-version)
$ phpenv versions
  5.3.29
  5.4.32
* 5.5.16 (set by /path/to/.php-version)
$ php --version
PHP 5.5.16 (cli) (built: Sep  5 2014 01:24:23)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
```


## 参考

* [phpenv](https://github.com/CHH/phpenv)
* [php-build](https://github.com/CHH/php-build)
Java - HttpServletRequestのgetLocalesメソッドの思わぬ動き

JavaのWebアプリ開発に関わっている方にはお馴染みの
**HttpServletRequest**インターフェースには、HTTPリクエストヘッダーの情報を取得するための様々なメソッドが定義されています。

ご存知の方もいらっしゃると思いますが、
その中に**getLocales**というメソッドがあります。

名前から察するに、ロケール（国＆言語）つまりブラウザの言語設定
（＝HTTPヘッダーの**Accept-Language**）を取得するために使用すればよさそうですが、
想定とは違う動きを見せ、少し悩んだことがありました。


***

ここでやりたいこととは、
ブラウザの言語設定が取得できるか（＝Accept-Languageの値が存在するか）
によって、処理を分岐させるということです。

そのため、当初は以下のようなコードで良いのではと考えました。

```java:
//① ブラウザの言語設定が取得できた場合
if (httpServletRequest.getLocales() != null) {
    // とある処理を実行
    // ・・・・

//② ブラウザの言語設定が取得できない（未設定）の場合
} else {
    // とある処理を実行
    // ・・・・
}
```

ところが、ブラウザの言語設定が未設定（＝Accept-Languageが存在しない）の場合でも、
elseに入ることはなく、常にif内の処理が実行されることとなりました。
どうやら、getLocalesメソッドが常に何らかの結果を返却しているような動作をするようでした。

そこで、ようやくJavadocを確認しようという思いに至りました。
（初めからそうすればよかったです・・・）
⇒ [HttpServletRequest#getLocales()](http://tomcat.apache.org/tomcat-7.0-doc/servletapi/javax/servlet/ServletRequest.html#getLocales())
ここでようやく理由が判明しました。

何と、***getLocales***メソッドは
***「クライアントのリクエストに Accept-Language ヘッダが無い場合はサーバのデフォルトロケールを返す」***
という動作を行っていたのです。
なるほど！それで何度やってもelse内には入らなかったわけです。

***
しかし、それでは当初の目的である
「ブラウザの言語設定が取得できるか（＝Accept-Languageの値が存在するか）
によって、処理を分岐させる」
ということは、getLocalesメソッドを使って実現できないという状況となりました。

結局、以下のようなコードに変更せざるを得ませんでした。

```java:
//① ブラウザの言語設定が取得できた場合
if (httpServletRequest.getHeader("Accept-Language") != null) {
    // とある処理を実行
    // ・・・・

//② ブラウザの言語設定が取得できない（未設定）の場合
} else {
    // とある処理を実行
    // ・・・・
}

```

getHeaderメソッドの戻り値によって、Accept-Languageの存在チェックを行う方法です。
最終的に、最も原始的な方法で解決することになりました。



※なお、getLocaleメソッドは、厳密に言うとServletRequestに定義されていますが、本稿では馴染みのあるHttpServletRequestで話を進めてきました。
Atomに静的コード解析を導入する手順


## 概要

Atomには[Linter](https://atom.io/packages/linter)と[atom-lint](https://atom.io/packages/atom-lint)の2つの静的コード解析用パッケージがある。
導入自体はatom-lintの方が簡単だが、個人的にLinterの方が動作が望ましかったので、ここではLinterを導入する手順についてまとめる。
（コミュニティ自体はどちらも活発だと思うので、好きな方を導入すればよい）

![スクリーンショット 2014-09-05 1.39.37.png](https://qiita-image-store.s3.amazonaws.com/0/25075/a8b803ca-edf1-8239-6483-7dd3ffc45e00.png "スクリーンショット 2014-09-05 1.39.37.png")


## 手順

ここでは、例としてRuby/SCSS/CoffeeScriptのLinterを導入する。
他言語についても手順は同様。

1. [Linter](https://atom.io/packages/linter)のインストール
2. 各言語用のLinter用プラグインのインストール
3. 各言語用の静的コード解析ライブラリのインストール
4. 静的コード解析ライブラリのパスの設定

### 1. Linterのインストール

AtomのSettingsから「linter」と検索すれば簡単にインストールできる。

- https://atom.io/packages/linter

### 2. Linter用プラグインのインストール

1と同様に、以下のパッケージをインストールする。

- [linter-rubocop](https://atom.io/packages/linter-rubocop)
- [linter-scss-lint](https://atom.io/packages/linter-scss-lint)
- [linter-coffeelint](https://atom.io/packages/linter-coffeelint)

### 3. 静的コード解析ライブラリのインストール

`rubocop`と`scss-lint`は`gem`、`coffeelint`は`npm`よりインストールする。

```
$ gem install rubocop
$ gem install scss-lint
$ npm install -g coffeelint
```

### 4. パスの設定

以下のように、設定画面からパスを設定する。
パスは、例えば`coffeelint`ならターミナルで`which coffeelint`とすれば取得できる。

![スクリーンショット 2014-09-05 1.40.54.png](https://qiita-image-store.s3.amazonaws.com/0/25075/7da6636c-1678-cc13-d39a-d138ba958bb2.png "スクリーンショット 2014-09-05 1.40.54.png")

## 参考

- [AtomのLinter](http://rochefort.hatenablog.com/entry/2014/08/02/080200330)
- [Atomでリアルタイム構文チェック](http://nmbr8.com/blog/2014/04/27/linting-your-code-with-atom/)
- [静的コード解析の設定とAtomへの導入手順](http://post.simplie.jp/posts/42)
RailsのAction Cacheに強制更新機能を追加

# 実装

`caches_action`を含んだ以下のようなRails拡張をした。
簡単に言うと、`caches_action`でキャッシュしたアクションを`no_cache`というパラメータを付けてアクセスすることでキャッシュを強制更新するというもの。

```rb
module ControllerConcerns
  module Caching
    extend ActiveSupport::Concern

    module ClassMethods
      def clearable_caches_action(*args)
        options = args.extract_options!
        cache_path = options[:cache_path]
        # This approach makes "expire -> read -> write" flow, which is a little time consuming because the read after the expire always return nothing.
        # However there's no way to achieve this expect hacking action_controller code.
        before_filter if: lambda{ params[:no_cache] == '1' && args.include?(action_name.to_sym) } do
          if cache_path
            if cache_path.respond_to?(:call)
              opt = instance_exec self, &cache_path
            else
              opt = cache_path
            end 
          else
            opt = {}
          end 
          expire_action opt.except(:no_cache)
        end 
        caches_action(*args, options)
      end 
    end 
  end 
end
```

便利なので同等の機能をRailsにPR出しておいた。
https://github.com/rails/actionpack-action_caching/pull/17

このPRの方が更新のためのキーが指定できるのと、expire -> read -> writeでなく、最初から直接writeになるのでパフォーマンスの面でも良い。

# テスト

Anonymous Controllerで`caches_action`を含んだSpecテストはweb上にもあまり例がなかった。

普通にやると

```rb
require 'spec_helper'

RSpec.describe ControllerConcerns::Caching, :type => :controller do
  controller do
    self.perform_caching = true
    clearable_caches_action :index

    def index
      render text: Time.now.to_f.to_s
    end 
  end 

  before do
    @routes.draw { resources :anonymous }
  end 

  context "without no_cache key" do
    it "caches the first request" do
      get :index
      body1 = response.body

      get :index
      body2 = response.body

      expect(body1).to eq body2
    end 
  end 
  context "with no_cache key" do
    it "overwrites the first request" do
      get :index
      body1 = response.body

      get :index, no_cache: 1
      body2 = response.body

      expect(body1).not_to eq body2

      get :index
      body3 = response.body

      expect(body2).to eq body3
    end 
  end 
end
```

のように書けるが、

```rb
ActionController::RoutingError:
  No route matches {:format=>nil, :controller=>"anonymous"}
```

という謎のエラーが`caches_action`内で出てしまった。
どうやら`caches_action`内で呼び出している`url_for`がエラーを返している。

デバッグにデバッグを重ねweb上で関連情報を探しまわり、やっとのことで解決策を発見。

```rb
RSpec.describe ControllerConcerns::Caching, :type => :controller do
  controller do
    ...
  end 

  before do
    @routes.draw { resources :anonymous }
    ###################### ADDED ##########################
    allow(controller).to receive(:_routes).and_return(@routes)
    #######################################################
  end 

  context "without no_cache key" do
    it "caches the first request" do
      ...
    end 
  end 
  context "with no_cache key" do
    it "overwrites the first request" do
      ...
    end 
  end 
end
```

要は、controllerが`url_for`で使うroutingはRails Appのroutesしか把握していないので、`@routes.draw`でanonymous routesを書いてcontrollerにstubして教えて上げる必要があるというお話。
vimでwindowsの改行コードを消す

windowsユーザからもらったファイルに改行コード `^M` が入っていたので消したい.

vimをバイナリモードで開く.
(なお, behatのfeatureファイルは通常モードのvimで開くと `^M` が表示される)

```vim
# vim -b hoge.txt

hogehoge^M
```

不穏な空気が漂っている.

vimのコマンドモードで以下を入力
`^M` は Ctrl+v+m で入力できる.

```vim
:%s/^M//g
```

確認

```text
hogehoge
```

削除できた.
[Groovy]クロージャのthis、owner、delegateについて

#参考
[Closures(公式)](http://groovy-lang.org/closures.html)


#概要
Groovyのクロージャには、**this**、**owner**、**delegate**という暗黙的に利用できる少し変わった役割をする変数があります。
Groovyの公式リファレンスの内容を意訳すると以下のようになります。

|名前 |役割  |
|---|---|---|
|this  |Javaのthisと同じです。自分が定義された場所のインスタンスを保持しています。  |
|owner  |thisか、自分を囲んでいるクロージャになります。  |
|delegate  |ownerと同じです。が、意図的に変更することができます。(ExpandoMetaClassやbuilerなど)  |

コレだけだとはっきり言って全く理解できなかったので、実際にソースを書いてみました。



#サンプルソース



```groovy
class Test {
    // 普通のクロージャを定義
    Closure a = {
       println "普通のクロージャ"
       println " this:     ${this.class.name}"
       println " owner:    ${owner.class.name}"
       println " delegate: ${delegate.class.name}"
       
       // クロージャの中にさらにクロージャを定義。
       // aクロージャが実行されたら自分自身も実行されるよう最後に()を付けてる
       {->
           println "クロージャの中のクロージャ"
           println " this:     ${this.class.name}"
           println " owner:    ${owner.class.name}"
           println " delegate: ${delegate.class.name}"
       }()
    }
}

def test = new Test()
test.a()
```

実行結果は以下のようになります。

```
普通のクロージャ
 this:     Test
 owner:    Test
 delegate: Test
クロージャの中のクロージャ
 this:     Test
 owner:    Test$_closure1
 delegate: Test$_closure1
```

thisについては変化なしです。
ownerとdelegateが普通のクロージャと、クロージャの中のクロージャでは異なっています。

クラス名に$マークが付いているものは、左側のクラスの内部クラスという意味にります。
上記の実行結果だと`Test$_closure1`は`Testクラス`の中の`_closure1`という内部クラス、という意味になります。Groovyはクロージャを内部クラスとして実現しているんですね。

ちょっと分かりづらいのですが、今回の`_closure1`は、**変数a**に格納されている大本のクロージャのことです。
クロージャの中のクロージャ自身は`Test$_closure1_closure2`という名前になっていました。
（$以降の内部クラス名は勝手に一意なものが割り振られるので変動します。）

...言葉にするとやっぱり分かりづらいですね。
thisはクロージャが生成された大本のクラスです。Javaでいうthisと一緒なのでコレは特に難しくないと思います。

ownerが分かりづらいですが、普通にクラスのプロパティとか、メソッド内にクロージャを宣言した場合、thisとownerは同じになります。
**ownerの値が変化する（thisと異なる）のは、クロージャの中にクロージャを宣言した時になります。（多分。。。）**
**そしてその値は自分の直近の親クロージャになります。**
delegateについてはデフォルトではownerと同じです。
じゃあなんのためにあるの？というのは以下のサンプルで。

#応用
クロージャの定義は難しいですが、少なくともGroovyのクロージャは**自分が定義された場所で参照できる変数は別の場所に自分（クロージャ自身）が渡されて実行されたとしても参照できます。**
そして、thisとownerは不変ですが、delegateについては手動で変更することができます。

これらの性質を利用すると以下のようなことが実現できます。

```groovy
class Test2 {
    String abc = "Test2"
    def exec(Closure a) {
        a()
    }
}

class Hoge {

    static main() {
    
        String abc = "ConsoleScript"
        def test2 = new Test2()
        
        // 凄い普通。abcという変数の中身を返すクロージャ。
        // cls1が”実行されるときに"Hoge#main()で宣言している変数abcを参照するので、言うまでもなく変数abcを宣言しておかないとエラーになる。
        Closure cls1 = { -> abc }
        assert test2.exec( cls1 ) == "ConsoleScript"
        
        // コレが応用バージョン
        // delegateを明示的に指定して、さらにクロージャ自身のdelegateにtest2インスタンスを
        // 指定することで、クロージャを渡した先（test2）の変数abcが参照されるようになる。
        // "Hoge#main()で宣言している変数abc"は使用しないので、このパターンだけで良ければHoge#main()の中の変数abcは削除しても大丈夫。
        Closure cls2 = { -> delegate.abc }
        cls2.delegate = test2
        assert test2.exec( cls2 ) == "Test2"

    }
}

Hoge.main()
```
#まとめ
いつ使うかと言われれば微妙な内容なので、今までちゃんと調べることをスルーしてきましたが、ちゃんと理解しよう！と思ってまとめました。
ExpandoMetaClassという、メソッドを動的に既存クラスに追加する機能を利用するときにdelegateが必要らしいです。
ExpandoMetaClassについてはまた調べてQiitaに投稿したいと思います。
cloudwatchで利用可能なメトリクス一覧を取得する

備忘のために書いておきます。

```shell-session:

$ aws cloudwatch list-metrics | jq -r '.Metrics[]| .Namespace + " " + .MetricName ' | sort -u

AWS/EBS VolumeIdleTime
AWS/EBS VolumeQueueLength
AWS/EBS VolumeReadBytes
.... 省略 ....
AWS/RDS WriteLatency
AWS/RDS WriteThroughput
```

ただし、このコマンドは自分の利用しているサービスのメトリクスしか出てこない点は注意する必要があります。
変数の値の変更・取得時に任意の処理を実行する


```js
player = new Player();
player.point = 1;
```
など、変数の値を変更したときに同時に任意の処理を実行したい場合

```js
function Player() {
}
Player.prototype = 
{
  get point() {
    // 任意の処理
    return this._point;
  },
  set point(value) {
    // 任意の処理
    this._point = value;
  },
}
```

このようにクラスのメソッドとして get point(), set point(value) を定義すると下記のようにメソッドが呼び出されます。

```js
player = new Player();
a = player.point; // -> a = get point();
player.point = b; // -> set point(b);
```
_point は実際に値を保存するために宣言した変数です。
なので、point と _point は全くの別物です。
上の例で _point として宣言している変数の名前はフックしたい変数名と異なる名前ならば何でも大丈夫です。(ただ、読みやすさ的には変数が紐づいていることを明示する名前が良いと思います)

<br>
変数の値を変更した際に、特定の要素のテキストも自動的に変更したいときなどに便利です。

```js
function Player() {
  this._point = 0;
}
Player.prototype = 
{
  get point() {
    return this._point;
  },
  set point(newPoint) {
    this._point = newPoint;
    // id = js_my_point の要素のテキストを同時に変更
    document.getElementById('js_my_point').innerText = this.point;
  },
}
```

(補足)
フックしないで値を変更・取得したい場合は this._point を使えば良いです。
Client側JavaScriptでのキューイングのSample Code

JavaScriptはシングルタスクなので、例えば処理中の状況をブラウザ上に表示したい！といった場合に、処理を小分けにしてタイマーで順次処理するような工夫が必要になります。

お気楽極楽な感じがJavaScriptのメリットなのに、この辺りがヒジョーーにキビシイ！

その辺りを解決するために、WebWorkerが出てきましたが、こいつはサブスレッド側にプリミティブな値しか受け渡せないので、全然使い物にならないし。。。

そんなワケで、今日ボクが自分のブログで投稿した、キューイングのサンプルコードをこちらにも公開します。

[Client側JavaScriptでのQueuingのSample - タイピング・ターザン](http://www.typingtarzan.com/entry/2014/09/04/233841)

以下がサンプルコードです。

```HTML:
<!DOCTYPE html>
<html><head></head><body><script language="javascript">
<!--
"use strict";

/*** QUEUE ***/
var $Q = [];
var interval = 0;
function qClear() { $Q = [] }

Function.prototype.qLast = function() {
	this.args = arguments;
	$Q.push(this);
}

Function.prototype.qFirst = function() {
	this.args = arguments;
	$Q.unshift(this);
}

/*** TIMER ***/
function ontimeout() {
	try {
		if ($Q.length>0) {
			var f = $Q.shift();
			f.apply(null, f.args);
		}
	} catch (e) {
		console.log(['ontimeout:', e.description].join(''));
	}
}
window.setInterval(ontimeout, interval);

/*** Test Code ***/
function test() {
	var a = 'あいとじぇい';
	for ( var i=0; i<10; i++ ) {
		for ( var j=0; j<10; j++ ) {
			// ↓こんな感じでキュートして投げ込みたい無名ファンクションを生成
			+function(i, j) {
				console.log([a,i,j].join(':'));
			}.qLast(i, j);
		}
	}
}

window.onload = test;
-->
</script></body></html>
```

実行するとこんな感じでコンソール出力されるハズ。

```
あいとじぇい:0:0
あいとじぇい:0:1
あいとじぇい:0:2
あいとじぇい:0:3
・
・
・
あいとじぇい:1:0
あいとじぇい:1:1
あいとじぇい:1:2
あいとじぇい:1:3
・
・
・
```
AppiumでiOSアプリのUIテストをしてみた


# Appiumについて
[Appium](http://appium.io/)はスマホアプリ向けテスト自動化ツールです。
iOS、Android、FirefoxOSに対応しております。

より詳しい説明は以下を参照ください。

- [Appiumでモバイルアプリを自動化テストしてみた](http://developers.mobage.jp/blog/2014/7/25/appium)
- [Appiumでモバイルアプリのテストを自動化【概要編】](http://iti.hatenablog.jp/entry/2013/12/25/085726)


## 使用環境

|ソフトウェア|バージョン|
|:---:|:---:|
| Mac OS X | 10.9.4 |
|Xcode|5.1.1|
|Appium|1.2.2|

## Appiumのインストール
Appiumはnpm経由でインストールします。
そのため、nodeをインストールしていない場合はインストールし、以下のように実行します。

```lisp:
$ brew install node
$ npm install -g appium
```

# [サンプルコード](https://github.com/appium/sample-code)の実行
## 準備
AppiumからiOSシミュレータを利用するために以下を実行します。

```lisp:
$ sudo authorize_ios
```


今回はRubyでテストを実行します。
そのため、Rubyをインストールしていない場合はインストールし、Bundlerもインストールします。

```lisp:
$ \curl -L https://get.rvm.io | bash -s stable --ruby
$ gem install bundle
```

Appiumのサンプルコードは[ここ](https://github.com/appium/sample-code)からダウンロードできます。

必要なGemをインストールするため、ダウンロードしたサンプルコードの sample-code/examples/ruby ディレクトリで以下を実行します。

```lisp:
$ bundle update
```

## サンプルコードのビルド
今回はTestAppのテストをします。
sample-code/apps/TestApp ディレクトリに移動し、以下を実行します。

```lisp:
$ xcodebuild -sdk iphonesimulator7.1
```

新たにbuildディレクトリが作られ、build/Release-iphonesimulator ディレクトリに TestApp.app というファイルが作られたことを確認します。

## テストの実行
ターミナルをもう一つ開き、以下を実行します。

```lisp:
$ appium &
```

別のターミナルで、sample-code/examples/ruby ディレクトに移動し、以下を実行します。

```lisp:
$ bundle exec ruby simple_test.rb
```

appium & を実行したターミナルにログが出力され、エミュレータが起動し、テストが行われます。
テストが終わり、"Tests Succeeded!"が出力されれば成功です。

appiumを強制的に終了させる場合は以下を実行する。

```lisp:
$ killall -9 node
```


# 自作Xcodeプロジェクトのテスト

## ビルドファイルの作成

テストしたいXcodeのプロジェクトで以下のコマンドを実行します。

```lisp:
$ xcodebuild -sdk iphonesimulator7.1
```

CocoaPodsなどを利用している場合はワークスペースとスキームを指定します。

```lisp:
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -sdk iphonesimulator7.1
```

任意のディレクトリに .app ファイルを生成したい場合は以下のように実行します。

```lisp:
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -sdk iphonesimulator7.1 -derivedDataPath path
```

## テストの実行
simple-test.rb を参考に、APP_PATH を書き換え、button(1).click など動作を記述していきます。
実行は前述と同様です。
個人的にプロジェクト作る時のディレクトリ構成とかURIとか関数名とか気を付けていること

# 個人的にプロジェクト作る時のディレクトリ構成とかURIとか関数名とか気を付けていること

* 基本的にトランザクションスクリプトが好き
* 仕事でいいな、納得/共感出来るもの、反論出来ないものは積極的に取り入れる

## 基本

* 引数は最大でも4つ
 * 4つになった時点で何かおかしいと思った方がいい
* 一行の桁数は最大78
 * PBPまま
* 変数/関数/クラス名はそれぞれ16文字程度をメドにする
 * 長くて伝わらないレベルなら短い方がマシ
 * たとえ長くなっても動詞-目的語-補語くらいを目安にする
* 単一責任の法則を遵守する
 * たとえテストメソッド書かなくても、書くならどうするかを意識しておく
* 関数の行数は別にこだわらないが、多くても50には収める
* ファイルの行数は全くこだわらないが、2000とか超えたら何かおかしいと思う
 * 短ければいいわけではないが、長いのは何かおかしいと思うように心がける
* ネストレベルは最大でも3
 * バグの温床

## URI

* 以下のactionが一つのファイルに収まるF/Wを選ぶべきと考えている
 * action:fileが1:1のF/Wは使わない

### 閲覧

* /foo/list
* /foo/bar/detail
* /foo/search

### 新規作成

* /foo/add
* /foo/add/confirm
* /foo/add/execute

### 編集

* /foo/bar/edit
* /foo/bar/edit/confirm
* /foo/bar/etit/execute

### 削除

* /foo/bar/remove
* /foo/bar/remove/confirm
* /foo/bar/remove/execute

## ディレクトリ構成

* 基本的にモダンPerl入門で書かれていたディレクトリ構成の影響を受けている
 * Controllerは長いのでActionにしたい
  * 用途/出力先によって、ディレクトリ構成は変える
  * 用途が限定されるVIEWなんかはそのディレクトリ配下に置く
 * Logic/ModelはSIいた時に*Logicが多かったのでそのせいかな？
 * Daoは分けたい
  * ORM使いたくないクラスタなので、SQLを分離したい
 * さすがにこの下にも色々とディレクトリ掘ります

```
.
├── Cli
│   └── Action
├── Dao
├── ext-lib
├── Logic
├── public
│   ├── img
│   └── css
└── Web
     ├── Action
     └── template
          ├── fp
          └── sp
```

## 関数名

### Action

* URIを繋ぐ感じで(言語によってキャメルケース/スネークケースは多い方に準拠)
 * ex. add, add_confirm, add_execute

### Logic

* retrieve_foo
 * 複数件SELECTメソッドのラッパー
 * fooには=条件、in条件など
* find_foo
 * 一件SELECTメソッドのラッパー
 * fooには=条件、in条件など
* create
 * INSERTメソッドのラッパー
* store_foo
 * UPDATEメソッドのラッパー
* remove_foo
 * DELETEメソッドのラッパー
 * これだけactionと同じ名前になってしまう。。
* is_foo
 * 返り値が真偽値
* calc
 * 引数から何らかの計算をする

### DAO

* select_foo
 * 複数取得
* fetch_foo
 * 一件取得
* insert
 * 条件なんてない
* insert
 * 条件なんてない
* bulk_insert
 * 条件なんてない
* update_foo
* bulk_update_foo

# 最後に

* オレオレなので、アドバイス/感想/ご意見/批判頂けますと幸いです
MFMailComposeViewControllerのアピアランス問題

## 注意 [2014/9/5 11:40 追記]

以上で紹介した方法は、「詳解Objective-C 2.0 第3版」の277ページに書かれているカテゴリの「既存のメソッドの上書き」を使用しています。

> 既存のメソッドと同名のメソッドが新しいカテゴリで定義されていると、新たに定義された方のメソッドが有効になってしまうという現象が起こります。これを利用して、継承を用いずにメソッドを「上書き」するというトリッキーなテクニックがあります。
（「詳解Objective-C 2.0 第3版」の277ページより）

また複数のカテゴリを作成し、そこで同じメソッドが定義されていた場合、どのカテゴリのメソッドが実行されるか保証されないとのこと。

**トリッキーなテクニック**なので自己責任で使用してください。

## カテゴリーでオーバーライドする

`MFMailComposeViewController`はなぜか`barButton`の色を変えることができなかったり、`tintColor`を設定しても`MFMailComposeViewController`内のボタンの色が変更されずにデフォルトの水色のままになったりと何かと不自由な作りになっています。

特に困るのはナビゲーションバーのアピアランスをカスタマイズしているときです。ナビゲーシ
ョンバーだけ色が変更されてボタンがデフォルトの水色のままになってしまい、とても不自由！！（激おこ）

「アピアランスを設定すればいいじゃん」と思って、こちらのコードを書いても適用されず（※Xcode6 beta7/iOS7はダメでしたが、Xcode6 beta7/iOS8は適用されました）。

```objc
[[UINavigationBar appearanceWhenContainedIn:[MFMailComposeViewController class], nil] setBarTintColor:[UIColor whiteColor]];
```

アピアランスの変更を呼び出す側で行うと、`MFMailComposeViewController`が非表示になるタイミングつかめなかったり、タイミング的にアピアランスがうまく戻せなかったりしていました。

で、解決策としては`MFMailComposeViewController`のカテゴリを作って、その中のライフサイクルでアピアランスの変更を行うというものです。

```objc:MFMailComposeViewController+Design.m

#import "MFMailComposeViewController+Design.h"

@implementation MFMailComposeViewController (Design)

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
 
    // デフォルトのtintColor
    UIColor *defaultTintColor = [UIColor colorWithRed:0.0 green:118.0/255.0 blue:1.0 alpha:1.0];
    UIColor *barWhiteColor = [UIColor whiteColor];
    UIColor *defaultBlackColor = [UIColor blackColor];
    
    [UINavigationBar appearance].tintColor = defaultTintColor;
    [UINavigationBar appearance].barTintColor = barWhiteColor;
    [UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName:defaultBlackColor};
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // モーダル表示が終わった瞬間にステータスバーの色を変更する
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
}

-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    // 自分のアプリのtintColor
    UIColor *myTintColor = [UIColor whiteColor];
    UIColor *myBarColor = [UIColor blackColor];
    UIColor *myTitleColor = [UIColor whiteColor];
    
    [UINavigationBar appearance].tintColor = myTintColor;
    [UINavigationBar appearance].barTintColor = myBarColor;
    [UINavigationBar appearance].titleTextAttributes = @{NSForegroundColorAttributeName:myTitleColor};
}
```

それから`UIActivityViewController`から呼び出すメール機能でも同様のことが起きていましたが、こいつもどうやら`MFMailComposeViewController`を使っているようなので上記カテゴリを使用することで解決することができました。

一日つぶしてしまった。。。
dockerでfluentdを動かすときはudpも意識しましょう

##fluentdにログを転送できない！
docker内で動作するfluentdに対して別のfluentdからログを転送したいのだがどうもうまくいかない。
転送元のログには下記のメッセージ。
「no nodes are available」

##fluentdのハートビート
どうもfluentdは転送先のサーバーの死活監視にハートビートと呼ぶUDPパケットを送っているらしい。
エラーメッセージからも転送先サーバーを確認できていないようなので、どうもこのあたりが怪しそうだとあたりがついた。

##Dockerのポートを確認
「sudo docker ps」でポートを確認してみると・・・

0.0.0.0:24224->24224/tcp

と表示が。

あ、tcpに限定されているっぽい。

どうもdockerは

docker run -p 24224:24224

のようにしてrunするとtcpしかマッピングされないようだ。

##udpを開くには？
こんな感じにtcp/udpを指定できるらしい。
docker run -p 24224:24224/tcp -p 24224:24224/udp

これで動かしたところしっかりdocker内のfluentdにログを転送できました。

##2014/9/18追記  dockerコンテナ間でのfluentd転送
転送元がdockerコンテナの場合、out_forwardにdockerのホストのIPを指定すると、転送先のudpポートを開いても転送されませんでした。
dockerコンテナのIPを指定した場合は転送されます。dockerの仮想ブリッジを経由することでハートビートパケットの応答パケットが転送元に届かなくなるためと思われます。
fluentdのout_forwardにheartbeat_type tcpを指定することで、ハートビートをtcpに変更することができます。
これを使うことで、転送先をホストのIPに指定しても転送できました。
パフォーマンスにいくらか影響を与えそうではありますが、udpを自由に開けない環境ではheartbeat_typeでtcpを使うのが簡単そうです。
Google Places APIで施設情報(コンビニ)を取得するサンプル(Ruby)

# Overview
企画を練るのにGoogle Places API周辺を調査していたのでログを。Google Places APIについては、以下に概要があります。要は、場所の情報を取得できるAPIです。

- [Google Places API — Google Developers](https://developers.google.com/places/)

リクエスト制限については、以下の通り、本人認証が済んでいれば、100,000/dayのリクエストが実行できます。ただし、検索方式によっては、1リクエストでも、乗数が書けられて、10リクエスト分としてカウントされる場合もあります。詳細は以下のURLを参照してください。

- [Google Places API — Google Developers](https://developers.google.com/places/policies#usage_limits)

以下引用。
>
Google Places API には、次のようなクエリ制限があります:
>
API キーを取得済みのユーザーは、24 時間に 1,000 件のリクエストを実行できます。
API コンソールで本人確認が済んでいるユーザーは、24 時間に 100,000 件のリクエストを実行できます。コンソールで本人確認を行うには、クレジット カード情報を提供して請求を行えるようにする必要があります。クレジット カードは単にユーザーの本人確認を行うために使用するものであり、このカードに Places API の使用料が請求されることはありませんのでご安心ください。

更に、検索できる場所の種類については、以下を参照してください。コンビニ情報とかも取れます。

- サポートされるプレイス タイプ - Google Places API — Google Developers
https://developers.google.com/places/documentation/supported_types?hl=ja

# Sample Code
APIの呼び出し方の詳細については、Googleの説明ページが日本語で親切ですので特に言及しません。特に詰まるところはありませんでした。

```rb:places_test.rb
require 'net/https'
require 'uri'
require 'json'

API_KEY = 'YOUR API KEY HERE'
lat = '36.572672'
lng = '140.643013'
rad = '5000'

types = 'convenience_store'
#types = 'grocery_or_supermarket'
#types = 'food'
#types = 'school'

language = 'ja'

uri = URI.parse "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=#{lat},#{lng}&radius=#{rad}&types=#{types}&sensor=false&language=ja&key=#{API_KEY}"

request = Net::HTTP::Get.new(uri.request_uri)
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
  http.request(request)
end

body = JSON.parse response.body
results = body['results']

p "rad - #{rad}"
p "types - #{types}"

results.each_with_index do |place, idx|
  location = place['geometry']['location']
  lat, lng = location['lat'], location['lng']
  p "#{idx+1}: #{place['name']}"
end
```

# Result

<pre>"rad - 5000"
"types - convenience_store"
"1: ココストア 日立末広店"
"2: ローソン 日立鮎川町五丁目"
"3: ローソン 日立国分町"
"4: ローソン Ｌ＿日立金沢二丁目"
"5: ココストア 日立幸町店"
"6: ファミリーマート日立会瀬店"
"7: ミニストップ日立多賀店"
"8: ローソン 日立駅前"
"9: セイコーマート日立台原店"
"10: セブンイレブン日立本宮店"
"11: セブンイレブン日立高鈴店"
"12: セブン−イレブン日立助川町５丁目店"
"13: セブンイレブン日立滑川町２丁目店"
"14: セブンイレブン日立鮎川町１丁目店"
"15: サンクス日立けやき通店"
"16: ローソン 日立相賀町店"
"17: セブン−イレブン 日立東大沼町２丁目店"
"18: セブンイレブン日立市民運動公園前店"
"19: ファミリーマート 日立油縄子店"
"20: ファミリーマート 日立東金沢店"
</pre>
rakeでzsh: no matches found

#現象
zshを使いだしたんですけどね、octpressでブログ書こうと思って、

```zsh:zsh
$ rake new_post['post title']
```

って打ったら

```zsh:zsh
zsh: no matches found: new_post[post title]
```

って怒られるんですよ。なんなんですか。

#原因

どうやら、``*``とか``?``とか``[``とか``]``を使うと、グロブ展開とかいうのが行われるらしいんですよ。
（ワイルドカード的なもの）

#解決方法
で、それをさせないためには

```zsh:.zshrc
setopt nonomatch
```
て書けばいいみたいです。

#参考
[zsh: no matches found について](http://d.hatena.ne.jp/eitya/20110707/1310023383)
behat + selenium web driver + phantomjs

behatでselenium web driverを使用する場合の設定メモ

※behatはインストールしてあるものとする
今回使用するbehatのバージョンは以下

```bash
$ behat --version
behat version 3.0.11
```

composerで必要なライブラリをインストール

```bash
$ vim composer.json
```

```json:composer.json
{
    "require": {
        "behat/behat": "3.*@stable",
        "behat/mink": "1.6.*@dev",
        "behat/mink-extension": "2.*@dev",
        "behat/mink-browserkit-driver": "*@dev",
        "behat/mink-goutte-driver": "*@dev",
        "behat/mink-selenium2-driver": "*@dev"
    },
    "config": {
        "bin-dir": "bin/"
    }
}
```

composer update

```bash
$ php composer.phar update
```

設定ファイルを記述

```yaml:behat.yml
default:
  suites:
    defalut:
      paths:
        - %paths.base%/features
      contexts:
        - FeatureContext
        - Behat\MinkExtension\Context\MinkContext

  extensions:
    Behat\MinkExtension:
      base_url: http://hogehoge.com
      sessions:
        default:
          selenium2:
            wd_host: "http://127.0.0.1:8643/wd/hub"
```


今回はPhantomJSでテストするため、以下コマンドでPhantomJSを起動

```bash
$ phantomjs --webdriver=8643
$ PhantomJS is launching GhostDriver...
[INFO  - 2014-09-04T12:49:43.275Z] GhostDriver - Main - running on port 8643
```

テストできる体制が整った

※phantomjsのインストール、使い方については後日追記する
リリースされたCakePHP 3.0をインストールする

# CakePHP 3.0をインストールする

## 前提条件

* PHP 5.4.16以上
* composerの環境構築済み

## CakePHP 3.0のインストール
composerの環境を作った状態で以下のコマンドを実行する

```
php composer.phar create-project --prefer-dist cakephp/app プロジェクト名
```

## インストール完了

インストールが完了するとDebugKitのインストールやtmpの権限まで設定された状態になってます。  
デザインが今までのCakeから一新されています。  

![home.png](https://qiita-image-store.s3.amazonaws.com/0/49429/d22f90e9-8462-95d5-e19f-3763f6a7b778.png)
php5.5でPHP Notice: Use of undefined constantAdd Starエラー

### ふとMac環境でphpをバージョンアップさせたら出てきた
* PHP Notice: Use of undefined constantAdd Star

#### 調べたら配列のキーを引用符なしで指定すると出る警告
らしい・・・

* \$test = $hoge[name];
* \$test = $hoge['name'];

忘れないようにメモメモφ(..)
[メモ]Ubuntu14.04でFTPサーバを設定した。

Ubuntu14.04以前の記事を参考にFTPサーバの設定をしたらいろいろ詰まりました。下記ページが参考になったので備忘録も兼ねてメモします。

http://www.ehowstuff.com/how-to-install-and-configure-vsftpd-ftp-server-on-ubuntu-14-04/
Fiddler で iPhone の Https 通信の中身を見る

[前回の記事](http://qiita.com/hikoma/items/2c983a521ba2dae5972b)では、iPhone に Fiddler プロキシを設定して、開発マシンにアクセスする方法を書いたのですが、一部 HTTPS リクエストが失敗するケースがあります。**この場合は、iPhone に Fiddler のルート証明書をインストールすればよいのですが、Android と iOS では http://ipv4.fiddler:8888 からダウンロードできる証明書が対応していない場合があります。**

本家に [Capture Traffic from iOS Device](http://docs.telerik.com/fiddler/configure-fiddler/tasks/configureforios) というドキュメントがあるので、この通りにやれば基本問題ありません。
手順を簡単にまとめると、

1. iPhone に Fiddler プロキシを使うように設定する（[前回の記事](http://qiita.com/hikoma/items/2c983a521ba2dae5972b)）
2. **[CertMaker for iOS and Android](http://www.telerik.com/fiddler/add-ons) をインストールして、Fiddler を再起動する**
3. iPhone の Safari で http://ipv4.fiddler:8888/ にアクセスし、"FiddlerRoot certificate" をダウンロードしインストールする

この中で重要なのが 2. の CertMaker をインストールする手順です。これをしておかないと iPhone に対応していないルート証明書がインストールされるため、HTTPS 通信に失敗することがあります。デバッグが終わったら、プロファイルからルート証明書は消しておいたほうがよいですね。
Atlassian StashでもGithubのhubライクなことがしたい

# はじめに
本記事は、Atlassian社の[Stash](https://www.atlassian.com/ja/software/stash)を使用されている方を対象としています。
※Stashが分からない方は・・、Github社でいう[Github Enterprise](https://enterprise.github.com/)と言えば、分かり易いでしょうか。

GithubにはGithub社が公開している[hub](https://github.com/github/hub)コマンドがあり
GUIの操作を、CUIで実現することができます。

hubコマンドを使用することにより
Githubの画面を都度開かなくても、コマンド一発でプルリクエストを作成したりすることができます。

非常に便利なhubコマンドですが、Atlassian Stashには対応していません。
hubコマンドに慣れると、GUIからの操作が非常に煩わしく感じるため
Atlassian Stashでも使える、hubコマンドのようなものを探したところ
[Atlassian Stash Command Line Tools](https://bitbucket.org/atlassian/stash-command-line-tools)なるものを発見しました。
※Rubyのgemとして配布されているため、Ruby環境が必須となります

以下、インストール手順や使い方をまとめます。

# インストール手順
1. Rubyをインストール（本記事では割愛）
1. Atlassian Stash Command Line Toolsをインストール
```
gem install atlassian-stash
```
1. 設定プロンプトを立ち上げて、初期設定を行う
```
stash configure
```
    * Stash Username: [Stashのユーザ名を入力]
    * Stash Password (optional): [Stashのパスワードを入力]
    * Stash URL: [StashのルートURLを入力]
    * Create a git alias 'git create-pull-request'?: [gitのaliasを設定する場合はyを入力]

# 使い方
Pull Requestを作成する場合は、先程gitのaliasを設定したので
stashコマンドを直接使用した場合と、gitのaliasから使用した場合を記述します。
個人的には、gitコマンドの補完が使用できる場合は、gitのaliasの方を使用した方がタイプ量が少なくてお勧めです。

* Pull Requestを作成する
    * 現在のブランチからmasterへプルリクエストを作成
        * ```stash pull-request master```
        * ```git create-pull-request master```
    * topicBranchからmasterへプルリクエストを作成し、レビュアーに@michaelを指定
        * ```stash pull-request topicBranch master @michael```
        * ```git create-pull-request topicBranch master @michael```
* 現在のリポジトリをブラウザで開く
    * ```stash browse```
* 指定のブランチ（topicBranch）をブラウザで開く
    * ```stash browse -b topicBranch```
* 現在のリポジトリのコミット一覧をブラウザで開く
    * ```stash browse commits```
* 現在のリポジトリのプルリクエスト一覧をブラウザで開く
    * ```stash browse pull-requests```

# トラブルシューティング
## Pull Requestを作成するgitのaliasを実行した際にエラーが発生する

ホームディレクトリにある.gitconfigの内容を以下のように書き換えます（\\を削除）

```
- create-pull-request = !sh -c 'stash pull-request \\$0'
+ create-pull-request = !sh -c 'stash pull-request $0'
```

# ちょっと便利に
## Pull Requestを作成するgitのaliasを実行した際、同時にブラウザの画面を開く

現状、CUIからタイトルや詳細が設定できないので、GUIから編集する必要があります。
この設定をしておくと、作成したPull Requestの画面がすぐに開いて、編集が出来るようなのでお勧めです。
ホームディレクトリにある.gitconfigの内容を以下のように書き換えます（末尾に-oを追加）

```
- create-pull-request = !sh -c 'stash pull-request $0'
+ create-pull-request = !sh -c 'stash pull-request $0 -o'
```

# 終わりに
今回ご紹介した、[Atlassian Stash Command Line Tools](https://bitbucket.org/atlassian/stash-command-line-tools)は発展途上のツールであり、hubコマンドに比べればまだまだ貧弱です。
しかし、今後も継続して機能追加が行われるようですので、積極的に使用してフィードバックしていきたいと思います。

以下、今後の追加予定の機能です。

* Pull Requestのタイトルや詳細を設定可能に
    * 現状、CUIからは設定できないようです。そのため、CUIからPull Request作成後、GUIで再編集を行っています（直後にブラウザを開くように設定しているので、それほど苦ではありませんが、あると嬉しいですね。）
* Pull Requestの詳細をコミットメッセージから生成可能に
    * 現状、詳細には何も設定されないようです
* Pull Requestをローカルマシン上にcloneする
    * レビュー時に便利な機能ですね

個人的には、Pull Requestを作成せずに、作成する画面が開いてくれれば嬉しいのですが、そのようなコマンドは見当たりませんでした。
もしご存知の方がおられましたら、コメントをお願いします。
Nginxで複数サイト運用

###環境：Ubuntu14.04　nginx 1.4.6 postgress 9.3.5
http://site/でGitlab
http://site:8000/でWordPress
(8080は別サービスMonitorixで利用中)
WordPressはnginxなのでphp-fpmを利用

###nginxの設定
/etc/nginx/sites-available/gitlab
/etc/nginx/sites-available/wordpress
を用意してsites-enableにシンボリックリンクを作成する

`最初にGitlabをインストールした時の設定で
/etc/nginx/sites-available/default
もsites-enable/にシンボリックリンクしていてハマった。`
site-enableにシンボリックリンクはgitlabとwordpressのみで良かった。

ドキュメントの位置指定で最初Aliasを使おうとしてたけど上手く行かず。結果どちらのファイルでもドキュメントの位置はrootで指定しちゃってOK。

```
wordpressの例
server{
       listen 8000; ＜＜＜ここを変える
       root /home/wordpress;＜＜＜ここも変える
       access_log /var/log/nginx/wp_access.log;＜＜ログも変えておく
       error_log /var/log/nginx/wp_error.log;

       location / {
           index index.php;
       }
        location ~ \.php$ {
           fastcgi_pass unix:/var/run/php5-fpm.sock;
           fastcgi_index index.php;
           fastcgi_split_path_info^/.+\.php(.+)$;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           fastcgi_intercept_errors on;
           include fastcgi_params;
        }


} 
```

## postgresqlでのWordPress設定
あとで書く。
【環境構築】GradleでGoogle Play Services対応(Mac, Linux)


#MAC環境
###1. build.gradleに下記の内容を追加
```
apply plugin: 'android'
...

dependencies {
    ...
    compile 'com.google.android.gms:play-services:+'
}
```
###2. Google Play Servicesのインストール
・Android SDK Managerでインストール
もしAndroid SDK Managerで表示されない場合は
Android SDK ManagerでAndroid SDK Platform-toolsを更新すると表示される

###3. gradleでビルド
・Android SDK ManagerでGoogle Repositoryをインストールする
・Android SDK ManagerでAndroid Support Repositoryをインストールする
・./gradlew clean buildを実行

#Linux編
###1. Android SDKバージョンアップ

```
$ ./android update sdk --no-ui
```
###2. アップデートリストの確認

```
$ android list sdk --all
```

###3.Google Play Services, Google Repository, Android Support Repositoryのインストール
```
$android update sdk -u -a -t 9, 11, 12
```
###4. Progaurdでけっこう苦戦
・ローカル(Mac)で動いてたSDK直下のproguard-android.txtをそのままてデプロイ環境にコピーして使う

#エラー対応のまとめ
###1. preBuildエラー
```
Execution failed for task ':preBuild'.
failed to find Build Tools revision 19.1.0
```
android-sdk-linuxのbuild-toolに19.1.0がない
■Android SDK Build-toolsのインストール番号を確認

```
android list sdk --all
```
下記の結果が出る。インストール番号は３番!!

```
 3- Android SDK Build-tools, revision 20
```
■Android SDK Build-toolsをダウンロード

```
android update sdk -u -a -t 3
```

###2. compile 'com.android.support:support-v4:5.0.77でのエラー

```
dependencies {
    compile 'com.android.support:support-v4:19.1.0'
    compile 'com.google.android.gms:play-services:+'
    ...
}
```
上記のようにバージョンを指定すればOK


###3. zipalignのエラー
■Android SDK version 23にはzipalignがデフォルトで入ってないので18からダウンロードして入れる

###4. proguardのエラー

```
java.io.FileNotFoundException: /PATH_TO_SDK/sdk/tools/proguard/proguard-android.txt (No such file or directory)
```
Android SDK version 23にはproguardがデフォルトで入ってないので18からダウンロードして入れる
YCSB のビルドで HBase の依存関係のエラーが発生した場合

HBase のベンチマークを行うために [YCSB 0.1.4](https://github.com/brianfrankcooper/YCSB) を Maven を使いビルドしようとしたが、以下のエラーで詰まった。

```
[ERROR] Failed to execute goal on project hbase-binding: Could not resolve dependencies for project com.yahoo.ycsb:hbase-binding:jar:0.1.4: Could not find artifact org.apache.hbase:hbase:jar:0.98.0 in central (https://repo.maven.apache.org/maven2) -> [Help 1]
```

## 環境
* CentOS 6.5 64bit
* Java 1.7.0
* HBase 0.98.0

## 取得するモジュールの設定を変更する
hbase-0.96 から `hbase` モジュールは複数のモジュールに分割されたため、必要なモジュール名を個別に指定する必要があるようです。

YCSB をクローンした後 `pom.xml` ファイルを修正し、依存するライブラリの情報を新しいバージョンに合わせて書き直します。

### YCSB/pom.xml を書き換える

```xml:pam.xml
  <!-- Properties Management -->
  <properties>
    ...
    <hbase.version>0.98.0-hadoop2</hbase.version>
    ...
  </properties>
```

### YCSB/hbasse/pom.xml を書き換える
デフォルトの hbase モジュールに関する記述をコメントアウトし、新たに `hbase-client`, `hbase-common` を追加する。

```xml:pom.xml
  <dependencies>
    <!--
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase</artifactId>
      <version>${hbase.version}</version>
    </dependency>
    -->

    <!-- 以下を追加 -->
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-client</artifactId>
      <version>${hbase.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-common</artifactId>
      <version>${hbase.version}</version>
    </dependency>

    ...

  </dependencies>
```

後は [Getting Started](https://github.com/brianfrankcooper/YCSB/wiki/Getting-Started) の手順通りビルド & 実行すれば OK でした。
RailsのArelのTips


ActiveRecordのみでは扱いづらい複雑なSQLをRailsのArelを使って組み立てる際のTips集です。

ActiveRecordでMySQLのSQL文を発行すると
\`テーブル名\`.\`カラム名\`
というように出力されますが、わかりやすさのため曖昧にならない限りカラム名のみ記述しています。


## IS NOT NULL

```ruby
Hoge.where(
  Hoge.arel_table[:fuga].not_eq(nil)
)
```

```sql:発行されるSQL
SELECT * FROM hoges WHERE fuga IS NOT NULL;
```

## AS

###SELECT句などで利用するAS
```ruby
Hoge.select(
  Hoge.arel_table[:fuga].as('f')
)

```

```sql:発行されるSQL
SELECT fuga AS 'f' FROM hoges;
```

###JOIN句などで利用するAS
```ruby
h = Hoge.arel_table.alias('h')
Fuga.joins(h).select(h[:bar])
```

```sql:発行されるSQL
SELECT 
  h.`bar` 
FROM 
  fugas
INNER JOIN
  hoges AS 'h' ON h.`id` = `fugas`.`hoge_id`
```

## サブクエリ

### 1.FROM句へのサブクエリ
FROM句へのサブクエリでASをつける方法がわからなかった...

```ruby
# 空のテーブルオブジェクトを作成する
new_table = Arel::Table.new(nil)
sql = new_table.from(
    Hoge.where(created_at: start_at...end_at).to_sql
  )
  .project(Arel.sql('*'))
  .to_sql
```

```sql:発行されるSQL
SELECT 
  * 
FROM 
(
  SELECT
    *
  FROM
    hoges
  WHERE
    created_at >= '2014-09-01 00:00:00' AND
    created_at < '2014-09-02 00:00:00'
)
```

### 2.JOIN句へのサブクエリ

ActiveRecordのjoinsメソッドを使える場合は文字列を直接渡すのが一番楽だと思います。
LEFT OUTER JOINなども大丈夫。
文字列を使いたくない場合などは下記の「FROM句とJOIN句の両方へのサブクエリ」と同じように記述して下さい。

```ruby
sub_query = Hoge.where(created_at: start_at...end_at).to_sql
Fuga.joins("INNER JOIN (#{sub_query})")
```

```sql:発行されるSQL
SELECT
  *
FROM
  fugas
INNER JOIN
(
  SELECT
    *
  FROM
    hoges
  WHERE
    created_at >= '2014-09-01 00:00:00' AND
    created_at < '2014-09-02 00:00:00'
)
```

### 3.FROM句とJOIN句の両方へのサブクエリ

FROM句にサブクエリを使っていて、さらにJOIN句にもサブクエリを使いたいときは join メソッドを利用します。
このときに join メソッドには Arel::Tableオブジェクトを渡す必要があります。
具体的には下記の用に書きます。

```ruby:
from_table = Hoge.arel_table
  .project(
    Hoge.arel_talbe[:f_id],
    Hoge.arel_table[:name]
  )
  .as('h')

join_table = Fuga.arel_table
  .project(
    Fuga.arel_talbe[:id],
    Fuga.arel_table[:name]
  )
  .as('f')

Arel::Table.new(nil)
  .from(from_table)
  .project(
    from_table[:name],
    join_table[:name]
  )
  .join(join_table)
  .on(join_table[:id].eq(from_table[:f_id]))
  .to_sql

```

```sql:発行されるSQL
SELECT
  h.name,
  f.name
FROM
(
  SELECT
    `hoges`.`f_id`,
    `hoges`.`name`
  FROM
    `hoges`
) AS h
INNER JOIN 
(
  SELECT
    `fugas`.`id`,
    `fugas`.`name`
  FROM
    `fugas`
) AS f
ON
  f.`id` = h.`f_id`

```

##複数のSUM
```ruby
Hoge.where(created_at: start_at...end_at)
  .select(Hoge.arel_table[:fuga].sum().as('f'))
  .select(Hoge.arel_table[:bar].sum().as('b'))
```

```sql:発行されるSQL
SELECT
  SUM(fuga) AS 'f',
  SUM(bar) AS 'b',
FROM 
  hoges
WHERE
  created_at >= '2014-09-01 00:00:00' AND
  created_at < '2014-09-02 00:00:00'
```


##COUNTで利用するDISTINCT

```ruby
Hoge.select(Hoge.arel_table[:id].count())
  .select(Hoge.arel_table[:id].count('distinct'))
```

```sql:発行されるSQL
SELECT
  COUNT(id),
  COUNT(DISTINCT id)
FROM
  hoges;
```
express4でセッションを扱うには

# 背景

JMeterの使い方で、近所が苦戦していたので、自分もやってみることにした。

そこで、node.jsのkaoだと不慣れなので、expressでログインして何か表示するようなサンプルWebアプリを作ろうとした。


# express4からはモジュールの外部化がどんどん進んでる

expressでセッションを使うケースですらexpress-sessionを後から入れる必要があった。

```
npm install --save express-session
```

# セッションを有効期限付きで利用する

```
app.use(session({secret:"abrakatabura",cookie: { maxAge: 60000 }}));
```

maxAgeの単位はミリ秒。

# 関連投稿

- [Node.js/Express4でのシンプルなファイルのアップロード - Qiita](http://qiita.com/kjunichi/items/fe33b6a4e82ac944b487)
PHPでバイト数の単位アリナシを相互変換する

# intで渡してあげると、単位を付けて返してくれる。

ちなみにTB以上は対応してないから、自分で拡張しろ！

```php: 
function prettyByte2Str($bytes)
{
    if ($bytes >= 1073741824) {
        $bytes = number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        $bytes = number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        $bytes = number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        $bytes = $bytes . ' bytes';
    } elseif ($bytes == 1) {
        $bytes = $bytes . ' byte';
    } else {
        $bytes = '0 bytes';
    }
    return $bytes;
}
```

# KB,MBなど単位がついた状態で渡すとByteにしてくれる

こっちもTB以上は対応してないから！

```php:
function prettyByte2Int($str)
{
    $result = str_ireplace(',', '', $str);
    $result = str_ireplace('.', '', $result);
    $result = str_ireplace(' ', '', $result);
    $result = str_ireplace('bytes', '', $result);
    $result = str_ireplace('byte', '', $result);
    $result = str_ireplace('b', '', $result);

    if (stripos($result, 'k')) {
        $result = (int)$result * 1024;
    } elseif (stripos($result, 'm')) {
        $result = (int)$result * 1048576;
    } elseif (stripos($result, 'g')) {
        $result = (int)$result * 1073741824;
    } else {
        $result = (int)$result;
    }
    return $result;
}
```
LAG(リンクアグリゲーション)とは

#LAG(リンクアグリゲーション,Link Aggregation)とは

*概要*

* 複数の物理回線を仮想的に一つの回線にみなすための技術
* LAN構成時に使える
* スイッチ間だけでなくサーバ～スイッチ間でも実装できる
* Gigabitethernetポートでも使える
* LACP(Link Aggregation Control protocol)を使う
* 接続元・接続先でそれぞれ設定する必要あり


*メリット*

* 複数の回線を束ねることでデータ通信速度が向上できる
* どれかの回線に障害があっても通信を続けられる
* 安いケーブルでも束ねて使えば高速で安全な通信ができるのでコスパがよい


*通信の分散について*

* 送信元/宛先のMACアドレス
* ネットワーク層のIPアドレス
* トランスポート層のTCP/UDPポート番号

*設定方法*

あとで追記予定です。
PHPでCSV作るやつを最終的に僕はこうした

# ダウンロードもしたいし文字列としても取りたい時があるんすよね

なので2通りで返すようにしました。

* 文字列として返す
* ダウンロードとして出力する
* 二次元配列で渡してあげてね。

```php: 

function arr2csv($arr, $filename = false)
{
    // ダウンロード用として出力する場合は $filename を指定
    if ($filename) {
        header('Content-Type: application/octet-stream');
        header("Content-Disposition: attachment; filename=" . $filename);
        $fp = fopen('php://output', 'w');
        foreach ($arr as $line) {
            mb_convert_variables('sjis-win', 'utf-8', $line);
            fputcsv($fp, $line);
        }
        fclose($fp);
    } else {
        $out = '';
        foreach ($arr as $line) {
            $line_tmp = '"';
            $line_tmp .= implode('","', $line);
            $line_tmp .= '"' . "\n";
            mb_convert_variables('sjis-win', 'utf-8', $line_tmp);
            $out .= $line_tmp;
        }
        return $out;
    }
}

```
pikの替わりにuru～windowsで複数バージョンのrubyを切り替える～

# はじめに
Windowsで複数バージョンのRubyを切り替えるツールの[pik](https://github.com/vertiginous/pik)が[PowerShellでは動作せず](https://github.com/vertiginous/pik/issues/140)困っていました。
※[pikは長い間メンテナンスされていない](https://github.com/vertiginous/pik/commits/master)ようです。

回避方法として、Rubyのバージョンを切り替える際は、都度Rubyのbinにパスを通していましたが、非常に不便でした。

そこで、代替ツールを探していたところ、同様な機能を持つ[uru](https://bitbucket.org/jonforums/uru)を発見しました。
以下、インストール手順や使い方についてまとめます。

# 環境
* Windows7 Professional SP1
* PowerShell 3.0
* uru-0.7.5-windows-x86

# インストール手順
1. C:\toolsディレクトリを作成
2. [ダウンロードページ](https://bitbucket.org/jonforums/uru/wiki/Downloads)より、圧縮ファイルをダウンロード
3. 圧縮ファイルを解凍したuru_rt.exeを、C:\toolsに配置
4. 環境変数PATHにC:\toolsを追加
5. コマンド実行

```
cd C:\tools
uru_rt admin install
```

# 使い方
* Ruby処理系のインストール
    * pikやrbenvのようなインストール機能はない。
    * 別途、[RubyInstaller for Windows](http://rubyinstaller.org/)等でインストールする必要がある
* Ruby処理系の登録
    * ```uru admin add DIR [--tag TAG]```
        * DIR: Rubyのbinへのパス
        * TAG: Ruby処理系の名称
        * eg: ```uru admin add C:\ruby200\bin```
* Ruby処理系の切り替え
    * ```uru TAG```
        * TAG: Ruby処理系の名称
        * eg: ```uru 200```
* 登録したRuby処理系の一覧
    * ```uru ls```
* 登録したRuby処理系の名称変更
    * ```uru admin retag CURRENT NEW```
        * CURRENT: 現在の名称
        * NEW: 変更後の名称
        * eg: ```uru admin retag 200 200p481```
* 登録したRuby処理系の削除
    * ```uru admin rm TAG```
        * TAG: Ruby処理系の名称
        * eg: ```uru admin rm 200p481```
* デフォルトのRuby処理系の登録
    * 環境変数PATHに登録されているRuby処理系が登録されると思われる（未検証）
このゲーム、先手が有利？後手が有利？

何となく思いついたゲームがあるのですが、これゲームとしてそもそも先手・後手がどれくらい有利なのか考えてみたいと思ってます。
不完全情報ゲームではあるのですが、不完全な部分が限定的なので、コンピュータで十分解析できるかな？という直感です。
わかったこと等ありましたらお知らせいただければ幸いです。

ルール
==========

トランプのハート・ダイヤ・スペードの1(A)から5を用意する（合計15枚）。
二人のプレイヤーが先攻・後攻を決めてから、カードを7枚ずつ配る。残った1枚はゲーム終了まで伏せておく。
二人のプレイヤーが順にカードを提示し、以下の方法で勝者を決める。

-   それぞれの数字について、その***数字に対する勝者***は、その数字のカードを最後に出したプレイヤーとする。（例えば、2のカードをプレイヤーAが出す→プレイヤーBが出す→プレイヤーBが出す、とした場合、最後に出したのはBなのでBの勝ちとなる。）
-   ***ゲームの勝者***は、過半数の数字（すなわち3つ以上）に対して勝者となった者とする。

例
==========

先攻のプレイヤーの手札が「1が3枚、2が3枚、3が1枚」だったとする。
このときこのプレイヤーは、1や2はいつ出してもよい（自分がこれらの数字で勝てることが確定しているので）。一方で3については「相手が3を出し切ってから自分が3を出す」のでない限り勝てないので、最初の6ターンは1か2を出し、最後に3を出すことになるだろう。（もし相手が先に3を2枚出してしまっていたら、それを見た時点で3を出せばよい。）
さてその場合、相手の手札は

-   「3が1枚、4が3枚、5が3枚」（伏せられていた1枚は3だった）
-   「3が2枚、4が2枚、5が3枚」（伏せられていた1枚は4だった）
-   「3が2枚、4が3枚、5が2枚」（伏せられていた1枚は5だった）

のどれかとなる。このうち一番最初のパターンについては、相手の思考も自分と同じくなるため、相手が最後まで3を温存することになり、相手の勝ちとなる。二番目のパターン（三番目のパターンも同様）については、5はいつ出してもよいのに対し、3と4については最後の1枚を温存しておくよりない。そのため、相手の5ターン目が終わった時点で相手の手札は3か4になる。結果、相手は6ターン目で3を出すか4を出すかの二者択一を迫られ、先攻プレイヤーが勝つ確率は2分の1になる。

その他
==========

カードの種類数を変えたり（奇数種類である必要はある）、カード1種類あたりの枚数を変えたり（これも奇数枚である必要はある）というバリエーションについても考えてみたいと思っています。
Erlangで素数と素数でないものを分けてリストを返す

Erlangの修行中。erlangで特定の数字を入れると、素数と合成数で分けて、それぞれが入ったlistを返すというものを作った。

#Source
```erlang
- module(primenum).
- export([primenum/1, printnum/2]).

primenum(Num) when Num >= 2 ->
        primecheck(2, Num);
primenum(_Others) ->
        false.

primecheck(TargetNum, TargetNum) ->
        true;
primecheck(Num, TargetNum) when TargetNum rem Num =:= 0 ->
        false;
primecheck(Num, TargetNum) ->
        primecheck(Num+1, TargetNum).


createlist(Num, List) when Num == 0 ->
        List;
createlist(Num, List) ->
        createlist(Num-1 ,[Num | List]).


printnum(Num, Type) when Type =:= "Prime" ->
        List = createlist(Num, []),
        PrimeNum = lists:filter(fun(X) -> primenum(X) end, List);
printnum(Num, Type) when Type =:= "Composit" ->
        List = createlist(Num, []),
        PrimeNum = lists:filter(fun(X) -> primenum(X) end, List),
        CompositNum = List -- PrimeNum.
```
#実行結果
```erlang
2> primenum:printnum(100, "Prime").
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,
 79,83,89,97]
3> primenum:printnum(100, "Composit").
[1,4,6,8,9,10,12,14,15,16,18,20,21,22,24,25,26,27,28,30,32,
 33,34,35,36,38,39,40,42|...]
```
cocos2d-x-3.2のcocos2d_libs.xcodeprojのプレビルド

# Xcodeでcocos2dxプロジェクトのビルドを早くしたい！
cocos2d-xの3系のリビルドが遅いなと思ったので、
Rakefileを使ってcocos2d_libsの中身を.aファイルにプレビルドしておいて、
ビルドする時間を短縮したい。

#やり方
http://qiita.com/g-1/items/01f6c430326dfd125af9
http://qiita.com/KawabataLemon/items/8387b0e54b06308a8693
に準拠

# Rakefile
コピって来たRakefileがうまく動かなかったりして泣いたので、
修正してみたものをアップしてみる。

* Xcode6用に修正しました。Xcode5用のが必要な場合は「8.0」になっているところを「7.1」とかにしてください

```rb:Rakefile
PROJECT_PATH = "./cocos2d_libs.xcodeproj"
TARGET_NAME="'build all libs iOS'"
OUTPUT_DEBUG="tmp/iphonesimulator"
OUTPUT_RELEASE="tmp/iphoneos"
OUTPUT_LIB="./lib"
directory OUTPUT_LIB

desc "静的ライブラリをビルドします"
task "lib" do
    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.0 -target #{TARGET_NAME} TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build"

    sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.0 -target #{TARGET_NAME} TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build"
end

desc "lipoコマンドで各デバイス向けの静的ライブラリをひとつのバイナリにします"
task "lipo" => OUTPUT_LIB do

    Dir.glob("#{OUTPUT_RELEASE}/*"){|path|
        p path
        file = File.basename(path)

        sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'"
    }
end
```
- ちなみにRakefileの修正箇所は、OUTPUT_LIBのディレクトリ生成と、出力先パスの整理だけ
- 
配置場所は、cocos createで作ったプロジェクトファイルの、
「cocos/build」の中。
使い方は

# ビルドの仕方
```bash:使い方。コンソールで実行
cd プロジェクトフォルダ
cd cocos/build
rake lib
rake lipo
```

KawabataLemonさん、
g-1さん、
ありがとうございます。
Unity Windows8の64ビットのビルドエラー（zipalign.exe）

Error building Player: Win32Exception: ApplicationName='自分のsdkのパス\tools\zipalign.exe', CommandLine='4 ~~

というエラーが出たときは下記のページにあるように
sdk\build-tools\zipalign.exe　を
tools\zipalign.exe　にコピーしてあげるとよい

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10131113960



Windows8 64bitだけのエラーかなあ？？？
cocos2d-xのPhysicsBodyを試してみる

[Cocos2dx 3.0 物理演算を試してみる](http://befool.co.jp/blog/raharu/cocos2dx-physics-001/)を参考に下記を試してみた。
基本 cocos2d-x-3.2/tests/cpp-tests のコードベース

# 四角枠

```cpp:GameScene.cpp
auto wall = Node::create();
    wall->setPhysicsBody(PhysicsBody::createEdgeBox(Size(winSize.width - 50,400), PhysicsMaterial(0.1f, 1.0f, 0.0f)));
    wall->setPosition(winSize.width / 2 + 3, 400);
    wall->setRotation(10.0f);
    addChild(wall);
```

![四角枠.png](https://qiita-image-store.s3.amazonaws.com/0/35973/e5b3c60e-4a66-eb7e-6291-927677d07bcf.png)

# 可変枠

```cpp:GameScene.cpp
  Vec2 vec[5] =
    {
        Vec2(1, 300),
        Vec2(1, 100),
        Vec2(winSize.width/2, 0),
        Vec2(winSize.width-1,100),
        Vec2(winSize.width-1,300),
    };
    
    auto wall = Node::create();
    wall->setPhysicsBody(PhysicsBody::createEdgeChain(vec, 5, PhysicsMaterial(0.1f, 1.0f, 0.0f)));
    wall->setPosition(0, 0);
    addChild(wall);
```

![可変枠.png](https://qiita-image-store.s3.amazonaws.com/0/35973/5a5ae861-386d-15df-0871-ac50c87ed89d.png)