Common LispでHTMLファイルをブラウザで見る

なんかバタバタしてて久しぶりな更新な気がする。

前にはブラウザを立ち上げる方法について簡単に調べたのだけど、結局Pythonで確認しただけでCommon Lispでどうなってるのかについては試してなかった。

komi.hatenadiary.com

で、このあと色々試したのだけど、どうやら色々勘違いをしていたというか、もっと根本的に掘り下げる必要があったのが発覚した。

というのも、基本的にコードからHTMLファイルをブラウザで開くような操作をするにはUnixコマンドのopenコマンドを直接叩くというのが主流らしい。

これの裏付けとして、Pythonの言語側のWeb Browser Driverの実装を眺めているとしっかりopenコマンドを叩きにいってる。

github.com

他にもJuliaとかもそんな具合だった。

さて、前回の記事でcl-selenium-webdriverがいい感じかもしれないというような言及をしたが、これについては半分正解で半分間違いという具合。

github.com

このライブラリのうまみは何かというと、ブラウザを開くという所作ではなくコードから直接HTTP通信ができるという点らしい。

それの副次的な作用がブラウザを開くという帰結であり、今回自分はローカルに置いたHTMLファイルを開くことさえできれば良いので、まあ言ってしまえばオーバーキル感があるのである。

方針は決まった

以上、色々と試行錯誤したが、結局のところローカルにあるHTMLファイルをブラウザで開くにはCommon LispソースコードからUnixコマンドを叩きさえすればいい。

(defun system (cmd-str)
  (trivial-shell:shell-command cmd-str))

(defun open-browser ()
  (let ((path-to-html (check-file-exist "index.html")))
    #+darwin
    (system (format nil "open ~A" path-to-html))
    #+linux
    (system (format nil "xdg-open ~A" path-to-html))
    #+win32
    (system (format nil "start ~A" path-to-html))))

Unixコマンドへのアクセスは処理系依存なところがあり、これをここで細かく書いてると色々ゴチャゴチャしてきて本来やりたいことできなくなってしまうので、Common LispソースコードからUnixコマンドへのアクセスに関してはtrivial-shellを利用した。

ちなみにこのコードはいつぞや立ち上げたプロジェクトであるKaiの一部切り出し。

github.com

Kaiの現在の進捗

12月に始めたKaiプロジェクトであるが、現在のところコード自体については遅々ながらも徐々に進んでいる。

もともとバックエンドにはOpenGLを採用していたのだが、使っていたライブラリがバージョンが弱いやつだったのか知らないがあまり描画能力が高く、フォントも汚かったので、このままでは将来性が無いということでバックエンドを別に切り替えることにした。

バックエンドの選定にはJuliaのPlotsを参考にし、PlotlyとGRの2つにすることにしている。

本心としてはPyplotが使いたいところだったのだけれど、実装を眺めてみるとどの言語からも触れるようなAPIが提供されているわけではなくC言語からゴリゴリにPythonのラッパーを書いていて、Common Lispに移植するのは簡単ではなさそうだったのでまた来世ということに。

Plotlyは描画媒体がブラウザということもあって、Common LispからPlotlyを触るにはJavaScriptのコードへ変換するようなマクロを提供するだけで解決する。

で、そんなわけでKaiを作り続けているのだけど、現在の進捗としてはJavaScriptへの変換マクロさえ書いてしまえばKaiのPlotlyをバックエンドとしたバージョンは完成という状況となっている。

Plotlyを利用する際のフローとして、

  1. ホームディレクトリの~/.cache/にKaiのディレクトリを切る
  2. ダウンロードクライアントを用いてPlotlyのjsファイルを取ってくる
  3. Common LispからPlotlyのためのJavaScriptコードを生成
  4. index.htmlを生成
  5. HTMLファイルをブラウザで開く

という形式をとっている。

で、真ん中のJavaScriptのコードジェネレータ以外は完成しているという具合。

すぐに残りの文を完成させたいのだけど、その前準備として今はPlotlyのAPIを眺めながらどういう風に実装するのが良いか悩んでいる。

さっさと仕上げてデモを公開したいところ。

これからもがんばるぞい。