2011年8月21日日曜日

[AppleScript] とてもユニークな命令、最前面のアプリ名を取得

こんなのあるんですねぇ。妄想心を駆られます。
ちょっと忘れたけどWebで見かけた、最前面のアプリ名を取得する命令。


tell application "System Events"
set front_app to name of (path to frontmost application)
end tell

最前面のアプリ次第で分岐する、といった使いかたが主でしょうか。
または、全てのアプリが共通で行えるような動作を「最前面のアプリ」で実行するとか。
「tell application front_app」といった使いかたも出来るのがミソ。
ちょっとすぐには実装したい用途が思いつきませんが、なかなか面白いですよね。


今、言った先から思いつきました。
どのブラウザからでもURLをコピーする命令。
まさか前回苦い思い出を作ったFirefoxが参考になるとは・・・
実装例はこんな感じ。


tell application "System Events"
set front_app to name of (path to frontmost application)
set NUM to number of front_app
set NUM to NUM - 4
set front_app to characters 1 thru NUM of front_app as text
tell application front_app
keystroke "l" using {command down}
keystroke "c" using {command down}
end tell
end tell

「どんな需要だよ」って感じは否めませんが、こういう使いかたも出来る、と。
command + lでロケーションバーアクティブは、大抵のブラウザで共通ですし。
コピペが使えるということは、テキストエディタなどでも用途があるかもしれません。
そのほかに使えるコマンドと言えば、検索、設定、ヘルプ、アプリ終了とかでしょうか。


あ、またまた思いつきました。
ブラウザで表示している記事を全選択 → コピー → Evernoteにペーストとかは面白そう。
ゴテゴテしたブログではビューが崩れるでしょうが、うちみたいにシンプルなら可能。
今試してみて、Yahooの個別ニュースはいけますね。
シンプルなページをクリップするには、間違いなく最速でしょう。
・・・が、実際にペーストする必要があるので、一度Evernoteをアクティブにする必要があるのが難点かな。。。
最後に「front_app」をアクティブにすればいいことですけど。気になる人は気になるかも。(僕は気になる)
なんにせよ、frontmost、ユニークですね。

2011年8月17日水曜日

Growlを個別に設定する方法

AppleScriptでGrowlを使うとき、コード内に「このAppleScriptをGrowlアプリケーションとして登録する」という命令を書きます。
大体これで通知内容は指定出来るんですが、唯一出来ないのが音の設定。
正確に言えば"Growl Application Bridge"とかいうFrameworkを使えば出来るっぽいんですが、さすがにサッパリ分からん(´・ω・`)
僕が不甲斐ないのでスクリプトには「音は自分で設定してね!」としか書けません。
ということで、その方法を書いておきます。


Growl専用のアプリケーションリスト


1


ここから設定します。


2


アプリケーションの中に登録しているリストがずらーっと出てくるので、


3


設定したいアプリを選ぶと個別に設定できます。で、サウンドもここから設定。


オシマイ(´・ω・`)
「は?知っとるわそんなの!」って?
いや、確かにそうでしょうが、投げっぱなしというのも気持ち悪いですしねぇ・・・
これからはここを参照するようにします。

[AppleScript] 各ブラウザで最前面のページタイトルとURLを取得

タイトルどおりなんですが、それぞれで取り出す手法が違います。
AppleScriptでは、同じクラスでもアプリによって意味が違うことがあります。
なので、一つの情報を取り出すにも、同じ手段が取れないことはザラです。
Macで使う最近のブラウザといったら、Safari、Google Chrome、Firefoxでしょうか。
それ以外は使ってないので、ひとまずは3つ作りました。


まずはSafari。


tell application "Safari"
set page_URL to URL of current tab of window 1
set page_title to name of current tab of window 1
end tell

うん、分かりやすいですね。さすがApple純正ブラウザです。
用語説明を開いて驚いたんですが、印刷設定まで出来るんです。充実し過ぎ。


お次はGoogle Chrome。


tell application "Google Chrome"
set page_URL to URL of active tab of window 1
set page_title to title of active tab of window 1
end tell

まあ、大体は一緒ですね。currentがactiveになっただけ。
しかし、このくらいなら統一して欲しい気もしますが・・・
この辺りがAppleScriptらしさ。クラス云々というのはこういった側面です。


最後にFirefox。


tell application "Firefox"
activate
set page_title to the name of front window
tell application "System Events"
keystroke "l" using {command down}
keystroke "c" using {command down}
set page_URL to the clipboard as text
end tell
end tell

ええ、思わず「うそ・・・だろ・・・?」と言いたくなるコードです。
URL取得でkeystrokeとか、冗談でしか無いですね。が、残念。これしかありません。
AppleはMozillaに恨みでも買ってるんでしょうか。
細かく言えば、GUI Scriptingのエラー処理、クリップボードの保護も欲しいところです。
その辺を追加したらこうなります。


my gui_check()
set temp to the clipboard as text
tell application "Firefox"
activate
set page_title to the name of front window
tell application "System Events"
keystroke "l" using {command down}
keystroke "c" using {command down}
delay 0.5
set page_URL to the clipboard as text
end tell
end tell
delay 0.5
set the clipboard to temp as text

