Sun, 14 Sep 2008
フォルダにパスワードをかけて管理する
AppleScriptは書き方にクセがあるので、集中して書かないとすぐ書けなくなるのです。ということで、Folder Actionを使って、フォルダにパスワードロックをかける、というのを書こうと思いたちまして…でわさっそく。
…ところが、フォルダを開けなくする、というのがそもそも上手くいきません。妥協点として、フォルダは開けちゃうけどすぐ閉じちゃうよ、一瞬だし良く見えなかったよね、ね?という感じで、以下のように書いてみました。
on opening folder this_folder
tell application "Finder"
close every Finder window
display dialog "Enter Password." default answer "" buttons {"OK"} default button "OK"
set aPass1 to text returned of result
set aPass2 to "pass" as string
if not aPass1 = aPass2 then
beep
display dialog "Password does not match." buttons {"OK"} default button "OK" with icon stop
--close this_folder
make new Finder window
set target of Finder window 1 to home
set bounds of Finder window 1 to {10, 48, 1671, 893}
set (icon size of icon view options of window 1) to 96
else
make new Finder window
set target of Finder window 1 to this_folder
set bounds of Finder window 1 to {10, 48, 1671, 893}
set (icon size of icon view options of window 1) to 96
end if
end tell
end opening folder
スクリプトがアタッチされたフォルダを開こうとすると、一瞬フォルダは開くけれどすぐ閉じてしまう。パスワードを要求するダイアログが表示され、あらかじめ決められたパスワードと入力されたパスワードが異なっていた場合は、何事もなかったようにホームフォルダを開く。入力されたパスワードが一致していれば、開こうとしたフォルダが開く。ウィンドウのサイズやら何やらは個人的な話しですが、これで目的は達成している…のかな。フォルダを開けなくする方法をご存じの方はお教えください。
最全面のウィンドウをカレントディレクトリとしたターミナルを開く
いわゆるひとつの、BeOSにおけるSummon(召喚)のようなコンテキストメニューが欲しいと思ったので作りました。Terminal.app用とiTerm.app用。ありがち。
on run {input, parameters}
tell application "Finder"
try
set aFolder to (the target of the front window) as alias
set aPath to POSIX path of aFolder
end try
end tell
tell application "Terminal"
activate
try
if front window is busy then
display dialog "Terminal is busy. Try later." buttons {"OK"} default button 1
else
do script with command "cd " & quoted form of aPath in window 1
do script with command "clear" in window 1
end if
end try
end tell
return input
end run
on run {input, parameters}
tell application "Finder"
try
set aFolder to (the target of the front window) as alias
set aPath to POSIX path of aFolder
end try
end tell
tell application "iTerm"
activate
try
tell current terminal
launch session "Default Session"
tell the last session
write text "cd " & quoted form of aPath
write text "clear"
end tell
end tell
end try
end tell
return input
end run
Terminal.appでは、最全面のウィンドウがビジーであるかどうかを調べ、もしビジーであるならスクリプトの実行を止めています。System Eventsを使って新たにタブを開くこともできたのですが、何となくイヤだったのでそうしていません。iTerm.appでは逆に、最全面のウィンドウがビジーであるかどうか調べられなかったので、常に新しいタブを開いて、そこでコマンドを実行させています。実行速度に不満があって、実行してからターミナルが開くまでに一呼吸どころか三呼吸ほど待たされますが、それいがいは問題ありません。
ブックマークを特定のアプリケーションに縛りつけない
ウェブブラウザは自分的にはOmniWeb.appで決りなのですが、今後もそうであるかは分りません…Safari.appは常に、システムとの親和性や速度でOmniWeb.appを脅かしています。ということで、ブックマークはWeb Locationファイルとしてそれらの外に置いておこうと思いました。
最初がOmniWeb.appの例、次がSafari.appの例です。最初の部分以外は共用です。ベージのタイトルに「:」が入っていると、名前を付けるときにまっきんのファイルシステムの規則とかちあってしまうので、全角文字に置き換えています。ハマったのはここくらいでしょうか。
できあがったhoge.weblocはダブルクリックしても良し、Dockのアイコンにドロップしても良し。
set aURL to ""
set aTitle to ""
tell application "OmniWeb"
if not (browser 1 exists) then
beep
return
end if
set aFrontMostDocument to browser 1
set aURL to address of aFrontMostDocument
set aTitle to name of aFrontMostDocument
end tell
--set the clipboard to aTitle & return & aURL
set aOldDel to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set aTitle to every text item of aTitle
set AppleScript's text item delimiters to ":"
set aTitle to text of aTitle as text
set AppleScript's text item delimiters to aOldDel
tell application "Finder"
--activate
set webloc to make new internet location file to aURL at "hoge:Users:hoge:Bookmarks" with properties {name:aTitle}
end tell
tell application "Safari"
if not (document 1 exists) then
beep
return
end if
set aFrontMostDocument to document 1
set aURL to URL of aFrontMostDocument
set aTitle to name of aFrontMostDocument
end tell
最近のFinder.appに対する不満と、その解決
…何が不満といって、サイドバーが使い勝手が悪くてしょうがない。いくつもウィンドウを開いていると邪魔でしょうがないし、アイコンも小さいよ。大きくしたりできないし、かといって表示しないでおこうとすると、ツールバーまで隠れてしまうし。ツールバーは使いたいけれど、サイドバーなんかイラネ。
このほどさように、最近のFinder.appは気に入らなかったのですが、つい最近、発想の転換をしまして、少し気が楽になったというか…
まずもう、デスクトップとか直接見ないようにする。デスクトップに表示されているディスクとか、ただの飾りです。ウィンドウはボコボコ開かない、全画面に常にひとつだけウィンドウを表示しておき、閉じない。何かの加減でウィンドウを開いたりしたとしても、不要になったらすぐ閉じる。ファイル階層を見る、ファイルやフォルダの移動、コピーもエイリアスを作るのも、このひとつのウィンドウから行なう。今までFinder.appを何か特権的なものとして捉えていたけれど、そうじゃないんだ。サイドバーも徹底的に活用する。フォルダを登録したり後はスマートフォルダとか、少ないステップで目的のものに到達できるようにする。起動項目に以下のスクリプトを入れておく。
tell application "Finder"
activate
close every window
open home
--make new Finder window
--set target of Finder window 1 to home
set bounds of Finder window 1 to {10, 48, 1671, 893}
set (icon size of icon view options of window 1) to 96
end tell
それにしても、上のようなAppleScriptを書くのにも、けっこう時間がかかってしまいました。Script Editor.appから記録してやれば良い部分もありましたが、「全てのウィンドウを閉じる」部分で躓きました。
後は、コンテキストメニューからファイルをコピー、移動、エイリアスを作るAutomatorプラグインとかを書きました。ありがちなものなので、サンプルはいくらでもみつけられました。ただ、ファイル/フォルダのコピーを任意の場所に、というのはSystem Eventsを使ったものになっています。マウントしたディスクイメージをコピーできなかったので、こういう方法になってしまいました。どれも動作速度の点で少し不満がありますが、おおむね満足して使っています。
on run {input, parameters}
tell application "Finder"
activate
tell application "System Events"
keystroke "c" using {command down}
end tell
--set aResult to choose folder default location home as alias
set target of Finder window 1 to (choose folder default location home as alias)
tell application "System Events"
keystroke "v" using {command down}
end tell
end tell
return input
end run
on run {input, parameters}
try
if length of input is not 0 then
tell application "Finder"
set aDest to (choose folder)
move input to aDest replacing no
--move input to desktop
end tell
else
display dialog "No Selected items" buttons {"OK"} default button 1
end if
end try
return input
end run
on run {input, parameters}
try
if length of input is not 0 then
tell application "Finder"
set aDest to (choose folder)
make new alias file to input at aDest
end tell
else
display dialog "No Selected items" buttons {"OK"} default button 1
end if
end try
return input
end run