Hacks

この 10 年間で、「科学計算」と「データサイエンス」、つまり自然科学や社会科学の問題に答え、データを分析するための計算のアプリケーションへの関心が爆発的に高まっています。 このようなニーズに対応するため、科学者や研究者がデータや科学的概念を探求・理解し、その結果を伝えるのに役立つプログラミング言語、ツール、技術がルネッサンス期を迎えている。 しかし、これまで、科学者が現代のウェブブラウザの持つコミュニケーションの可能性を最大限に活用できるようなツールは、ほとんどありませんでした。 Iodide は、科学者がウェブ技術を使用して美しいインタラクティブなドキュメントを書くことを支援する実験的なツールで、他の科学的コンピューティング環境と同様に感じられる反復ワークフロー内ですべてが行われます。 これは、IDEスタイルの環境では、.pdfファイルのようなプレゼンテーション用のドキュメントが出力され、元のコードから切り離されますし、セルベースのノートブックでは、コードとプレゼンテーションの要素が混在しています。 Iodide では、あなたが見たいように見えるドキュメントと、基本的なコードおよび編集環境への簡単なアクセスの両方を得ることができます。

Iodide はまだ非常にアルファ版の状態ですが、インターネットの格言「製品の最初のバージョンで恥をかかないなら、ローンチが遅すぎた」に従って、より大きなコミュニティからフィードバックを得ることを期待して非常に初期のソフト リリースをすることにしました。 今すぐ試せるデモを用意していますが、かなり荒削りな部分もあるかと思います(このアルファ版リリースを重要な作業に使わないでください!)。 荒削りではありますが、目を凝らせばこのコンセプトの価値がわかると思いますし、みなさんからのフィードバックが次に進むべき道を見出す助けになることを期待しています。 ユーザーがブラウザの拡張機能を発見するのに役立つ推奨エンジンなど、ユーザーのエクスペリエンスを直接改善することを意図したモデルを展開することもありますが、ほとんどの場合、データ科学者は、製品マネージャー、エンジニア、および経営陣の意思決定に情報を与える洞察を発見し共有するために、データを分析します。 この結果、通常、文書、いくつかのプロット、あるいはインタラクティブなデータ可視化など、ある種のレポートが作成されます。 多くのデータサイエンス組織と同様に、モジラでは Jupyter や R-Studio のような素晴らしいツールを使ってデータを探索します。 しかし、結果を共有するとき、通常、Jupyter ノートブックや R スクリプトを意思決定者に手渡すことはできないため、主要な数字や要約統計を Google ドキュメントにコピーするようなことをしばしば行っています。 調査によると、多くの人がこの経験を共有しています。 あるデータサイエンティストが他の人の最終報告書を読んでいて、その背後にあるコードを見たいと思ったとき、多くの摩擦が生じることがあります。 コードを追跡するのが簡単な場合もあれば、そうでない場合もあります。もし、そのコードを実験したり拡張したりしたい場合は、さらに難しくなります。 別のデータサイエンティストはあなたのコードを持っているかもしれませんが、彼らのマシン上に同一の構成を持っていないかもしれず、その設定には時間がかかります。

The virtuous circle of data science work.

Why is so little web in science?

Mozillaでのこれらのデータサイエンスワークフローの背景として、2017年の終わりに私は対話型のデータ可視化を求めるプロジェクトを引き受けたのです。 今日では、Python、R、Julia の優れたライブラリーを使用してインタラクティブな視覚化を作成できますが、私が達成したいことのためには、Javascript に落とす必要がありました。 これは、私が慣れ親しんだデータサイエンス環境から離れることを意味します。 最近のウェブ開発ツールは非常に強力ですが、非常に複雑です。

