Pyodideとは
Pyodide(パイオダイド)とは、Pythonデータサイエンススタックを完全にブラウザ内で動作させるためのMozillaの実験的プロジェクトです。
2019年4月16日にMozillaから「Pyodide」の発表がありました。
https://hacks.mozilla.org/2019/04/pyodide-bringing-the-scientific-python-stack-to-the-browser/
元々は「Iodide(アイオダイド)」というデータサイエンスの処理をすべてブラウザー内で実行可能にするプロジェクトが発表されていますが、JavaScirptでは演算子のオーバーロードなど、数値計算に役立つ多数の機能(データサイエンスライブラリ)に欠けているため、そちらを充実させるのも大事な一方で、Pythonをブラウザー内で実行できるようにしてしまえば早いんじゃないか、ということで生まれたそうです。
導入
今回はDocker版を使うのでDockerが入っていること。
$ git clone https://github.com/iodide-project/pyodide.git
Cloning into 'pyodide'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 4434 (delta 2), reused 2 (delta 1), pack-reused 4421
Receiving objects: 100% (4434/4434), 1.01 MiB | 1.99 MiB/s, done.
Resolving deltas: 100% (2846/2846), done.
$
$ cd pyodide/
$ ./run_docker
: コンテナ構築
root@d7bd99b9dfa3:/src# make
: make作業(3時間近くかかりました...)
root@d7bd99b9dfa3:/src# ./bin/pyodide serve
serving from /src/pyodide_build/../build at localhost:8000
これで準備が整いました。
実行
コンテナを起動したホストの8000ポートにアクセスします。
ポートの指定はrun_dockerにあるので、8000から変更したい場合は書き換えて下さい。
http://[コンテナホスト]:8000/console.html
試しにpythonコードを実行してみます。
print("Hello, World!")
もう少しPythonっぽいものも試してみます。
print([i for i in range(10) if i%2==0])
numpyで2変数の連立1次方程式を解いてみましょう。
\begin{eqnarray}
\left\{
\begin{array}{l}
2x + 3y = 15 \\
5x + 3y = 6
\end{array} \right.
\end{eqnarray}
import numpy as np
A = np.matrix([[2, 3],
[5, 3]])
Y = np.matrix([[15], [6]])
print(np.linalg.solve(A,Y)) # x = -3, y = 7
2次関数 $y = x^2$ をグラフ化してみる。
console.htmlではグラフは描かれなかったので、以下のサイトで実行。
https://alpha.iodide.io/notebooks/300/
import matplotlib.pyplot as plt
x = []
y = []
for i in range(0,10):
x.append(i)
y.append(i**2)
plt.plot(x,y)
plt.show()
requestsは使えないようなので、何が使えるかを確認。
import pkg_resources
for dist in pkg_resources.working_set:
print(dist.project_name, dist.version)
setuptools 40.0.0
pytz 2018.4
python-dateutil 2.7.2
pyparsing 2.2.0
numpy 1.15.1
matplotlib 2.2.3
kiwisolver 1.0.1
cycler 0.10.0
ふむふむ、なるほど。
データサイエンスに絞られているようですね。