Scala 環境をVisual Studio Codeで構築してみる。Hello.scala を実施はできましたけど...微妙

f:id:ts0818:20190908092706j:plain

懐かしの映画、1997年に制作され、日本での公開は1998年という「フェイス/オフ(監督:ジョン・ウー)」。顔を入れ替えるっていう、当時としては、なかなか斬新な内容でしたが、あ、どうもボクです。

「face off/face-off」はもとはホッケー用語で、向かい合った二人の選手のあいだにパックを落として試合を開始することですが、そこから1対1で対決する、にらみ合うという意味で使われるようになりました。

「フェイス・オフ(face off)」って何?【知っているとちょっとカッコいい英語のコネタ】 | マイナビニュース

⇧ へぇ~、へぇ~、へぇ~、フェイスオフってそんな意味があったとは。

 

そして、最近、Facebook から、

www.itmedia.co.jp

⇧  「ディープフェイク」検出ツールを開発していこうって話が出てると。

というわけで、脱線しましたが、今回は、Visual Studio Code で、Scala環境 を構築の最後までを目指して。レッツトライ~。

 

環境の全体像

今回の作業の全体像は、こんな感じになるかと。

ちなみに、環境は、Windows 10 Home なので、Docker ToolBox を使っています。

f:id:ts0818:20190908130028p:plain

 

Docker Hub からコンテナのイメージを取得

Scala 環境のコンテナ  を作成するために、docker image をDocker Hub からプルしたいと思うのですが、Scala の動作確認ができているJDKのバージョンは、

docs.scala-lang.org

⇧  2019年9月08日(日)現在、JDK 11 までは大丈夫そうであると。

正確には、sbt の動作確認らしいですが。

というわけで、Docker Hub の公式のリポジトリから、Open JDK 11 のdocker image をプルするということで。

qiita.com

⇧  上記サイト様を参考に、 プルします。事前に仮想マシンとかは起動しておきましょう。

docker pull openjdk:11

f:id:ts0818:20190908130803p:plain

f:id:ts0818:20190908131649p:plain
 

マウント用のディレクトリを作成

適当な場所に、ゲストOSのディレクトリとマウントさせるためのディレクトリをホストOS側に作成で。

f:id:ts0818:20190908131116p:plain

 

コンテナを作成・起動

それでは、プルしてきたdocker image を使って、コンテナを作成・起動します。その際、ゲストOSと ホストOSのディレクトリをマウントします。

docker run -d --restart=always --name [コンテナ名] -h [ホスト名] -p [ホストOS側のポート]:[ゲストOS側のポート] -v [ホストOS側のディレクトリ]:[ゲストOS側のディレクトリ] [REPOSITORY]:[TAG]

f:id:ts0818:20190908132732p:plain

んで、コンテナに入ろうとしたら、

f:id:ts0818:20190908135507p:plain

無限ループっぽく、再起動が繰り返されるという...

 

github.com

⇧  どうやら、Windows 特有のバグらしい。再起動のオプションと、マウントのオプションは同時に使えないらしい?

というわけで、一旦、コンテナを削除で。

f:id:ts0818:20190908135733p:plain

再起動のオプションを削って、

docker run -d --name [コンテナ名] -h [ホスト名] -p [ホストOS側のポート]:[ゲストOS側のポート] -v [ホストOS側のディレクトリ]:[ゲストOS側のディレクトリ] [REPOSITORY]:[TAG]

f:id:ts0818:20190908141800p:plain

駄目でした...今度は、起動すらしないという

gamushiros.hatenablog.com

⇧  どうやら、「-i」「-t」のオプションを付けて上げれば良いそうな。docker image によっては、このへんが変わってくるのかな?

(シェルのような)インタラクティブなプロセスでは、コンテナのプロセスに対して tty を割り当てるために、 -i -t を一緒に使う必要があります。 後の例で出てきますが -i -t は -it と書けます。 クライアント側の標準出力を echo test | docker run -i busybox cat のようにリダイレクトやパイプする場合 -t は指定できません。

Docker run リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

tty って何ぞ? 

ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系コマンドである。元来ttyとはteletypewriter(テレタイプライター)のことを指す。

tty - Wikipedia

⇧  よく分からんのだけれど、tty の割り当てが無いと、コンテナが起動してもすぐに停止してしまうらしい、たぶん...。 

というわけで、

