読者です 読者をやめる 読者になる 読者になる

Strength Finder 2.0をやってみた

私の周りでStrength Finderが流行っていたので、自分も本を買ってやってみました。10年ぐらい前にやった覚えがあるのですが、結果なんて全然覚えていないし、2.0にバージョンアップしたということも有って、新しくトライ。

書店でも本が平積みされていて売れているようです。

結果としては、

  1. 分析思考
  2. 調和性
  3. 慎重さ
  4. 公平性
  5. 学習欲

がTop5として出てきました。大体納得できる感じ。

おおむね、慎重すぎるきらいがあるので、もうちょっと積極的に行く必要があると思っていて、最近特にそういうことを感じています。

『世界で闘うプロダクトマネージャーになるための本』を読んだ

今年に入ってから続けている朝読書の時間を利用して、長らく積読であった『世界で闘うプロダクトマネージャーになるための本』を読み終えました。

世界で闘うプロダクトマネジャーになるための本 ~トップIT企業のPMとして就職する方法~

世界で闘うプロダクトマネジャーになるための本 ~トップIT企業のPMとして就職する方法~


最初、本書を手に取ったとき、「あ、プロジェクトマネージャーじゃないんだ」ということに気がつきました。仕事ではPM=プロジェクトマネージャーを指す用語であって、プロダクトマネージャーという言葉はあまり聞いたことがありませんでした。プロダクトマネージャーとプロジェクトマネージャー。似ている言葉だけど本書の中では、

プロジェクトマネージャーの主な仕事はスケジューリングと調整です。プロジェクトに対する要求の取りまとめに責任を負うこともありますが、要求を特定したり選択したりする際に意見をいうことはあまりありません。

プロダクトマネージャーの責務は、問題点とチャンスを特定し、そのうちのどれを追求するかを選び、その後はチームが優れたソリューションを見つけられるようにすることです。

という風にその違いを述べていて(P20)、なんとなく違いが分かるようになりました。

そういうふうに漠然とした言葉の定義はあるにしても、様々な企業でプロダクトマネージャーに求められることがそれぞれ違うことに驚きました。詳細は本書の第3章に記されているのですが、多種多様でそれぞれの企業の規模や文化によってこうも違うのかと驚きを持って読み進めた。

7章からはプロダクトマネージャーとして採用されるために様々な点での対策が記されています。レジュメの書き方から企業研究、面接時にあるであろう各種質問への考え方や答え方などです。非常に詳細にかかれていて、プロダクトマネージャーを目指さなくても良い対策になるのではと思いながら読み進めることができました。

個人的には、第7章からの記述が大変具体的で、自分ならレジュメをどう書くかとか、出された問題に対してどのように答えを導き出すかについて考えるのが大変楽しく、プロダクトマネージャーを目指さなくても自分の業務経歴の棚卸しだったり面接練習になったりして楽しく読み進めることができました。

Ruby Business Users Conference 2017に行ってきた

はじめに

2017年2月23日(木)に渋谷で開催されたRuby Business Users Conference 2017に行ってきました。会場は、数年前渋谷Ruby会議が開催されたシダックスカルチャーワークスでした。

f:id:miyohide:20170223235900j:plain

技術系の話がメインではなく、Rubyを使ってどのように仕事をしているかを紹介するカンファレンス。毎年11月に島根で行われるRubyWorld Conferenceの東京版と言った感じです。

プログラム

プログラムは

  • Matzによる主催者講演『Rubyサバイバルガイド』
  • 安川 要平氏による『子どものためのプログラミング道場「CoderDojo」を支えるRails CMSの活用事例』
  • 森 雅智氏による『TechRacho: 技術情報発信から広げるエンジニア発のコミュニケーション文化作り』

www.slideshare.net

  • 伊藤 浩一氏によるLT『Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから』

www.slideshare.net

  • 堀井氏によるLT『Rubyとスタートアップ』

speakerdeck.com

  • 村田 賢太氏による『Rubyにおける機械学習のための環境整備の取り組み』

speakerdeck.com

  • 川崎 禎紀氏による『Rubyを大規模に使い続けるのは難しい? - Wantendly5年間のアーキテクチャの変遷と改善の歴史 -』
  • 木村 圭宏氏による『プログラミングスクール卒業生による受託開発サービス立ち上げとその課題』
  • Rubyアソシエーションによる『Rubyアソシエーション活動紹介』

という構成でした。

休憩時間が頻繁に取られコーヒーの無料サービスもあったことから終始リラックスして話を聞くことができました。

各プログラムのメモ

以下はそれぞれのプログラムについてメモを書き下ろします。

