MacOSXで、Mail.appを英語環境で実行する方法

ふだん、日本語環境でMacを使っていても、特定のアプリケーションだけ、英語で実行したいということがあると思います。
システム環境設定→パーソナル→言語とテキストで英語環境にしてしまうと、すべてが英語で実行されてしまうので、現実的ではないですよね。

実は、10.4 Tigerまでは、Finderで、アプリケーションの.appを選択し、ファイル→情報を見るのパネルから、アプリごとの言語設定ができたのですが、10.5 Leopardからはその便利な機能が削除されてしまったようです。

今回、それと同じことを、コマンドラインから実行する方法を思い出したので、メモとして残しておきます。

ちなみに、思い出したのは、以下の記事からです。

Temporarily change system language via AppleScript - Mac OS X Hints

この記事の本文では、全体の言語環境を変更する方法について書かれていたのですが、以下のコメントに、特定のアプリケーションだけに適用する方法が示されています。

Instead of writing into the global domain, you could set the preference only for the specific application, then it will apply to that application only…

eg.
defaults write com.apple.mail AppleLanguages '("jp", "en-US")'

上記は、日本語環境にする例ですが、英語を前に持ってくれば、英語環境で実行することができます。
Mail.appを英語環境で実行したい場合、具体的には、ターミナル(Terminal.app)から、以下のコマンドを実行します。

defaults write com.apple.mail AppleLanguages "(en, ja)"

正しく設定されたかどうかを確認したい場合は、以下のコマンドで、内容を見ることができます。

defaults find AppleLanguages

...

Found 1 keys in domain 'com.apple.mail': {
    AppleLanguages =     (
        en,
        ja
    );
}

...

次回Mail.appを起動したときに、メニューが英語になっていれば、正しく設定されたことになります。

元に戻したい場合は、以下の通り実行し、その設定を削除します。

defaults delete com.apple.mail AppleLanguages

同じ悩みを持っていた方は、よろしければお試しください。

あと、iOSアプリ開発者の方は、すでに気付いているかもしれませんが。。。

NSUserDefaultsを使って、これと同じことを、iOSアプリから実行することができます。
その具体的な方法については、また後日説明したいと思います。

UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し

昨年、iOSの中で、アプリケーション同士が連携するためのしくみ - The iPhone Development Playgroundで、UIDocumentInteractionControllerを使ったアプリケーション間連携について簡単に説明しました。そのときに少し触れたとおり、SysStats MonitorSysStats Liteの間で、UIDocumentInteractionControllerを使った連携機能を追加しましたので、もう少し技術的な説明をしたいと思います。

処理の流れ

以下に、全体の流れを示します。

ここでは、以下の2つの目的で、UIDocumentInteractionControllerを使った連携を使用しています。

(1) SysStats Liteから、SysStats Monitorへのプロセスブックマークの移行

SysStats Liteで蓄積したプロセスブックマークを、SysStats Monitorで流用するための機能です。

(1-1) Send ユーザの操作により、UIDocumentInteractionController経由で、SysStats Monitorが自動的に起動され、プロセスブックマークデータを送られる。
そして、SysStats Monitor側のInboxと呼ばれるフォルダに、そのデータが保存される。
(1-2) Import ユーザの操作により、Inboxからブックマークデータを読み込み、現在のブックマークデータにインポートする。
(2) SysStats Monitorのプロセスブックマークを、Email経由で共有

異なるデバイスのSysStats Monitor間でプロセスブックマークを共有するための機能です。
例えば、iPhoneiPadを所有しているユーザの場合、iPhoneで蓄積したプロセスブックマークを、iPad側に取り込む(Import)ことができます。

(2-1) Export ユーザの操作により、Message UI Frameworkを使って、現在のブックマークデータ添付ファイルとするメールを作成する。
(2-2) Send Emailとして送信する。
(2-3) Send 受信側のデバイスで、Mail.appでEmailを受信し、添付ファイルを開く操作をすることで、SysStats Monitorにプロセスブックマークデータを送ることができる。
(1-1)と同様に、SysStats Monitorが自動起動され、Inboxフォルダに、そのデータが保存される。
(2-4) Import ユーザの操作により、Inboxからブックマークデータを読み込み、現在のブックマークデータにインポートする。

プロセスブックマークデータのUTI宣言

Appleは、データタイプの識別子のための構文として、UTI(uniform type identifiers)を定義しています。
UIDocumentInteractionControllerに、データタイプを認識させるためには、そのデータのUTIを宣言する必要があります。

