サービスがいいMacBookにしておく

Snow Leopardになって、サービスメニューにAutomatorのワークフローを自由に追加出来るようになった。今まで各アプリケーションから一方的に提供されるサービス機能の中で、便利そうなのを見つけて利用するしかなかったが、これからは自分が欲しいと思う機能を創意工夫で追加できるようになったのだ。シンプルなAutomatorのワークフローを作成するだけで。*1

しかも、メニューとして表示されるのは、その状況で利用できるサービスのみに限定されるようになった。以前のように、利用できないものまで含めて、登録されているサービスがすべて表示されて、多すぎるメニューで溢れ返って選択するのが面倒臭くなる状況も改善された。

また、アプリケーション名 >> サービス 以外にも、コンテクストメニューやアクションメニュー(Finderツールバーの歯車アイコン)にも、利用可能なサービスが表示されるようになった。特にコンテクストメニューからは、かなり快適にアクセスできると思った。サービスには好みのショートカットも設定できるので、自分が追加した機能をショートカット経由でも呼び出すことも可能。

つまり、何かをしたいと思った時に、手順最小限で呼び出せる自分スペシャルなツールを手に入れることが出来るのだ。

これまで、AppleScript + Quicksilverでショートカットを割り当てて利用していたが、増えすぎたショートカットは忘れるし、重複しない、かつ覚えやすい新たなショートカットを探すのも悩みの種だった。ショートカットを諦める場合はスクリプトメニューから操作することになるが、すでに自分のスクリプトメニューはサービスメニュー以上に溢れている...。だから、ちょっと期待してAutomatorで作るサービスの使い心地を試してみたのだ。

基本的な実験

  • Automatorを起動して、ファイル >> 新規を選択、テンプレートに「サービス」を選択してみる。


  • AppleScriptを実行するワークフローを追加して、以下のようにしてみた。


  • ファイル名:test_serviceにして保存した。
  • テキストを適当に選択して、右クリックしてみる。(←このテキストを選択してみた)


  • test_serviceを実行すると、以下のように表示された。

  • つまり、選択したテキストが変数inputに渡されて、それがダイアログに表示されたのだ。(なるほど、なるほど)

クォーティング(文字列を囲む)

  • 以上の仕組みが分かれば、ほんのちょっとで便利なサービスができた。

  • 上記のようにしておくと、選択した文字がシングルクォートで囲まれる。
  • 「選択されたテキストを置き換える」にチェックを入れているので、returnしたテキストで置き換えられることになるのだ。
  • シングルクォート以外にも、囲う需要は結構ありそうなので、いろいろ作っておいた。

  • 選択可能なサービスが増えると、サービス階層にまとめられるようだ。


配送状況の照会

  • 最近はよくWEBで買い物をする。(かなりの頻度)
  • すると、本日発送しました、というメールが届き、照会ページのリンクと共に、伝票No.が記載されている。
  • 今までは伝票No.をコピーして、照会ページを開いて、伝票番号をペーストして、照会ボタンを押していた。
  • しかし、頻繁に配達があると、お決まりのこの手順も面倒になる。サービスの出番だ!
  • 例:クロネコヤマトであれば、以下のURLに伝票No.を続けると、その伝票の配達状況が照会ページが表示される。
"https://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id="
  • よって、目指すワークフローは以下のようにしてみた。


  • しかし、考えてみれば、その伝票No.を照会するURLなのだから、販売する側で伝票No.にURLを埋め込んで、リンクを作成してくれるのがベストなのである。
  • 伝票No.が照会可能なリンクになることを期待しつつ、クリップボードにリンクURLも設定するようにしてみた。(どうか、送信元でリンク生成のきっかけとなりますように)


  • その他の配送業者や、ゆうパック等も追加してMail.appの伝票No.を右クリックすると、現在、コンテクストメニューは以下のように表示される。


  • ちなみに、自分が調べた、配送業者ごとの照会リンクURL
ヤマト運輸
https://jizen.kuronekoyamato.co.jp/jizen/servlet/crjz.b.NQ0010?id=

西濃運輸カンガルー便https://track.seino.co.jp/cgi-bin/gnpquery.pgm?GNPNO1=

