2012年4月25日水曜日

[Macアプリ] Pause Control -終了コマンドをスケジュールする-

001

久しぶりにちっさいアプリ作ってみました。
シャットダウン、再起動、スリープ、スクリーンセーバーを時間指定して実行します。
これがあれば「あと10分でネットやめる!」とか「12時に寝なきゃ・・・」ってとき、強制的にやめることができます。
アラートやリマインダー程度じゃネットやめられないぐーたら人間にもってこいですね。

本体



何はともあれなアプリ本体。

Pause Control

使いかた



ヘルプ用意してるので実行すれば分かるはず・・・だけど、一応書いておきます。

指定できる時間の書式は、時刻(◯◯:◯◯)と時間(◯◯秒/分/時)です。
文章で説明しづらいので、下の例を見てなんとなく感じ取ってください。

時刻


sl,11:00 と入力すると、11:00にスリープ。
sd,20:00 と入力すると、20:00にシャットダウン。
re,12:55 と入力すると、12:55に再起動。
ss,23:30 と入力すると、23:30にスクリーンセーバー。

時刻は24時間表記です。
間違えて今より前の時間を入れると無視されちゃうので注意。

時間


sl,10s と入力すると、10秒後にスリープ。
sd,30m と入力すると、30分後にシャットダウン。
re,10h と入力すると、10時間後に再起動。
ss,0.5h と入力すると、0.5時間(30分)後にスクリーンセーバー。

