Mac版SkypeでCommand+Returnで投稿する

Mac版SkypeのチャットではReturnキーで投稿するようになってます。これが私には非常に不評でして、何度も間違えて投稿してしまっていました。

どうにかならないものかと思っていたのですが、ハッと気がつきました。我らがKarabiner(元KeyRemap4MacBook)を使えばいいということに。

早速private.xmlに記述。

<appdef>
  <appname>Skype</appname>
  <equal>com.skype.skype</equal>
</appdef>        
<item>
  <name>Command+Return to Return in Skype</name>
  <identifier>private.skype</identifier>
  <only>Skype</only>
  <autogen>__KeyToKey__ KeyCode::RETURN, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND | ModifierFlag::NONE, KeyCode::RETURN,
  </autogen>
  <autogen>
    __KeyToKey__ KeyCode::RETURN, KeyCode::RETURN, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION
  </autogen>
</item>

これの設定をOnにするとSkypeの時にだけReturnキーで改行、Command+Returnキーで投稿できるようになります。

しかしこのままではIMEでもCommand+Returnでしか変換の確定できなくなります。これはIMEの設定でOption+Returnでも確定できるように設定することで回避できます。

Mac App Storeでアプリのアップデートができなくなったら

SpparowのアップデートがあったのでMac App Storeでアップデートしようとしたら、購入した時のアカウントでサインインしてアップデートするようにいわれてアップデートできませんでした。アカウントは購入した時のアカウントだったので、何か障害が発生しているようです。

ので、Appleに問い合わせたところ、アプリをいったん削除して再インストールしてみてくださいということでした。

再インストールでSparrowは無事インストールすることができました。今後アップデートがあるときに同様のことが起こるかはわかりませんが、とりあえず、アカウントが違うといわれたらアプリを削除して再インストールで回避できるようです。

追記: アプリのみ削除して設定ファイル等は削除しないので、アカウントの再設定等は必要ありませんでした。

MacBook Pro early 2011にCrucial m4 SSDを載せる

MacBook Pro earlyに2011を載せてみた。うわさ通りレインボーカーソルがまわってフリーズしたようになった。ので、ファームウェアをアップデートしてみることにした。

Macでのアップデートのやり方の情報がすくなかった。少ない情報から以下のようにやってみた。

Crucial.com Product Downloads – Firmware Updatesからm4用のファームウェアisoをダウンロードしてDVDを作成。MBP early 2011ではアップデートができないらしいので、以前使っていたMacBookにm4をとりつける。DVDから起動して、指示に従う(yesを入力するくらい)。アップデート終了したらm4をMBPにとりつける。

以上で完了。レインボーカーソルが表示されることがなくなり、とても快調になった。

Mac (Lion) にzshをインストール

Lionにzshをインストールした。以前もやったのだが、記録がなかったのでとどめておく。

zshをHomebrewでインストールする。

$ brew install zsh

/ect/shellsに/usr/local/bin/zshを追加する。

システム環境設定の「ユーザとグループ」を開く。鍵を開く。
シェルを変更したいユーザを右クリックして詳細オプションを開く。
ログインシェルを/usr/local/bin/zshに変更する。

かなキーをコントロールキーにしてみた

KeyRemap4MacBookで「かな」キーをコントロールキーにしてみた。

これまでは小指でコントロールキーを押していたけど、親指でおせると少しは楽かもしれない。

親指シフトを使っていて英数キーは親指シフトキーなのでコントロールにはできない。コントロールにするには英数キーの方があっているかもしれない。かなキーだとCtrl-Mが押しにくい。それは我慢ということで。

スレッド毎にNSManagedObjectContextを管理する

基本的にはNSManagedObjectContextはスレッド毎に作成して利用しなければいけません。以下は、その為にスレッド毎にContextを作成して管理するためのコードです。複雑なアプリでなければ、この管理法で十分でしょう。シングルトンなManagerクラスでコンテキストを管理する方法は簡単ですが、スレッドを多用する場合はスレッド毎に管理する方が良いでしょう。