to gui_check()
tell application "System Events"
if UI elements enabled is false then
tell application "System Preferences"
activate
set current pane to pane "com.apple.preference.universalaccess"
set msg to "GUI scripting is not available." & return & "Do you put the check in" & return & "\"Enable access for assistive devices\" ?"
--display dialog msg buttons {"OK"} default button "OK" with icon note --giving up after 10
display dialog msg buttons {"cansel", "check and try"} with icon note
end tell
set UI elements enabled to true
delay 0.5
tell application "System Preferences" to quit
delay 0.5
end if
end tell
end gui_check

もうね、やってられっかって話です。
そして嫌味なのが、この手法だと3つのブラウザ全て共通で使えるということです。
3つのブラウザに対応した形を作るなら、これをハンドラにした方が楽だということ。
まあ、 絶 対 に やらないけど・・・


でもまあ、これでFirefoxでもURL取得のテンプレが出来たので、次からは楽できそう。
ついでにGUI Scriptingのエラーもルーチン化できたし。こっちは随分と便利。
にしても、もう少しなんとかならないかなぁ・・・
言語を変えれば解決するんでしょうか・・・
今回これを作るにあたって、少しSafariに傾きつつあります。

2011年8月16日火曜日

[AppleScript] iTunesの再生中の曲情報をいろいろ取得

そのまんま、iTunesの曲情報を取得するだけ。
1分で書けるレベルですが、ひな形くらいにはなるかと。
Twitterの呟きパラメータとかになら使えるかもしれません。
というか、実際にその用途でついでに書いただけだったり・・・
ぱっと見たところアートワークの取得も出来たので、使いかたによっては面白いことができるのかもしれません。
こういうの見てると、Windowsのsamurizeを思い出しますね。


tell application "iTunes"
set i_track to current track
set i_name to the name of current track
set i_artist to artist of current track
set i_album to album of current track
set i_genre to genre of current track
set i_rating to rating of current track
set i_lyrics to lyrics of current track
set i_path to location of current track --HFSパス
end tell

[AppleScript] Bit.lyで短縮URL作成 [要API]

bit.lyで短縮したURLを返すルーチン。
用途的にルーチンにする必要は無いですが・・・書いちゃったので。
前に本家が公開してた方法は閉鎖してました。


Bit.ly URL shortening with Mac OS X Snow Leopard Services and Applescript
いっても410 GONEが返ってきます
しかし410なんてエラーあったんですね、知らなかった・・・



現行の記述はググッても中々見つからず、公式の隅っこに埋まってる感じ。
もうbit.ly自体あまり使われていないのかもしれませんが、念のため。
僕としては、かなり便利だと思うんですけどねぇ。。。
format=txtをxml、jsonに変えると、そのタイプで取得できます。


ApiDocumentation - bitly-api - bitly REST API method documentation - API Libraries and Documentation for bitly - Google Project Hosting
v3/shortenってとこ


残念ながら、直リンを返してくれるのはユーザー名、API持ってる人だけみたい。
無い場合はhttp://bit.ly/longURLに飛ばされてからでないと、短縮URLが作れません。
「アカウント持ってないヤツ、ちょっとウチこいよ」ってことなのかな?
ワンクッション無くURLを作る方法をご存知の方いましたら、教えてください。


set bitly_user to "" --bit.ly ユーザー名
set bitly_api to "" --bit.ly API
set longURL to "" --短縮前URL

to bitly(longURL, bitly_user, bitly_api)
set inputResult to (longURL as string)
if (((characters 1 thru 4 of inputResult) as string) = "http") then
set curlCMD to "curl --stderr /dev/null \"http://api.bitly.com/v3/shorten?login=" & bitly_user & "&apiKey=" & bitly_api & "&longUrl=" & longURL & "&format=txt\""
set tinyURL to (do shell script curlCMD)
return tinyURL
end if
end bitly

[AppleScript] Finderで選択した項目のいろんな情報を取得

スマートなコードを見つけたのでご紹介。
AppleScriptでググったらまずヒットするザリガニが見ていた...。さんから。
選択中したファイルのいろんな情報を引っ張り出します。
大抵はshellで取得すると思うんですが、これはprpertyから抜き取ります。
無理がなく、AppleScriptだけってのもステキ。
一気にいろんな情報が取れて便利ですねー。
ついでですが、a7、a8にパス関係を追加してます。(僕が使いたかっただけ)


tell application "Finder" to repeat with a2 in selection as alias list
copy properties of a2 to {name:a3, name extension:a4, container:a6}
set a5 to a3's characters 1 thru -((count character of a4) + 2) as Unicode text
set a7 to (a2 as alias) as Unicode text
set a8 to POSIX path of a7 as Unicode text
end repeat
--a3:ファイル名&拡張子、a4:拡張子、a5:ファイル名、a6:ディレクトリ、a7:HFSパス、a8:POSIXパス

2011年8月15日月曜日

MarsEdit買いました!!

MarsEdit - the blog editor for WordPress, Tumblr, Blogger and more. App
カテゴリ: ソーシャルネットワーキング
価格: ¥3,450


ずっと気になってたブログエディタ、MarsEditをついに買いました!
今まではmiで書いてWebのエディタに貼りつけてたんですが、もう限界。
miはホントお世話になって、タグとか登録しまくってて、かなり便利。
ブログエディタではないけど、細かい設定でほぼブログエディタとなってました。
今までありがとうmi、これからも使うんでよろしく。


執筆と校正が同時に出来る!


そう、miは完璧と言ってよかった。
軽い、タブ管理、ブログ書ける、コードも書ける。落ち度などあるわけがない。
問題はWordPressのWebエディタ。


