bgpict2.png 
わかばマークのMacの備忘録
初心者による Mac OSX の便利な使い方や、ソフトウェアの紹介など、Macのこといろいろ。

2009 / 11

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 

http://wakabamac.blog95.fc2.com/blog-entry-990.html

Task3 / タスクの設定例(1)
icn_Task3.jpg
Task3 : あらゆるタスクを自動化する
Growl対応
OS10.4.11以上(UB)
シェアウェア ¥1,500(銀行振込)、¥1,700(PayPal)


Task3』のつづき


Task3 はアイデア次第でいろいろ使えます。
しかし、様々なことに使えるだけに最初は取っ付きにくいかもしれません。

なので、僕の場合の設定例を挙げていきたいと思います。
Task3 / タスクの設定例(1)
(各項目へジャンプします)




t3_safari_download

Safariのダウンロード完了をGrowlでお知らせする


新規タスクを作成して、下のように設定します。

(トリガー)
090916tsk16.gif
リストで「ファイルのダウンロード」を選択
下の「ファイル名 : 」を空白にしていると、Safariですべてのファイルをダウンロードしたときに実行するタスクとなります。


(アクション)
090916tsk17.gif
リストで「メッセージを表示」を選択して、その下に任意のメッセージを入力。


環境設定ウインドウを開いて( cmmand+, )、「Growlを使ってメッセージを表示」にチェックを入れます。
090916tsk18.gif

これで cmmand+S で保存し、Safariで何かしらのファイルをダウンロードしたときに、Growl でお知らせするようになります。
090916tsk19.jpg
Growl のタイトルは「そのタスクの名前+(Task3)」となります。



ついで、もうひとつアクションを追加して、ダウンロードフォルダを開くようにしておくと便利です。
090916tsk20.gif


SafariStand を使用していて、ダウンロードしたものを「2009-09-26」といった日付の名前のフォルダに保存するように設定している場合は、アクションで下の AppleScript を実行させるようにすると、そのフォルダを Finder で開くようにできます。
set downloadFolder to "ダウンロードフォルダに指定しているフォルダのHFS形式のパス"
-- 上の行の "" 内にHFS形式のパスを入力↑
-- (例)Macintosh HD:Users:登録アカウント名:Downloads:
-- パスの最後には「:」コロンを入れて下さい

set theToday to do shell script "date '+%Y-%m-%d'"
set targetFolder to downloadFolder & theToday
tell application "Finder" to open alias targetFolder
(お好みで Finder に対して「activate」コマンドを入れて、Finderが最前面になるようにしてもいいと思う)

これで、Safari でファイルをダウンロードしたときに、Growl でお知らせ+そのフォルダを開くようになります。
090916tsk21.gif






t3_some_app_launch

複数のアプリケーションをセットで起動するようにする


例えば、iTunes と 再生中の曲とアートワークを表示するアプリ「TuNe」をセットで起動するようにしてみます。

新規タスクを作成し、次のように設定します。

(トリガー)
090916tsk22.gif
アプリケーションを監視」を選択、iTunes が起動したときのトリガーに設定する。


(アクション)
090916tsk23.gif
ファイル/アプリケーションを開く」を選択、Tune.app を指定する。


これで保存すると、iTunes を起動すると、セットで Tune が起動するようになります。


同じ要領で新規タスクを作成し、iTunes が終了させたときに Tune を終了させるようにしておくといいです。






t3_release_memory

定期的に使っていないメモリを解放する


定期的にメモリの使用状況を監視して、使ってない(Inactive)なメモリを解放するタスクを設定してみます。
どこかで聞いたような・・・)


(トリガー)
繰り返し」を選択します。
時間間隔はお好みで。僕の場合は15分ごとに設定しています。


(アクション)
まず下の AppleScript を「アプリケーション形式」で保存します
(Task3 上で実行する AppleScript では、「display dialog」「display alert」などが実行できないため)
property rt : return as text

