Tue, 01 Feb 2011
スケジュールを組んでMacをスリープから復帰させる方法を知ったのはつい最近だ
朝は目覚まし時計なんかじゃなく優しい音楽で目覚めたい。iTunes.appの自動運転について知識は得た。でもスケジュールを組んでMacをスリープから復帰させる方法が分らなかった。つい最近その方法を知った。恥しいです。
System PreferenceからEnergy Saver、Scheduleってボタンあるやん。でも、これって簡単なんしか作れんやんなあ…以下は、iTunes.app用に作ったAppleScriptです。備忘のため。
set somePlayList to {"クラシック-ドイツ-古典-ハイドン", "クラシック-古典以前-ヘンデル・テレマン", "クラシック-フランス-古典以前-クープラン・ラモー", "クラシック-イタリア", "クラシック-フランス-古典以前"}
set aPlayList to some item of somePlayList
tell application "iTunes"
set aOldSound to sound volume
set sound volume to aOldSound - 40
set aCount to count tracks of playlist aPlayList
set aRandomNum to random number from 1 to aCount
set aTrackNum to track number of track aRandomNum of playlist aPlayList
play track (aRandomNum - aTrackNum + 1) of playlist aPlayList
reveal current track
delay 10
set sound volume to aOldSound - 20
delay 10
set sound volume to aOldSound
end tell
いくつかのプレイリストからランダムに選び、音量を下げ、プレイリストの曲数の範囲でランダムな数字を作り、プレイリストの該当する曲を選択する。その曲がそのアルバムの何曲目か調べ、アルバムの途中でなく最初から再生するようにする。そのままだと再生はするけれどブラウザ上で表示してくれないので、revealする。音量を戻していく。最後まで分らなかったのは再生中の曲をrevealする箇所。
オレオレ版taskpaper.vim
taskpaper.vimは、HogBaySoftwareが提唱しているtodo-listのフォーマットをvimで扱うためのプラグインです。taskpaperのフォーマットを扱うプラグインの類いはBBEdit向けほか、リッチなものから簡素なものまで、有料なものだってあるのです。
元はただの書式付きテキストファイルなんで、有料の専用ソフトを買うのも何だかなーと思って、自分はvimで使っています。いや、有料のソフトのほうがリッチなんですけど。で、このvim用プラグインは簡素なほうなので、拡張してみました。ちょうべんり。
"setlocal iskeyword+=@-@
setlocal iskeyword+=@-@,(
taskpaperはタスクに@due(20110202)
みたいに自由にタグを付けて管理できるのですが、元のままだと例のようなタグは括弧の手前までしか認識してくれないので。
function! s:ToggleDoneWithRepeat()
let line = getline(".")
if (line =~ '^\s*- ')
let repl = line
if (line =~ '@done')
let repl = substitute(line, "@done\(.*\)", "", "g")
echo "undone!"
call setline(".", repl)
else
let today = strftime("%Y-%m-%d", localtime())
let done_str = " @done(" . today . ")"
let aUserInputDate = input("Input next due date(yyyymmdd): ")
let next_due_str = " @due(" . aUserInputDate . ")"
let repl = substitute(line, "@due\(.*\)", "", "g")
let repl = substitute(repl, "$", next_due_str , "g")
let repl2 = substitute(line, "$", done_str , "g")
echo "done, archive and repeat!"
call setline(".", repl)
call setline("$", repl2)
endif
else
echo "not a task."
endif
endfunction
" toggle @done context tag on a task and archive
function! s:ToggleDoneAndArchive()
let line = getline(".")
if (line =~ '^\s*- ')
let repl = line
if (line =~ '@done')
let repl = substitute(line, "@done\(.*\)", "", "g")
echo "undone!"
call setline(".", repl)
else
let today = strftime("%Y-%m-%d", localtime())
let done_str = " @done(" . today . ")"
let repl = substitute(line, "$", done_str , "g")
echo "done and Archive!"
call setline(".", "")
call setline("$", repl)
endif
else
echo "not a task."
endif
endfunction
元のプラグインからコピペして、ファンクションを二つ追加しました。最初のはdoneにする際に対話的にdue dateを入力させ次回用のタスクにタグとして付ける・完了したタスクはファイルのお尻に移動するところまで一発で実行するもの。次のは一発でタスクを完了させてファイルのお尻に移動するだけのもの。後追加しなきゃいけないのは呼び出し周辺で、これはプラグインのソースを見ればすぐ分る。キーバインドはお好みで。
"map <buffer> <silent> <LocalLeader>tk mA <Plug>ToggleDone ddGp 'A
"map <buffer> <silent> <LocalLeader>tr mA yy p <Plug>ToggleDone 'A
最初はすぐ上のような感じで簡易に汚ないことをしていて、別に問題無かったのですが、これだとファインクションが出してるメッセージが消えちゃうしということで、ちゃんと作ろうと思ったのです。ちなみに、ウインドウズでしか試していません。