頑張ってブログ書き終わったらもうヘトヘト。コピペしてすぐ投稿したい。
しかしそのままだと、半端な改行だったりして表示がズレズレに・・・
ということで、WordPress上でも若干の校正、プレビューが必要でした。
これがメンドイ。もうホントにメンドイ。
頑張って小さい表示枠で書きなおすも、下書き保存→プレビュー→まだズレてるorz
はあ?これで文章書けって?無理言わないでよ(´・ω・`)
ただでさえ文章力の無い僕から、やる気まで奪うんですか(´・ω・`)
自分の中では完了したはずの内容を書き直す。これがどんだけしんどいことか。


その点、MarsEditには「プレビュー機能」がついています。
記事を書きながら横目で出来映えが見れるという、なんとも素晴らしい機能。
これならブログ執筆と校正が同時に出来ます。WordPressを開く必要すらありません。
ホントこれ、素晴らしすぎます( ´ ▽ ` )


とりあえず設定した内容


まずはブログエディタに欠かせない最低限の機能を設定しました。
hrmlタグのマークアップ作成。僕は大して使わないんで、デフォルトにリスト用3つとソースコード用を足しただけ。
あとはキーをcontrol + ""に変更したくらい。(commandって干渉多いような・・・)
あとはツールバーとか・・・まあ、まだそのくらいですね・・・
まだ買ったばっかではしゃいでるレベルです。。。


この辺どーにかしたい


プレビューはブログのCSSを直接コピペしましたが、連動できないんですかねぇ?
ブログ側のCSSを更新したら、自動でプレビュー画面も更新されるって感じに。
まあ、それが出来るなら最初からそういう設定が用意されてる気がするんで、無理なのかもしれませんけど。
出来ないなら、書き出し位置と横幅だけ合わせたCSSにした方が軽そうです。


あと、ブログ記事のタグ一覧を出したい。
カテゴリは一覧が出て、タグは出ない。しかしサジェストはする。なんとも不思議設計。
これは上のCSSが適用されればプレビュー画面で最新のタグを見れるので、そっちでまとめて解決したい。
んー、まだ分かってないことが多すぎます。


正直、今のところはプレビューに釣られて飛びついたようなもんですw
ですが、ブログエディタならではな機能もたくさんあるみたい。(当たり前か)
ほかにもBookmarkletが使えたり、AppleScriptが使えたり。
最近AppleScriptやAlfred拡張にハマり、今後はコマンドやルーチンの記事が増える(予定)ので、もっと深い機能も探求していきたいと思います!
そのうちMarsEdit用のスクリプトも作りたいですね( ´ ▽ ` )



MarsEdit - the blog editor for WordPress, Tumblr, Blogger and more. App
カテゴリ: ソーシャルネットワーキング
価格: ¥3,450

2011年8月14日日曜日

[AppleScript] テキストをデリミタで分割してリスト化

テキストをリスト化する構文。

Finderからパスを取得した場合などによく使ってます。

拡張子、ファイル名、階層数を受け取りたいときは便利。



try
set AppleScript's text item delimiters to "NewDelim"
set DelList to ""
repeat with i from 1 to (count text item of DelText)
set demo to text item i of DelText
set DelList to DelList & demo as list
end repeat
end try

[AppleScript] Growlのサブルーチン化

Growlで通知を出すときの決まり文句。お世話になりそうです。

初回実行後に登録アプリ名でGrowlのアプリケーションごとの設定欄に現れます。音などはそちらで設定するしかなさそう。

サンプルのTweetの部分はGrowlへの登録アプリ名になります。

またサンプルのYoruFukurouは夜フクロウさんのアイコン指定。

思いのほか弄れるところはあるようで、詳しくは本家で都度確認、わかり次第追記の方がよさそう。


--実行部
my growlRegister()
growlNotify(grrTitle, grrDescription)

--サブルーチン部
using terms from application "GrowlHelperApp"
on growlRegister()
tell application "GrowlHelperApp"
register as application "Tweet" all notifications {"Notification"} default notifications {"Notification"} icon of application "YoruFukurou.app"
end tell
end growlRegister
on growlNotify(grrTitle, grrDescription)
tell application "GrowlHelperApp"
notify with name "Notification" title grrTitle description grrDescription application name "Tweet"
end tell
end growlNotify
end using terms from

2作目Alfred拡張、今度は期待できる!爆速リネームアプリ、Light Renamer!!

この間ご紹介したキーボードランチャAlfredの拡張、2作目作りました!

今回はかなりいい出来!!(前回が前回なだけに) 間違いなく便利です!

その名もLight Renamer!Alfredから爆速で高性能なリネームが出来る!

これは見なきゃ損!使わなきゃ損!ではさっそくご紹介します!(`・ω・´)


追記(110823)

一番下に直接コード貼りました。

たぶん、AlfredのPowerpackじゃないと見れないと思うので。

近いうち、もっと分かりやすい方法を載せますので、Alfredの便利さを心待ちにしてください(`・ω・´)


動画にしてみました!多分これが一番分かりやすいんじゃないかと思います。

ピンぼけみたいになってますが、挙動はこんな感じです。キャプチャしながらだからCPUフル回転してるので、実際はもっと速いです。

