Tech Racho エンジニアの「?」を「!」に。
  • 開発

Web開発環境をMacBook ProからWindows機に移行してみた話

メイン著者記事としてはご無沙汰しておりますmorimorihogeです。
今年もTechRachoではアドベントカレンダー特集ということで、普段あまり記事を書く機会がなくて表に出ないメンバーにも記事を書いてもらえる運びとなりました。クリスマスまではアドベントカレンダー特集進行のTechRachoをお楽しみ下さい。

今回は最近メイン開発環境をMacからWindowsに移行したので、そのあたりの感想や設定の勘所などをまとめてみたいと思います。

なぜMacから移行するのか?

僕はOS XのIntel Macが出たころからのMacユーザー(当時はまだRosettaとかがありました)で、かれこれ10年以上Macを使い続けてきました。多分Webシステム開発用途でMacを使い始めたという人の中では古参の方なのではないでしょうか。
というわけで、なんで移行するの?という話からぽえみーに綴ってみようと思います。

なお、僕のメイン開発領域はWeb開発(Rails / PHP / JavaScript)ですが、開発・提案資料のためにOfficeやAdobe製品もちょくちょく利用します。また、業務ポジション的に外に出ることも多いため、モバイル性はそれなりに重視しています(多少重くてもいいから外にいても普段通り開発できる環境が欲しい)。

そもそもMacを使い続けていた理由

Macをメイン開発端末として10年間使い続けてきた理由はいくつかあります。
僕は基本的に年に1回はメイン端末を最新に更新するというポリシに従って使ってきましたが、その中での私見です。

  • ハード面
    • 時によって賛否や人柱バージョンなどもないわけではないが、概ねデザイン・強度的に満足していた
    • それまでずっと買い続けていたThinkPadがLenovoに買収され、品質面がどうなるか怪しかったので受け皿を探していた
    • Genius Barに持ち込むことを前提とするのであれば、サポート面はとてもよかった(預かり修理でも1週間かかったことがなかったし、不具合の発生した動画や写真を見せればごねずに数分で修理交換手続きをしてくれた)
      • 他メーカーだとThinkPad以外は修理に現物発送が必要なだけでなく、不具合が直らず返ってくる事例ばかりだったのでメイン収入を稼ぐ手段を預けるには怖すぎた
      • ※ThinkPad利用時代は壊れたら自分でパーツ取り寄せして修理してました
    • 価格的にはスペックに対して多少割高なこともあったが、同等スペックのWindows機と対して変わらない時期もあり、サポート体制などを考えれば許容範囲だった
  • ソフトウェア面
    • Web開発ではOSがUNIX系OSであることが都合が良かった(VMは色々もっさりするので嫌いだった)
    • 文字がきれいで読みやすく、一度慣れるとWindowsに戻りづらかった
    • 必要なものはそれなりにシェアウェアにも投資して揃えてしまったので「Windowsならフリーソフトでできるのに」という点は特に不満にならなかった
    • Web系エンジニアを中心にMacが勢力を盛り返していく世の中の流れに乗れたため、諸々トラブルシューティングも簡単だった
    • 業務エンジニアにはありがたい機能があった。例えばTime Machineの「ある日突然メインマシンが復元不可能な壊れ方をした時に、端末購入を含めて概ね24時間以内に満足のいく開発環境を復元できる」という要素はかなり強かった。

というわけで、その他の不満がないわけではないですがそれなりに満足していました。

Macへの不満蓄積とWindowsの誘い

しかし、ここ数年はMacに対して以下のような不満を感じるようになっていました。

  • ハード面
    • 「これが欲しい」と思わせるモデルが出なくなったため、不満が気になるようになってきた
      • TouchBarは嫌いじゃないけど別にいらない(むしろないほうがうれしい。🍣を並べる以外に実用的な価値を見いだせなかった)
      • USB-C推したいのはわかるけど、ちょっとUSB機器つなぎたい時にたまたま変換アダプタがないと積むのは純粋に不便(変換アダプタはあちこちに配置していたけど、それでもたまたま忘れることはある)。
    • 欲しいスペックのマシンを買おうとすると、同等のWindows機に比べてあまりにも値段が高くなるケースが目立つようになってきた
      • メモリ32GB、SSD 2TBとかにしようとするとつらい。フルスペックなんてとてもとても・・・
      • AppleCareも+になって値上げしたし「とりあえず念の為入っておこう」というノリでポチるのに抵抗が・・・
    • MacBook Proの高いBTOモデルでも、WindowsノートPCにスペックで負ける要素が出てきた
      • 4kディスプレイがない。どうしたApple!MacBook Proは常に市場に対してハイエンドモデルが用意されていると信じてたのに・・・
      • HDMIケーブルが直接接続できないので、本体だけ持ち歩くと仕事に支障が出るケースがある
  • ソフトウェア面
    • 特に追加の不満はないが、Windows 10あたりから「Windowsもそんなに悪くないんじゃない?」と思うことが増えた