佐川急便
https://k2k.sagawa-exp.co.jp/p/web/okurijosearch.do?okurijoNo=

JPエクスプレスペリカン便)
https://info.jpexpress.jp/confirm/confirmList.html?denpyoNo=

ゆうパック
http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S002&locale=ja&SVID=023&reqCodeNo1=

書留
http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S002&locale=ja&SVID=023&reqCodeNo1=

翌朝10時郵便
http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S003&locale=ja&SVID=023&reqCodeNo1=

EMS
http://tracking.post.japanpost.jp/service/singleSearch.do?searchKind=S004&locale=ja&SVID=023&reqCodeNo1=
  • ところが、唯一、照会リンクでのアクセス方法が分からないのが福山通運。(ご存知の方がいらっしゃったら、教えていただきたいです。)
  • しょうがないので、もう力技。
  • フォーム入力ページを開いて、伝票No.を入力して、照会ボタンを押す。
  • 上記一連の作業を、GUIスクリプティングで実行してしまえば良いのだ。



on run {input, parameters}

(* Your script goes here *)
set the clipboard to reject(the clipboard as text, "-") --伝票番号からハイフンを取り除く

tell application "System Events"
tell process "Safari"
delay 0.5
keystroke tab
delay 0.5
keystroke tab
delay 0.5
keystroke "v" using command down
delay 0.5
keystroke return
end tell
end tell

return input
end run

--a_textからrm_strを取り除く
on reject(a_text, rm_str)
set my text item delimiters to rm_str
set a_list to a_text's text items
set my text item delimiters to ""
a_list as text
end reject

  • 何とか出来た。

画像サイズの変更

  • 画像サイズを変更するのは、一つのアクション「イメージサイズを調整」で簡単に実現可能。
  • しかし、複数のアイテムを選択した時、大き過ぎる画像のみ特定の大きさに変更するワークフローにしようとすると、ちょっとだけ手間がかかる。
  • 指定より小さいの画像に対しては何もしたくないので、AppleScriptも利用して、以下のようにやってみた。(はてな用に450px以下にするサービス)
      • イメージファイルを受け取るように指定すると、変数inputには画像ファイルのaliasリストが代入された。
      • AppleScriptのaliasは、Finderが生成するエイリアスと似たオブジェクト。(シンボルのようなもの、若干の違いはあるが)


--サイズが450px以上にフィルタ
--input = {alias, alias, ...}
on run {input, parameters}

(* Your script goes here *)

return size_filter(input, 450)
end run

on size_filter(input, limit)
set alias_list to {}
repeat with an_alias in input
tell application "Image Events"
set myImage to open file (an_alias as text)
set {w, h} to myImage's dimensions
if w > limit or h > limit then
set alias_list to alias_list & an_alias
end if
end tell
end repeat
alias_list
end size_filter

      • 上記はイメージサイズを調整する前のAppleScriptはてな日記用に450px以上の画像ファイルに制限した。


      • 以下はイメージサイズを調整した後のAppleScript。処理が終了したメッセージをGrowlで表示するようにしてみた。


--完了のメッセージを表示
on run {input, parameters}

(* Your script goes here *)
set my text item delimiters to return
message("リサイズ", "完了しました。" & return & file_name(input))
set my text item delimiters to ""

return input
end run

on message(a_title, a_msg)
try
do shell script "/usr/local/bin/growlnotify " & a_title & " -m " & quoted form of a_msg & " 2>&1"
if result is not "" then error -128
on error
activate
display alert a_title message a_msg --giving up after 4
end try
end message

