ページ

ラベル Snow Leopard の投稿を表示しています。 すべての投稿を表示
ラベル Snow Leopard の投稿を表示しています。 すべての投稿を表示

2009年11月10日火曜日

Snow Leopard - Sudden Termination

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

Snow Leopard から Sudden Termination(即時終了) が追加された。この仕組みを使うとシステム終了(シャットダウン)にかかる時間を短縮することができる。

Sudden Termination の仕組み

アプリケーション毎に Sudden Termination(即時終了)を有効・無効にすることができて、有効の場合はシャットダウン時にシステムが通常の終了手順をすっ飛ばしてそのアプリケーションを強制終了することができる。多くのアプリケーションが Sudden Termination を有効にしていれば、結果としてシャットダウン時間を短縮することができる。

Sudden Termination の有効・無効はアプリケーションが実行途中に変更することができる。例えば起動時は有効にしておいて、ファイルの書き込みなどが必要な場合は一旦無効にし、書き出しが終わったらまた有効にする、といった使い方もできる。

Sudden Termination は NSProcessInfo のメソッドで行う。
enableSuddenTermination
disableSuddenTermination

アプリケーション毎に Sudden Termination Counter というカウンタが用意されていて、上記メソッドを呼出すことでこのカウンタを増減させることができる。enableSuddenTermination を呼ぶとカウンタから1を減らし、disableSuddenTermination を呼ぶとカウントを1増やす。カウンタが0の時、そのアプリケーションはシステムに対して Sudden Termination を許可する。

このカウンタは起動時に 1(つまり即時終了は無効)となっているが Info.plist ファイルに NSSupportsSuddenTermination=YES を指定しておくと、起動直後からカウンタ0(Sudden Termination が有効)とすることができる。

いくつかの Application Kit のクラスでは Sudden Termination の制御を行っている。

  • NSUserDefaults - デフォルト値がディスクへ書き出される時に Sudden Termination を一時的に無効にする
  • NSDocument - ドキュメントに変更が加えられている場合、ディスクへ書き出される時に Sudden Termination を無効にする


参考情報:Mac Dev Center: NSProcessInfo Class Reference


こんな仕組みなのでアプリ開発者が積極的に協力して Sudden Termination を有効にしないと効果は無い。



なお Sudden Termination 有効のアプリに対しては SIGKILL シグナルが送られるようだ。


WIKIPEDIA の SIGKILL にも情報が出ていた。
SIGKILL - Wikipedia, the free encyclopedia
以下、引用。
To speed the computer shutdown procedure, Mac OS X 10.6, aka Snow Leopard, will send SIGKILL to applications that have marked themselves "clean" resulting in faster shutdown times with, presumably, no ill effects.[1]


アクティビティモニタで確認する

アプリケーション毎の Sudden Termination の有効・無効はアクティビティモニタで確認できる。標準では項目が出ていないので表示メニューで「即時終了」を表示させる。

アプリ毎に状態が表示される。

試しにテキストエディタを立ち上げてみる。初期状態は即時終了が「はい」となっている。


新規にテキストを作成すると、即時終了が「いいえ」となった。


テキストを保存してしばらくすると即時終了がまた「はい」となった。

テキストエディタは NSDocument を使った典型的なアプリケーションと思われるのでドキュメントに書かれていたような動きになるのだろう。


参考情報

Mac OS X Developer Release Note
Sudden Termination - Fast Killing Of Applications (Updated since November seed)
Snow Leopard のリリースノートに説明がある。

Sudden Termination - Drift Diary13
アクティビティモニタで確認できることはこのサイトで知った。

Mac Dev Center: Preference Pane Programming Guide: Updating Preference Panes for Snow Leopard and Beyond
Preferenece Pane のドキュメントだが Sudden Termiation についての説明がある。

2009年9月29日火曜日

プチアプリ制作 - SafariのURLから HTMLの<A>タグを生成する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク




ブログを書いていて他ページのリンクを埋め込むときにいつも手で <A>タグを書いている。いい加減面倒になってきたので Safariの URLをドラッグ&ドロップするとそのページの <A>タグを生成するプチアプリを(ボケ防止も兼ねて)作ってみた。



動作イメージ:
 (1) Safari の URLをドラッグしてアプリへ落とす
 (2) URLとタイトルが埋め込まれた <A>タグが、テキストボックスに生成される

後はこれをコピーして使う。

ソースコード:AHREFGenerator-01.zip


小一時間で作成したので最小限動くだけのコード。URLを受け取るビューのコードを以下に掲載する。

DropURL.m

まずペーストボードタイプの登録。

- (void)awakeFromNib
{
[self registerForDraggedTypes:[NSArray arrayWithObjects:
    @"WebURLsWithTitlesPboardType",nil]];

}


続いてドロップの受け入れ許可。
- (NSDragOperation)draggingEntered:(id )sender {
NSPasteboard *pb = [sender draggingPasteboard];
NSArray* pb_types = [pb types];

if ([pb_types containsObject:@"WebURLsWithTitlesPboardType"]) {
return NSDragOperationCopy;
}
return NSDragOperationNone;
}


最後に<A>タグの生成。
- (BOOL)performDragOperation:(id < NSDraggingInfo >)sender
{
NSPasteboard* pb = [sender draggingPasteboard];
NSArray* pb_types = [pb types];

if ([pb_types containsObject:@"WebURLsWithTitlesPboardType"]) {
NSArray *props = [pb propertyListForType:@"WebURLsWithTitlesPboardType"];
NSString* url = [[props objectAtIndex:0] objectAtIndex:0];
NSString* title = [[props objectAtIndex:1] objectAtIndex:0];

NSString* str = [NSString stringWithFormat:
@"%@", url, title];
[text_view setString:str];
[text_view setSelectedRange:NSMakeRange(0, [str length])];

}  
return YES;
}


Safari からわたってくるペーストボードに WebURLsWithTitlesPboardType というものがあり、ここから URLと合わせてページのタイトル文字列を取得することができる。配列の入れ子となっていてこんな感じで URL とタイトルが入っている。
2009-09-29 22:54:17.723 AHREFGenerator[6530:10b] (
(
"http://www.apple.com/ipodtouch/"
),
(
"Apple - iPod touch - Music, games, apps, and more on a great iPod."
)
)


ここからindexの決めうちでURLとタイトルを取り出す。
NSString* url = [[props objectAtIndex:0] objectAtIndex:0];
NSString* title = [[props objectAtIndex:1] objectAtIndex:0];


参考:CocoaDev: WebURLsWithTitlesPboardType
#早速活用できた ;->

- - - -
NSPasteboard は Snow Leopard で結構手が入っている。新規メソッドも追加されているようだ。
Mac Dev Center: NSPasteboard Class Reference

こんな感じで大半のメソッドが 10.5以前と、10.6以降の区別がされている。


Overview には 10.6 からの新機能が紹介されている。複数のアイテムを含むことができるようになった(らしい)。


またペーストボードに対するデータの書き込みと読み出しのインターフェイスがプロトコルとして定義されることで様々なクラスをペーストボードで直接扱えるようになったようだ。このあたりは別の機会に検証してみたい。

Mac Dev Center: NSPasteboardWriting Protocol Reference Protocol Reference
Mac Dev Center: NSPasteboardReading Protocol Reference Protocol Reference