ここでちょっと、自分が離れ小島に置き去りにされてしまったと想像してみてください。ソフトウェア開発者のあなたは、キーボードを打てる年頃になってから今の今まで、LinuxシステムとApple Macしか使ったことがありませんでした。しかし、この離れ小島に持ってこれたのは、Windowsマシンだけ。あとは、一生分のティーとビスケットだけでした。幸いにも、この島にはインターネット接続はあります。さて、あなたならどうしますか?

もちろん、Ubuntuをダウンロードし、仮想マシン上にインストールすることもできますが、他のやり方もあります。実はそのやり方でも、Ubuntuのインストールは免れないのですが...

MacBookのない一週間

最近、私はこれとよく似た状況にありました。もちろん、離れ小島に置き去りにされたというのは言い過ぎで、タッチバーの不可思議な問題を修理するため、MacBookをしばらくApple Storeに預けなければならなかったのです。

開発用のマシンが手元にない間、仕事を続けるにはどうしたらいいんだろう、と考えました。私は、UnixのコマンドラインやZSHOh-my-zsh!といったツールなどを使うのは好きでした。会社の仕事では定期的にRubyNodeを使わなくてはいけないこともあり、メインのターミナルエミュレータとしてはiTerm2を使うのが好きでした。主に、Visual Studio CodeDockerSlackなどのデスクトップツールも使っています。

ひとつのオプションとしては、Dockerをインストールしてコンテナ化した開発環境をセットアップするという手もありますが、それでは簡単すぎる。

これまで通りの開発ツールやワークフローを、MacBookなしで続けられるだろうか?私はそれを目指してみることにしました。

"Windows Subsystem for Linuxをインストールし、Windows 10を完全なLinuxパワーハウスに変身させる方法を紹介"

クロスプラットフォームアプリケーション

もちろん、上に挙げた多くのアプリケーションはクロスプラットフォーム版があり、HTML、CSS、JavaScriptのアプリケーションをElectronを使ってラップアップしているものも多くあります。私が毎日使っているVisual Studio CodeやSlackの2つのアプリケーションも含みます。

たまに、どっぷりとIntellijScala開発に使うこともあり、これもクロスプラットフォームで実行できます。自分が使っているデスクトップアプリケーションはすべて揃っているようなので、助かります。

メインの開発とブログの書き込みには、主にGitRubyNodeJSを使っています。運よくWindowsのインストーラはすべてあるので、最終的には機能するけれど、Windowsっぽい感じがあるのはいなめません。たとえば、Windows上でGitを使う一番の方法は、Git for Windowsを使うこと。これには、Gitを実行するターミナルに連れていってくれるGit Bashもついています。または、GitHub Desktopのようなデスクトップアプリケーションを使うことも、Visual Studio Codeに内蔵しているGitインターフェイスを使うこともできます。

Visual Studio Code、GitHub Desktop、WSLを実行するWindowsデスクトップ

Rubyに関しては、RVMを使うのが好きです。これがあれば、Rubyの異なるバージョンのインストールと管理もとても簡単にできます。Windowsは、Cygwinなどを使ってサポートすることもできますが、これもネイティブソリューションとはいいがたいので、私がいつもやっている方法で使うと問題にぶつかることもあります。

問題なく使いこなせればどれもよくできたソリューションですが、そもそも本来はMacBookを使った場合と同じように仕事ができる方法を探すことが目的なので、もうちょっと探してみたいと思います。

ターミナルベロシティ

ターミナルを使うと、何でもコンパクトにテキパキと仕事がはかどるので、楽しくてしょうがないのですが、タブ、縦や横の分割線、Unixのコマンドユーティリティ、パイピング、出力のリダイレクションといった機能をサポートするターミナルを使うことは、私にとってはとても重要なことなのです。

残念ながら、Windowsはこういった機能が苦手なようです。Windowsにはコマンドプロンプトがありますが、私が気に入っているUIの機能はどれもサポートしていません。しかし、私はWindowsシェルコマンドを使い慣れていないので、面倒だなと感じてしまうのです。また、PowerShellというものもあります。その名の通りパワフルなのですが、私にとっては新しいツールなので使い方を学ばなければなりません。結局、どれも以前のような仕事量をこなすには時間がかかります。面白いことにPowerShellのユーザーにとっては、現在のフォルダがGitステータスとなり、posh-gitがターミナルのような効果を持ちます。これはOh-my-zshの機能のうちでも気に入っているところです。

Windows上のPowerShellのposh-gitのスクリーンショット

Mac上のiTerm2は、タブ、ウィンドウの分割、プロファイル、テーマ設定などができるので大好きなのですが、それに近いものはないのでしょうか?

Hyperは、少なくともタブやウィンドウの分割などのUI機能はサポートしているターミナルエミュレータです。Electronにもとづいているのでクロスプラットフォームで、テーマプラグインといったもっと高度な機能にも対応しています。私は見た目がよくなるのでアプリケーションのテーマ設定をするのが好きなのですが、どうせ短期間のことなのでこうした些細なことは忘れようと思っていたところでした。

