PasteboardStackerでiPhone、iPadのテキスト処理を極める
2016/03/16
価値ある情報をユーザー視点で発信するブログ
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は不可分なものというわけです。
-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です |
$ ls | pb2stdio -i
pb2stdio→PasteboardStackerという流れの活用例。「$ cat textfile.txt | pb2stdio -i」で、テキストファイルの中身をPasteboardStackerに送ることもできます。
URLをコピーした後、コマンドラインで以下のようにします。
$ wget `pb2stdio -o`
まあこれぐらいならGoodReader、iCabMobileなどで可能ですが、wgetを使えば、リンクをたどってぶっこ抜き、なんかもできます。
$wget -l3 `pb2stdio -o`
これがPasteboardStacker→pb2stdioという流れの活用例。
上記を組み合わせて、テキスト加工ができます。
$ 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>
いろいろな用途がありそうです。
CydiaからRubyがインストールできますが、これとの組み合わせも面白いですよ。
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
折角便利でも、このスクリプトをどうやって実行するのか? それが面倒では意味がありません。
以下の手が使えます。シェルスクリプトをアプリケーションにしてしまうのです。
[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>