参考ドキュメント

UTIに関しては、Uniform Type Identifiers Overviewを参照してください。
Info.plistの各項目の設定値については、Information Property List Key Referenceを参照してください。

SysStats MonitorのInfo.plistに、以下のような設定を行っています。

	<key>UTExportedTypeDeclarations</key>
	<array>
		<dict>
			<key>UTTypeIdentifier</key>
			<string>[プロセスブックマークのUTI]</string>
			<key>UTTypeDescription</key>
			<string>SysStatsMonitor&apos;s proprietary processbookmark format</string>
			<key>UTTypeConformsTo</key>
			<array>
				<string>public.item</string>
			</array>
			<key>UTTypeTagSpecification</key>
			<dict>
				<key>public.filename-extension</key>
				<array>
					<string>[プロセスブックマークの拡張子]</string>
				</array>
				<key>public.mime-type</key>
				<string>[プロセスブックマークのMIMEタイプ]</string>
			</dict>
		</dict>
	</array>
UTTypeIdentifier プロセスブックマークのUTIを指定しています。
UTTypeTagSpecification プロセスブックマークの拡張子MIMEタイプを指定しています。
UTTypeConformsTo UTIは、適合性(Conformance)に基づく階層構造の中に定義します。
プロセスブックマークは、SysStats Monitor独自のデータフォーマットなので、public.itemという、最上位階層を指定しています。
テキストファイルであるからといって、public.textを指定した場合、次で説明するLSItemContentTypesにpublic.textが指定されているすべてのアプリで開くことが可能となってしまうので、注意が必要です。

SysStats Monitorがプロセスブックマークを受取るための設定

SysStats MonitorのInfo.plistに、以下のような設定を行っています。

	<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeName</key>
			<string>SysStatsMonitor&apos;s proprietary processbookmark format</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>[プロセスブックマークのUTI]</string>
			</array>
		</dict>
	</array>

ここでのポイントは、LSItemContentTypesに、前述のUTTypeIdentifierにて指定した[プロセスブックマークのUTI]を指定しているところです。この設定によって、SysStats Monitorは、プロセスブックマークを受取ることができるようになります。

詳細は、Document Interaction Programming Topics for iOSの"Registering the File Types Your App Supports"を参照してください。

ドキュメントを送る側のコーディングイメージ

SysStats Liteの設定画面で、「SysStats Monitorへエクスポート」を選択すると、以下のような、ドキュメント送信先のアプリを選択するメニューが表示されます。

実際の処理は、UIDocumentInteractionControllerを使って以下のように記述されています。

    self.docController = [UIDocumentInteractionController interactionControllerWithURL:url];
    docController.delegate = self;
    BOOL isValid = [docController presentOpenInMenuFromRect:CGRectZero inView:self.tabBarController.view animated:YES];
    if (!isValid) {
        // 必要に応じてエラー処理(AlertPanel)
    }

メニューから、「SysStatsMon」が選択された後、UIDocumentInteractionControllerDelegateメソッドが呼び出されます。SysStats Liteでは、以下のように特に何もしていませんが、各タイミングで必要な処理があれば、それぞれに記述します。

#pragma mark UIDocumentInteractionControllerDelegate

- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {
    NSLog(@"!!!!! Sending to: %@", application);
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application {
    NSLog(@"!!!!! Sent to: %@", application);
}

- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller {
    self.docController = nil;
}

ドキュメントを受取る側のコーディングイメージ

以下に、ドキュメントを受取る側である、SysStats Monitorのコーディングイメージを示します。

UIDocumentInteractionControllerDelegate経由で起動されると、application:didFinishLaunchingWithOptions:メソッドが呼ばれます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (launchOptions) {
        NSURL *launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        if ([launchedURL isFileURL]) {
            if ([[launchedURL pathExtension] isEqualToString:kProcessBookmarkFileExtention]) {
                
                // 確認メッセージのためのファイル名などの情報を取得
                NSString *fileName = [launchedURL lastPathComponent];
				...

				// AlertPanelを表示
                
            }
            
        }
        
    }
    return YES;
    
}

SysStats Monitorでは、プロセスブックマークを受け取った時に、以下のような確認メッセージを表示しています。

[補足] Inboxフォルダのパスは、以下のようにして取得できます。
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *inboxPath = [[paths objectAtIndex:0] stringByAppendingString:@"/Inbox"];

UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し

