How My Heart Sings

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

スクリプトがアタッチされたフォルダを開こうとすると、一瞬フォルダは開くけれどすぐ閉じてしまう。パスワードを要求するダイアログが表示され、あらかじめ決められたパスワードと入力されたパスワードが異なっていた場合は、何事もなかったようにホームフォルダを開く。入力されたパスワードが一致していれば、開こうとしたフォルダが開く。ウィンドウのサイズやら何やらは個人的な話しですが、これで目的は達成している…のかな。フォルダを開けなくする方法をご存じの方はお教えください。

Meta Infomation of this entry

You can add this Entry to your  はてなブックマーク and Delicious

最全面のウィンドウをカレントディレクトリとしたターミナルを開く

いわゆるひとつの、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では逆に、最全面のウィンドウがビジーであるかどうか調べられなかったので、常に新しいタブを開いて、そこでコマンドを実行させています。実行速度に不満があって、実行してからターミナルが開くまでに一呼吸どころか三呼吸ほど待たされますが、それいがいは問題ありません。

Meta Infomation of this entry

You can add this Entry to your  はてなブックマーク and Delicious

ブックマークを特定のアプリケーションに縛りつけない

ウェブブラウザは自分的には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

Meta Infomation of this entry

You can add this Entry to your  はてなブックマーク and Delicious

最近の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

Meta Infomation of this entry

You can add this Entry to your  はてなブックマーク and Delicious

Le violon intérieur....
Yasuo Yamashita
vaiorinnhiATTOnaDOTrimDOTorjye-pi-
Y.A.S.U.O Ytterbium Artificial Sabotage and Utility Organism Y.A.S.U.O Yelling Abomination from the Sunless Underground Oasis

Pyblosxom and plugins. For detail, see http://viole.sakura.ne.jp/blosxom/blosxom.cgi/plugin_info