私は、なぜこのツールが存在しないのか、なぜインタラクティブな Web ドキュメントを構築する Jupyter が存在しないのかと考え始め、すぐに、なぜほとんど誰も Javascript を科学計算に使用しないのかを考えるようになりました。

  1. Javascript 自体が遅くて厄介であるという科学者の間で様々な評判があります。
  2. ブラウザで動作する、または Javascript で動作する科学的コンピューティング ライブラリは多くありません。

これらは非常に大きな課題です。 しかし、さらに考えてみると、ブラウザで作業することは、私たちが Mozilla で行っているコミュニケーション型のデータ サイエンスの種類にとって、いくつかの本当の利点があるかもしれないと思うようになりました。 もちろん、最大の利点は、ブラウザには、DOM から WebGL、Canvas、WebVR まで、間違いなく地球上で最も高度でよくサポートされている一連のプレゼンテーション テクノロジーがあるということです。 私は、科学者が Web ドキュメント (基本的にアイデアを説明するための単一目的の Web アプリ) を繰り返し使用できるように設計されたツールを求めていましたが、私たちが使用していた多くのツールは、それ自体が基本的に Web アプリでした。 このような小さな Web アプリのドキュメントを書くというユースケースについて、ドキュメントをそれを書くために使用するツールにバンドルしてはどうでしょうか。

こうすることにより、技術者ではない読者は私の美しいドキュメントを見ることができますが、他のデータ科学者は直ちに元のコードに戻ることができます。 さらに、計算カーネルはブラウザーの JS エンジンであるため、分析コードの拡張や実験をすぐに開始することができます。

Towards Iodide

私は同僚とブラウザでの科学的コンピューティングの潜在的な長所と短所について議論し始め、会話の中で、他の興味深い傾向に気づきました。 WebAssembly は、信じられないほどの速度で、場合によってはネイティブ バイナリに近い速度でプログラムを実行することを可能にします。 3Dゲームエンジン全体のような計算負荷の高い処理も、ブラウザ上で難なく実行できる例を目の当たりにしていました。 今後、クラス最高のCやC++の数値計算ライブラリをWebAssemblyにコンパイルして、SciPyプロジェクトがPythonに対して行っているように、人間工学的なJS APIでラップすることが可能になるでしょう。 実際、プロジェクトはすでにこれを始めていました。

WebAssembly は、ブラウザでネイティブに近い速度でコードを実行することを可能にします。 おそらく、MATLAB、Julia、および Python において数値プログラミングをより理解しやすく流動的にする主要な構文要素 (行列の乗算、多次元スライシング、ブロードキャスト配列操作など) をエミュレートすることが可能であろうと思われます。

これらのスレッドが収束するにつれ、Web プラットフォームが科学計算のための生産的なホームになりつつあるのではないかと思うようになりました。 少なくとも、私たちが Mozilla で遭遇する (そして、他の多くの人々が産業界や学界で遭遇する) コミュニケーション ワークフローのいくつかに役立つように進化する可能性があるように見えました。 Javascriptのコアは常に改良されており、数値プログラミングのための構文拡張も可能なので、おそらくJS自体を科学者にとってより魅力的なものにすることができるはずです。 WebAssemblyは、素晴らしい科学ライブラリへの道を提供しているように思えました。 そして、3本目の脚は、Web上でデータサイエンスのドキュメントを作成するための環境でしょう。 この最後の要素が、私たちが最初の実験に焦点を当てることに決めた場所であり、Iodide にたどり着きました。

The anatomy of Iodide

Iodide は、Web プラットフォームの全パワーを使用して、優れた外観の対話型ドキュメントを作成するための使い慣れたワークフローを科学者に与えるために設計されたツールです。 そのために、「レポート」、つまり基本的にはコンテンツで埋められる Web ページ、およびデータを繰り返し調査し、レポートを修正して共有できるものを作成するためのいくつかのツールを提供します。 完成したレポートには、直接リンクを貼ることができます。 同僚や共同研究者があなたのコードをレビューしてそこから学びたい場合は、ワンクリックで探索モードに戻ることができます。

