概要
Jupyter(Google Colab)のコードセルでJavaScript/TypeScriptが書ければ便利なんじゃないかと思って試行錯誤した結果の記録
Denoである理由
Denoの特徴の1つであるURL importによるパッケージインストール作業不要のモジュール取り込みはJuypterのコードセルのような基本再利用を前提としない書き捨てコーディング環境にはもってこいの機能だと思うので使えるようになったら面白いかなと。
Denoカーネルを使わない理由
Denoは公式でJupyterカーネルを出してるのでそれをインストールすればいいじゃん…と思うかもしれませんが、残念ながら2024年6月現在DenoカーネルはGoogle Colabでは動かないようです。動くようになればこの記事は不要になるんですが(とはいえマジックコマンド非対応なのでIframe表示とかできなさそうですが…)
実現方法
これを実現するためにはセルマジックを使うのがいいようです。セルマジックはコードセルの先頭行にコマンドを書くことでそのコードセル全体の内容を引数として独自の処理をするというものです。
セルマジックの実態はほぼ単なるPython関数なので、PythonでDenoを呼び出して取得したコードセルの内容を渡す感じになります。こんな感じ(あらかじめDenoをインストールしてパスを通す必要があります)
@register_cell_magic
def run_deno(line, cell):
"""
Denoのコードを実行するマジックコマンド
"""
# Denoコマンドを実行
denocmd = "deno"
process = subprocess.Popen(
[denocmd, "eval", cell],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = process.communicate()
# 結果を表示
if process.returncode == 0:
print(stdout.decode("utf-8"))
else:
print(stderr.decode("utf-8"))
Google Colab対応
Google Colabにも対応ができたらいいなと思うのですが、Colabの場合Denoをランタイムが再起動する度にインストールし直す必要があるようです、またパスを通しても他のセルに反映されないっぽいので(やり方あるのかな?)Denoコマンドをフルパスで呼び出す必要がありそうです、結局なんだかんだJupyterとは処理が異なる感じになりそうなので場合分けするしかなさそう。
# Google Colabで実行しているかどうかを判定
def is_google_colab():
try:
import google.colab # type: ignore # noqa: F401
return True
except ImportError:
return False
# Denoコマンド
def get_deno_cmd():
if is_google_colab():
return "/root/.deno/bin/deno"
else:
return "deno"
def install_deno_colab():
"""
Denoのインストール(Google Colab用)
"""
if not is_google_colab():
print("Google Colab環境ではありません。Denoのインストールをスキップします。")
return
# Denoのインストールコマンド
command = "curl -fsSL https://deno.land/x/install/install.sh | sh"
# シェルコマンドを実行
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
# 出力を表示
if process.returncode == 0:
print("Denoをインストールしました。")
print(stdout.decode())
else:
print("Denoのインストール中にエラーが発生しました。")
print(stderr.decode())
GitHubに載せてみた
その他、せっかくJavaScript/TypeScriptが使えるのだからブラウザ環境での実行も出来たら便利そうだなと思い、DenoでトランスパイルしたJavaScriptを差し込んだHTMLを生成してIFrameに出力するセルマジックも作って合わせてGitHubに公開してみました。
ついでに、コードセルのPythonコードをPyScriptを利用してブラウザ環境で実行するマジックコマンドも作ってみた。