PythonFiddle： 完全にプライベートなクライアント側でのサンプルコードの実行と共有

![1_9AHfna4BUEsZ8Fc6s_m9DA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/af3cc849-5b88-d601-ee96-35837ba8b5e5.jpeg)

プログラミングを実践している人なら誰でも、アイデアを素早くテストしたり、フィードバックを求めたりするために、小さなコードの断片を実行したり（そして共有したり）する必要がある。この種のウェブ・アプリケーションは一般に「フィドル」と呼ばれ、世の中にたくさんある。フィドルの一般的なユースケースは教育現場だが、完全なネイティブ実行環境をセットアップする手間を省くために、誰でもフィドルを使う必要が出てくる。

この種のフィドルのほとんどは、クラウド上で動作する仮想マシンにユーザーコードを送信することで動作する。その後、プログラムがリモートで実行され、結果が送り返される。最新のクラウド環境を使用することは、特にスケーラビリティや比較的低いコストなど、多くの利点があるが、開発者にはいくつかの問題が残されている：

・プライバシー： プライバシー：プライバシーに配慮する必要があるのは、ユーザーとサービス・プロバイダーの2者だ。ユーザーにとって最大の関心事は、自分のデータがどう扱われるかということだ。サーバーに保存されるのか、あるいはログとしてアクセス可能な状態で残される可能性があるのか。一方、プロバイダーは、ユーザーのデータで何ができて何ができないのか、ユーザーに知らせる必要があるのか、同意を求める必要があるのかを知る必要がある。これは、データが単なるコード・スニペットではない場合に特に当てはまる。

・セキュリティ： ユーザーが書いた任意のコードの実行を許可すると、サービス・プロバイダーは悪用されやすくなる。DDoS攻撃や暗号マイニングのような悪意のある目的のために、アプリケーションを実行するための計算能力を利用することが可能だ。これらは、匿名実行を許可しているどのプラットフォームにとっても現実的な問題である。この問題を解決するのは非常に困難です。なぜなら、ユーザは基本的に予測不可能だからです。多くの場合、タイムアウト、クォータ、パッケージやライブラリの禁止といった原始的な解決策が回避策として使われます。

・コスト： コンピューティングコストが安ければ安いほど、誰かがサーバーの代金を支払う必要がある。クラウドのスケーラブルな性質は、プロジェクトが成功すればするほど、コストも拡大することを意味する。これは、一人の開発者、フリー・オープンソース・ソフトウェア・プロジェクト、非営利団体にとっては問題になるかもしれない。

クラウドベースの実行に代わる理想的な方法は、既存の言語実装をブラウザ環境に移植することだろう。もちろん、必要な労力は移植される言語や実装の複雑さによって異なるが、相当なものになると予想するのが妥当だろう。移植作業に費やされる労力の上に、真新しい問題を導入することは容易であり、その作業のどれもが、新しい言語をサポートすることに自動的に変換されることはないだろう。