このワークフローを流動的にするために私たちが試しているいくつかのアイデアについて、もう少し詳しく説明します。 その中心となるのは、見栄えのする文章と、反復的な計算探索のための有用な環境との間を行き来する能力です。 これは、コードを書くためのエディター、評価したコードからの出力を見るためのコンソール、セッション中に作成した変数を調べるためのワークスペース・ビューアー、およびレポートのプレビューを見るための「レポート・プレビュー」ペインなどのペインのセットを提供するものです。

Iodide のエクスプローラ ビューで Markdown コード チャンクを編集する。

右上の「レポート」ボタンをクリックすると、レポートのプレビューの内容がウィンドウ全体に広がり、伝えたいことを前面と中央に配置することができるようになります。 コードの書き方を知らない読者や、技術的な詳細に興味のない読者は、コードを読み進めることなく、伝えたいことに集中することができます。 読者がレポートビューへのリンクにアクセスすると、あなたのコードが自動的に実行されます。コードを確認したい場合は、右上の「EXPLORE」ボタンをクリックするだけで、エクスプローラビューに戻ることができます。

Explorer から Report View への移動

Iodide notebook へのリンクを共有すると、共同作業者は常にこれらのビューにアクセスすることができます。

Web プラットフォームのパワーによるライブでインタラクティブなドキュメント

Iodide ドキュメントはブラウザでライブで、つまり計算エンジンが常に利用可能です。 作品を共有するときはいつでも、実行中のコードを含むライブの対話型レポートを共有することになります。 さらに、計算がプレゼンテーションと一緒にブラウザーで行われるため、別のプロセスで言語バックエンドを呼び出す必要はありません。 これは、インタラクティブなドキュメントがリアルタイムで更新され、VR に必要な低レイテンシーと高フレームレートでも、シームレスな 3D ビジュアリゼーションの可能性が開けることを意味します。

Contributor Devin Bayly が自分の脳の MRI データを探索

共有、コラボレーション、再現性

Iodide を Web で構築すると、他のツールで発生した多くのワークフローの摩擦の要因が単純化されます。 例えば、Google ドキュメントの脚注にスクリプトへのリンクを貼り付けるのではなく、書き込みとコードが同じ URL で利用可能であるため、共有が単純化されます。 コラボレーションは、コンピュートカーネルがブラウザであり、ライブラリはウェブページがスクリプトをロードするようにHTTPリクエストでロードできるため、簡素化されます – 追加の言語、ライブラリ、またはツールをインストールする必要はありません。 また、ブラウザは互換性レイヤーを提供するので、ノートブックの動作がコンピューターやOS を超えて再現可能であることを心配する必要はありません。

共同作業フローをサポートするために、ノートブックを保存および共有するための非常にシンプルなサーバーを構築しています。 iodide.io に公開インスタンスがあり、Iodide を使って実験したり、自分の仕事を公開で共有したりできます。 また、ファイアウォールの内側で自分自身のインスタンスをセットアップすることも可能です(実際、これは、いくつかの内部作業のために、Mozillaですでに行っていることです)。 しかし、重要なのは、ノートブック自体は、Iodideサーバーの単一のインスタンスに深く結びついていないことです。 必要性が生じた場合、作業を別のサーバーに移行したり、NetlifyやGithub Pagesなどの他のサービスで共有するためにノートブックをバンドルとしてエクスポートすることが簡単にできるはずです(バンドルのエクスポートについては、「次は何ですか」の下で詳しく説明します)。 クライアントで計算を維持することにより、クラウドに計算リソースを構築する必要がなく、共有とコラボレーションのための本当に素晴らしい環境の構築に集中することができます。 たとえば、既存の科学ライブラリを WebAssembly にコンパイルし、それらを使いやすい JS API にラップすることです。 多くの科学者が Python を好むのであれば、WebAssembly で実行するために Python 科学スタックをコンパイルすることによって、彼らがいる場所に対応するのです。 その後数ヶ月の間に、Numpy、Pandas、Matplotlibを追加しました。これらは、Pythonの科学エコシステムの中で圧倒的に使用されているモジュールです。 NexediのKirill SmelkovとRoman Yurchakの協力で、Scipyとscikit-learnをサポートすることになりました。 それ以来、他のライブラリを少しずつ追加し続けています。