managedObjectContextForCurrentThreadでコンテキストを取得し、保存は[NSManagedObjectContext save:&error]のように、クラスメソッドを呼びます。保存するとNSNotificationでコンテキスト自身のmanagedObjectContextDidSave:が実行され、メインスレッドのコンテキストに変更が反映されます。スレッド毎に自動的にthreadDictionaryにNSManagedObjectContextを登録し、スレッドが破棄されるとコンテキストも破棄されるようになっているので、明示的にコンテキストを破棄する必要はありません。

@interface NSManagedObjectContext (Extras)
+ (NSManagedObjectContext *)managedObjectContextForThread:(NSThread *)thread;
+ (NSManagedObjectContext *)managedObjectContextForCurrentThread;
+ (NSManagedObjectContext *)managedObjectContextForMainThread;
+ (BOOL)save:(NSError **)error;
@end
#import "NSManagedObjectContextExtras.h"
 
NSString * const NSManagedObjectContextThreadKey = @"NSManagedObjectContextThreadKey";
 
@interface NSManagedObjectContext ()
- (void)managedObjectContextDidSave:(NSNotification*)notification;
@end
 
@implementation NSManagedObjectContext (Extras)
 
+ (NSManagedObjectContext *)managedObjectContextForThread:(NSThread *)thread {
    NSMutableDictionary *threadDictionary = [thread threadDictionary];
    NSManagedObjectContext *context = [threadDictionary objectForKey:NSManagedObjectContextThreadKey];
 
    if (!context) {
#ifdef TARGET_OS_IPHONE
        id appDelegate = [[UIApplication sharedApplication] delegate];
#else
        id appDelegate = [NSApp delegate];
#endif
        NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
 
        if ([[NSThread currentThread] isMainThread]) {
            context = mainContext;
        } else {
            context = [[[NSManagedObjectContext alloc] init] autorelease];
            [context setPersistentStoreCoordinator:[mainContext persistentStoreCoordinator]];
        }
 
        [threadDictionary setObject:context forKey:NSManagedObjectContextThreadKey];
    }
 
    return context;
}
 
+ (NSManagedObjectContext *)managedObjectContextForCurrentThread {
    return [NSManagedObjectContext managedObjectContextForThread:[NSThread currentThread]];
}
 
+ (NSManagedObjectContext *)managedObjectContextForMainThread {
    return [NSManagedObjectContext managedObjectContextForThread:[NSThread mainThread]];
}
 
