【2020-08-24更新】本文の随所に https はibex farm だと使えないという旨の 記述があらわれますが 2020/04/26 以降からhttps は使えます。

April 26, 2020, Alex Drummond (the creator of IBEX) has secured the domain of the original Ibex Farm.

  • https://www.pcibex.net/2020/04/27/farms-performance-slowdowns-alternatives-future-plans/

【2021-08-30更新】ibex-farm によるサービス提供は終了しますが、PCIbexに移行すると良いと思います。 外部にデータを置くのが問題ある場合、今回紹介する方法は役に立つかもしれません。

はじめに

研究室の先輩が「サーバー借りて ibex (心理言語学とかで使われるオンライン実験) を公開したい」 と言っているのをゼミのslackで目にしました1。 通常の公開手順は簡潔で便利ですが、 制限もあり場合によっては都合が良くないからです(なおこの手の「公開」をデプロイと呼びます)。

以下の表の一行目には従来の手法 (PC/Ibex farm) とサービスの安定性、Don’t repeat yourself(DRY)、 データの保存場所を記載してます。 DRYはデータをコピー、ダウンロードしないとならないという話で、 ストレージはファイルの保存場所の話です。

Method Stability DRY Storage
ibex farm depends on ibex farm copy code and results remote
local + ngrok depends on local and ngrok :) local

従来の ibex farm を用いた手法だと データやソースはコピーしないとならず、また実験はPCIbexの運営の安定性に依存します。 他方、今回紹介する手法(二行目)では 実験の安定性の依存先を変更できたり、 ソースコードのコピペや結果のダウンロードが不要になり、 データの保存場所も外部のサーバーではなくお手元のPCになります。

以下、まずは心理言語学で使われている オンライン実験をさくっと紹介し、 手元で実行しているibex実験をウェブを通じて公開する手順を紹介します。 なお ibex を挙げていますがあくまでも例なので、 ブラウザ経由で実行できる類の実験ならなんでも良いはずで、 そこそこ汎用性はあると思います。

手法

ibex: 実験webアプリケーション

概要

心理言語学の一界隈では ibex という実験用webアプリが利用する流行があり、 「オンライン実験ってオンサイトと変わらないくらい信頼性あるよね」 という雰囲気があるとおもいます。 なお、オンライン実験の背景や特徴、注意点などは以下の動画がまとめています。

本題に戻りますが、ibexは実験用webアプリなので、 実験をオンラインで実施できます2。 この「webアプリ」というのは私達が普段使っている YouTube や Gmail などのサービスと同じで、 1. webアプリ2. サーバー3. URL が必要です。 この内、ibex は実験の1の雛形を提供してくれていて、 後述する ibex farm は2と3を提供してくれます。 我々エンドユーザーはibexの /data_includes 等を変えることで 実験のwebアプリを作るわけです。

例えば、 Google が YouTube というwebアプリのソースコードを全て公開しているとします。 もし YouTube のフォントをヒラギノに変えたければ、 その設定だけを変えて公開すればヒラギノYouTubeのwebアプリができるわけです。 同様に、ibexのソースコードは全て公開されており、 英語の Self-paced reading test の文を任意の日本語にしたければ、 /data_includes 等を変えれば日本語SPRTの実験用webアプリになるわけです3

ハンズオン

いやそもそも /data_includes って何ですか、 となる方もいると思うので、まずは ibex のソースコードのダウンロードから始めましょう。 GitHubのページ に 緑のボタンがあるので、そこからソースコードを落とします。 あるいはここ をクリックでもいけると思います。 zipファイルibex-master.zip のダウンロードを視認したら次に進みます。

ダウンロードした ibex-master.zip は 人によって後から確認しづらい場所に置かれてしまうかもしれません。 このあと使うので見やすい場所に移動させましょう。 Mac や Windows ならデスクトップとかがオススメです。 Macならアーカイブユーティリティみたいなやつ、 Windowsなら右クリックで解凍できます。

ここでようやく先ほどの /data_includes の説明ができます。 中を見ると細々としたものが書かれていますが、 ここでは何も触れず、 「あぁ実験の設定や刺激はここらへんで指定するんだなぁ」 ということのみを確認しましょう。 ibex自体の詳しい説明はマニュアルか、 日本語なら『ことばの実験研究の方法』という書籍を参照できます。

以上がwebアプリとしてのibexです。 本当はすぐに変更して試したいのですがサーバーの話を先にするので、 www/server.py の存在も確認しましょう。 (Windows だと .py が見えないかもしれません)

Python 2: サーバー

概要