on run
tell me to activate
set alertResult to display alert " メモリ使用状況 " & rt & "メモリの「空き」領域が少なくなっています" & rt & "使っていないメモリを解放するスクリプトを実行しますか?" message my memStatus() buttons {"Cancel", "Run"} default button 2 --giving up after 120
if alertResult is {button returned:"Run"} then
do shell script "du -s / &> /dev/null & sleep 10 && kill $!"
delay 2
tell application "GrowlHelperApp" to notify with name "Task3MessageWorkNotification" title (("メモリの解放 -> 完了" & rt & "現在のメモリ状況") as Unicode text) description (my memStatus() as Unicode text) application name "task3runner" icon of application "task3runner" sticky "yes"
end if
end run


on memStatus()
set memoryStatus to do shell script "top -l 1 | head -10 | grep PhysMem"

set wiredMem to word 2 of memoryStatus
set activeMem to word 4 of memoryStatus
set inactiveMem to word 6 of memoryStatus
set usedMem to word 8 of memoryStatus
set freeMem to word 10 of memoryStatus

set swapusage to do shell script "sysctl vm.swapusage"
set theSwap to "Swap : " & word 7 of swapusage & " (" & word 4 of swapusage & ")"

set grepLine to do shell script "top -l 1 | head -10 | grep VM"
set pageins to (((round (word 7 of grepLine as number) / 4096 * 100) / 100 * 16) as text) & "M"
set pageouts to (((round (word 10 of grepLine as number) / 4096 * 100) / 100 * 16) as text) & "M"

return "空き  : " & freeMem & rt & "固定  : " & wiredMem & rt & "使用  : " & activeMem & rt & "非使用 : " & inactiveMem & rt & "確保中 : " & usedMem & rt & rt & theSwap & rt & "Page Ins : " & pageins & rt & "Page Outs : " & pageouts & rt
end memStatus
これを「メモリ解放.app」とか、適当な名前を付けて、アプリケーション形式で任意の場所に保存します。

そして Task3 のアクションの設定で、このアプリケーションを開くように設定します。
090916tsk24.gif


(実行条件)
下の AppleScript で実行条件を判別するようにします。
090916tsk25.gif
set limitMem to 1000 -- 空きメモリがこの数値以下になったらスクリプトを実行
-- 使用環境に合わせて上の数値を変更して下さい。
-- 単位はMB。とりあえず1000MB に設定。

set freeMem to (do shell script "echo " & word 10 of (do shell script "top -l 1 | head -10 |grep PhysMem") & " | sed -e 's/M//g'") as number
return freeMemlimitMem
「実行条件」で AppleScript を選択した場合、それが返す値を参考に「アクション」を実行するかどうか、判断します。
値は真偽値(true or false)か、数値で判断します。数値の場合は 0 だとアクションを実行しない、0 以外だと実行します。

上のスクリプトの場合は、「空き」メモリが1000MB以下だと、true を返してアクションを実行するようになります。




これでタスク保存して運用すると、15分ごとにメモリの状況を監視して、メモリの「空き」領域が1000MB以下になったら、「メモリ解放.app」を実行するようになります。

「メモリ解放.app」が起動すると、ダイアログでスクリプトを実行するかどうかの確認をします。
090916tsk47.gif
(適当なアイコンを付けると、ダイアログでもアイコンが表示される)

これで「Run」をクリックすると、

du -s / &> /dev/null & sleep 10 && kill $!

のコマンドを実行して、使用していない(Inactive)メモリを解放します。
(このコマンドは『ものかも』さんを参考、というよりそのまんま)

約12秒後に Growl で完了を知らせて、現在のメモリの状況を表示します。
090916tsk48.jpg
(「非使用」が減って「空き」が少し増えてます)


メモリの状況を確認するコマンドは『うむらうす』のハルさんのをパクリ、教えてもらいました。
スワップの状況を確認するコマンドは『K-muraの物置』さんの「メモリ情報.scpt」を参考にしました。

ハルさん作の「Freemem Monitor」とか、ものかもさんの「Libera Memory Resident」を使えばいいんだけど、自分好みに動作させたくて作ってしまいました。

また、この「メモリ解放.app」では「du」コマンドを使っているけど、ハルさんのように Locate database の更新 を使うならば