でも、結局はただのエミュレータで、Windowsのシェルスクリプトを使っているだけのことです。もうちょっと基本的なことを変えていかなければ。

Windows Subsystem for Linuxに入る

Windows Subsystem for Linux(WSL)は、既存のWindowsアプリケーションと一緒にネイティブのLinuxコマンドを実行するための手段です。仮想マシンは使わないので、ターミナルウィンドウを開くだけで簡単にアクセスできます。以下は、ドキュメントから直接引用してみました。

Windows Subsystem for Linuxは、開発者がGNU/Linux環境を直接Windows上で、変更せずにそのまま、仮想マシンのオーバーヘッドを伴うことなく実行するためものです。これには、ほとんどのコマンドラインユーティリティやアプリケーションが含まれます。

すごいことです。理論上は、Windowsデスクトップ環境にいながら、使い慣れているコマンドラインツールをすべて使えるはずです。

WSLをインストールするには、Windows 10 Fall Creator's Update(ビルド16215)が必要です。これさえあれば、Windowsの機能の有効と無効を切り替えるスイッチを使って、「Windows Subsystem for Linux」を有効にするだけです。

Windowsの機能を追加するダイアログボックスのスクリーンショット

また、次のPowerShellコマンドを実行してインストールすることもできます。

# Run this inside PowerShell to enable the WSL feature
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

注意:WSLをインストールしたら、マシンを再起動する必要があります。

たくさんあるWindows Store上のLinuxディストリビューションの一つをWindowsのアプリケーションとしてインストールすることもできます。そこで私は、一番使い慣れているUbuntuをインストールすることにしました。Ubuntuアプリケーションはインストールすると使えるようになりますが、標準のWindowsコマンドプロンプトを代わりに使うこともできます。

Linuxターミナルに入るには、コマンドプロンプト(または、好きなターミナルエミュレータ)を開き、wslと入力して起動します。すると、Linuxコマンドプロンプトが表示されます。

# My WSL command prompt inside the Command Prompt application
/c/Users/steve >

次に何をすればいいのでしょうか。多分、Ubuntuターミナルで普通にやっていることを始めればいいのではないでしょうか。そこで、Ubuntuのどのリリースを使っているかを調べてみましょう。

> lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic

curlを使ってみると…

> curl -i google.com

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Feb 2019 10:42:51 GMT
Expires: Thu, 28 Mar 2019 10:42:51 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

Vimをインストールするには?

> sudo apt-get install vim

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
  libfreetype6
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 3 not upgraded.
Need to get 1152 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 vim amd64 2:8.0.1453-1ubuntu1 [1152 kB]
Fetched 1152 kB in 0s (2468 kB/s)
(Reading database ... 39405 files and directories currently installed.)
Preparing to unpack .../vim_2%3a8.0.1453-1ubuntu1_amd64.deb ...
Unpacking vim (2:8.0.1453-1ubuntu1) over (2:8.0.1453-1ubuntu1) ...
Setting up vim (2:8.0.1453-1ubuntu1) ...

ご覧の通り、apt-getがあるので、Ubuntuのネイティブインスタンスと同じようにどんなソフトウェアでもこれを使ってインストールできます。

では、Linuxのネイティブディストリビューション上と同じように、NVMなどもインストールできるのでしょうか?

録画して時間を節約するため、すでに自分のマシンにNVMをインストールしてみました。ただし、Nodeそのものはしていません。どうなったか、見てみてください!

ラッキーなことに、目立ったハプニングは起こらず、ネイティブのUbuntuインストールと同じようにNode 10とNPMが幸せにインストールされました。さらに、RVMも完璧な姿でインストールできることを確認しました。私が使ったのは、普段からLinuxでやっているこのインストール手順です。

さらに、ZSHとOh-my-zshも問題なく、Linuxの手順でインストールできました。ここまできたら、いつもMacBookでやっている仕事が普段通りにできるようになるまで、もうほんのわずかです。

デベロッパ、デベロッパ、デベロッパ

ツールはインストールできましたが、開発作業そのものはどんな感じでしょうか。

嬉しいことに、自分がWindowsマシンを使っていることさえ忘れるほど仕事がサクサクはかどっているではありませんか。WindowsのドライブはLinux環境に自動的にマウントされるので、Ubuntu環境からでもこれまで使っていたファイルやフォルダにアクセスできます。つまり、私が使い慣れているGitやその他のコマンドラインユーティリティをすべて使えうことができ、しかもホストWindowsマシン上にある好きなエディタを使ってそれらのファイルを操作ができるということを意味します。デフォルトでは、ホストドライブは/mntフォルダにあります。このため、WindowsでのパスD:\Development\auth0が、Linux環境では/mnt/d/Development/auth0として使えます。

現時点で、WindowsホストからLinuxファイルシステムにアクセスすることはできませんが、Windows 10ビルド1903からはそれが変わります。簡単に言うと、これからのWSLは 9Pファイルサーバー をWindowsとともにブートアップ時にクライアントとして立ち上げ、Linuxのファイルを内部ネットワークプロトコル上でサーブするようになるのです。

WindowsのUI機能