まとめると簡単。
なんでこれが文章で書けないんだ、文章力つけたい・・・(´・ω・`)

また、最初だけAdminパスワードを聞いてきますが、次回実行からはパスします。
入力ミスった場合は・・・、もう一回ダウンロードし直してください。

おまけ



細かい機能とかメンドクサすぎなので、簡単に使えるオプションを2つ足してみました。

スリープをkillする



映画とか観てると、いいシーンのときに限ってスリープしたりします。
あれはひどい、本当にひどい。涙とか吹き飛びます。
映画観てる間は勝手にスリープすんな!ってことで、スリープをkillする機能です。
プレーヤーによっては再生中はちゃんとスリープ解除してくれます。
VLCとかMPlayer Xはやってるはず。


slkill,1h で、1時間スリープしなくなります。
この辺の指定は最初のほうに出した例と同じ。映画なら3h指定すれば十分かな。
一応、slkill,10:00 みたいな書き方もできます。
あんま使う場面思いつかないけど・・・

slkill だけ書いても、永久にkillはできません。
そういう需要は「システム環境設定→省エネルギー」から行なってください。

スリープモードを変更する



Macには

  • セーフスリープ

  • スリープ

  • ディープスリープ


の3つのスリープモードがあります。
消費電力とかメモリの解放とかバッテリーとかが関係してくるみたいです。
どれもメリットはあるので、ちょこちょこ切り替えられたら便利かなと。
それぞれの違いはこちらが分かりやすいので参考に。

スリープに関する知識まとめ - ザリガニが見ていた...。
今回9割コピペさせてもらいました


slmode でスリープモードを変更します。
ダイアログが出てくるので、変更したいモードをポチってください。

実はこのコマンドも実行する時間を指定できるけど、まず使うことはないと思います。(単に分岐処理がめんどかったので放置してるだけ)

あとがき



しょうじき言うとどれもあんま使うことない!!\(^o^)/
しかも1時間後の指定とかテストすらしてないよ!だってメンドイんだもん!!
まあひさしぶりだし練習ってことで・・・

あ、前半のダイアログの分岐が(個人的に)面白い表現な気がします。
あんまり他のソースコードで見ないような。まあ初心者コードなんだけど。
その場限りのrepeat処理に限定すれば、シンプルで使いやすいかな?と思います。

コード



ではでは今回のコードと参考にしたサイト様など。ありがとうございました。
しかしあいかわらず冗長ですね、綺麗に書けるようになりたい・・・


property pass : ""

set binput to "HELP:クエリについて"
repeat until (binput is not "HELP:クエリについて")
set input to display dialog "クエリを入力してください。" default answer "" buttons {"OK", "キャンセル", "HELP:クエリについて"} default button 1
set binput to button returned of input
set tinput to text returned of input

if binput = "HELP:クエリについて" then
set help1 to "クエリは【動作,時間】で表記します。
(時間は省略可)

・動作
 sh:シャットダウン
 re:再起動
 sl:スリープ
 ss:スクリーンセーバー
 slkill:スリープしなくなる
 slmode:スリープモード変更

・時間
 ◯◯s/m/h (s=秒、m=分,h=時)
 ◯◯:◯◯

詳細
http://www.hw2-suito.com/archives/579
"
my tellhelp(help1)
else if tinput contains "," then
set que to text2list(tinput, ",")
set que1 to text item 1 of que
set que2 to text item 2 of que
else
set que1 to tinput
set que2 to "0s"
end if
end repeat

if pass = "" then
display dialog "ユーザーパスワードを入力してください" default answer ""
set pass to text returned of result
end if

set pmlog to do shell script "pmset -g"
set pmloglist to my text2list(pmlog, return)
-- スリープモードの確認
set slmode to last item of characters of text item 5 of pmloglist as string
if slmode = "3" then
set slmode to "セーフスリープ"
else if slmode = "0" then
set slmode to "スリープ"
else
set slmode to "ディープスリープ"
end if
-- スリープ時間の格納
set sltime to text item 10 of pmloglist as string
set sltimelist to my text2list(sltime, " ")
set sltime to last text item of sltimelist
-- ディスプレイスリープ時間の格納
set dsltime to text item 15 of pmloglist as string
set dsltimelist to my text2list(dsltime, " ")
set dsltime to last text item of dsltimelist

--動作
if que1 = "slkill" then
do shell script "pmset -a sleep 0 displaysleep 0" password pass with administrator privileges
end if

set dtime to my waittime(que2)
delay dtime

if que1 = "slmode" then
set rebutton to ""
display dialog "現在のスリープモードは「" & slmode & "」です。" & return & "変更するモードを選択してください。" buttons {"スリープ", "ディープスリープ", "セーフスリープ"} default button 1
set rebutton to button returned of result
if rebutton = "スリープ" then
set slmodecode to "pmset -a hibernatemode 0"
do shell script slmodecode password pass with administrator privileges
display dialog "スリープに変更しました。" buttons {"はい"} default button 1
else if rebutton = "ディープスリープ" then
set slmodecode to "pmset -a hibernatemode 25"
do shell script slmodecode password pass with administrator privileges
display dialog "ディープスリープに変更しました。" buttons {"はい"} default button 1
else if rebutton = "セーフスリープ" then
set slmodecode to "pmset -a hibernatemode 3"
do shell script slmodecode password pass with administrator privileges
display dialog "セーフスリープに変更しました。" buttons {"はい"} default button 1
end if

else if que1 = "sd" then
tell application "Finder" to shut down
else if que1 = "re" then
tell application "Finder" to restart
else if que1 = "sl" then
do shell script "pmset sleepnow"
else if que1 = "ss" then
tell application "Finder"
open application file "/System/Library/Frameworks/ScreenSaver.framework/Resources/ScreenSaverEngine.app" as POSIX file
end tell
--スリープの設定を戻す
else if que1 = "slkill" then
do shell script "pmset -a sleep " & sltime & " displaysleep " & dsltime password pass with administrator privileges
end if

(*
9割参考にした記事、ありがとうございます

スリープに関する知識まとめ - ザリガニが見ていた...。
http://d.hatena.ne.jp/zariganitosh/20110706/about_sleep

スリープ可能⇔不可能をすばやく切り替えるAppleScript『Sleep Enable/Disable Switcher』 - Macの手書き説明書
http://veadardiary.blog29.fc2.com/blog-entry-2952.html
*)


--hms表記をs単位(秒)に変換、◯◯:◯◯表記を現時刻から引き算した秒に変換
on waittime(query)
if query contains ":" then
set time1 to text2list(query, ":")
set ctime to (do shell script "date '+%H:%M'")
set time2 to text2list(ctime, ":")
set timeh to (60 * ((item 1 of time2) - (item 1 of time1)))
set timem to (item 2 of time2) - (item 2 of time1)
set time3 to 60 * (timeh + timem)
else
set hms to last item of characters of query
set time3 to reverse of rest of reverse of characters of query as string
if hms = "h" then
set time3 to time3 * 3600
else if hms = "m" then
set time3 to time3 * 60
end if
end if
set time3 to time3 as number
end waittime

-- HELPテキストを表示
on tellhelp(disp)
display dialog disp buttons {"OK"} default button 1
end tellhelp

--DelTextをNewDelimで分割してリスト化
on text2list(DelText, NewDelim)
set LastDelim to AppleScript's text item delimiters
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
set AppleScript's text item delimiters to LastDelim
DelList
end text2list

0 件のコメント:

コメントを投稿