/usr/libexec/locate.updatedb 2 < /dev/null || exit 0

該当箇所をこれにするとOK。


ここで使用した「メモリ解放.app」が欲しい人は、アップロードしたから適当にここからダウンロードして下さい(上のソースと同じだから意味はないけど)。






t3_visualizer

スクリーンセーバの代わりにiTunesのビジュアライザを使用


iTunes を起動して再生している最中は、スクリーンセーバの代わりに iTunes のビジュアライザを使うようにしてみます。
090916tsk57.jpg


(トリガー)
090916tsk26.gif

アプリケーションを監視」をリストから選択して、「ScreenSaverEngine」が最前面に移動したときに設定します(「起動」したときに設定してはダメ)。

「ScreenSaverEngine」は

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app

の場所にあります。名前を手入力してもOK。


(アクション)
090916tsk27.gif

以下の AppleScript を実行するようにします。
property idleTime : 10 -- スリープするまでの時間(分)「0」にするとスリープしない

on run
tell application "System Events"
set processList to name of every application process
end tell

if processList contains "iTunes" then
tell application "iTunes"
if player state is playing then
try
tell application id "com.apple.ScreenSaver.Engine" to quit
end try
activate
--set minimized of window 1 to false
set full screen to true
set visuals enabled to true
my sleepRun()
end if
end tell
end if
end run


on sleepRun()
if idleTime is 0 then return

repeat with i from 1 to idleTime
delay 60
tell application "System Events" to set currentApp to (name of the first process whose frontmost is true)
if currentApp is not "iTunes" then
return
else
tell application "iTunes"
if visuals enabled is false then return
end tell
end if
end repeat

--tell application "iTunes" to set full screen to false
tell application "iTunes" to set visuals enabled to false
tell application "System Events" to sleep
end sleepRun
(最初の行の数値を変更して、スリープするまでの時間を変更できます。
とりあえず、10分後に設定。)

このスクリプトは、iTunes で再生中のときのみ、スクリーンセーバが起動すると、それを終了して代わりに iTunes のビジュアライザを表示するようになります。

ビジュアライザだとスリープしないので、10分後にスリープするようにしてあります。(正確には1分ごとに状態をチェックして、そのときにビジュアライザがフルスクリーンで最前面に表示されているかどうかをチェックし、10回目にまだビジュアライザが表示されていたなら、スリープさせる代物です。)

スリープする必要がないならば、該当箇所をコメントアウトするなりして下さい。

※ビジュアライザの種類によっては、ちゃんとスリープできないかも。



これでタスクを保存すると、スクリーンセーバが起動すると、しばらくして iTunes のビジュアライザに切り替わるようになります。
(iTunes を再生している場合のみ)






t3_repair_permissions

スクリーンセーバ起動中にアクセス権の修復を行う


スクリーンセーバが起動しているときというのは、基本的に何もしていないときであって、その時間を有効に使って何かできないかと考えると「アクセス権の修復」をやるといいかと思い、次のようなタスクを設定してみました。


新規タスクを作成し、トリガー、アクション、実行条件を設定します。


(トリガー)
090916tsk26.gif

アプリケーションを監視」をリストから選択して、「ScreenSaverEngine」が最前面に移動したときに設定します(「起動」したときに設定してはダメ)。

「ScreenSaverEngine」は

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app

の場所にあります。名前を手入力してもOK。


(アクション)
090916tsk28.gif

シェルスクリプトを実行」をリストから選択して、下記のスクリプトを入力します。

diskutil repairPermissions /




(実行条件)
090916tsk29.gif

指定時間後に実行する」を選択して5秒後に設定します。

この「実行条件」の設定は別になくても大丈夫で、好みによります。



これで、このタスクを保存しておくと、スクリーンセーバが起動して5秒後に「アクセス権の修復」を開始するようになります。

ただ、システム環境設定の「省エネルギー」パネルで、スクリーンセーバの起動からスリープするまでの時間が、ある程度必要です。


他にも、スクリーンセーバが起動している間に、各種メンテナンススクリプトを走らせておくと便利かも。