さて、webアプリを動かすためにはサーバーやURL4が必要であると上で述べました。 サーバーというとわかりづらいですが、 要はwebアプリをユーザーに提供(serve)してくれるパソコンのことです。 ibexはサーバーの起動にPythonを使うので、 Pythonさえ使える環境ならばお手持ちのPCでもibexを起動できます。 (もしかしたら実験の動作チェックにしたことがある方もいるかもしれません。)

Python には2系と3系があり、ここでは2系を使います。 将来的には3系に移行すると思うので、 ドキュメントを実施前に確認したほうが良いと思ってます。 今回はPythonのコードを触ることはないので、 「実験のアプリをローカルで動かすサーバーの起動に必要なんだなぁ」 ということのみを確認しましょう。

ハンズオン

実験をローカルで動かすために Python 2 のインストールから始めましょう。 まずは BeginnersGuide/Download を参照しながらOSにあった 2.7 をダウンロードします。 [Latest Python 2 Release - Python 2.7.x]をクリックすると、 Version 列の末尾に installer とついたファイルが見つかります。

Operating System 列のでOSと合うインストーラーを落とします。 なお、Windows x86-64 MSI installer は64bit用です。 自身のPCのバージョンを確認する方法は FAQで確認してください。 落としたファイルをクリックしたら大抵の場合は そのままインストールが始まります。

チェック

ここまでの確認として、 ibexをローカルのサーバーで動かしてみるチェックをしてみます。 手順は以下の通りです。

  1. ibex-master/www/server.py を python で実行
  2. localhost:3000 に接続
  3. 実験画面の確認

最初の ibex-master/www/server.py に関しては server.py をクリックしても、 ターミナルを立ち上げて python2.7 server.py を打ち込んでもいけます。 Windows で PowerShell などに詳しくなければ クリックして実行で良いでしょう。 おそらく、www/server.py がアイコン付きで表示されているはずです。

起動した後、画面自体には特に変化はありませんが、 Chromeなどのブラウザから localhost:3000 に接続してみます(URLにベタ打ちでOKです)。 すると実験画面が現れ、これで ibexがローカルで動いていることになり、 実験の動作確認なんかでも使えるのでそこそこ便利だとは思います。

ibex-localhost

なお、実験を表示させてみて変えたい場所があれば grep -r 'query' のようにコマンドすることで編集したい場所を スムーズに探せます。 もちろん、何がどこにあるかをドキュメントを読んで 確認するほうが大切ですが、 最初の取っ掛かりとしてはそれもありかと。

ngrok: URLの発行と接続

概要

これでローカルで実験のアプリを起動はできました。 ただ、これだと実験用のPCを被験者に送らない限り 被験者に参加してもらうことはできません。 このローカルで起動した実験にインターネット経由で 直接アクセスしてもらうことはできないのでしょうか。 そこで使えるのが ngrok です。

ngrok はざっくり言うと ローカルで稼働しているネットワークサービスを外部公開できるサービスです。 OSによって作業が変わるのですが、基本的には 以下の手順を踏みます。

  1. ngrok の利用登録/鍵を取得
  2. ngrok (アプリ) のインストール/鍵登録
  3. URLとポートをトンネル

ハンズオン

まずは ngrok の利用登録を行い、通信に必要な鍵を取得します。 利用登録は 1. ngrok のホームページに行き 2. サインアップ、ログイン するだけです。 なお、この時 google か github のアカウントを持っているとスムーズです。 ログインする以下のような画面に移ると思います。

ibex-localhost

ログインすると ngrok.exe authtoken <token> のコマンドが表示され、 authtoken の後ろが「鍵」です。 なお、画像では「見せられないよ!」となっている部分が鍵になります。 ここまでが ngrok の利用登録/鍵を取得の話になります。

次に ngrok (アプリ) のインストール/鍵登録でして、 インストールはzipを落として解凍するだけです。 つまり ibex-master.zip と同様の作業をします。 すると ngrok の実行ファイルが生成されます。 なお、次の「鍵登録」はちょっとややこしい+ セッションに8時間くらいの制限がつくだけなので、 雰囲気だけ掴みたい場合は飛ばしてOKです。

Windowsの場合は解凍して生成された ngrok の実行ファイルをクリックします。 するとターミナルという黒い画面が起するので、 ngrok.exe authtoken <token> とタイプします。 この token の部分には先程の「見せられないよ!」をコピペしてください。 もしかすると ctrl + v が聞かないかもしれませんが、 右クリックとかでペーストできるかもしれません。

Mac の場合は同様に ngrok の実行ファイルがあるディレクトリに移動して ターミナルを起動し、 ./ngrok authtoken <token> とタイプします。 token の部分には先程の「見せられないよ!」をコピペしてください。

そしてibexが起動している local port の3000番に HTTP tunnel forwardingをするために、 ターミナル上でWindows は ngrok.exe http 3000、 Mac は ./ngrok http 3000、 をコマンドします。

