ついに公開された「macOS Sierra」。OS XからmacOSに名称変更されてから最初のリリースであり、当コラムとしてもどう名乗るか悩みどころだが、その新機能を探ることのほうが先決だ。まずは、iOSとMac間でのコピー&ペーストが可能になるという「ユニバーサルクリップボード」を取りあげてみたい。

○ユニバーサルクリップボードの概要

ユニバーサルクリップボードは、従来のクリップボード(ペーストボード)にネットワーク対応を施した機能拡張版であり、iOS 10およびmacOS Sierraで利用できる。従来のペーストボードに共有機能が付加されているため、既存のアプリケーションやサービスをそのまま利用できることがポイントだ。

通信の基本的なしくみは、Bluetooth Low Energy(BLE)と無線LANのコンビネーションというHandOffやAirDropでもお馴染みのもので、サポートされるハードウェアもそれらに準ずると考えていい。低消費電力のBLEで通信対象を捕捉しておき、帯域が必要な通信が発生した場合は無線LANに切り替える、という方法で通信速度を稼ぐわけだ。

もちろん、iPhoneでコピーしたものをMacにペーストできるし、その逆にも対応する。上述した動作条件さえ満たしていれば、iPhoneとiPadなどiOSデバイス間でも、Mac同士でも、スタンドアローンで作業するときと変わらない感覚でコピー&ペーストできる。ただし、データが保持されるのは最後のコピー実行から2分間で、それを過ぎるとデータは破棄され、従来どおりの(スタンドアローンの)ペーストボードに戻る。

認証機構にiCloudを利用することもポイントだ。同じApple IDでサインインを済ませておけばよく、コピー&ペーストのたびにダイアログが表示されることはない。なお、通信はP2Pで行われるため、コピーした内容がiCloudにアップロードされるのでは(そのぶん通信コストと処理のオーバーヘッドが生じるのでは)、という心配は無用だ。

○Terminalで「ユニバーサルクリップボード」はこう使う

Terminalでユニバーサルクリップボードは使えるのか、という質問に対する答えはもちろん「Yes」だ。従来からある「pbcopy」や「pbpaste」といったクリップボードにアクセスするコマンドは、特になにもしなくてもユニバーサルクリップボードに対応している。つまり、iPhoneでコピーしたデータをpbpasteコマンドでMacにペーストし、pbcopyコマンドでコピーしたMacのデータをiPhoneでペーストできる、というわけだ。

これではイメージが膨らまないだろうから、いくつか実例を紹介してみよう。実際に手を動かしてみれば、こんなことができるようになったのか、と新鮮な気持ちで受けとめるに違いない。

1. iPhoneでコピーしたテキストをファイルに書き出す

Terminal上でペーストボードを扱うための基本コマンドは「pbcopy」と「pbpaste」ということになる。この2つのコマンドが扱えるデータはプレインテキストとリッチテキスト、EPSの3種であり、その範囲であればiOSかmacOSかを問わず扱える。

たとえば、『メモ』や『メール』などiOSの適当なアプリで文字列をコピーし、それをテキストファイルに書き出す場合、以下の要領でリダイレクトすればいい。

$ pbpaste > plain.txt

2. MacのスクリーンショットをiPhoneで受信

ペーストボード自体が拡張されているため、あらゆるアプリケーション/コマンドがでネットワーク対応の恩恵に預かれるところがユニバーサルクリップボードの大きな利点だ。もちろん、「-c」オプションを付けて実行するとスクリーンショットの内容をクリップボードに取り込めるscreencaptureコマンドも、実行から2分以内であればiOSのアプリにペーストできる。

$ screencapture -c

3. 他のMacにある画像ファイルを手もとのMacにコピー&ペースト

pbcopy/pbpasteコマンドはバイナリファイルを扱えないが、文字符号化という方法でその問題を回避できる。コマンドでの作業となる都合上Mac間でのやり取りに限定されてしまうが、近年ではとんとご無沙汰の「uuencode」と「uudecode」を使えば、画像でもオフィス文書でもユニバーサルクリップボード経由でやり取りできる。AirDropを使えば済む話ではあるが、ファイルのやり取りをスクリプト化したい場合は、ひとつの解になるかもしれない。

ファイルをuuencodeで符合化し、ユニバーサルクリップボードに取り込む

$ uuencode gazou.png - | pbcopy

ユニバーサルクリップボード上のテキスト(uuencodeされたもの)をuudecodeにパイプし、ファイルに書き出す

$ pbpaste | uudecode -o output.png