一方、Windows機についての状況も色々変わってきているなと感じました。

  • ハード面
    • MacBook系の設計をパクインスパイアしたと思われるマシンの中で、そこそこ品質的にも良さそうに見えるモデルが出てくるようになった
    • 何よりも選択肢が多いというのは良い
      • USB/HDMIが普通につながる事により、大量の変換アダプタを持ち歩かなくて良い幸せ
      • USB-C PDが普及してきたことにより、ACアダプタを忘れても充電できるモデルが出てきたのも良い
      • タッチパネルはそれほど興味ないけど4kディスプレイは使いたいと思っていた
      • nVIDIAのMax-Qデザインなど、有象無象の中でも品質を担保しようという試みも良い
  • ソフトウェア面
    • Windows 10環境がそれほど悪くなさそう(駄目なところももちろんあるが)
      • WSL(Windows Subsystem for Linux)Hyper-Vなど、開発環境向け機能の拡充
      • フォントレンダリングは昔に比べてきれいになったように思える(解像度が上がったからかもしれない)
    • Docker for Windowsなんかもある(が、結構クラッシュする印象があるのでまだ様子見中)
    • Win/Macを両サポートするマルチプラットフォームソフトウェアの多くが、OS非依存のライセンス体系に移行している

そんなわけで、不満を持ちながらも惰性でMacを使い続けるよりはもっと良い環境になる可能性のある方向を目指す方が生産的だよねということで、試しにいっちょWindows機に移行してみるか、ということにしました。

なお、100%開発にしか使わないのであれば(ぶっちゃけゲームが動かなくていいなら)、ホストOSはLinuxにした方が苦労は少ないと思います。後述するGUI重い問題もホストOSインストールなら気にならないと思いますし、何より無駄な仮想化レイヤがないぶん早いしシンプルです。
Linuxを使う選択肢についてはjoker1007さんの以下の記事あたりを読むと良いと思います。2016年の記事ですが、今も大して事情は変わらないというか、よりMacを使い続ける理由は減っていると感じます。

MacBook Proからの移行機選び

MacBook Pro 15(2017)からの移行ですが、とりあえず以下の条件で探しました。

  • 本体がそれなりに堅牢で、多少ぶつけても壊れないこと
  • 英語キーボードが選択できること
  • USB PDから充電できること
  • メモリ16GB以上
  • SSD 1TB以上、もっと載せられるならなお良い
  • nVIDIAのGPUが乗っていること(Steam積みゲーを消化したい)
  • MacBook Proと同程度にはバッテリーが持続すること

色々検討した結果、 Dell New XPS 15Razer Blade 15を眺めつつ「うーん」と半年くらい悩んでいたのですが、先日ThinkPad X1 Extremeが発表されて即決しました。
決め手はすでにサブマシンとしてThinkPad X1 Carbon(2017)を持っていたため、キーボードとタッチパッド(+トラックポイント)の使用感にそこそこの信頼が置けた点です。

New XPS 15は当時店頭で触れる店が近くに見当たらなかったですし、Razer Blade 15は日本向けには英語キーボード版を販売していない(ひどすぎる)ので、必然海外からの個人輸入になる関係から実機を事前に触ることができませんでした。
# エイヤで買って打鍵相性の悪いキーボードや操作にストレスを感じるポインティングデバイスだったら流石に嫌すぎるので、そこは冒険する勇気がありませんでした

なお、X1 ExtremeはM.2 2280のスロットが2つあるため、BTOでは1TBを購入し、別途もう一枚買って2TB構成にしています。


ThinkPad X1 Extremeの背面M.2スロット。普通のM.2 Type 2280が刺せます。ユーザーがメンテできるって素晴らしい。

2018/12/03追記

結局どんなスペックにしたの?という声が聞こえてきたので補足すると、メモリ32GB、4kタッチパネルディスプレイモデルになります。メモリ割当は今の所以下で落ち着いています。

* ホストWindows: 12GB
* 業務Windows: 8GB
* 業務Linux: 12GB

ディスプレイは4kモデルを選ぶと自動的にタッチパネルモデルになり、非光沢は選択できません。発色はかなり良く、昔のThinkPad特有のあのやる気のないくすんだ液晶ではなく、Macと比べてもそれほど遜色ないように見えました(僕の目が節穴という説もありますが、Adobe RGB対応を謳ってるのでそこまでひどくないはずです)。