最後のオマケAlfred拡張も近いうち記事あげますー( ´ ▽ ` )ノ



一晩かかったんだし、まずは自慢させてください


・・・なんか通販みたいだったで普通にいきましょう。

とりあえず、モノを見てもらったほうが早いので、こちらをどうぞ。


Light Renamer


この拡張をざっくり説明すると、Finderで選択中の項目(ファイル/フォルダ両方)を、複数のパラメータを持たせてリネームします。

例えば、連番をつけたり、日付をつけたり、親フォルダの名前を参照したり、という感じです。

一連の流れを見てもらえば、なお分かりやすいかと思います。


1


まず、Finderで複数の項目を選択します。

見づらいですが、自炊した漫画で100項目掴みました。


2


おもむろにAlfredを呼び出します。僕はcontrol + space。

そして、"re fol,面白いよ!,n"と入力。

これはAlfredからパラメータを送るルールです。この辺はあとでご紹介。


3


ほい!!実行して3秒ほど、選択していたファイルがリネームされました!

"BLOOD+ 03_面白いよ!_001".jpg、完璧です!!

これは送ったパラメータ、"re fol,面白いよ!,n"で指定した内容となっています。

当然コレ以外のパラメータも送れますし、パラメータの順番も自由自在です。

リネームは名前昇順で実行されるので、連番に狂いもありません。

どうでしょう、なかなか使えそうな機能じゃないでしょうか。


Light Renamerはここが凄い!


では、このほかにどんなリネームが出来るのか。パラメータの説明と合わせて紹介します。

先ほどのパラメータの内容を紐解くと、こんな感じになっています。

re_fol,面白いよ!,n



  • re → AlfredからLight Renamerを呼び出すコマンド。必須です。

  • _ → 半角スペース。見えないので_書きましたが、実際は空白です。

  • fol → 親フォルダ名を表すパラメータ。[定数]

  • 面白いよ! → 設定していないパラメータ。要するに好きに使える文字列。[定数]

  • n → 連番を表すパラメータ。三桁だけど二桁、一桁もある。[変数]

  • , → それぞれのパラメータを区切る文字。これは固定してます。


このようにパラメータを与えることで、好きな構成の名前に変えられるという具合です。

このほかにも、下のパラメータも用意しています。



  • t → 日付を表すパラメータ。yymmddの記述で日付が入ります。[定数]

  • cur → リネーム前の名前を表すパラメータ。[変数]


これらのパラメータを好きな順番に並べれば、

re cur,t

→朝食_110813.jpg, 昼食_110813.jpg, 夕食_110813.jpg, 総カロリー_110813.txt,...

のような、食事ログのまとめ、

re n,沖縄旅行,t

→001_沖縄旅行_110813.jpg, 002_沖縄旅行_110813.avi, 003_沖縄旅行_110813.mp3,...

のような、旅行のデータまとめなどが、とても手軽に行えます。

僕が例で出した自炊ファイルのまとめは、一番ポピュラーな使いかたかと思います。

今挙げた食事ログのまとめを見ると分かりますが、パラメータは2つでも1つでも問題ありません。

その場合、区切りの","は省略して構いません。("re n" or "re n,t"の実用性は凄まじいです。)

拡張子を保護してリネームするので、いろんなファイルが混ざっていても大丈夫。

フォルダも同じ方法でリネームするので、ファイルとフォルダが混ざっていても大丈夫。

そしてそして、各パラメータには"t"、"n"、"fol"などが割り当てられてますが、これは設定で好きな文字に変更出来ます。

ついでに区切り文字の"_"も好きに変更出来ます。もうなんでもアリなレベル。

スクリプト内に"チョチョイと設定"という設定部分を作っているので、その値を変えてもらえばOK。

キーボードランチャからチョロっと叩くだけで、ここまで出来ていいのかと疑います。


自分で言うのもなんですが、これだけ出来れば普段づかいには十分でしょう。

もう簡単なリネームなら、専用アプリは必要ありません。

是非みなさんも使ってみてください!!

Alfredでの使いかたは、前回の記事に書いてますのでそちらをどうぞ。


ついでではありますが、Growlの通知もつけました。リネーム完了後、ポンと出ます。

ただ、これはエラー報告では無いです。ただ”出てくるだけ”。自己満足。

音などを設定したい人は、一度このスクリプトでGrowlをポップアップさせてから、

システム環境設定→Growl→アプリケーション→Light Renamerから設定してください。

「そんなんいらんわ」「Growl入れてない」という人は、スクリプト内に書いてある"チョチョイと設定"から、growl_runの初期値を"false"にしてください。

よかったらエラー処理にでも役立たせてくれれば幸いです。


いくつか注意点


使う上で、頭の片隅に覚えておいて欲しい項目がいくつか。

まず、Backgoundのチェックボックスを"ON"、Actionを"OFF"にしてください。

Backgroundが"OFF"でもリネームは出来ますが、リネーム中Alfredがほぼ固まります。

本末転倒もはなはだしいです。


そしてこれが大切なんですが、リネームするファイル/フォルダまでのフルパス(自身も含む)に、"."を含んだものはリネーム出来ません。

拡張子はOKなんですが、二重拡張子やフォルダに"."が入ったものは対応していません。(.tar.gzなど)

普段僕が扱わない拡張子は頭から抜けてました、ごめんなさい(´・ω・`)

その辺は他の専用ソフトでリネームするか、スクリプトを書き換えてください。


最後に。使っていると分かることなんですが、パラメータには[定数]と[変数]があります。

上のリストの末尾に書いてあるのがソレです。

連番、元のファイル名が変数となっており、この2つはファイルごとに値が違います。

