MacでMole for Windowsを作った方法
Mole for Macを公開してから、Windows版はいつ出るのかと何度も聞かれてきました。そのたびに、Mac版がしっかりしてからになると答えていましたが、10月14日にようやくWindows版を公開できました。公開前には限られた人たちと20以上のバージョンを重ね、Moleを早くから応援してくれているユーザーにも数日かけて試してもらい、たくさんの提案をもらいました。本当にありがとうございます。今回の開発はなかなか面白かったので、MacでどうやってWindowsアプリを作ったのかを書き残しておきます。
ほぼゼロからのスタート
使い心地と性能を優先して、今回は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が開いています。
うまくいったやり方
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の残りファイルとして扱ってしまい、危うく消すところでした。
機能はMac版とほぼ同じで、クリーン、アプリ(アンインストールとアップデート)、最適化、分析、ステータスの5つの画面に、トレイパネル、画面オン維持、画面を拭くが加わります。Windows 10 22H2とWindows 11に対応し、x64とARM64の両方にネイティブのインストーラーがあります。
コマンドライン版もあります
デスクトップ版のほかに、MoleのWindows向けコマンドライン版は今年のはじめから作っています。最初の要望はインドの開発者からで、そのままPRも送ってくれました。ありがとうございます。9か月半で9つのバージョンを出し、この1か月はとくに集中して手を入れてきたので、使い方も使い心地もMacのコマンドライン版とほぼそろいました。無料のオープンソースなので、コマンドラインが好きな人は GitHub からそのまま使えます。デスクトップ版との違いはこちらの記事にまとめています。
デスクトップ版のダウンロードと価格は mole.fit/windows にあります。どの機能も購入前に2回まで無料で使えるので、Windowsのパソコンをお持ちならぜひ試してみてください。