Matzによる主催者講演『Rubyサバイバルガイド』

  • Rubyをどうやってサバイバルしていくかという話。
  • ソフトウェアなのでハードウェアのような摩耗による故障はないが、老化はある。
    • OSが提供するAPIの変化に対応できないなど、周りの環境の変化についていけないことが老化の一つ。
  • RubyはWebアプリフレームワークRailsの登場を契機に主要な言語の一つとなった。
  • Webアプルは年々巨大化
    • 巨大化とは「コードの量」、「アクセス数」、「データ量」それぞれのことを指す。
    • それらに対応するためにスケーラビリティーが求められている
    • また、フロントエンドが複雑化している
  • 他にもRailsがカバーしないモバイルアプリやデータサイエンス、IoTなど色々とソフトウェアが求められる場所が多くある。
  • スケーラビリティーに対してRubyはコンカレンシー、パフォーマンス(最適化)、開発支援などでサバイバルしていく
    • コンカレンシーはマルチコアを活かせるように。例えば、ギルドの導入とか。
    • パフォーマンス(最適化)はJITを。
    • 開発支援はコンパイル時のチェックや静的チェックなど。
  • フロントエンドの複雑化については、Ruby->JavaScriptOpalやOpalを採用しているVolt Frameworkを紹介
  • データサイエンスはSciRubyプロジェクト
  • IoTはmruby
    • スクエニの新作ゲームにも組み込まれているらしい。
  • 質疑応答にて、「Ruby3の互換性は極力維持する方向で考えている」とのこと。

安川 要平氏による『子どものためのプログラミング道場「CoderDojo」を支えるRails CMSの活用事例』

  • 子どものためのプログラミング道場「CoderDojo」のサイトについてどのような作りになっているかを紹介
  • 当初はGitHubでWebページを作成していったが、デザインの改善や様々な要望に答えるためにAngularやParseなどを使ったサイトに移行。
  • Parseの終了やページのContributorが自分以外に居ないことからRailsscrivitoを使ったCMSを構築。
  • 結果、Contributorは12名まで増え、「CoderDojo」の成長を支援している。

森 雅智氏による『TechRacho: 技術情報発信から広げるエンジニア発のコミュニケーション文化作り』

  • 技術ブログ「TechRacho」をどのような思いで続けているかの紹介。
  • 技術情報発信は2016年8月から事業化して平日毎日更新していること。
  • 事業化する前は、(最近の会社の成長で発生した)次のような問題に対する対処のため。
    • 社内の雰囲気や文化の継承が難しく、コミュニケーションが円滑に行えなくなる
    • 新しく入社する人が増えると一時的に開発の出力が低下してしまう
    • 熟練者のスキルアップが難しい
  • 事業化してからは、
    • 記事の社内レビューを実施し、社内エンジニアの技術力向上が図れている
    • 記事化することで流れてしまうチャットの情報を再利用することができている
    • 続けるのは大変
    • 計測可能な指標が取れていない(はてブの数とかはそんなに変わっていない)

村田 賢太氏による『Rubyにおける機械学習のための環境整備の取り組み』

  • 統計分析や機械学習の各種用語の説明から。
    • 人間が介在する統計分析と人間が介在しない機械学習
  • Rubyではデータサイエンスはできない。
  • その理由は以下の3点。
    • 道具がない
      • 正確には道具はあるが、実用的ではない。
        • 機能が足りない
        • 道具間の連携が困難
        • 品質が信頼できない
    • 使っている人が居ない
      • PythonやRを使っている人が多数
      • PythonやRを使ったデータサイエンスの求人が多い
    • 作ろうとする人が居ない
      • 作ることが目的の人が少ない
      • 使う人と作る人のそれぞれのスキルセットは別
  • この負のスパイラルから脱却するためにRubyのためのデータサイエンス環境作りを行っている
  • RubyからPythonやRの資産を使えるようにする
  • PyCallの紹介とデモ
  • itocに記事(『データサイエンスにおけるRubyの現在の位置づけと可能性』)も書いています。

www.s-itoc.jp

