まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2015/08

ある程度知名度のある企業に勤めていた人が、その企業を退職後に
  私が○○で学んだこと
  ○○流××メソッド
みたいな、成功事例を偉そうに紹介してるのを目にします。別にあなたが偉いわけじゃないのにね。。

で、今日紹介するのはそれです(笑)。僕が IBM で教わったこと

 
といってもビジネスの話とかではなく、「ああ、なるほど、確かにそうだよね~」と感心した表記法に関するものです。


その内容は「日付の表記方法」です。例えば今日は西暦2015年8月28日ですが、この日付をどうやって表記しますか? 日本人に限った話をすると 2015/08/28 が圧倒的多数でしょうかね。事実この方法で間違って伝わることはないと思います。和暦を使って H27/08/28 と表記する人もいると思います。これも相手が日本人であれば間違って伝わることはないと思います。

たまに 15/08/28 と表記する人がいます。面倒くさがり屋さんなのでしょうかね。これも相手が日本人なら間違って伝わることはないと思います。

日本人は日付を「年月日」という順番で表記することが常識になっているので、スラッシュ(/)で区切られた3つの数字があれば「年/月/日」と読み替えるようになっているのでしょう。ただし、この表記を読む相手が日本人だという前提を取り払うとどうなるでしょうか?

まず H27/08/28 はよほど日本に詳しい人でないと、そもそも日付の表記であるとすら思われません。

日本は「年/月/日」の表記順が常識ですが、国によっては一般的な日付表記が「日/月/年」だったり、「月/日/年」だったりします。月が先か日が先か、年をどこに持ってくるか、など、日付表記ルールは千差万別なのです。とすると 15/08/28 は正しく伝わらない可能性が出てきます(2028年8月15日など)。

では 2015/08/28 なら間違うことはない・・・ とは言い切れないですよね。たしかに8月15日に限っては大丈夫そうですが、例えば 2015/01/02 は人によって 2015年1月2日にも見えるし、2015年2月1日にも見えてしまうのです。ややこしいですよね。。

では世界中の人が見て正しい日付が伝わる表記はあるのでしょうか? その答として、IBM で習ったのはこの方法でした:
  2015/Aug/28

分かりますか? 最初に西暦年を4桁数字、次は月を英語3文字表記、最後に日付を2桁数字、そしてこれらをスラッシュで区切って表記、です。

要は4桁数字は必ず西暦年を表す数字です(月や日ではありえない)。そして日と月の区別については「月は英語表記」にすることで、自動的に「2桁数字は日」と解釈されるようになります。これだと上記例の場合でも 2015/Jan/02 や 2015/Feb/01 と明確に書き表すことができて、間違えようがないのです。

この辺りはさすがグローバル企業だなあ、と感じたエピソードでした。今後は自分の記述する資料も可能な限りこの YYYY/MMM/DD 形式で日付を表すことにします。


このシリーズ、もしかしたら続きます。



最近は多くのクラウド業者が IoTMQTT との連携をアピールしています。IBM を含めて各社が「いかに簡単に IoT データを扱う/応用することができるか」を競っている感じです。

この点で IBM の強みの1つが Node-RED フローエディタだと思っています。Bluemix に統合されたこの GUI エディタは MQTT サーバー(ブローカー)との接続を簡単に行い、データを集め、保存する仕組みを簡単に提供することができます。MQTT ブローカー/クライアントの Mosquitto といい、この Node-RED といい、IoT にもオープンソース製品が多くの場面で使われるようになってきて、更なる広まりを見せているように感じます:
2015082602


IBM の場合、この Node-RED をうまく Bluemix に合わせてカスタマイズして提供しており、Bluemix 内ではすぐに使えるようになっており、また Bluemix の各サービスと簡単に組み合わせて使えるような形で提供されています。


ただ Node-RED そのものはオープンソースで提供されているものです。他のクラウドインスタンスやオンプレミスサーバー環境でも(Bluemix 用の拡張がされていない素のエディションを)動かすことが可能です。つまり IBM 以外の業者のクラウド環境内で Node-RED を使った IoT アプリ開発環境を構築することだってできるわけです。


