無為空間
むいむい(´ω`*)
Entries
2/25に注文、3/2到着。
構成は
- 2.3GHzクアッドコアIntel Core i7
- 8GB 1333MHz DDR3 SDRAM - 2x4GB
- MacBook Pro 15-inch Hi-Res Antiglare Widescreen Display
今回初めてTime Machineからの環境移行を試したのだけれど、これはちゃんと移行前のバックアップも参照できるようになるのね。便利便利。
で、移行後ちょろちょろっと触ってみたわけだが、さすがにEarly 2006からLate 2008に変えた時のような、「Firefoxの起動に掛かる時間が15バウンドから2バウンドに!」というほどの劇的な違いは感じられなかった。
なんか重い処理でも流さないと違いが分かりそうにないので、とりあえずXBenchで前の環境と比較して(0゜・∀・)することにする。
まずは2年半ほど使ったLate 2008のスコア。

次に、そのLate 2008の環境を引き継いだEarly 2011のスコア。

うーん、わくわくする差だなー……て
Disk Test 64.27
Late 2008の、なんだ、これ。
Early 2011と比べて読み込みで2倍、書き込みで9倍遅いときた。
もとからこんなだっけ……
Mac OS X 10.6.5でホームフォルダにApplicationsフォルダを作ったら

アプリケーションフォルダのアイコンが付いた。

フォルダをデスクトップにドロップしたら、普通のアイコンに変わった。

デスクトップからホームフォルダに戻したら、またアプリケーションフォルダのアイコンに戻った。

もう一度フォルダをデスクトップにドロップし、新たにApplicationsフォルダを作ってみたところ、新しく作った方にはアプリケーションフォルダのアイコンは付かなかった。

「ホームフォルダに作られたApplicationsフォルダは、最初に作られたものに限り、個人用のアプリケーションフォルダとして認識される」ということ?

Mac OS X 10.6.2での実行結果。
JPEGからBMPへの変換は成功するが、BMPからPNGへの変換は失敗する。
うーん、10.5の頃は問題なく出来ていたと思うのだが……
Apple Discussions - Automator: Change BMP to JPEG files ...
Looks like a Snow bug, see the comments here. It was working for one guy on Leopard, but Snow broke it!
やっぱそうだよねぇ。
Snow LeopardでGrand Central Dispatchが導入され、はたしてNSOperationQueueはどうなったのか。
Mac Dev Center: NSOperationQueue ClassReference
In Mac OS X v10.6 and later, operation queues use the libdispatch library (also known as Grand Central Dispatch) to initiate the execution of their operations.
「Mac OS X 10.6以降のNSOperationQueueの中身はGrand Central Dispatchである」となるほど。
As a result, operations are always executed on a separate thread, regardless of whether they are designated as concurrent or non-concurrent operations.
「その結果、オペレーションはコンカレントであろうとなかろうと常に別のスレッドで実行されることになった」ってまじで。
ということは、以前書いたコンカレントオペレーション開始スレッド調査用コードをMac OS X 10.6.1で実行すると……
<NSThread: 0x10010aeb0>{name = (null), num = 1} main <NSThread: 0x10010d650>{name = (null), num = 2} (1)Concurrent start <NSThread: 0x100305e00>{name = (null), num = 3} (1)Concurrent thread -> <NSThread: 0x10010d650>{name = (null), num = 2} (2)Noncurrent -> <NSThread: 0x100305e00>{name = (null), num = 3} (1)Concurrent thread <- <NSThread: 0x10010d650>{name = (null), num = 2} (2)Noncurrent main <NSThread: 0x10010d650>{name = (null), num = 2} (2)Noncurrent <- <NSThread: 0x10010e650>{name = (null), num = 4} (3)Concurrent start <NSThread: 0x100305e00>{name = (null), num = 5} (3)Concurrent thread -> <NSThread: 0x100305e00>{name = (null), num = 5} (3)Concurrent thread <- <NSThread: 0x10010d650>{name = (null), num = 2} (4)Concurrent start <NSThread: 0x10010eb60>{name = (null), num = 6} (4)Concurrent thread -> <NSThread: 0x10010d650>{name = (null), num = 2} (5)Noncurrent -> <NSThread: 0x10010eb60>{name = (null), num = 6} (4)Concurrent thread <- <NSThread: 0x10010d650>{name = (null), num = 2} (5)Noncurrent main <NSThread: 0x10010d650>{name = (null), num = 2} (5)Noncurrent <- <NSThread: 0x10010e650>{name = (null), num = 4} (6)Concurrent start <NSThread: 0x100306250>{name = (null), num = 7} (6)Concurrent thread ->
なるほど、Mac OS X 10.5.6では Concurrent start は常に「1つ前のオペレーションが終わったスレッド」で行われていたが、Mac OS X 10.6.1では常に「1つ前のオペレーションが終わったスレッド以外」で行われている。
これは「startがメインスレッドから呼ばれることを前提に実装」していた場合などに問題になるかもしれない。
あとは……依存関係を持つオペレーションのキャンセルについても何か変更があるようだ。
In Mac OS X v10.6 and later, if an operation is in a queue but waiting on unfinished dependent operations, those operations are subsequently ignored.
「Mac OS X 10.6以降では、依存するオペレーションが完了するのを待っているオペレーションをキャンセルした場合、その依存関係は無視して処理が進められる」
ほう。
#import <Foundation/Foundation.h> @interface MyOperation : NSOperation { int number; } @property int number; @end @implementation MyOperation @synthesize number; - (void)start { NSLog(@"(%d) start", self.number); [super start]; } - (void)main { [NSThread sleepForTimeInterval:0.4]; NSLog(@"(%d) end main", self.number); } - (void)cancel { NSLog(@"(%d) cancel", self.number); [super cancel]; } @end int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; MyOperation *ops[3]; for (int i = 0; i < 3; i++) { ops[i] = [[[MyOperation alloc] init] autorelease]; ops[i].number = i; } [ops[1] addDependency:ops[0]]; // (1)は(0)に依存する [ops[2] addDependency:ops[1]]; // (2)は(1)に依存する for (int i = 0; i < 3; i++) { [queue addOperation:ops[i]]; } [NSThread sleepForTimeInterval:0.1]; [ops[1] cancel]; // (1)をキャンセル [queue waitUntilAllOperationsAreFinished]; [pool drain]; }
Mac OS X 10.5.8でこれを実行すると、たとえ(1)をキャンセルしても、(1)が依存する(0)が終わるまで(2)は実行されない 。
.060 Hoge[880:1003] (0) start .160 Hoge[880:10b] (1) cancel .461 Hoge[880:1003] (0) end main .463 Hoge[880:1103] (1) start .464 Hoge[880:1003] (2) start .865 Hoge[880:1003] (2) end main
Mac OS X 10.6.1で実行すると、(1)をキャンセルした時点で(2)が実行される 。
.076 Hoge[2879:1303] (0) start .176 Hoge[2879:a0f] (1) cancel .176 Hoge[2879:1503] (1) start .177 Hoge[2879:2c03] (2) start .479 Hoge[2879:1303] (0) end main .578 Hoge[2879:2c03] (2) end main
「(2)は本当は(0)と(1)に依存しているんだけど、(1)が(0)に依存しているから、(1)に依存していれば(2)は(0)に依存しなくてもいいよね( ´∀`)」とか考えて実装していたらやばいかな。
Snow Leopard所感
タグ: MacMBP Late 2008をLeopardからSnow Leopardにアップデート。
うーん、細かなところで使い勝手が合わない……
Finderのサムネイル表示は速くなった。特にNASにあるGIFファイル。
アイコンのサイズ変更が容易になり、Quick Lookよりも手早くファイルの概要を確認できるようになったのは良い。
カラム表示されたFinderウィンドウで「フォルダをハイライトさせて『すべてを選択(Cmd+A)』」したときの挙動が変わった。
Leopardでは「ハイライトされているフォルダ内の全ての項目が選択」されるが、Snow Leopardでは「フォルダをクリックしてハイライトさせた場合を除き、ハイライトされているフォルダを含むフォルダ内の全ての項目が選択」される。
この挙動は「Stackにあるダウンロードフォルダを開いて中身をすべてゴミ箱に捨てよう」というときに鬱陶しい。
(ダウンロードフォルダ内の全ファイルを選択したいのに、ホームフォルダ内の全フォルダが選択される)
Exposéのウィンドウ配置がグリッド状になり、大きなウィンドウは小さく、小さなウィンドウは大きく表示するようになった。
正直、見づらい。


