LinuxというかUnixというかMac
※ WSL2が実用的なので、基本的に全てWSL2に委ねることを推奨できる => Windows10 WSL2にLinux居城を爆誕させる
本稿はPowerShellとかで頑張りたい人向けになってしまった。。。 ![]()
対象者
- 世の中はMac or Linuxだけど
Windows10 Homeで開発したい - Unixコマンドがあっても
Windows10 Homeで開発したい - Dockerが必要だけど
Windows10 Homeで何とかしたい -
Spacemacsを使いたいけど
Windows10 Homeで何とかしたい-
Clojure が必要だけど
Windows10 Homeで何とかしたい - Scalaを使うこともあるけど
Windows10 Homeで何とかしたい
-
Clojure が必要だけど
- Node.jsを使うことになったけど
Windows10 Homeで何とかしたい -
Terraformとかインフラ周りも使いたいけど
Windows10 Homeで何とかしたい
目次
- PowerShell (やWSLなど)を1つのウィンドウ内に複数タブで使う
- Zipコマンドを使う
- Gitを使う
- まずWindows上のgitで改行コードが自動変換される罠を外す
- Dockerを使う
- WSL2でもMacのHomebrewのようなパッケージ管理をする
- Leiningenを入れてPowerShellからClojureを動かせるようにする
-
Spacemacsを入れて
cider-jack-inからlein replを使えるようにする- 環境変数を読み込めるようにする
- cider-jack-inでreplを起動する
- JVM文字化け問題を何とかする
- TypeScript Layerで自動整形をかける
- Scala Layerで定義ジャンプや補完機能を使う
- その他いろいろ
- PowerShellでSBTの文字コード問題を解決する
- nvm経由でnpmを入れて複数のnodeを切り替えられるようにする
- tfenv経由でterraformを入れて無双する
PowerShell (やWSLなど)を1つのウィンドウ内に複数タブで使う
Windows Terminal (Preview)を使う。
cf. Windows Terminalで色やフォントや画面サイズを設定する
Zipコマンドを使う
参考 => https://note.mokuzine.net/win-cmd-zip/
Windows10、GUIでは普通にZipできるしPowerShellには専用の Compress-Archiveコマンドが用意されているが、LinuxやMacでおなじみのZipコマンドはない ![]()
Gitを使う
Git GUIは使ったことないけど、便利かもしれない。
Git Bashは必須の予感 (ssh-keygenで大活躍しそう (ついでにtfenvとterraformで大活躍した))
まずWindows上のgitで改行コードが自動変換される罠を外す
参考 => @uggds - 気をつけて!Git for Windowsにおける改行コード
初期設定のままだとpullしてきた時に改行コードが自動変換されるため、*.shを動かした時'\r': command not foundのように怒られることがある。
本稿にも書くが原因は~/.gitconfigにあるコレ。
[core]
autocrlf = true
falseにしよう。罠を外したら思う存分pullしよう。
気づかず やってしまったらこちらで対処していく => https://qiita.com/t-kuni/items/1c5c7512ee0827f200de
Dockerを使う
Windowsで使えるDockerは大きく3種類
- Docker Desktop for Windows
- Docker Toolbox
- WSL (Windows Subsystem for Linux) 2
まず、Docker Desktop for Windowsは仮想化技術としてhyper-vを使うので、Windows10 ProやEducationなどでしか使えない(Homeにはhyper-vが無い)。つらい。。。つらい。。。
Windows10 Homeで使える手段としては以下。
- Docker Toolbox
- 仮想化技術としてHyper-vではなくVirtualBoxを使っている
- WSL2 + Ubuntu18.04LTS
- ubuntuにdockerをインストール可能
-
Docker Desktop WSL2 Tech Preview (※ v2.2.2.0以降かな?)
-
HomeでもDocker Desktopをインストールできると話題になった - が、version 2.1.0.0をHomeにインストールできないissueが報告されておりダメだったことがある。
どうやらTech PreviewはHyper-vの一部機能のみを使う設計で、その一部機能はHomeでも使えるというカラクリらしい(詳細はここか?)
しかし当時のTech Previewには古いDocker Desktop for Windowsの設計(Hyper-vの全機能を要求する部分)が紛れ込んでいるとかで、結局Pro以上のEditionを求められインストール不可になっているとか。上記issueでは全機能使うほうと一部機能使うほうを分離することが提案されている。
似たような問題にぶつかっているっぽい例も見られる。
やがてv2.2.2.0がリリースされ、Homeで動くとの情報があった
公式曰く、Windows 10 Home users can now use Docker Desktop through the experimental WSL 2 support. This requires Windows Insider Preview Build 19018 or later.
-
以上3つのいずれかを使うことになりそう。
最近Docker Desktop WSL2 Tech Previewの成長がめざましいので、十分に実用できるかも。PowerShellではつらかった各種問題もWSL2では難なくクリアしてそう
Docker Toolbox
インストール
docker-composeを使うため、Docker Toolboxをインストールする。
https://docs.docker.com/toolbox/toolbox_install_windows/#step-2-install-docker-toolbox
Docker Toolboxインストールの参考:
- D-jiro.Y - WindowsでDocker Toolbox&docker-composeを動かす
- ラボラジアン - Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法
手順通りにインストールすれば動く。
※VirtualBoxが既に入っている場合は、アンインストールしてDocker Toolboxでインストールすることを推奨。バージョンの壁なのかパスの壁なのか、動かないので…
ポートフォワーディングで繋げる
上記(インストール)の参考リンクにも書いてある。
例えばdockerのコンテナで0.0.0.0:8080->80/tcpのようなポート設定をしている場合、VirtualBoxのポートフォワーディングでは以下のように設定する。
| 名前 | プロトコル | ホストIP | ホストポート | ゲストIP | ゲストポート |
|---|---|---|---|---|---|
| okimochi | TCP | 127.0.0.1 | 8080 | 8080 |
おまけ:WSL1を入れてUbuntuのTerminalからdockerを動かせるようにする
Ubuntu16.04LTSではなく Ubuntuを入れていたので、Ubuntuのバージョンは18.04だったかもしれない。。。
まずWSLインストール
参考 => Windows Subsystem for Linuxをインストールしてみよう!
- WSL上でCドライブは
/mnt/c/にある。マウントしているとかなんとか。 - PowerShellとWSLとではホームディレクトリが別々…すなわち
.gitconfigも別々なので注意(WSLでcore.autocrlf=trueのままだとどうなっちゃうんだろう)
いよいよWSL1でDockerを使えるようにする
「ラボラジアン - Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法」を参考にして、WSL上の~\.bashrcに以下を追記する。
export DOCKER_HOST=tcp://192.168.99.100:2376
export DOCKER_CERT_PATH=/mnt/c/Users/okimochi/.docker/machine/certs # ユーザ名がokimochiの場合
export DOCKER_TLS_VERIFY=1
export COMPOSE_TLS_VERSION=TLSv1_2
最後のCOMPOSE_TLS_VERSION=TLSv1_2は、SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol versionを回避するために指定する。参考 => https://github.com/docker/compose/issues/6473
同じ目に遭っている人がいた。
- @kodetto - DockerでのTLSV1エラー
- @atsu_kg - docker-compose up -d 実行したらSSL errorで起動しなかったのでTLS_VERSIONを指定した
WSL2 + Ubuntu18.04LTS
Windows Insider Previewアップデートをインストール
WSL2を使うにはInsider Previewにだけ存在するビルドが必要。公式が発表している前提条件はコレ。
WSL 2 は、Windows 10 ビルド18917以降でのみ使用できます。
- WSL がインストールされていることを確認します (この手順についてはこちらを参照してください)。また、Windows 10ビルド 18917以降を実行していることを確認してください。
- ビルド18917以降を使用していることを確認するには、Windows Insider プログラムに参加して、"高速" リングを選択してください。
- Windows のバージョンを確認するには、コマンドプロンプトを開きver 、コマンドを実行します。
- "仮想マシン プラットフォーム" のオプション コンポーネントを有効にする
- コマンド ラインを使用して、WSL 2 によってサポートされるようにディストリビューションを設定する
- 現在のディストリビューションが使用している WSL のバージョンを確認する
要するにWindowsの更新設定から Insider Programに参加して Fast状態でアップデートすれば18917以降のビルドが手に入る。
Insider Previewはちょっとリスクもある気がする。
僕がアップデートした時点では Build 18995だった。
WLS1とUbuntu18.04LTSをインストール
上記のおまけと同じ方法で WSL1と Ubuntu18.04LTSをインストールする。
Insiderじゃなくてもできるので、こっちを先にやっても良い。
※Microsoftストアにある Ubuntu Ubuntu18.04LTS Ubuntu16.04LTSの違いは単にバージョンらしい。
Ubuntuは最新バージョンに都度更新されていくとのこと。
勝手にやらないでのおきもちを込めて18.04LTSを使う。
WSL2へアップグレード
もしアップグレード中にエラーが出たら↓
カーネル更新
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です
Linux カーネル更新プログラム パッケージを公式サイトからダウンロード・インストールすれば解決。
cf. https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
PS C:\WINDOWS\system32> wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 1
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。
PS C:\WINDOWS\system32> wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Stopped 2
ファイルの圧縮/暗号化
システムの制限により、要求された操作を完了できませんでした。仮想ハードディスク ファイルの圧縮と暗号化が解除されている必要があります。また、仮想ハードディスク ファイルをスパースに設定することはできません。
これはWSL2のUbuntuディレクトリが圧縮されていると起こる。
この解決策に従い、Ubuntuディレクトリの圧縮を解除すれば良い(ディレクトリ以下すべて圧縮解除する)。
たとえばユーザ名 v2okimochiの場合、 C:¥Users¥v2okimochi¥AppData¥Local¥Packages¥CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgscみたいなディレクトリがあるはず。
なお解除中に以下のようなエラーが出たら 全て無視すればなんかいける。
属性の適用エラー
ファイルの属性の適用中にエラーが発生しました:
C:¥Users¥v2okimochi¥AppData¥Packages¥fsserver
ファイルにアクセスできません。
WSLと仮想化機能の有効化
Windowsホームボタンから Windowsの機能の有効化または無効化を開き、以下3つにチェックが入っていることを確認する。
ホームボタンの検索で日本語を入力できない場合は、 featureを入力すれば出ると思う。英語でもいいんだ(未知との遭遇)
- Windows Subsystem for Linux
- Windowsハイパーバイザー プラットフォーム
- 仮想マシン プラットフォーム
WSLのインストールで度々出てくる 機能の有効化は恐らくこれ。
WSL2 (Ubuntu18.04LTS)にDockerを入れる
Docker Desktop for Windows v2.2.2.0以降
Docker Desktop for Windowsをインストールする。
Dockerの設定から、WSL2との連携にチェックを入れる。
Enable integration with my default WSL distroにチェックを入れてしまっても良いし、 Enable integration with additional distrosからディストリビューションにチェックを入れても良い。

