OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel5.1】 Eloquent の Builder で使いそうなAPIのまとめ


Illuminate\Database\Eloquent\Builder.php のまとめ記事です。
Laravelの概要ドキュメントには、hasの使い方は載っているのに、その逆のメソッドについては記載がなかったりして、都度ソースを調べてるので、（徐々に）まとめていきます。

## 公式ドキュメント
[概要](https://laravel.com/docs/5.1/eloquent-relationships)
[API一覧](https://laravel.com/api/5.0/Illuminate/Database/Eloquent/Builder.html)

## find系メソッドまとめ
主キーで検索する時に便利なメソッド。

#### **find($id, $columns = ['*'])**
- 主キーで検索する時に使用する。

#### **findMany($ids, $columns = ['*'])**
- 複数の主キーで検索する時に使用する。

#### **findOrFail($id, $columns = ['*'])**
- 主キーで検索する時に使用する。
- 検索結果が無い場合、ModelNotFoundException が throw される。

## first系メソッドまとめ

#### **first($columns = ['*'])**
- 検索結果の先頭を取得するメソッド。getを実施しなくて良い。
 
#### **firstOrFail($columns = ['*'])**
- 検索結果の先頭を取得するメソッド。getを実施しなくて良い。
- 検索結果が無い場合、ModelNotFoundException が throw される。

## has系メソッドまとめ

#### **has($relation, $operator = '>=', $count = 1, $boolean = 'and', Closure $callback = null)**
- 関連オブジェクトを指定し、存在するレコードのみ取得するメソッド。
 
#### **doesntHave($columns = ['*'])**
- 関連オブジェクトを指定し、存在しないレコードのみ取得するメソッド。

#### **whereHas($relation, Closure $callback, $operator = '>=', $count = 1)**
- hasの検索条件を詳細に指定する際に使用するメソッド。

#### **whereDoesntHave($relation, Closure $callback = null)**
- doesntHaveの検索条件を詳細に指定する際に使用するメソッド。

#### **orHas($relation, $operator = '>=', $count = 1)**
- hasをor句で表現する際に使用するメソッド。

#### **orWhereHas($relation, Closure $callback, $operator = '>=', $count = 1)**
- orHasの検索条件を詳細に指定する際に使用するメソッド。
非プログラマ集団ではじめるテスト自動化〜SeleniumIDEを採用した経緯

[前回](http://qiita.com/ma-watanabe/items/7a73d060dee4b10299ad)から間があいてしまいましたが、
非プログラマ集団ではじめるテスト自動化第2話です。
今回はSelenium IDEを採用した経緯をお話したいと思います。

導入を選定したのは2015年初頭頃であり、
現在状況も変わっている部分もあると思いますので、不足点あるとご指摘いただければ幸いです。

#Seleniumを使う目的
主に以下のテストの自動化を対象としました。
####対象
・手入力のテスト(文字種、文字数制限のテスト) 
・表示内容のテスト(エラーメッセージ、表示項目のチェック) 
・検索条件のテスト

####解決できる問題
・再帰試験として既存の試験項目をすべて実施することの時間的な制約 
・同じ試験を繰返すことによる、検証者の心理的な負担 
・影響個所の洗い出し漏れによるデグレの発生 
・開発⇔検証者間の仕様齟齬
・エビデンスの取得

#実装メンバーについて
品質管理メンバー内で進める事を前提に考えており、
プログラマ経験の無いテスター3〜4名でのスタートを想定していました。
そのため、ある程度のルール化や実装のしやすさ、容易に導入できることを重視しました。
また、テスターとして仕様を理解しているのがアドバンテージだと思いましたので、そのメリットを活かせればという思いもありました。

#Seleniumの実装方法の選定
Seleniumには大きく分けてSelenium WebDriver/Selenium IDEと2通りの実装方法がありますので、それぞれのメリット/デメリットを整理の上、選定しました。
Seleniumの概要の理解は下記が参考になりました。
[Seleniumとは](https://thinkit.co.jp/free/article/0705/2/1/)
[Selenium何とかっていうツールがやたら色々あるのはどういうわけなのか](http://blog.trident-qa.com/2013/05/so-many-seleniums/)

##Selenium WebDriver方式による実装
####特徴
￼・テスト実行時のブラウザ操作を、JavaScriptではなく、ブラウザの拡張機能やOSネイティブの機能を使い、
JavaやRubyにてプログラミング実装をする。

####メリット
・javascriptによるブラウザのセキュリティ制約を解決。
・メソッド化や共通化ができるので、メンテナンスが容易
・WebDriverスクリプトはコマンド主体でテストが容易に実施できるため、CIツールとの相性もいい。

####デメリット
・プログラミング未経験者にとってはJavaやRuby等のプログラミングの理解から始める必要がある。
・Seleniumとプログラミング2点の問題が生じ、切り分けに時間を要する事が想定される。
・￼Selenium Builderという統合ツールもあるが、後述するSelenium IDEほど使い勝手はよくない。
　Selenium IDEから比較すると以下が不足している
　• 簡単に記録できるAssert・Verifyコマンドが、verifyTextPresentコマンドのみ
　• 変数を複数のテストケース間で共有できない
　• Firefox以外のブラウザでの再生
　• データ駆動テスト
　• if文、for文、while文

##Selenium IDEによる実装
####特徴
Firefoxにプラグインをインストールする事で、容易にテスト自動化を開始できる。
Webブラウザの操作を記録できる。

####メリット
・Seleniumの仕様を理解するには一番わかりやすいツール。
　※Seleniumの実装やエラーの切り分けにはある程度のコツがいるため、初心者にはSeleniuIDEからはじめるのがとっかかりやすい。
・テストケースを直感的に作ることができる。
・統合環境の為、ほぼ完結してテストケースを作ることができる。
・アプリとして枯れている為、動作もある程度安定している。

####デメリット
・独自のRCコマンドを覚える必要がある。
・WebDriverスクリプトの読み込みができない
・WebDriverが主流になっているので、ノウハウ等情報が少ない。
・CIツールとの連携ができない。
・SeleniumIDEが読み込み/保存を主体とするのは旧形式（RCコマンド）のため、コマンド実行に寄るノウハウやCIツールとの連携の情報が不足している。
　※ただし、Webdriver方式にエクスポートする事はできるので、無駄になる事はない。
・条件分岐やループ処理などが入るとjavascriptの知識が必要で、処理が複雑化する。
・Seleniumコマンドをメソッド化できない。
　※javascriptコマンドをメソッド化できるが、メソッド化は限定的なものになる。
・マルチブラウザにほぼ対応できない。
　※一部できる方法もあるようだが、いろいろと制約があるようで、最新のブラウザでは実行できなかった。
・まとめて実行できるレベルがテストスイート単位になり、テストスイートが増えれば増える程運用が難しくなってくる。

#Selenium IDEを採用した決め手
一人で自動化を進めるのは困難であり、品質管理メンバー（非プログラマ）の協力があって進められるものだと思いましたので、スタート時には飲み込みやすさや使い勝手の良さ、導入や運用のしやすさを重要しました。

また、Slenium IDEの最大のデメリットはCIツールとの連携がしづらい点ですが、運用の工夫をすれば
CIツールが無くても自動化テストはできますし、そこまで困る事はありませんでした。
ただし、テストスイートをたくさん増やしてまとめて実行する等のケースには向かないと思います。

ソースをまとめてWebDriver方式にコンバートしてくれるツールや、
置換バッチを作れば容易にWebDriver化できることも分かりましたので、
作ったソースが無駄になる事はない事も分かりました。

Selenium IDEのデメリットもいろいろとあげましたが、以上がSelenium IDEを採用した経緯です。

Slenium IDEを使っての運用やWebDriver方式への移行方法などについては、次回お話してみたいと思います。
Ruby | true と false を反転させる方法

# true を false にする

```rb
!(true)

# => false
```

# false を true にする

```rb
!(false)

# => true
```

# どういう時に役立つ？

反対の結果を返したい時に役立つ。
たとえば、女性でなければ男性だと判定する場合。

## if を使うと

冗長。

```rb
class Person
  def is_man?
    if is_woman
      return false
    else
      return true
    end
  end
end
```

## ! を使うと

もっと簡潔に書ける。

```rb
class Person
  def is_man?
    !(is_woman?)
  end
end
```



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
FreeNAS 9.3 jail に PHP をインストール

[FreeNAS9.3 + h2o の環境]( http://qiita.com/katz_engineer/items/bc61ac926107d2118de2)に PHP をインストールしました。

# インストール
難しい事は何も無く、 pkg コマンドでいけました。

```
# pkg install php56
...
# pkg install php56-extensions
...
```

設定ファイルを用意。まずは起動実験という事で、開発用の php.ini を使い、 doc_root を暫定のディレクトリにします。

```
# cd /usr/local/etc
# cp -p php.ini-development php.ini
# vi pnp.ini
# diff -U0 php.ini php.ini-development
--- php.ini     2015-12-27 22:22:14.499742681 +0900
+++ php.ini-development 2015-12-17 21:01:05.000000000 +0900
@@ -725 +725 @@  
-doc_root = /media/www/test     
+doc_root =
```

h2o.ini に php 関連を追記。これもそこら中で説明されていますね。大事なのは file.custom-handler: の部分。これだけで FastCGI になって php-fpm の起動も不要ってんだから楽なもんです。

```/usr/local/etc/h2o/h2o.conf
user: www
pid-file: /var/run/h2o.pid
access-log: /var/log/h2o/h2o-access.log
error-log: /var/log/h2o/h2o-error.log
listen: 80

file.custom-handler:
  extension: .php
  fastcgi.spawn: "PHP_FCGI_CHILDREN=10 exec /usr/local/bin/php-cgi"

hosts:
  test.example.com:
    paths:
      "/":
        file.dir: "/media/www/test"
```

設定ファイルを修正したら再起動しましょう。余談ですが reload だと時々失敗するんですよね。原因不明。

```
# /usr/local/etc/rc.d/h2o restart
```

最後に bind で test.example.com を設定します。以上で設定は終了。

# 動作確認

/media/www/test に index.php を用意。これまた php の入門サイトによく書かれている内容です。元は PHP の公式サイトでしょうか？

```/media/www/test/index.php
<html>
<head>
  <title>PHP Test</title>
</head>
<body>
 <?php echo '<p>Hello World</p>'; ?>
</body>
</html>
```

ブラウザで http://test.example.com/index.php を表示できれば完成。

…実はここで私、散々ハマりました。最終的に分かった事。どうやら <? の辺りが全角文字か何かになっていたらしく、PHPスクリプトと認識されなかったようです…出力もそういう内容になってまして、それに気付くまで延々と時間を浪費したのでした:sweat: せめて jail のコンソール画面がもうちょっと見易ければ…文字をもう一回り大きくして、黒地に白字を、黒地にシルバー文字にするとか…

教訓。学習目的でなくて単なる動作確認の場合、よくあるサンプルプログラムは素直にコピペする方が無難です:sweat_smile:
【Laravel5.1】 Eloquent の with() の selectについて


Eloquent の with で取得するカラムを指定したかったのですが、けっこーハマっので残します。

```php:HogeDataGroupModel
    // 項目
    protected $fillable = [
            'name',
            'group_type',
            'order'
        ];

    // 関連
    public function hogeDatas()
    {
        return $this->hasMany('App\Models\HogeDataModel');
    }
```

```php:HogeDataModel
    // 項目
    protected $fillable = [
            'hoge_data_id',
            'value',
            'start_at',
            'end_at'
        ];

    // 関連
    public function hogeDataGroup()
    {
        return $this->belongsTo('Models\HogeDataGroupModel');
    }
```

上記のように、
 `HogeDataGroup : HogeData = 1 : 多`
のケースで考えると、
HogeDataModel の value のみを 抽出する場合、valueだけでなく、**FKも必要**です。←これにハマった。

```php:HogeController
    HogeDataGroupModel::where('group_type', 1)
       ->with(['hogeDatas' => function ($q) {
           $q->select('value', 'hoge_data_id'); // ← hoge_data_id が必要。
       }])
```
elasticsearch を docker で入れ、head と kuromoji プラグインを入れる 2015冬 (elasticsearch2.1.1)

docker の公式 elasticsearch をインストールしてみたのですが、検索して見つけた他の方が書かれた2014年頃の手順書だとコマンドなどが少し違っていたので、メモとして残します。

なお2015年12月現在、dockerイメージの elasticsearch のバージョンは 2.1.1, Amazon Elasticsearch Service のバージョンは 1.5.2 。けっこう差がありますね。
機能にどれだけの差があるかは把握していません。


```bash:ubuntu(ホスト)
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"

# $ sudo apt-get install docker.io

$ sudo docker --version
Docker version 1.6.2, build 7c8fca2

$ sudo docker pull elasticsearch

$ sudo docker run -it elasticsearch /bin/bash

```

```:elasticsearchコンテナ
# elasticsearch --version
Version: 2.1.1, Build: 40e2c53/2015-12-15T13:05:55Z, JVM: 1.8.0_66-internal
# plugin install mobz/elasticsearch-head
# plugin install analysis-kuromoji
```
* elasticsearch, plugin コマンドにはパスが通っています。
* install のサブコマンドは --install では無いです
* kuromoji のリポジトリは、2015年夏あたりに引っ越しされ、公式に取り込まれていました

インストール終了後、`Ctrl + d` で出る

```bash:ubuntu(ホスト)
$ sudo docker commit <container_name> ytyng/elasticsearch-head-kuromoji
$ sudo docker run -p 9200:9200 --name es2 -d ytyng/elasticsearch-head-kuromoji elasticsearch
```

パソコンから `http://<server>:9200/` を見る

```
{
  "name" : "Blur",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.1.1",
    "build_hash" : "40e2c53a6b6c2972b3d13846e450e66f4375bd71",
    "build_timestamp" : "2015-12-15T13:05:55Z",
    "build_snapshot" : false,
    "lucene_version" : "5.3.1"
  },
  "tagline" : "You Know, for Search"
}
```

パソコンから `http://<server>:9200/_plugin/head/` を見る

![スクリーンショット 2015-12-29 14.26.27.png](https://qiita-image-store.s3.amazonaws.com/0/68302/ce7b5490-25c8-dc88-8009-19dae350bb3f.png)



# ちなみに、起動中の elasticksearch コンテナのシェルに入るには

```bash:ubntu(ホスト)
$ sudo docker exec -it es2 /bin/bash
```

# django-haystack の人は注意
django-haystack 使ってる場合、Elasticsearch2だと動きません。

https://github.com/django-haystack/django-haystack/issues/1247

```
"type": "search_parse_exception",
"reason": "failed to parse search source. unknown search element [facets]",
```

が出ます。facets -> aggregate に変わったとのこと (シンタックスも変わってます)。
【Laravel5.1】 arrayの中身をバリデーションする

# FormRequestでのバリデーションについて
arrayで渡ってきたリクエストデータについてどうやってバリデーションを実施するか、ドキュメントみてもわからず悩んでましたが、結果、ループで回してそれぞれ実施しました。

```lang:FormRequest
    public function rules()
    {
        $rules = [
            'datas' => 'required|min:1|array',
        ];
        // 配列
        $datas = $this->request->get('datas');
        foreach ($datas as $index => $value) {
            $rules["datas.$index.id"] = 'required|integer|exists:data_tables,id';
            $rules["datas.$index.order"] = 'required|integer|min:0|max:9999999999';
        }
        return $rules;
    }
```

ただ、こうするとエラーメッセージが index にモロ影響を受けてしまいます。。

>The datas.0.id field is required.
The datas.1.id field is required.

indexをうまくエラーメッセージにハンドリングするのを模索中です。
class method定義から考察するRubyの仕組み

特異クラスとはとあるオブジェクトのために、用意されるクラスである。
ただ、Rubyにとっては、classもオブジェクトであるため、classメソッドを定義するためには
class(というオブジェクト)の特異クラスに対してmethodを定義する必要がある。

特異メソッドを定義する際に表記されるselfとは自分自身のクラス(オブジェクト)を指す。
"class << self" の表記は自分自身のクラス(オブジェクト)の特異クラスについて定義することを指す。
[ sort ]tab区切りデリミタ指定

##0. tab区切りのデータをsortする

```bash:'$'マーク使う
sort -t$'\t' -k2 -r
sort -t$'\t' -k2r
sort -n -r -t$'\t' -k2
```

タブ区切りの第2フィールドを降順でソートするとき
vimで簡単にインクリメント

## はじめに

vimでインクリメント、連番を簡単に入力出来たらな。って思った事はありませんか。
私は、IPアドレスを連番で入力している時にふと思いました。
そこで、vimのマクロ機能を使えば出来る事が発覚。
早速やってみました。

## 目標

```
192.168.1.1
```

これだけが入力された状態で、各行にIPアドレスが入り、`192.168.1.225`までの連番を登録出来るようにしてみます。

## マクロの登録

vimは、 `q` の後にアルファベット1文字で、マクロを記録するモードに入ります。
今回は、`a`という文字に対して登録してみようと思います。
マクロに登録する内容としては、下記のようにしてみます。

* １行をコピーして、次の行に貼り付ける -> `yyp`
* 貼り付けた文字列の行末に移動 -> `$`
* 数字をインクリメントする -> `Ctrl+a`

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/23276/9e910151-a7d1-3fa5-9c58-6aee8d8fa7f2.gif)

## マクロを使って、255までを入力してみる

登録したマクロは、`@+[アルファベット]`で利用可能です。
`[アルファベット]`の部分はマクロを登録するときに指定した、`q`の後に押した文字になります。
今回は、`qa`と入力したので、`@a`と入力すれば、インクリメントされた番号が次の行に貼り付けられます。

### マクロは繰り返して使える

`@a`と入力すると、登録されたマクロを実行しますが、`[数字]@a`(例えば、`5@a`)のようにすると、数字で指定した回数分が連続して実行されます。

## 目的を果たして見る

さて、では最初に目標としていた、`192.168.1.1`だけ入力された状態から、`192.168.1.225`までコピペを実現してみます。

コマンドとしては、`192.168.1.1`の行で、`254@a`とすれば良さそうです。

↓は実際に実行してみた結果です。

![test2.gif](https://qiita-image-store.s3.amazonaws.com/0/23276/a96c85db-0bb3-591a-adbe-5b8d47d21f7f.gif)
iOS端末で設定されている言語を習得する(swift)

ユーザーがiOS端末で利用している言語情報を取得する方法。
![Screenshot 2015-12-29 13.49.32.png](https://qiita-image-store.s3.amazonaws.com/0/37860/a2708c59-b27c-82aa-c8d9-a7566547beb7.png)
設定画面からこんな感じで使用言語を設定することができます。
このユーザーは日本語>イギリス英語>アメリカ英語の順で言語登録をしています。
この情報をアプリ内で取得するためには

```swift
  NSLocale.preferredLanguages() // ["ja-JP", "en-GB", "en-JP"]
  NSLocale.preferredLanguages().first // "ja-JP"
```
みたいな感じでOKです

あとは設定されている言語に応じて文章を英訳したりすればうまくいくはずです。
問題は、設定されている言語に応じてすべての文章を翻訳しなければいけないということなのですが、毎回if文を書くわけには行かないんですよね。そのための解決策を調査中です。
Mac OS X で Tar コマンドを使うときに役に立つオプション



## 圧縮

### 基本

Mac のシステムファイルを除いて圧縮する

```
tar cfvz [ファイル名].tgz --exclude='*/.*'  [圧縮フォルダ]
```

### メッセージ要らない時

Mac のシステムファイルを除いて圧縮する

```
tar cfz [ファイル名].tgz --exclude='*/.*' [圧縮フォルダ]
```


## 解凍

### 基本

```
tar xvf [ファイル名].tgz
```

#### メッセージが要らない時

```
tar xf [ファイル名].tgz
```


参考：[覚えておきたい TAR などの解凍・圧縮コマンドの使い方まとめ](http://tukaikta.blog135.fc2.com/blog-entry-223.html)

## システムファイルを削除

間違ってシステムファイルを入れちゃった場合

```
cd [ディレクトリの親に移動]
find ./ \( -name ".DS_Store" -or -name "._*" \) -print -exec rm {} ";"
```

参考：Macで不要なファイル（.DS_Storeや._~）を削除する - 林檎な日々
http://d.hatena.ne.jp/kacchi0516/20121025/1351168388
jqとかpecoとか入れるワンライナー

コピペ用メモ

```bash:install-jq.sh
curl -sL "$(curl -sL https://api.github.com/repos/stedolan/jq/releases/latest | egrep -o 'https://github.com/stedolan/jq/releases/download/.*/jq-linux64')" |
sudo install /dev/stdin /tmp/jq &&
sudo mv /tmp/jq /usr/bin/
```

```bash:install-peco.sh
curl -sL "$(curl -sL https://api.github.com/repos/peco/peco/releases/latest | egrep -o 'https://github.com/peco/peco/releases/download/.*/peco_linux_amd64.tar.gz')" |
sudo tar xz \
  -C /usr/bin/ \
  --strip=1 \
  '*/peco' \
  --no-same-owner \
  --no-same-permissions
```
Raspberry Pi 2 Model Bのインストール(MAC母艦)


自分の備忘録として本体の入手から初期設定までに参考にさせていただいたURL等をまとめておきます。

1. 本体の入手
現在ニューヨークに住んでいるため、マンハッタンにあるTINKER SPHEREで以下のStarter Kitを購入
http://tinkersphere.com/raspberry-pi-boards/775-raspberry-pi-2-starter-kit-raspberry-pi-included.html

2. イメージの入手及びイメージファイルの書き込み
元々StarterKitのMicroSDの中にNOOBSが入っていたが、2015/12/28現在で最新版のRASPBIAN JESSIE 2015-11-21をダウンロード
https://www.raspberrypi.org/downloads/raspbian/
ダウンロード後、ttyokoyamaさんの投稿を参考にイメージファイルをMicroSDへ書き込み
http://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09

3. SSHでの接続
StarterKitにはWirelessのKeyboardとTrackPadもあったが、今後の作業のしやすさなどを考えてSSHで繋げられるようにしておく。今回はJessieをインストールしたのでAvahi（avahi-daemon）がデフォルトで有効になっているとのことなので以下の方法で簡単に繋ぐことが出来ました。
http://makezine.jp/blog/2015/12/raspberry-pi-zero_in_frisk.html
また、VNCも以下を参考に設定
http://d.hatena.ne.jp/pasela/20121225/raspi_vnc

4. Raspberry Pi初期設定
以下のページを参考に設定
http://news.mynavi.jp/articles/2014/08/13/raspberry-pi/002.html
petalinux / microzed > J. boot processとfile

自分の過去メモより

[Zc702+Boot+From+Flash](http://www.wiki.xilinx.com/Zc702+Boot+From+Flash) (<font color=red>obsolete : DO NOT USE</font> とあるので、あくまで参考情報として)
 
ROMから起動jして、以下の種類のファイルを順次読み込む

- FSBL – fsbl.elf
- bitstream – pl.bit
- U-boot – u-boot.bin
- Linux Kernel – zImage / uImage
- device tree blobs – devicetree.dtb
- RAM disk – ramdisk8M.image.gz
petalinux / microzed > I. QSPIの復旧方法 (microSD使用)

自分の過去メモより

ブート可能なmicroSDで起動する
以下のコマンドを実行して、flashの書き換えを行う

```bash
$flashcp -v /mnt/boot.bin /dev/mtd0
$flashcp -v /mnt/uImage /dev/mtd1
$flashcp -v /mnt/devicetree.dtb /dev/mtd2
$flashcp -v /mnt/uramdisk.image.gz /dev/mtd3
$flashcp -v /mnt/system.bit.bin /dev/mtd4
```

[このページ](http://zedboard.org/support/design/1519/10)にある 「Open Source Linux In System QSPI Programming Tutorial」で取得できるzipファイルの中に上記に使うファイル群が含まれる。
CocoaControlsへの投稿まとめ

#CocoaControlsとは？
iOSやOSXのカスタムビューを公開する場所です。
https://www.cocoacontrols.com
このエントリでは、cocoapods/carthage/Appetize.ioの設定をしたのちcocoaControlsに投稿する方法をまとめています。

#プロジェクトの作成
ここでは例として、「SQProgressView」というカスタムビューを作ってみることにします。
UIProgressViewは角に微妙な丸みがあるため、それを無くしたプログレスビューです。
<img width="644" alt="スクリーンショット 2015-12-28 18.21.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/15c95577-66e3-750e-662f-e44a2fc582ad.png">
OSSを作るときはあくまで他人が使う事を十分に考慮して作ると良いです。
命名規則やメソッドの使い方等も書き込むと良いでしょう。（そういう意味では上の例は優しく無いです）

#ライセンスを決めよう
配布する側も使う側もライセンスがあると安心できます。
iOSではMITが多いようですが、必要に応じてライセンスを決めましょう。

#cocoapodsの設定
cocoaPodsでプロジェクトを導入出来るようにしておくと使う側も使いやすいです。

##雛形の生成
```:terminal
$ pod lib create SQProgressView
What language do you want to use?? [ ObjC / Swift ]
$ Swift
Would you like to include a demo application with your library? [ Yes / No ]
$ Yes
Which testing frameworks will you use? [ Quick / None ]
$ None
Would you like to do view based testing? [ Yes / No ]
$ No
```

これでcocoapodsの雛形が生成されます。

##ファイルの配置
SQProgressView/Pod/Classes/
に先ほど作った.swiftファイルを配置します。
アセットがあればSQProgressView/Pod/Assetsに配置しましょう。
また、SQProgressView/Pod/Classes/ReplaceMe.swiftは不要なダミーファイルです。消してしまってOKです。

##サンプルを書く
SQProgressView/Example 
でpod installすると、先ほど配置したファイルを取り込んでworkspaceが出来ます。
ワークスペースを開いて、サンプルを書きましょう。
あくまで使い方にフォーカスしてシンプルなものが良いと思います。

#github

##push
githubでリポジトリを作ってプッシュします。

##tag

`$ git tag 0.1.0`
githubのサイトでプッシュしたコミットに対して、タグを作ります。

#cocoapodsの設定続き

##podspecの編集
/SQProgressView.podspecを編集します。
* s.version `上記で指定したtagバージョン`
* s.summary `デフォルトのままだとNG。ちゃんと書く`
* s.description　`<<-DESCとDESCの間にMarkdownを書く`
* s.license `先ほど決めたライセンス`
* s.homepage　`自由　デフォルトではgithubのURL`
* s.author　`確認`
* s.source `githubのgitURL`


##チェックする
`$ pod spec lint --verbose`
`$ pod lib lint --verbose`

##cocoaPodsサーバーへアカウントの登録
`$ pod trunk register 自分のメール '自分の名前' --description='hoge'`
`$ pod trunk me`
登録出来ているか確認

##cocoaPodsサーバーへリポジトリの登録
`pod trunk push SQProgressView.podspec`

#Carthageの設定
cocoapodsの設定で行われているので特に無し（タグとか指定した部分がそれです）
`carthage build --no-skip-current`
で確認だけしておきましょう。

#README.mdを書く
使い方とpodとcartageが使える旨を記述しましょう。
`vim Podfile`
`pod "SQProgressView"`
`pod install`
や
`vim Cartfile`
`github "noppefoxwolf/SQProgressView"`
`carthage update`
でいいかと思います。

#Appetize.io
Appetize.ioはweb上でシミュレータが使えるサービスです。
CocoaControlsではAppetize.ioのpublickeyを指定するとリポジトリの詳細画面でシミュレータを使って動作を見ることができます。

##準備
一度シミュレータでビルドする

##アップロード
https://appetize.io/upload
へアクセスし、
~/Library/Developer/Xcode/DerivedData/<project-name>/Build/Products/Debug-iphonesimulator/<project-name>.app
をアップロード
メアドを入力してpublic key取得します。

#cocoaControlsに公開する
https://www.cocoacontrols.com
へアクセスし、submit a new controlsからgithubのリポジトリのアドレスを入力します。
リポジトリの詳細入力画面になるので、
Appetize.io public keyからpublic keyを入力
必要項目を入力してCreate Controlを押します。
Upload Control Imagesから一枚スクリーンショットをアップしてHighlight imageにチェックを入れます。（この画像が一覧に出る）

#審査機関
しばらく（１〜２週間くらい）待つと審査を通過していれば一覧に並びます。

<img width="1172" alt="スクリーンショット 2015-12-29 12.28.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/e0baa723-1116-a317-55cb-0ccee636cefe.png">


皆さんも是非CocoaControlsに公開してみましょう。
プルリクエストやスターが活発になりますよ…！
SIerの単体テスト

違うところもあると思いますが、SIerは、単体テスト仕様書を書かせる。
エビデンスとしてスクリーンショットを取らせる。
junitとかあるのに。
二度手間。三度手間。
単体テスト仕様書は単体テストのコード見てほしい。
エビデンスなんていらんでしょ、単体テストのコード実行してください。
単体テストのコード見ても分からないっていうなら、スクリーンショット見て何が分かるというのか。単なるprintを実行して、スクリーンショットを取っただけかもしれないのに。
そういう無駄な作業をやらせるところに限って、改善とか品質とか言う。
2015年に勉強してよかったことと2016年学ぼうと思っていること

# 2015年度勉強してよかったこと

今年も無事エンジニアとして仕事も納まり、いろいろ勉強できたしいろいろなものをつくれたので振り返ってみる。

 - Fabric
 - iOSのCI/UIテスト
 - 画像処理・音声処理
 - スクラム
 
## Fabric

[今日からすぐに使えるデプロイ・システム管理ツール Fabric 入門](http://shiumachi.hatenablog.com/entry/20130414/1365920515)

Fabricはpythonでタスクを記述できる構成管理ツールです。
最近だとAnsibleのほうが注目されてる気もしなくはないですが、
自分としてはPython触れたのもあってFabricでよかったと思います。

[インフラ系技術の流れ](http://mizzy.org/blog/2013/10/29/1/)
ここ数年そもそも思想としてインフラ周りはだいぶ進化してきていて、せっかくインフラ・運用の仕事をやらせてもらえたので「なんでも自動化おじさんになろう・・・」と思っていろんな作業を自動化したり
ツールを作りました。

[自動化のその前に](http://www.slideshare.net/hayabusa333/ss-43842864)
そこで本当に**自動化**の難しさを体感しました、このスライドにあるような**本当に必要な自動化とは何か？オペレーションをどう効率化するか？何から自動化すると効果があるのか？またツールを作ってどう使ってもらうのか？**などなど考えることはめちゃめちゃ多くて、おそらくどんな業種になろうと発生する作業というものへの考え方を変えるいい機会になりました。

## iOSのCI/UIテスト

恥ずかしながらテストコードってちゃんと書いたことなかったんですが、人数の多いアプリ開発では書かないとダメだなぁと思い勉強しました。テストの書き方、そもそもの書く意味、書いたものをどう活用していくか・・・アプリのCI環境を作るという貴重な経験もできました。

[予定がないのでiOSにおけるユニットテストについてまとめる その１](http://qiita.com/jumbOS5/items/3dcf051061fcf576dcd0)
[予定がないのでiOSにおけるユニットテストについてまとめる その２](http://qiita.com/jumbOS5/items/93233fbdadf6abe58300)

## 画像処理・音声処理
[Attention](http://mashupaward.jp/2015/11/2ndbattle_2/)
[Climix](http://hacklog.jp/works/3379)

MashUpAward2015に2作品を出して、どちらも賞をいただけました。 :pray:
大学院で勉強していた画像処理、信号処理が実はすごく嫌いだったんですよね・・・面白くないんですよ。画素をいじくりまわして数列を見続けるのは・・・

だからこのプロダクトを作るときも躊躇ったんですが、改めて「こういうプロダクトを作りたい」「こんなアレンジができる」というのが頭にある状態で触ってみると超おもしろいんですよね。ノイズ削除とか文字抽出とか枠線検出とか、アプリに落とし込めてアプリエンジニアになってよかったなぁと思いました。

## スクラム
いろんな会社でいろんなプロジェクトに入ってきましたが、本で読んだスクラムを体験出来る環境っていままでなぁったなぁと。改めてやってみるとやっぱこれも難しいんですよね。
スプリントレビューとかベロシティとか、いろいろと泥臭いことだらけなんですよね・・・
スクラムという開発自体、またその中でどうプレゼンスを出していくのかというのを人生で初めて考えました。

# 2016年学ぼうと思っていること

- 機械学習
- スクラム
- CI/CD


## 機械学習

いろいろ勉強しないでおこうと思ったものの1つでしたが、後輩がさくっと使っているのを見て「あ、イケる」と思ったんですよ。どっかのハッカソンで積極的に使いたい。
[機械学習をこれから始める人に押さえておいてほしいこと](http://qiita.com/IshitaTakeshi/items/4607d9f729babd273960)

いろいろなアルゴリズムを組み合わせていてるし、アルゴリズムの勉強にもなりそうだ（安直）
今年は画像処理・音声処理で経験したように、作るものベースでそれに必要な技術として学ぶのであればそんな苦じゃない。

## スクラム
引き続きメンバーとして学んでいく。
ただ実行するだけでなくチームのマインド、成果を向上させていけるような働きかけをバンバン実行していきたい。そのためには何が必要か、難しいけど泥臭くやっていこうと思う。

## CI/CD
アプリではCircleCIとかfastlaneなどのいろんなツールとかサービスが出てきてwebだけじゃなくてアプリの開発も変わってきています。いろんなツールを内製することに注力しすぎて、トレンドの技術や仕組みをおろそかにしないよう勉強しようと思います。

# まとめ

アプリだけにとどまらずいろんなレイヤーの技術やサービスに携われて非常に楽しい1年だった。2016年はもっとすごいことができるように頑張ろうと思います、仕事でも趣味開発でも楽しいお話あればお誘いください :confetti_ball:
長時間の処理スクリプトが終わったタイミングでiPhoneに通知してくれるスクリプト

#概要
長いバッジ処理などが終わったかどうかの通知って結構面倒くさくて、そもそもスクリプトに仕込んどけって話なんだけど、動かしたあとに「あ、これ結構ながいやつだ」みたいなスクリプトもあるので、

* processを監視する
* processが消えたタイミングでiPhoneに通知する
* bashでどこでも動く

みたいなのを作った。

# 事前準備
iftttのmaker channelを使っているので、iftttのアプリをiPhoneに入れて、iPhoneに通知が行くようにレシピを入れておく。

参考
http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/

# script

```
#!/bin/bash
CURL=/usr/bin/curl
IFTTT_EVENT="<your event name>"
IFTTT_KEY="<your ifttt key>"
IFTTT_URL="https://maker.ifttt.com/trigger/${IFTTT_EVENT}/with/key/${IFTTT_KEY}"
PROCESS_NAME=`cat /proc/$1/cmdline`

send_notification(){
        ${CURL} -X POST \
            ${IFTTT_URL} \
            --header "Content-Type: application/json" \
            --data-binary "{\"value1\": \"${PROCESS_NAME}\"}"
}

while true
do
        kill -0 $1 > /dev/null 2>&1
        if [ $? = 0 ]; then
                echo "alive"
        else
                echo "dead"
                send_notification
                break
        fi
        sleep 3
done
```

#起動
バックグラウンドで起動する。（digitalocean上でよく使うので、nohup入れている）

```
[root@centos-512mb-sgp1-01 ~]# sleep 30&
[1] 15619
[root@centos-512mb-sgp1-01 ~]# nohup bash ifttt.sh 15619 > /dev/null 2>&1 &
[2] 15682
```

<img width="375" alt="picture.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/36604/1585c481-1be5-6e99-9c0a-fbcbdac771ea.jpeg">

届いた。Apple watchで終了通知とか受け取ると未来感ある。
みんなどうやって編集したいソースにすばやく飛んでいるのだろうか？

[rubymine - RailwaysのEnter URL partはどうやったら出現するのでしょうか？ - スタック・オーバーフロー](http://ja.stackoverflow.com/questions/20429/railways%e3%81%aeenter-url-part%e3%81%af%e3%81%a9%e3%81%86%e3%82%84%e3%81%a3%e3%81%9f%e3%82%89%e5%87%ba%e7%8f%be%e3%81%99%e3%82%8b%e3%81%ae%e3%81%a7%e3%81%97%e3%82%87%e3%81%86%e3%81%8b)

はきっちりパスを指定しなくて、含んでいる文字を打てばジャンプ候補を出してくれるので、これで、○○の△△の□□に飛びたいと思ったら、○□△とか打っても（順不同でも）飛んでくれるようにはできたが。

SourceTreeで見つけたソースを Ctr + oで自分で打つことなく飛べるようになったらステキだし、
他にもなんかまどろっこしくてもやもやしながら編集したいソースに飛んでる....
TypeScript + mocha + power-assert で詰まった話

# 概要

こちらの記事を参考にしてテスト環境を構築していたのだが、`power-assert`のいい感じの出力が出てくれなくて悩んだ話

http://qiita.com/ConquestArrow/items/71e0313ce3eafe411a7d

# 症状

いい感じの出力をしてくれない

(`tsmocha`は`mocha --compilers ts:espower-typescript/guess $1/*Test.ts`)

![スクリーンショット 2015-12-29 11.49.16.png](https://qiita-image-store.s3.amazonaws.com/0/14939/3f047e92-2a8d-7021-c153-3322d0bb8163.png)

# 原因

テストファイルが`test/**/*.ts`に無い場合はうまくいかないぽい。(package.jsonからの相対パス)

# 解決策

**package.json**にテストディレクトリを明記する

たとえば、`sample/test`以下にテストコードがある時は下のように追加する

```
"directories": {
  "test": "sample/test"
}
```

いいかんじ（！！

![スクリーンショット 2015-12-29 11.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/14939/1e9ad506-2d87-39fd-560e-f75ac9249884.png)
Linuxで独自コマンドを作成/追加する覚書

独自のコマンドを作成/増やすときの覚書です。
私個人のやり方なので、これが最も良いとは断言できません。
助言や、おススメのシェルスクリプトあれば教えていただけると嬉しいです^^
※今後も追記/修正していく予定です。

---

# 独自のコマンドを増やす

## 下準備

独自コマンドは別フォルダにて管理したかったので、新しくフォルダを作成して環境変数に追加する。
コマンドは全ユーザーで使えるように `/etc/profile` で環境変数を追加する。
（特定のユーザーでのみ使う場合は `~/.bashrc` や `~/.bash_profile` とかに追加でいいと思います。）

```shell-session:shell
$ mkdir /usr/local/custom_command
$ vim /etc/profile
```

ファイル末尾で環境変数PATHに、先ほど作成した「/usr/local/custom_command」を追記。

```shell-session:/etc/profile
(略)
# 今回は${PATH}の末尾に追加していますが、
# 独自コマンドを優先的に使用したい場合は以下のようにしてください。
# export PATH=/usr/local/custom_command:$PATH
export PATH=$PATH:/usr/local/custom_command

```

書き終わったら、ログインしなおすか、sourceコマンドでprofileを読み直せばOK。

## コマンドを追加する

上の **下準備** にて「/usr/local/custom_command」という独自コマンドを格納する場所を作ったので
以下の手順でシェルを追加する。

```shell-session:shell
$ cd /usr/local/custom_command
$ vim cm
```

シェルスクリプトの中身を記載して、実行権限を付与する。

```shell-session:shell
$ chmod +x cm
```

これで、どこからでも独自コマンド「cm」が使えるようになっているはずです。

# 独自スクリプト（覚書）


## ファイル一覧を下階層までフルパスで取得。

※ 今後grepにも対応させようと思ってます

**実行コマンド**

- lR
現在の場所を基準に全ファイルを取得

- lR /home
指定した場所を基準に全ファイルを取得

**シェルスクリプトの中身**

```shell-session:lR
#!/bin/sh
if [ ! -z $1 ]
then
  ls -Rl $1 $(find $($1) -type f)
else
  ls -Rl $(find $(pwd) -type f)
fi
```
C言語を頑張る！　02

こんにちは！

今日でやっと仕事納めだぜ、、、、なえりにゃんです。
こんな日でもプログラミングをやる！

#ストレス発散法のススメをつくった！
お金と体力のあるなしでアドバイスしますヾ(*´∀`*)ﾉ

##もんだい
以下のようなアドバイスを出力するプログラムを完成させなさい．
　　元気	　お金	　アドバイス
　　ない	　ない	　家で本でも読んで休養しましょう
　　ない	　ある	　温泉に行ってゆっくりしましょう
　　ある	　ない	　ジョギングして体を鍛えましょう
　　ある	　ある	　スキー場に行ってスノボをしよう♪

##作ってみた！
```lang:ストレス発散法のススメ
#include<stdio.h>

int main(void)
{
    int genki,okane;

    printf("\n元気は？(ある:1, ない:2): ");
    scanf("%d",&genki);
    printf("\nお金は？(ある:1, ない:2): ");
    scanf("%d",&okane);

    if((genki==1) && (okane==1)){
        printf("スキー場に行ってスノボをしよう♪\n");
    }else if(genki==2 && okane==1){
        printf("温泉に行ってゆっくりしましょう\n");
    }else if(genki==1 && okane==2){
        printf("ジョギングして体を鍛えましょう\n");
    }else if(genki==2 && okane==2){
        printf("家で本でも読んで休養しましょう\n");
    }
    return 0;
}
```

##出力結果
元気は？(ある:1, ない:2): （数値いれる）
お金は？(ある:1, ない:2): （数値いれる）
家で本でも読んで休養しましょう

##ひとこと
if　elseの条件式はかなりわかってきたかんじヾ(*´∀`*)ﾉ♪
これからもっと複雑になるんだろうなぁ。。。

#教えて下さいー！
「もっとこうしたほうがいいよ！」ってアドバイスがあれば
ぜひぜひ教えて下さいませヾ(´∀`)ﾉ♪

年末は何しようかな～～買いっぱなしで積んである本を読もうかな～　な、えりにゃんでした♪
webpackのsourcemapで日本語が文字化ける時の対処法

# はじめに
TypeScriptをwebpackでtranspileしてるんですけどsourcemapの日本語が化けてちょっと不便だったので調査しました。2015/12/29時点ではこのバグ（？）はwebpackのmasterブランチで修正されているので、正式リリース後は解決される見込みです。正式リリースまで、それ以前の方（v1.12.9時点ではアウト）の参考になればと思います。**（あるいは別の簡単な方法を知ってる人は教えて下さい）**

# 対処法
sourcemapURLを自力で置換したりとかいろいろと方法はあるかと思いますが、考えるの面倒ですし、修正方法も[このPR](https://github.com/nilennoct/webpack/commit/af4c2e88c04df94d47057a667e682cb1e8c76a32)に書いてあるので、ソースをいじっちゃいます。

いじるのはwebpackの2ファイルです。`charset=utf-8`を追加すればOK。

```diff:lib/EvalSourceMapDevToolModuleTemplatePlugin.js
  		}
 		sourceMap.sourceRoot = "";
 		sourceMap.file = module.id + ".js";
-		var footer = self.sourceMapComment.replace(/\[url\]/g, "data:application/json;base64," + new Buffer(JSON.stringify(sourceMap)).toString("base64"));
+		var footer = self.sourceMapComment.replace(/\[url\]/g, "data:application/json;charset=utf-8;base64," + new Buffer(JSON.stringify(sourceMap)).toString("base64"));
 		source.__EvalSourceMapDevToolData = new RawSource("eval(" + JSON.stringify(content + footer) + ");");
 		return source.__EvalSourceMapDevToolData;
 	});
```


```diff:lib/SourceMapDevToolPlugin.js
  							return JSON.stringify(sourceMap);
 						})
 						.replace(/\[url\]/g, function() {
-							return "data:application/json;base64," +
+							return "data:application/json;charset=utf-8;base64," +
 								new Buffer(JSON.stringify(sourceMap)).toString("base64");
 						})
 					);
```

これでとりあえずは文字化けしなくなります。筆者はほぼ一人で使ってるので良いんですけど大規模チームとかで使ってる人には向かない方法でしょうね。。。ただ、正式リリースは近いはず！（たぶん）
VyOSをVirtualboxへインストール

#やりたいこと
Debian LinuxをベースとしたオープンソースOSのVyOSを自分のPC上で稼働させたいと思います．
クラウド上のVyattaの設定をする前に自分の環境でいろいろ試してみる用です．

#isoファイルのダウンロード
こちらからisoファイルをダウンロードします
http://vyos.net/wiki/Main_Page

今回は「Physical and virtual 64-bit」を選択します
http://mirror.vyos.net/iso/release/1.1.6/vyos-1.1.6-amd64.iso
<img width="1267" alt="スクリーンショット 2015-12-29 13.25.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/525c499f-8ef0-f8d3-1949-c0df14957a3a.png">

サイズは約250MBくらいです
推奨システム要件は「512MB RAM and 2GB storage」なのでVirtualBoxにはこれを指定してあげれば大丈夫です

#Virtualboxへのインストール
新規から「Linux-Debian-64bit」を選択し、isoから起動させます
username:vyos
password:vyos
でログインします

インストールには「install image」「install system」の２つのコマンドがありますが、「The image install is the recommended installation method for VyOS」とあるので
install imageを実行して、インストールします
（詳しくは http://vyos.net/wiki/User_Guide#Installation を参照）
Continue? (Yes/No) [No]: Yes　←他はenterで問題ないですが、これだけは入力しましょう

インストールができたら、poweroffし、isoをアンマウントして再度起動すると、VyOSが起動します
<img width="698" alt="スクリーンショット 2015-12-29 13.33.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/31431038-adf6-dfa0-c60e-a397bca77c47.png">


試しに
show configrationと打つと設定一覧が表示されます
pwdと打つと「/home/vyos」と表示されます
find / -name ‘* *easy-rsa* *’と打つとOpenVPN関連のフォルダがあることも確認できます
<img width="455" alt="スクリーンショット 2015-12-29 13.44.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/671fe6d5-75ae-6ef4-879c-82b6ad7700e8.png">

cdやlsコマンドも普通のLinux同様に使えますね

参考リンク
http://fujitea.no-ip.info/?p=716
Babunの設定で困ったことのメモ

自分用のメモです。
普段Mac使ってるんだけど、しばらくWin使うことになって、
ターミナル整えなきゃなーってなったんだけど、
さすがにコマンドプロンプトとか使いたくないし、zshの恩恵にあやかりたい。なんかないかなーって探してたら、Babunとかいうのがあるらしい。zshも入ってる。

ダウンロードして、解答して、バッチファイル実行したらダーッとなんかが実行されて無事インストール完了。

さてPythonだ。pipだ。まずはez_install.pyだ。

って息巻いてたんだけど、

ホームディレクトリがおかしい。

しかもCドライブ直下に行けぬ。

調べてみたらBabunのホームディレクトリは`C:\Users\ユーザ名\.babun\cygwin\home\ユーザ名\`らしい。意味がわからん。

Cドライブ以下にアクセスするためには`/cygdrive/c`にアクセスする必要があるらしい。
ふーん。

mklink叩けって言われたけど、コマンドプロンプトを管理者権限で実行して～とかめんどくさかったので、`C:\Users\ユーザ名`のフォルダへのショートカット作って`C:\Users\ユーザ名\.babun\cygwin\home`にコピーした。

シンボリックリンクって要はそういうことでしょう？

無事Cドラ以下に行けるようになったのでこれでよしとする。

cygwinはクソとかよく言われてるけど、よくわからないのでBabunを選んだけど、ちょっとめんどくさかったのでちょっとヘイト溜まった。

参考ブログとか、Babunについては後で編集。
vimでMakefileだけTabスペースではなくTabとして入力する

### はじめてのキータ　。ω。ﾄﾞｳﾓ

# Makefileで少し躓いたのでメモしておきます
Makefileでは

```Makefile.make
main: main.cpp
[ tab ]g++ main.cpp
```

みたいに[tab]の部分はTab入力でないと機能しません
.vimrcの設定で`set expandtab`をしていると躓きます、ω、

## 解決方法1
`<C-v> tab`を使用する
controll + v のあとにtabキーを押します
すると普通のtabが入力されます

# 修正 2015/12/30
前の方法だと他のファイルに影響してたので修正しておきます
## 解決方法2
上の方法だと毎回`<C-v>`しないといけないので面倒くさいです
なので.vimrcで設定をしてあげます
編集中のファイルが'Makefile'という名前だったら
noexpandtabします

```*.vimrc
let _curfile=expand("%:r")
if _curfile == 'Makefile'
  set noexpandtab
endif
```

自分はmakefileって名前がいい！
って人は
`'Makefile'`の部分を`'makefile'`に変更すればうまくいきます、ω、
outlook 2013 > 返信時に添付ファイルが見えない > 実際には添付されている [未解決]

```txt:動作確認
Outlook 2013 on Windows 8.1 pro
```

1. メール返信をはじめる
2. エクスプローラからファイルをドラッグして添付する
3. 添付状態が見えない
4. メール送信
5. 送信済みメールを見るとファイルが添付されている

通常はメール返信時に「添付ファイル」という項目が見えるのだが、見えない状態になっているPCがある。

同じOSと同じバージョンのOutlookでも「添付ファイル」が見えるPCと見えないPCがあり、どうもよくわからない。

未解決。
カスタムキーボードのプライマリビューは self.inputView


KeyboardViewController には ``self.view`` があるからずっとそちらを使っていたけど、 ``self.inputView`` らしい。

[Custom Keyboard](https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html)

>Add objects such as views, controls, and gesture recognizers to the input view controller’s primary view (in its inputView property), as suggested in Figure 11-1.

``inputView`` にボタンやラベルを ``addSubview``  するようにしよう。
Classic ASPでAjax

昔やってたClassic ASPの案件を思い出してるうち、「あーあれAjaxでやれたらもっとシンプルになったんじゃないかなー」などと思ってしまい、Classic ASPでAjaxをやる方法を調べた。

# フロントサイドのコード

`index.asp`にアクセスしたらHTMLとJSを出力します。

```lang:index.asp
<%@ LANGUAGE="VBScript" %>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="shift_jis">
    <title>Document</title>
</head>
<body>
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script src="./index.js"></script>
</body>
</html>
```

`index.js`からjQueryのajaxを使ってGETを投げています。POSTも同様にできるかと思います。

```lang:index.js

(function(){
    $ = window.$;
    
    $.ajax({
        type:"GET",
        url: "ajax.asp",
        dataType: "json",
        data: {name: "Hoge"}
    }).done(function(msg){
        document.writeln(Object.keys(msg) + ": " + msg.name);
    });
}());
```

# サーバーサイドのコード

`Response.Write`でJSONを出力します。
なお、JSONは文字列を整形して無理やりJSON形式にするしかなさそうです。
POSTのときは`Request.QueryString`ではなく`Request.Form`になります。

```lang:ajax.asp
<%@ LANGUAGE="VBScript" %>
<%
    Response.ContentType = "application/json"
    Dim ret
    If(Request.QueryString("name") = "Hoge") then
        ret = "{""name"": ""Huga""}"
    End If
    Response.Write(ret)
%>
```

# まとめ

Classic ASPでのAjaxの実現方法でした。使う機会はおそらくないでしょう。
電子工作 > 多回転半固定ボリューム / サーメットトリマ > 3296W 5kΩ (W502) > Shaft / 特性

入手した。
http://akizukidenshi.com/catalog/g/gP-00974/

フォトトランジスタのI-V変換に使う。感度調整ができるようになるはず。

## お試し

ブレッドボードに挿して、以下のようにデジボルで抵抗値を測定した。

1. ピン1 : デジボルのΩ表記につなげたテストリードを接続
2. ピン2 : デジボルのCOM表記につなげたテストリードを接続

ピン配置は以下の右上（標準抵抗値値の上の図）参照
http://akizukidenshi.com/download/3296W-1-103.pdf

この状態で金色の小さい何かを変更することで、ほぼ0から5kΩになることを確認。

また、ピン１をピン３につなぎ変えたら、補数(5から引いた値）の抵抗が見られた。

### シャフト
金色の小さい何かの名称

以下には「シャフト Shaft」と記載がある。
http://www.globahanbai.jp/product/products-1/RJ-9.pdf

### 特性

参照: 4年前に買ってぼちぼち読んできたMook（トランジスタ技術SPECIAL for フレッシャーズ No.102 抵抗 & コンデンサ活用ノート)

サーメット多回転トリマについて以下のように記載がある

> 抵抗素子にメタル・グレーズを使っているので、安定性、耐候性に優れる. ...定格電力 0.5W ...

定格電力0.5Wがひっかかる。今やろうとしていることにきちんと使えるのだろうか。
技術英語 > I'm about to [commit a direct violation of our orders]. Any of you who wish to object it, do so now. It will be noted in my log.

@ Star Trek movie > First Contact

http://qiita.com/drafts/9c37bfb711e40f355fe3
において艦隊から戦闘に加わることを許可されてないEnterprizeのクルーたち

仲間の艦がボーグに駆逐されていく状況の中、ピカード艦長が決断をして

> I'm about to <font color=red>commit a direct violation of our orders</font>. Any of you who wish to object it, do so now. It will be noted in my log.

字幕では以下になっていた

> 私は今から指令を破る。異議ある者は言え。

It will be noted in my log (艦長日誌に記録される）という訳は省略されている。

通常、何か問題のある行動をするとき、後々の軍法会議のために異議はきちんと記録されるという軍隊的なものが字幕では（視聴者が字幕を読む時間が短いため）記載されない。

<hr>
指令を破るは

> violate our orders

とできるだろうが、commitを使う方が「指令を破る」ことが強調される気がする。


<hr>
(for a change of air)

スタートレックの面白みの一つは、TNGのピカード艦長、Deep Space Nineのシスコ司令官、VoyagerのJaneway艦長、皆がここぞという時に強いリーダーシップを見せる所。
コントローラから部分テンプレートを直接呼び出す


```ruby:****_controller.rb
def index
  @timeplan = Timeplan.find(params[:timeplan_id])
  render partial: 'list', locals: { timeplan: @timeplan }, layout: false
end
```
locals: テンプレートに渡す変数
layout: レイアウトを表示するか
自分的にしっくり来たカレンダーの月ごとの色 備忘

```css
&.Jan .clndr-controls { background-color: #3b3b3b; }
&.Feb .clndr-controls { background-color: #51405d; }
&.Mar .clndr-controls { background-color: #5b7327; }
&.Apr .clndr-controls { background-color: #486140; }
&.May .clndr-controls { background-color: #28632a; }
&.Jun .clndr-controls { background-color: #588884; }
&.Jul .clndr-controls { background-color: #1c687c; }
&.Aug .clndr-controls { background-color: #253e87; }
&.Sep .clndr-controls { background-color: #676c4f; }
&.Oct .clndr-controls { background-color: #594911; }
&.Nov .clndr-controls { background-color: #3d341b; }
&.Dec .clndr-controls { background-color: #585861; }
```

<img width="504" alt="スクリーンショット 2015-12-29 4.37.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/3914/a7e15167-6815-7552-b499-90697cc2e577.png">
モーダルウィンドウからAjax処理を行う


###モーダルウィンドウからAjax処理をおこなう際にはJavascript側からbootstrapにより自動生成されたクラスを削除しなければならない。

```jquery
#下記の2つのクラスが自動生成される為、削除する
$('body').removeClass('modal-open')
$(".modal-backdrop").remove()
```
deviseのログインフォームを別のコントローラーから利用する


##例：home#indexにログインフォームを作成

###devise/sessions/new.htmlの中身を貼り付け

```html:app/views/home/index.html.erb
<h2>Log in</h2>

<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>

  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <% if devise_mapping.rememberable? -%>
    <div class="field">
      <%= f.check_box :remember_me %>
      <%= f.label :remember_me %>
    </div>
  <% end -%>

  <div class="actions">
    <%= f.submit "Log in" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>
```

このままではresourceが定義されていないのでエラーになる

###ヘルパーに以下を追加

```ruby:app/helpers/home_helper.rb
module HomeHelper
	def resource_name
		:user
	end

	def resource
		@resource ||= User.new
	end

	def devise_mapping
		@devise_mapping ||= Devise.mappings[:user]
	end
end
```
twitter-bootstrap-railsでGryphiconを表示する


```ruby:Gemfile
gem 'therubyracer'
gem 'less-rails'
gem 'twitter-bootstrap-rails'
```

###1. 公式サイトからBootstrap3のファイルをダウンロード

###2. fontsディレクトリごとvendor/assets/fontsにコピー

###3. config/application.rbにassetパスを追加

```ruby:config/application.rb
class Application < Rails::Application
	config.assets.paths << "#{Rails}/vendor/assets/fonts"
end
```

###4. CSSファイルに下記を追加

```app/assets/stylesheets/application.css
@font-face {
  font-family: 'Glyphicons Halflings';
  src: url('/assets/glyphicons-halflings-regular.eot');
  src: url('/assets/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('/assets/glyphicons-halflings-regular.woff') format('woff'), url('/assets/glyphicons-halflings-regular.ttf') format('truetype'), url('/assets/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
}
```

###5. herokuで使えるようにするためにプリコンパイルする

```config/intiarazers/assets.rb
Rails.application.config.assets.precompile += %w( *.woff *.eot *.svg *.ttf )
```

##参考
http://engineer.gahara.me/entry/2015/07/14/gem_%27twitter-bootstrap-rails%27%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%9A%9B%E3%81%ABGlyphicon%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%82%92%E8%A7%A3%E6%B6%88
日付をカレンダーから入力出来るようにする


```ruby:Gemfile
gem 'momentjs-rails'
gem 'bootstrap3-datetimepicker-rails'
```

```javascript:app/assets/javascripts/application.js
//= require moment
//= require bootstrap-datetimepicker
// 日本語化する為ja.jsを読み込む
//= require moment/ja.js
```

```css:app/assets/stylesheets/application.css
*= require bootstrap-datetimepicker
```

```****.html.erb
<div class="form-group">
	<%= tp.label :start %><br>
	<div class="input-group date datetimepicker" style="width:250px;">
		<%= tp.text_field :start, class: 'form-control', placeholder: 'YYYY/MM/DD HH:mm' %>
		<span class="input-group-addon">
			<span class="glyphicon glyphicon-calendar"></span>
		</span>
	</div>
</div>
```

```js:app/assets/javascripts/****.js.coffee
$(".datetimepicker").datetimepicker({
	# 日本語化 
	locale: 'ja'
	# 年月日を時間を横に並べる
	sideBySide: true
	# テキストフィールドの表示形式
	format: 'YYYY/MM/DD HH:mm'
	# カレンダーのヘッダーの表示形式
	dayViewHeaderFormat: 'YYYY MMMM'
	# 5分ごとに変更できる
	stepping: 5
	})
```
Rspecで複数のデータベースのレコードをテストする


例：Event(レコード)+1、Timeplan(レコード)+2、Entry(レコード)+8
を確認

```ruby:spec/feature/****.rb
expect{}.to change(Event, :count).by(1).
and change(Timeplan, :count).by(2).
and change(Entry, :count).by(2*(3+1))
```
Google Maps APIを使う


```js:map.js.coffee
# geocoderのインスタンス化
geocoder = new google.maps.Geocoder()
# geocodeメソッドを実行
geocoder.geocode { 'address': '静岡' }, (results, status)->
	# ステータスが正しかった場合
	if (status == google.maps.GeocoderStatus.OK)
		# 緯度経度取得
		latlng = results[0].geometry.location
		# オプションの設定
		options = { zoom: 15, center: latlng }
		# マップの表示
		map = new google.maps.Map(document.getElementById('map'), options)
	# エラーが発生した場合
	else
		console.log('マップを取得できませんでした')

```
Rspecでdeviseでログイン状態を作る


## FactoryGirlでUserモデル(devise)のファクトリを追加

```ruby:spec/factories/user.rb
FactoryGirl.define do
	factory :user do
		username "Johney"
		sequence(:email) { |n| "johney#{n}@test.com"}
		password "password"
    password_confirmation "password"
	end
end
```

##ログイン状態を生成

###コントローラースペック

```ruby:spec/controllers/xxxxx.controller_spec.rb
before do
  # ユーザー作成
  @user = create(:user)
    
  # サインイン
  sign_in @user
end
  
after do
  # サインアウト
  sign_out @user
end
```

###フィーチャスペック

```ruby:spec/features/xxxxx.spec.rb
require 'rails_helper'

feature 'feature' do

	scenario "scenario" do

		user = create(:user)

		visit root_path

		click_on 'Log in'
		find('#login_view').fill_in 'Email', with: user.email
		find('#login_view').fill_in 'Password', with: user.password
		click_button 'Log in'

		visit root_path
		
	end
	
end
```

##参考
http://ayaketan.hatenablog.com/entry/2014/06/03/211110
FactoryGirlで関連名を別名参照しているアソシエーションを作る


```ruby:app/models/user.rb
class User < ActiveRecord::Base
	has_many :created_events, class_name: 'Event', foreign_key: :owner_id
end
```

```ruby:app/models/event.rb
class Event < ActiveRecord::Base
	belongs_to :owner, class_name: 'User'
end
```

以下の例はEventオブジェクトを生成する際に関連するUserオブジェクトも生成する

assosiation :関連名, factory: :ファクトリ名

```spec/factories/event.rb
FactoryGirl.define do
	factory :event do
		title "タイトル"
		message "メッセージ"
		association :owner, factory: :user
	end
end
```

```spec/factories/user.rb
FactoryGirl.define do
	factory :user do
		username "Johney"
		sequence(:email) { |n| "johney#{n}@test.com"}
		password "password"
    	password_confirmation "password"
	end
end
```

##参考

http://shim0mura.hatenadiary.jp/entry/2014/06/29/002102
http://qiita.com/cooltiger/items/29d130584c97e647d845
JavaScriptからRailsのアクションを呼び出し


ブラウザからイベントが発生した際にコントローラーのアクションにアクセスする方法

```ポイント
・URLはroutesのURI Patternの部分
・dataで通信先に渡されたパラメータはparams[]で取得できる
```

##参考
http://qiita.com/somewhatgood@github/items/113773747a6faa800366
ページネーション機能の実装


##同期通信でページネーションを実装する

###kaminariをインストール

```ruby:Gemfile
gem 'kaminari'
```

```bash:ターミナル
$ bundle install
```

###各モデル上でpageとperのメソッドを使う

```ruby:app/controller/events_controller
class EventController < ApplicationController
  PER = 10
  
  def index
  	@events = Event.page(params[:page]).per(PER).
  	  where('start_time > ?, Time.zone.now).order(:start_time)
  end
  
end
```

###ビューでページネーションを表示

```html:app/view/events/index.html.erb
<div class="page-header">
  <h1>イベント一覧</h1>
</div>
<div class="list-group">
  <% @events.each do |event| %>
    <%= link_to(event, class: 'list-group-item') do %>
    <h4 class="list-group-item-heading>
      <%= event.name %>
    </h4>
    <p class="list-group-item-text">
      <%= event.start_time.strftime('%Y/%m/%d %H:%M') %> - <%= event.end_time.strftime('%Y/%m/%d %H:%M') %>
    </p>
  <% end %>
  
  <%= paginate @events %>
</div>
```

\<%= paginate @events %>を追加するとページネーションが表示される
ページを更新するとURLのクエリにpage(デフォルト)が表示される

###クエリ名を変更したい場合は、param_nameオプションを追加

```
<%= paginate @events, param_name: :event_page %>
```

##非同期(Ajax)でページネーションを実装する

###remoteオプションを追加

```html:app/view/events/index.html.erb
<div id="event_list">

<div class="page-header">
  <h1>イベント一覧</h1>
</div>
<div class="list-group">
  <% @events.each do |event| %>
    <%= link_to(event, class: 'list-group-item') do %>
    <h4 class="list-group-item-heading>
      <%= event.name %>
    </h4>
    <p class="list-group-item-text">
      <%= event.start_time.strftime('%Y/%m/%d %H:%M') %> - <%= event.end_time.strftime('%Y/%m/%d %H:%M') %>
    </p>
  <% end %>
  
  <%= paginate @events,remote: true %>
</div>

</div>
```

###JSファイルを作成する

```ruby:app/controller/events_controller.rb
class EventController < ApplicationController
  PER = 10
  
  def index
  	@events = Event.page(params[:page]).per(PER).
  	  where('start_time > ?, Time.zone.now).order(:start_time)
  	end
  	
  	respond_to do |format|
      format.html
      format.js
    end
  end
end
```

AjaxはデフォルトでJSのテンプレートを表示する

```jquery:html:app/view/events/index.js.erb
$('#event_list').empty();
$('#event_list').html(
	"<%= escape_javascript(render 'events_view') %>");
```

```html:app/view/events/_events_view.html.erb
<div class="page-header">
  <h1>イベント一覧</h1>
</div>
<div class="list-group">
  <% @events.each do |event| %>
    <%= link_to(event, class: 'list-group-item') do %>
    <h4 class="list-group-item-heading>
      <%= event.name %>
    </h4>
    <p class="list-group-item-text">
      <%= event.start_time.strftime('%Y/%m/%d %H:%M') %> - <%= event.end_time.strftime('%Y/%m/%d %H:%M') %>
    </p>
  <% end %>
  
  <%= paginate @events,remote: true %>
</div>
```

index.html.erbも同じコードなので部分テンプレート化出来る

```html:app/view/events/index.html.erb
<div id="event_list">

<%=render 'events_view' %>

</div>
```

##Bootstrapで表示

```ruby:Gemfile
gem 'kaminari-bootstrap'
```

```bash:ターミナル
$ bundle install
```

##日本語化

```yml:config/locales/kaminari_ja.yml
ja:
  views:
    pagination:
      first: "&laquo;"
      last: "&raquo;"
      previous: "&lsaquo;"
      next: "&rsaquo;"
      truncate: "&hellip;"      
```

##参考

https://github.com/amatsuda/kaminari
Macの濁点や半濁点を変換する（C#）

Macのファイル名とかは、濁点・半濁点が不自然になっています。
それはUTF8-MacとかNFDとかと呼ばれているらしいです。
C#では、以下のメソッドを使って通常の表記（NFC）に変換することができたり、NFCかを判定することができるみたいです。

プログラム
===

NFCに変換：

```csharp
var converted = "ぱぴぷぺぽパピプペポ".Normalize();
```

NFCかどうかを判定：

```csharp
var isNfc = "ぱぴぷぺぽパピプペポ".IsNormalized();
```

NormalizationForm 列挙体
===
上述のようなNFDからNFCへ変換ばかりでなく、NormalizationForm 列挙体を使えばNFDへの変換やNFDかの判定が行えるようです。

参考文献
===
- String.IsNormalized メソッド  (System) https://msdn.microsoft.com/ja-jp/library/vstudio/system.string.isnormalized(v=vs.100).aspx
- String.Normalize メソッド  (System) https://msdn.microsoft.com/ja-jp/library/vstudio/system.string.normalize(v=vs.100).aspx
- NormalizationForm 列挙体 (System.Text) https://msdn.microsoft.com/ja-jp/library/vstudio/system.text.normalizationform(v=vs.100).aspx
- Mac OS X の NFD 問題での対策諸々：http://qiita.com/knaka/items/48e1799b56d520af6a09
- 変換のテスト：https://github.com/ssashir06/UTF8MacConvert/blob/master/UTF8MacConvert/UnitTest1.cs
Slack への Hubot 導入はじめ

導入でつまずいたので、記事で残します。

# 環境とインストールしておくツール
* windows 10
* git (version 2.6.4.windows.1)
* node.js (v5.2.0)

git は必須ではないですが、git bashから構築及び実行をしているため挙げました。
git と node.js については公式配布物から最新版をインストールでよいです。
当該環境ではインストーラによる導入をしています。

git : https://git-scm.com/
node : https://nodejs.org/

# Hubot を召喚しよう

Hubot プロジェクトの作成には、公式ドキュメントが大きな力になります。
https://hubot.github.com/docs/

召喚例として導入時の内容を以下に記述します。
環境を整えたら、まずは git bash を起動して node および npm が使えることを確認します。

```cl
$ node -v
v5.2.0
$ npm -v
3.5.2
```
npm のバージョンが確認できたら、Hubotのジェネレータをインストールします。

```cl
$ npm install -g yo generator-hubot
```

ここまでできたら、いよいよ召喚の議を行います。
召喚先のプロジェクトフォルダを作成し、Hubotをインストールします。

```cl
$ mkdir myhubot
$ cd myhubot
$ yo hubot
```
これでhubotが降臨します。
降臨中に Owner, Bot name, Description, Bot adapter の4つを聞かれるので回答します。

前者3つは自由回答でかまいませんが、adapter は slack と回答しましょう。
そうすることで slack 向けの初期設定がされます。

降臨後はコマンドで ./bin/hubot を実行し、対話を試みます。
対話では Bot name で決めた名前でよびかけます。
以下は Bot name を myhubot とした場合の対話例です。

```cl
$ bin/hubot
myhubot ping
myhubot> PONG
```
myhubot が PONG を返したので対話成功です。
インストールできたと言えます。

各コマンド実行の際に yeoman が不足しているなどの警告があれば適時インストールしてください。
自分の場合、(タイミングは忘れましたが)yeoman-doctor が欲しいと言われたので npm でインストールしました。

```cl
$ npm -g install yeoman-doctor
```

# Hubot を Slackに呼ぼう

Slack に呼ぶ方法は以下を参考にしました。
https://www.seeds-std.co.jp/seedsblog/2125.html

Slack の Costom IntegrationページでHubotを召還する準備をします。
準備は2つです。

1. Hubotを降ろすBotアカウントを追加
2. API Token を控える

Botアカウントを追加できたら、Slackでの対話をしましょう。
以下を実行して、Hubotを起こします。
xxxxxxxxxxxxxxx には、先ほどのAPI Token を置換して実行ください。

```cl
$ HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxx bin/hubot --adapter slack
```

無事実行できたら、Hubotを降ろしたアカウント宛に ping します。
PONG をリプライされれば対話成功です。

導入はじめの手続きは以上です。

今は script ディレクトリに 対話例のスクリプト example.coffee があるので、いろいろと試して遊んでこの後を考えてます。
また、実際に運用する場合はローカルではなく heroku などを使うことになるかと思います（が、まだ試していません）。


# 参考
http://qiita.com/osamunmun/items/617fe116f89cd02d4913
http://qiita.com/kmdsbng/items/fdc069048b5f0d07295e
http://memo.sanographix.net/post/88371442780
イージングの公式


```js:formula
nowValue += (targetValue - nowValue) * 0.03;
```
現在の値 += (目標値 - 現在の値) * イージング係数

![easing.gif](https://qiita-image-store.s3.amazonaws.com/0/76843/0f7c306b-26f2-50b5-6384-f126647b76c0.gif)

目的地付近に近づくにつれ減速するデモです。
(本当はちゃんとx:0の左端から発進するんですがなぜか録画うまくいかず..)


Processingのコードです。

```js:sample
float nowPos = 0;
float tagetPos = 500;

void setup(){
  size(500,500);
}

void draw(){
  background(0);
  nowPos += (tagetPos - nowPos) * 0.03;  // ここ！
  ellipse(nowPos, 200, 30, 30);
}
```
Raspberry Pi を起動した時に出てくる虹色の正方形をどうにかしたかった

結論からいうと、よく分からないので誰か教えてたもう。

```
2015/12/30 追記
raspbian の wheezy イメージを直接SDに焼いて、disable_splash=1 したらいけた。
```

# 虹色の正方形とは？
なんか、Raspberry Pi の電源を入れると出てくるアレです。
https://www.raspberrypi.org/forums/viewtopic.php?t=7486&p=92223

# カーネルのロードがおかしいのでは？
一応起動してるみたいなので、いけてると思いたい。

# /boot/config.txt いじったの？
disable_splash=1をしてるんだけど出てくる。
ちな、disable_splash=0にすると、起動後表示、その後一旦消えて、再度表示されるという状況になったので、1にすることで、一回分は効いてる模様。

# 結論
今んとこ、どうすることもできないのでそのままっす。
ofxMultiKinectV2がコンパイルエラー/ランタイムエラーを出す時の対処


[OFPlugin](https://github.com/openframeworks/OFXcodeMenu)を使うとaddonの導入が便利だけど、ofxMultiKinectV2とofxTurboJpegはプロジェクトに追加しただけだとコンパイルエラー/ランタイムエラーが出るので、その対処方法。


[ここ](https://github.com/hanasaan/ofxMultiKinectV2)に書いてある通りですが、

- `Build Phases > Linked Frameworks and Libraries`に`OpenCL.framework`を追加
- `Build Phases > Copy Files`に`libturbojpeg.dylib`を追加

これでOK。
README.mdをよく読めって話ですが、すぐ忘れるので備忘録。