数年前、私たちはクライアント側の実行環境である[JavaFiddle](http://javafiddle.leaningtech.com/)をリリースし、上記の問題のほとんどに対処することができました。これは、[WebAssembly](https://webassembly.org/)とJavascriptでJavaバイトコードをコンパイルし、ブラウザ上で実行する私たちのソリューションである[CheerpJ](https://leaningtech.com/cheerpj)基づいています。このため、JavaFiddleはブラウザでサンドボックス化されたJavaアプリケーションを実行することができます。このソリューションは非常にうまく機能し、アプリケーションはかなり利用されるようになりました。

今、私たちは同様の環境である[PythonFiddle](http://pythonfiddle.leaningtech.com/)をリリースします。しかし今回は、WebAssemblyベースのx86仮想マシンである[CheerpX](https://leaningtech.com/cheerpx)をベースにしており、x86アセンブリにコンパイルされたプログラムを実行することができます。このソリューションにより、多くの異なる言語実装に同様のソリューションを提供できるようになります。
![0_o-URuAfTdPnfXd_T.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3486144/e56d5c66-e9de-766a-a0d5-86074e04a934.jpeg)クラウドを使った実装とCheerpXを使った実装の比較

# CheerpXとは？
CheerpXは、ブラウザ上でx86実行可能プログラムを実行できる仮想マシンです。プログラミング言語のコンパイルターゲットとして使用されることを意図した、ブラウザ用の新しいバイトコードであるWebAssemblyをベースにしています。CheerpXは、インタプリタとジャストインタイム・コンパイラからなる2層の実行エンジンを備えている。インタプリタは、めったに実行されないアセンブリ命令を実行し、JITのためのメタデータを生成します。JITは、頻繁に実行されるコードのための効率的なWasmモジュールを生成することができます。

マシンコードを直接扱うことは、CheerpXにとっていくつかの利点がある：

・堅牢性：ほとんどのプログラムは問題なく動作します。ソースからWasmにコンパイルすることは技術的には可能ですが、より多くの個別のユースケースをサポートする必要があり、多くのソフトウェアが実行できなくなります。

・汎用性： Flashのように、コンパイル用のソースコードがない場合もあります。これもCheerpXでは問題になりません。

・正確さ： アプリケーションはネイティブと同じように動作します。

追加ボーナスとして、CheerpXは、Ext2ベースの仮想化ファイルシステムを使用したファイル操作の広範なサポートを提供します。ディスクブロックは、ネットワーク使用量を最小限に抑えるため、当社のCDNからオンデマンドでダウンロードされます。このブロックは、IndexedDBを使用してキャッシュされ、後の訪問時に冗長なダウンロードを回避します。ファイルシステムとその中で行われたすべての変更は、ブラウザのローカル[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) に保存されるため、このデータは私たちのサーバーにも表示されません。

# PythonFiddleとは？

PythonFiddleはいくつかのコンポーネントで構成されています：

・CheerpX: ブラウザ上でリアルタイムにユーザが書いたコードスニペットで　　
　Pythonインタプリタを実行します。

・Debian buster ディスクイメージ: 完全なファイルシステムへのアクセスを　
　提供します。

・Xterm.js：フォーマットやcursesベースのアプリのサポートを含む、完全
　なターミナル体験を提供します。

上記の機能を活用することで、このプロジェクトには多くの利点があります：

・ネイティブに近い実行：適切なファイルシステムへのアクセスとマルチプ
　ロセッシング機能により、ユーザーは問題なくpythonのほとんどの機能を
　利用できる。これには、完全なdebianファイルシステムイメージへの読み
　書きアクセス、マルチスレッド、サブプロセス、ほとんどのpythonライブ
　ラリが含まれます。

・プライバシーを保護したコード共有： コードを共有するために、コードは
　圧縮され、lz-string を使って url のハッシュとしてエンコードされます。こ
　うすることで、ユーザーは私たちのサーバーを通さずにコードを共有する
　ことができます。この[リンク](https://pythonfiddle.leaningtech.com/#A4JwlgdgLgFARACTAAgGYgPYFtkEMRRgDGANgKZwCUQA)からテストできます。

・不正使用に対する堅牢性：コードの実行は完全にクライアントサイドのサ
　ンドボックスで行われ、私たちのサーバーには何も送信されないので、ど
　のような形の望ましくない使用からも安全です。

・コストをかけずにスケーラビリティを確保：すべての処理と実行はクライ
　アントサイドで行われるため、ユーザー数が大幅に増加しても、私たちの　　
　リソースを最小限に抑えることができます。

PythonFiddle（および更新されたJavaFiddle）はそれ自体有用であると信じていますが、CheerpXはもっと洗練されたアプリケーションで使われる可能性を秘めています。可能性は言語実装に限らず、どんなx86コードでもクライアントサイドで安全に実行できます。CheerpXは、私たちが過去数ヶ月間にリリースした多くのデモを通じて、すでに一般に公開されている安定した技術です。最新のデモであるWebVMは、ブラウザ上でdebianディストリビューションの完全なターミナル・セッションを実行する。これは、CheerpXがいかに複雑なタスクを実現できるかを示しています。

ウェブアプリにCheerpXを統合するのも複雑ではない。フィドル自体は、CheerpX APIの上にある薄いレイヤーに過ぎません。任意のプログラムを実行するには、`CheerpX.run(...)` APIコールをプログラムで呼び出すだけで、CheerpXがすべてを処理します。

```CheerpX.run(“python3”, [“-c”, “print(’Hello world!’)”], env);```

CheerpXはすでに信じられないほど多機能なテクノロジーですが、それにもかかわらず、私たちは継続的に機能を追加しています。現在、私たちはネットワーク機能とグラフィカル・アプリケーションの実行サポートを実装しています。これにより、さらに複雑なデモやアプリケーションの作成が可能になります。可能性は無限です。

CheerpXは非常に適応性が高いので、私たちがまだ考えていない使用例がたくさんあることは確かです。したがって、未開拓の市場にCheerpXをもたらすパートナーを探しています。CheerpXを使って実現できる素晴らしいアイデアをお持ちの方は、ぜひご連絡ください：

Email: info@leaningtech.com

Twitter: https://twitter.com/leaningtech

Discord: discord.leaningtech.com

Web: https://leaningtech.com/cheerpx

[引用元](https://leaningtech.com/blog/2022/09/14/pythonfiddle-fully-private-client-side-sample-code-execution-and-sharing/)

https://leaningtech.com/legacy-modernisation-jp/