Upload
tetsuji-ogata
View
815
Download
0
Embed Size (px)
DESCRIPTION
2013/3/23 に開催された Chiba.pm#2 でトークしたLTのスライドです。
Citation preview
クリップボード監視と外部コマンド実行
尾形 鉄次 (OGATA Tetsuji)
Twitter: @xtetsuji2013/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とか?
ご清聴ありがとうございました