【ハンズオン資料】IBM Bluemix OpenWhisk もくもく会

[IBM Bluemix OpenWhisk](http://www.ibm.com/cloud-computing/bluemix/openwhisk/)のもくもく会資料。

・IBM Swift Sandbox - Xcodeをインストールせず、Swiftコードのテストが可能
　https://swiftlang.ng.bluemix.net
・IBM Swift KITURA - Swiftウェブアプリ開発プラットフォーム
　https://github.com/IBM-Swift/Kitura
・IBM Bluemix OpenWhisk
　http://www.ibm.com/cloud-computing/bluemix/openwhisk/
・IBM Bluemix OpenWhisk入門
　https://new-console.ng.bluemix.net/docs/openwhisk/index.html

# 事前準備（必ず確認してください。）
・IBM Bluemix アカウント取得。
　http://ibm.biz/bluemixfree
・CF（Cloud Foundry） CLI Install
　https://github.com/cloudfoundry/cli/releases
・Bluemix CLI Install
　http://clis.ng.bluemix.net/ui/home.html
・CLIを使う際には「pip」のインストールが必要。（Python 2.7）
　https://console.ng.bluemix.net/openwhisk/cli
・pipのインストール
　https://pip.pypa.io/en/stable/
・IBM Bluemixのリージョンや作業スペースを確認
![スクリーンショット 2016-03-25 13.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/29452/724583c9-74c3-f8a6-3327-0a1fe01f8933.png)

# OpenWhisk アーキテクチャ
今回のハンズオンでは、このアーキテクチャを元にOpenWhiskの動きを理解（把握）していきたいと思います。
IBM Bluemix OpenWhiskのTrigger, Rule, Action, Invokeの役割や関係性を理解することで、皆様の業務上もしくは個人のアプリ（サービス）とどのように連携できてどんなメリットがあるのか、何が変わるのかを話し合いながら今回のハンズオンを楽しんでいただければと思います。
![スクリーンショット 2016-04-26 15.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/29452/d9b9f7c7-9f38-f1a0-9483-0030f99e9cde.png)


# Try OpenWhisk！
![スクリーンショット 2016-04-26 1.49.52.png](https://qiita-image-store.s3.amazonaws.com/0/29452/0e3d3ab4-6d0a-3b20-28c9-dce7ab3827c0.png)

## OpenWhiskの初期画面
CLIやGUIでの開発、ログの確認、OpenWhiskについて学ぶことができる、4つのメニューがあります。
![スクリーンショット 2016-04-26 1.52.44.png](https://qiita-image-store.s3.amazonaws.com/0/29452/ab31f35d-683d-83c6-2f67-6a0056b16290.png)

#ようこそOpenWhiskへ"Hello"：CLI
下記の手順で開発環境の構築を完了しましょう。
https://console.ng.bluemix.net/openwhisk/cli

![スクリーンショット 2016-04-26 10.24.15.png](https://qiita-image-store.s3.amazonaws.com/0/29452/d3230783-faf3-f09e-34fe-367f3458d470.png)

#OpenWhiskアクションの作成
アクションとは、IBM Bluemix OpenWhisk プラットフォームで実行されるステートレスなコード・スニペットです。JavaScript 関数、Swift 関数、または、Docker コンテナーにパッケージした実行可能なカスタム・プログラムをアクションにできます。

・hello.jsファイルを作成します。

```js:hello.js
function main() {
   return {payload: 'Hello world'};
}
```

・Create Action（アクション名：helloAction）
`wsk action create helloAction hello.js`

・Actionをクラウドに配置（Invok）
`wsk action invoke --blocking helloAction`

・Actionリストを表示
`wsk activation list`

## Action upgrade
パラメーターを受け取るようにアクションを修正してみます。

```js:hello.js
function main(params) {
   return {payload:  'Hello, ' + params.name + ' from ' + params.place};
}
```

・Actionを更新
`wsk action update hello hello.js`

・パラメーターを設定し、Actionを起動（name:joohoun, place:Tokyo）
　・"--result"オプションをつけることによって結果がする表示される。
`wsk action invoke --blocking --result hello --param name 'joohoun' --param place 'Tokyo'`

・パラメーターを固定させる
オプション「--param」を使って「place」を「Japan Tokyo」に設定することで、次回からは nameオプションのみで起動してもplaceが設定されます。

`wsk action update hello --param place 'Japan Tokyo'`

`wsk action invoke --blocking --result hello --param name 'Yokoi'`
※ この状態で、「place」を指定して実行すると、アクションにバインドされた値を上書きします。（固定された値は変更なし）

##外部のAPIを呼び出す

```js:weather.js
 var request = require('request');

 function main(msg) {
     var location = msg.location || 'Vermont';
     var url = 'https://query.yahooapis.com/v1/public/yql?q=select item.condition from weather.forecast where woeid in (select woeid from geo.places(1) where text="' + location + '")&format=json';

     request.get(url, function(error, response, body) {
         var condition = JSON.parse(body).query.results.channel.item.condition;
         var text = condition.text;
         var temperature = condition.temp;
         var output = 'It is ' + temperature + ' degrees in ' + location + ' and ' + text;
         whisk.done({msg: output});
     });

     return whisk.async();
 }
```

・Action Create
`wsk action create weather weather.js`

・地域を指定してActionを実行
`wsk action invoke --blocking --result weather --param location 'Japan, Tokyo'`
![スクリーンショット 2016-04-26 14.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/29452/ec81053c-ef28-583d-7650-c0ea0cb8a3fd.png)

#Trigger&Rule
IBM Bluemix OpenWhisk のトリガーとルールにより、プラットフォームにイベント・ドリブン機能がもたらされます。外部および内部のイベント・ソースからのイベントは、トリガーを通じてチャネル設定され、ルールによって許可されたアクションがこれらのイベントに対応します。

【トリガー】
トリガーは、ある種のイベントに対して指定されたチャネルです。以下は、トリガーの例です。
・ロケーション更新イベントのトリガー。
・Web サイトへの文書アップロードのトリガー。
・着信 E メールのトリガー。

トリガーは、キーと値のペアのディクショナリーを使用して発生させる (アクティブ化する) ことができます。このディクショナリーは、イベント と呼ばれることもあります。アクションと同様に、トリガーを発生させるたびに、アクティベーション ID が生成されます。

【ルール】
ルールは 1 つのトリガーを 1 つのアクションに関連付けます。トリガーが発生するたびに、該当のアクションが、トリガー・イベントを入力として起動されます。

適切なルール・セットを使用して、単一のトリガー・イベントで複数のアクションを起動することや、 複数のトリガーからのイベントへの対応としてアクションを起動することが可能です。

# トリガー作成と発生

・トリガー作成
`wsk trigger create locationUpdate`

・トリガーリスト出力
`wsk trigger list`

・トリガー発生
`wsk trigger fire locationUpdate --param name "joohoun" --param place "Japan, Tokyo"`

# ルール：トリガーとアクションの関連付け

・ルールを作成
`wsk rule create --enable myRule locationUpdate hello`

・locationUpdate トリガー発生
　イベントを発生させるたびに、イベントのパラメーターを使用して hello アクションが呼び出されます。
`wsk trigger fire locationUpdate --param name "joohoun" --param place "Japan, Tokyo"`

・最新のアクティベーションをチェックして、アクションが呼び出されたことを確認
`wsk activation list --limit 1 hello`
`wsk activation result {アクティベーション ID}`

## GUIでもAction、Trigger、Ruleを使えます。
![スクリーンショット 2016-04-26 15.12.54.png](https://qiita-image-store.s3.amazonaws.com/0/29452/f351c1d1-de4c-c994-333b-4d3a94416c01.png)


# BMXUG（Bluemix User Group）コミュニティ
「Bluemix」の「今」をフォローしましょう！

・Facebook ： [Bluemixユーザーグループ](https://facebook.com/groups/bmxug)
・Qiita ： [Bluemix Qiitaページ](http://qiita.com/tags/Bluemix)
・Doorkeeper：[Doorkeeperコミュニティ](https://bmxug.doorkeeper.jp/)
・Slack ： [Bluemix User Group(BMXUG)の交流用](http://bit.ly/1QzOgiC)
・stackoverflow ： [stackoverflow（コミュニティQ&A）](http://ja.stackoverflow.com/questions/tagged/bluemix)
・Twitter ： #bmxug