下の2つのウィンドウ、場所取りすぎだろう('A`)
「スリープ」や「スクリーンセーバー」解除後にパスワードを要求する設定が、「ディスプレイのスリープ」にも適用されるようになった。
処理を流したまま「離籍する」か「離籍はしないが画面を暗くする」かで「スクリーンセーバー」と「ディスプレイのスリープ」を使い分けていた自分にとってこの変更は嬉しくない。
「規定時間以上のスリープから復帰したときのみパスワードを要求する」ように設定ができるようになったのは良いが……
64ビットアプリケーションではATOK2006が使えない。
うん、まあこれはいつまでATOK2006引っ張って使ってるんだという話なので、ATOK2009を入れる。
そのATOK2009だが、文字変換中にCtrl+数字を押すと、Leopardでは「辞書セット指定変換ショートカット」が機能するが、Snow LeopardではSpacesの「特定のスペースへの切り替え」が優先される。
辞書セット指定変換については、Ctrl+1?4ではなく、F1?F4を使えということか。
Xcodeは入れ直し。
iPhone SDKを入れる場合、まずSnow LeopardのInstall DVDでXcodeを入れ、その後でSnow Leopard用のiPhone SDKを入れる。
Leopardの時にMacPortsで入れた諸々は、動くものもあるにはある。
が、多分完全に入れ直した方が(一度uninstall --follow-dependents installed
してinstall
し直した方が)すっきりするだろう。