というわけで、今回のブログエントリでは SoftLayer や AWS、IDCF、オンプレミスなどの(クラウド)サーバー環境内で Node-RED を使って IoT アプリ開発環境を構築する手順を紹介します。


まず最初に Bluemix と IBM IoT Foundation を使った場合の IoT アプリ開発環境のシステムトポロジーを確認しておきます。必要になるサーバーとしては各種センサーデバイスからの情報を集約する MQTT ブローカーと、Node-RED が稼働する Node.js アプリケーションサーバーです。Bluemix 環境の場合、前者は IBM IoT Foundation が提供する quickstart サーバーを無料で使うことができます(つまり構築不要です)。後者は Bluemix のボイラープレートを使うことで Node-RED が動く状態まで含めて簡単に構築できてしまいます。なお収集したデータを保存しようとすると別途データベースサーバーを用意する必要がありますが、Bluemix であればデータベースも簡単に追加してバインドすることが可能です(今回はデータベースを使わない環境を前提とします):
2015082601


これと同じ環境を Bluemix を使わずに構築することを考えると、(物理的には1台のマシンでも構いませんが)上記の MQTT ブローカーと Node.js の2サーバーを手動で用意することになります:
2015082602


具体的には MQTT と Node-RED それぞれの環境を用意する必要があります。1台または2台のサーバーを用意し、それぞれのサーバーインスタンスに MQTT ブローカーおよび Node-RED 環境を構築します。それぞれの手順は(CentOS サーバーの場合であれば)以下の記事を参照ください:
ラズベリーパイにオープンソース MQTT の Mosquitto をインストールする (←ラズベリーパイだけでなく CentOS の場合のインストール方法も記載しています)
CentOS に Node-RED をインストールする


まずは MQTT ブローカーを起動しておく必要があります。MQTT ブローカー(Mosquitto サーバー)を導入したマシン上で以下のコマンドを実行するなどして Mosquitto サービスを動かしておきます:
# service mosquitto start

次に Node-RED を導入したサーバーで Node-RED を起動します:
2015082603


起動した Node-RED にブラウザでアクセスします。Node-RED はデフォルトでは 1880 番ポートで起動するので、 http://(Node-RED サーバー):1880/ でアクセスするとフローエディタの画面が開きます:
2015082604


そして下図のような、MQTT インプットと Debug アウトプットを繋げただけのシンプルなフローを記述します:
2015082608


MQTT インプットの属性は以下のようにします。Broker には Mosquitto を導入したサーバーの 1883 番ポートを指定します。Topic はなんでもいいのですが、ここでは "top/001" と指定しています(後で実行するコマンドで指定することになる文字列です)。準備ができたらデプロイして実行状態にします:
2015082605


これで環境は出来上がりました。では正しく動いているかどうかを確認してみましょう。
別途 Mosquitto クライアントを導入したマシン(これも同一マシンでもかまいません)から以下のコマンドを実行して、MQTT ブローカーにメッセージをパブリッシュします:
$ mosquitto_pub -h (MQTT ブローカーサーバー) -t "top/001(上記 Node-RED で指定した Topic 属性と同じ文字列)" -m "Hello."

2015082606


すると、Node-RED 画面の debug タブには -m オプションで指定された文字列が表示されるはずです。つまり MQTT ブローカーの top/001 トピックに送信されたメッセージを、Node-RED から正しく取得することができたことになります:
20150824_nodered



ちゃんと動きました。Node-RED は Bluemix や IBM IoT Foundation がなくても、普通の(?) MQTT 環境の中でも動くことが確認できました。


・・・とはいえ、Bluemix + IBM IoT Foundation 環境で Node-RED を使ったことのある者として言わせていただくと、ここまでの環境を整えないと使えないわけです。また現実的には取得したデータをデータベースに格納しようとすると、Bluemix 環境のように簡単にはいきません。動くか動かないかでいうと動きますが、その準備のためのハードルはまだまだ高いように感じています。

IoT アプリ開発環境を検討する上で IBM Bluemix + IBM IoT Foundation + Node-RED がいかに簡単で便利なのか、を改めて再確認するような実験になったとも感じました。




 

IBM Bluemix には「サービス」と呼ばれる数多くの API 群が利用可能なものとして登録されています:
2015082501



