(追記あり)最高に便利な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に変な入力を渡すとだめみたいだけど,よく分からなかった

この現象か ッッ!
はいMacなので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、さくらのVPSskkサーバ立てて試してますが、たまに引っ掛かるかな??という程度で普通に入力しています。もちろん今も使っていますので、是非一度使ってみてください!

追記

早速修正を取りこんで頂きました!
Google IME SKK サーバーを更新 - hitode909の日記

Google IME SKK サーバーをAquaSKKで使うとたまにOSがフリーズするバグが直りました.

gem updateすればgoogle-ime-skk-1.2.0がインストールされると思います.

とのことなので、普通にgem install/updateすれば上記の修正が取り込まれててます。
しかし、深夜のpull requestして朝起きたら、返信きてて、mergeされてて、gemの更新されてて、ブログ書いてあって…仕事早い!
id:hitode909さん迅速な対応ありがとうございました!