# MacでMole for Windowsを作った方法

Mole for Macを公開してから、Windows版はいつ出るのかと何度も聞かれてきました。そのたびに、Mac版がしっかりしてからになると答えていましたが、10月14日にようやくWindows版を公開できました。公開前には限られた人たちと20以上のバージョンを重ね、Moleを早くから応援してくれているユーザーにも数日かけて試してもらい、たくさんの提案をもらいました。本当にありがとうございます。今回の開発はなかなか面白かったので、MacでどうやってWindowsアプリを作ったのかを書き残しておきます。

<figure class="blog-diagram">
  <img src="/img/windows/clean.webp" width="2584" height="1741" loading="lazy" alt="Mole for Windowsのクリーン画面。上部に5つの画面のナビゲーション、中央に地球">
</figure>

## ほぼゼロからのスタート

使い心地と性能を優先して、今回はWindowsネイティブのC#とWinUI 3で書き、Electronは使っていません。WindowsとmacOSではシステムの仕組みも掃除する対象もまったく違うので、デザインと文言を除けば、Mac版の10万行を超えるSwiftはほとんど再利用できませんでした。行きつ戻りつしながら1か月ほどかかり、コードは約7.8万行、テストは4,000件を超えました。

## Macが1台、仮想マシンが1台、ThinkPadが1台

慣れたMacに比べて、開発もデバッグもずっと大変でした。WinUIの画面はMacではビルドできません。そこで、コードを書く作業とAIのコンテキストはすべて1台のMacにまとめ、MacのParallels DesktopでWindowsの仮想マシンを動かしてデバッグと確認をし、さらにThinkPad X1を1台24時間つけっぱなしにして、仮想マシンでは見えない実機での動きを確かめています。これが今の作業机で、中央がMac、左がThinkPad X1、どの画面にもMoleが開いています。

<figure class="blog-diagram">
  <img src="/img/windows/workspace.webp" width="1600" height="1200" loading="lazy" alt="作者の作業机。中央にMacと外部ディスプレイ、左にThinkPad X1があり、どの画面にもMoleが開いている">
</figure>

## うまくいったやり方

MacでWindowsソフトを開発したこの1か月で、役に立ったやり方をいくつか紹介します。同じことをしたい人の参考になればうれしいです。

- コードを層に分ける。クリーンやアンインストールといった中心のロジックと画面の状態は、Windowsに依存しない.NETプロジェクトに置き、システムAPIを呼ぶ層では `EnableWindowsTargeting` を有効にして、Macでもビルドできるようにしました。4,000件以上のテストの大半はMacで動き、WindowsでビルドしなければならないのはWinUIの画面の層だけです。
- リポジトリをParallelsの共有フォルダーとして仮想マシンにマウントする。Macでコードを直したら、そのまま仮想マシンでビルドして実行でき、ファイルをコピーし合う必要がありません。ただし両側のビルド出力は別のフォルダーに分けること。分けないと `obj` に記録される絶対パスが互いに上書きし合います。
- 仮想マシンはスクリプトで操作する。`prlctl exec` で中のコマンドを実行し、ボタンのクリックやウィンドウのキャプチャはUI Automationのアクセシビリティ名で行います。座標に頼らないので、AIが正しいコントロールを押せて、画面が少し変わってもずれません。
- ThinkPadにはUU Remoteとsshでつなぐ。実機のx64、高DPIのスケーリング、バッテリー、SmartScreen、Defenderはこちらで確かめ、毎回のリリース前にもここでインストールしてひと通り操作します。
- コマンドラインで届かないところは、Claudeからlcu経由でCodexのcomputer useを呼びます。正直、Codexのcomputer useはとても優秀ですが、UACの確認だけは押せないので、そこは自分の出番です。

ふだんはKakuのタブ7〜10個でAgentが同時に作業しています。

## Windowsの開発者証明書は面倒

