この前いじったChrome17対応版AjaxIMEは 実際の変換を行うのに本家AjaxIMEが提供している変換サーバをそのまま使用しています。 そのため、すべての入力内容は本家サーバに送信されてしまいます。 どんな入力をしたのか作者さんにバレバレです。 この送信内容、暗号化すらされていないので、作者以外の人に見られる可能性もあります。 自分の書いた文章が勝手にインターネットに送信されているっていうのはあんまり嬉しくないですね。 ローカルのみで完結するのが理想です。
本家サーバはどうやらmecab-skkservと同じエンジンを使っているようです。 このバックエンドで動いているのは実はMeCab。 ということは、MeCabと互換性のあるigo-javascriptでも同じことができるはず・・・! これはならブラウザ上ですべてが完結する!
はい、そういうことで作ってみました。
IgoIME 使い方は本家と一緒です。Alt-o (Ctrl-9)でモード切替。 ローマ字で日本語を入力することができます。
日本語入力をするためには変換候補をいくつか出力する必要がありますが、 本来Igoにはその機能はありません。 そのため、複数候補を出す部分だけ独自実装してあります。 しかし、まだなんか変換候補が怪しいですね・・・。 長い文章を入力したのに一文字しか結果が帰ってこないことがあります。 なんでだろう・・・・
まだまだ改良が必要なようです。
Chrome17対応版AjaxIME Ajaxを使ってIMEを実現したAjaxIMEがFireFoxでは動くのに最新版のChromeで動かない。 動くように少しいじってみた。
Chrome17対応版AjaxIME 原因 Chromeで動かなかった原因はここ。
if(typeof getComputedStyle == 'undefined') { function getComputedStyle() { //中身は省略 } } FireFoxやChromeには getComputedStyle という関数が定義されているけど、 IEには定義されていない。 if文で有無を判定して、無い場合は動作をエミュレートする関数を定義している。
実行の様子をデバッガで追って見ると、Chromeではエミュレートする必要が無いのになぜか自前で定義した関数が呼び出されていた。 どうやら、Chromeでは 自作 getComputedStyle 関数が if文の中にあったとしてもコード読み込み時に作成されてしまうみたい。 FireFox だと if文の中が実行されない場合には作成されない。
結果だけ書くと、次のように書きなおしたら動いた。
if(typeof getComputedStyle == 'undefined') { getComputedStyle = function() { //中身は省略 } } あと Chrome だと、Input要素にフォーカスがあたった時に余計な装飾がついてしまうので、CSS上書きして抑制。 IE8でTextRangeが使えない問題は「IE8でのTextRange.moveToPoint()」を参考にして解決。 IE7のエミュレートモードにしているだけで、根本的な解決にはなってないけど、まあIEだしいいでしょ。
どっちが正しいの? とりあえず問題は解決したんだけど、FireFoxとChromeで動作が違うけど、どちらの動作が正しいの? 気になったので調べてみた。
「mixi Engineers’ Blog » 詳細 ECMA-262-3 第5章 関数」に関数の定義法についてわかりやすい解説が載っていた。 結論からいうと、一番初めの書き方は「誤り」で実際の動作は実装依存、つまり FireFox の動作も Chrome の動作も正しいとのこと。
関数定義と関数式 関数の定義法は大きく分けて、次のような関数定義と関数式に分かれている。 関数式は更に名前なしと名前付きがある。
//関数定義 function foo() { } //名前なしの関数式 var foo = function() { }; //名前付きの関数式 var foo = function _foo() { }; 普通の関数定義と無名関数があるのは知っててけど、単なるシュガーシンタックスみたいなものかと思った。 mixiのブログによると全くの別物。 関数定義と関数式の大きな違いは、実行時に呼び出し可能になっているかどうか。 関数定義は実行時に呼び出し可能になっているから、定義と呼び出しの順番は関係ない。
TLにGitHubでブログのホスティングしている人がいたので、 「githubとjekyllとoctopressで作る簡単でモダンなブログ」 を参考に作ってみましたよ。
RVM のインストール 自分の環境には Ruby 1.9.2.2 が入っているんだけど、Ocropressでは Ruby 1.9.2 が必要らしい。 そのままでもいけるかと思ったけど、怒られた。 rake コマンドを全部 bundle exec rake に置き換えると一応実行はできるけど、なんだか警告がでる。
こういう時は複数のバージョンの Ruby を切り替えて管理できる、 rvm というのを使うといいらしい。 公式サイトの「Installing RVM」通りにコマンドを打てばOK。
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer) echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile source ~/.bash_profile rvm install 1.9.2 && rvm use 1.9.2 rvm rubygems latest Octopress のインストール あとはgitでクローンして、インストールコマンドを叩くだけ。
git clone git://github.com/imathis/octopress.git octopress cd octopress gem install bundler bundle install rake install rake setup_github_pages 最後のコマンドは GitHub Pages に公開するためのもの。公開用のレポジトリを聞いてくるので予め登録しておこう。