MacユーザーがWindowsで開発環境を作った

動機

15年くらいMacで開発していたのですが、iOS アプリ開発は Flutter で十分という感じになったので、Macでなければいけない理由は特に無くなってきました。

それと、WSL2 (Windows Subsystem for Linux) を使うと、Windows 上に Linux 環境が簡単に作れるというのを聞いていて、どんなものなのか試してみたいというのがありました。

Windows は同程度のスペックなら割と安めに買える&拡張しやすいので、速めの開発マシンが欲しい時は Windows の方が安く調達できるというメリットがあります。

Windowsマシンのスペック

  • CPU: Ryzen7 4800H
  • RAM: 32GB
  • VGA: GeForce GTX 1650 Ti

ゲームしませんが GPU が欲しかったのでゲーミング用のラップトップ買いました。RAM だけ後から拡張して、トータルで12万円くらいでした。(2021年3月時点)

調べたところ、日本だとこのシリーズの取り扱いが少ないようで(不人気なのかも)、もしかしたら割高かもしれません。参考までに、同製品の Core i5 版を貼っておきます。色々なメーカーが似たような性能の製品を出しているので、同スペックなら安い方を選んだら良いと思います。

僕が比較したときは、このマシンが同性能での最安だったのと、ゲーミング用マシンだとキーボードがやたら派手に光る製品が多かったので、キーボードが単色のこのモデルは個人的にはありがたかったです😅

初期の RAM は 8GB だったのですが、WSL2 を使ったら OS 全体が重くなりすぎて使えませんでした。32GB に増やしたあとは、メモリ不足で困ったことはないです。Macだと少しメモリ増やすだけで値段が相当高くなりますが、Windows ならメモリ単体を安価で買って自分でつければ良いので、マザーボードが対応している限りの大きなメモリを積むのがオススメです。

導入したもの

wsl2

wsl2 の導入については Microsoft のドキュメントに従って進めれば特に問題なくインストール出来ます。

Linux は Ubuntu 20.04 LTS をインストールしてみました。特にハマりポイントはなかったです。

Windows Terminal

特に他と比較したわけではないのですが、 Windows Terminal で特に不満を感じることがなかったので、そのまま使っています👌🏻

設定変更した点

  • フォントを変更する
  • デフォルトで開くシェルを、WindowsではなくLinuxにしておく
  • Linuxを開くだけだと、デフォルトではWindows以下のディレクトリになっているので、Linux上のディレクトリを明示的に指定しておく (Linuxのhomeディレクトリの設定が効かないため)

Windows Terminal の設定を開き、「JSONファイルを開く」から編集出来ます。

