RubyWorld Conference 2016で発表してきた(技術的な詳細版)

はじめに

かなり時間が過ぎましたが、11月3日〜4日に開催されたRubyWorld Conference 2016にて発表してきました。話したことは以前別エントリーで記しましたので、このエントリーでは、発表に至るまでの経緯と、そこで使った技術的なことをいろいろと記したいと思います。

f:id:miyohide:20161224214808j:plain

きっかけ

発表の中でもちょっと触れましたが、私は所属会社以外にOSS推進フォーラムアプリケーション部会(以下、アプリ部会)という団体にも所属しています。アプリ部会では、毎年有志がそれぞれテーマを持ち寄っていろいろと調査結果を発表したりしています。

アプリ部会ではちょっと前からmrubyに注目しています。その話を聞いていると自分でも何かできるのではないかと思い、今年の3月ぐらいにmrubyをテーマに何かやることにしました。

ネタ

mrubyをテーマにすると言っても、何か具体的に動くものを作らないとモチベーションが上がらないよなぁと思い、ネタを探すことにしました。Lチカっていうのがこういうものの定番ですが、もうちょっと凝ったことをしたいという思いがありました。

そこで上がったのが自分が趣味としているランニング。GPSデータや温度などをリアルタイムで取得してそれを活かすようなアプリを作ってみようと考え、必要なものを揃えるようにしました。

まぁ「それ、スマホでいいじゃん」って言われると元も子もないんですが、まぁ、そんなこと言ったら駄目です。

ハードウェア

ハードウェアについては、アプリ部会で話をしたらすぐ調達してくれました。Raspberry PiにUSB接続のGPSや温度センサーです。いわゆるIoTっていうともっと小さなハードウェアやはんだ付けされたものを思い浮かぶのですが、

  • 個人的に使い慣れたOSで作業がしたい
  • はんだ付けとかできない
  • はじめてのことを色々といっぺんにやると、トラブったときに何が何だかわからなくなる

という考えから、まずは簡単にできることからスタートすることにしました。実際、mrubyアプリケーションを書くことについては、結構苦労したので、この選択は正しかったんだろうなと思います。

作るものを減らす

今回のテーマはmrubyアプリケーションの実装だったので、それに必要なものはできるだけ実装しないように考えました。そんなことを考えているときに出会ったのがAzure IoT HubとPower BIです。

これらはたまたまMicrosoft社さんのセミナーに出ていたときに知ったもので、これだったら自分が実装するのはmrubyアプリケーションだけで済むと考え、Azureベースで実装することにしました。ただ、自分の環境ではなぜかPower BIを使うことができませんでした。そこで、データ表示分はAzure Web Apps上でRailsアプリを動かすことにし、簡単なデータ表示アプリを作ることにしました。

正解を知る

mrubyアプリを作ることは初めてで、なんとなくCRubyとmrubyには非互換の部分があるということを知っていたので、まずはCRubyで実装することにしました。

Azure IoT Hubにデータを送信するためには、SASトークンというものを計算する必要があります。アプリの実装で難しいところはここで、自分は次のようなコードで動くものができました。

これで正解を知ることができたので、あとはmrubyで動くものを作るだけです。

アレもこれもmrbgems

さて、後はmruby上で実装するだけなのですが、ここが一番難しいところです。CRubyとmrubyとで非互換の部分をまとめたものは、Qiitaで高橋会長が記されているものが今なら見つかるのですが、私が実装し始めたときには見つけることができず、自分で試行錯誤しました。

当初はRubyGemsを使わなければ簡単に動くようにできるでしょ?って考えていましたが、CRubyではあって当たり前のメソッドもmrubyでは普通にないので、mrbgemsを探すことにしました。

mrbgemsの情報源としては、

を主に利用しました。特に軽量Rubyフォーラムにあるmruby安定版のアナウンスページWindows/Mac/Linuxでの動作確認実績が記されていましたので、私みたいにMacで開発し、Linuxで動かすと言った用途では非常に役立ちました。

結局、SASトークンの生成部分は、

のようになりました。

Azure Web AppsでRailsアプリを動かす

さて、Power BIが使えなかったので、データを表示する部分をサクッとRailsで開発したのですが、それを動かすための基盤として今回はAzure Web Appsで動かすことにしました。ここではAzure Web Apps上でRailsアプリを動かすことについて記します。

2016年12月24日現在Azure Web AppsはRubyをサポートしていませんので、Railsを動かすにはちょっとした工夫が必要です。

工夫の方法は下記の二種類あります。

  • JRuby + Warblerを使ってwarファイルを作り、warファイルをアップロードする
  • Kuduを使ってデプロイ時にJRubyのインストール、Gemのインストール、DB migrateなどを実施する

今回は、Kuduを使ったデプロイを行いました。参考にしたのは、下記サイトです。

blog.shibayan.jp
github.com

最終的に使用したdeploy.shは次のとおりです。

DB migrateとかは動かすとちょっと時間がかかるので、一度動かすと後はコメント化してしまって処理時間の短縮に努めました。

実際のアプリの動作ですが、最初は無料プランでやっていたのですがそもそもうまく動かないことが多かったので早々に諦めBASICやSTANDARDプランで動かすと、安定して動くようになりました。

なお、わざわざこんなことしてAzure Web Apps上でRailsアプリを動かさなくても適当にVirtual MachineなんかでLinuxを立ち上げて動かしても良かったと思うのですが、インフラ周りであまり悩みたくなかったので、Azure Web Appsで動かすことにしました。

各種課題など

こんなことをやっていってなんとか発表までたどり着けたのですが、課題が山盛りなのでこれからはその課題をいろいろと解決していきたいなと考えています。

特に走るときにRaspberry Piを背負って走るのはあまりにも邪魔なので、できるだけ小型化したいなと思っています。ただそのためにはハードウェアの知識とか半田付けとかOSなしとか色々と課題があるので、それをゆっくりと乗り越えていきたいなと考えています。