WSLでcrojure開発 (Emacs + cider)

Posted by Y TAKAI On 2017年12月13日水曜日 0 コメント

普段は仕事でPCを使うことが多いし、趣味がらみでもツール類の関係で基本的にはWindowsが必要になったりするので、家でも結局はWindowsを使っています。 

とは言え、やっぱりClojureを始めとしたプログラミング関連の作業はコマンドラインでやりたいし、使い慣れたUNIX系のツールを使った作業からは離れられないのでMsys2を導入して環境を作っていたわけですが、そこはそれ、後づけの環境なので、いくつか気に入らないところもあったりするわけです。

そんな中、話題の Windows10 Fall Creators Update で正式版となったWSL、要するにWindows上のLinux に乗り換えてみたら、Msys2の問題を解決してくれてなかなかよかったので、そのあたりの事を書いてみます。





Msys2環境の問題

このMsys2というのはそもそも「UNIX系のツールをWindowsで動くようにコンパイルするため」の環境なので、コンパイルしたものはWindowsのソフトになっちゃうわけで、そのツールはMsys2環境で動くことはあまり考えていないのです。
たとえば(僕にとっては)開発環境の中核を成しているEmacssも、Windows用のバイナリはMsys2でコンパイルされているので、Windows環境でうまく動作するのであって、実はWindows環境ではないMsys2との親和性は高くないのです。
どういうことかと言うと、たとえばEmacsからMsys2のコマンドであるgitを使おうとするとちょっと工夫が必要だったり、動かなかったりするということです。

たとえば EmacsはWindowsのパスは「 C:\users 」を理解できますがgitコマンドには理解できないということになるのです。
僕が今一番困っているのが、「magitが遅い」ことです。magit-statusなど、gitとのやりとりをするコマンドを打つと、30秒から1分ほどかかります。慣れてしまいましたが、こういう作業の部分に時間を取られるのはあまり納得が行きません。

また、clojureの開発環境であるciderが不安定だったりもします。たまに、といっても2日に1回くらい、固まります。これもLinuxだったらまず発生しない現象です。

「windowsでemacsが動いているだけで幸せなんだから、外部連携などはできたらラッキーぐらいに考えておけ」というような意見もあるようですが、MacがOSXで裏でUnixが動くようになってから、開発環境としてのMacを指をくわえて見ているだけの状態はちょっと辛いものがありました。

ということで、WSLを使うことでこれらの問題が解決しているんじゃないかという期待とともに、進めていくことにしましょう。


WSL環境構築

さて、これから出てくるほとんどの手順は話題の作業内容なのでここで細かいことは書かずに何をやってどうなったかを中心に書いていくことにします。 
細かいところを知りたい場合はいろいろなところで解説されているので、検索してみてください。


Windows10 をFall Creators Updateにする

まずはこれですね。WSLが正式版になっているので。


WSLを有効にして、Ubuntuを入れます。

Windows Subsystem for Linuxを有効にして、ストアからUbuntuを入れます。
SUSEという選択肢もありますが、まずは、使ったことのあるUbuntuにしました。変なところではまりたくないですからね。


Ubuntuを最新にします。

入った Ubuntu の使い方はほんとに普通のUbuntuと同じで、アップデートするにはapt-getを使います。
sudo apt-get update && sudo apt-get upgrade
入れたばかりなので、アップデートされるパッケージはあまり無いだろうと思っ
たのは甘くて、かなり時間がかかりました。


javaを入れる

Clojureを使うには必須ですね。
Windows側にはjavaは入れてありますが、別途WSL用にも入れてやる必要があります。
以下のコマンドでjava8を入れました。

sudo add-repository ppa:webupd8team/javasudo apt updatesudo apt install -y oracle-java8-installer




ターミナルエミュレータ cmder を入れる

Windowsのターミナルのcmd.exeはWindwos10 Fall Creators Updateでよくなったと言われていますが、そもそも貧弱なのでちょっとくらい良くなってもたいして使いやすくはありません。

Msys2では付いているminttyを使っていたのですが、「cmder」というのが評判がよさそうなので、使ってみることにしました。
   http://cmder.net/
起動がちょっともたもたしている以外の使いごこちはよさそうです。




Emacs25を入れます

標準のパッケージを入れると24になります。
Msys2環境では25を自分でコンパイルして使っているので、同じようにして入れようかと思ったのですが、パッケージを公開してくれているところがあるようなので、それを使わせていただくことにしました。
    https://www.yokoweb.net/2017/03/19/emacs-25-apt-install/
25.3が入りました。

いずれは自分でコンパイルしたやつに差し替えようかと。