JavaScript 仮想マシン内で Python インタープリターを実行すると、パフォーマンス上のペナルティが発生しますが、そのペナルティは驚くほど小さいことが判明しました – 私たちのベンチマークでは、Firefox でネイティブより約 1x-12x 遅く、Chrome では 1x-16x 遅くなりました。 経験上、これはインタラクティブな探索に非常に有用です。

ブラウザで Matplotlib を実行すると、静的環境では利用できない、そのインタラクティブな機能が利用できます。

ブラウザに Python を持ってくると、いくつかの魔法のワークフローが作成されます。 たとえば、Python でデータをインポートしてクリーニングし、Javascript から結果の Python オブジェクトにアクセスして (ほとんどの場合、変換は自動的に行われます)、d3 などの JS ライブラリを使用してそれらを表示することが可能です。 さらに魔法のように、PythonコードからブラウザAPIにアクセスすることができ、Javascriptに触れることなくDOMを操作するようなことができます。

もちろん、Pyodideについてもっと話すことがたくさんあり、それ自身の記事に値するものです。

JSMD (JavaScript MarkDown)

ちょうど Jupyter や R の R-Markdown モードと同様に、Iodide ではコードと書き込みを好きなように織り交ぜ、コードを「コードの塊」に分割し、別のユニットとして修正および実行できるようにすることができます。 このアイデアの私たちの実装は、R MarkdownとMATLABの「セルモード」に類似しています。明示的にセルベースのインターフェースを使用するのではなく、Iodideノートブックのコンテンツは、特定のタイプのセルを区切るために特別な構文を使用したテキストドキュメントに過ぎません。

MATLAB に従い、コードチャンクは %% で始まる行と、その下のチャンクの言語を示す文字列で定義されます。 現在、Javascript、CSS、Markdown (と HTML)、Python、リソースの読み込みを簡単にする特別な “fetch” チャンク、新しいセルタイプを追加することにより Iodide の機能性を拡張できるプラグインチャンクを含むチャンクをサポートしています。 diff ビューアやお気に入りのテキストエディタのようなテキスト指向のツールを簡単に使用でき、セル管理のためのショートカットを学ぶことなく、カット/コピー/ペーストのような標準のテキスト操作を行うことができます。 詳細については、JSMD のドキュメントを参照してください。

今後の課題

繰り返しになりますが、私たちはまだアルファ版なので、全体的な改良とバグ潰しを継続します。 しかし、それに加えて、私たちは次の実験ラウンドのためにいくつかの機能を考えています。 もし、これらのアイデアの中で特に便利なものがあれば、ぜひ教えてください。 さらに良いことに、それらを構築するのを手伝いたい場合は、お知らせください!

拡張コラボレーション機能

前述のように、これまでのところ、オンラインで自分の仕事を保存し、他の人が行った仕事を見、他のユーザーが作成した既存のノートブックをすばやくフォークして拡張できる、非常にシンプルなバックエンドを構築してきました。

私たちが追加を検討している次の 3 つの大きなコラボレーション機能:

  1. Google Docs スタイルのコメント スレッド
  2. Github プル リストに似たフォーク/マージ ワークフローにより、他のユーザーのノートブックの変更を提案する機能
  3. Googleドキュメントに似た同時編集可能なノートブック

現時点では、ほぼこの順序で優先順位をつけていますが、もし別の順序で取り組みたい場合や他の提案がある場合は、お知らせください!

さらなる言語!