それ以外の親フォルダ名、日付、任意の文字列は、常に一定の値が入ります。

もうピンときたでしょうが、定数のパラメータだけでリネームを実行すると、2つ目のリネーム処理でファイル名が重複してしまうため、リネームされません。

まあ、それでもエラーは吐かないのでリネームは素直に終了しますが、最初のファイルだけリネームされてしまうという危なっかしい状態になります。

実際には拡張子が違えばリネームは行えるので一概ではありませんが、こういった側面があることを知っておいてください。


あとがき - Alfredならではの拡張とは


"Light Renamer"を作って思ったことコーナー。このあとがき、恒例になりそうです。

前回のタイマーも一応Alfred用の作りでしたが、今回のは完全にAlfred専用な感じで大満足。

というのは、キーボードランチャからパラメータを直接投げるという挙動についてです。

この部分を踏まえないと、「それ別のやり方のが速くね?」ってことに成りかねません。

速さがすべてとは言いませんが、キーボードランチャを使う人は割とそういう考えではないでしょうか。(僕だけか?)

Light Renamerは、力ではワイルドカードや正規表現でゴリゴリとリネーム出来るアプリには手も足も出ませんが、こと速さにおいては格別です。

キーボードランチャに似合った、適材適所な拡張機能と言っていいでしょう。

まあ中身は相変わらずズタボロですが、Alfredの考えはこんな感じなのかなと思います。

とまあ、さすがにいい加減自己満過ぎるので、そろそろ次のアプリの構想に移ります(笑)


コードを追記


コメント込みだとすごい量だな・・・



(*
Light Renamer
すいとー (@suito1942)
http://www.hw2-suito.com/

*概要
Alfredから使える、簡易リネームスクリプトです。
Finderで選択している項目をリネームします。
ファイル/フォルダ両用です。複数選択した場合、名前昇順で実行されます。
入力文字を","で区切り、さまざまなパラメータを最大3つまで組み合わせることが出来ます。
各パラメータは下記。(Syntaxは変更可)

Syntax:$任意の文字列 [定数]
任意の文字列。ファイル名に使えない文字列は含まないでください。
Syntax:$t [定数]
日時を入力します。記述はyymmdd。(例:110813)
Syntax:$n [変数]
連番を入力します。デフォルトの記述は三桁。(例:001,002,003,...)
一桁、二桁もオプションで用意しています。変更したい場合は最後の"カウントアップ"を編集してください。
Syntax:$fol [定数]
親フォルダ名を入力します。
Syntax:$cur [変数]
リネーム前のファイル名を入力します。

*使いかた
Alfredのkeywordを入力し(デフォルトは"re")、returnもしくは" "を押して、それぞれのパラメータを","で区切って入力します。
それぞれのパラメータは"_"で区切られます。
少し分かりづらいので、いくつかの実用例を紹介します。

1、"re n,沖縄旅行,t" と入力 [対象:沖縄旅行のいろんなデータ]
→001_沖縄旅行_110813.jpg, 002_沖縄旅行_110813.avi, 003_沖縄旅行_110813.mp3,...
2、"re cur,t" と入力 [対象:今日食べた食事のデータ]
→朝食_110813.jpg, 昼食_110813.jpg, おやつ_110813,jpg, 夕食_110813.jpg, 総カロリー_110813.txt,...
3、"re fol,cur" と入力 [対象:「よつばと!1巻」を自炊したデータ]
→よつばと!1巻_001.jpg, よつばと!1巻_002.jpg, よつばと!1巻_003.jpg,...

パラメータは最大3つまで。1つでもリネームは出来ます。(実際、"re n"はよく使うと思います。)
ファイル、フォルダともに、同様の処理をします。(拡張子は保護します。)
各パラメータを呼び出すSyntaxと、各パラメータを区切る"_"は、下記から変更可能です。("チョチョイと設定"から〜まで)
使いやすい文字に変更してみてください。

*注意点
Backgoundのチェックボックスを"ON"、Actionを"OFF"にしてください。

スクリプトの仕様上、下記のファイル、フォルダ名のものはリネーム出来ません。
"."を含むファイル、フォルダ名(階層含んですべて)
二重拡張子のファイルなどは、別の手段でリネームしてください。

各パラメータには、回数を重ねるごとに内容が変更されるものと、変更されないものがあります。
Syntaxの欄にある、[定数],[変数]がそれにあたります。(拡張子は準変数としておきます。)
連番、リネーム前ファイル名は毎回変わりますが、それ以外はずっと同じ文字列が入ります。
[定数]のパラメータのみで構成すると、2つ目のリネーム処理でファイル名の重複によるエラーとなります。
「ミスった!・・・あれ?元のファイル名なんだっけ?」と陥りやすいので、気をつけてください。

*おまけ
ついでにGrowlの通知もつけました。リネーム完了後、ポップアップします。
ただし、エラー報告などではありません。ただ"出てくるだけ"です。
音などを設定したい人は、一度このスクリプトでGrowlをポップアップさせてから、
システム環境設定→Growl→アプリケーション→Light Renamerから設定してください。
「そんなんいらんわ」「Growl入れてない」という人は、"チョチョイと設定"から、
growl_runの値を"false"にしてください。
上手くエラー処理に役立たせてくれれば幸いです。
*)

on alfred_script(q)
set q to q as text

