OmniAICreator/Qiita-1.07M huggingface dataset:
FuelPHP ORMモデルにバルクインサート・メソッドを追加する


バルクインサート･･･複数レコードのインサートを一括で行う。速い。

ORMパッケージの使用が前提です。

通常のクエリビルダでバルクインサート

```php
\DB::insert('tablename')
    ->columns([
        'column1',
        'column2',
        'column3',
    ])
    ->values([1,2,3])
    ->values([1,2,3])
    ->values([1,2,3])
    ...    
    ->execute();
```

クラスメソッド化

```php
public static function insert_multi($table, array $columns, array $datum);
```
これでも十分だけど

+ 毎回カラム名を指定する必要がある
+ データの並びをカラム名の並びに合わせる必要がある

このあたりをもう少し楽にしたい。
ORMにメソッドを生やす。

---

```php:base.php
class Model_Base extends \Orm\Model
{
    public static function insert_multi($datum)
    {
        $table = static::table();
        $columns = array_keys(static::properties());
        $query = \DB::insert($table)
                ->columns($columns);

        foreach ($datum as $data) {
            $values = [];
            ($data instanceof \Orm\Model) and ($data = $data->to_array());
            foreach ($columns as $col) {
                $values[] = (isset($data[$col])) ? $data[$col] : null;
            }
            $query->values($values);
        }
        return $query->execute();
    }
}

//想定している引数
[
    ['name' => 'fuel', 'comment' => 'php'],
    ['name' => 'orm',  'comment' => 'model'],
    ...
];

//もしくは
[Model, Model, Model...]

//extends
Model_Blog::insert_multi($blogs);
Model_Post::insert_multi($posts);
Model_Image::insert_multi($images);
```

ORMモデル自身でテーブル名とカラム名を解決するので
挿入したいデータを渡すだけでOK。
（ORMが主役みたいに書いてるけど、実質テーブル情報の書かれた設定ファイル扱い）

---

クラス名を引数に取れば、別クラスに切り出すパターンでも
・・・びみょう？

```php
class Helper
{
    public static function insert_multi($classname, array $datum);
}

Helper::insert_multi(Model_User::class, $users);
```

---

おまけ　Laravelのdestroy的なの
※複合主キー未対応

```php
public static function destroy($id)
{
    $primary_key = static::primary_key()[0];
    return static::query()->where($primary_key, 'in', (array)$id)->delete();
}

Model::destroy(1);         //id 1を削除
Model::destroy([2,3,4]);   //id 2,3,4を削除
```

参考にさせていただいた記事です。
[FuelPHPのDatabase_Query_Builder_Insertでバルクインサートが使用できた話](http://qiita.com/miyatah/items/11bf1e9f0582efdc138f)
ofxMidi使用時のやることメモ

　readmeにも書いてあるが、ofxMidiはそのままではコンパイルできない。いちいち修正手順を忘れてしまうのでメモ。
### 実行環境

* openFrameworks(v098)
* Xcode8.0

### やること
1. プラットフォームごとにフォルダを削除
2. rtmidiとqtmidiが最新のバージョンか確認
3. CoreMIDI.frameworkを追加

## 1.コンパイルするプラットフォーム毎にフォルダを削除
#### ⅰ)iOSでコンパイルする時
→`src/desktop`と`libs/pgmidi`をプロジェクトから削除

#### ⅱ)macでコンパイルする時
`src/iOS`と`libs/rtmidi`をプロジェクトから削除


## 2.rtmidiとqtmidiが最新のバージョンか確認
　このライブラリは、別のサイトから提供されているライブラリで、gitによるバージョン管理はされていない。
　`scripts`フォルダに自動ダウンロード用のシェルスクリプトが同梱されているので、`.sh`ファイル内の`WD`を適宜書き換えてコマンドラインから実行。





## 3.CoreMIDI.frameworkを追加

1. 左カラムの「プロジェクトファイル」をクリック
2. ウィンドウ中央左の「general」タブをクリック
3. 下の「Linked Frameworks and Libraries」に<b>CoreMIDI.frameworkを追加</b>
Scaffoldから始めて、new/edit_formのaction切り替え基準でつまづいた話。Form_for関数はActiveRecordオブジェクトの永続化状態を見てる

長くjavaeeの人だったんですが最近RubyOnRailsの学習を始めました（周回遅れもいい所です)
scaffoldで生成されたソースを追っている所から始めているのですが、そこで詰まった所をQiitaへのテスト投稿も兼ねて書いておきます。

scaffoldを利用する新規登録(new)と更新(edit)で別々のhtmlテンプレートが作成されますが、内部ではformの入力項目を共通化した\_form.html.erbをそれぞれ呼び出しています。
結果、同じ入力フォームを備えた画面が作成されるのですが、submitボタンの文面と呼び出されるURLが違っていました。
\_form.html.erbの記述はかなりシンプルで、ここどうやって切り替えてるんだろ？と思いましたが、form_for関数によって書き出されるHTMLを切り替えてるんですね。

```books/_form.html.erb
<%= form_for(@book) do |f| %>
```
これによって
`<form ... action='books' class="new_book" id="new_book" method="post">`
と書き出されたり
`<form ... action='books/1' class="edit_book" id="edit_book_1" method="post">`
になったり。

さて、そこで自分が参考にしている本には、
>切り替えはform_forに渡されるオブジェクトの内容が空であるかどうかによって（正確にはオブジェクトの内容が新規レコードであるかどうかによって）

と書いてあります。
また、別のWEB上の解説記事にはidが入っていたらとありました。

なんか、アバウトな...
オブジェクトが新規レコードであるかとは何を以てでしょう？
さすがに無いでしょうが、id項目に値が入っていたらとも思われかねません。
（確かに自動更新される項目で有る事は前段階で解説されてましたけど）

こんな時はどんな言語も変わらず、捜査の基本、ソースを当たれですね。

```form_helper.rb
 action, method = object.respond_to?(:persisted?) && object.persisted? ? [:edit, :patch] : [:new, :post]
```
これなら分かる。
persisted?メソッドで、永続化されている状態であるかを判定しているんですね。

persisted?がfalse返す条件は大体推測はつきますが、一応確かめ。

```test.rb
book = Book.new
p "1:"+book.persisted?.to_s#まだ保存されてないから false

book.id = 100
p "2:"+book.persisted?.to_s #インスタンスのフィールドに値が入る事でないはず。これもfalse

book.save(title:"test")
p "3:"+book.persisted?.to_s #保存されたのでtrue

book2 = Book.find(book.id)
p "4:"+book2.persisted?.to_s #DBから取ってきたのでtrue

book2.destroy
p "5:"+book2.persisted?.to_s #DBから消されたはずなのでfalse
```
実行すると
"1:false"
"2:false"
"3:true"
"4:true"
"5:false"
予想通りですね。
（ちなみにすぐcommit、insert後commitしていない状態ではどうなるかは次回以降で）

ということで、railsにおける新規レコードとはActiveRecordクラスのインスタンスで、Newされた後、DBに保存される前の状態って事で納得です。

余談なのですが、view領域のメソッドでモデルがDBに保存されているか否かを判定している事に若干違和感を感じました。
MVCの考え方では、viewはモデルを見て振る舞いを変えるとされているので判定して表示を変える事はOK。
しかし、厳密にはモデル＝DBレコードでは無いはずです。
モデルがDB保存有無情報を持つのが前提である所がちょっと引っかかったんです。

ただ、これは簡素なWebアプリケーションではモデルのデータ構造はDBテーブルの構成と同一であると
見なし、モデルの理解を助けMVC構造で作りやすくするRailsフレームワークの工夫だと感じました。

「DBレコードデータはビジネスロジックを持たないO/Rマッパー経由のオブジェクトです、それらを取得しviewが参照するデータ構造とビジネスロジックを持ったクラス＝モデルと作りましょう！」より、
最初の最初はテーブル構造がモデルのデータ構造であり、CRUD操作の過程がビジネスロジックになるクラス（ActiveRecord)をモデルであると説明するのが簡単だし作る方もシンプルにできる様に思います。

そのある種割り切った考え方でview/controllerの部分も便利な機能があり、Railsフレームワークが広く受け入れられた要因の一つなのかなー。
といったところで、ActiveRecordの思想が実感できました。

複数テーブル、必ずしもDBに保存する必要がないもの等々、複雑なモデルが必要になったらActiveModelといった発展系もあるし。
しかし、複数テーブルで構成されるモデルを作る時が今後あるなら、models直下にそれらテーブルのActiveRecordクラスを置くのに抵抗感が出てきそう。
これはモデルのデータ構造作るのに必要な情報を持っているだけのテーブルであって、決してモデルではないんだ、って。
ま、まだscaffoldから先に進んでないし、学習を進めて色々なケースに触れる段階ですね。
railsアプリ開発中にデータベースを削除してnil:NilClassのエラーが発生した時の対処法

