AquaSKK(OS X yosemite対応版)
サマリ
yosemiteでAquaSKKが動かないとのウワサを聞いて悲しみにつつまれている。
— みずぴー (@mzp) August 6, 2014
AquaSKKが動かないとYosemiteに移行できないので、@banjunに教えてもらいながらパッチを作った。バイナリも含めてGithubで公開している。
https://github.com/codefirst/aquaskk/releases
追記(2014/10/18)
何人の方からの報告によると、Yosemite正式版しているらしい。自分のところでも問題なく動作している。
ところで何かプレゼント送ってくれてもいいんですよ? -> wish list
追記(2014/10/22)
@uasiさんによる入力モードが切り替わり続ける問題を修正する変更(参考:Yosemite で AquaSKK の入力モードが切り替わり続ける問題を適当に直した - ヤルキデナイズド)を取り込んだ。
バイナリは上記のGithubで公開している。
入力モードが切り替わり続ける問題は、一部の環境で発生していることは認識していたものの、自分の環境では発生していない問題なので、直った人は教えてほしい。直ってない場合はパッチが欲しい。
追記(2014/11/11)
10/22に入力モードが切り替わり続ける問題の修正パッチを取り込んだが、ターミナルなどだとうまく動いていなかったので、さらに修正パッチを書いた。
同じく、バイナリは上記のGithubで公開している。
変更内容
- もともと動作環境は10.6(Snow Leopard)以降だったが、10.8(Mountain Lion)以降に変更した。手元にあるXcodeだとこれ以降のSDKしかなかった。
- 解放済みのメモリにアクセスしている箇所があったので、retain/releaseを追加した。 (参考: f7a71e35)
- ビルド方法などがドキュメント化されていなかったので、README.mkdnに書いた。
知見
- 環境構築は How to install OS X Yosemite inside VirtualBox - Engadgetが参考になった。Marvericks をVirtualBoxにいれるときよりも作業が多い。
platform/mac/Makefile
を読めば、どういう手順で開発すればいいかが、だいたい分かる。
開発時の様子
- mzp: [SKKInputController handleEvent:client:]で落ちてそう
- banjun: Application Specific Information:objc_msgSend() selector name: bundleIdentifier
- banjun: まったく動かしてないけどこれでは
- banjun: しかしその後も完全に死ぬのはなんでか分からん
- mzp: ぽさある
- banjun: しかしそれ以上スタックトレースが無くてbundleIdentifierってどういうこっちゃ
- mzp: bundleIdentifierってセレクタ、呼んでるんすよ
- banjun: handleEventにはない
- mzp: handleEvent内で[self directMode]ってあるじゃないですか
- mzp: その中で呼んでる
- _puke: [Bookmark] add - 日本語入力開発者の集い - AquaSKK 開発日記 http://d.hatena.ne.jp/t_suwa/20100429
- banjun: そういう別のとこにはある
- banjun: なんでスタックトレースに出ないのか
- mzp: 最適化でインライン化されてんじゃねーの?(テキトウ)
- banjun: Thread 0 Crashed:: Dispatch queue: com.apple.main-thread0 libobjc.A.dylib 0x00007fff85bc90dd objc_msgSend + 291 jp.sourceforge.inputmethod.aquaskk 0x00000001029dcab3 -[SKKInputController handleEvent:client:] + 362 com.apple.InputMethodKit 0x0000000102ac4a98 -[IMKServer handleEvent_Common:characterIndex:edge:clientWrapper:controller:] + 33973 com.apple.InputMethodKit 0x0000000102ab9859 _63-[IMKServer handleEvent:characterIndex:edge:asyncClient:reply:]block_invoke + 765
- mzp: だいたい同じ
- mzp: デバッグビルドで再現しないし追えない
- banjun: printfデバッグなら...
- mzp: 特定のセレクタに反応するか調べるメソッドなかったっけ?
- banjun: respondstoselector
- mzp: それ挟んでみるわ
- banjun: しかし有効なobjectじゃないなら意味なす
- mzp: 何も考えず一定の値を使うようにしてみるか
- banjun: 有効なobjectに対して呼んだなら、BAD_ACCESSじゃなくてunrecognized selector例外になる
- banjun: bundleIdentifierが原因なら、clientの値がおかしいと思われ
- mzp: たぶんそうなんだろうなぁ
- mzp: 有効な値かどうかのチェックってどうするんだ
- mzp: client_の初期化を見るべきか
- banjun: 単純にfreeがいけないなら[client_ retain]してみては
- mzp: id型にbundleIdentifier呼ぶのっていいの?
- banjun: リークするかもしれないけど、死ななくはなりそう
- mzp: 初期化のとこにretain追加してみるわ
- banjun: id型はなんでも警告無しによべる
- mzp: 呼んだあと大丈夫なの?
- mzp: あー、大丈夫じゃなくても別のエラーメッセージが返るはずなのか
- banjun: 呼ばれたobjectに実装されてなきゃ、id型だろうとなんだろうとunrecognized selector
- banjun: object自体がfreed objectだったりしたら、objc_msgSendが失敗する
- mzp: メモリまわり実際あやしい
- mzp: デバッグビルドなら起きなかったっていう事実とも符号する
- (中略)
- mzp: なんかよさそう
- mzp: ばんじゅんさん、pkg作るんで試してもらえません?
- banjun: ok