さっと動かしたいなぁ、と思った時に、REPL はとても便利。
Javascript なんかだと、jsfiddle がとても便利で、結構使ったりする。
プログラム言語の公式サイトが Web REPL を用意しているケースも多い。
しかし、REPL すら無い言語とか、言語 + フレームワーク まで含めて確認したいと考えると、用意された REPL では満足できないこともある。
改めて、作った動機
直接の動機としては、Github プロジェクト作成の高速化 をすることによって、
『あ、これ作りたいな』と思ったら直ぐ作り出せるようにはなった。
けど、それ以前に 『これって、どう動くんだろう』 をもっと簡単にできないかな、と思った。
あとは、Docker の記事 を書いていて、Docker の環境用意能力の高さは異常だなと思ったので。
Repla
ということで、取り敢えず形にしてみたのがこれ。
まだまだ調整中だが、アドベントカレンダーの 12/10 が空いてしまったため、少しタイミング早いけど書いた。
試験は
- Windows 10
- Docker for Windows
- Chrome
で行っている。
技術解説
Docker
Repla 自体も Docker で動いている。
Docker on Docker 構成で、Docker の中からホストマシンの Docker を操作している。
DinD には、以下の2種類がある
-
/var/run/docker.sock
をコンテナに提供 -
privilege
を与える
privilege 与えるのが怖かったので、docker.sock 形式に。
Windows で Unix Socket 使えるの? と思ったけど、 Windows でも docker.sock
がマウントできた ので、それを利用した。
やってないけど、privilege
でも多分いけるはず。
docker run -d -v "/var/run/docker.sock:/var/run/docker.sock" ...
● Image
docker イメージをベースに、サーバを動作させるための nodejs
の環境を追加している。
nodejs
環境の構築は、公式イメージ をお借りした。
FROM docker:17.11.0
# 以下、nodejs の Dockerfile から引用している
ENV NODE_VERSION 9.2.1
RUN addgroup -g 1000 node \
&& adduser -u 1000 -G node -s /bin/sh -D node \
&& apk add --no-cache \
libstdc++ \
&& apk add --no-cache --virtual .build-deps \
binutils-gold \
curl \
...
Server Side
何にするか悩んだが、 Docker Remote API が簡単に使えそうなものに絞った。
適当に dockerode にしたけど、今考えると Python にしとけば良かったと思っている ( Stream API に慣れてなくて辛すぎる )
来年には Python になってるかも。
● Web フレームワーク
Koajs を使っている。
特に理由は無いが、async /await がそれなりに使えそうだったので。
Client Side
riotjs
レンダリングやイベント管理は riotjs を利用している。
とにかく面倒なことを考えたくなかったので、ブラウザコンパイルしている。
ace
エディタ部分に、高機能エディタである ace を利用する。
こんな高機能なエディタを OSS で公開してて凄い。
bulma
デザインは bulma をベース。
細かい所では、CSS Grid を一部で利用していて、flexbox よりもプロパティが直感的で良いかもなぁと感じた。
REPL って他にないのか
このツールを作るにあたり、ライバル視察として『web repl』 で検索してみたが、メチャクチャあることが分かった。
repl.it という凄いサイトがある。
これでも十分なんだけど、DB を用意できないとか、 Web サーバの動作確認ができないとかあるので、この点は Docker でローカルにクラスタ組めるほうが良いかなと。
これから
- サード製パッケージのインポート
-
require("moment")
からmoment
を取得してyarn add moment
してから実行したい- 正規表現得意じゃないんだよなぁ…
-
- セキュリティ対策
- 今は、いくらでも Injection できそうなので怖い
- 自分で自分が信用できない
- 今は、いくらでも Injection できそうなので怖い
- クラスタ構築
- DB 接続系のライブラリの動作確認
- Web 系ライブラリの動作確認
- Docker Compose を Docker Remote API で操作ってできるのか?
- できるなら、定義に Compose 追加すれば早い
- ユーザカスタム
-
repls/
以下にフォルダを追加して定義体とテンプレート置けば拡張できるようにはなっている - Github 上で Pull Request 受けながら増やしていくか、ユーザが増やしやすいように volume マウントして独自定義追加できるようにするか
-
絶対誰か作ってると思うんだけどなぁ。Docker + REPL。