移行先PCの構成

移行後PCの構成ですが、下図のような設計にしました。

主な要点を解説すると・・・

  • 業務作業環境はHyper-Vの業務Windows環境及び業務Linux内に全て閉じ込める
  • ホストOSは業務関連じゃない個人的な作業やあれこれに使う
  • 開発用プログラムの実行環境(Rails/PHP/JavaScript等)は全て業務Linuxに置き、Sambaで業務Windows環境に公開する(Hyper-V内のプライベートネットワークなので、外部には公開されない)
  • 通常業務はリモートデスクトップクライアント経由の業務Windows環境で生活する

という感じです。

業務環境(Windows / Linux)は全部VMに入れる

業務系を全てHyper-Vに入れたのは、バックアップと復元の容易さを重視したためです。
よくDropboxやGoogle Driveに共有すればバックアップは終わりという文脈を見ますが、OSの環境変数や設定、レジストリ書き込みを必要とするソフトウェアなどはファイルバックアップだけでは環境が保存されません(専用のソフトを使えばできますが)。
そして、ファイルバックアップしかない場合、ファイルの復元ができても「開発環境」の復元には数日かかってしまいます

VMレベルでのバックアップであれば設定ごとバックアップできるので、新しく買ってきたマシンのHyper-Vさえ有効にすれば、あとはVMファイルを復元するだけで直ちに作業可能になります。
MacのときにはTimeMachineを使っていたので、それの代替ですね。

なお、ホストOSとは別にゲストOSである業務Windowsのライセンスも必要になります。ホストOSはHyper-Vを使う関係でPro化必須です。

業務開発環境をLinux VMにする理由

Dockerをなんの面倒もなく使いたいし、面倒な環境依存に巻き込まれたくないからに尽きます。
前記しましたが、Docker for Windowsは主にVolume共有あたりの挙動が怪しく(特にPermission周り)、体感ですがたまにFactory Resetせざるを得なくなることがしばしばありました。
Docker for Macはファイルアクセスが遅い以外は同じUNIX系OSということもあってか実用レベルなのですが、Docker for Windowsはまだちょっと怖いかなと感じています。
※個人趣味開発なら良いのですが、業務開発では環境クラッシュにより無駄な時間を取られたくない

また、Gitではファイルパーミッションも差分情報として扱いますが、このあたりをきちんと扱いたい場合もWindowsだと不便なので、Linux環境はどちらにしても必要になるでしょう。

業務作業環境をWindows VMにする理由

昔より良くなったとはいえ、Linux VMのデスクトップにVNCやRDPで接続して作業するもっさり感に耐えられないというのが主です。
また、純粋に実装作業しかしないということであればLinux環境でも構わないのですが、OfficeやAdobe系のファイルを開いたりと、Linuxの完全互換版がないソフトウェアはどうしてもあるため、様々な案件に関わることの多い現状ではWindowsの方が都合がよいなあというところ。

なお、Windows環境にして極めて良くなったのはOffice環境で、ExcelがMacに比べて極限にまともに使えるようになりました。起動も早くてクラッシュもしないExcelはすばらしい :)

移行に必要なものたち

Mac -> Windows環境に移行するにあたり、別途購入・整備・注意しないといけないものをまとめてみました。

ハード面

ハード周りでいくつか気になったのは以下でした。

  • マウス: Macで言うクラムシェルモード(PC本体を閉じて外部ディスプレイのみ使う)で使う場合には、当たり前だけどマウスが必要。一応AppleのBootCamp用ドライバをごにょごにょすればWireless Trackpadなどを動かすことはできるようだが、恐らくライセンス違反(BootCampドライバはMacハードにWindowsを入れるためのドライバなので、Apple以外のハードに入れるのは多分ライセンス的に駄目だと思います)
  • キーボード: 僕は自宅、会社ともにKinesis Advantageを使っていたので、キーマップを多少好みに調整するだけで済んだが、Mac専用キーボードを使っていた人はWindowsキーボードが欲しくなるかもしれない
  • モバイルバッテリー: MacBookシリーズは30WのUSB PDバッテリーから充電できたが、X1 Extreme(その他多くのWindowsノートPC)は45W出力できないと充電できない。USB PD対応のモバイルバッテリーの多くは大容量を謳っていても30Wのものがほとんどなので、45W出力のものを買い直す羽目になった
    • 選択肢はあまりないですが、dodocoolのやつはちゃんと充電できました。重い&でかいですが・・・
  • 各種Thundrbolt3 / USB-Cの拡張デバイスたち: Mac用に買い揃えた拡張デバイスたちはUSBやHDMIが直接刺さるX1 Extremeでは不要になったが、試しに挿してみたら多くのものはそのまま使うことができた。ただし、Macで4k出力できたDockや拡張アダプタは軒並み相性が悪いのか4k出力できなかったので、外部ディスプレイ出力周りは端末相性が強そう
  • Apple Thunderbolt Display: Thunderbolt変換アダプタを通して刺すことで一応画面は映るが、ドライバの相性が悪いのか高確率でOSがフリーズするため使えなくなると思ったほうが良さそう
  • 追加のThinkPad 135W ACアダプタ: USB PDでも充電はできるが、負荷をかけてぶん回していると充電がかなり遅くなる。移動が多い自分には純正135W ACアダプタが必要だった。自宅用、会社用、持ち歩き用で合計3つ必要になった(追加で2つ購入)