Windowsでは署名のないインストーラーを開いた瞬間に「WindowsによってPCが保護されました」で止められ、Windows 11のスマート アプリ コントロールではそもそも実行できないので、公開する前にコード署名証明書を買う必要がありました。調べてみると、EV証明書は今ではSmartScreenで有利にならず、署名した新しいプログラムでも、インストールする人が増えるまでは認識されないアプリと表示されます。Microsoft自身のAzure Artifact Signingは月10ドル未満でいちばん手軽でしたが、個人はアメリカとカナダでしか使えず、Certumの安いオープンソース向け証明書は商用利用できません。

最終的に買ったのはCertumのクラウドOV証明書で、年に100〜200ドルほどです。鍵はCertumのクラウドHSMにあり、署名するときはスマートフォンのSimplySignでワンタイムコードを出します。証明書の名前は審査済みの正式名称で、SmartScreenの評価もこの名前に積み上がっていきます。使ってみると、SimplySignのセッションが数時間放置しただけで切れ、パッケージ作成の途中で署名に失敗したことが何度かあったので、今はビルドの前に毎回ファイルを1つ試しに署名しています。

## いちばん時間がかかったのはアプリのテスト

クリーナーがいちばんやってはいけないのは、消してはいけないものを消すことです。Windowsではアプリごとにインストーラーとアンインストーラーの癖が違うので、1つずつ入れて試すしかありません。国内外のエンジニアがよく使うアプリでリストを作り、エディター、IDE、ブラウザー、チャット、クラウドストレージ、データベース、AIツールまで、1つずつインストールして開いて使い、Moleのアンインストール、アップデート、残りファイルの整理、スタートアップ一覧がそのアプリを正しく認識するかを確かめました。これまでに372本をテストし、そのうち72本で問題が見つかり、どれもその回のうちに直してテストを足し、もう一度確かめています。自分の環境が原因の問題もありました。VS Codeを初めてテストしたとき、ParallelsがMac版VS Code用に作った同じ名前のショートカットまでVS Codeの残りファイルとして扱ってしまい、危うく消すところでした。

<figure class="blog-diagram">
  <img src="/img/windows/uninstall.webp" width="2584" height="1741" loading="lazy" alt="Mole for Windowsのアプリ画面。インストール済みのアプリとそれぞれのサイズが並ぶ">
</figure>

機能はMac版とほぼ同じで、クリーン、アプリ(アンインストールとアップデート)、最適化、分析、ステータスの5つの画面に、トレイパネル、画面オン維持、画面を拭くが加わります。Windows 10 22H2とWindows 11に対応し、x64とARM64の両方にネイティブのインストーラーがあります。

## コマンドライン版もあります

デスクトップ版のほかに、MoleのWindows向けコマンドライン版は今年のはじめから作っています。最初の要望はインドの開発者からで、そのままPRも送ってくれました。ありがとうございます。9か月半で9つのバージョンを出し、この1か月はとくに集中して手を入れてきたので、使い方も使い心地もMacのコマンドライン版とほぼそろいました。無料のオープンソースなので、コマンドラインが好きな人は [GitHub](https://github.com/tw93/Mole/tree/windows) からそのまま使えます。デスクトップ版との違いは[こちらの記事](/ja/windows/blog/mole-cli-vs-windows-app)にまとめています。

<figure class="blog-diagram">
  <img src="/img/windows/cli-menu.webp" width="1814" height="741" loading="lazy" alt="PowerShellで表示したMole CLI for Windowsのメインメニュー。クリーン、アンインストール、最適化、分析、ステータスが並ぶ">
</figure>

デスクトップ版のダウンロードと価格は [mole.fit/windows](/windows) にあります。どの機能も購入前に2回まで無料で使えるので、Windowsのパソコンをお持ちならぜひ試してみてください。


Canonical: https://mole.fit/ja/windows/blog/building-mole-for-windows-on-a-mac