川崎 禎紀氏による『Rubyを大規模に使い続けるのは難しい? - Wantendly5年間のアーキテクチャの変遷と改善の歴史 -』

  • 5年間でIssue/Pull Requestは29K
  • 185K行のプログラム
  • モデル数は402
  • Railsでサービスを始めるのは簡単なイメージを持っていた。一方で使い続けるには難しいというイメージを持っていた。
  • 立ち上げ時はモノリシックなRailsアプリ構成
    • ビジネスが拡大しても同じデータを読み込んでモデルのロジックも共有したいという思いからモノリシックな構成に。
  • サービス拡大期(3年目ぐらいから)はサービスを多産多死
  • サービスを追加する際、インフラを構築する時間が長かった(1週間)ので、モノリシックな構成を続けていた
  • モノリシックな構成が限界を迎え始めた
    • 直接関係ない機能の障害によるダウンタイムの発生
    • Railsの起動時間が長い、メモリ消費量の増大など
  • インフラ初期構築は1回やればおしまいということから、モノリシックな構成からの脱却を行った。
  • 現在はMicroservice化
  • やりたいことがRubyでできないことが多い
    • 画像解析ではC++とか
    • 他にもgolangとかやりたいことに応じて技術の適材適所を行っている

木村 圭宏氏による『プログラミングスクール卒業生による受託開発サービス立ち上げとその課題』

  • プログラミングスクール(Dive into Code)卒業生による受託開発サービスを立ち上げて1年経った。そのときに発生した課題について
  • 発生した課題は
    • 案件がない
      • 請負ではなく完全時給型でやったので、実績がない我々に対しては中々案件が来ない
    • 実務経験者0
      • 見積り基準が欠如
    • 人が居なくなる
      • 中心人物に作業が集中してしまう
    • 状況が不透明
      • 基本はリモート作業
      • コミュニケーションが希薄になりがち
    • 教育コストが高い
      • 開発ツールの使用方法などの教育コストが案外高い
      • コードレビューでの指摘も自然と多くなる
  • 問題点を一言で言うと「開発=プログラミング」ではない。開発には設計やインフラ、各種調整など様々なものが含まれている。
  • 上記の課題を解決するために色々と取り組んでいる。幾つかを紹介。
    • 分報
      • 日報の更に細かいもの。Slack上に自分用のつぶやきチャンネルを作成して、色々と呟いてもらう
      • コミュニケーションのハードルが下がった
    • チーム開発演習
      • プログラミングスクール卒業後にチーム開発演習を取り入れる

感想

村田 賢太氏による『Rubyにおける機械学習のための環境整備の取り組み』が一番興味ひかれる話でした。丁寧に各種用語の説明があった後にデータサイエンスの領域における現在のRubyの立ち位置の解説とその解決について述べ、最後にデモも付いていたので、終始引き込まれました。

ビジネスという分野だとやはりRailsの話が中心になるのですが、そろそろ「Railsで早期にサービスをリリースすることができてHappy」という話からWantendlyさんのように長期間サービスを動かしてきたときの話が中心になるのかなと思っています。

そういうときに問題となることの一つがRuby技術力の維持と向上と考えています。そのため、伊藤 浩一氏によるLT『Railsアプリケーションプロジェクトでの読み書きそろばんの1周目、2周目とそれから』や森 雅智氏による『TechRacho: 技術情報発信から広げるエンジニア発のコミュニケーション文化作り』は勉強になりました。

『オブジェクト指向設計実践ガイド』を読んだ

概要

オブジェクト指向設計実践ガイド』を冬休みの課題図書として読み始め、なんやかんやで先日ようやく読み終わったので、その感想を記します。

ざっくりいうと、Rubyを使ったプログラミングの設計の一つのプラクティスについて書かれた本です。訳者あとがきにも

オブジェクト指向設計にまつわる知識はまだまだあります。原則、パターン、手法にしても、本書で紹介されているものは一部です。また、実践も到底足りるものではありません。

と記されており、オブジェクト指向設計の奥深さに軽いめまいを覚えましたが全体的に面白く読めました。

すごく納得できたところ

個人的には、「第3章 依存関係を管理する」でいわゆるDependency injection(依存性の注入)が納得できました。

はじめてDependency injectionという言葉に触れてから8年。ようやく理解できました。

また、「第6章 継承に依って振る舞いを獲得する」はsuperをやたらと書いてしまうコード(P170からの記述)も工夫次第で結合度を減らせるということを学びました。

よく分からなかったところ

「第4章 柔軟なインターフェースをつくる」に書かれている「デメテルの法則」に関する部分(P111から)は結局何が言いたいのかが理解できませんでした。法則と仰々しい名前がついているので「絶対に守らなきゃ」って話ではないってことは分かったのですが、で?って感じを覚えました。

ポジショントーク

ちょっと同意しにくいところはP135から書かれている「静的型付けと動的型付け」の記述です。特にP138に書かれている

動的型付けは、コンパイル時の型検査、つまり、コストが高い割にわずかな価値しか得られない深刻な制約を、コンパイル/ make サイクルを取り除くことによって得られる莫大な効率性と交換してくれます。この交換は破格です。しない手はありません。