docker run --name [コンテナ名] -h [ホスト名] -p [ホストOS側のポート]:[ゲストOS側のポート] -d -it -v [ホストOS側のディレクトリ]:[ゲストOS側のディレクトリ] [REPOSITORY]:[TAG]

f:id:ts0818:20190908142913p:plain

あ、なんか、コンテナにもOSインストールされてたっぽい。Linuxディストリビューションとしては、Debian 9 っていってますね。

f:id:ts0818:20190908143355p:plain

なので、

f:id:ts0818:20190908144634p:plain

Debian のパッケージ管理ツールである、apt-get を使って、コンテナに直接、sbt のインストールができそうです。

www.scala-sbt.org

とりあえず、上記サイト様の通り、コマンドを実行してみる。

f:id:ts0818:20190908145800p:plain

f:id:ts0818:20190908145717p:plain

f:id:ts0818:20190908145950p:plain

f:id:ts0818:20190908150212p:plain

⇧  はい、エラー。

インストールしようとしているパッケージが配置されているURLが、httpsである場合に、起こるようです。

linux.just4fun.biz

というわけで、

apt-get install apt-transport-https

f:id:ts0818:20190908153742p:plain

その後に、「apt-get update」して、「apt-get install sbt」で。

f:id:ts0818:20190908154522p:plain

とりあえず、sbt インストールされたのかな?

f:id:ts0818:20190908155011p:plain



 

Visual Studio Code のリモートでScala

そしたらば、Visual Studio Codeで、Remote - SSHします。

f:id:ts0818:20190904203703p:plain のアイコンをクリックし、「Remote - SSH: Connect to Host...」をクリック。

f:id:ts0818:20190908155607p:plain

前回、設定したホスト「192.168.99.100」を選択で。

f:id:ts0818:20190908161119p:plain

仮想マシン側のVisual Studio Code が起動されたら、拡張機能の追加で。「Scala(Metals)」ってのをインストールします。

注意する点としては、

Make sure to disable the extensions Scala Language Server and Scala (sbt) if they are installed. The Dotty Language Server does not need to be disabled because the Metals and Dotty extensions don't conflict with each other.

GitHub - scalameta/metals-vscode: Visual Studio Code extension for Metals

Scala Language Server」「Scala(sbt)」の拡張機能とバッティングしてしまうので、 「Scala(Metals)」を使う場合は、「Scala Language Server」「Scala(sbt)」の無効化が条件らしい。

f:id:ts0818:20190908162526p:plain

再読み込みで。

f:id:ts0818:20190908162659p:plain

とりあえず、Scala プロジェクト(「build.sbt」ファイルを含んだディレクトリ)を作成しなければいけないようです。

「表示(V)」>「ターミナル」で、コンテナにログインし、「/root/work」に移動し、sbt new でScalaプロジェクトのスケルトンを作成。

f:id:ts0818:20190908172501p:plain
プロジェクト名を適当に入力します。今回は、hello で。

f:id:ts0818:20190908172641p:plain

マウントしていたホストOS側のディレクトリからも見えてますね。

f:id:ts0818:20190908172737p:plain

サーバ側のVisual Studio Codeのターミナルで、作成されたScalaプロジェクトのディレクトリ「/root/work/hello」に移動し、「sbt」とコマンドを入力。

f:id:ts0818:20190908173450p:plain
sbt のシェルにログインされたら、「run」と入力。

f:id:ts0818:20190908173217p:plain

無事、Scalaファイルが実行されました。

f:id:ts0818:20190908173245p:plain

sbt シェルを終了するには、exit と入力するか、Ctrl+D (Unix) か Ctrl+Z (Windows) を押す。

sbt Reference Manual — Hello, World

ということで、sbt シェルを終了。

f:id:ts0818:20190908174425p:plain

実行されたScalaファイルは、「/root/work/hello/src/main/scala/example/Hello.scala」ですね。

f:id:ts0818:20190908173654p:plain

f:id:ts0818:20190908173841p:plain

⇧  Hello.scalaの内容は、トレイトを継承したオブジェクトですかね。
Scala を実施はできたんですが、ターミナルからではなく、Visual Studio Codeのエディターからアクセスしたかったですね...

というわけで、厳密には、Visual Studio Codeで、Scala 環境を作れたとは言い切れない感じですが、一応、Visual Studio Code内蔵のターミナルで動いたということで...許してちょんまげ。

Docker ToolBox で可能なのか、時間があるときに調査していきたいですね。今日もモヤモヤ感が満載ですな...

今回はこのへんで。