私にとってオペレーティングシステムのシェルは、仕事に使っている開発ソフトウェアの一部でしかないのです。たとえば、私はかなり頻繁にOS Xのスポットライト機能を使っており、シンプルなテキスト検索でオペレーティングシステムの中をナビゲートしています。Cmd+Spaceを押すだけで探し物ができるのはとても便利です。

Windows 10にも同じような機能があって、オペレーティングシステム内を自由に動き回ることができます。Windowsは、プログラムを開くのも、何かを操作するのも、キーボードひとつでできるのです。Windows Keyを押せばWindowsのスタートメニューが出てくるので、探しているものを入力するだけです。しかし、見た目だけではテキストボックスがハイライトされないので、検索したいことをすぐに入力できることが、ユーザーにとってわかりずらいという面はあるかもしれません。

私がよく使うOS Xのもう一つの機能は、Spaces(操作スペース)と呼ばれる複数のデスクトップです。これはMission Controlの中の機能で、アプリケーションをいくつかのスペースに分割し、スワイプするだけで簡単に行き来できます。私はよくこの機能を使って仕事を整理しています。例をひとつ挙げると、私は仕事中のプロジェクトのための作業ディレクトリでVisual Studio Codeで開いているすべてのインスタンスごとに、対応するiTerm2のインスタンスを開いておくようにしています。複数のデスクトップを使えば、これらのインスタンスをグループにまとめておけるので、プロジェクトごとに別々のデスクトップに開いておけます。デスクトップを切り替えるには、トラックパッドのジェスチャーを使うか、Ctrl+Left/Right Arrowを押します。

嬉しいことに、Windows 10もこれと同じ機能をサポートしています。OS Xと同様に、複数のデスクトップを作ってそれぞれに実行しているアプリケーションの異なるインスタンスを開いておき、シンプルなキーボードコマンドで切り替えられるのです。Windows Key+Tabを押すとミッションコントロールのような画面が現れ、デスクトップやアプリケーションを選べます。しかも、すべてのデスクトップに一つのアプリケーションのインスタンスを指定することもできます(大好きなミュージックプレイヤーを用意しておくのにとても便利です)。

Windowsの複数デスクトップ機能のスクリーンショット

"WSLで私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。"

Dockerについてヒトコト

このセットアップでDockerを使った経験について、ちょっとだけお話ししておきたいと思います。WindowsのホストマシンにはすでにDocker Desktopがインストールされていたのですが、WSLの中で作業をするにはいったんそれをアンインストールしなければいけないんじゃないかと心配していました。それともなければ、Windowsホストに1つ、WSLの中に1つと、Dockerのインスタンスが2つなければならず、貴重なハードドライブの容量を無駄に占領されるのではないか、とも思っていました。

幸いどちらも気の回しすぎで、この手順でDockerをセットアップすれば、WSLが(この記事にあるように、「スムーズに」)機能し、とても手軽で苦労のかけらもかかりませんでした。基本原則は、Windowsホスト上で実行するDockerは、WSLの中で実行するDockerクライアントでも使用できる、それは、この2つがREST APIで連結しているからです。この構成のカギとなるのは、WSLの中のDockerクライアントに、ホストがどこにあるのかを伝えておくことです。同じマシンで実行しているDockerインスタンスにデフォルトで接続しますが、この場合は、Windowsホスト上で実行しているインスタンスにポイントしておくことができます。

自分でセットアップしたので、WSLの中のDockerは想定通りに機能すると確信を持って言えます。

SSHキー

このブログを読んでいただいた人はもう勘付いているかもしれませんが、SSHキーの生成もLinuxのどのディストリビューションとも同じように機能します。私は、このGitHub.com上のSSHキーガイドの手順に従ってやってみましたが、問題なく機能しました。注意すべき点は、SSHキーがWSLインストールに対して生成されること。そのため、SSHキーが必要なサービスに追加する必要があります。

私にとっては問題ではなかったのですが、WindowsプロファイルのためのSSHキーがすでにある場合は、.sshフォルダのシンボリックリンクをWSLインストールに作成することで、同じキーを使えます。

MacBookを売ってしまった!

ウソです。MacBookはまだ持っています。でも、使い慣れている開発環境とほとんど同じような環境が作れたので、もうしばらくはMacBookを使わないでも生きていける自信はあります。私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。

これまでのところ、Windows Subsystem for Linuxに支障があって仕事ができなくなるという場面には遭遇していません。とはいえ、ここで紹介したユースケースは、ほかの人にしてみれば少しシンプルすぎるかもしれません。

あなたはWSLを使っていますか?使い心地はどうですか?下のコメント欄にぜひあなたの意見を書き込んでください!

About Auth0

Auth0, a global leader in Identity-as-a-Service (IDaaS), provides thousands of customers in every market sector with the only identity solution they need for their web, mobile, IoT, and internal applications. Its extensible platform seamlessly authenticates and secures more than 2.5 billion logins per month, making it loved by developers and trusted by global enterprises. The company's U.S. headquarters in Bellevue, WA, and additional offices in Buenos Aires, London, Tokyo, and Sydney, support its global customers that are located in 70+ countries.

For more information, visit https://auth0.com or follow @auth0 on Twitter.