...
"profiles":
{
    // 全プロファイルで共通の設定を default に記述する
    "defaults":
    {
        "bellStyle": "visual", // bell を音ではなく画面表示で行う
        "cursorShape": "filledBox", // カーソルの形を変更
        "fontFace": "Roboto Mono for Powerline", // フォント指定
        "fontSize": 10, // フォントサイズ
        "fontWeight": "bold" // 太字が好きなので
    },
    "list":
    [
        {
            "guid": "{1eb4964f-18b1-4d0e-9a08-ea4e1c466b0e}",
            "hidden": false,
            "name": "Ubuntu-20.04",
            "source": "Windows.Terminal.Wsl",
            // ターミナル開いた時の初期ディレクトリを指定 (Windows側からみたパスで指定)
            "startingDirectory": "\\\\wsl$\\Ubuntu-20.04\\home\\username"
        },
        {
            "commandline": "powershell.exe",
            "guid": "{7878ea23-deea-4db1-a091-2f778396d67b}",
            "hidden": false,
            "name": "Windows PowerShell"
        },
        ...
     ],
...

注意点

WSL から /mnt/c/Users/ などのパスで Windows 側のファイルを参照できるのですが、ファイルアクセスがめちゃめちゃ遅いです。

初め Windows ユーザのホームディレクトリを Linux側でもホームディレクトリにしようと思ったのですが、あまりに遅くて使えませんでした。ちなみに最初はそれがWSLの速度と勘違いして絶望しました😅

Windows側のダウンロードフォルダのみ、Linux側 のホームディレクトリ以下にシンボリックリンクしているのですが、どうやらLinuxからファイルアクセスする場合のみならず、Windows上でのファイルアクセスも遅くなるという制限もあるようです。

とはいえ Windows側のブラウザでダウンロードしたファイルをすぐに Linux側で操作したいことは頻繁に発生するので、遅さを許容して使っています。

ソースコードをWindows側においておくと遅すぎて開発出来ないので注意です🙅‍

Docker

個人的には開発時に無いと困るのですが、普段 Docker 使わない人でも WSL2 の制約により、インストールしておいた方が便利だと思います。

WSL2 の制限とは、サービスの自動起動が追加で設定出来ないというものです(僕が調べた限り方法が見つかりませんでした)。このため、 MySQL, Redis などのサービスを自動起動しておくことができません。

なので、僕はサービスは全て Docker で管理するようにして、初回ログイン直後に手動で docker だけ起動するという運用にしました。ログイン時のコマンドに書いたりシェルの設定に書いたりなどで出来そうな気もしましたが、zsh の立ち上げが遅くなるのは嫌なのと、今のところはそこまで面倒でもないので(再起動する頻度が低いため)、ベストでは無いながらもこの運用をしています。

どうしても最新の Docker を使いたいとかはないので、apt でインストールしました。

Zsh & starship & Tmux

Mac で使っていた組み合わせを Ubuntu 上でもセットアップしました。
設定ファイルもほぼそのままで動きました。一部 zshrc で外部コマンドに依存する箇所だけ Mac と Ubuntu で処理を分岐させてパスを切り替える等が必要でした。

動作的にも特に困ることもなく使えています👍

Mac と Ubuntu の分岐は、$OSTYPE を見ると分かります。 Mac は darwin19.6.0 のような文字列で、Ubuntu は linux-gnu でした。

if [[ $OSTYPE == linux-gnu ]]; then
  # Linux のみで行いたい設定
fi

if [[ $OSTYPE == darwin* ]]; then
  # macOS のみで行いたい設定
fi

※ もしくは uname を使う方法もあります。どちらがベストプラクティスなのかよく分かっていないです。

OS="$(uname)"

if [[ "$OS" == "Linux" ]]; then
  # Linux のみで行いたい設定
fi

if [[ "$OS" == "Darwin" ]]; then
  # macOS のみで行いたい設定
fi

その他、Mac で使っていた CLI のツールは全て Linux でも使えたので、特にツールが足りなくて困るなどはありませんでした。

Mac の open コマンド相当は WSL2 上では wslview です。ただし使えたり使えなかったりなので、僕は cwd をファイルエクスプローラで開くときに wslview . を使うくらいです。ここは少し不便かもしれません😕

以前に書いた Zsh, Starship, Tmux を高速化する(memo.ecp.plus) も良かったらご覧ください。

各種言語のバージョン管理は asdf を使っていて、asdf install のみで完了でした👏🏻

NeoVim

apt でインストールしました。少しバージョンが古かったですが、特に最新機能を使っていなかったのでそれで良しとしました。
Mac とほぼ同じ設定で動きました。プラグインは vim-plug を使ってます。

VSCode

VSCode は標準で設定の同期機能があるので、同一アカウントでログインしておけば設定は同期されます。

ただ、キーバインディングが異なったりするので、もしどうしても Mac でよく使っていたキーを使いたい場合は、個別に設定したりなどが必要でした。僕は Vim プラグインを使っていたのですが、Macでは cmdctrl があり、OS操作のキーとVim操作のキーが被ることはなかったのですが、Windowsには cmd がなくOS操作のキーも ctrl で行う必要があるので、どうしてもOS側の操作をしたくないものはキーバインディングを設定しました。

WSL上で開発するなら、 Developing in WSL がほぼ必須です。VSCodeはWindows上で動作するので、VSCode のプラグインが依存するパッケージを Windows でもインストールする必要が出てきてしまいます。例えば、Language Server や Lint 等です。

このプラグインを入れると、Linux 上にインストールされたパッケージを使ってくれます👏🏻

VSCode の起動は、Mac 同様に開きたいディレクトリまで terminal 上で cd して、 code . として起動してます。

Microsoft PowerToys

Microsoft PowerToys は、ランチャーやファイルエクスプローラの拡張などが含まれたソフトウェアです。

使っている機能は、

  • PowerToys Run -> ランチャーです。ランチャー起動のショートカットキーに必ずモディファイアキーを付ける必要があるため、一旦絶対使わなそうなキーに割り当てておいて、AutoHotkey で Mac で普段使っていた F3 にマッピングしています。
  • Image Resizer -> 右クリックに画像のリサイズが現れてすぐにリサイズできます。
  • File Explorer addd-ons -> プレビューエリアで SVG と Markdown が見られるようになります。

ランチャー、画像リサイズ、プリントスクリーンで領域選択をデフォルトにする、辺りが便利なので使っています。

他にもキーボードのマッピング機能があるのですが、手元環境だとなぜかしばらく使っているとキーが連打された状態になってしまうことがありました。色々試したのですが解決出来なかったので、キーボードマッピングを使うのはやめました。

代わりに、キーボードマッピングは下記のAutoHotkeyを使っています。

AutoHotkey

AutoHotkey は、キーマッピングを変更したり、ショートカットキーを定義したりなどがプログラマブルに行えるツールです。

Caps lockCtrl に割り当てたり、特定のアプリケーション上のみで有効なショートカットを定義したり出来ます。

どうしても Mac で左の Cmd を多用していた癖が抜けないので、左 Alt を左 Ctrl に割り当てて、 左Ctrlに反応するキーマッピングを定義して使っています。このおかげで、およそ Mac で慣れ親しんだキーマッピングにカスタマイズすることが出来ました。

AutoHotkeyは、PowerToysで発生していたキー連打問題に遭遇することはなくなり、安定して動作しています👌🏻

*.ahk の設定例

左 Alt を左 Ctrl にする

*LAlt::Send {LControl down}
*LAlt up::Send {LControl up}

Edge で Shift + Ctrl + ]Shift + Ctrl + [ で前後のタブへ切り替える

#IfWinActive ahk_exe msedge.exe
^+}::Send ^{Tab}
^+{::Send +^{Tab}
#IfWinActive

(Chrome の場合は msedge.exe の部分を chrome.exe に置き換える)

等です。

マウスについてもカスタマイズ出来るようです。僕はトラックパッド使っているので、マウス関連の機能は特に使っていないです。

MacType

Windows標準でも ASCII は割と綺麗に表示されますが、日本語フォントは Mac のように綺麗には表示されませんでした。

MacType というツールを入れると、Windows上でも日本語フォントが綺麗に表示されるようになりました。OS全体の動作を変更するので多少リスキーではありますが、 GitHub上でオープンソースとして開発されていることもあり安全性は問題ないと思います。

導入前後で別OSになったかのように綺麗になるので、オススメです👍🏻

TTclock

タスクバーの時刻表示をカスタマイズ出来ます。macOS の時刻表示に慣れていたらほぼ同じ見た目に変更する事ができます。

地味なのですが、Windows 使い始めたあとに必要と感じて調べて導入しました。Mac <-> Windows を切り替えて使っている時、時刻フォーマットが異なると認識が若干遅くなることが分かったため、同じフォーマットにしたかったというのが動機でした。

QuickLook

macOS の Finder 上で Space を押すとファイルの中身がプレビュー出来ますが、Windows にはこの機能がありません。無いと今までどれだけ重宝していたかに気付きました。

Windows でもこの機能を実現するアプリケーションがありました → QuickLook 。macOS のようにサクサクは動かないですが、都度ファイルを開いて確認するのに比べたら格段に早いのでとても便利です👍

Mac, Windows 両方で提供されていたGUIアプリケーション

Windows 自体の設定

  • PrtSc でスクリーンショットのモード選択が出るようにする (Settings -> Ease of Access -> Keyboard -> Use the PrtScn button to open screen snipping を ON)
  • Win + Tab のアニメーションを切る (Control Panel -> Ease of Access Center -> Make the computer easier to see 内で Turn off all unnecessary animatinos (when possible) をチェック)
  • 初期設定だとやたらOSの通知が来るので、 Settings -> Notifications & actions で重要でないものは全部OFFにする

色々設定変更したけど大半を忘れてしまいました…メモっておけばよかった🤦‍♂️

Windowsには存在しなかったソフトウェア

Skitch

主にスクリーンキャプチャを撮ってコメントつけて送るのに使っていました。
Skitch には現在 Windows 版はないようです。以前は提供されていたようですが。

しっくりくるツールはなかったのですが、でPrintScreen を押すと領域選択が立ち上がってスクリーンショットを撮れる設定を有効にしておけば、スクリーンショット撮ったらランチャーからペイントを開いて Ctrl + v とすればキーボードで完結するのでこれに落ち着きました。ペイントを開いて Crop を押すとスクリーンショットで切り取った領域のサイズに自動的に画角を合わせてくれます。

Skitchほど直感的には使えないですが許容範囲なのでよしとしています。

Bear

メモ書きツールとして使ってました。

調べると、Windowsユーザは OneNote が人気のようでした。個人的には Markdown で書きたいので OneNote は断念しました。

他に TODO管理として Things も使っていたのですが、 Elixir で自作した Social Checklist に集約して運用することにしました。また、仕事の情報は全て DocBase に集約しています。

これで、Mac でも Windows でも環境を選ばずに情報を記録する事ができるようになりました👌🏻

Spaces

macOS の機能ですが、Spaces を多用しているのでなかなか macOS のようにサクサク切り替わってくれるアプリケーションはありませんでした。

OS標準機能でトラックパッドの3本指スワイプでもデスクトップ切り替えができますが、キーボードから手を動かさずにキーボードで操作したいのと、挙動が細かく設定出来るというのが欲しいのですが、そのようなアプリケーションは今の所見つかっていません。

解決策として、27インチ4Kモニターを買いました😌 今は特に問題はないのですが、もし将来的に外に持ち出して作業するとなった場合には問題になりそうです。

ちなみに、購入した Dell の 27インチ4Kモニターがかなり良かったので紹介しておきます。この価格帯では珍しく USB-C 接続に対応してます。MacBook をつなぐと、モニター出力と充電を1本のケーブルで行ってくれるのでとても便利です。Windows ラップトップはディスプレイポートでつないでいます。共に 4K で出力が出来ます。

なぜ安いかと言うと、リフレッシュレートが低いからだと思われます。つまり、ゲームをする人には向いていないです。逆に、ゲームをしない人にとってはデメリットにならないのでかなりコスパが良いモニターだと思います👌🏻

まとめ

使っているツールの多くが CLI だったため、思っていたより環境構築はスムーズでした。また、今の所は特に大きな問題もなく良い感じです。

自分で作っていた便利ツールも、シェルスクリプト、Ruby、Crystal、Rustだったので基本的にそのまま動きました。

また、今では多くのサービスが Web サービスとして提供されていて、そのようなサービスはOS関係なく使えます。Web ベースのサービスは利用環境に依存しないというのは、普段は全然気にしないですが大きなメリットですね👏🏻

比較的安価に高速な開発環境が手に入ることが分かったので、Windowsマシンをメインの開発環境にして、Macは軽量でバッテリーが長持ちする携帯用途にしても良いかなと思っています。

魅力的な Apple シリコンの Mac が今後発売されていくのを期待しているので、また気変わりするかもしれませんが😌

あと、僕の用途だと、そもそも Windows でしか出来なくて Linux だと出来ないこともないような気がするので、Linuxのデスクトップ環境をセットアップする手もあったのでは?という気も若干しています。

大学生の頃は Linux のデスクトップを使っていて、困ったことはオフィス系ソフトウェアのことだけだったような記憶があるのですが、今はWeb上でどうにでもなるので。あと、どうしようも無くなったらクラウド上で Windows Server 起動してリモートデスクトップという手段があるので、詰むことはなさそうです👌🏻