という記述は、たしかにコンパイル時の型検査がすべての型チェックをカバーするっていうように信じるのはどうかと思うけど、それにしても言いすぎじゃないかなと引っかかりました。本書の最後に出てくる「9.5 ダックタイプをテストする」(P270)は静的型付けならコンパイラチェックだけでOKなのでは?と思ったりしました。

Rubyを題材に選んでいるためこういう書き方になっているように思うのですが、ちょっと要注意かなと。

ちょっと古い

原著は「Practical Object-Oriented Design in Ruby」という本で、2012年に出た本です。

Practical Object-Oriented Design in Ruby: An Agile Primer (Addison-Wesley Professional Ruby)

Practical Object-Oriented Design in Ruby: An Agile Primer (Addison-Wesley Professional Ruby)

そういうところで、記述がちょっと古いところがあります。自分が見つけたのは、

  • 「初期化の際の引数にハッシュを使う」(P73)については、Ruby 2.0からはキーワード引数がある(訳注に記載あり)
  • MiniTestを使ったテストがMiniTest::Unit::TestCaseを使っている。今はMinitest::Test(P249に記載あり)

ぐらいです。訳注も書かれているので引っかかることは少ないかなと思います。

まとめ

最初はRubyだけじゃなくJavaなどのオブジェクト指向言語一般的に使えるかなと思って読み進めましたが、思ったよりもRubyがベースになっていました。ということで、Rubyエンジニアは勉強になる一冊かなと思います。

mrubyのはじめかたメモ その2 Windows編

はじめに

mrubyのはじめ方について、色々とやったことをメモっておきます。

今日は、Windowsでのmrubyのはじめ方について。

これまでの記事

miyohide.hatenablog.com

環境

準備

Windows上でmrubyをビルドするためには、いろいろとソフトウェアをインストールする必要があります。自分は次のものをインストールしました。

それぞれ説明します。

Visual Studio Community

Windows上でのC/C++コンパイラであるclコマンド等を入手するためにVisual Studioをインストールします。Visual Studioには色々とエディションがありますが、個人開発者は無料で使えるVisual Studio Community Editionを入手、インストールしました。

Visual Studio Community - Visual Studio

インストールするときは、通常の方法でインストールするとclコマンドがインストールされないので、カスタムインストールでVisual C++のインストールを選択してください。

Ruby 2.3.3

Rubyのインストールは、RubyInstaller for Windowsを使ってインストールしました。

RubyInstaller for Windows

環境変数PATHにRubyのインストールパスを通すようにすると後々の作業が楽になります。

また、Development Kit(DevKit)もインストールしておいたほうが良いでしょう。DevKitのインストールは、GitHubのWikiページに記載されているように、

  1. ダウンロードしたDevKitを空白を含まないパスに解凍する(自分は、いつもC:\tools\devkit以下に解凍しています)。
  2. コマンドプロンプトを起動して、DevKitの解凍場所(自分の場合は、C:\tools\devkit)に移動。
  3. ruby dk.rb init」を実行
  4. 生成される「config.yml」を編集。Rubyをインストールしている場所をYAML形式で記述する。
  5. ruby dk.rb install」を実行

とすればOKです。

Bison for Windows

Bisonというツールをインストールします。私はBison for Windowsを使いました。

Bison for Windows

このページにある「Complete package, except sources」をダウンロードしてインストーラーを起動すればインストールが行われます。ここでの注意点は、インストールパスを必ず変更して、空白を含まないパス(例えば、「C:\tools\bison」とか)にインストールすることです。デフォルトでは「C:\Program Files (x86)」以下にインストールされるのですが、このままだとmrubyのビルドのときにエラーを出力して異常終了します。

ビルド

準備ができたら、mrubyのビルドを行います。予め、mruby-1.2.0.zipをダウンロードし、解凍したら「Developer Command Prompt for VS2015」を起動し、そこでコマンドを入力します。

やることは簡単で、「ruby minirake」と実行するだけです。

f:id:miyohide:20170115235938p:plain

マシンスペックにもよりますが、数分でビルドは完了します。

f:id:miyohide:20170115235954p:plain

バージョンを確認してみましょう。

f:id:miyohide:20170116000001p:plain

以上でWindows上でのmrubyビルドが成功しました。

mrubyのはじめかたメモ

はじめに

mrubyについて2ヶ月触ってなかったらきれいさっぱり忘れていたので、ここでメモがてら記録を残してみることにします。

環境

  • mruby 1.2.0
  • OSX 10.11.6 El Capitan

ビルド

mruby 1.2.0をGitHubからダウンロードして、展開します。

