さっと動かしたいなぁ、と思った時に、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。