--チョチョイと設定 ここから
--""内を変えるとSyntaxを変更できます
set t to "t" --日付のSyntax
set n to "n" --連番のSyntax
set fol to "fol" --親フォルダのSyntax
set cur to "cur" --現在のファイル名のSyntax
set separator to "_" --各パラメータを区切る文字
set growl_run to "true" --いる場合は"true"、いらない場合は"false"
--チョチョイと設定 ここまで

--フォルダ名取得
tell application "Finder"
tell window 1
set parent_path to target as alias as text
end tell
try
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set parent_list to ""
repeat with i from 1 to (count text item of parent_path)
set demo to text item i of parent_path
set parent_list to parent_list & demo as list
end repeat
end try
set demo to count of parent_list
set demo to demo - 1
set folder_name to text item demo of parent_list
set AppleScript's text item delimiters to oldDelim
end tell

--その他もろもろ
set current_day to (do shell script "date '+%y%m%d'")
set item_num to 0
set count_type to ""
set current_type to ""
set current_name to ""

--引数の判定と代入、count_typeとcurrent_typeは後の判定用
set my_parameter to q
set my_parameter to my_parameter & "," & "," --引数が少ない時用
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to ","

if text item 1 of my_parameter = t then
set A to current_day
else if text item 1 of my_parameter = n then
set A to item_num
set count_type to "A"
else if text item 1 of my_parameter = cur then
set A to ""
set current_type to "A"
else if text item 1 of my_parameter = fol then
set A to folder_name
else if text item 1 of my_parameter ≠ "" then
set A to text item 1 of my_parameter
else
set A to ""
end if

if text item 2 of my_parameter = t then
set B to current_day
else if text item 2 of my_parameter = n then
set B to item_num
set count_type to "B"
else if text item 2 of my_parameter = cur then
set B to ""
set current_type to "B"
else if text item 2 of my_parameter = fol then
set B to folder_name
else if text item 2 of my_parameter ≠ "" then
set B to text item 2 of my_parameter
else
set B to ""
end if

if text item 3 of my_parameter = t then
set C to current_day
else if text item 3 of my_parameter = n then
set C to item_num
set count_type to "C"
else if text item 3 of my_parameter = cur then
set C to ""
set current_type to "C"
else if text item 3 of my_parameter = fol then
set C to folder_name
else if text item 3 of my_parameter ≠ "" then
set C to text item 3 of my_parameter
else
set C to ""
end if
set AppleScript's text item delimiters to oldDelim

tell application "Finder"
set g_i to 0 --遊びで使ってます、よかったらエラー処理に役立たせてください
repeat with select_item in (selection as list)
set file_path to select_item as text
set g_i to g_i + 1
if file_path contains "." then --ファイルのとき(拡張子の有無を判定。二重拡張子、親フォルダに"."がある場合は成り立たない理由)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to "."
set item_ext to last text item of file_path --拡張子取得
set current_name_text to text item 1 of file_path

try
set AppleScript's text item delimiters to ":"
set current_name_list to ""
repeat with ii from 1 to (count text item of current_name_text)
set list_demo to text item ii of current_name_text
set current_name_list to current_name_list & list_demo as list
end repeat
end try
set current_name to last text item of current_name_list --現在の名前取得
set AppleScript's text item delimiters to oldDelim

--変数になるcurとnはrepeat内
--引数にcurがあったとき
if current_type = "A" then
set A to current_name
else if current_type = "B" then
set B to current_name
else if current_type = "C" then
set C to current_name
end if

--引数にnがあったとき
if count_type = "A" then
set A to my count_up(A)
else if count_type = "B" then
set B to my count_up(B)
else if count_type = "C" then
set C to my count_up(C)
end if

--リネーム
if C = "" and B = "" then
set name of select_item to A & "." & item_ext as Unicode text
else if C = "" then
set name of select_item to A & separator & B & "." & item_ext as Unicode text
else
set name of select_item to A & separator & B & separator & C & "." & item_ext as Unicode text
end if
else --フォルダのとき
try
set AppleScript's text item delimiters to ":"
set current_name_list to ""
repeat with ii from 1 to (count text item of file_path)
set list_demo to text item ii of file_path
set current_name_list to current_name_list & list_demo as list
end repeat
end try
set current_name to last text item of current_name_list --現在の名前取得
set AppleScript's text item delimiters to oldDelim

--変数になるcurとnはrepeat内
--引数にcurがあったとき
if current_type = "A" then
set A to current_name
else if current_type = "B" then
set B to current_name
else if current_type = "C" then
set C to current_name
end if

--引数にnがあったとき
if count_type = "A" then
set A to my count_up(A)
else if count_type = "B" then
set B to my count_up(B)
else if count_type = "C" then
set C to my count_up(C)
end if

--リネーム
if C = "" and B = "" then
set name of select_item to A as Unicode text
else if C = "" then
set name of select_item to A & separator & B as Unicode text
else
set name of select_item to A & separator & B & separator & C as Unicode text
end if
end if
end repeat
end tell
if growl_run = "true" then
set g_i to "total " & g_i & " items" as text
my growlRegister()
growlNotify("End Run Rename", g_i)
end if
end alfred_script

--サブルーチン
--カウントアップ
-- 一桁にする・・・[2],[3]をコメントアウト
-- 二桁にする・・・[3]をコメントアウト
-- 三桁にする・・・[2]をコメントアウト
-- (コメントアウトは行頭に"--"をつけてください)
to count_up(type)
set type to type + 1 -- [1]
--set type to text -2 thru -1 of ("0" & type) -- [2]
set type to text -3 thru -1 of ("00" & type) -- [3]
return type
end count_up