t3_use_as_launcher

メニューバーに表示するランチャとして使用する


Task3 の環境設定( command+, )で「メニューバーにTask3メニューを表示する」にチェックします。
090916tsk30.gif

こうすると、メニューバーに Task3 の各タスクが表示されるようになります。
090916tsk52.gif

ここに表示されるタスクを実行すると、そのタスクのトリガー、実行条件に関係なく、アクションを実行します

違う見方をすれば、タスクを設定するときには、トリガー、実行条件は設定せずとも「アクション」のみの設定して、このメニューをランチャのようににも使えるということです。

メニューバーから使うランチャ類いのものは他にもいろいろあるし、Dockなどを使えばいいかもしれませんが、Task3では複数のアプリケーションを1度に起動させることができます。
090916tsk54.gif
「アクション」タブで、1つのタスクに複数のアクションを設定して、同時にアプリケーションを起動しておくようにすると、普通のランチャとは違った使い方もできます。



他にもよく使うフォルダ・ファイルを開くといったことにも使えます。
090916tsk55.gif
例えば、「~/Library」「/Library」の2つのフォルダを同時に開くとか、各種作業で保存したりするフォルダ・ファイル、それに使うアプリケーションをまとめて開くとか、いろいろ使い道はあると思います。



別にメニューから実行しなくても、トリガーを設定して「ホットキー」からそのタスクを実行することもできます。
090916tsk34.gif

実行条件でアプリケーションが起動しているとき、最前面のときなどに設定して、ホットキーが有効な場面を制限したりするのもいいでしょう。



このように Task3 はアプリケーションの起動、ファイル・フォルダを開く、AppleScript の実行、シェルスクリプトの実行、ボリュームのアンマウントなど、様々なことをアクションに設定できるので、Task3 のメニューはただのランチャではなく、かなり便利に使えます。



それと、Task3メニューに表示される順番は、Task3本体で設定したタスクの通りになるので、メニューでよく使うタスクを上の方に持ってきたり、判りやすい名前にした方が使いやすいです。
090916tsk56.gif





t3_maintenance

メニューバーから各種メンテナンスをする


「アクセス権の修復」などの各種メンテナンスを行う為のスクリプトなどを、アクションに登録しておくと、Task3メニューから お手製の『MainMenu』みたいにも使えます。
090916tsk53.gif

いくつか役に立ちそうなものを挙げると・・・

(QuickLookのリセット)

qlmanage -r

参考『クイックルックで表示できないとき - E-WA’S BLOG


(Dockの再起動)

killall Dock




(メニューバーの再起動)

killall SystemUIServer




(Finder の再起動)
property rt : return as text
global check_finder_window_exists


on run
set check_finder_window_exists to false
my main_routine()
end run


-- メイン
on main_routine()
-- Finderウインドウ情報の保存
tell application "Finder"
if Finder window 1 exists then
set check_finder_window_exists to true

set window_target to {}
set window_toolbar to {}
set window_statusbar to {}
set window_sidebar to {}
set window_bounds to {}
set window_view to {}
-- set window_view_options to {}
set window_collapsed to {}
set window_select_item_lists to {}

set every_finder_window to every Finder window
set window_count to count of every_finder_window

repeat with each_window in every_finder_window
tell each_window
set beginning of window_collapsed to collapsed
set beginning of window_target to target
set beginning of window_toolbar to toolbar visible
set beginning of window_statusbar to statusbar visible
set beginning of window_sidebar to sidebar width
set beginning of window_bounds to bounds
set beginning of window_view to current view
-- if current view is icon view then set beginning of window_view_options to icon view options
-- if current view is list view then set beginning of window_view_options to list view options
-- if current view is column view then set beginning of window_view_options to column view options
-- if current view is flow view then set beginning of window_view_options to ""
--set beginning of window_collapsed to collapsed
end tell

if collapsed of each_window is false then
set index of each_window to 1
try -- OS10.4以下用のエラー対策で「try」を付ける
set select_item to selection as alias list
on error
set select_item to {}
end try
else
set select_item to {}
end if
set beginning of window_select_item_lists to select_item

