クリップボード監視
と外部コマンド実行
  尾形 鉄次 (OGATA Tetsuji)
     Twitter: @xtetsuji
  2013/3/23 Chiba.pm#2 LT
自己紹介


• 尾形 鉄次 (OGATA Tetsuji)
• Twitter: @xtetsuji
• Blog: http://post.tetsuji.jp/
クリップボード監視

• 今回はMacの話
• Macでの正式名称は「ペーストボード」
• クリップボードに変更があったら何か
 フックを仕掛けることができるか
新ジャンルコピペ

• 所定形式の文字列がコピーされたら、
 自動的にどこかにペースト、もしくは
 事前定義済みのコールバックを実行

• いわゆるクリップボード監視
pbcopy / pbpaste

• Mac OS X 標準コマンド pbcopy / pbpaste
 • pbcopy: 標準入力をペーストボードへ
 • pbpaste: ペーストボードを標準出力へ
• 詳しくは man 1 pbcopy、man 1 pbpaste
外部コマンド呼び出しは
       コストがかかる
• 個人用途ではそれほど気にならないか
 もしれないけど外部コマンド呼び出し
 はコストがかかる

• Perl では system()、piped open、そして
 ``, qx// (backtick) など
外部コマンド呼び出しは
     コストがかかる
• ありがちな考え
 • 「load averageを監視して負荷が大き
  いときは処理を控えよう」

 • my $uptime = `uptime`; ...
 • uptime外部コマンド自体の呼び出しの
  コストが無視できない
`uptime`の代わり

• CPANで「load average」で検索すると、
 UNIX / Linux / *BSD それぞれで uptime
 外部コマンドを使わずに load average を
 取得できるモジュールが出てくるので
 それを使おう
話を戻しまして…
Mac::Pasteboard
• use Mac::Pasteboard;
• pbpaste() と pbcopy() 関数をインポート
• XS実装で外部コマンド呼び出しは無い
• ただUTF-8マルチバイト文字列が化ける
 (要望どこに出せばいいんだろう)
使い分け

• とりあえずMac::Pasteboardのpbpaste()で
 以前のクリップボード内容を監視し、
 違いがあれば`pbpaste`で取り出す

• 多数の呼び出しが発生する監視処理に
 だけMac::Pasteboardを使えばOKだろう
ループ
• while (1) { ... }
• pboverve.pl &
• 用途に応じて AnyEvent->timer(...) を使っ
 ても良いかも(個人的にwhileループは、
 うっかりバグが多くて結構気を使う)

• デーモン化が好きな人はApp::Daemon
今回の事例

• STOT形式: Twitterの発言形式:
 •   xtetsuji: 今日はこれから飲む。久々の飲み会?かも。
     [http://twitter.com/xtetsuji/status/
     314300949604749312]


• こういう形式の文字列を捕捉したら、
 自分のIRCチャンネルにメモする
処理の流れ

• Mac Twitterクライアント「夜フクロウ」
• ツイートをSTOT形式でコピー
• Perlで作った常駐プログラムがフック
• IRCに書き込み(Ikachan的手法)
他への応用

• STOT形式以外でも使えるかも
• URL文字列をコピーしたら、SQLiteとか
 で作った自分専用閲覧履歴辞書に格納
 とか
Mac以外では
• Windowsではクリップボード内容をget/
 setするコマンドはなさそう

 • Win32::Clipboard
• 原始的なX.org環境ではxsel/xclipとか?
 • きっとモジュールもあるはず
コピペ繰り返す音

• 職場で響くリズミカルな音
• Windowsでコピー→ペーストを何回も
• こういう人を同じ手法で救えないかな
• それ以前にVBAとか?
ご清聴
ありがとうございました

クリップボード監視と外部コマンド実行 #chibapm