2009年5月21日木曜日

シェルスクリプトを「.app」形式にする方法 - 「SayKanji.app」を作ってみる。

先日、SayKanaを取り上げたのですが、翌日にはザリガニが見ていた...。さんが漢字対応してくれました。仕事早いな〜と思っていたら、あっという間にバイリンガルになっています。例えば、文中にある「Apple」を「あっぷる」と読んでくれます。凄い!

という訳で、私の環境にも「SayKanji」を導入させて頂きました、ありがとうございます!


さて、今回はこのシェルスクリプトを使わせて頂いて、Macの「.app」形式のアプリケーションを作ってみようと思います。ちなみに、参考にさせて頂いた情報源はコチラです。

ここで、私が想定しているアプリケーションとは...
  • Dockに表示される
  • クリップボードが更新された場合、クリップボードの文字列を読み上げる
こんな感じで、メチャクチャ適当なシンプルなアプリケーションです。それでは早速作ってみたいと思います。
  1. シェルスクリプト(saykanji.sh)を作成する
    これは、ザリガニが見ていた...。さんのページを参考にして、「saykanji.sh」を作成します。
    シェルスクリプトの置き場所は必要に応じて変更する事ができますが、ここでは「/usr/local/bin」以下に置いたと仮定しています。また、適宜「.bash_profile」なども書き換えて、ターミナル上で「saykanji」コマンドがちゃんと動作する事を確認しておくと良いと思います。


  2. シェルスクリプト(saykanji.sh)を呼び出すAppleScriptを作成する
    スクリプトエディタ.appを開いて、例えば、次のようなコードを書きます。
    ※注意!↓のスクリプトは、ド素人が見よう見まねで書いたヒドイ代物ですですので、ご利用は計画的に!(利用する場合は、末尾もFAQもご覧下さい)
    (追記:5/21)コードを修正(動かなかったバージョンのスクリプトをアップしていましたw)
    (追記:5/23)Gururiさんに添削して頂きました。次のスクリプトの代わりに、コメント欄にあるGururiさんのスクリプトを利用して下さい!
    set pbstring to ""
    set prev_pbstring to ""
    repeat
    tell application "System Events"
    delay 1.0
    set pbstring to (clipboard info for string)
    if pbstring is not {} then
    set pbstring to (the clipboard as string)
    if pbstring is not prev_pbstring then
    do shell script ". /usr/local/bin/saykanji.sh;saykanji " & "'" & pbstring & "'"
    set prev_pbstring to pbstring
    end if
    end if
    end tell
    end repeat
    このスクリプトを保存する時がポイントになります。通常は「フォーマット」の項目に「スクリプト」が選択されていますが、ここで「アプリケーション」(または、「アプリケーションバンドル」)を選択して下さい。
    (追記:5/23)Gururiさんのスクリプトを利用する場合、「実行後、自動的に終了しない」にもチェックを付けると、正常にアプリケーションが終了するようになります。


    ↑スクリプトエディタの保存画面


  3. アイコン(icnsファイル)を作成する
    Dockに表示させるからには、アイコンも設定しておきたいですよね。その場合は、icnsファイルが必要になります。png形式などの画像からicnsファイルを作成するには、「Img2icns」というアプリケーションを利用するのがオススメです。(デスクトップ用のアイコンならFree版でも作成可能です)


    ↑Img2icnsの画面
    アイコンで使用する画像をドロップして、1ボタンでicnsファイルが生成されます。


  4. SayKanji.appにアイコンを設定する
    Finder上で、2.で作成した「SayKanji.app」を右クリック→「情報を見る」を選択します。(Command+IキーでもOK)表示された情報画面の左上の表示されている標準アイコンの場所に、3.で作成したicnsファイルをドロップします。


    ↑SayKanji.appの情報画面
    ここでアイコンを変更する事ができる。


  5. SayKanji.appを起動する
    起動すると、こんな感じでDock上に表示されます。文字列をコピー(Command+Cキー)すると読み上げてくるアプリケーションが出来上がりました。




以上です。実は意外と簡単にシェルスクリプトからMac用のアプリケーションを作成する事ができます。覚えておくと、何かの役に立つかもしれません!


(FAQ)
2.で紹介したAppleScriptには、いくつか問題があります。
  • 終了しない!
    → アクティビティモニタなどから「強制終了」して下さい。
  • 落ちる!
    → 「<」、「>」等、苦手な文字があるようです。
他にも毎秒クリップボードを監視しているのでリソースを食うとか...。正直公開レベルでは無いのですが、書かないと話が進まなかったので、ごめんななさい。という訳で、素敵なアプリケーションに書き換えてくれる方を募集しています!

2 件のコメント:

Gururi さんのコメント...

> という訳で、素敵なアプリケーションに書き換えてくれる方を募集しています!

という訳で、AppleScriptの添削に来ました:-)

以下のスクリプトを「実行後、自動的に終了しない」にチェックを入れて保存すれば、ちゃんと終了できるアプリケーションになります。ついでにクリップボードの中身をコマンドに渡す時にquoted form of を使えば、直接渡せない文字列をエスケープしてくれますので付け加えておきました。これはサービス。on idleの最後のreturnに渡す数字を変更すると、idleハンドラを実行する間隔が変わります。
ちなみにSayKanjiをまだ導入してないのでSayKanaでしか試してませんが、たぶん動くはずです:-)

--ここから
property prev_pbstring : ""
--こいつは繰り返し使うのでpropertyにしてあります

on run
set prev_pbstring to ""
--property prev_pbstringの初期化をします。起動した時に実行。
end run

on idle
--自動的に終了しないときに実行されます。
local pbstring
--こいつはこのハンドラの中でしか使わないのでローカル変数にしてあります。
tell application "System Events"
if ((clipboard info for string) is not {}) then
set pbstring to (the clipboard as string)
if pbstring is not prev_pbstring then
try
--エラーが起きた時にはon errorとend tryの間に書かれたスクリプトが実行されます。
do shell script ". /usr/local/bin/saykanji.sh;saykanji " & (quoted form of pbstring)
set prev_pbstring to pbstring
on error errMsg number errNum
--エラー時のメッセージがerrMsgに、エラー番号がerrNumに入ってます。
--エラーが発生した時にしたい処理をここに書くと良いです。
end try
end if
end if
end tell
return 1
--最後のreturnで返す数字で、何秒後にon idle〜end idleを実行するか決まります。
end idle
--ここまで

erpalacion さんのコメント...

Gururiさん、添削ありがとうございます!

コチラの環境で、saykanji.shでも動作する事を確認しました。お陰様で、私がイマイチだな〜と思っていた箇所が全て解消されました。

また、コメントでの解説が親切で、とても勉強になりました。本当にありがとうございました!