プログラミング
Magic Switch: Apple Magicキーボード/トラックパッド/マウスを2台のMac間で共有する
Magic Switch: Share Apple Magic keyboard/track-pad/mouse between two Macs (joshua.hu)
要約
Magic Switchは、AppleのMagicキーボード、トラックパッド、マウスを2台のMac間で簡単に共有できる無料のオープンソースmacOSアプリです。従来、これらのデバイスは複数のMac間で切り替える際にUSBでの再ペアリングが必要でしたが、このアプリはそれを不要にし、シームレスな共有を実現します。セキュリティにも配慮されており、ペアリングコードによる安全な接続が可能です。
全文翻訳
TL;DR: Magic Switchは、AppleのMagicキーボード、トラックパッド、またはマウスを2台のMac間で共有するための無料のオープンソースmacOSアプリです。Apple IDもUSBでの再ペアリングの手間も不要です。ソースコードはGitHubで公開されています。
私は最近、約7ヶ月間台湾に住んだ後、ついにポーランドに帰国しました。そこでは、自転車に乗ったり、中国語を学んだり、人生で考えもしなかったような経験を積んだりしていました。
帰国後、もはや単なる観光客ではないことを認め、(賃貸の)アパートを少しでも素敵に見せる時が来たと決心しました。インテリアデザインは大好きですが、過去5年間住んでいる現在の場所では、全体的に低コストではあったものの、定期的に使用したり必要としたりする必需品以外に投資する気になれませんでした。バックパック一つで生活することもできます。実際に数ヶ月間そうしていました。ポーランドにはスーツケース半分の荷物で来ました。生活に必要なのは必需品だけです。私の持ち物のほとんどは価値のあるものではありません。しかし、それらにはプライスレスな感傷的な価値があります。
私の部屋が悪くなかったわけではありません。実際、Couchsurfingで私がホストした多くの人々は、私がアパートのデザイン、配置、そして選んだものを気に入ってくれたとコメントしてくれました。それらはほとんど必需品でした。
そこでポーランドに戻り、アパート全体の改築を行っています。台湾は私に大きなインスピレーションを与えてくれました。毎週か二週間に一度移動しており、滞在した場所、探索した場所、ギャラリー、スタジオ、美術館などがすべて影響を与えました。私は本質的にミニマリストですが、人生の楽しみと利便性がついに私を打ち負かしました。もしかしたら、ただ年を取っただけかもしれません。もしすぐにここから追い出されたら、私は打ちのめされるでしょう。なぜなら、色が合い、素材が適しており、入手困難なデザインやアイテムを選ぶという私の努力が、次に住む場所には合わない可能性が高いからです。キッチンの壁のタイルが異なったり、家具の色合いが異なったり、カーテンの色が異なったりするかもしれません。迷惑な話です。
私は人生で初めて本物のデスクを買うことにしました。普段はベッドの上か、どこか横になって作業しています。デスクに座るのは、一般的に私にとって苦痛な経験であり、それは永遠に続いています。座っていること自体が非常に苦痛です。約5分後、私の背中は、私が経験したことのないような激しい痛みで痙攣し始めます。
私はおそらくエーラス・ダンロス症候群を患っており、それは(私の極端な柔軟性など)他の症状とともに、医師、外科医、理学療法士、あるいは「助けを申し出る友人」でさえも助けられなかった背中の痛みの問題につながっている可能性があります。その痛みがどのようなものか経験したのは、ジョージ・オーウェルの『1984年』の中だけです。[..]彼の体は歪められ、関節はゆっくりと引き裂かれていた[..]
そこで、スタンディングデスクを手に入れました!はい、今日のブログは物語と技術的な詳細が混在しています。お付き合いください、私たち皆、それぞれの悪魔を抱えています。
なぜMac間でMagicキーボードを共有できないのか
他にも、モニターも購入しました。ということは、キーボードも必要だということです。私は無料のオプションを選びました。Apple Magic KeyboardとMagic Trackpadです。これらはどちらもBluetoothデバイスで、初期ペアリングにはUSB-Cが必要です。
Appleは、その「とにかく動く」という賢さで、これらの周辺機器を一度に複数のデバイスに接続できないようにしました。複数のデバイスに同時に接続でき、使用したいデバイスからいつでも簡単に接続できるAppleのAirPodsとは異なり、Magic KeyboardとMagic Trackpadは複数のデバイスに同時にペアリングすることを拒否し、複数のコンピュータで使用するのは非常に苦痛です。
実際、それよりも悪いです。使用中のデバイスから周辺機器を切断して、別のデバイスに接続するだけではダメなのです。USBで別のデバイスに接続して、完全な再ペアリングを行う必要があります。基本的に、周辺機器は非常に粘着性があります。単一の周辺機器にペアリングされた2つのデバイスを持つことはできますが、その周辺機器を2番目のデバイスに接続するのは至難の業です。最初のデバイスをシャットダウンしたり、Bluetoothを切断したりしても、それは機能しません。
これはよく知られた問題です。
実際には、周辺機器をデバイス間で共有する実際の方法がありますが、そのためには両方のデバイスで同じAppleアカウントにサインインする必要があります。設定 -> ディスプレイ -> 詳細設定 -> MacまたはiPadにリンク、と進むと機能する場合があります。これは私のユースケースには合いません。なぜなら、私はAppleアカウントにログインしたくない(そして場合によってはできない)からです。
Apple Storeで販売されている有料製品があり、これに役立つと主張しています。
私はblue-switchというオープンソースソフトウェアを見つけました。これは非常にシンプルなメニューバーUIを作成し、周辺機器を一方のシステムから切断し、もう一方に接続するために使用できました。基本的に、その仕組みは次のとおりでした。
mDNSを使用して、2つのデバイスが互いに接続をネゴシエートします。両方のデバイスは、さまざまなコマンドを送受信できます。たとえば、相手のデバイスに「周辺機器AA:BB:CC..から切断」のようなものを送信します。その後、デバイスは周辺機器への接続を強制します。基本的に、これはMagicデバイスの設計を回避するハックであり、USBケーブルを使用して再ペアリングする代わりに、クリックで再ペアリングダンスを強制するだけです。
blue-switchの問題点は、非常にシンプルな概念実証であり、LAN上のすべてを信頼し、UXは基本的に存在せず、エラーを処理する能力さえありませんでした。
Claudeが教えてくれたように、元のアプリは次のようなものでした。
mDNS/Bonjourによる検出 — アプリを実行している2台のMacがローカルネットワーク上で互いを見つけ、ルーティング情報(ホスト+ポート)を交換します。
プレーンテキストTCP制御チャネル — 検出後、どちらかのMacがもう一方にNWConnectionを開き、短い文字列コマンドを送信します: CONNECT_ALL, UNREGISTER_ALL, NOTIFICATION, SYNC_PERIPHERALS, HEALTH_CHECK、およびOP_SUCCESS / OP_FAILED ack。
コアBluetoothトリック — CONNECT_ALLを受信すると、MacはIOBluetoothを使用してMagic周辺機器を自身に強制ペアリング/接続します。UNREGISTER_ALLを受信すると、それらをドロップします。
基本的なメニューバーUI — 登録された周辺機器と相手のMacのリストを持つステータスアイテム、およびいくつかのタブを持つ設定ウィンドウ。
Claudeがいなければ、これがどのように機能したかを知る方法はありませんでした(コードを読んでmacOS Bluetoothのグルーを理解できると期待する以外)。人々はこれらのLLMコーディングエージェントを奴隷のように扱いますが、明らかに私はLLMの奴隷です。
とにかく、blue-switchはそれだけでした。認証、暗号化、相手のMacが実際にはどのデバイスなのかという認識、そして失敗時の回復(時々完全に避けられないように見える)はありませんでした。
マスターに忠実であるため、Claudeと私は、これらのデバイスを「見失う」ことのない、適切なUI/UXとアルゴリズムを備えた、より安全で回復力のあるアプリケーションを共同でコーディングしました。
Magic Switch: 無料の代替手段
私はそれをMagic Switchと名付けました。ソースコードはGitHubで入手可能であり、GitHubランナーでビルドされた不変のビルドもあります。
セキュリティ
セキュリティについては、私は次のようなものを選びました。
2台のMac間で帯域外で共有される12文字のペアリングコードでキー付けされた、相互認証された密封チャネル。ペアリングコードを使用して、PBKDF2-HMAC-SHA256(600kイテレーション)でPSKを設定し、macOSキーチェーンに保存しました。
遊び心で、接続ごとのハンドシェイクもあります。各側が32バイトのノンスを送信し、両方のデバイスがHKDFで方向固有のセッションキーを派生させます。
さらに面白くするために、トランスクリプトに対するHMAC(およびサーバー対サーバー攻撃を回避するためにパケットを反射するのを防ぐためのクライアント/サーバーロールタグ付き)でキーの所有権を証明します。Claudeは、私が最初に考案した関数が定数時間安全ではなかったことを親切に教えてくれました(それが重要であるかのように、笑)。
デバイス間のメッセージは、単調なカウンターノンスを持つChaCha20-Poly1305密封ボックスとしてフレーム化されているため、リプレイ攻撃は発生しません。12文字のペアリングコードを使用しているため、レート制限も5回まで行っています。