ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

PasteboardStackerでiPhone、iPadのテキスト処理を極める

      2016/03/16

昨日公開したPasteboardStackerですが、これには知る人ぞ知る /usr/bin/pb2stdio というコマンドがバンドルされています。
このコマンドで間接的にiPhone / iPadのクリップボードと標準入出力のやりとりができます。

↑上のスクリーンショットは、エントリの後半で出てくるActivator連携に関連したもの

オプション無しで実行すると以下のようなヘルプが出ます。全然つまらなそうに見えるでしょうが、これは使いようによっては便利です。(続きはMOREから)

iPhone:~ mobile$ pb2stdio
pb2stdio version 0.1 by moyashi
Usage: pb2stdio [options...]
 -i   stdin -> pastepboard
 -l   show history list of PasteboardStacker
 -h N PasteboardStacker N th history -> stdout
 -o   latest PasteboardStacker history -> stdout
 -?   show this help
iPhone:~ mobile$

技術的背景

こんなのUIPasteboard使ったコマンド作ればイチコロっしょ、とお思いでしょうが、残念ながらコマンドラインからはUIPasteboardにアクセスできないのでした。nilが返ってきます。恐らくUIApplicationの中でしかアクセスできない何かがあるのでしょう。

pb2stdioは、PasteboardStackerとプロセス間通信をしてUIPasteboardへのアクセスを間接的に実現しています。

PasteboardStackerとpb2stdioは不可分なものというわけです。

pb2stdioオプション解説

-i 標準入力からPasteboardStackerに受け渡します。「date | pb2stdio -i」とすれば、日付がPasteboardStackerの最新の履歴にセットされます。日本語を含む入力であってもOKです。エンコーディングは自動的に判定されるので、UTF-8、Shift-JIS、EUC-JP、JISなどいずれのものでもOK(のはず……)。UTF-8であれば間違いないです
-l PasteboardStackerにある履歴をリストにして出力します。出力はUTF-8です
-h N PasteboardStackerの履歴のN番目の項目を標準出力に出力します。「pb2stdio -h 2」とすれば、2番目に古い項目が出力されます。出力はUTF-8です
-o PasteboardStackerの最新の履歴を標準出力に出力します。「pb2stdio -h 1」と等価です。出力はUTF-8です

活用方法その1: iSSH、MobileTerminalなどとの連携

特定のディレクトリのリストをPasteboardStackerに送る

$ ls | pb2stdio -i

pb2stdio→PasteboardStackerという流れの活用例。「$ cat textfile.txt | pb2stdio -i」で、テキストファイルの中身をPasteboardStackerに送ることもできます。

MobileSafariなどでコピーしたURLをwgetでダウンロード

URLをコピーした後、コマンドラインで以下のようにします。

$ wget `pb2stdio -o`

まあこれぐらいならGoodReader、iCabMobileなどで可能ですが、wgetを使えば、リンクをたどってぶっこ抜き、なんかもできます。

$wget -l3 `pb2stdio -o`

これがPasteboardStacker→pb2stdioという流れの活用例。

PasteboardStackerの履歴をテキスト加工し、PasteboardStackerに戻す

上記を組み合わせて、テキスト加工ができます。

$ pb2stdio -o | sed -e 's/(..*)/<a href="1" target="_blank">1</a>/' | pb2stdio -i

上記は、PasteboardStackerの最新の履歴を使い、sedでテキスト加工をして、PasteboardStackerに結果を送っています。

http://www.google.co.jp/

上記を、以下のように加工してPasteboardStackerの最新の項目に送っています。

<a href=”http://www.google.co.jp/” target=”_blank”>http://www.google.co.jp/</a>

いろいろな用途がありそうです。

活用方法その2: Rubyの中でpb2stdioを呼び出す

CydiaからRubyがインストールできますが、これとの組み合わせも面白いですよ。

pb2stdioから出力を受けるには以下のようにします。

output = `pb2stdio -o`

PasteboardStackerにテキストを送るには以下のようにします。これでPasteboardStackerの最新の項目に「Foo Bar Baz」が追加されます。

fh = open("| pb2stdio -i", "w")
fh.puts "Foo Bar Baz"
fh.close

Rubyでテキスト加工するスクリプトの例です。

#!/usr/bin/ruby
# 文字列はUTF-8なのでuを指定
$KCODE='u'
# pb2stdioからの出力を変数outputに格納
output = `pb2stdio -o`
# gをGに置換。破壊的メソッドなのでoutputの中身を上書き
output.gsub!(/g/, "G")
# pb2stdioに出力を渡すファイルハンドルを生成
fh = open("| pb2stdio -i", "w")
# pb2stdioに変数outputの中身を出力
fh.puts output
# ファイルハンドルを閉じる(これを忘れたらダメ)
fh.close

活用方法その3: テキスト加工アプリケーションを作る

折角便利でも、このスクリプトをどうやって実行するのか? それが面倒では意味がありません。

以下の手が使えます。シェルスクリプトをアプリケーションにしてしまうのです。

[iPod touch]スクリプトをiPod touch (iPhone)用アプリケーションにする方法

以下のシェルスクリプトアプリケーション「RubyTest」をダウンロードし、/Applications/にscpなどでコピー。しかる後に、uicacheコマンドを実行するとHome画面にアイコンが現れます。

RubyTest

uicacheコマンドは、Cydiaにある「UIKit Tools」に含まれています。mobileユーザーで実行しないと失敗しますので注意してください。

「RubyTest」を実行するとすぐバツンと落ちてしまいますが、PasteboardStackerに項目が増えているのを確認できるでしょう。処理内容は上に挙げた例そのものです。「g」を「G」に置換するので、PasteboardStackerの最新の項目が「google」だった場合は「GooGle」というものが増えているはずです。

↓昔 @mk_ さんに作ってもらったシェルスクリプトアプリケーション用のDefault.png

「RubyTest.app/core.sh」が実行されるrubyスクリプトです。実行するにはCydiaからRubyをインストールしていないといけません。

アイコンを複数作りたい場合は、この「RubyTest.app」をリネームするのみならず、「RubyTest.app/Info.plist」も修正して、ほかとかぶらないIdentifierを指定しないといけません。変更する必要がある項目は、CFBundleIdentifierと、CFBundleNameです。CFBundleNameがHome上に表示される名前です。CFBundleIdentifierを変更するのを忘れると、いくつも入れているのに一つしかHomeに出てこなくて慌てることになります。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>core.sh</string>
<key>CFBundleIdentifier</key>
<string>com.hitoriblog.rubytest</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>RubyTest</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.1</string>
</dict>
</plist>

Activatorからシェルスクリプトアプリケーションを起動する

シェルスクリプトアプリケーションを作っても、その起動が面倒では魅力半減です。
ご心配めさるな。シェルスクリプトアプリケーションもActivatorから起動が可能です。
これを活用して、iPhone / iPad / iPod touchのテキスト処理能力を増強してはいかがでしょうか?

 - iPad, iPhone, Jailbreak, ガジェット