on file_name(alias_list)
tell application "Finder"
set a_list to {}
repeat with an_alias in alias_list
set a_list to a_list & (an_alias's name as text)
end repeat
a_list
end tell
end file_name

利用可能なサービスだけが厳選される仕組み

  • OSXのサービスメニューとは、選択されたアイテム*2を別のアプリケーションに渡して、特定の処理を依頼するためのメニューといえる。
    • サービスメニューにないことは、選択アイテムをコピーして、目的のアプリケーションを起動して、ペーストして、処理を実行すれば、大抵のことは実現できるはず。
    • 逆に考えれば、上記一連の作業を、メニュー選択により一気に処理してしまうのがサービスメニューといえる。
  • サービス用ワークフローの最初のステップでは、受け取るべき選択項目と、そのサービスを利用可能なアプリケーションを設定している。
  • 現在の選択項目とアクティブなアプリケーションを元に、上記設定から以下のような条件判断をしているようだ。
条件判断
  • テキストか
    • テキストの種類は何か(URL・アドレス・電話番号・日付・メールアドレス)
    • テキストを置き換えるか
  • ファイルまたはフォルダか
    • ファイルの種類は何か(フォルダ・書類・イメージ・PDF・ムービー・オーディオ・テキスト)
  • そのサービスを利用できるアプリケーションは何か(検索対象)
  • 例えば、テキストを受け取るサービス用ワークフローは、テキストを選択した状態の時だけ、サービスメニューに表示される。(ファイルを選択した状態では表示されることはない。)
  • さらに、テキストを置き換えるにチェックがあれば、編集可能なテキストを選択中だけ表示される。
  • また、大別すると"テキスト"・"ファイルまたはフォルダ"・"入力なし" なのだが、
    • "電話番号"を指定した場合は、選択中のテキストが"電話番号"と認識された時だけ表示される。
    • "イメージファイル"を指定した場合は、選択中のファイルが"イメージファイル"(jpegpngtiffなど)の時だけ表示される。
  • そして、検索対象が特定のアプリケーションに指定されていれば、そのアプリケーションがアクティブな場合だけ表示される。

解決できない問題

  • 最近のMail.appは、意味のあるテキスト(電話番号とか、日付とか)をマウスオーバーすると、メニューボタンが現れて、クリックすると最適なコンテクストメニューが表示される。
  • OSXでは、この機能をData Detectorsと呼んでいるらしい。
  • このData Detectorsで、伝票No.にも反応して欲しいのだが、どうもダメっぽい。
    • 形式としては電話番号と同じなので、選択項目を受け取る形式を電話番号としてみたのだが、マウスオーバーで反応するメニューには表示されなかった。
    • 伝票No.を選択して、Data Detectorsのメニューボタンを押せば、追加したサービスメニューも表示された。
    • しかし、伝票No.を選択する手間が面倒な訳で、選択なしのマウスオーバーで反応するようにしてみたい。
  • どこかに隠し設定がないだろうか?


サービスメニューの設定

  • システム環境設定 >> キーボード >> キーボードショートカット の サービス項目でサービスの一覧が確認できた。
  • それぞれのサービスに対して、以下の設定が出来る。
    • サービスメニューとして表示する・しないの設定(チェックありでサービスメニューに表示され、ショートカットも有効になる)
    • ショートカットの設定(右側の部分をクリック または returnキーを押したあと、ショートカット操作をすると記録される)


  • ショートカット設定時の注意
    • ショートカットは重複していても登録できてしまう。
    • しかし、後でうまく反応しなくて悩むことになる。
    • うまく反応しない時は、重複を疑ってみるといいかも。
    • control-shift-;などは、アプリケーション起動直後は反応しないけど、一度でもマウスでメニュー表示させれば、その後は正常に反応するという不可解な挙動をした。謎だ。
  • よく見てみれば、わざわざ作るまでもなく、自分にとって有効なサービスが発見できるかもしれない。

ブックマークコメント御中

伝票No.を選択する手間が面倒な訳で」未選択状態→右クリで単語選択されてからメニュー出るから、マウスオーバー→矢印にポインタ移動させてクリックより楽では

  • おっしゃる通りです。テキストエディットで実験すると、上記の通り理想的な挙動になります。
  • しかし、Mail.appやSafariでやってみると、例:1234-5678-1234では、ハイフンも単語区切りになってしまい、連続した12桁の選択ができないのです...。
  • (もしかしたら、自分のMacBook環境だけの挙動?)

*1:Leopard以前もXcodeを使えば独自のサービスを追加できたらしいのだが、その方法は知らない。

*2:テキストやファイル、あるいは入力なしの場合もある。