これらのサービスは大きく3種類に分けることができます:
(A) IBM サービス
IBM のソフトウェア製品やソフトウェアサービスが SaaS / DBaaS として提供されているもの。
ベータ版も含まれる(ベータ版は原則的には無料)。
Bluemix のサービス一覧内では青い枠で囲まれている。

(B) ビジネスパートナーサービス
IBM のビジネスパートナー様が提供する SaaS / DBaaS が、Bluemix からも使えるようになっているもの。
課金体系や提供形態(無料枠の有無など)も含めてビジネスパートナー様が決める。
パスポートアドバンテージ契約時の割引対象外。
Bluemix のサービス一覧内では緑の枠で囲まれている。

(C) 試験提供サービス
(もともとの Cloud Foundry が提供している)オープンソース製品の SaaS / DBaaS や、
IBM サービスのベータ版になる前の段階で試験的に公開しているサービス。
サービスに関しては原則的には無料(試験提供のランタイムは他ランタイム同様の課金体系)。
Bluemix のサービス一覧内では白い枠で囲まれている。


これらの中の (B) ビジネスパートナーサービスは、例としては Twilio サービスであったり、SendGrid サービスであったり、Box サービスであったり、ClearDB(MySQL の DBaaS)サービスであったり・・・といった感じで、特定の目的についてデファクトスタンダードといえるような Web API が Bluemix のサービスとして登録されています。つまり Bluemix ユーザーは、これらの業界標準 API を使ったアプリケーション開発が、Bluemix 環境の中でも可能になる、ということを意味しています:
2015082502



で、よく聞かれるのがこの質問です:
  自分(うちの会社)が作った API も Bluemix のサービスに登録できるの?

答は条件と手続きを満たすことで「ビジネスパートナーサービスとして登録できます」です。本エントリではこの流れと手続について紹介します。

サービスとして登録するまでの手続きの流れは以下のようになっています:

(1) クラウドビジネスパートナーとして登録
https://www.marketplace.ibmcloud.com/joinnow/ のフォームから会社を登録

(2) IBM クラウドマーケットプレースチームによる内容確認レビュー
登録内容が確認されて、問題がないかを判断(問題がなかった場合のみ (3) へ)

(3) Terms and Conditions に同意
https://developer.ibm.com/marketplace/docs/vendor-guide/business-partner-agreements/

(4) IBM Cloud Marketplace Business Partner 条件に同意後、90日以内にマーケットプレース API を実装
https://developer.ibm.com/marketplace/docs/vendor-guide/integrating-bluemix/

(5) Bluemix 用の追加条件に合意

(6) マーケティングキットを使ってプロモーション開始
https://developer.ibm.com/marketplace/docs/marketing-kit/



手続きの流れはこんな感じ。で、問題は「(1) はどういう条件をクリアして、どういうサービスを提供すると (2) がクリアできるのか」ということです。

その答は技術的・サービス内容的に決まっています。まず技術要件がこちら:
- マーケットプレース API を使って支払い機能とプロビジョニング機能をサポートすること
- Bluemix 内のアプリで有用に使えること
- サービスはクラウドで提供されていること
- コンポーザブル(組み合わせ可能)であること
- バックエンドは負荷の変更に耐えられるようスケールすること
- 英語版ウェブサイトが提供されていること
- 無料トライアルが提供されていること


そしてサービス要件がこちらです:
- Description にサービスの価値が記述されていること/Bluemix を組み合わせた価値が分かるようにすること
- Bluemix でそのサービスを使う場合のドキュメントへのリンクが提供されていること
- 簡単に開始できるスターターアプリや、スクラッチで開発する場合のサンプルなどが提供されていること
- サービスのダッシュボードが Bluemix から簡単に使えること(例えばリンク URL だけで使える、など)
- プロビジョニングやバインドの処理が3分以内に完了すること
- サポート情報が記載されていること
- メンテナンス時のダウンタイムをゼロにすること
- Terms of Usage へのリンクが提供されていること
- Bluemix や他のサービスとのシングルサインオンが提供されていること、など


