ここでちょっと、自分が離れ小島に置き去りにされてしまったと想像してみてください。ソフトウェア開発者のあなたは、キーボードを打てる年頃になってから今の今まで、LinuxシステムとApple Macしか使ったことがありませんでした。しかし、この離れ小島に持ってこれたのは、Windowsマシンだけ。あとは、一生分のティーとビスケットだけでした。幸いにも、この島にはインターネット接続はあります。さて、あなたならどうしますか?
もちろん、Ubuntuをダウンロードし、仮想マシン上にインストールすることもできますが、他のやり方もあります。実はそのやり方でも、Ubuntuのインストールは免れないのですが...
MacBookのない一週間
最近、私はこれとよく似た状況にありました。もちろん、離れ小島に置き去りにされたというのは言い過ぎで、タッチバーの不可思議な問題を修理するため、MacBookをしばらくApple Storeに預けなければならなかったのです。
開発用のマシンが手元にない間、仕事を続けるにはどうしたらいいんだろう、と考えました。私は、UnixのコマンドラインやZSHやOh-my-zsh!といったツールなどを使うのは好きでした。会社の仕事では定期的にRubyやNodeを使わなくてはいけないこともあり、メインのターミナルエミュレータとしてはiTerm2を使うのが好きでした。主に、Visual Studio Code、Docker、Slackなどのデスクトップツールも使っています。
ひとつのオプションとしては、Dockerをインストールしてコンテナ化した開発環境をセットアップするという手もありますが、それでは簡単すぎる。
これまで通りの開発ツールやワークフローを、MacBookなしで続けられるだろうか?私はそれを目指してみることにしました。
“Windows Subsystem for Linuxをインストールし、Windows 10を完全なLinuxパワーハウスに変身させる方法を紹介”
Tweet This
クロスプラットフォームアプリケーション
もちろん、上に挙げた多くのアプリケーションはクロスプラットフォーム版があり、HTML、CSS、JavaScriptのアプリケーションをElectronを使ってラップアップしているものも多くあります。私が毎日使っているVisual Studio CodeやSlackの2つのアプリケーションも含みます。
たまに、どっぷりとIntellijをScala開発に使うこともあり、これもクロスプラットフォームで実行できます。自分が使っているデスクトップアプリケーションはすべて揃っているようなので、助かります。
メインの開発とブログの書き込みには、主にGit、Ruby、NodeJSを使っています。運よくWindowsのインストーラはすべてあるので、最終的には機能するけれど、Windowsっぽい感じがあるのはいなめません。たとえば、Windows上でGitを使う一番の方法は、Git for Windowsを使うこと。これには、Gitを実行するターミナルに連れていってくれるGit Bashもついています。または、GitHub Desktopのようなデスクトップアプリケーションを使うことも、Visual Studio Codeに内蔵しているGitインターフェイスを使うこともできます。
Rubyに関しては、RVMを使うのが好きです。これがあれば、Rubyの異なるバージョンのインストールと管理もとても簡単にできます。Windowsは、Cygwinなどを使ってサポートすることもできますが、これもネイティブソリューションとはいいがたいので、私がいつもやっている方法で使うと問題にぶつかることもあります。
問題なく使いこなせればどれもよくできたソリューションですが、そもそも本来はMacBookを使った場合と同じように仕事ができる方法を探すことが目的なので、もうちょっと探してみたいと思います。
ターミナルベロシティ
ターミナルを使うと、何でもコンパクトにテキパキと仕事がはかどるので、楽しくてしょうがないのですが、タブ、縦や横の分割線、Unixのコマンドユーティリティ、パイピング、出力のリダイレクションといった機能をサポートするターミナルを使うことは、私にとってはとても重要なことなのです。
残念ながら、Windowsはこういった機能が苦手なようです。Windowsにはコマンドプロンプトがありますが、私が気に入っているUIの機能はどれもサポートしていません。しかし、私はWindowsシェルコマンドを使い慣れていないので、面倒だなと感じてしまうのです。また、PowerShellというものもあります。その名の通りパワフルなのですが、私にとっては新しいツールなので使い方を学ばなければなりません。結局、どれも以前のような仕事量をこなすには時間がかかります。面白いことにPowerShellのユーザーにとっては、現在のフォルダがGitステータスとなり、posh-gitがターミナルのような効果を持ちます。これはOh-my-zshの機能のうちでも気に入っているところです。
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」を有効にするだけです。
また、次の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
を押すとミッションコントロールのような画面が現れ、デスクトップやアプリケーションを選べます。しかも、すべてのデスクトップに一つのアプリケーションのインスタンスを指定することもできます(大好きなミュージックプレイヤーを用意しておくのにとても便利です)。
“WSLで私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。”
Tweet This
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キーがすでにある場合は、
フォルダのシンボリックリンクをWSLインストールに作成することで、同じキーを使えます。.ssh
MacBookを売ってしまった!
ウソです。MacBookはまだ持っています。でも、使い慣れている開発環境とほとんど同じような環境が作れたので、もうしばらくはMacBookを使わないでも生きていける自信はあります。私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。
これまでのところ、Windows Subsystem for Linuxに支障があって仕事ができなくなるという場面には遭遇していません。とはいえ、ここで紹介したユースケースは、ほかの人にしてみれば少しシンプルすぎるかもしれません。
あなたはWSLを使っていますか?使い心地はどうですか?下のコメント欄にぜひあなたの意見を書き込んでください!
About Auth0
Auth0 by Okta takes a modern approach to customer identity and enables organizations to provide secure access to any application, for any user. Auth0 is a highly customizable platform that is as simple as development teams want, and as flexible as they need. Safeguarding billions of login transactions each month, Auth0 delivers convenience, privacy, and security so customers can focus on innovation. For more information, visit https://auth0.com.
About the author
Steve Hobbs
Developer Experience Engineer