MAGELLAN BLOCKS VisionAPIの結果をBQに突っ込む 3分で！ 前編

＞ [複数ファイル処理の後編もあります](http://qiita.com/atusi/items/51d0dc02c7510ed1afb4)

#下準備
### GCP

- 対象プロジェクトのサービスアカウントを作成しておく
  - JSONの秘密鍵を生成しておく。
- VisionAPIをOnにする
- bigqueryでデータセットとテーブルを作っておく > [スキーマ](https://gist.github.com/a2chub/199622451fec335d073500dcbcf2e295)はこちら 
- GCSのバケットを作成する

### MAGGELAN BLOCKS
- アカウントを作成してログイン
    - 新規登録ページ＞ [こちら](https://www.magellanic-clouds.com/blocks/)
- ボードを作成する

# マゼランブロックの設定

## ボードにGCPアカウント登録

ボード毎にGCPへのサービスアカウントを登録しておくことで、各ブロックから簡単に権限情報を利用できる。

ボード画面上の右上の `ボード設定` ボタンを押すことで設定ダイアログが開く
<img width="1035" alt="ボードsetting.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/0f445dae-4e7e-5cb4-9533-42673f68c0f3.png">

プロジェクト名を入力して、GCPコンソールからDLしたJSONファイルをアップロードする。
<img width="662" alt="GCP_serv_Acnt.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/5efc5d55-4ddf-7dbc-e5bc-5812200e9543.png">


## ブロックの配置

今回は、GCSに保存してある画像をVisionAPIに渡して結果をBQに投げるフローとなる。
使用するブロックは全部で4つ

<img width="622" alt="Blocks.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/eb012191-2917-cc53-dabb-ecca95c351b1.png">

### フローの開始
特に設定は無い。
今回の処理には関係ないが、Slackのアカウントもボードに登録してあるので、成功時、失敗時それぞれ別メッセージを自分のチームに飛ぶように設定してある。

### Vision API(汎用）
設定場所は3箇所
<img width="602" alt="VisionAPI_option.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/3bb7b1b1-5625-7c7e-76eb-08e5d9d3331a.png">

### BigQuery Insert
これも設定箇所は3箇所。簡単すぎる。

- アカウント
- データセット
- テーブル

<img width="390" alt="e0e9317b-f993-d2cd-5f45-8a24112a0416.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/49ada329-e980-424f-1b22-11ff4d22ad85.png">

### フローの完了
特に何も設定しない

<img width="394" alt="Finish_option.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/5a5be29d-1d7a-aa56-11db-3f32c1996141.png">

以上で、MAGGELAN BLOCKS 設定が完了。
ゆっくりやっても3分、なれれば30秒でイケル。

## 番外編 ブロックのつなぎ方
MB初めて触る方は、ブロック同士のつなぎ方がわからないと思います。
コツは左右を揃えて、親のブロックの下に子のブロックをそっと置く感じです。
文字でわかりにくいので動画作りました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">MAGELLAN BLOCKSでのブロック同士の繋ぎ方とリンクの切り方 <a href="https://t.co/4yf50U7JFX">pic.twitter.com/4yf50U7JFX</a></p>&mdash; a2c (@atusi) <a href="https://twitter.com/atusi/status/717677769384022016">2016年4月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


# 実行してみよう

## 手動実行編

### バケットに画像を保存する。
今回使用する画像はこちら > RG_saisyu.jpg

![RG_saisyu.jpg](https://qiita-image-store.s3.amazonaws.com/0/4036/4fb70074-3107-f579-b019-2a3aeab49e81.jpeg)

```
#gcloud cmdに プロジェクトをセットする
$ gcloud config set project <YOUR PROJECT>
$  gsutil cp  ./RG_saisyu.jpg gs://<YOUR_BUCKET>/mb_img_src/RG_saisyu.jpg
Copying file://./RG_saisyu.jpg [Content-Type=image/jpeg]...
Uploading   gs://<YOUR_BUCKET>/mb_img_src/RG_saisyu.jpg:     45.12 KiB/45.12 KiB
```

### Vision APIブロックを一時的にこのファイルを読み込むように変更する。

画像のGCS上のURLのパラーメータをアップロードしたファイルにPathに書き換える。
<img width="426" alt="VisionAPI_option2.png" src="https://qiita-image-store.s3.amazonaws.com/0/4036/c22f332d-cb26-a84f-bed1-3b80f85a0901.png">

サービスアカウントを登録しているので、画像ファイルのACLをAllUserに変更する必要はない。


### 実行するぞ！
フローの開始ブロックで再生ボタンをポチッとすると、1回実行になります。

ポチットな
動作画面はこんな感じです。最初1回失敗していますが、再度実行して2回めは成功しています。
ちょいちょい失敗することがあります。
[単発動作画面](https://dl.dropboxusercontent.com/u/71789/%E3%83%9E%E3%82%BC%E3%83%A9%E3%83%B3%E3%83%96%E3%83%AD%E3%83%83%E3%82%AFpublic/mb_visionAPI.mov)


### 結果はBQにて

Query

```
SELECT　gcs_url  , safeSearchAnnotation.adult, safeSearchAnnotation.violence
FROM [データセット.テーブル名] 
WHERE gcs_url like "gs://hoge-bucket/mb_img_src/RG_saisyu.jpg"
limit 1
```

Result

```
Row	gcs_url	safeSearchAnnotation_adult	safeSearchAnnotation_violence	 
1	gs://hoge-bucket/mb_img_src/RG_saisyu.jpg	UNLIKELY	VERY_UNLIKELY
```

アダルトと、バイオレンスの判定結果を抜いてみましたが、白でしたｗｗｗ