完
Docker Desktop for Windows v2.2.2.0より前
Docker Desktop for Windowsをインストールできない
![]()
Ubuntuに直接dockerを入れる。
Ubuntuなので apt-getapt update, apt installが使える。
※ aptは apt-getの欠陥を克服しているらしい(ので apt-getより apt推奨)
公式に従いdockerインストール
https://docs.docker.com/install/linux/docker-ce/ubuntu/
docker-composeインストール
https://docs.docker.com/compose/install/
Dockerを動かす
※ Docker Desktop for Windowsを使えていれば不要。
PC起動する度に必要っぽい。
$ sudo /etc/init.d/docker start
ちな /etc/init.d/docker statusで起動状態がわかる。
※止まっているのを忘れてDockerを動かそうとすると、以下のようなエラーが出る。
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
Dockerデーモンが動いてない的に怒られている。 docker info見るとこう。何このエラーみたいになった時これを思い出せたらいいな。。。
docker info
Client:
Debug Mode: false
Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info
Dockerコンテナへの接続
※ Docker Desktop for Windowsを使えていれば不要。
実は Docker Toolboxのようにlocalhostでバシバシ接続できない。
たとえば mariadbコンテナを立ててそのDBに接続しようとするとlocalhostじゃダメ。 なんとWSL側もlocalhostでは繋がらない(WindowsもWSLも同じ存在という扱いだし当然か?)
Dockerコンテナには WSL側のeth0 IPアドレスを使って繋ぐ。 ifconfigとか ifconfig eth0とかやれば出る。 172.27.145.150みたいなアドレスだった。
このアドレス、厄介なことに WSL2を起動する度に変わる。PCを起動する度に変わる
つまりAPIサーバなどからDBへ接続する際のホスト名 (IPアドレス)を毎回変えてやらねばならない。
そして static IPを無理やり付与した程度では直らないらしい。つらい。。。
Github上でも WSL2に静的IPアドレスを付けたいんだけど とか ポートフォワーディングで回避しようぜ とか色々言われている。 やり方を @v2okimochi に解説してくれ!!!
Webに localhostで接続
アドレスを固定化できないか探していたが、別件でこういう方法もあるらしい。
https://yukituna.com/2284/
https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-insiders-preview-build-18945/
Webはlocalhostでアクセスできた(設定のおかげかは不明)。
WSL2でもMacのHomebrewのようなパッケージ管理をする
MacではHomebrewを使うことで、特に何も考えなくてもスッとパッケージをインストールできる。
WSL2内のUbuntu (Linux)では、自力で頑張る必要があった。
現在、そんなWSL2内のUbuntuでもHomebrewが使えることを教わった。
cf. https://docs.brew.sh/Homebrew-on-Linux
既に色々な紹介記事もある。
Linuxbrew のススメ
【WSL】LinuxにHomebrewを導入する
これで、ドキュメントに brew installしろとしか書かれていないようなツールも気軽にインストールできる ![]()
sbtやtfenvもスッと入る。
Leiningenを入れてPowerShellからClojureを動かせるようにする
Leiningenをインストール
参考 => yohshiy - Clojure, Leiningen の Windows へのインストールと使い方
本稿でも補足をする。
- まずJDKを
Program Files以外のディレクトリにインストールする- oracleがログイン必須みたいな状態なので、JDKはadoptopenjdkなどがおすすめ
- スペースが含まれるディレクトリにインストールすると、Emacsからのrepl呼び出しが失敗するらしい
-
lein.bat推奨の予感- v2okimochiは参考リンクの
leiningen-win-installerを使えなかった(JDKが認識されずインスコ止まる) - 予めWindowsの環境変数として
JAVA_HOME=C:\<jdkへのパス>\binを追加しておく - WindowsはWin32内のJavaなどを見に行く習性があるらしいので、環境変数の順番はWin32より上に置く
- v2okimochiは参考リンクの
-
jenvは使えない…のでJDKへの環境変数pathを変えて疑似jenvっぽく頑張る
Spacemacsを入れてcider-jack-inからlein replを使えるようにする
Spacemacsインストール
公式にインストール方法がある => https://github.com/syl20bnr/spacemacs
Windows版は勝手が違うので補足する => v2okimochi - spacemacs.md: Windowsでのインストール
補足内容は以下のような感じ。
- 公式のインスコ方法だと日本語インライン変換(入力中の文字を表示してくれる機能)が詰むよね
- 環境変数を通す必要があるよね
- 初回起動は
--insecureオプションが必要だよね
あとはSpacemacsのいい感じの設定方法については「@lagenorhynque - Clojure/ClojureScript関連リンク集: Clojure開発全般」に全部載ってる。Clojure関連も全部載ってる。
環境変数を読み込めるようにする
SpacemacsがPCの環境変数を読む仕組みが微妙にアレ(悪いとは思わないけど、知ってないと罠なのでひどい。。。)
こういうやつなんだと知っていればおk。
https://qiita.com/v2okimochi/items/82c541ba67c81493976c
cider-jack-inでreplを起動する
「ayato-p - SpacemacsでClojureを書くために僕が行った設定」を参考にして、.spacemacs(コマンド操作Space f e dで開ける)にCider関連の設定を加える。
あとはClojureファイル(*.clj)を開いた状態でSpace , 'すればnrepl serverが動き出し、少し待てばcider replが起動する。
JVM文字化け問題を何とかする
ClojureはJVMを使っているので、JVMの有名な日本語文字化け問題を引き起こす。
Leiningenではこうやって対処できる。
https://qiita.com/v2okimochi/items/40d0ebd2186657a44969
TypeScript Layerで自動整形をかける
spacemacsはTypeScript Layerで typescript-fmt-on-save tを設定すれば自動整形できる。
が、Windowsにおいては一筋縄ではいかないかもしれない。
もし "No such file or directory diff"的なエラーが出たらコレで解決できるかもしれない。
https://qiita.com/v2okimochi/items/f3f4361d7842271454c6
Scala Layerで定義ジャンプや補完機能を使う
Scalaには定義ジャンプや補完機能をもつバックエンド (Language Server?)としてEnsimeやMetalsが挙げられる。
Ensimeを利用する方法もMetalsを利用する方法もあるが、Spacemacs上ではEnsimeの定義ジャンプ機能が怪しいのでMetalsに軍配が上がりそう。
他にも色々あるが、
Windows10でspacemacs関連はもう面倒なのでspacemacsメモとトラブルシューティングにまとめた。
PowerShellでSBTの文字コード問題を解決する
PowerShellを使っていると、SBTの起動や実行まわりでやはり文字コードの問題が起こる(単純なScalaコード上においても)。
文字化けやjava.nio.charset.MalformedInputExceptionエラーを倒した例はこちら
nvm経由でnpmを入れて複数のnodeを切り替えられるようにする
参考 => @rapando - nvm-windows 導入
以上。シンプル。はや~い
補足
Program Filesなど スペースが入ったディレクトリ内にインストールしてはいけない
参考 https://github.com/coreybutler/nvm-windows/wiki/Common-Issues
また、バージョンは1.1.7でないとダメっぽい。 Could not download npm for nodeエラーが出てnpmを使えない。
この議論で示されているように v1.1.7 Maintenance Releaseで修正されている。
https://github.com/coreybutler/nvm-windows/issues/373
ここでも同じことが言われている。 https://one-it-thing.com/2294/
WSLを使うならUbuntuに入れれば良かったり
tfenv経由でterraformを入れて無双する
AWSやGCPなどに用意されたCLIサービスをいい感じに使うためのterraformを、tfenvでバージョン管理する。
WSL2にHomebrew (for WSL)を入れて brew tfenvすれば勝ち。完
以下はWSLを使わず頑張る場合↓
tfenvのインストール
公式はこちら https://github.com/tfutils/tfenv
そしてやはりMac基準…
(インストール手順にはbrewが描かれている)
曰く、
Support
Currently tfenv supports the following OSes
- Mac OS X (64bit)
- Linux
- 64bit
- Arm - Windows (64bit) - only tested in git-bash - currently presumed failing due to symlink issues in git-bash
Windows 64bit版は Git Bashでしかテストされていない
(テストしてないだけで動くんでしょと思ったらコマンド認識すらされなかった
)
しかも状況によっては失敗することが想定されているらしい………………
ひとまず、Windowsの場合は手動インストールとなる => 参照 https://github.com/tfutils/tfenv#manual
インストールだけならPowerShellでもいけた。
公式はMacやLinuxを想定してこう書いているが、
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
PowerShellでcloneする場合は、 ~が認識されず ~ディレクトリを作成されて放り込まれる (
)ので、ホームディレクトリで直接 .tfenvディレクトリを作ってもらうのが良さそう。
git clone https://github.com/tfutils/tfenv.git .tfenv
環境変数を通す
binディレクトリまでの絶対パス (たとえば C:\Users\v2okimochi\.tfenv\bin)をWindows10の環境変数 Pathに追加する。
terraformのインストールと実行
環境変数を追加した以降にGit Bashを立ち上げると、Tabキーで tfenvコマンドが補完できるはず。
※ PowerShellだとコマンド認識されない ![]()
.terraform-versionファイルでバージョン指定しておき、そのディレクトリで tfenv installコマンドを実行すれば、指定したバージョンのterraformをインストールしてくれる。
そして terraformコマンドも動作するはず ![]()
ちなみに Git Bashでは動いたのにWSLでは動かなかった。。。どうして。。。。。無双できない