ソフトウェア面

ソフトウェア周りについてはそれほど投資し直さずとも揃いました。マルチプラットフォームに理解のある世の中になったのはすばらしい。

  • VMとして使うWindowsのライセンス: ホストOSはPC本体付属のライセンスで良いが、Hyper-Vで動作させるクライアントWindowsのライセンスは別途必要
  • 個別に買わなくても良かったもの
    • OfficeはOffice 365であれば購入不要
    • Adobe CCも同上
    • Jetbrains IDE(InteliJ IDEA、DataGrip等)も同上
    • Sublime Text 3も同上

環境構築における試行錯誤

環境構築にあたり、いくつか試行錯誤した点をまとめます。

Hyper-VへのVMインストール・設定周りでの注意

「Hyper-Vクイック作成」という簡単インストール機能でUbuntuがインストールできますが、JP版が欲しい場合はおとなしくISOを落としてきてインストールするのが良いと思います。
Linux側のGUIを使わざるを得ないケースがある場合、日本語入力ができないと不便&日本語用の設定をあとから入れるのは地味に面倒なので注意です。

また、Hyper-Vの動的メモリ機能はデフォルト設定だと最大RAM値がかなり大きな値になっているのですが、大した作業もしてないのに動的メモリ設定の最大RAM値に近い値までメモリを使い切るケースがありました。
そのため、最大RAM値は割当RAM値と同じくらいにしておくのが無難だと思います。

また、Linux環境にはHyper-V向けのLIS(Linux Integration Services for Hyper-V and Azure)をインストールすることで、CPUその他デバイス周りの効率化が行われるようなので、入れておきましょう。
※VMWare系におけるVMWare Tools、VirtualBoxにおけるGuest Additionsに相当するものという認識です

ホストOS -> 業務Windows VMへの接続はHyper-Vの拡張セッションではなくRDPで

ホストOSで動かすHyper-VマネージャにはクライアントOSのデスクトップ閲覧をするための画面接続機能がついています。
これには基本セッションと拡張セッションがあり、以下のようになっています。

  • 基本セッション: 恐らく内部的に仮想ディスプレイドライバを通したもの。クライアントOS側がどんな状態でも表示できるが、UIがもっさりして重い
  • 拡張セッション: 恐らく内部的にRDP(ネットワークごしのリモートデスクトップ用のプロトコル)を通して画面共有したもの。クライアントOS側に対応設定が必要だが、UIが軽い

拡張セッションはそこそこキビキビ動きますし、これで問題ないように思えるのですが、致命的な欠点としてホストOSからのデバイス共有が行えません
このままだと困るのが遠隔会議で、カメラデバイスをクライアントOS側の業務Windowsで利用できないため遠隔会議周りだけはホストOSで使うことになってしまい具合が悪いです。

これを解決するには、Hyper-V拡張セッションではなく、クライアントWindowsでリモートデスクトップ接続を有効にし、ホストOSからリモートデスクトップクライアントで接続します。
リモートデスクトップクライアントの設定には接続元マシンのデバイスを共有する設定があるので、ここからカメラデバイスの共有をONにすれば、クライアントWindowsでも本体カメラを利用できます。

Linux環境のデスクトップも非常用に準備したほうが無難

これはまだ良い落とし所が見つかっていない話なのですが、Linux環境のファイル領域をWindowsにSambaでマウントし、Windows側でInteliJ IDEAを使う場合、プライベートネットワーク越しのファイルアクセスとなるためファイルアクセス系がとても重くなります
特に致命的なのはGit周りの挙動で、permission周りなのかなんなのか、IDEA経由のGitサポートがうまく動いてくれません
Jetbrains IDEの持つSmart Checkoutなどの超絶便利機能が使えないのではとてもつらいので、そういった場合には苦し紛れですがLinux側にインストールしたIDEAを起動し、そちらでGit周りの操作だけ行うようにしています。