チェック

するとターミナル上にトンネルの入り口のURLが表示されるので、 それ経由で別のPCからインターネット経由で ご自身のPCの3000番で実行している実験にアクセスできます。 任意の端末で表示されているURLにアクセスしてみてください。 その端末でサンプルを行うと、 ローカルの ibex/results の下に結果が保存されるはずです。

未検証

ここまでで色々と詰めたわけですが、 いくつか未検証な部分や制限があります。 まず、安定性がローカルに依存することから、 ローカルのプロセスが落ちると実験は落ちます。 なので、実験中はローカルを起こしておかないといけません。

Method Protocol Stability DRY
ibex farm http depends on ibex farm copy code and results
local + ngrok http/https depends on local and ngrok :)

また、一度プロセスが落ちるとURLが無効になるため URLの貼り直し(./ngrok http port) を再度行わなければなりません。 実験の手順をHackMDやNotionなどのサービスで共有していれば 「当日確認してください」とできますが、 メールでURLを配信してしまっている場合は再配信が必要になります。 ただ、スリープならプロセスは死なないのでURLも使い続けられます。

後はプロセスを落とした後、ラテンスクエアなどが機能するかは検証していません。 また、別のPCで立ち上げて実験をすれば別の実験扱いになります。

まとめ

さて、ここまでの話は少し重かったので、 最後に三つのアプリの役割を下のテーブルを見ながら整理しましょう。

Application Role
ibex experiment design / web app.
Python 2 local server to run the app.
ngrok provides URL to localhost

ibex は実験webアプリなので、これを変更して実験をデザインします。 そしてPython 2 はibexでデザインしたwebアプリを ローカルで走らせるのに使い、 ngrok はローカルで走っている実験へのトンネル(URL発行、アクセス)を行います。

つまり、 1. ibexで実験を作成2. Python2 で実験を localhost で実行3. ngrok でlocalhostで走る実験へのURLを発行 の3ステップを実行することになります。

ibex farm は 1. アレンジされた ibex の実験ファイル(`/data_includes`)を受け取りibex用のサーバーとURLを提供してくれるのです5。 ありがたいですね。

おまけ

いただいたコメント

PCIbexのフォーラムにIRB approvalを得るためサーバーの詳細を知る必要があるんだが、 どこで参照できるのかというコメント があったそうです。 そういう時にも自分のサーバーです(キリッ) と言えると面倒が少なくて嬉しいかもしれません。

ただ、ユースケースがやや限定的で、 常にサーバー監視してないと落ちると気づけないのも事実です。 ここらへんはibex farmとかを使ってても同じことが言えるんですが、 これはibex farmにping飛ばし続けるbotを作って こっちは落ちたらslackにアラート、とかでも解決できる気がします。

あとibexの実験で手元にデータが溜まるのは結構新鮮な体験らしいです。

Git/GitHubで管理

実験デザイン(コード)や結果の共有に GitとGitHubを使えば コードや結果の等価性を保証できます。

Text Editor

要はJavaScriptなわけですが、 カッコのマッチやインデントの整理などの 機能を持つテキストエディターがあると良いでしょう。

  • Visual Studio Code
  • Atom
  • Sublime

SSH

ローカルを落としたい時、 SSHを使えばつけっぱなしにできます。 あとは audio を回収するときの 受け入れサーバーにするとか?

  • https://www.pcibex.net/wiki/recording-and-collecting-audio-samples/

nginx

もうデプロイしたほうが早いと思った人向け: HackMDインストールとHTTPS化まで

  1. サーバー借りるとこは良いとはいえ、 わざわざ実験のためにドメイン取得して固定するのかとか、 デプロイどうすんねんとか、 そもそも既存のプラットフォームじゃだめなんかとか、 いろんな懸念がありました。 また仮に実行できても、 手法の汎化性能が低過ぎで 属人化する雰囲気がはんぱない。 

  2. 開発者は Alex Drummondでアプリの コードマニュアルも オンラインで参照できます。 

  3. 変えたい場所があれば grep -r 'query' のように コマンドすることで編集したい場所を スムーズに探せます。 

  4. 正確にはドメインですが簡単のため。 

  5. まだ ibex と ibex farm の違いはわかりづらいかもですが、 イメージとしては 「動画を公開したいけど自分のサーバー/URLがないからYouTubeに投稿しよう!」 というのに似ています。 動画を上げると、動画再生アプリを動かすサーバーとURLが同時に利用可能になりますよね。 つまり 「実験を公開したいけど自分のサーバー/URLがないからibex farmに投稿しよう!」 という感じです。 実験のwebアプリを動かすサーバーとURLが与えられるわけです。