曖昧なものもあれば、少しわかりにくいものもあります。いくつかの要件について補足します。まず Bluemix は全世界で提供されるサービスであり、例えば「日本のユーザーだけに使ってほしいサービス」であっても、ここに登録する以上は全世界の Bluemix ユーザーに公開されます。そのため英語版のウェブサイトは必須となります。プラスする形で日本語や他言語ウェブサイトを提供いただくことは可能です。

そしてプロビジョニングや課金は Bluemix を通して行う必要があるため、その機能を実装していただく必要があります。とはいえ、これらの実装は今すぐに対応しないといけないというものではなく、申請が完了して、合格した後の話のようです。

ここで登録するサービスは Bluemix 内の SaaS / DBaaS として利用されることになります。ということはどのような負荷のかかる処理で利用されるかを事前に想定することができません。したがってサービスそものが安定稼働しつつ、スケール対応ができている必要がある、ということのようです。

などなど、上記項目のいくつかは申請フォーム内で明確にチェックする必要のある項目として用意されていますが、個別に入力フィールドが用意されていない項目もあります。それらは Description として、明確にアピールする形で入力する必要がありそうです。


で、ここが大事な点。これらの要件の中で上記の青字で書かれている5項目は (1) の申請時点でクリアしている必要があるのです。

つまり (1) の申請の段階で、この5項目に関しては全て Yes にチェックされていないと先に進めなくなるのです。「クラウド提供」や「コンポーザブル」な点はともかくとして、「スケール対応」や「英語版ウェブ」、そして「無料トライアル枠の用意」、というのは技術的にも営業的にも判断や対応が必要になる可能性もありますよね。ただ Bluemix を利用する立場としては、そのような対応がされていれば安心して試せるし、安心して使えるとも言えます。


実は僕も自分で作った API を Bluemix のサービスに載せられないかな?と考えた時期はありました。が、スケールに対応するのは結構大変だよな・・・と感じたのも事実。 

