Express 5 で何が変わるか

Express 4 とほとんど同じですが、以前から Deprecated だった API でサポートが無くなるものや、ECMAScript 6 (2015年6月) にからむ改善点など、気にとめておくと バージョンアップ作業をよりスムーズに進めることができて、喜ばれるかも。まだ、Alpha 版です。

StrongLoop | Moving toward Express 5

Nodejs v4.2.0 has some regressions in it!

 V4.2.1を待ちましょう。   彼が StrongLoop で CI の不具合を追いかけていて、一時間ほど前にみつけたとの事。Node Coreチームの対応も早く、V4.2.1リリースをすぐカットするようです。

CI をしっかり作っておくと、自らのコードの不具合もさる事ながら、依存しているnpmモジュールの互換性の問題、更に Node Core の regression まで、すぐさまキャッチしてしまうんですね。Nodejs コミュニティの皆さんにも、お返しができる。

https://github.com/nodejs/node/pull/3331

github.com

Internet of Things のモニタリングにも Concurix を使う(V2)

Air Quality センサー・モジュールを追加した V2が出来ました。V1 の製作終了直後に、Air Quality センサーの API サンプルコードがリリースされたので、早速発注しておいたモジュールです。前回のブログ参照にある写真と見比べていただくとお分かりいただけるように右下部に新たに2つのモジュールを付けました。一番、右下にあるユニットがAir Quality センサー・モジュール、その左にボードの半分を占める黒い部品が Air Quality センサーの Vcc のオン・オフを行うリレー・モジュールです。リレー・モジュールは Base Shield のデジタル・ポートに、Air Quality センサー・モジュールは、アナログ・ポートにつなげてあります。

リレー・モジュールを使った理由ですが、TP-4-1A Indoor Air Auality Sensor のデータシートによるとAir Quality センサーの消費電力が 300mW (バックライト・オン時のLCDと同等)なので、10〜30分に一回、Air Qualityを測定するにはリレーを使い、空気の汚れを測定する時間だけ電力供給する方が得策だろうという判断です。ここで使ったリレーのデータシートを見てみるとリレーそのものもかなり電力消費しますから、測定頻度が高い場合は リレーを使わないほうがトータルな電力消費が少なくなることもあります。

写真の LCD をご覧いただくと、温度華氏(F)、輝度ルクス(L)の次に空気汚染度(A)を表示しています。バックライトの色は空気汚染度により、青(fresh air)、緑(normal indoor)、ピンク(warning)、赤(critical)に切り替えています。これら IoT ソフトの変更にかかった時間は一時間程度です。

f:id:setogit:20150117051401j:plain

以下に、更新した Concurix のダッシュボードのスクーンショットを示します。下の三つのグラフは、上から順に、室温 華氏、明るさ ルクス、空気の汚れ、です。単位表示も整理しました。

f:id:setogit:20150117051257j:plain

個々のグラフについて若干、補足しておきます。一番上の Uptime (オレンジ色の線) を見ると、午後6まで ゼロ で6時半から立ち上がる直線になっています。なぜそうなったかというと、アプリをスタートするとプロセス ID は更新されます。OS は起動したままアプリだけのリスタートを繰り返すと、PID は順に増えていきますが、OS をリブートした場合は、小さい値(この場合は 241 )に戻されます。今回は6時半に OS リスタートして、測定を始めました。偶然、測定開始の数時間前にモニターしていた プロセスIDが同じ 241 だったため時刻が跳んで表示されているという訳です。

一番最後の空気の汚れグラフは午後6時半から始まっています。6時半以前はAir Quality センサーを搭載しておらず、空気汚染度のデータは存在しませんから、最初にデータが出現した午後6時半からデータの表示が始まっているのです。これは、上で見たように、OS リスタートした時刻と一致しています。

最後に、github.com/intel-iot-devkit を見てみると 2015年1月16日現在、Javascript API サンプル・コード数が 35 を超えています。昨年クリスマス前には 10 程度でした。気圧計、128x64 LCD、更に GPS モジュールと面白いものが揃ってきました。