+ (BOOL)save:(NSError **)error {
    NSManagedObjectContext *context = [NSManagedObjectContext managedObjectContextForCurrentThread];
    BOOL isMainThread = [[NSThread currentThread] isMainThread];
 
    if (!isMainThread) {
        [[NSNotificationCenter defaultCenter] addObserver:context
                                                 selector:@selector(managedObjectContextDidSave:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:context];
    }
 
    BOOL result = [context save:error];
 
    if (!isMainThread) {
        [[NSNotificationCenter defaultCenter] removeObserver:context
                                                        name:NSManagedObjectContextDidSaveNotification 
                                                      object:context];
    }
 
    return result;
}
 
- (void)managedObjectContextDidSave:(NSNotification*)notification {
    NSManagedObjectContext *context = [NSManagedObjectContext managedObjectContextForMainThread];
 
    [context performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                              withObject:notification
                           waitUntilDone:YES];
}
@end

色々なアプリケーションからPDFとしてEvernoteに保存するAppleScript

Google ChromeからPDFをEvernoteに保存するスクリプトを作成しましたが、同様に他のアプリからも簡単にEvernoteにPDFとして保存したい場合は以下のようなスクリプトになります。一般的なプリントダイアログを利用するアプリであれば利用できると思います。

[追記 2011/05/13] ループ等を修正しました。
[追記 2011/05/13] Chromeへの対応

-- LaunchBarから実行する場合は以下を有効にする
-- tell application "LaunchBar" to hide
 
tell application "System Events"
	-- AppleScript Editorから実行する場合は以下の2行を有効にする
	-- set theName to name of the first process whose frontmost is true
	-- set visible of process theName to false
	set theName to name of the first process whose frontmost is true
end tell
 
tell application theName to activate
 
if theName is "Google Chrome" then
	printPDF2EvernoteChrome(theName)
else
	printPDF2Evernote(theName)
end if
 
on printPDF2EvernoteChrome(theName)
	tell application "System Events" to tell process theName
		try
			keystroke "p" using command down
			repeat until exists menu button named "PDF" of window 1
				delay 0.2
			end repeat
			tell window 1
				click menu button "PDF"
				repeat until exists menu item named "PDFをEvernoteに保存" of menu 1 of menu button "PDF"
					delay 0.2
				end repeat
				click menu item named "PDFをEvernoteに保存" of menu 1 of menu button "PDF"
			end tell
		end try
	end tell
end printPDF2EvernoteChrome
 
on printPDF2Evernote(theName)
	tell application "System Events" to tell process theName
		try
			keystroke "p" using command down
 
			repeat 20 times
				if exists menu button named "PDF" of sheet 1 of window 1 then exit repeat
				delay 0.2
			end repeat
 
			tell sheet 1 of window 1
				click menu button "PDF"
 
				repeat 20 times
					if exists menu item named "PDFをEvernoteに保存" of menu 1 of menu button "PDF" then exit repeat
					delay 0.2
				end repeat
				click menu item named "PDFをEvernoteに保存" of menu 1 of menu button "PDF"
			end tell
		end try
	end tell
end printPDF2Evernote

Evernote 2.2 Beta1でついにノートリンク機能が追加

Evernote 2.2 Beta1 for Macでノートリンク機能が追加されました。
これはノートのURLを取得して、利用することができる機能です。

メニュー:編集→ノートリンクを実行すると、選択中のノートのURLを取得することができます。これをノートや他のアプリで利用することができます。

リンクをノートに貼り付けると、ノートのタイトルが表示されて、属性としてリンクが付きます。

ノート間で行ったり来たりできるようになるので、より使いやすいノートを作成することができるようになります。

他のアプリからもノートを参照できるようになるので、たとえばOmniFocusのタスクからEvernoteのノートを参照することもできるようになるので。さらにEvernoteの利用法が広がりそうです。

リンクは「evernote:///view/1307184/s11/a9bc7f7c-31cd-4767-9959-91201f75726a/a9bc7f7c-31cd-4767-9959-91201f75726a/」の形式になるので、Webインターフェースからこのリンクをクリックすると、Macクライアントが起動してノートが表示されます。Webインターフェース内での移動にはならないので注意が必要です。

ちなみに新しいノートは同期するか、ローカルノートブックに属していないとリンクが取得できません。

現在はAppleScriptからはノートリンクは取得できないようです。将来的には取得できるようになってほしいですね。

Command+Qの長押しでアプリを終了する

ツイッターでChromeをCommand+Qで終了する機能拡張が紹介されていました。私はたまに間違ってCommand+Qを押してしまってアプリが終了してしまうとこがあり、すべてのアプリで同様のことを行いたいと思いました。自分で作るのは大変そうです。考えた結果KeyRemap4MacBookで対応してもらえば簡単なのではないかという結論に至りました。

KeyRemap4MacBookの作者Takayama Fumihiko様に対応をお願いしたところ、すぐに設定項目を追加してくださいました。「Custom Shortcuts > Hold Command+Q to Quit Application」をOnにすると、実現できます。

また、Dvorak配列では上記設定は使えないということで、private.xmlに下記を追加することで利用することが出来ます。

<?xml version="1.0"?>
<root>
  <item>
    <name>Hold Command+X to Quit Application</name>
    <identifier>private.holdcommandX</identifier>
    <autogen>--HoldingKeyToKey-- KeyCode::X, VK_COMMAND | ModifierFlag::NONE, KeyCode::VK_NONE, KeyCode::Q, VK_COMMAND, Option::NOREPEAT</autogen>
  </item>
</root>

押下時間はデフォルトでは200msに設定されていて、もっと長くしたい場合はKey RepeatのHolding Thresholdを長くします。

これで間違って終了して、せっかく書いたものが無くなるという心配が減りました。Takayama Fumihiko様ありがとうございましたm(_ _)m。