[~/work]$ wget https://github.com/mruby/mruby/archive/1.2.0.zip
--2017-01-12 22:30:54--  https://github.com/mruby/mruby/archive/1.2.0.zip
Resolving github.com... 192.30.253.113, 192.30.253.112
Connecting to github.com|192.30.253.113|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/mruby/mruby/zip/1.2.0 [following]
--2017-01-12 22:30:55--  https://codeload.github.com/mruby/mruby/zip/1.2.0
Resolving codeload.github.com... 192.30.253.121, 192.30.253.120
Connecting to codeload.github.com|192.30.253.121|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 501087 (489K) [application/zip]
Saving to: ‘1.2.0.zip’

1.2.0.zip                100%[==================================>] 489.34K  96.6KB/s    in 6.0s

2017-01-12 22:31:02 (82.0 KB/s) - ‘1.2.0.zip’ saved [501087/501087]

[~/work]$
[~/work]$ mv 1.2.0.zip mruby-1.2.0.zip
[~/work]$ unzip mruby-1.2.0.zip
Archive:  mruby-1.2.0.zip
22464fe5a0a10f2b077eaba109ce1e912e4a77de
   creating: mruby-1.2.0/
  inflating: mruby-1.2.0/.gitignore
  inflating: mruby-1.2.0/.travis.yml
  inflating: mruby-1.2.0/.yardopts
  inflating: mruby-1.2.0/AUTHORS
  inflating: mruby-1.2.0/CONTRIBUTING.md
  inflating: mruby-1.2.0/ChangeLog
(省略)
  inflating: mruby-1.2.0/test/t/typeerror.rb
  inflating: mruby-1.2.0/test/t/unicode.rb
  inflating: mruby-1.2.0/travis_config.rb
[~/work]$ cd mruby-1.2.0
[~/work/mruby-1.2.0]$

その後、minirakeコマンドを実行するとビルドが行われます。

[~/work/mruby-1.2.0]$ ./minirake
(in /Users/miyohide/work/mruby-1.2.0)
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/class.c -> build/host/src/class.o
CC    src/codedump.c -> build/host/src/codedump.o
CC    src/compar.c -> build/host/src/compar.o
CC    src/crc.c -> build/host/src/crc.o
CC    src/debug.c -> build/host/src/debug.o
(省略)
             mruby-random - Random class
             mruby-object-ext - Object class extension
             mruby-objectspace - ObjectSpace class
             mruby-fiber - Fiber class
             mruby-enumerator - Enumerator class
             mruby-enum-lazy - Enumerable::Lazy class
             mruby-toplevel-ext - toplevel object (main) methods extension
             mruby-compiler - mruby compiler library
             mruby-bin-mirb - mirb command
               - Binaries: mirb
             mruby-bin-mruby - mruby command
               - Binaries: mruby
             mruby-bin-strip - irep dump debug section remover command
               - Binaries: mruby-strip
             mruby-kernel-ext - Kernel module extension
             mruby-test - mruby test
================================================

[~/work/mruby-1.2.0]$

作られたバイナリはbinディレクトリに作成されます。試しにmrubyのバージョンを出力してみます。

[~/work/mruby-1.2.0]$ ./bin/mruby --version
mruby 1.2.0 (2015-11-17)
[~/work/mruby-1.2.0]$

Hello World

定番ですが、Hello Worldを出力してみます。

まずはソースです。mrubyはRubyと文法が同じなので、Hello Worldは次のようにかけます。

p 'Hello mruby World.'

これを実行します。mrubyコマンドを使ってファイル名を指定することで実行できます。

[~/work/mruby-1.2.0]$ cat hello_world.rb
p 'Hello mruby World.'

[~/work/mruby-1.2.0]$[~/work/mruby-1.2.0]$ ./bin/mruby hello_world.rb
"Hello mruby World."

mrubyはソースをコンパイルすることができます。コンパイルするにはmrbcコマンドを使います。

[~/work/mruby-1.2.0]$ ./bin/mrbc hello_world.rb
[~/work/mruby-1.2.0]$ ls -l hello_world.*
-rw-r--r--  1 miyohide  staff  105  1 12 22:51 hello_world.mrb
-rw-r--r--  1 miyohide  staff   24  1 12 22:47 hello_world.rb
[~/work/mruby-1.2.0]$

作成されたバイナリ(hello_world.mrb)を実行するには、mrubyコマンドに-bオプションを付けます。

[~/work/mruby-1.2.0]$ ./bin/mruby -b hello_world.mrb
"Hello mruby World."
[~/work/mruby-1.2.0]$

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なしとか色々と課題があるので、それをゆっくりと乗り越えていきたいなと考えています。