close each_window

end repeat

end if
end tell



my relaunch_finder() -- Finderの再起動


-- 再起動前に開いていたウインドウを再度開く
if check_finder_window_exists is true then
tell application "Finder"

-- 再起動後に開くウインドウを一度すべて閉じる
-- (閉じてから再度開く方が処理がラク)
close every Finder window
delay 1
if Finder window 1 exists then close every Finder window

delay 1

repeat with i from 1 to window_count
make new Finder window to item i of window_target

set toolbar visible of Finder window 1 to item i of window_toolbar
set statusbar visible of Finder window 1 to item i of window_statusbar
set sidebar width of Finder window 1 to item i of window_sidebar
set bounds of Finder window 1 to item i of window_bounds
set current view of Finder window 1 to item i of window_view
-- if current view of Finder window 1 is icon view then set icon view options of Finder window 1 to item i of window_view_options
-- if current view of Finder window 1 is list view then set list view options of Finder window 1 to item i of window_view_options
-- if current view of Finder window 1 is column view then set column view options of Finder window 1 to item i of window_view_options
delay 0.5
set selected_items to item i of window_select_item_lists
try
select selected_items
end try

--delay 0.5
set collapsed of Finder window 1 to item i of window_collapsed
end repeat

end tell
end if
--set check_finder_window_exists to false

end main_routine


-- Finderの再起動 --
-- 終了
on relaunch_finder()
try
tell application "Finder" to quit
end try

tell application "System Events"
repeat 10 times
if exists application process "Finder" then
delay 1
try
tell application "Finder" to quit
end try
else
exit repeat
end if
end repeat
end tell

my activate_finder()

end relaunch_finder

-- 起動
on activate_finder()
try
tell application "Finder" to activate
on error
delay 1
tell application "Finder" to activate
end try

tell application "System Events"
repeat 10 times
if exists application process "Finder" then
exit repeat
else
delay 1
tell application "Finder" to activate
end if
end repeat
end tell
end activate_finder
単に Finder を再起動するだけでなく、開いていたウインドウの状態、選択していたアイテム、ビューなどを再現するようにした AppleScript です。
(ただ不完全で再現に失敗することもままある)




(LaunchServices の再構築)
tell application "Terminal"
activate
do script "/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -seed -rfv -all user, system, local"
end tell

参考『コンテキストメニューの「このアプリケーションで開く」がおかしくなった時の対処方法 - soundscape out

このタスクを実行すると、ターミナルが開きます。
090916tsk37.gif
すぐに終わるから、ちゃんとできてるのか不安になる・・・。

なぜ「シェルスクリプトを実行」で直接実行せずに、AppleScript 経由でターミナル上で実行させているのか。
その理由は Task3 上で、この LaunchServices の再構築 を実行すると、ターミナル.app と UTI の関連付けがおかしくなってしまうことがあったからです。
(深く検証した訳ではないので、もしかしたら違う原因かも?)




( Locate database の再構築)
set theMessage to ""
set growlsticky to "no"
try
do shell script "/usr/libexec/locate.updatedb"
on error errorMessage
set theMessage to errorMessage
set growlsticky to "yes"
end try
tell application "GrowlHelperApp" to notify with name "Task3MessageWorkNotification" title ("Locate database の再構築" as Unicode text) description (("完了しました" & return & theMessage) as Unicode text) application name "task3runner" icon of application "task3runner" sticky growlsticky
Mac OS X Manual Page For locate.updatedb(8)

AppleScript でやってる理由は、「Locate database の再構築」は時間が掛かるので、完了後に Growl でお知らせするためです。
090916tsk36.jpg

なぜだか

line 97: /var/db/locate.database: Permission denied

っていうエラーが出てくるけど、気にしないでおこう。