rails初心者が練習アプリ作成中に起きたエラー対処法のメモです。
モデルのアソシエーションの実装の練習。
cutomersモデルとcompanyモデルのアソシエーション。customersモデルに外部キー`company_id`を実装。
途中、記述ミスで
・migrationファイルを書き直し
・コンソールでデータベースの削除
をしていました。
modelに`has_many :customers``belongs_to :company`を記述したのでviewで`customer.company.name`でcompanyのnameを引っ張ってこれると思ったらエラーが。
どうやら、companyのデータが入ってい無いようでした。
![kobito.1453820210.549904.png](https://qiita-image-store.s3.amazonaws.com/0/93394/954d0af1-8196-dfb8-96db-9e4333d50726.png "kobito.1453820210.549904.png")

しかし、データベースSQLite3を見ても、データは入っているし、controllerの記述も間違っていない。
試しにサーバを落としてみてもダメ。

customerのcompany_idを見てみると数字は１、２、３を参照してました。
一方company_idは１０、１１、１２。
データベースを削除していたので、company_id１、２、３が削除されていて参照できていなかったようです。
seedファイルの乱数生成を
`rand(3) + 1`(1,2,3が乱数生成される）
から→
`rand(3) + 10`(10,11,12が乱数生成される)
に記述を変えてseedファイルを入れ直してうまくいきました！
JavaScript演算子でつまずいてます、ヘルプ！

こんにちは。はじめての投稿です！
JavaScriptを勉強しはじめたばかりで、今演算子でつまずいています！（
汗

こちらの記述なのですが

function purapura() {
	g=3;
	h=g++;
	alert("gの値は"+g+"、hの値は"+h);
}

↑こちらを実行すると、このように表示されますが↓

------
gの値は4、hの値は3
------

ここで質問なのですが、
最初にg=3;と書いているのに、どうして「gの値は4」となるのでしょうか？
そして、h=g++;では、「g+1」と考えるので、
「hの値は3」ではく「hの値は4」にならないのはどうしてでしょう？？

どうぞご教授くださいませー！！
【技術者教育 資料】第1章 Rails中級者への道 〜クラス設計編〜

# 【技術者教育 資料】第1章 Rails中級者への道 〜クラス設計編〜
## あらすじ
新人用の教育資料を作って、Qiitaで公開しまくっていたある日、中途の中級者向けにもアウトプットしてくださいと話があったので、更新頻度低めで、ボチボチ書いていこうと思います。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分はプログラム開発における鉄板はあっても正解なんてないと思っている人です。1人で開発をしている分には好き勝手に納得行くまで極めて自分の世界で生きればいいと思いますが、実際複数人で開発してチームで動くようになると自分の趣味や好みの領域は押し殺す必要も出てきます。

このシリーズでは、ゆるーくこんな感じで考えるといいよっていう内容を紹介していこうと思います、

|No.|記事|
|:-----------|-----------|
|1|[【中途教育 資料】第1章 Rails中級者への道 〜クラス設計編〜](http://qiita.com/devopsCoordinator/items/8ba7f7e53a99d30cc381)|
|2|【中途教育 資料】第2章 Rails中級者への道 〜オブジェクト指向の法則(SOLID)編〜|
|3|【中途教育 資料】第3章 Rails中級者への道 〜未定〜|

## クラス設計の考え方

### おすすめの勉強方法
UMLなどを使って、業務モデリングが終わった後Railsを使ってシステム上で表現をするかを考えますよね？

はじめからデザインパターンを調べてから開発するのもいいのですが、自分で経験して初めて身に沁みると思うので焦らず以下の順序で学習してみることをおすすめします。

1. scaffoldで作るプロトタイピング
- Fat controller
- Skinny Controller, Fat Model
- Controllerからdecoratorsの切り出しとModelからvalidatorsの切り出し
- Controllerからparametersの切り出しとModelからActiverecord使わないオブジェクトの切り出し

「1. scaffoldで作るプロトタイピング」は自分1人で学習が進むのですが
「2. Fat controller」を学習するまでに辿り着くには、自分で実装する機能を増やしていかないといけないので挫折しがちですね。

いつも思う事は、プログラムは漢字と同じようなものだなと感じます。
GEMやOSSが公開されていて、Github覗けば素敵なソースが見れる時代になりました。
ただし、漢字と同じでプログラムも読んでいるだけでは、読めるようになったとしても、実際書くとなると筆が止まってしまいます。

### クラス設計の仕方
前工程でUMLなどを用い、業務洗い出しをして、システム範囲を確定させた後
クラス図上の一つ一つのクラスをRails上でどのように表現しようか考えます。

以下のようなフローを使っています。
黄色い背景はアプリケーション層、赤い背景の四角はドメイン層を示しており
信号に合わせて、赤いほど、ドメイン(業務)との結びつけが強くなるため、後々の修正が難しくなることを示しています。

RMDBSへのアクセス回数をいかに減らすか？突発的なアクセスをどの程度予測しおくかななどの拡張性要件、性能要件、可読性と保守性を何処まで求めるかなどで、さじ加減をしましょう。

![Rails綺麗にクラス設計をするフロー](https://qiita-image-store.s3.amazonaws.com/0/74153/a2752c1e-fa91-ef2f-f067-e85790be2ebb.png "Rails綺麗にクラス設計をするフロー")

場合によって、上記に合わせてFormsクラスやCachコントローラークラスなどを追加で検討します。

アーキテクチャ設計を別途検討をしつつ、DBに持たせる必要があるのか、さらに抽象化出来ないのか？粒度は適切か？などを検討していきます。

リファクタリングする機会がある人もない人も、一度お試しあれ

## あとがき
中級、上級のネタになればなるほど、本業の業務内容に近づいてくるため、必然的に公開出来るないようが少なくなるのでネタに困りますね。書ける範囲で本記事も更新していこうと思います！

今回のネタもUMLとかのモデリングは必要な知識になるのでこちらも御覧ください

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea) |
|2|[【新人教育 資料】第2章 UMLまでの道 〜クラス編〜](http://qiita.com/devopsCoordinator/items/3cde12abce689ff6906b) |
|3|[【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜](http://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc) |
|4|[【新人教育 資料】第4章 UMLまでの道 〜クラス図を書いてみよう編〜](http://qiita.com/devopsCoordinator/items/8d2af381c1c469103459) |
|5|[【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d) |
|6|[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)|
|7|[【新人教育 資料】第7章 UMLまでの道 〜アクティビティ図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/e4910ace92e66bece10f)|
|8|[【新人教育 資料】第8章 UMLまでの道 〜シーケンス図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/4535c3cce207b114ad6c)|

次回はRailsにおけるSOLIDの考え方をご紹介したいと思います。
[Linux] sshの接続前に確認を行う(port番号を指定しての特定IPの疎通確認)

# 目的
`ping` で確認した後にsshで接続をするとハングして返ってこない場合があったので、それを回避したい。
`ping` ではポートを指定できないため `nc (netcat)` を使って確認を行う。

# 確認方法
nc (netcat) を使用する。このツールはいろんな用途に使えるが、今回は以下のようにする。

```bash
$ nc -v -w 1 <IP address> -z <port>
```

# 実行例
```bash
# 成功
$ nc -v -w 1 192.168.X.XXX -z 22
Connection to 192.168.X.XXX 22 port [tcp/ssh] succeeded!
$ echo $?
0

# 失敗
$ nc -v -w 1 192.168.X.XXX -z 322
nc: connect to 192.168.X.XXX port 322 (tcp) timed out: Operation now in progress
$ echo $?
1
```

成功/失敗ステータスを使えばスクリプトにも組み込める。

その他の方法としては、`nmap`, `paping`, `telnet` 等が使えるらしい（未検証)
[linux - Is it possible to ping an address:port? - Super User](http://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)

# 参考
[bash - why can I ping a server but not connect via ssh? - Stack Overflow](http://stackoverflow.com/questions/12715233/why-can-i-ping-a-server-but-not-connect-via-ssh)
[linux - centosの22番ポートが開いているかどうか外部から確認する方法 - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/5785/centos%E3%81%AE22%E7%95%AA%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E9%96%8B%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E5%A4%96%E9%83%A8%E3%81%8B%E3%82%89%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
[nc コマンド 使い方メモ - Qiita](http://qiita.com/yasuhiroki/items/d470829ab2e30ee6203f)
LFTP を使ったミラーリング


## LFTP

- [LFTP](http://lftp.yar.ru) は、FTPによる一括処理やスクリプト処理を容易に行えるFTPクライアントツール


### インストール

- MacOSX には、Homebrew でインストールできる

```
$ brew install lftp
```


### 使い方

- まず以下のようにして接続

```
$ lftp -u <username>,<password> <url>
```

- もしくは、-fオプションでスクリプトを実行も可能

```
$ lftp -f <script_file>
```

### コマンド

- LFTP コンソールでは、通常のFTPコマンドのほか、独自コマンドが使える
- コマンド一覧を表示

```
> help
```

- コマンドのヘルプを表示

```
> help <command>
```

### ミラーリング

- mirror コマンドを用いてミラーリングが可能

```
# アップロード例
mirror --dry-run -R -v -p -L <src_dir> <dst_dir>
mirror -R -v -p -L <src_dir> <dst_dir>

# ダウンロード例
mirror --dry-run -v -p -L <src_dir> <dst_dir>
mirror -v -p -L <src_dir> <dst_dir>
```

`-v` 詳細表示
`-p` パーミッションを設定しない
`-L` シンボリックリンクをファイルとしてコピー
MockitoのMathcersで引数を決め打ってリターン値を決める

# 概要
Mockitoでテストしていると、時々同一メソッドを複数回コールしているが、渡される引数が決まっているような状況があります。
その時に

- AだったらC
- BだったらD

のようにしたい、と

下記のメソッドを使います。

```
Matchers.eq
```

## もうちょっと具体的なところへ落とし込む
とあるメソッドへ渡される引数が3つあるとし、そのうちの1つはEnum値で何が渡されるかはある程度決まっているようなケース


```SampleEnum.java
public enum SampleEnum {
	CASE_A,
	CASE_B,
	CASE_C;
}
```
```Sample.java
public class Sample {

	public String branch(String argStr, int argNum, SampleEnum sampleEnum) {
		String retStr = "";
		switch (sampleEnum) {
		case CASE_A:
			retStr = "CASE_A:" + argStr + argNum;
			break;
		case CASE_B:
			retStr = "CASE_B:" + argStr + argNum;
			break;
		case CASE_C:
			retStr = "CASE_C:" + argStr + argNum;
			break;
		default:
			break;
		}
		return retStr;
	}
}
```

以下がテスト。

```SampleTest.java
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;

import org.junit.Test;

public class SampleTest {

	@Test
	public void test() {
		Sample testTarget = new Sample();
		Sample spyTestTarget = spy(testTarget);

		doReturn("TEST_A").when(spyTestTarget).branch(anyString(), anyInt(),
				eq(SampleEnum.CASE_A));

		String result = spyTestTarget.branch("test", 2, SampleEnum.CASE_A);
		assertThat(result, is("TEST_A"));

		result = spyTestTarget.branch("test", 2, SampleEnum.CASE_B);
		assertThat(result, is("CASE_B:test2"));
	}
}
```

## まとめ

上記の```doReturn("TEST_A").when(spyTestTarget).branch(anyString(), anyInt(),eq(SampleEnum.CASE_A));```
で、Enum値を狙い撃ってリターン値を想定通りにすることができます。
Enum値が```SampleEnum.CASE_A```以外が渡されると本来の処理が行われていることも確認できます。

特定のケースの時に値を変更しておきたいテストをする時とかに便利です。
【Swift】CustomSegue(カスタムセグエ)で自作アニメーションでの画面遷移 〜その２〜

# カスタムセグエのアニメーションを作る

[前回の記事](http://qiita.com/kwnpanda/items/f03d519bd9af11eafc37)ではカスタムセグエで必要な作業について書きました。
今回は、実際に自作したアニメーションを遷移時につけてみたり、戻るとき(Unwind)の処理を行いたいと思います。

## カスタムセグエでアニメーションをカスタマイズしてみる
作成したカスタムセグエのクラスファイルを開いて`perform()`の部分にアニメーションを書いていきます。

```lang:RippleCustomSegue.swift
import UIKit

class RippleCustomSegue: UIStoryboardSegue {

  override func perform() {
    let source = self.sourceViewController as UIViewController!
    let destination = self.destinationViewController as UIViewController!

    // この辺にアニメーション処理を書いていく

  }

}
```


今回はこのようなアニメーションをつけました。
[こちらの記事を参考にさせて頂きました。](http://qiita.com/kitoko552/items/566f3443ac8993a5a2ee)

ソースコードは[Github](https://github.com/yuji-suzuki/continuance)にあげました。
アニメーションつけるだけならサクッといけます。
![ripple.gif](https://qiita-image-store.s3.amazonaws.com/0/24991/544b24c1-0e78-5a77-ceb8-64f564435661.gif)

## カスタムセグエのUnwind(戻る)を実装してみる
今度は元の画面に戻れるようにしてみましょう。
手順は以下のように行います。

1.  **遷移元**に紐付いているViewControllerクラスに以下のように`@IBAction`を追加します。
こんな感じです。

    ```lang:sample.swift
      @IBAction func returnFromSecondView(sender: UIStoryboardSegue) {
      }
    ```

2. 次に以下の図のように**遷移先ストーリーボード**の戻る用のボタンから`Ctrl + ドラッグ`でストーリーボードの上のExitマークまで引っ張りましょう。そうすると、`1`で書いたアクションが表示されるのでそのまま選択してUnwindセグエを追加してください。
![createunwindsegue.gif](https://qiita-image-store.s3.amazonaws.com/0/24991/6c2e0f6c-cd3a-7766-e3ee-1898180fb04b.gif)

3. さらに画像のように追加したUnwindセグエを選択して。。。
![Screen Shot 2016-02-15 at 23.22.46.png](https://qiita-image-store.s3.amazonaws.com/0/24991/68c0d98f-752a-7492-d471-2d2f68473f20.png)

4. 必要な情報を入力しましょう。
![Screen Shot 2016-02-15 at 23.25.32.png](https://qiita-image-store.s3.amazonaws.com/0/24991/56d7a075-ad02-a466-f428-7891f93deffd.png)

5. [前回の記事](http://qiita.com/kwnpanda/items/f03d519bd9af11eafc37)で用意したUnwindセグエのクラスファイルを開いて以下のように書きます。こちらは普通に戻ってるだけです。

    ```lang:RippleCustomSegueUnwind.swift
    import UIKit

    class RippleCustomSegueUnwind: UIStoryboardSegue {

      var tappedPoint:CGPoint!

      override func perform() {
        let source = self.sourceViewController as UIViewController!

        source?.navigationController?.popViewControllerAnimated(true)

      }
    }
    ```

6. ここまできたら一通り完成ですが、下の画像と同じようにするには[Github](https://github.com/yuji-suzuki/continuance)も参考にしてみてください。
ちなみにこれ、**iOS9での動作確認しかしていません。**
![ripple.gif](https://qiita-image-store.s3.amazonaws.com/0/24991/9102d183-6264-8133-b911-dacb9e72a51e.gif)

## まとめ
今回、[前回](http://qiita.com/kwnpanda/items/f03d519bd9af11eafc37)でカスタムセグエの使い方を書きました。カスタムセグエ自体を使うのは意外と簡単な印象でした。
どちらかとアニメーション作るのに時間使った感じです。

またこちらの方法は**iOS9でしか動作確認していない**のでiOS8以前などに対応させたい場合[こちらのUnwindセグエの作り方](http://enamelsystems.com/0010/)も参考にしてみてください。
[Rails] has_oneの使い方（作成と削除）

#実行環境
- Ruby 2.2.2
- Rails 4.2.3

#目的
has_manyについての解説はよくあるけれど、has_oneについての解説がほとんど無いので自分なりにまとめる
（と言っても作成と削除のところだけですが）

##model
こんな関係を用意します。
親 has_one パートナー
親 has_many 子
パートナー belongs_to 親
子 belongs_to 親

```parent.rb
class Parent < ActiveRecord::Base
  has_one :partner
  has_many :childs
end
```

```partner.rb
class Partner < ActiveRecord::Base
  belongs_to :parent
end
```

```child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
end
```

#コード
##親に関連付けてパートナー、子を作成する場合
それぞれこう書きます。

```parents_controller.rb
#関連付けないで作成する場合
Partner.create
Child.create

#has_manyのものを関連付けて作成する場合
@parent.childs.build

#has_oneのものを関連付けて作成する場合
@parent.build_partner
```

##親とまとめて子を削除する場合
parent.rbに`dependent: :destroy`を追加します。
この際、has_oneになっているpartnerについてはclass_nameも追加します。

```parent.rb
  class Parent < ActiveRecord::Base
  has_one :partner, dependent: :destroy, class_name: Partner
  has_many :childs, dependent: :destroy
end
```

親をdestroyするとパートナーと子もdestoryされるようになります。



#参考文献

[YOMiTOKU Railsでの似たような言葉での違いメモ](http://banker0507.blogspot.jp/2013/02/rails.html)
[pyar.bz Has-oneが動作しなかったのでclass_nameを追加した](http://b.pyar.bz/blog/2014/10/23/has-one/)
findコマンドで100MB以上のファイルが存在するか確認するには

## 実現したいこと

現在操作中のカレントディレクトリから、下位のディレクトリにおいて100MB以上のファイルが存在するか確認したい

## 実現方法および解決方法

findコマンドのsizeオプションで容量を指定し、検索すればよい

## 実行コマンド


```
find . -type f -name '*.*' -size +100M -mtime 0
```

## 情報源

man find

## 補足
MeCab について（その１）「でも」は難しい [分割①]

iOS 用の（あまり意味のない）<a href="https://github.com/tmatsugaki/iPhone-libmecab">学校文法学習補助ツール</a> の開発を通じて気づいたことを徒然に記します。

MeCab は非常に優れたプログラムですから批判する意図は皆無です。
敢えて申しますと、むしろこの優れた要素技術を月並みな用途でしか利用しようとしない（Another Brick in the Wall な）アプリケーションプログラマーに向けてのお節介になるかと思います。
私がやっている作業も大して意味がある訳では無いのですが...
<hr>
「この花は、あまりきれいでもない。」を学校文法に適合させるのに苦心しました。

以下は最新版を OSX で実行した結果です。
<tt>
Mac-mini:~ matsu$ mecab
この花は、あまりきれいでもない。
この	連体詞,*,*,*,*,*,この,コノ,コノ
花	名詞,一般,*,*,*,*,花,ハナ,ハナ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
あまり	副詞,助詞類接続,*,*,*,*,あまり,アマリ,アマリ
きれい	名詞,形容動詞語幹,*,*,*,*,きれい,キレイ,キレイ
でも	助詞,副助詞,*,*,*,*,でも,デモ,デモ
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
。	記号,句点,*,*,*,*,。,。,。
EOS
^C
Mac-mini:~ matsu$ mecab --version
mecab of 0.996
</tt>
MeCab は確定していない語幹に関しては、現状の品詞（ここでは名詞）を基に分解しているようです。なので、副助詞の「でも」になっていると思われます。
この文章を学校文法に適合させるために、形容動詞の末端の「だ」に導くべく「助動詞：で」＋「副助詞：も」へ分割し後処理で「形容動詞の終端：で」＋「副助詞：も」にしました。
<a href="https://itunes.apple.com/jp/app/pin-cimasuta/id1071188532?mt=8">iOS アプリ</a>／<a href="https://github.com/tmatsugaki/iPhone-libmecab">ソースコード（ARCなしの Objective-C）</a>
<hr>
<b>まとめ</b>

MeCab のお父さんやお爺さんについてよく知らないので断言できませんが、MeCab が高速な理由は未定の前方参照への処理を省いているのかな？って感じました。
VCでビルドしたDLLがロードできなくて4時間ハマった

VC(C++/CLI)でビルドしたDLLがC#からロードできず4時間もハマった事案が発生したので、解決策を書き留めておく。

事象
開発環境がインストールされていない環境でのみ発生する。
該当のDLLに含まれるクラスのインスタンスを生成するところで"アセンブリまたはファイルが見つからない" (FileIOException)が発生する。
DLLはexeと同じ場所に置かれている。
DLLの内容はネイティブコード(C++, 非CLI)で書かれたロジックのラッパークラス。
アプリ(exe)はC#。

原因
VCのビルド設定がDebugプロファイルになっていた。

詳細
アプリ構成としてはネイティブC++のラッパークラス(DLL)を内部で使用するライブラリ(マネージド/C#)をアプリ(C#)から呼び出すというもの。

当初Visual Studioのインストールされた開発マシンで動作を確認、うまく動いてそうなので、Windowsタブレットでの動作を確認するためにリモートデバッガを使って動作させたところDLLが読み込めず例外を吐いて終了…

いろいろ調べたところDLLファイルが見つからないわけではなく、アセンブリのシグネチャが違うか、DLL内部で参照しているアセンブリが見つからないことが原因と思われる。

frameworkバージョンの違い影響など色々と調べて試行錯誤の末、VC側でDLLのみRelease版でビルドしたとろあっさり動作した。

デバッグのため、DLL、ライブラリ、アプリともにDebugプロファイルとしていて、C#で書いたライブラリとアプリ本体はDebugのままで問題なく動作していたのでハマってしまった。

なお、原因からすると当然だが、リモートデバッガの有無には関係なく複数のPC、OSバージョンで同じ現象が発生した。
[DL]SoftmaxとCross Entropyって何？

式は簡単なんだけど、あれ？何だったかな？って忘れるので書き留めておく

## Softmaxの目的
### **Score(logit)を確率(Probability)にする**

Neural Networkで下のY=Wx+bのように、入力に対してWeightをかけてBiasを足して得られるYの値は、正から負まで何でもありなので、これをSoftmaxの式に入れると確率っぽくしてくれる。
確率は、
１． 値が正
２． 総和が１
にならないといけないので、値が正になるように指数関数に通して、総和が１になるように全部足したもので割って正規化する。

指数関数はこんな感じ（Wikipediaより）
![193px-Exp.svg.png](https://qiita-image-store.s3.amazonaws.com/0/100523/18c6a80e-3931-b452-d6d1-541906a03f36.png)

 ![Softmax.png](https://qiita-image-store.s3.amazonaws.com/0/100523/195fb6d9-adf6-9166-5c81-08665777032d.png)


## Cross Entropy
![CrossEntropy.png](https://qiita-image-store.s3.amazonaws.com/0/100523/8455f973-413f-f141-ac1a-43a08a7cae05.png)
[TF]Proxy環境でTensorflowをビルドする方法

Tensorflowをソースコードからビルドしてインストールする場合、Proxy環境下では、bazelがProxyに対応していないため、
ホームページのとおりにやってもエラーが出て、うまくインストールできない。

2016年2月現在も、bazelはProxyに対応していないので、[ここ](https://github.com/StateFarmIns/bazel)からProxy対応版のbazelを取ってくる。

```
git clone https://github.com/StateFarmIns/bazel
cd bazel
./compile.sh
```

**※ わざわざbazelをビルドしなくても、--host_jvm_args オプションで下記の通り指定するとビルドできます。**

```
bazel --host_jvm_args="-Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 \
-Dhttps.proxyHost=localhost -Dhttps.proxyPort=8080" build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
```

あとは、これを使ってTensorflowのホームページに書いてあるとおりにやるだけ。

https://www.tensorflow.org/versions/v0.6.0/get_started/os_setup.html#source
Vagrant コマンドラインインターフェース RELOAD

#RELOAD

##Command: vagrant reload

haltの後、upを実行するのと同じ。

Vagrantfileに変更を加えた後、システムに反映するのに必要である。Vagrantfileを修正した際は、reloadを実行すること。

設定されたプロビジョナはデフォルトでは再実行されない。<b>--provision</b>オプションを付加することで、強制的に再実行させる。

####オプション

<dl>
<dt>--provision</dt>
<dd>
プロビジョナを強制的に実行させる。
</dd>
<dt>--provision-with x,y,z</dt>
<dd>
指定したプロビジョナを実行させる。
例えば、「:shell」や「:chef_solo」といったプロビジョナがあった場合、「vagrant reload --provision-with shell」のコマンドでshellのプロビジョナのみが実行される。
</dd>
</dl>
｢土日でわかるPHPプログラミング教室」でvagrantの初期設定で躓いたところ

windows10内にVirtualBox,vagrant,fuelphpを導入する際に躓いた点を共有。

｢土日でわかるPHPプログラミング教室」を参考に上記を導入も下記エラーが発生。

```vagrant up```

default: Warning: Connection timeout. Retrying...

以下対応：
## BIOSの仮想化支援機構の有効化
下記を参考にBIOSのVirtualization Technologyを有効化する
http://office-qa.com/win/win94.htm

## vagrant reload

それでもエラーが出続けていろいろなサイトを見ていたが解決できず。
設定を全部やり直して上記設定をしたのちvagrant reload をしたところいけました。
Mac の Octave (CLI) でのターミナルタイプの設定

[Octave-cli](http://wiki.octave.org/Octave_for_MacOS_X) を Mac で使うとき、`plot()` などでグラフを表示しようとすると、次のエラーに遭遇することがあります。

```sh
gnuplot> set terminal aqua enhanced title "Figure 1" size 560 420  font "*,6" dashlength 1
                      ^
         line 0: unknown or ambiguous terminal type; type just 'set terminal' for a list

Plotting Data ...
Program paused. Press enter to continue.
```

これは [AquaTerm](https://sourceforge.net/projects/aquaterm/) が正しくインストールされていないために発生するエラーです。AquaTerm を入れなおしてから Octave-cli (もしくは`gnuplot` だけ) を再度インストールするか、`~/.octaverc` に `setenv("GNUTERM", "qt")` などと書いて、違うターミナルタイプを使うように指示することで回避できます。
d3.jsでqiita記事tagの統計を可視化してみた

#やりたいこと
Qiitaの記事にはその記事を表現するトピックとしてのタグを最大5つつけます。各タグのページではそのタグをもつ記事とともに記事の数とフォロワー数が表示されます。この数字は世間におけるそのタグの人気や注目度合いを表わしていますが、他のタグの記事数などど比較することで全体での位置付けなどを測ることができます。この為に複数のタグの記事数などを並べて比較できる可視化を試みました。githubの各レポジトリの人気やpushやfolk数などを可視化した[githut][githut]と同じようなことを目指し、参考にしました。
#手法とか
##データ
Qiita Api を使って以下のものを取得しました。
-各タグの記事数
-フォロワー数
-そのタグを含んだ記事の総ストック数
`GET /api/v2/tags`をたたいてタグ一覧を取得します。これで得られるjsonに`"stockers_count"`を追加した以下のようなjsonで表現されるデータを可視化します.

```js:
{"id": タグの名前,
 "items_count": 0,
 "followers_count": 0,
 "stockers_count": 0}
```

`"stockers_count"`はそのタグのついた記事の被ストック数の合計です。`GET /api/v2/items/:item_id/stockers`を使うと`"item_id"`で指定される記事をストックしているユーザ一覧が取得できるので、それをたしあげて`"stokers_count"`を求めます。またこれを行なうにはitem_idを取得する必要があるのですが、これは`GET /api/v2/tags/:tag_id/items`で指定したタグtag_idをもつ記事の一覧を取得してその一覧の各記事のitem_idを取得します。
ながれは
1. `GET /api/v2/tags`: タグ一覧の取得
2. `GET /api/v2/tags/:tag_id/items`: 上で所得したタグを持つ記事一覧の取得
3. `GET /api/v2/items/:item_id/stockers`: 上で取得したidをもつ記事をストックしているユーザ一覧の取得
Qiita APIは要素100個ずつしか取得できずRate limitが1000回/時間なので大変です。一覧を取得するAPIで数だけを取得したい場合はレスポンスヘッダに含まれる`"Total count"`フィールドをみればよいです。

RESTを使ってみたかったので、Pythonを使って自分でクロールしました。とりあえず[gist](https://gist.github.com/takoika/8be5a7da612417989bfa)にあげていますが、Qiita apiのラッパは各言語ごとにすでにあるので参考を参照にそれらを使うとよいと思います。
##可視化方法
各タグごとに記事数やフォロワー数がどうなっているのかとそれぞれの値が他のタグと比較してどのような位置付けなのかを示したかったのでパラレルチャートを採用しました。
#d3.jsによる可視化
記事数の多い順で表示します．表示するタグの数はデフォルト10で最大100まで表示できます．軸ラベルや各タグの部分にマウスオーバすると具体的な数を表示します．また各指標ごとのランキング上位タグをテーブルに表示しています．
![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/71765/70925fd3-0a10-1693-9b4c-6d1cc607df72.png)

この可視化のページを公開しています．
http://takoika.github.io/qiitaStatViz/
~~作成したものはソースを[gist](https://gist.github.com/takoika/389e45f19688416a6c42)にあげて，bl.ocks.orgで見れるようにしました．~~
~~ソース: http://bl.ocks.org/takoika/389e45f19688416a6c42~~
~~サイト: http://bl.ocks.org/takoika/raw/389e45f19688416a6c42~~

Rubyは投稿数に対してフォロワー数が少ない，これは人気に比して投稿数が多すぎるのかもしれません．Javaは投稿数に対してフォローワ数が多いので，まだまだ記事が足りていないのかまたはすでにある記事の質が高かったり，内容が十分であるのかもしれません．ストッカー数をみるとフォロワー数とはまた別の傾向があります．ストッカー数が多いタグはweb系の実用度の高い技術のタグがめだちます．これらのタグではリファレンスなど後に読む可能性のある記事が多いためストックされやすいと考えられます．

~~クロールする時間がかかるため，ストッカー数に関してはまだいれていません．準備できしだい追加したいと思っています．~~
#参考にしたサイトとか
## Qiita Api Pythonラッパ
https://github.com/nittyan/QiitaAPI 
https://github.com/petitviolet/qiita_py
## 可視化
### 可視化方法の参考
[githut](http://githut.io): github統計の可視化
### d3.jsに関して
[d3: scales, and color.](http://www.jeromecukier.net/blog/2011/08/11/d3-scales-and-color/)
[D3 Tips and Tricks]
(https://leanpub.com/D3-Tips-and-Tricks)
[githut]: http://githut.io
##他のQiita タグの可視化
[Qiitaの投稿をNVD3で可視化してみるとRuby人気なんだなと改めて分かった。](http://qiita.com/ganezasan/items/a8b2e48b6da7f7eafc7d)
[Qiitaのタグ別のストック数分布についての考察](http://qiita.com/sasanquaneuf/items/5a42cce6043ba871f054)
##コード，データなど
[自作のQiita API ラッパ](https://gist.github.com/takoika/8be5a7da612417989bfa): 今回の為に最低限実装したものですので使用はおすすめしません
[可視化用のHTML, Javascriptのソースとデータ](https://gist.github.com/takoika/389e45f19688416a6c42)

コメント，ご質問などあれば気楽にお問い合わせ下さい．
webpack --watchでビルドが始まった時間をログに出す

`webpack --watch` を使っているとビルドが終わったのかどうかよくわからない事がたまにある。
(保存されればビルドされるはずなんですが・・・)

ビルドが始まった時間をログに出しておけばとりあえず動いたのかどうかが分かるようになるので、出すようにしてみた。

[参考](https://github.com/webpack/webpack/issues/1499)

``` webpack.config.js
const path = require('path')

module.exports = {
  entry: [
    path.join(__dirname, 'src', 'Main.jsx')
  ],
  output: {
    path: path.join(__dirname, '/public'),
    filename: 'bundle.js'
  },
  resolve: {
    // When requiring, you don't need to add these extensions
    extensions: ['', '.js', '.jsx']
  },
  devtool: 'inline-source-map',
  module: {
    loaders: [
      {
        test: /\.(js|jsx)$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['es2015', 'react']
        }
      }
    ]
  },
  plugins: [
    function () {
      this.plugin('watch-run', (watching, callback) => {
        console.log('\033[36m' + 'Begin compile at ' + new Date() + ' \033[39m')
        callback()
      })
    }
  ]
}
```

reactをjsにコンパイルするために用意したwebpack.config.jsをそのまま貼った。
時刻を表示しているのはpluginsの中で、 `webpack -w` を実行した時に呼ばれるコールバックを追加している。
console.logのそのままの出力だと他の文字にまぎれて見えにくいので色を青色に変更している。

こうすると、 `webpack -w` を実行すると時刻が表示され、

```
$ webpack -w
Begin compile at Mon Feb 15 2016 22:28:19 GMT+0900 (JST)
Hash: 311c9bb85a7a95541b85
Version: webpack 1.12.13
Time: 3590ms
    Asset     Size  Chunks             Chunk Names
bundle.js  3.79 MB       0  [emitted]  main
   [0] multi main 28 bytes {0} [built]
    + 327 hidden modules
```

普通に `webpack` した時には表示されないようになる

```
$ webpack
Hash: 311c9bb85a7a95541b85
Version: webpack 1.12.13
Time: 3596ms
    Asset     Size  Chunks             Chunk Names
bundle.js  3.79 MB       0  [emitted]  main
   [0] multi main 28 bytes {0} [built]
    + 327 hidden modules
```
なんと！unzipしたファイル名がSJISだった！コマンド？

# SJISふぁっく
Linuxを使っていると国内からダウンロードしてきたzipファイルを展開した時に日本語ファイル名が化けてゲンナリ……って事がよくあります。で、いつもは気にせずそのまま使って、いらなくなったら破棄みたいな感じで。必要なファイルがある場合もたいした数じゃないので自分でリネームしてたんですが。今回、結構な数のファイルを直さないと使い物にならない状況があったので、ちょっと調べてみました。

# 原因
根本的にはWindows上でマルチバイトで動いてるアプリがcp932でファイル名を生でzipに埋め込んでるのが原因なんだけど。これがLinux側で展開される時にcp932のままファイルシステムに書き出されているのなら変換は楽。```iconv -f shift-jis -t utf-8```を通したリネームをシェルで回せば済む話。生で書き出す時にファイル名的にアウトなのは0x2Fだけなんだけど、これはcp932の2バイト目に含まれることはないので問題になる事はなさそう。なんだけど、非ASCII部分になんらかの変換がかかってしまっているらしく、うまく元に戻らない。

# 諦めてPythonで展開
検索したらStack OverflowでPythonで書けばえーやん、みたいなやりとりがあったので書いてみたら簡単だった。普段はグルー言語で便利ツール書くとかマメにできない人なんですよね。

```py:unzip.py
#!/usr/bin/env python

import sys
import zipfile

def main(filename):
    with zipfile.ZipFile(filename) as zip:
        for info in zip.infolist():
            info.filename = info.filename.decode('shift-jis').encode('utf-8')
            zip.extract(info)

if __name__ == '__main__':
    sys.exit(main(sys.argv[1]))
```

エラー処理も何も考えてない単純に第一引数のzipファイルがSJISのファイル名を持ってると思ってただ展開するだけのスクリプト。

# 実はもっと簡単だった
で、Qiitaにでもメモっとくかー、と思って文字化け原因を掘り下げていったら灯台下暗し的な。きちんと文字コード変換するオプションが用意されてたorz

```shell-session
$ unzip -O sjis foo.zip
```

これだけで良いようでございます。なんか-Oと-Iが直感とは逆向きなんですが、-Oでアーカイブ内のエンコーディング、-Iで書き出し先のファイルシステムのエンコーディングを指定するようです。また変なエンコードがされてたのは自動判別に失敗してるためと思われます。

ソース見る前にhelpくらい読め、俺。さらに言えばQiitaにも[答え](http://qiita.com/okayama_fumi/items/9a5c9fb8c9a8d3404738)書いてあるし。

# まとめ
重い腰を上げて普段やらない事をやったら完全に無駄な作業でした。しかし、大きいコード書くのは好きなのに短いコード書くのが嫌いなのはなんでだろ。ボイラープレート比が高いからかなー。
Attiq、Qiita.com + Material Design - 第２話：オープンソース

こんばんは、ナムです。

先ほど、[Attiqをリリースして](http://qiita.com/eneim/items/cb1c1ecaa269461a9ee9)、たくさんのフィードバックをしてくれたありがとうございます。

前回の[記事](http://qiita.com/eneim/items/cb1c1ecaa269461a9ee9)で、「ソースコードについて：多少な認証キーを整理してから公開する予定。」とさせてもらったので、早速コードベースや設定を整理して、今回「Attiq」をオープンソース化したいと思います。

# ソースコード

ここで、アクセスできますので、ぜひ楽しんでください：

> [https://github.com/eneim/Attiq](https://github.com/eneim/Attiq)

ソースコードについては、いくつかの注意てんがあります：

- Android Studio 1.5.2とAndroid Studio 2.0 beta 4による開発している。なので、ソースコードを利用したい方にご注意してください。
- Fabric.ioを利用してバグをtrackするので、使い方が分かっていない方も怪我ずに〜
- いったんAndroid Studio 2での「Instant Run」を「OFF」にしていたので、その設定を「ON」にして、ビルドすることも確認してください。まだ「Beta」の段階で、うまくいかない可能性があることをご注意〜
- Githubからクローンした後、ちゃんと「gradle.properties」と「attiq/build.gradle」の内容を確認して、試してください
- Issueや要望など：```https://github.com/eneim/Attiq```または```https://github.com/eneim/Attiq-app```にissueとして教えて下さい。また、```https://gitter.im/eneim/Attiq-app```でRealtime supportをするので、ぜひご利用ください
- Bad practice報告、ソースコードについてのフィードバックなど：是非教えて下さい。

以上です。
Kotlin 1.0 リリース: JVM, Android向けの実用的な言語


こちらの記事をご覧ください。
[Kotlin 1.0 リリース: JVMとAndroid向けの実用的(Pragmatic)言語 | JetBrains ブログ](http://blog.jetbrains.com/jp/2016/02/17/578)
【連載01】212.環境変数を設定する

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogansible)で公開中です。</font></b>
サーバの責務は<b>[こちら](http://qiita.com/CsFactoryitter/items/032cc339048e52ee3586)</b>で確認ください。

##1.環境変数(shellの自動起動スクリプト実行)設定概要

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/a1fbf276-5592-5226-8ec2-58924f8115a5.png)

##2.playbookファイルの相関

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/1a2997ce-234b-ca4c-b0aa-d11c6542ad2c.png)

##3.playbook(site.yml)
${ANSIBLE_HOME}/site.yml
[メインとなるplaybook(site.yml)](http://qiita.com/CsFactoryitter/items/3112c6d504d3b5a58011#3%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AA%E3%82%8Bplaybooksiteyml)参照

##4.環境変数(shellの自動起動スクリプト実行)設定のplaybook(/operations/0091_env.yml)

${ANSIBLE_HOME}/operations/0091_env.yml

playbook中のコメントの補足に関しては「[6.補足説明](#6%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)」を参照。

```yaml:
# ===================
# ログイン時に読み混むbash_profile用ファイルを配置(profile_init.sh)
# ===================
- hosts: all
  sudo: no
  remote_user: root
  tasks:

# ===================
#  すべてのユーザーで使用する環境変数や
# 初期処理を記述したファイルを/etc/profile.d/配下におく。
# ===================
    - name: 環境変数のコピー
      shell: cp /var/opt/data/nfs/os/settings/profile_init.sh /etc/profile.d/profile_init.sh　#【4.A:
単純にファイルを/etc/profile.d/配下にコピー】
```

##5.起動スクリプト
${ANSIBLE_HOME}/sendfiles/os/settings/profile_init.sh

```bash:profile_init.sh
#!/bin/bash

#ホスト名を登録
admin=adminserv01
db=dbserv01
ap=apserv01

host=$HOST

#HISTORYを各端末で個別に作らない。
function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999

#すべての共通
alias vi='vim'

#APサーバとADMINサーバはJAVAを使用する
if [ "$host" = "$ap" -o "$host" = "$admin" ]; then
  export JAVA_HOME=/usr/java/default
  export CATALINA_HOME=/opt/tomcat
  export CATALINA_BASE=/opt/tomcat
  export PATH=${JAVA_HOME}/bin:${CATALINA_HOME}/bin:${PATH}
fi

if [ "$host" = "$admin" ]; then
  export MAVEN_HOME=/opt/maven
  export PATH=${MAVEN_HOME}/bin:${PATH}
fi

#RVENV実行                  
#export RBENV_HOME=~/.rbenv
#export PATH=${RBENV_HOME}/bin:${PATH}
#eval "$(rbenv init -)" >/dev/null 2>&1
if [ $USER = "root" ]; then                                         
export RBENV_HOME=/root/.rbenv
export PATH=${RBENV_HOME}/bin:${PATH}
#REPLACE_EXECRBENV　#【5.A：Rubyを後ほどrvenvでインストールした後#REPLACE_EXECRBENVをreplaceモジュールで置換】

fi
```

##6.補足説明
4.A、5.Aについて。

/etc/profile.d配下に配置する起動スクリプトを単純にコピーする。
shellの内容はvimのalias設定やJAVA_HOMEの設定など一般的な設定。
【5.A】の部分は後ほどrubyインストール後に置換する。
※ruby実行ユーザーがrootなのはご愛嬌です(笑)

##7.補足の補足（注意）
今回は事前にファイルを作成してそれを転送して終わるが、profile.d配下に配置するshをAnsibleのreplaceモジュールやlineinfileモジュールにて実装するのもいいかと思う。その場合、より効果の高い冪等性が得られると思う。
ただし冪等性を重要視するあまり、コストが高くなる可能性がある。我々がやることは冪等性を完全に守ることではなく、限られた時間の中で、より安全にサーバーを構築することかと思う。メリット／デメリットを考えて最良な選択をする事が重要だと思う。
<br>
次回は「[213.NMONのインストール・配置](http://qiita.com/CsFactoryitter/items/33a3a1cb698aad39a08e)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f)です。</font></b>
hadoop 2.6.3 + spark 1.6.0 + cassandra 2.2.5の設定メモ


- guavaの依存性問題でそのままでは動かない問題がある。
- 根本解決はおいておいて、hadoop/common/lib, hadoop/yarn/lib以下にある、guava 0.11.jarを全てguava-0.18.jarに変更して、workerに配る
- cassandra java driverは ver 3.0を使う
- cassandra connectorは ver. 1.5でよい
- spark は 本家の1.6 binaryでそのまま動く


https://groups.google.com/a/lists.datastax.com/d/msg/spark-connector-user/0fUqAZsjw6A/JuwZHyyRBgAJ


http://arjon.es/2015/10/12/making-hadoop-2-dot-6-plus-spark-cassandra-driver-play-nice-together/
vagrant-chef-zero が vagrant 1.8.1 で動かない気がする(debian と rbenvを使っている)

# 概要

どうも、がvagrant-chef-zero が vagrant 1.8.1 で動かない気がする。
問題は、rbenvとか使っているからかもしれない。

# 結論

複合要因かもしれないのだが、、

```
ffi_c
```

が解決できてないエラーがでている。

vagrant は、debian のパッケージだし、rbenvつかっているとかそういうところが
問題かもしれない。

root で vagrant plugin をいれてもだめだった。
時間の間隔定義にはTimeSpanが便利！

# はじめに
今を思い返す事XX年前。
あれは大学の二次試験の物理のテスト問題でした。

数学物理を得意としてた私は、満を持して物理のテストを迎え、問題用紙を開いた瞬間、凍り付きました。
それまでずっとミリリットルで勉強してきた私に出された問題は単位がリットル。
そう！1リットルが何ミリリットルか、思い出せなかったのです！

悩みに悩んで、出した結論は1リットル＝100ミリリットル。
そして私は設問を一つ丸ごと落とし、浪人しました。

。。。ミリが1/1000を意味すると知ったのはその後ですが、人生で二度と忘れることはないでしょう。

# そう言うわけで！
私はいまだに単位換算が一つのトラウマです。
そんな私の古いトラウマをえぐるのが次のようなソースコードです。

```csharp
        /// <summary>
        /// ポーリング間隔：1分
        /// </summary>
        private static readonly int PollingInterval = 60 * 1000;

        static void Main(string[] args)
        {
            while (true)
            {
                // 一定時間スリープする
                System.Threading.Thread.Sleep(PollingInterval);
            }
        }
```

はい、非常によく見かけるソースコードですね！
このコードは2つの意味で私の不安を煽ります。
1. 1分て何ミリ秒！
2. Sleepの引数って本当にミリ秒指定なの！？

まぁ、1分程度ならあれからXX年経過した私には暗算余裕ですが（ミリは1/1000だし）、これが数時間とか下手したら何時間何分とかなると途端に恐怖が蘇ります。
しかし、.NET Frameworkにはそんな私のトラウマをえぐらない素敵な仕組みが最初から用意されているのです。
ご存知ですか！そう、それが[TimeSpan構造体](https://msdn.microsoft.com/ja-jp/library/system.timespan(v=vs.110).aspx)です。

上のコードをTimeSpan構造体を利用して書き直したのがこちらです。

```csharp
        /// <summary>
        /// ポーリング間隔：1分
        /// </summary>
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMinutes(1);

        static void Main(string[] args)
        {
            while (true)
            {
                // 一定時間スリープする
                System.Threading.Thread.Sleep(PollingInterval);
            }
        }
```

非常に分かりやすくないですか！？
他にも次のようなメソッドが用意されています。

```csharp
        /// 日単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromDays(1);
        /// 時間単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromHours(1);
        /// 分単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMinutes(1);
        /// 秒単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromSeconds(1);
        /// ミリ秒単位
        private static readonly TimeSpan PollingInterval = TimeSpan.FromMilliseconds(1);
```

これ以外に、コンストラクタ経由で時分秒指定とかもあるんですが、コンストラクタの引数の順序なんて覚えられない私には、もっぱら下のように書いてもらえると喜びます。

```csharp
        /// 2時間30分
        private static readonly TimeSpan PollingInterval = 
            TimeSpan.FromHours(2) + TimeSpan.FromMinutes(30);
```

まぁ、引数側にTimeSpanを許容しないメソッドは.NET Frameworkの標準クラスでも多いのですが（TimerのIntervalとか）、それでも定数の可読性は高くなるはずですので、皆さんも良かったら使ってみてください。

それでは！
Heroku：(Application Errorにならないための)Node.jsアプリのデプロイ入門


Node.jsで作成したWebアプリ（Git管理）のデプロイ方法です。
個人的にハマったApplication Errorについても記載しています。

```version
 "node"   : "v4.1.1",
 "npm"    : "2.14.4",
 "express": "^4.13.4"
```

#ローカル準備編

##Procfileを作成
アプリの起動コマンドを記述します。
アプリの第一階層に設置します。

```Procfile
web: node server.js
```


##package.json/"dependencies"に使用しているパッケージを全て記述。
server側で使用しているパッケージを記述します。
ひとつでも抜けていると"Application Error"になるので注意してください。

```package.json
"dependencies": {
    "body-parser": "^1.14.2",
    "express": "^4.13.4",
    "request": "2.61.0"
  }
```
cf. ["dependencies"の説明](http://liberty-technology.biz/PublicItems/npm/package.json.html#dependencies)

もしApplication Errorが出る場合は
使用しているパッケージが記述されているか確認してみてください。
僕の場合はグローバルインストールしていたパッケージが
抜けていたためにハマりました。

##ポート番号の記述を変更

```server.js
app.listen(8000);
```
↓↓↓

```server.js
app.listen(process.env.PORT || 8000);
```
これはかなりハマりました。。。
Herokuでは明示的にポート番号を指定する必要があります。


##.gitignoreを追加
既にGitHubにpushしていたら設置済みかもしれませんが
node_modulesを除外する設定を記述します。

```.gitignore
node_modules/
```

##package.jsonに"engines"を追加、
アプリを堅牢にするため
versionの末尾を"X"にしておくと良いそうです。

```package.json
"engines": {
    "node": "v4.1.X",
    "npm": "2.14.X"
  }
```
cf.["engines"の説明](http://liberty-technology.biz/PublicItems/npm/package.json.html#engines)




#Herokuにデプロイ編

##HerokuへSignUpしてアプリを追加します。
こちらが詳しいです。
[今からはじめるReact.js〜Herokuへのデプロイ〜](http://qiita.com/kuniken/items/70c2b5cd77d7c9301bcf)

HerokuのDashboardから
追加したアプリのDeployページへ移動すると
デプロイ方法が書いてありますのでそれに従いましょう。

![heroku_deploy.jpg](https://qiita-image-store.s3.amazonaws.com/0/23451/d458140e-076b-247a-b0f3-80e21d3349b6.jpeg "heroku_deploy.jpg")


##heroku toolbeldのインストール
Herokuコマンドが使えるようになります。
https://toolbelt.heroku.com/

##Herokuへログインします。

```
$ heroku login
```
##リモートリポジトリにHerokuアプリを追加します

```
$ cd [my-project]/
$ git init //既にgitをinitializeしている場合は不要
$ heroku git:remote -a [my-app-name]
```
##gitにcommitし、Herokuにpushしてデプロイ完了です！

```
$ git add .
$ git commit -am "make it better"
$ git push heroku master
```

無事デプロイに成功すると

```
remote: Verifying deploy.... done.
To https://git.heroku.com/[my-app-name].git
   xxxxxxx..xxxxxx  master -> master
```
と表示されるはずです。
__おつかれさまでした！__


<br>
####▼ちなみにもういったん消しちゃうときはコチラ

```リモートリポジトリ削除
git remote remove heroku
```

<br>
##参考リンク
[Node.js + Express を Heroku で動かすまでの手順まとめ](http://tacamy.hatenablog.com/entry/2013/02/16/235127)
[今からはじめるReact.js〜Herokuへのデプロイ〜](http://qiita.com/kuniken/items/70c2b5cd77d7c9301bcf)
[Express4 + mongoDBアプリケーションをherokuで動かす](http://qiita.com/runtBlue/items/0731f6f9d4bd27cd2dbd)
[Node.jsをHerokuへデプロイ](http://qiita.com/yoh-nak/items/80e51197410c7f956ccd)
[Node.jsのアプリをHerokuにデプロイするときポート番号に気をつけなくちゃいけない](http://qiita.com/KENJU/items/1d61c9fb45496feed1bf)
[Heroku + node.js error (Web process failed to bind to $PORT within 60 seconds of launch)](http://stackoverflow.com/questions/15693192/heroku-node-js-error-web-process-failed-to-bind-to-port-within-60-seconds-of)
AWSにFuelPHP+nginx(SSL)の環境構築

## はじめに
AWSにFuelPHP + nginx（SSL）の環境構築した時のメモです。

## 概要
1. gitのインストール
2. composerのインストール
3. oilのインストール
4. プロジェクトの作成
5. nginxの設定

## 詳細


----
#### gitのインストール
gitのインストールをします。

入れとかないと以下のようなエラーがでます。

Failed to download fuel/fuel from source: Failed to clone git@github.com:fuel/fuel.git, git was not found, check that it is installed and in your PATH env.

sh: git: command not found

    Now trying to download from dist

```shell-session
yum install git
```

----
#### composerのインストール
composerのインストールをします。

```shell-session
curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin
```

composer.phar　で入るのでcomposerでシンボリックリンクを作成します。
しないと以下のようなエラーがでます。
which: no composer in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/admin/.local/bin:/home/admin/bin)
ｎ
```shell-session
ln -s /bin/composer.phar /bin/composer
```

----
#### oilのインストール
oilをインストールします。

```shell-session
curl get.fuelphp.com/oil | sh
```

----
#### プロジェクト作成
以下のコマンドでプロジェクトを作成します。

```shell-session
oil create プロジェクト名
```

もし以下のようなエラーが出た場合、githubの制限でエラーになっているのでキーを取ります
Could not fetch https://api.github.com/repos/fuel/core/contents/composer.json?ref=befcce8da16420d07d4da1b267057b5c23e673fd, please create a GitHub OAuth token to go over the API rate limit

以下コマンドでトークンが取得できます。

```shell-session
curl -u 'ユーザー名' -d '{"scopes":["repo"],"note":"Help example"}' https://api.github.com/authorizations
```

コンフィグ設定をします。

```shell-session
composer.phar config -g github-oauth.github.com 取得したトークン
```

あとは、再実行すればOKです。

----
#### nginxの設定

nginxの設定を行います。htaccessが使用できませんので、直接書きます。
ついでにBASIC認証の設定もしました。

```shell-session:/etc/nginx/conf.d/ドメイン名
server {
       listen       443 ssl;
       server_name  ドメイン名;
       root   ドキュメントルート;
       charset	 utf8;
       ssl                  on;
       ssl_certificate      /xxxx/ssl/server.crt;
       ssl_certificate_key  /xxxx/ssl/server.key;
       ssl_session_timeout  5m;
       ssl_protocols  SSLv2 TLSv1;
       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers   on;
 
       disable_symlinks	off;

       location / {
           auth_basic "Restricted";
           auth_basic_user_file /xxxx/passwd.dat;
           index                index.php;
           try_files $uri $uri/ /index.php$is_args$args;
       }

       location ~ \.php$ {
           fastcgi_index  index.php;
           fastcgi_pass   unix:/XXXXX/php-fpm/php-fpm.sock;
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       }
}
```

あとはnginxを再起動もしくはリロードでOKです。

## あとがき
上記でとりあえずインストールまで完了すると思います。ここらへんの作業はほとんど同じだしchefとかansibleとかで自動化したいな。

## その他
参考
[composerでGitHub apiのアクセス制限対処法](http://qiita.com/ma_me/items/7d1823c27d6ef45cdf9f)

## 履歴
2016/02/16 nginxのコンフィグに余計な設定があったので修正。また、シンボリックリンクを有効にする。
Laravel5入門として画像投稿機能付き掲示板作成を目指す: Form文字化けの落とし穴　〜灯台下暗し〜

画像投稿機能付き掲示板を作成している時に、文字列と画像データを複数同時にPOSTで送ろうとすると文字化けします。

原因は formタグ内の`enctype="multipart/form-data"`にありそうです。
試しに ビューファイルのFormヘルパー関数内の`'files' => true` オプションを抜いて画像投稿なしのバージョンだと文字化けせず、上手くいくんです！
絶対解決してやるぜぇぇぇぇ

・

・

・

・

原因は単純にphp.ini の `mbstring.http_input = auto` になっていただけでした。
`auto`を`UTF-8`にしてやると、無事multi-partだろうがなんだろうが文字化けしませんでした。

実は、autoの書き換えは結構序盤にやって上手く行かなかったので無視していたのですが、XAMPPを再起動していなかったというアホなオチでした...

再起動必要ですよね、そりゃ。
Photoshop CC 2015で既存のドキュメントを一瞬でアートボード化する方法

Photoshop CCのアートボード機能を使っていますか？ 一つのドキュメントで複数画面サイズに対応したデザインが可能な、レスポンシブWebデザイン時代に必須の新機能です。

2015年12月のアップデートでは、Web及びアプリデザイン用のドキュメントを新規作成した場合にはアートボードモードになるなど、これからPhotoshopでのデザインの中心になっていくことを感じます。

しかし、既存のPSDドキュメントがアートボードで作られていない場合はどうすればいいのでしょうか？ Photoshop CC 2015では、アートボードに対応していないPSDを即座にアートボードに変換する機能が備わっています。

# 既存ドキュメントを一瞬でアートボードに変換する手順

1. アートボードにしたいレイヤーを右クリック
2. [レイヤーからのアートボード]を選択

![右クリックからアートボード化](https://qiita-image-store.s3.amazonaws.com/0/67884/b01a1e45-c0de-5c6b-e69b-ce087b446620.png)

以上2ステップで、既存のドキュメントがアートボード化されます。

![アートボード化されたPSDドキュメント](https://qiita-image-store.s3.amazonaws.com/0/67884/f4497287-c5a8-0784-64a9-fec558889d15.png)

よきアートボードライフを。

※ 写真は[2015年の多摩川花火大会](https://www.flickr.com/photos/tonkotsuboy_com/20779626522/in/dateposted-public/)のものです。
【CSS】【jQuery】セレクタの子孫条件とアンド条件

セレクタとセレクタの間にスペースがあるのとないのとで意味が違うこと、当たり前のことなのかもしれないけど、ずっと勘違いしてて今日初めて知った！なので記念に書いておく。

CSSもjQueryも共通。

セレクタA　セレクタB
セレクタの間にスペースがある場合、セレクタAの子孫のセレクタBという意味

セレクタAセレクタB
セレクタの間にスペースがない場合、セレクタAかつセレクタBのという意味
ピュアCSSでリンク先の拡張子ごとにアイコンを付ける

CSSの調べ物をしてて、なるほどと思ったTips。[ここ](http://www.thecssninja.com/css/css-tree-menu)のサンプルで、本質とは関係ないとろこで面白いCSSを発見した。CSSセレクタを利用して、拡張子ごとにアイコンを変更すると言うもの。

こんな感じの、リンク先の拡張子に応じてアイコンを付けたい。
![ul.png](https://qiita-image-store.s3.amazonaws.com/0/102667/7929d278-abf3-b2b7-3c42-234e44b1d344.png)

HTMLはよくある拡張子付きのURLへのリンク。

```html
<ul>
  <li><a href="README.md">README.md</a></li>
  <li><a href="index.html">index.html</a></li>
  <li><a href="style.css">style.css</a></li>
  <li><a href="script.js">script.js</a></li>
  <li><a href="initialize.rb">initialize.rb</a></li>
</ul>
```

これに対するCSS。CSS3から導入されたCSSセレクタの末尾マッチを表す`$=`を使って、`href`の内容ごとに`a`タグの背景画像を変更。

```css
a {
  background-image: url(default.png);
  background-repeat: no-repeat;
  background-size: contain;
  background-position: left center;
  padding-left: 48px;
  line-height: 48px;
}

a[href $= '.html'] { background-image: url(html.png); }
a[href $= '.css']  { background-image: url(css.png); }
a[href $= '.js']   { background-image: url(javascript.png); }
a[href $= '.rb']   { background-image: url(ruby.png); }
```

これだけで、ピュアCSSのみで拡張子ごとにアイコンを変更できた。

今回使用したアイコンは[こちら](https://www.smashingmagazine.com/2010/12/free-icon-set-for-web-developers-coded/)。
Ginq 専用の Phalcon Paginator を書いた


去年書いた [Phalcon Model::find の結果を Ginq にする方法](http://qiita.com/sukobuto/items/9472d1257750edc6d22a) という記事で暇があったら書くって言ってたやつです。
最近は暇があったら二百うん年後のボストンに行ってます(Fallout4)。でもやっぱり必要になったので書きました。

# Why

Model find 結果を Ginq に統一しているので、サーバサイドページングを Ginq に対応させたかった。
超ニッチ。

# Code

名前空間は書いてません。適宜適切に記述してください。

```php:GinqPaginator.php
<?php

use Phalcon\Paginator\Exception;
use Phalcon\Paginator\AdapterInterface;

class GinqPaginator implements AdapterInterface
{
	/** @type array */
	protected $config;

	/** @type int */
	protected $page;

	/** @type int */
	protected $limitRows;

	public function __construct($config)
	{
		$this->config = $config;
		if (isset($config['limit'])) {
			$this->limitRows = $config['limit'];
		}
		if (isset($config['page'])) {
			$this->page = $config['page'];
		}
	}

	public function setCurrentPage($page)
	{
		$this->page = $page;
		return $this;
	}

	public function getPaginate()
	{
		$limit = intval($this->limitRows);
		$config = $this->config;
		/** @var Ginq $items */
		$items = $config['data'];
		$pageNumber = intval($this->page);

		if (!(class_exists("Ginq\\Ginq") and $items instanceof \Ginq\Ginq)) {
			throw new Exception("Invalid data for paginator");
		}

		if ($pageNumber <= 0) {
			$pageNumber = 1;
		}

		if ($limit <= 0) {
			throw new Exception("The limit number is zero or less");
		}

		$n = $items->count();
		$offset = $limit * ($pageNumber - 1);
		$totalPages = (int)ceil($n / $limit);

		if ($offset > 0) $items = $items->drop($offset);
		$items = $items->take($limit);

		$next = $pageNumber < $totalPages
			? $pageNumber + 1
			: $totalPages;

		$before = $pageNumber > 1
			? $pageNumber - 1
			: 1;

		return (object)[
			'items' => $items->toList(),
			'first' => 1,
			'before' => $before,
			'current' => $pageNumber,
			'last' => $totalPages,
			'next' => $next,
			'total_pages' => $totalPages,
			'total_items' => $n,
			'limit' => $limit,
		];
	}
}
```

# How

```php:EntryController.php
class EntryController extendes Controller {

	public function entriesAction()
	{
		$limit = 10;	// 1ページに表示する数
		// クエリストリングからページ番号を取得 ?page=1 
		$page_num = $this->request->get('page', ['int'], 1);
		$entries = Entries::find();	// なんかたくさん取得する(返ってくるのは Ginq)
		
		// Ginq, ページ内表示数, ページ番号を渡す
		$paginator = new GinqPaginator([
			'data' => $entries,
			'limit' => $limit,
			'page' => $page_num,
		]);
		// 今回のページを取得
		$page = $paginator->getPaginate();
		$this->view->setVar('page', $page);
	}

}
```

```html:entries.volt
{{ page.current }} <!-- 今のページ番号 -->
{{ page.before }} <!-- 前のページ番号 -->
{{ page.next }} <!-- 次のページ番号 -->
{{ page.total_pages }} <!-- 何ページあるか -->
{{ page.total_items }} <!-- 全部でいくつあるか -->
<ul>
  {% for entry in page.items %} <!-- ページ内のアイテムをイテレート -->
    <li>{{ entry.title }}</li>
  {% endfor %}
</ul>
```
【Git】自前で立てたGitでSSL認証失敗

社内でgitbucketを使ってgitを立てて、httpsでアクセスすると認証エラー発生。

```
fatal: unable to access 'https://XXXXX.git/': SSL certificate problem: self signed certificate
```


「[GitでSSL認証失敗のエラーが出る](http://qiita.com/sutoh/items/f81c683d6021520eec66)」を参考に、gitでSSL認証しない設定にした。たぶんあるあるなのでは。

```
git config http.sslVerify false
```
v22とv23でAppBarLayoutのタップ領域が大きく異なるので注意しようねというお話


# 前置き
2ヶ月も前に素材だけ用意したまま、今日まで公開し忘れていたんですが、もしかしたらこの件でちょうど苦しんでる人がいるかもしれないと思ったので公開に至りました。

# 結論
表題の通りなのですが、AppBarLayoutはcompileSdkVersion（と、Support Design）がAPI22でビルドされていると、 **ツールバー部分をスワイプしても反応がありません**。

# キャプチャー

両者ともソースは同じで、違いはcompileSdkVersionとsupportライブラリ関連がv22に指定しているか、v23に指定しているかだけになります。

## v22でビルドした場合

![v22.gif](https://qiita-image-store.s3.amazonaws.com/0/4560/a07f3003-052d-9dcb-832f-adcd39e2847b.gif "v22.gif")


## v23でビルドした場合

![v23.gif](https://qiita-image-store.s3.amazonaws.com/0/4560/6f8a5df5-d177-4e48-6a79-f42aa1de2552.gif "v23.gif")



このように、ツールバーの部分をスワイプしても、v22の方は何も反応しません。これは思った以上に利便性が悪いです。

特にdesign support関連は、v23で様々な修正や拡張が行われていますので、もし他の理由でtargetSdkVersionを23にできなくても、compileSdkVesionは23に更新しておいた方がよろしいかもしれません。（これによって他の問題が起こるかもしれないので、本来は両方共同時期に更新できるのが望ましいんでしょうが）

# 参考
https://github.com/romainz/CoordinatorLayoutSample
こちらのプロジェクトを使って、上記の検証やキャプチャーの作成を行いました。