2008-01-05

辞書その3

Problem:
Some applications do about 90% of what I want.
Solution:
Develop my own applications.
Better Solution:
Patch the application myself... ← いまココ


RubyInjectは早々にあきらめ、SIMBLを使ってみます。


com.apple.Dictionary をフックするbundleを作ります。右上の検索入力欄はどうみてもNSTextFieldなので、NSTextFieldをposeAsClassでのっとります。NSTextFieldは、ふつうdelegateで変更を通知するはずなので、setDelegateをのっとって検索文字列変更時にどのインスタンスに通知するか覗いてみます。どうやら BrowserWindowController が相手のもよう。のでNSTextFieldインスタンスをもったNSWindowControllerの子クラスを作って、そのインスタンスをNSTextFieldのdelegateに設定してみます。

これで検索文字列決定時にcontrolTextDidEndEditingが呼ばれるようになりました!

#import 

@interface MyNSTextField : NSTextField
{
}
@end

@interface MyNSWindowController : NSWindowController
{
id _textField;
}
@end

@implementation MyNSTextField

+ (void)load
{
[self poseAsClass:[NSTextField class]];
NSLog(@"MyNSTextField::load");
}

- (void)setDelegate:(id)anObject
{
if ([@"BrowserWindowController" isEqualToString:[anObject className]]) {
MyNSWindowController *windowController =
[[MyNSWindowController alloc] init];
[windowController set:self];
[super setDelegate:windowController];
}
}

@end

@implementation MyNSWindowController

- (void)set:(id)textField
{
NSLog(@"MyNSWindowController set");
_textField = textField;
}

- (void)controlTextDidEndEditing:(NSNotification *)aNotification
{
NSLog(@"controlTextDidEndEditing");
NSLog([_textField stringValue]);
}

@end


こんな感じですね。setDelegateを奪い取ってる気がしますが、一応動いてます。

あとは検索文字列をオンライン辞書ででも検索して発音音声を返せば念願達成。こっから先はRubyCocoaで繋ぐつもり。

辞書その2

光明が見えた方向に進んでみたが、辿り着いた場所には扉があったものの、それは固く閉ざされていた...


って感じですか。

辞書.appの検索入力をフックできればいいんとちゃいますか。

いくつか方法があると思いますが、まずは、気になっていたRubyInjectで。

machレベルで関数上書きすると。最近はtext segmentが書き込み禁止にされてしまって寂しいですが、それはそれとしてインストールしてみます。

$ xcodebuild SYMROOT=/tmp
$ cp -r /tmp/Release/RubyInject.framework /Library/Frameworks


でもって、Dictionary.app起動してpsとかでプロセスIDを調べて

sudo ruby inject.rb プロセスID


とすると irb が起動して、いろいろできます。


辞書.appの右上のNSTextFieldっぽいところの文字列を引っこ抜ければよいと思うので探してみます。

require 'osx/cocoa'
include OSX
def walk(d)
instance = d[1]
NSLog d[0]
NSLog instance.class.to_s
begin
NSLog instance.stringValue.to_s
rescue
end
NSLog " "
begin
instance.subviews.count.times do |i|
walk [d[0] + ".subviews[#{i}]", instance.subviews[i]]
end
rescue
end
end

NSApp.windows.count.times do |i|
walk ["NSApp.windows[#{i}].contentView", NSApp.windows[i].contentView]
end


環境設定ウィンドウの文字列と同じものを見つけたので、setStringValue したら書き換えることができました!

しかし、右上のNSTextFieldらしきのにはどうも辿り着けない。うーん。

辞書

Leopardの辞書.app

インクリメンタル検索できるし、内容も充実。

ただ欲を言えば発音音声が欲しい。


ということで、発音音声付き辞書アプリケーションを得るべく、自分でアプリケーションを作ってみる方向で、辞書を検索する方法を探してみました。

http://numata.designed.jp/?plugin=numa_diary&file=Diary&title=日記&date=20071029

によればDictionary ServicesというAPI群があるらしい。何故かCarbon API。


さっそくこのAPIを使ってObjective-Cで辞書.appもどきを作ってみました。

http://prdownloads.sourceforge.jp/splhack/28808/EDict_test.tbz2

Leopard以降用です。ソースコードのみ。Xcodeでビルドできます。


作ってみて気づいたこと。
  1. インクリメンタル検索ができない。
  2. 取得できるデータがプレーンテキスト(リッチテキストじゃない)
  3. リッチテキストで表示できるAPI(HIDictionaryWindowShow)もあるけど、これは辞書.appが起動して表示することになる


うーん。

2008-01-03

vim 7.1.189

しばらく更新がなかったvimですが、年明け早々たくさんpatchが出てたので追従。

http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim

更新後再度見に行ったら7.1.190が出てるくらい活発。win32用のパッチなので影響なしですが。


cf.sourceforge.jpのOS Xにログインできない状況が続いている(サポートには問い合わせ済み)のでバイナリはまた今度。

PrivatePortfile/CMigemo

PrivatePortfileのcmigemoがインストールできないのを調べてみました。

なぜかbuild時に $(CC) が O2 に展開されて、command not foundになってました。
sudo port -v build +utf8 で確認(verboseオプション)。

port configure +utf8 後、worksrcpathでmakeすると平気。何故 CC に cc 以外が設定されるのか追求してませんが、CC=ccで対策して更新。

http://lapangan.net/darwinports/index.php?PrivatePortfile%2FCMigemo

make時の環境変数設定方法が変わったのか、Leopardのせいなのか。

2007-12-30

ming-ruby

http://rubyforge.org/projects/mingruby/

Pawel Karwowskiさんが更新してくださっています。感謝。

2007-12-11

ming, Ming/Ruby

newSWFSound_fromSoundStreamパッチが取り込まれました。これでイベントサウンドでmp3やflvのサウンドが簡単に使えます。

Ming/Rubyで使える機能を増やすパッチも増えてます。

LinkedIn

LinkedIn profile: http://www.linkedin.com/in/sakamotokazuki

ハードウェアに近い部分でのソフトウェア開発の仕事を探してます。

vim 7.1.175

http://lapangan.net/darwinports/index.php?PrivatePortfile%2FVim

7.1.175に追従。

2007-12-05

Mac OS X 10.4/10.5用 MacVim7.1.166 universalバイナリ

本家でsnapshotが出てたので更新しました。

http://sourceforge.jp/forum/forum.php?forum_id=13493


http://lapangan.net/darwinports/index.php?PrivatePortfile%2FMacVim


XcodeでコンパイルエラーをクリックするとMacVimで該当行を編集開始できるとかできないとか。LeopardでのIMラインは変化なし。