LinuxデスクトップへのアクセスはHyper-Vマネージャからデスクトップにアクセスするのでも良いのですが、それだとクライアントWindows側のアプリケーションと並べて動的にサイズ変更が出来なかったり、Linuxデスクトップ自体のサイズを動的変更できないため外付けディスプレイを抜き差ししてホスト側の画面解像度が変化するような環境では大きすぎたり小さすぎたりになって不便です。

結局試行錯誤の末落ち着いたのは、クライアントWindowsにVcXsrvというX Serverソフトをインストールし、クライアントLinuxからX転送でLinux側のIDEA画面を共有するという形でした。
正直イケてないと感じているのですが、とりあえず他にスマートな回避策が見つかるまではこれで我慢するか、という感じです。つらい


※左がWindows、右がX転送したLinux版IDEA

Macで使ってたあのソフトの代替は?

Mac時代によく使ってたツールの代替についてまとめます。まだ試行錯誤中ですがよく使うものを中心に。

  • SSHターミナルクライアント: RLogin
    • Mac時代はiTerm 2を使っていました。
    • 選定条件はタブ機能がある、普通にターミナルクライアントとして使える、そこそこにメンテされている、あたりです
    • Windows環境構築界隈を見ているとConEmuが人気のようなのですが、ConEmuから起動したMSYS2のBashからSSHして使っていると、画面リサイズ時にcursesを使っているようなリッチな画面書き換えがうまく扱えないのか画面がぶっ壊れまくり使い物になりませんでした。
    • そもそも開発環境はクライアントLinuxに寄せてあるので、RLoginで常に一度クライアントLinuxにログインしてから全てのシェル作業を行うことにしたら解決しました。
    • 弊社babaに教えてもらいました。感謝!

  • 画面(部分)スクリーンショット: Snipping Tool(Windowsプリインストール)
    • Mac時代はOS標準ショートカットを使っていました
    • 選定条件はファイル保存とクリップボード保存の両方に対応しており、かつショートカット一発で呼び出せること
    • もう新しいWindowsからはなくなると言われているSnipping Toolですが、必要最低限の機能があって便利なので未だに使っています。
    • Windows + Shift + Sもいいのですが、ファイルに保存する時に一度ペイント(これもなくなるらしい・・・)などに貼り付けないといけないのが地味に不便です。MacならCommand + Shift + 4で部分スクリーンショット&デスクトップ保存、Command + Shift + Control + 4で部分スクリーンショットのクリップボード保存という使い分けができたので、これが便利だったんですけどね。

  • リソース使用状況監視: thilmera 7
    • Mac時代はiStat Menusを使っていました
    • 選定条件はうざすぎない程度にそこそこ見た目が良いこと、かつ暴走プロセスや過大なネットワーク通信状況が見つけられること。
    • そんなにこだわりはなかったのですが、タスクマネージャよりはパッと見の見通しの良く、そこそこ網羅的にメトリクスが見れるツールということで使っています。
    • 地味にHyper-V管理のVMのCPU使用率を出してくれるのは、VMが暴走したときなんかに気づけるので便利かなーと思っています。

  • 図の作成: draw.io(一部不満あり)
    • Mac時代はワイヤーフレームや画面設計、インフラ・システム設計図作成にOmniGraffleを使っていました
    • 選定条件はレイヤ対応、あんまり気を使わなくてもそこそこ縦横が揃えられる、Stencilのような簡単に呼び出せるアイコン機能(AWS Iconなど)の充実
    • 基本的な図の作成については必要十分。ただ、開くブラウザ環境・OSによってはNoteとして書いた文章がはみ出たりなどの問題はある
    • 一点とても困っているのが大きな画像を貼り付けると「Image too big」というエラーで貼れない点で、Webページのスクリーンショットを貼り付けて上から指摘事項を書き込むような使い方をしていた自分にとっては割と致命的だったりします。とはいえいまさらVisioを有料で買うのもなあ・・・という感じ。PowerPointはレイヤ機能がないので使う気は(ないです)
    • この辺はまだ試行錯誤しそうです

まとめ

そんなわけで、長々と最近の試行錯誤の経歴を書いてみました。念の為以前のMacも準備はしてありますが、今の所Macがないとできない作業というのはないです。
何より会議室に移動するたびにHDMI出力用のしっぽを持ち歩かなくて良くなったのは忘れ物率が下がってありがたいです。Appleは最近開発者向けに魅力的な製品を出してくれないので、ささやかな反抗をしてみたい人はこの記事を見て参考にしてみていただければと思います。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。