Railsエンジニアに役立つJupyter NotebookとiRuby

こんにちは。新規広告開発部所属エンジニアのレオ(@lchin)です。普段は広告配信関係のシステムを開発していますが、ここ最近「データサイエンス」に興味を持ち始めました。雑に説明すると、データサイエンスは統計学や機械学習などを用いて莫大のデータから価値を引っ張り出す分野です。今回のtechlifeは、そのデータサイエンスを学ぶ過程で知ったツールJupyter NotebookをRuby on Railsの開発に役に立つ使い方を紹介します。

Jupyter Notebookとは何か

Jupyter Notebook*1は科学者の「実験ノート」にインスパイアされたウェブ上のインタラクティブシェル環境です。ただのインタラクティブシェル環境ではなく、ソースコード、その実行結果、解説する文書、数式、画像などをまとめて1つの「ノートブック」ドキュメントとして扱えることが特徴です。

Jupyter NotebookはPythonで実装されていますが、ウェブのUIとノートブックのソースコードを実況する環境が分かれている設計のため、Python以外に様々なプログラミング言語に対応しています。ソースコードを実行するコンポーネントはkernelと呼ばれています。Rubyを実行するkernelはiRubyです。

Jupyterの試し方

Jupyterをインストールせずに試す方法としてTry Jupyterがあります。Rubyのサンプルノートブックはないのですが、iRubyがインストールされてる環境ですので、MenuからRubyを使ったノートブックを作成できます。

f:id:lchin:20151006185319p:plain

ちょっと試すのに、Try Ruby上に入ってるGemを調べてみます。

local_gems = Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name }
local_gems.keys.each {|gem_name| puts gem_name }

作成したノートブックはnbviewerを使って、実行結果を含めて共有できます。例えば、上記のRubyをTry Jupyterに実行してみた結果は以下のURLに閲覧できます。

JupyterとRails

さて、Jupyterを使ってRuby on Railsの開発に役立つには、Railsアプリに接続する必要があります。まず、JupyterとiRubyを手元の環境に用意します。

JupyterとiRubyをインストールする

Pythonのある環境であれば、pipなどでインストールできます。

pip install jupyter

Pythonのない環境の場合、Jupyter公式ドキュメントのインストール手順に従い、Anaconda(Jupyterを含むデータサイエンス向けPython版)をインストールします。

iRubyはRubyGemsでインストールできますが、環境に応じてlibmzq3など依存ライブラリのインストールも必要です。

gem install iruby

そして、Jupyterにirubyを登録して、jupyterを起動します。

ruby register
jupyter notebook

Railsと繋ぐ

iRuby kernelを使ったノートブックは少し特殊なirbみたいなものです。Railsと繋ぐには、rails consoleと同じようにRAILS_ROOTでbootして環境を読みこめばよいです。

FileUtils.cd rails_root
require './config/boot'
APP_PATH  = File.expand_path('config/application') unless defined?(APP_PATH)
require APP_PATH
Rails.application.require_environment!

Jupyterの応用

Jupyter Notebookは、ad-hocなソースコードを実行し、その実行結果を文章などと合わせてドキュメントにまとめてnbviewerに共有することがチームでRailsアプリを開発する様々な場面で役に立ちます。

  • IRB, pryなどの代わりのプロトタイピングと検証(結果が残るから再現しやすい)
  • 新機能をプルリクエストにまとめる時、その動作や実行結果を共有して簡単なでもにする
  • デバッグする時に、バグを再現した結果データや原因の仮説などを別のファイルにコピペせずに、1つの資料に残せるため、時間が掛かるバグ調査が少し楽になる
  • プログラムやアルゴリズムの最適化を行うときもデバッギング同様に、実験の繰り返しですので、仮説、コード、データ、が揃えてる残す必要のある作業である
  • また、RailsアプリのDBに入ってるデータを直接引っ張りだして、darustatsampleなどSciRubyの科学計算ライブラリを応用してデータ分析もできる

終わりに

科学者同様にエンジニアも科学的方法を応用することに価値があると思います。そこで、Jupyter Notebookは役に立つツールですし、iRubyと合わせるとRuby on Railsアプリの開発過程でも便利に使えます。是非試してみてください。

最後に、クックパッドでは私達と一緒に「科学する」エンジニアを積極的に募集していますので、是非ご応募ください!

*1:以前はiPython Notebookと呼ばれましたが、Pythonだけを実行する環境ではなくなったため、Jupyterに命名変更されました

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/