Internet of Things のモニタリングにも Concurix を使う

昨年のクリスマス前のブログでは、Nodejs  0.10.28 が標準で含まれている  Intel Edison / Arduino ボード上に cx-helloworld(concurixトレーサを含むサンプルアプリ) をインストールし、OSX 上で走っている concurix-server から、モニターできることを確認しました。

 今回は、いくつかのセンサーからデータの取り込みをし、簡単なユーザーとのインターフェースを持った Internet-of-Things アプリを Nodejs/Javascript で書き、それを クラウドで走っている concurix-server からモニターします。とりあえず動作確認したクラウドは AWS と Heroku です。Concurix で Nodejs/Javascript アプリの パフォーマンス・モニタリングができるのは勿論ですが、更に、 concurix-server を拡張して、センサーで測定したデータも Concurix の dashboard に表示する豪華版 (?) にしました。このプロジェクトを通して、Nodejs には時代を作っていく勢いを実感しました。では、最初から見ていきます。

まずプロジェクト・デザインを以下のようにしました。コストを出来るだけ抑え、お屠蘇の勢いにのって開発工数最短でやっつけたい。Intel の IoT Dev Zone を見ると、seeedstudio の Grove Starter Kit Plus Intel IoT Edition が目に止まった。Grove Systemは Raspberry Pi や Beaglebone などに専用の Base Shield ボードを介することでセンサー・モジュールは共通化している。センサー・モジュールの数も百か、そこいら用意されているので申し分ないが、正月三が日に低レベルのドライバを C で書くほど奇特でないから、Nodejs/Javascript だけでお茶を濁したい。調べてみると 2014年クリスマスの時点では、API サンプルコード までサポートされているセンサーはPython で15 個程度、Nodejs/Javascript で 10 個程度であった。そこで、所期の目的を達成する最終仕様を以下のようにした。

温度センサーと輝度センサーを使い、部屋の温度と明るさを世界中どこに居てもリアルタイムでモニタしたい。UI 出力に LCD RGB ( 16文字二行表示可能 )を使い、一行目に室温を℉ と ℃ そして輝度をルクスで表示し、二行目に日時を表示する。バックライトの色を青から緑、赤に温度によって変わるようにする。電力消費を抑えるために、UI 入力にボタンを使い、ボタンが押された時だけバックライトをオンにして上記の情報を表示する。温度センサーと輝度センサーの電力消費はごく少ないが、LCDモジュールの電力消費はバックライト・オン時に 350 mWで、常時 WiFi 接続している Edison の6〜7倍である。上述の4つの Grove センサー・モジュールは、Grove Starter Kit Plus に含まれているし、Javascript サンプルコード も Intel のエンジニアが作ったものが github からダウンロードできる。

ところで、API は随時、追加更新されていて、1月、二週目になってチェックしたところ、室内の空気の汚れを測ることのできる Air Quality センサーの Javascript APIとサンプルコード が 追加されているではありませんか。以下で紹介する V1には間に合いませんでしたが、V2で対応すべくAir Quality センサー Grove モジュール($16.95)を早速、発注しました。

以下の写真が、V1の全体像です。 Edison / Arduino ボードに、Grove Base Shield 拡張ボードを載せ、アナログ・ポートに温度センサー(右上)と 輝度センサー(右下)、デジタル・ポートに ボタン(左)、I2CポートにRGB LCD(上)をつないである。バッテリ・パックの左上に写っているのは US 25 セント硬貨。

f:id:setogit:20150112155419j:plain