・・・でも、よくよく考えてみると API そのものを Bluemix で作って提供してオートスケールサービスまで付けちゃえばいいのか?あれ、Bluemix 使っちゃえば技術的には意外と簡単なのかも・・・ (^^;


Bluemix を使って自社の SaaS のビジネスに新しいチャネルを・・・とお考えの皆様、ぜひ前向きに検討して、御社のサービスを Bluemix サービスに登録するチャレンジをしていただければ嬉しいです。


なお、この手続に関して詳しくは英語版資料(PDF)を参照ください:
https://developer.ibm.com/marketplace/wp-content/uploads/sites/30/2015/05/IBM-Cloud-marketplace-Business-Partner-Program-Overview-deck-as-of-5-01-15.pdf


 

IBM 製のオープンソース・フローエディタ "Node-RED" に、オリジナルのノードを追加してフローエディタ内で使えるようなカスタマイズをしてみます。

今回追加するノードは、機能そのものは「入力されたテキストを逆順にして返す」と(例えば "ABC" と入力されたら "CBA" と出力する)いうシンプルなものにして、そのカスタマイズ方法を紹介します。


準備として、まず Node-RED の環境が必要です。ここでは IBM Bluemix の "NodeRED スターター" ボイラープレートから Node-RED 環境を用意するものとします。下図の例ではアプリに dotnsf-nodered-20150824 という名称をつけています。またデータセンターは米国を使っています。以下はこの前提で紹介を続けます:
2015082401


次に、カスタマイズするコードをマージして Node-RED 環境にデプロイすることになるため、Node-RED のスターターコードが必要です。Bluemix 上の Node-RED プロジェクトの「コーディングの開始」から、cf ツールとスターターコードをダウンロードしておきます。cf ツールはダウンロード後にインストールまで済ませておきます:
2015082402


ダウンロードしたスターターコードをローカルで展開し、専用のフォルダ(図では C:\tmp\nodered\)に保存しておきます:
2015082403


このフォルダにカスタマイズするノードの情報を追加していきます。最低限必要なファイルはノードの処理内容を記述する JavaScript ファイルと、フローエディタ上での表示内容を定義する HTML ファイルと、パッケージング情報を変更する package.json ファイルの3つです。まずはノード内の処理内容を reverse.js というファイル名の JavaScript で以下のように記述します:
(reverse.js の中身)

module.exports = function(RED) { //. ノードの処理内容 function ReverseNode(config) { RED.nodes.createNode(this,config); var node = this; this.on('input', function(msg) { //. 入力文字列を逆順にする var str1 = msg.payload, str2 = ""; for( i = 0; i < str1.length; i ++ ){ str2 = str1.charAt( i ) + str2; } msg.payload = str2; node.send(msg); }); } //. ReverseNode 関数を実行する reverse ノードとして登録 RED.nodes.registerType("reverse",ReverseNode); }

最低限必要なもう1つのファイルを reverse.html として、以下の内容で記述します:
(reverse.html の中身)

<script type="text/javascript"> RED.nodes.registerType('reverse',{ category: 'function', color: '#a6bbcf', defaults: { name: {value:""} }, inputs:1, outputs:1, icon: "file.png", label: function() { return this.name||"reverse"; } }); </script> <script type="text/x-red" data-template-name="reverse"> <div class="form-row"> <label for="node-input-name"><i class="icon-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> </script> <script type="text/x-red" data-help-name="reverse"> <p>メッセージのペイロードを逆順にするノード</p> </script>

これら2つのファイルを、先程展開したスターターコード内の nodes フォルダにコピーします:
2015082404


最後にこの reverse ノードを Node-RED 環境に追加するためのパッケージング設定を追加します。スターターコードを展開したディレクトリの直下ににある package.json ファイルをテキストエディタで開き、以下の赤字部分を追加します:
(package.json ファイルをカスタマイズ)

{ "name" : "node-red-bluemix", "version" : "0.4.20", "dependencies": { "when": "~3.x", : : }, "keywords":[ "node-red" ], "node-red": { "nodes":{ "reverse": "nodes/reverse.js" } }, "engines": { "node": "0.10.x" } }

この状態で、スターターコードの展開ディレクトリ(この例では C:\tmp\nodered\)以下を cf ツールで自分のアプリ(この例では "dotnsf-nodered-20150824")にプッシュします:
> cd c:\tmp\nodered
> cf login -a https://api.ng.bluemix.net/ (米国データセンターにログイン)
> cf push dotnsf-nodered-20150824 (アプリ名(この例では dotnsf-nodered-20150824)を指定してプッシュ)

プッシュが成功したら Node-RED フローエディタを開きます。Bluemix からであればアプリの URL にアクセスします:
2015082405


成功していれば function カテゴリの中に "reverse" ノードが追加されていることが確認できるはずです。カスタマイズ成功!:
2015082406


このノードにマウスを重ねると、HTML 内に用意された内容の HELP 情報がポップされるはずです:
2015082401



では最後に、設定した内容がどのように反映されているのかを確認する意味でも動作確認してみましょう。今回追加したノードは「文字列を逆順にする」ノードなので、単純に文字列をインプットする仕組みを用意します。"input" カテゴリ内の "inject" ノードをローエディタのキャンバス内にドラッグ&ドロップします:
2015082407


ドロップした "inject" ノードをダブルクリックして属性を変更します。Payload の種類を "string" にして、その下にインプットしたい文字列(この例では「今日はいい天気ですね」)を指定して "OK" をクリックします:
2015082408


reverse ノードを追加する前に、一度この状態で動作を確認してみましょう。"output" カテゴリから "debug" ノードをドラッグ&ドロップで追加してノード同士を結びつけます。そして "Deploy" します:
2015082409


Deploy が成功したら、"inject" ノードの左にあるボタンをクリックします。クリックするごとに指定した文字列が次のノードに渡されるので、debug ノードによって debug タブに指定した文字列が表示されるはずです:
2015082410


では改めて追加した "reverse" ノードの動作確認です。"function" カテゴリ内の "reverse" ノードをドラッグ&ドロップして追加し、以下のように線を繋ぎ直します:
2015082411


"reverse" ノードをダブルクリックすると属性設定画面が表示されます(reverse.html 内に定義されています)。属性値は Name だけで、実はここの値は挙動には何の影響も及ぼさないのですが、見た目が変わることを確認したいので「逆順」などの名前を指定します:
2015082412


フローエディタ上での表記が指定した Name になることが確認できます。そしてこの状態で Deploy して "inject" の左ボタンをクリックすると、今度は指定された文字列が "reverse" ノードによって逆順にされた結果が debug タブに表示されるはずです。期待通りに動いてくれました:
2015082413



今回は(アイコンも既存のものを流用するような)最小限のカスタマイズ内容だったため、シンプルな内容の新ファイル2つと、package.json の変更だけで済みましたが、変更内容によっては更に複雑な記述を行ったり、画像ファイルを別途用意したりする必要もあります。この辺りのより詳しい情報については NodeRED の公式ドキュメントを参照してください:
http://nodered.org/docs/creating-nodes/


Ubuntu スマホである Aquaris が、スペインの bq のオンラインストアで購入できるようになりました。自分は大きなスマホがあまり好きではないので、スペックが低いことを理解した上で E4.5 を購入しました:
2015082300


ちなみにこの端末はデュアルの SIM フリー機で、マイクロ SIM 対応です。一週間ほど使ってみたので、特に OS の機能についてまとめてみました。

まず、以下の紹介の中で多くのスクリーンショットを使っていますが、スクリーンショットの撮影方法は「ボリュームコントロールの上下ボタン同時押し」でした。Aquaris はつい最近までスペインでしか売られていなかったこともありますが、英語でもなかなか情報を見つけることが難しいスマホでした。このスクリーンショットの取得方法を調べるだけでも結構たいへんでした。。

まず気になる日本語対応ですが、表示に関しては問題ありません。言語設定画面がこちらです:
screenshot20150823_213231724


「言語を表示」をタップすると表示言語を指定できます。ここで「日本語」が標準で用意されているので、これを選択するだけで日本語表示になります:
screenshot20150823_213238618


一方、日本語の入力ですが、標準のキーボードには「日本語」や「Japanese」が用意されていません。なので日本語入力は現時点ではできないと思っています:
screenshot20150823_213306796


操作方法の基礎となるのがメニューです。メニューが画面左端を右に向かってスワイプすると、隠れていたメニューが「スッ」という感じで現れます。ここから「システム設定」「ブラウザ」「電話」などの基本的なアプリケーションを起動できます:
screenshot20150823_213009463


メニュー内一番下の Ubuntu マークをクリックするとホームアプリともいえる画面が出てきます。7つの画面を切り替えて表示するアプリです。最初は "Today" という今日の情報が表示される画面:
screenshot20150823_213355313


2つ目は "NearBy" 。現在地の近くの情報が表示されます:
screenshot20150823_213400646


3つ目は「アプリ」、導入済みアプリの一覧画面です:
screenshot20150823_213405319


なお、この画面を下までスクロールすると、"Ubuntu ストア" という、アプリを検索して導入(購入)するためのマーケットアプリを起動することができます:
screenshot20150823_213411088


4つ目は "News" 、ここにニュースのヘッドラインが表示されます:
screenshot20150823_213414902


5つ目が「ミュージック」の画面。購入したり、インストールした音楽にはここからアクセスできるようです:
screenshot20150823_213421198


6つ目は「ビデオ」。撮影したビデオ動画や購入した動画にアクセスする画面です:
screenshot20150823_213425596


最後の7つ目が "Photos" 、写真やアルバムアプリにアクセスする画面です:
screenshot20150823_213428105


個人的にはもともとスマホというよりも、ネットワークの管理端末目的で購入しました。そのためにはターミナルアプリを使いたかったのですが、標準ではターミナルアプリは含まれていない模様でした。上述の Ubuntu ストアから探して導入すれば使えます:
screenshot20150823_214400257


画面右下のキーボードマークをクリックすると、ソフトウェアキーボードが表示されて、ここから ssh を使ってリモートログインして・・・といったことが可能になります:
screenshot20150823_214505647


またブラウザは一般的なモバイルブラウザのようでした。jQuery Mobile で作ったサイトも問題なく表示できました:
screenshot20150823_213509670


アプリケーションの切り替えは画面の右端を左側に向かってスワイプするとタスクマネージャー的なアプリが出てきます。ここからアプリを切り替えたり、特定のアプリを強制終了できたりします:
screenshot20150823_213527184


現状だと、やはり日本語入力ができないのが痛いかなあ・・・。事実上、メールや SNS が「確認専用」になっちゃうよなあ。。

このページのトップヘ