この記事は、こちらに移動しました。
UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し - The iPhone Development Playground

ドイツのpcwelt.deのビデオで紹介していただきました。

PC-Weltという、ドイツのパソコン雑誌のサイトで、SysStats Monitorをビデオで紹介していただいてます。

http://www.pcwelt.de/news/Systemmonitor-iPhone-App-SysStats-Monitor-im-Video-vorgestellt-1412442.html

ドイツ語ですが、映像から、このアプリの機能が的確に表現していただいているのを感じます。
Danke!

iTunes StoreとVirusBarrier X6は、相性が悪いのか??

ここ数日、iTunes Storeへの接続が調子悪く、まともに画面が表示されなくなって困っていました。もう一台のMacからは正しく表示されているので、このマシン固有の問題と考え、いろいろ調べてみたところ、以下の記事を見つけました。

Macウイルス対策としてVirusBarrier X6を使っているが最近Itune Storeへのアクセスやメールに対してフィッシングサイトとして認識してしまうようで警告が出るようになってしまった。後検出だと思うがアップデートを待つしかなのかな。

先日VirusBarrier X6がiTunes Storeをフィッシングサイトとして処理していたが新しいアップデートが適用されてから正しく処理するようになっている。修正されたのでしょう。

現在は解決されているとのことですが、私も自分のマシンにVirusBarrier X6をインストールしているので、何となく気になります。試しに、VirusBarrier X6のアンチフィッシング機能で、信頼するサイトに、itunes.apple.comを追加してみたところ、何とかトップ画面の表示はできるようになりましたが、やたらと遅いですし、ちゃんと表示できない画面もあります。
そこで、とりあえず、アンチフィッシング機能をOFFにしてみたところ、正しく画面が表示されるようになりましたが、それでは意味がありませんよね。
そんなとき、もう一つやり忘れたことに気づきました。NetUpdateを実行してみたら、フィルタのアップデートがありました!

早速適用してみたところ、問題はきれいに解決されました。きっと、何か不具合があったのでしょう。。
でも、今年の初め頃にも同じような問題が起きているので、何か相性が良くないところがあるのかもしれませんね。。

iOS4.2で、一部の標準アプリのプロセス名が変更されたようです


SysStats Monitor / Lite では稼働中のプロセス一覧を表示しています。実際のプロセス名と、ホーム画面に表示されている名前と一致している場合もありますが、それが異なっているものも多いのが実情です。
例えば、以下のアプリが該当します。

ホーム画面 プロセス名
Safari MobileSafari
iTunes MobileStore
メモ MobileNotes

このように、ただ単にプロセス名の一覧を表示するだけではわかりにくいので、SysStats Monitor / Liteでは、「プロセスブックマーク」という機能をつけて、ユーザがわかりやすい名前を付与して、その名前で表示できるようにしています。言い換えると、プロセス名の辞書のようなものです。ただ、すべてのプロセスに関してその作業を行うのはかなり面倒な作業となるので、いくつかの標準アプリについては、事前に登録済みになっています。

ところが、このプロセス名というのは、特に仕様として公開されているものではなく、あくまでも、システム内部で使用されている名称に過ぎません。予告なしに変更されることは、十分に予測されます。標準アプリだけでなく、みなさんが、自分でインストールした一般のアプリも同様です。
そういったことを織り込み済みで、このような方式を採用しています。

さて、本題に入りますが、iOS4.2からプロセス名が変更になったものがあることが判明しました。それも、機種ごとに異なる名前になっているようです。
以下に、iPhoneiPadの例を示します。


整理すると、以下の感じで、いずれもチルダ(~)のあとに、機種名が付加されています。*1

ホーム画面 プロセス名(4.1以前) プロセス名(iPhone4.2) プロセス名(iPad4.2)
連絡先 Contacts Contacts~iphone Contacts~ipad
マップ Maps Maps~iphone Maps~ipad
Game Center Game Center Game Center~ipho Game Center~ipad

その他、iPhoneでは、標準のカメラアプリのプロセスが独立したプロセスになったようです。
SysStats Monitor / Liteのユーザの方は、上記のアプリを起動し、ブックマークに登録しなおすことで、表示できるようになります。
次期バージョンでは、このあたりを考慮して、事前登録の内容を見直す予定です。

このように地味な機能ではありますが、意外に便利なので、ぜひご活用ください。

*1:きっと、iPod touchも同様だと思いますが、手元には、マルチタスキング非対応のtouch 2Gしかないので、別途調査したいと思います。