(アクセス権の修復)
set theMessage to ""
set growlsticky to "no"
try
set theMessage to do shell script "diskutil repairPermissions /"
if theMessage is "" then set growlsticky to "yes"
on error errorMessage
set theMessage to theMessage & return & errorMessage
set growlsticky to "yes"
end try
tell application "GrowlHelperApp" to notify with name "Task3MessageWorkNotification" title ("アクセス権の修復" as Unicode text) description (("完了しました" & return & theMessage) as Unicode text) application name "task3runner" icon of application "task3runner" sticky growlsticky
Mac OS X Manual Page For diskutil(8)

AppleScript でやってる理由は、これも時間が掛かるので、完了後に Growl でお知らせするためです。
090916tsk38.jpg
相変わらず ACL がなんとか・・・とかいうのが出てくる。




(メンテナンススクリプト)
tell application "Terminal"
activate
try
do script "sudo /usr/sbin/periodic daily weekly monthly"
end try
end tell
Mac OS X Manual Page For periodic(8)

sudo」の付くコマンドは Task3 上では直接実行できないため、AppleScript 経由で、ターミナル上で実行しています。

これを実行すると、ターミナルが起動してパスワード入力を求められます。
090916tsk46.gif

入力して returnキー で実行すると、daily, weekly, monthly スクリプトが実行されます。
(なぜだか実行時間がやけに短い。OS10.6では内容が変わったのか?わからないけど、ちゃんと実行されてるかは不明)

ちなみに、いつ実行されたか確認するには

ls -al /var/log/*.out

のコマンドで確認できます。もしくは コンソール.app でログを見ます。




他にも「rm」コマンドでキャッシュを削除するといったスクリプトもお好みで登録しておいたらいいでしょう。




これらのスクリプトなどを、Task3 の「アクション」として登録しておくと、いつでもメニューバーから実行できて便利です。





また、別のタスクを設定するときに、他のタスクのアクションを実行できるので、上記のようなシェルスクリプト、AppleScript をいろいろこまめに用意していると組み合わせて構成できてラクです。

090916tsk49.gif
アクションの設定で、リストから「他のタスクのアクションを実行」を選択する。
その下のリストで登録しているタスクを選択します。






t3_bookmarks

メニュー、ホットキーで開くブックマークとして使う


Task3メニューにタスクを表示させて、そのタスクにアクションとしてURLを開く AppleScript を登録しておくと、このメニューはブックマークとしても使えます。

AppleScript でURLを開くのは簡単です。
例えば、
open location "http://wakabamac.blog95.fc2.com/"
という風に、「open location "URL"」とするだけです。

この AppleScript を複数行にして、いつも開いているURLなどを何個か入力しておきます。
090916tsk33.gif

これでタスクを保存すると、Task3メニューにも反映されるので、これを実行すると、そのURLをデフォルトのWebブラウザでまとめて開くといった使い方ができます。
090916tsk32.gif



また、このタスクにトリガーで「ホットキー」を付けることができます。
090916tsk34.gif

ホットキーは command shift option control文字キー を合わせたものが設定できます。
ファンクションキーなどは設定できません。
また、数字キー を設定したときには、テンキーの数字のキーでは機能しません(現在調査中とこと)。


上の例でいうと、これでホットキーを入力したときに、Webブラウザでそれらのページが一気に開きます。



また、「実行条件」でこのトリガーが機能するときを、特定のアプリケーションが起動しているとき、最前面のとき、背面になったとき、起動していないときなどに制限することもできます。

例えば、Safari が最前面のときだけ機能するようにしてみます。
090916tsk35.gif

「実行条件」タブで「アプリケーションの起動」を選択して、Safari が 最前面で動作中として保存します。

こうすると、トリガーで設定したホットキーは、Safari が最前面のときだけしか機能しないようになります。






Task3 / タスクの設定例(2)』へつづく







この記事では Task3 version 1.1.0 を使用しています。

(ダウンロードリンク)
Site top page : Spread Your Wings
Download page : Task3



(関連記事)
Task3 --- 基本的な「タスク」の設定のやり方など

Task3 / タスクの設定例(1)
Task3 / タスクの設定例(2)
Task3 / タスクの設定例(3)
Task3 / タスクの設定例(4)

スポンサーサイト



edit

Utility | CM:0 | TB:0

tag : Task3 

+