--Growlサブルーチン
--エラーの方は使ってません。よかったらどこかに設置してください。
using terms from application "GrowlHelperApp"
on growlRegister()
tell application "GrowlHelperApp"
register as application "Light Renamer" all notifications {"Notification"} default notifications {"Notification"} icon of application "Alfred.app"
end tell
end growlRegister
on growlRegister_error()
tell application "GrowlHelperApp"
register as application "Light Renamer error" all notifications {"Alert"} default notifications {"Alert"} icon of application "Alfred.app"
end tell
end growlRegister_error
on growlNotify(grrTitle, grrDescription)
tell application "GrowlHelperApp"
notify with name "Notification" title grrTitle description grrDescription application name "Light Renamer"
end tell
end growlNotify
on growlNotify_error(grrTitle, grrDescription)
tell application "GrowlHelperApp"
notify with name "Alert" title grrTitle description grrDescription application name "Light Renamer error"
end tell
end growlNotify_error
end using terms from

2011年8月13日土曜日

[AppleScript] Finderで選択中の項目をリネーム

今日からApple Scriptの書き溜めをブログにしていこうと思います。

スクリプト書くとき、簡単なルーチンはEvernoteにメモで残してるんですが、それだとあんまり実用性が無いので。

というのも、ただコピペするだけだと、こんな感じになるから。


Finderで選択中の項目をリネーム(ファイル、フォルダは識別しない)


もう目も当てられません・・・

つーことで、「Webクリップしたソースコードならそのまま使えるだろ!」&「Webに置いときゃ誰が見るかもね!」と思った次第。

どこまで続くか分からないし、実際スクリプト書いてる最中にチマチマとブログにメモするの?って疑問はありますが、とりあえず続けてみます!


リネーム


ほんでは、さっそく一つ。

巷で大流行のAlfred拡張で使う予定の、リネームルーチン。

連番とかはつけてないので、必要に応じて変えてください。

拡張子は保護しますが、フォルダ名がファイル名まがいな記述("エロフォルダ.jpg"とか)だとエラー。(理由分からず)

あと二重拡張子も無視。.tar.gzとか、うちのHDDに入ってない無いものは興味なし。



on rename(new_name)
tell application "Finder"
repeat with select_item in (selection as list)
set file_path to select_item as text
if file_path contains "." then --ファイルのとき
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to "." --二重拡張子は無視
set item_ext to text item 2 of file_path
set AppleScript's text item delimiters to oldDelim
set name of select_item to new_name & "." & item_ext
delay 0.05 --タマに重複することがある(うちだけ?)
else --フォルダのとき
set name of select_item to new_name
delay 0.05 --タマに重複することがある(うちだけ?)
end if
end repeat
end tell
end rename

おお、割と見れる感じに整いますね。

ただ、色が・・・(´・ω・`) まあ、いいか。

これでEvernoteにもクリップ出来てることでしょう。(まだ未確認ですが)

こういうの、サクッとブログに上げるスクリプトも欲しいですねぇ。

2011年8月12日金曜日

お洒落ランチャAlfredにスクリプト連携!!さっそくタイマー作ってみたよ!

「Alfredというキーボードランチャで面白いことが出来るよ!!」と、Twitterで@syunkuroさんに教えてもらいました。

Macに数多くあるランチャの中でも、軍を抜いたオシャレ度でのAlfred。

そのAlfredに、スクリプトと連携できる機能が実装されています。(有料パッケージのみ)

主には公式synkuroさんのブログを見ていただくとして、ザックリ説明するとAlfredからスクリプトの変数を直接投げられるという、なんとも面白そうな機能。

まだアップデートには出てきませんが、公式からver.0.9.9をダウンロードし、Powerpackを購入すると使えます。

そんなわけで、僕も一つ作ってみました。


追記[110813]

少し編集したので新しい方に置き換えました。

beep音をコメントアウト、代わりにGrowlを追加。

初回は音がならないので、実行後に

システム環境設定→Growl→アプリケーション→カップ麺タイマー

から音設定してください。

「カップ麺なんざbeep音で十分」って人はbeepのコメントアウト外して下さい。

まあ・・・あんまり変わってないけどね(´・ω・`)


カップ麺タイマー


はい、名前のとおり、ただのタイマーです。

ともかく下のリンクからレッツダウンロード!

カップ麺タイマー


1


ダウンロードしたら、AlfredのExtension右隅にD&D。

これだけで使えるようになります。便利ですね。

使いかたは中身にも書いていますが、一応ここでも説明。



  1. Alfredで"timer"とタイプし、"カップ麺タイマー"が一段目にあることを確認して、return。(デフォルト設定)

  2. 半角スペース空くので、そのままタイマー時間(分)を入力。

  3. 時間がきたらビープ音が3回鳴るよ!やったね!!

  4. ちまたで噂のポロモード(?)にもいいかもね!!

  5. 以上!!!!(`・ω・´)


「・・・は?」と思われるでしょうが、これでも色々と頑張ったんです。

本当はまだほんの少しマシハズだったんですけど、 僕には荷が重かった・・・

散々あれやこれやと足掻いた挙句、僕の力ではAlfredを生かせずこんな形になってしまいましたとさ(´・ω・`)

とまあ僕は散々だったんですが、使いかたによってはかなり便利な機能なのは間違いないですし、オシャレなマカーはぜひ遊んでもらいたいです。

