feed

2014年09月18日, 編集履歴

Mailto Interceptor Liteをリリースしました

 mailto:リンクのクリック等によるメールアプリケーションの意図しない即時起動を抑制するユーティリティアプリケーションMailto Interceptorに無料のLite版ができました。

 Lite版ではmailto:リンクのクリック等に対する動作として、

が行えます。通常版では以上に加えて、

が搭載されています。まずは無料のLite版でMailto Interceptorの機能をぜひお試しください。

2014年09月10日, 編集履歴

Mailto Interceptorをver. 1.2にヴァージョンアップしました

 mailto:リンク等によるメールアプリケーションの即時起動を抑制するユーティリティMailto Interceptorをver. 1.2にヴァージョンアップしました。

 ver. 1.2では、

が付きました。

カスタムURLの定義

 これまでも、mailtoリンクをクリックしたときのディフォルト動作として、あるいはポップアップメニューから選択したときに、Mailto Interceptorであらかじめ定義されたGmailの作成画面を開くことは可能でした。ver. 1.2ではあらかじめ定義されたURL以外に自分で定義したカスタムURLを開くことができるようになります。

 たとえば、上記画像のようにカスタムURLを定義した場合、mailtoリンクをクリックしたディフォルト動作として、あるいはポップアップメニューから選択したときに、https://example.com/mail_compose?to={to}なるURLを開くことができるようになります。{to}の部分はmailtoリンクで指定された宛先アドレスに置き換わります。置換可能なプレイスホルダは全部で5種類あります。

 それぞれURLを開くときにmailtoリンクで指定されたものに置換されます。

 カスタムURLを定義することで——自分が使っているウェブメールサーヴィスがメール作成画面へのURLを提供しているならば——mailtoリンクのクリックでそれらを開くことができるようになります。

のふたつが定義済みURLとして提供されています。

ポップアップメニューの編集

 Mailto Interceptorでは、mailtoリンククリックに対する動作として、ポップアップメニューを開く機能を提供しています。あらかじめディフォルト動作を決め打ちするのではなく、その場で

等の動作を選択することができます。

 ver. 1.2ではこのポップアップメニューのメニュー項目を編集する機能を追加しました。ポップアップメニューに表示されるメニュー項目を自分好みに追加・削除したり、並べ替えたりすることができるようになりました。

 追加できるメニュー項目は、

です。

 新しくなったMailto InterceptorMac App Storeで配信しています。どうぞよろしく。

2014年09月05日, 編集履歴

環境設定をクリアする

 Cocoaアプリケーションで環境設定を保存するにはNSUserDefaultsを使うのが定石。保存した設定はプロパティリストファイルに保存される。

 アプリケーションの開発中には保存する設定の形式をころころ変えたりするし、初期状態に戻して動作を確認したいこともよくある。以前であればプロパティリストファイルを直接開いて保存された値を編集したり削除したりしていたが、OS X 10.9 Mavericksよりプロパティリストファイルに保存されている環境設定値がキャッシュされるようになったらしく、直接編集した結果が実際には反映されなくなった。

 そこで開発中のアプリケーション自身で、キャッシュシステムに左右されることなく、環境設定値をクリアする方法を考える。

環境設定をクリアするUIを作る

 特定のキィを持つ環境設定値を削除するのであれば、

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"aKey"];

を用いるが、使用したキィの分だけ上記メソッドを繰り返すのは面倒だし、削除し忘れ等が発生する恐れがある。そのアプリケーションで使用している環境設定値すべてを削除するにはremovePersistentDomainForName:を用いる。引数にはアプリケーションのバンドルIDをNSStringで渡す。

- (IBAction)restoreDefaults:(id)sender
{
  NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
  [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:bundleIdentifier];
}

のようにすれば、環境設定をクリアするアクションメソッドが作成できる。さらに以下のようなメソッドを作成し、上記アクションメソッドを実行するメニュー項目をメインメニュー内のアプリケーションメニューに挿入しておく。

- (void)addRestoreDefaultsMenuItemToApplicationMenu
{
  NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:@"Restore Defaults" action:@selector(restoreDefaults:) keyEquivalent:@""];
  NSMenu *appMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu];
  [appMenu addItem:[NSMenuItem separatorItem]];
  [appMenu addItem:menuItem];
}

 このaddRestoreDefaultsMenuItemToApplicationMenuメソッドをapplicationDidFinishLaunching:等の中で呼び出す。

#ifdef DEBUG
  [self addRestoreDefaultsMenuItemToApplicationMenu];
#endif

 上記のようにしておけばデバッグビルド時だけ環境設定をクリアするメニュー項目が使えるようになる。デバッグ中だけに使いたければこれで良いし、ユーザがふつうに使えるように適当な場所にメニュー項目やボタン等を配置しても良いだろう。

起動時に環境設定をクリアする

 将来、環境設定値の仕様変更をミスって通常起動すらしない、というようなことがあるかもしれない。手元であれば適当に対処するが、アプリケーションのユーザからそのような報告があった場合を考える。以前であれば「プロパティリストファイルを削除してみて」と言えたが、前述の通りキャッシュが効いてファイル削除も無効になってしまう。環境設定のキャッシュを制御するプロセス(cfprefsd)を再起動させればいいのだが、ユーザに課す手数が増え複雑化してしまう(プロパティリストファイルを探して、削除して、プロセスを再起動)。

 そこで、起動時に環境設定値をクリアできるようにする。

- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
  NSUInteger modFlags = [NSEvent modifierFlags];
  NSUInteger requiredFlags = NSAlternateKeyMask | NSShiftKeyMask | NSControlKeyMask;
  if((modFlags & requiredFlags) == requiredFlags) {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setInformativeText:NSLocalizedString(@"Would you like to restore default preferences?", nil)];
    [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
    [alert addButtonWithTitle:NSLocalizedString(@"Cancel", nil)];
    if([alert runModal] == NSAlertFirstButtonReturn) {
      NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
      [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:bundleIdentifier];
    }
  }
}

 上記のような処理を、アプリケーションが環境設定値を読み込む前のどこかの段階に仕込む(上記ではapplicationDidFinishLaunching:、場合によってはそれより以前の段階に仕込む)。上記の場合、この処理を通る段階でOptionShiftControlキィが押されていた場合、アラートダイアログを表示し、そのOKボタンが押されたときに環境設定値クリアの処理が走るようになる。トラブル時、ユーザには「アプリケーション起動後すみやかにOptionShiftControlを押しっぱにして」と言えば環境設定をクリアできるようになる。

2014年08月09日, 編集履歴

Mailto Interceptorをver. 1.1.1にヴァージョンアップしました

 mailto:リンク等によるメールアプリケーションの起動を抑制するユーティリティMailto Interceptorをver. 1.1.1にヴァージョンアップしました。

 ver. 1.1.1は軽微な問題を修正したバグフィックスリリースになります。どうぞよろしくお願いします。

2014年07月27日, 編集履歴

ことえりの追加辞書とシステムのユーザ辞書

 OS X 10.9 Mavericksのことえりで、ユーザ定義の単語を日本語変換できるようにする方法は2種類ある。

ことえりの追加辞書

 ことえりの追加辞書は、

をセットで登録するので、活用がない体言(名詞)や定型文だけでなく、活用がある用言(動詞、形容詞、形容動詞)や接頭語、接尾語を登録できる。
 iCloud同期の対象外であり、これで登録した単語は他端末では利用できない。
 また、ことえりの追加辞書を登録するには所定のフォーマットと文字エンコーディングを用いたテキストファイルを作成する必要がある。登録した単語を修正する際は、元のテキストファイル(もしくは登録済みの辞書から書き出したテキストファイル)を修正し、修正したテキストファイルを再度登録して置きかえるなど手間がかかる。

 テキストファイルは、

"ぴんふ", "平和", "普通名詞"
"あがる", "和了る", "ラ行五段"

のようなフォーマットで、文字エンコーディングはShift-JISかUTF-16を用いる。フォーマットはCSV的だが、ファイルの拡張子をcsvにすると受け付けてくれないので、txtで作成する。

 用意したテキストファイルを、システム環境設定の「キーボード」→「入力ソース」→「ことえり」→「追加辞書:」のリストにドラッグ&ドロップすることで登録できる。「追加辞書:」リストがスクロールした一番下という解りにくい場所にあるので注意(「ことえり」の環境設定ヴューがスクロールできるということに気付きにくい)。

 「追加辞書:」リストを右クリック(Control-クリック)で辞書の書き出しや削除、チェックボックスで辞書の使用・不使用を選択できる。

システムのユーザ辞書

 システムのユーザ辞書は、

のみで、品詞を登録できないので、活用がある用言は登録できない(してもしょうがない)。たとえば「あがる/和了る」という単語を登録した場合、「あがる」で「和了る」は変換できるが「あがらない」で「和了らない」は変換できない。すべての活用形を登録するのは現実的ではない。
 iCloud同期の対象であり、ひとつの端末で登録した単語が他端末でも利用できるようになる。GUIでの編集とテキストファイルによる一括登録両方利用できる。

 GUIで単語登録する場合は、システム環境設定の「キーボード」→「ユーザ辞書」で編集する。

 一括登録する際に用いるファイルフォーマットはOS Xのプロパティリストファイル(拡張子plist)で、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<dict>
		<key>phrase</key>
		<string>平和</string>
		<key>shortcut</key>
		<string>ぴんふ</string>
		<key>timestamp</key>
		<integer>0</integer>
	</dict>
	<dict>
		<key>phrase</key>
		<string>立直</string>
		<key>shortcut</key>
		<string>りーち</string>
		<key>timestamp</key>
		<integer>0</integer>
	</dict>
</array>
</plist>

のような形式になる。重要なのはphraseshortcatで、timestampは適当で良いと思う。テキストエディタで作成しても良いし、Xcodeがプロパティリストファイルに対応しているので利用しても良い。
 作成したプロパティリストをシステム環境設定の「キーボード」→「ユーザ辞書」のリストにドラッグ&ドロップすることで一括登録できる。リストの単語を選択し、Finder等にドラッグ&ドロップすることで書き出しも可能。

品詞登録用のカラムは存在する

 システムのユーザ辞書はsqlite3のデータベースとして保存されているが、その中身を覗いてみると、ZPARTOFSPEECHなるカラムが存在していることが解る。「Z PART OF SPEECH」=「Part of Speech」=「品詞」と解釈できる。実際、OS X 10.9 Mavericks以前のシステムで登録されていた単語が移行されたと思しきエントリィが存在し、その中ではZPARTOFSPEECHカラムに品詞の情報が登録されている。
 しかしながら、品詞を登録する正規のUIは存在しておらず、sqlite3を用いて直接データベースを編集して品詞を登録してみても、それが日本語変換に反映されることはなかった。とは言え、データベース上に品詞を登録するカラムが用意されていることから、将来的にはその内容が有効になり、品詞登録用のUIも用意される可能性があるかもしれない。

まとめ

 登録したい単語は大抵が名詞か定型文なので、基本的にはGUIがあってiCloud同期対応のシステムのユーザ辞書を用い、用言を登録したい場合はことえりの追加辞書形式を用いるのが良いと思う。

 今回の調査は麻雀用語を一括で登録したいという思いから行った。成果物をGitHubに公開したので、興味のあるひとは

を参照のこと。