EmacsをGUIモードで使うには、Xサーバーが必要です。

よいターミナルエミュレータが入っていればそこでEmacsを動かす手もありますが、やっぱり複数フレーム作ったりしたいので、GUI での動作は必要です。
ところが、WSLのUbuntuではXのサポートは含まれておらず、そのままではGUIベースのツールを動かすことはできません。

できないんですが、まてよと。

そもそもLinux/UNIXではOSとGUIの機能は別の機能として実装されていて、XサーバーもOS上で動くアプリケーションの1つに過ぎません。そして、Xサーバーって言うくらいなので、クライアントサーバーモデルを取っているので、リモートで動くXサーバーに画面を表示することだって難なくできるはずなのです。
ということは、WSLでなくWindows側にXサーバーを立ててやれば、GUIのアプリケーショ
ンを動かすことができるはずです。 いえ。できます。


VcXsrvをインストールした

Windowsで動作するXサーバとしてはXmingが有名で、仕事PCには入っています。

今回環境構築にあたって、調べてみると、Xmingは最近更新が止っているらしく、代りにVcXsrvっていうのが流行っているようです。
   https://sourceforge.net/projects/vcxsrv/
流行りものには弱いので、さっそくこれをインストールします。
あちこちで言及されていますが、プログラム起動後のタスクバーのアイコンがXのものでなくそのアプリケーションのものになるっていうことだけでも乗り換える価値がありますね。



フォントも、Windowsの物が使えるようにしておきます。


これでやっと、作業の準備ができました!
そうです。 つらつら書きましたが、まだやっとClojure開発の基盤ができただけなのです。
ここから先は普通にUbunutuでClojureの開発環境を作るのと変わりありません。と言ってもLeiningenを入れるだけですがね。



Leiningenをインストール

Windows版ではありませんよ。Linux版を入れてくださいね。

注意
2017/12/11の時点での最新は2.8.0ですが、javaのエラーが出ます。
バグらしい
    https://github.com/technomancy/leiningen/pull/2324

1つ前の 2.7.1を使っています。次版には修正されているとのこと。

そのときのエラーメッセージ





yosi@mowegi:~/workspace/clojure/weasel/weasel-example$ lein cljsbuild once
Compiling ClojureScript.
Java HotSpot(TM) 64-Bit Server VM warning: Unable to open cgroup memory limit file /sys/fs/cgroup/memory/memory.limit_in_bytes (No such file or directory)


emacsのclojure開発環境を整えます

clojure開発用で入れているのは以下のパッケージです。

  • cider
  • clojure-mode
  • smartparens
  • company


さて、これで、Clojureの開発環境は整いました。


プロジェクト作っていろいろやってみる

さて、いろいろ動かしてみましょう。

REPLを使うのが目的のプロジェクト

Project Eulerを解くとか、ちょっと込み入った計算をさせるとかする時には、
REPLだけで済ませてしまうことがよくあります。
相変わらず起動には時間がかかりますが、REPLは普通に起動しまして、使っていて特に困るようなこと発生していません。


Webアプリケーション

Webアプリケーションはどうでしょう。
サンプルとして、ここにあるやつを動かしてみます。
    http://clojure-doc.org/articles/tutorials/basic_web_development.html

結論から言えば、これも特に問題無く動きます。




右がEmacsで下半分がciderの画面です。左の下のWindowsで動いているChromeで起動したプロセスにアクセスしています。
また、タスクバーにあるEmacsのアイコンがEmacsのものになっているのがVcXsrvのよいところです。


このページの記述ですが、最後の方でちょっとはまりました。
REPLを使って作って行ったのですが、最後になって、webサーバのjettyの設定
を追加することになっていて、また、REPLベースで起動する方法が書いてない。

こんな感じです。


(def srv (atom ""))(reset! srv (jetty/run-jetty app {:port 8080 :join? false})


これで、localhost:8080 にアクセスするとページが表示されます。
止めるときは


(.stop @srv)(reset! srv "")


といった感じです。



まとめ


と、いうことで、wslを使ってWindows10でより快適な clojure 開発環境を作
ることができることがわかりました。

不満だったmagitの反応についても、Linux環境と変わらない使用感で快適です。

ただ、まったく何も不満が無いかというとそうではなく、wsl上のLinuxは、
CygwinやMsys2とは違ってWindowsのファイルシステムとは基本的に別になって
いて、間には壁があります。 この壁のおかげで、快適な環境を手に入れるこ
とができるのですが、より2つのシステムで作業していることを意識してつか
わなかればならないというところがあります。


これで、また、ちょっと、Macで開発している人達への羨ましい度が減りまし
た。

0 コメント:

コメントを投稿