オンラインでの小規模なR, Python, Juliaの環境共有にはbinder: 既存サービスとの比較

## はじめに

2018年になり、データ分析を行うプログラミング言語は、従来のRとPythonの二強に加えて、Juliaが台頭してきたように思えます。また最近ではこれらの言語で記述可能なノートブックを提供するJupyterプロジェクトにおいても、総合開発環境としての面を強化したJupyterLabが[発表されました](https://blog.jupyter.org/jupyterlab-is-ready-for-users-5a6f039b8906)。

さて話題が変わりますが、皆さんは普段一緒に作業するメンバー以外と分析・開発環境を共有する際、どのような手段を使っているでしょうか。ソースコードやデータはGitでのバージョン管理かと思います。では個人のコンピュータ内でのライブラリ等の環境はどのように脚を揃えているのかが気になるところです。ソースコードが共有できていても、実行環境での依存ライブラリ等のバージョンを揃えるのは難しいですよね。差分を確認するのも面倒です。

また勉強会やワークショップのために用意したコードが当日になって動かせないと残念です。こうした問題を解決する一つの方法としてDockerの利用が考えられますが、Dockerなんてインストールしたくない・できないという人も、あるいはインストールで失敗したりつまづいたり、ということがあるかもしれません。

dockerの話は以前書いたこちらも参照ください 

[データ分析環境の構築にDockerを利用しよう - Qiita](https://qiita.com/uri/items/475eb4dd158ee22f2635)

[![https://speakerdeck.com/s_uryu/so-everybody-just-follow-me](https://qiita-image-store.s3.amazonaws.com/0/19462/53264952-51c5-9841-7d6e-3d7678cb1e07.png)](https://speakerdeck.com/s_uryu/so-everybody-just-follow-me)

[コンテナで暮らそう / So everybody, just follow me // Speaker Deck](https://speakerdeck.com/s_uryu/so-everybody-just-follow-me?slide=4)

そのような場合、言語のインストールや環境構築の手間を省略し、オンライン上でコードを実行させるサービスを利用すると良いでしょう。こうしたサービスを提供する言語、会社は増えてきており、Juliaには、GitリポジトリやGoogle Driveからプロジェクトを展開可能なオンラインノートブックの[JuliaBox](https://www.juliabox.com/)が、RにはRStudio社が提供する[RStudio Cloud](https://rstudio.cloud/)、またこの他にJupyer Notebookをオンラインで編集する[Microsoft Azure Notebooks](https://notebooks.azure.com/)もあります。実際にJuliaBoxはCoursera等のMOOCの[コース](https://www.coursera.org/learn/julia-programming/)で利用されており、チュートリアルの充実なども含めて初めての方への導入や初心者が慣れていく環境としては優れているように感じました。

## Binder

ですがこの記事で紹介したいのは[binder](https://mybinder.org/)です（以前から存在していましたが、最近知りました。）。binderは、Gitリポジトリを指定したURLを共有することで、対象のリポジトリ内にあるファイルをJupyter notebook上で実行するサービスです。BinderもGitリポジトリ(GitHubの他GitLab)にソースコードが置かれていることを前提としており、さらにDockerfileを用意することで、好みの機能を拡張したり、パッケージの追加も容易です。

Binderと既存のサービスを比較すると次のようになります。

| サービス | 基盤 | Git連携 | Julia | Python | R | JupyterLab対応 | 特色 |
|-------- |------|--------|-------|--------|---|------------|-----|
| JuliaBox | Jupyer | ✅ | ✅ | ❌ | ❌ | ❌ | Juliaに特化。Git連携に加えて、Google Driveとの同期も可能。
| Azure Notebooks | Jupyter | ✅ | ❌ | ✅ | ✅ | ✅ | `F#`にも対応。MS社のCognitive Servicesのためのツールキットが整備されている |
| RStudio Cloud | RStudio Server | ✅ | 🔺| 🔺 | ✅ | ❌ | RStduioのプロジェクトでの起動。URLで共有可能。Julia, Pythonにさんかくをつけたのは、Rから各言語を動かすためのライブラリが提供されているためです(RStudio Cloudで実行可能かどうかは検証していません)。 |
| Binder | Jupyer, RStduio Server | ✅ (ブランチ、コミットハッシュの指定も可能) | ✅ | ✅ | ✅ | ✅ (`?urlpath=lab` をつけて起動) | GitHub, GitLabリポジトリ内での細かな指定が可。Dockerファイルによる拡張ができる |

デモンストレーションのためのリポジトリを用意しました。ボタンをクリックするとbinderによるビルドが実行され、ちょっと待つとJupyer Notebookが立ち上がります。(READMEに貼れるバッジが提供されているのもgoodです。)

[![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/uribo/binder_demo/master)

[デモ用のGitリポジトリ](https://github.com/uribo/binder_demo)

立ち上がったら、**`jpmesh_demo.ipynb`**を開いて実行してみてください。用意したパッケージがインストールされた状態で起動していることがわかります。

このようにbinderではGitHubのリンクおよびバッジを用意すれば、すぐに第三者が再現可能な環境を提供することが可能です。またbinderでは`requirements.txt`などの[設定ファイルを用意する](https://mybinder.readthedocs.io/en/latest/using.html#config-files)ことで、再現に必要な依存ライブラリをバージョンを指定した状態でインストールできます。このデモリポジトリではRの実行を想定しているため[`install.R`](https://github.com/uribo/binder_demo/blob/master/install.R)に必要なパッケージを指定しています。

binderでは、Jupyerの実行環境としてPython2系など多様な状況を想定した[サンプルが豊富に用意されている](https://mybinder.readthedocs.io/en/latest/sample_repos.html)ので、そちらを見るとより利用時のイメージがつかめると思います。。

一方でBinderの気になる点（ネガティブな視点）は以下です。

- ユーザを管理しないため、セッションを保持できない
    - 各種形式 (`.ipynb`, `.r` など)への出力が可能
- Gitリポジトリをクローンするのに時間がかかる
- 同時に接続した際の負荷が心配

@kozo2 さんの[記事](https://qiita.com/kozo2/items/fef4ee9c175f941a8a59)でも強調されていますが、「**あくまで「計算環境再現の保証」と「誰もが試用できる計算環境の提供」を目的としている**」のが特徴で、この点を生かしてセミナーやブログ記事等を再現させるのに良いのではないかなと思っています。

### RStudio Serverモード

Rユーザ（私）の皆さんに朗報です。BinderはJupyet Notebookを起動させますが、なんとRStudio Serverを立ち上げることも可能です。これには2つの方法があり、Dockerイメージの[`rocker/binder`](https://hub.docker.com/r/rocker/binder/)(こちらはgeospatialな解析に必要なパッケージも備えています)を使うか、起動時のURLに`?urlpath=rstudio`を指定するかです。URLの方は公式なサポートで、最近行われたようです。

次のgif画像で示していますが、起動したJupyer Notebookの右側にある`New`ボタンをクリックし、RStudio Sessionを選択するとRStudioに切り替わります。ファイルはそのまま引き継がれています。感動！

![wztKi2S4kf.gif](https://qiita-image-store.s3.amazonaws.com/0/19462/496a1ba7-f514-5747-2edf-441b04f160a8.gif)


https://github.com/binder-examples/r

RStudioを直接起動するブランチを用意しました。こちらのバッジをクリックで起動します。

[![Binder](http://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/uribo/binder_demo/unnecessary_docker?urlpath=rstudio)

というわけで、勉強会等の場所で、自分の環境では再現できたんや！なんでや！！とならなくてすみそうです。積極的に導入していきたいですね。

## 参考URL

Binderの紹介記事はQiitaや他のサイトにもいくつかの日本語記事がありました。この記事を書くために参考にした記事とともに掲示しておきます。

- [無料JupyterサービスのBinderの紹介 - Qiita](https://qiita.com/SaitoTsutomu/items/821ebd608c412e57382d)
- [binder の紹介 - Qiita](https://qiita.com/kozo2/items/fef4ee9c175f941a8a59)
- [Azure Notebooks 活用の tips - Qiita](https://qiita.com/kozo2/items/cc6444e6bc02374e18ad)
- [Binder: an awesome tool for hosting Jupyter notebooks - Julia Evans](https://jvns.ca/blog/2017/11/12/binder--an-awesome-tool-for-hosting-jupyter-notebooks/)
- [Binder 2.0, a Tech Guide – Jupyter Blog](https://blog.jupyter.org/binder-2-0-a-tech-guide-2017-fd40515a3a84)
- [Running Executable Jupyter/IPython Notebooks Directly from Github With Binder | OUseful.Info, the blog...](https://blog.ouseful.info/2015/10/31/running-github-hosted-jupyter-previously-ipython-notebooks-as-online-applications/)

Thanks @alt :)