みずぴー日記

人間の再起動ボタンはハワイのビーチにある

AquaSKK(OS X yosemite対応版)

サマリ

AquaSKKが動かないとYosemiteに移行できないので、@に教えてもらいながらパッチを作った。バイナリも含めてGithubで公開している。

https://github.com/codefirst/aquaskk/releases

追記(2014/10/18)

何人の方からの報告によると、Yosemite正式版しているらしい。自分のところでも問題なく動作している。

ところで何かプレゼント送ってくれてもいいんですよ? -> wish list

追記(2014/10/22)

@さんによる入力モードが切り替わり続ける問題を修正する変更(参考:Yosemite で AquaSKK の入力モードが切り替わり続ける問題を適当に直した - ヤルキデナイズド)を取り込んだ。

バイナリは上記のGithubで公開している。

入力モードが切り替わり続ける問題は、一部の環境で発生していることは認識していたものの、自分の環境では発生していない問題なので、直った人は教えてほしい。直ってない場合はパッチが欲しい。

追記(2014/11/11)

10/22に入力モードが切り替わり続ける問題の修正パッチを取り込んだが、ターミナルなどだとうまく動いていなかったので、さらに修正パッチを書いた。

同じく、バイナリは上記のGithubで公開している。

変更内容

  • もともと動作環境は10.6(Snow Leopard)以降だったが、10.8(Mountain Lion)以降に変更した。手元にあるXcodeだとこれ以降のSDKしかなかった。
  • 解放済みのメモリにアクセスしている箇所があったので、retain/releaseを追加した。 (参考: f7a71e35)
  • ビルド方法などがドキュメント化されていなかったので、README.mkdnに書いた。

知見

開発時の様子

  • 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