私たちは R および Julia コミュニティから、これらの言語を WebAssembly にコンパイルし、Iodide および他のブラウザベースのプロジェクトで使用できるようにするという話を聞いています。 私たちの最初の調査では、これは可能であるはずですが、これらの言語を実装することは Python よりも少し難しいかもしれないことがわかりました。 Pythonと同様に、例えばRで統計モデルを当てはめたり、Juliaで微分方程式を解いたりして、その結果をブラウザAPIで表示することができれば、クールなワークフローが生まれます。 特に、FORTRAN と LLVM のエキスパートからの支援をお待ちしています。

Export notebook archive

Iodide の初期のバージョンでは、分析で使用する JSMD コードと Iodide 自体を実行するための JS コード両方を含む自己完結した実行可能 HTML ファイルでしたが、このアーキテクチャから移行しています。 その後の実験により、Iodideサーバーを持つことによるコラボレーションの利点は、ローカルシステムでファイルを管理する利点より大きいと確信しました。 それでも、これらの実験は、Iodideのコードを、ノートブックで使用されるすべてのデータとライブラリとともに1つの大きなHTMLファイルにインリングすることによって、Iodideノートブックの実行可能なスナップショットを取ることが可能であることを私たちに示しました。 これは、通常のユーザーに提供するよりも大きなファイルになってしまうかもしれませんが、完全に再現可能でアーカイブ可能な解析のスナップショットとして有用であることが証明されるかもしれません。 私たちは、Iodide が、他のエディターでコードを入力することを好むが、Iodide が提供する対話的で反復的な機能へのアクセスを望む人々を含む、彼らがすでにいる場所で、人々に会うことを本当に望んでいます。 そのニーズに応えるために、Iodide がクライアントサイドのエディタと対話できるように、軽量なブラウザ拡張機能といくつかの簡単な API を作成することを考え始めました。 GPU クラスター上で何テラバイトものデータを処理する必要がある場合、Iodide はおそらくあなたに提供するものはあまりないでしょう。 もし、あなたがジャーナル記事を出版していて、LaTeXドキュメントを書き上げる必要があるだけなら、あなたのニーズには、もっと良いツールがあります。 もし、ブラウザに何かを持ち込むという全体的なトレンドが、あなたを少しぞっとさせるとしても、問題ありません – あなたが科学をするために使用できる本当に素晴らしいツールのホストがあります。 私たちは誰かの仕事のやり方を変えたいとは思いませんし、多くの科学者にとってウェブに焦点を当てたコミュニケーションは重要ではありません。 ラッド 最高の人生を送ってください!

しかし、ウェブ用のコンテンツを作成している科学者や、自分の作業方法をサポートするために設計されたツールがあればそうしたいと思う人たちのために、私たちは本当にあなたからの連絡をお待ちしています!

ぜひ iodide.io にアクセスして試して、私たちにフィードバックしてください(ただし繰り返しますが、このプロジェクトがアルファ段階であることを念頭に置いてください – 重要な作業には使用しないで、アルファ段階ではすべてが変更の対象となるので注意してください)。 簡単なアンケートや、Githubの課題、バグレポートも大歓迎です。 機能要求や全体的な方向性に関する考えは、Google グループや Gitter で共有できます。

Iodide の構築の支援に参加したい場合、私たちは Github でオープンソースにしています。 Iodide は、モダンなフロントエンドの開発から科学計算、コンパイルやトランスパイルなど、さまざまなソフトウェア分野に触れているので、面白いことがたくさんありますよ! この中のどれかに興味があれば、ぜひ手を伸ばしてください!

Hamilton Ulmer、William Lachance、および Mike Droettboom に、Iodide の素晴らしい仕事とこの記事のレビューに多大な感謝を捧げます。

Brendanコロランについて

Brendan Colloran によるその他の記事…

コメントを残す

メールアドレスが公開されることはありません。