電源は、DC 3~12 ボルトまで切り替え可能のユニバーサル・パワー・サプライ ($15) も買いましたが、オフィスのあちこちで測定したいという声に応えて、11.1 ボルトの リチウム・ポリマー電池パックを2.5mm径 の 電源コネクタにハンダ付けしました。気になるコストですが、電池パックが2つセットで$40 、電池パックのチャージャー、LiPoだけでなくNiMH(Nickel Metal Hydride) などにも対応したものが $80 と、Edison/Arduino そのものが $80、Grove Starter Kit Plus が $40 だったことを考えると、投資に見合うのかと、突っ込まれそうだなと思っていた矢先、先週末のことです。フル充電してあったとはいえ、LCD バックライトをオンのままでほっておいたら、あれま、電圧3ボルト以下まで使い切ってしまい、Edison はオフになるは、LiPoパックそのものも再充電できなくなってしまった。だが、NiMH モードでまず10分間充電してやれば、LiPo のバランス充電モードで再充電可能になるという裏技が使えるNiMH対応チャージャーを買っておいてよかった〜。

下の2つ目の写真は、ボタンを押下して、LCDに表示させているところです。LCD つけっ放しを二度としないように、ボタンを離したら消えるバカよけ UI にしました。

 

f:id:setogit:20150112155420j:plain

 ハードウエアは以上です。ソフトウエアの作業は2つの部分からなっていて、Internet-of-Things Nodejs/Javascript パッケージの書き上げと、concurix-server の変更です。

Internet-of-Things Nodejs/Javascript パッケージ書き上げの観点からは次の4つが特記に値すると思います。

(1)Intel XDK IoT Ediiton は デバッガと、 Nodejs/Javascript パッケージを WiFi経由で Edison へアップロードできるので、結構使えます。アップロード後はパワーオフ、オンで自動再起動するかたちになっています。パワーオフ、オンといってもスイッチは付けていないので、パワーコネクタを抜き差ししてます。

(2)デバグ中は、Intel XDK IoT Edition を使って、Edison へのアップロードを繰り返す訳ですが、突然、アップロードが失敗するようになりました。Intel のブログによると、アップロードが失敗する直接の原因は、ログファイルが溜まって、スペース不足で、遅かれ早かれアップロードできなくなるとのこと。当面、我々ユーザサイドでできる対応策は、Edison にシリアル接続か WiFi経由で ssh 接続し、"df -h /" で 100% Used  となっていることを確認した後、"rm -rf /var/log/journal/*" でログファイルを全て削除することです。

(3)Edison上に格納されているドライバや Nodejs/Javascript の API モジュールなどは頻繁に追加更新されているので、一週間に一回は Intel の サイトからダウンロードすると良いかも知れません。

  cat > /etc/opkg/mraa-upm.conf << EOF

  src mraa-upm http://iotdk.intel.com/repos/1.1/intelgalactic

  EOF

  opkg update

  opkg upgrade

(4)Nodejs/Javascript の サンプル・コードは役に立ちます。github リポジトリ は、github.com/intel-iot-devkit/mraa と github.com/intel-iot-devkit/upm で、どちらも examples/javascript に .js ファイルがあります。

 最後に、concurix-server の変更です。これはいわゆる「quick and dirty」ですが、これにふれなくては画竜点睛を欠くでしょう。

下のスクーンショットに見える Uptime, Load Average, Memory Usage History は、今回作成した Nodejs/Javascript IoT パッケージの挙動を示します。例えば、Process Heap Used のオレンジ色の線を見るとメモリリークは無いようです。クリックすると、Flame Graph などを使って、更に細部の挙動がトレースできます。これらは concurix-server 標準機能です。

f:id:setogit:20150112155421j:plain

今回書いたコードは、Transaction History の ダッシュボードの表示データをカスタム・メトリクスに置き換えてしまう部分です。V1アプリでは「室温 華氏」と「明るさ」が、それぞれ「華氏・度」と室内の明るさを示すのに使われる「ルクス」の値で表示されます。単位表示は、まだ ms (ミリ秒) のままですが。

f:id:setogit:20150112155422j:plain

それにつけても、室内空気の汚れ具合センサーの到着が待ち遠しい。つながった暁には、空気の汚れ具合もリアルタイムで見えるようになるはずです。