(追記あり)最高に便利なGoogle IME SKK サーバをAquaSKKでも落ちないようにしてみた
Google IME SKK サーバでOSが固まった…
ここ一年ほど会社の同僚の変態ギークにそそのかされて、SKKを愛用しています。
もちろん気に入って使ってるんですが、GoogleIMEの圧倒的な語彙に羨望を覚えていたのも事実。辞書だけでも使えねーかなーと常々思ってたら…
Google IME SKK サーバー 作った - hitode909の日記
id:hitode909さんが作成してくれました!SKKのままでGoogleIMEの語彙!これはすげえ!
「秋山澪」も「花京院典明」も「僕と契約して魔法少女になってよ!」も一発で変換できるぜッ!
長文一発変換とか全然SKKらしく無いけど、どっちもできるのが最強だろッ!ヒャッハー!
…あれ、「かおもじ」を変換した途端見たくも無いレインボーカーソルが…しかも何分経っても止まらない…ああ…orz
原因調査
変換する度にGoogleにリクエストを投げるのでネットワークが不通な場合に変換できない,また,AquaSKKを使っているとOSがフリーズする
Rubyのプロセスが何かしたくらいではOSがフリーズしないと思うので,AquaSKKに変な入力を渡すとだめみたいだけど,よく分からなかった
おいおい、強制終了させりゃあ動くんだろとか甘く見てたら「IMEが止まってて入力も出きないから強制終了もできない」ウボァー…
これはキツい。タッチパッドぐらい使わせてくれよ…
で、調査。電源ブチ切って再起動後に同じく「かおもじ」でフリーズ。
再現率100%です。本当にあり(略
まあGemってことはRubyのソースあるはずだし、ちょっとソース見てみるか。お、これは意外と短かい。google-ime-skk/google-ime-skk.rb at master · hitode909/google-ime-skk · GitHub
ああ、Net::HTTPで取得してんだ、あータイムアウトとか無いからここらへんで固まってんのかな?「かおもじ」とか候補多そうだしね。
と思ってログ入れてみたところ違いました。顔文字の変換候補が4つしか無い…
原因判明
結局は原因は文字コード。
ま た お ま え か
skkservの通信にeuc-jpを使用しているため、「かおもじ」を変換しようとすると☹をeuc-jpに変換しようとして、euc-jpには対応する文字コードが無いため、
#
が発生していた…というオチ。
最近utf-8ばっかでこういうのも見なくなったけど、skk昔からあるもんな…
固まる原因は、おそらく例外時に変な文字列をAquaSKKに返してAquaSKKが解釈しようとして固まるんだと思います。
修正内容
施した対策は以下。
- 変換失敗しても?に無理矢理変換するようにした。
- bigin-rescueつけてリクエスト時に例外発生しても空文字を返すようにした。
- read/open_timeoutつけて固まらないようにした。
変換だからタイムアウトは短かめに1秒。そもそもこれ例外返すと固まるみたいなので例外処理入れてエラーが発生したらとにかく空文字返して、「単に辞書にありませんでした!」って挙動にした。これで安心安心。
以下変更点のdiff。
ソースはここgoogle-ime-skk/google-ime-skk.rb at master · u1tnk/google-ime-skk · GitHub
diff --git a/lib/google-ime-skk.rb b/lib/google-ime-skk.rb index 8593c9e..fd8bc41 100644 --- a/lib/google-ime-skk.rb +++ b/lib/google-ime-skk.rb @@ -17,7 +17,7 @@ class GoogleImeSkk < SocialSKK def encode_to_eucjp(text) if String.new.respond_to?(:encode) - text.encode('euc-jp', 'utf-8') + text.encode('euc-jp', 'utf-8', {:invaild => true, :replace => '?'}) else require 'kconv' Kconv.toeuc(text) @@ -30,10 +30,19 @@ class GoogleImeSkk < SocialSKK uri = URI.parse 'http://www.google.com/transliterate' http = Net::HTTP.new(uri.host, uri.port) http = Net::HTTP.new(uri.host, uri.port, @proxy.host, @proxy.port) if @proxy - http.start do |h| - res = h.get("/transliterate?langpair=ja-Hira%7Cja&text=" + URI.escape(text)) - obj = JSON.parse(res.body.to_s) - encode_to_eucjp(obj[0][1].join('/')) + begin + http.read_timeout = 1 + http.open_timeout = 1 + http.start do |h| + res = h.get("/transliterate?langpair=ja-Hira%7Cja&text=" + URI.escape(text)) + obj = JSON.parse(res.body.to_s) + encode_to_eucjp(obj[0][1].join('/')) + end + rescue => e + p e + return "" end end end<del></del> :
正直大した修正はしてないけど、OSが固まるのは致命的過ぎるから役には立つはず!
と産まれて始めててのpull requestを送ってみた。id:hitode909さん、取りこんで頂けると助かります。
あ、待てない方はgemのインストールパスに行って、上記のファイルを修正or上書きすれば問題無く動きますので良かったらお使いください。
まとめ
これで単文節変換に加え、長文一発変換も可能なキモ素晴しいSKKが安心して楽しめますね!
長文はともかく、固有名詞とかはマジに便利なのでお試しください。長文入れる前に細かく変換すればちょっと辞書の豊富な普通のSKKとして使えますしね。
速度が心配な方もいると思いますが、私の環境は自宅ADSL、さくらのVPSにskkサーバ立てて試してますが、たまに引っ掛かるかな??という程度で普通に入力しています。もちろん今も使っていますので、是非一度使ってみてください!
追記
早速修正を取りこんで頂きました!
Google IME SKK サーバーを更新 - hitode909の日記
Google IME SKK サーバーをAquaSKKで使うとたまにOSがフリーズするバグが直りました.
とのことなので、普通にgem install/updateすれば上記の修正が取り込まれててます。
しかし、深夜のpull requestして朝起きたら、返信きてて、mergeされてて、gemの更新されてて、ブログ書いてあって…仕事早い!
id:hitode909さん迅速な対応ありがとうございました!