本家のブログには既にいくつかのスクリプトが置いてありますし、みんなで公開しあって便利なランチャに仕上げましょう!


実はも一個作った!!


そう、ホントはこのスクリプト、ポロモード仕様にしたかったんです。

時間設定して、総時間とかも出てみたいな、ステキ拡張になる予定だったんです。

まあ僕はポロモードとか分かんないので、夜中にダラダラと続ける惰性PCの警告に使うつもりだったんです。

それがなぜカップ麺タイマーに・・・( ´Д`)=3

というのもなんですので、残骸を残しておきます。(一応動きます。)

Inertia Timer - 惰性タイマー

こちらはアプリケーションなので、単独で動きます。普通に実行してもらえば大丈夫。

使い勝手はこっちのが使いやすいかもしれません。(ダイアログ出るし)

ポロモードとかで真面目に使う人は間違いなくコッチのはず。


使いかたを説明するまでも無いアプリですが、一応。


2


起動するとタイマー時間を尋ねるダイアログが出るので、入力。


3


時間が経つと、ビープ音とともにダイアログが出ます。

終了するなら"OK"、延長するなら"never"。


4


延長を選んだ場合、再び出てきたダイアログにタイマー時間を入力。

以下エンドレスでリピート。


5


延長後のダイアログでは、総時間と繰り返し回数も吐きます。

ポロモードで頑張ってる人はヤル気が、深夜の惰性でPC触ってる人は明日への焦りがみなぎりますね。


ちょっとした注意点として、半角数字の自然数以外は受け付けません。(0は含まず)

黙って静かに終了するので、気づかないと延々作業するハメになります。

エラー吐いて欲しい場合は修正してください(´・ω・`)


Alfred拡張を作ってみて


少し、作成後の小言を。

ナゼこれをAlfredでやらなかったか。

実際、ほぼ同じ作りにすればAlfredでも動きはします。

しかし、Alfredの拡張は当然Alfred上で動くので、スクリプト実行中はAlfredがかなり重くなるんですね・・・

対策として、Alfredにはスクリプトをバックグラウンドで実行させるオプションもあります。(現にカップ麺タイマーはバックグラウンド動作)

しかししかしそうすると、ダイアログは出せなくなります。

・・・という感じでジレンマに陥り、残念な結果になってしまいました。。。

結局、今回のAlfred拡張には向いてない動作ということで、アプリになった、と。

そのほかにも、Alfredでやる意味(=キーボードランチャで引数を渡す)を考えると、中々適切なものが見つからず、といった具合。

他の手順のほうが早いようでは意味が無いですしね。意外と作業を選びます。その分考えるのがすごくおもしろい。

作るのは簡単だけど、奥が深いなーと思いました。


最後の最後に宣伝


よかったら使ってね!「この辺おかしいよ?」とかガシガシ言ってくださいヽ( ・∀・)ノ

「こうすればAlfredで出来るよ!」みたいなアドバイス、ゼヒゼヒ教えてくださいm(_ _)m

そしてこっそりと、しょぼい自作アイコンを差し替えてくれる方大募集です(´・ω・`)

2011年8月6日土曜日

iTunesのスマートプレイリストが出先で最強な件

大分今更なTipsですが自分的にかなり大当たりだったのでメモ。


みなさんiTunesは使っていますか?

iPhoneやiPodを持ってる人は、まず使ってると思います。

僕はiPhoneのiPodアプリで毎日音楽を聞いてるので、お世話になりっぱなしです。

普段は適当な音楽をかけっぱなしなんですが、ここ最近は遠出することが多く、iPodアプリにお世話になる時間も長いので、割と意識して選曲してます。

そうなってくると、アーティストやアルバム単位ではなく、自分のお気に入り集を作りたくなってきます。

朝聞きたい曲、みんなに聞かせたい曲、カラオケで歌いたい曲などなど。

そんな曲に出会ったとき、頭の隅に覚えたり、メモしなくても、一発で振り分けする方法を大発見しました!!!ババーン!!ドヤッ (というか今更気付いた)


スマートプレイリストはiPodアプリのための機能でござった


結論を言うとスマートプレイリストを使うわけです。

「スマートプレイリスト?なんぞそれ?」という人にザックリ説明すると、再生回数や追加した日などから自分で条件を作って、あとは自動で曲を割り振ってくれるという、なんとも便利な機能。


これ、なんとiPodアプリでも動くんですよ。

外でiPodで曲を聞いてて、条件を満たした瞬間、勝手に割り振られてるんです。

ね?知らなったでしょ?( ´_ゝ`) (え・・・知らなかったの僕だけ・・・?)


レートで最大5つのスマートプレイリスト


とは言っても、iPodアプリはiTunesとは違って、曲情報を編集とかできません。

「コメントに"なんちゃら"が入った曲は"どこそこ"に移動」とかは無理。難しすぎる。

唯一編集できる情報、それはレート。

あんまり見る機会は無いと思いますが、こんなページで編集できます。


1000000484


1000000485


設定もちょー簡単


スマートプレイリストでこれを作る。


1000000486


終了。最大で5つまで。

あとは「レート5つはカラオケ用」とか自分ルールを作るだけ。

iPodアプリで「お、これいいな」と思ったら、5段階のレートをポチッとタップ。

「ん・・・、やっぱ違うな」と思ったら、レート外すだけ。

超絶便利っす。うーんもっと早くから気付いとくんだった・・・