« 2005年07月 | メイン | 2005年09月 »

2005年08月27日

C++ slice

satoru-t が便利で面白い表を作っています。
http://namazu.org/~satoru/blog/archives/000043.html

こうやって見ると C++ はちょっとイビツです。値ベースだから、パフォーマンスを考えると配列を返すようなメソッドはなく、破壊的またはコピーを作る操作になってしまいます。あと、STL はアルゴリズムとコンテナの役割が明確に分かれているので、vector は vector プリミティブのメソッドしかありません。copy や unique は、ランダムアクセスができる iterator を持つものなら vector 以外のコンテナでも動かすことができます。

さて、slice ですが、少々強引ですが

#include <iostream>                                                                                
#include <vector>                                                                                  
#include <iterator>                                                                                
                                                                                                         
int main ()                                                                                              
{                                                                                                        
   std::vector<int>  a;                                                                            
   for (int i = 0; i < 10; ++i) a.push_back(i);                                                       
                                                                                                         
   std::vector<int> b;                                                                             
   std::copy(a.begin() + 2, a.begin() + 2 + 5, std::back_inserter(b));                                   
                                                                                                         
   std::copy(b.begin(), b.end(), std::ostream_iterator<int>(std::cout, " "));                      
   std::cout << std::endl;                                                                         
}        
std::back_inseter(v) は、*iterator++ = value を v.push_back(value) にバインドする関数オブジェクトです。

投稿者 taku : 22:46 | コメント (8) | トラックバック

しつけ

2週間前の話で恐縮ですが、嫁さんと阿蘇を旅行した際、ほのぼのした話がありました。

ホテルの食堂が Buffet だったので、部屋の鍵をテーブルの上において食事を物色してました。しかし、いざ戻ってくると鍵がない。ホテルの人に伝えたところ心当たりはないそう。。。途方に暮れてると隣の席に座っていた子連れの子供がいたずらで取っていってしまったようでした。事件はあっけなく解決してよかったのですが、その後の親子連れの態度に感動したのです。

最近の親は子供を叱りつけて親が代わりに誤るのがありがちですが(もっと酷い親は完全に放置プレイというのもありますが)、この親御さんは、ちゃんと子供に謝らせていました。自分もこういう経験がないもので動揺してしまい、どう振舞っていいかわかりませんでしたが、最近の日本人が失いかけている何かが阿蘇の田舎にはまだ健在しているということに不覚にも感動してしまいました。

投稿者 taku : 00:36 | コメント (8) | トラックバック

2005年08月20日

Ajax IME その後

Ajax IME ですが、slashdot 効果もあってかなりのアクセス数がありました。
hatena bookmark では180以上の方々に登録していただけたようです。


http://chasen.org/~taku/software/ajax/fullime/

あれからちょくちょく変更して、いまでは、簡単な学習機能がついています。
「くどうたく」 -> 「工藤拓」と変換すると、次回はそれを覚えています。
ただしブラウザをリロードすると学習履歴は消えてしまいます。(単純)

さて、皆様の blog を拝見させていただいたのですが、大きく二つの指摘がありました。

1. 何に使うのか?
簡単な答えは、海外でIMEをなんらかの理由で使えないときに Ajax IMEが役立つでしょう。ネットカフェでメール書いたり blog 書いたりといったのが典型なユースケースです。実際に海外出張中の同僚がメール書くのに使ってくれたそうです ;)

もうひとつのパラダイムシフトは、IME の実装に対して自由度が高まることです。 IME をどのローカルマシンでもストレスなく動かすためには、CPU, メモリ、ディスクリソースを充分に考えながら実装する必要があります。ちょっと賢いこと(たとえば長い n-gram で言語モデルを作るとか) は、やりたくても出来なかったのが現状です。一方、 Ajax IME の実際の変換はサーバサイドで行われるため、リッチなリソース、アルゴリズムを使ってより精度の高い変換が提供できる可能性があります。データやマシンリソースをふんだんに使う「統計的言語処理」がおおいに活躍できそうです。

1. 「意外と」使える、速い :-)
Web アプリケーションはたいてい遅いので、そう感じられるかと思います。しかし、あの速度は自然です。ローカルIMEがサクサク動いてくれることを考えてみてください。ローカルIMEがこの速度で動くのであれば、速度低下になるであろう要因は単純にネットワークだけです。Ajax でやりとりする情報は、ひらがな列とそれに対応する漢字列の集合ですが、これは Web ページの内容に比べれば微々たるものです。

あと、思うに Ajax はどれだけサクサク動くかで印象が大きく違います。Ajax のクライアントサイドの実装は文書化されてるし、サンプルも見つけやすいですが、サーバサイドはそうではありません。たとえば、Google Suggest ライクな補完インタフェースを数十万~百万ワードの規模で耐えうるようなシステムの実装はそう簡単な話ではないでしょう。Web アプリケーションの王道である RDB を使って SQL を非同期でバシバシ発行するような処理はとても遅そうです。バックエンドが扱うデータが巨大な場合、通常の Web アプリケーションの方法論とは別の次元の、実践的で高速な実装が Ajax では求められうるように思います。とかいいつつ、Ajax IME の場合、幸いにも MeCab が十分高速なので、ある意味インチキしています。

投稿者 taku : 00:24 | コメント (15) | トラックバック

2005年08月09日

Ajax IME

以前に作った Ajax IME を拡張してみました。通常のIMEと同様に候補選択ができます。blog の更新やメールを書いたりといった用途にはほぼ問題ないレベルだと思います。

http://chasen.org/~taku/software/ajax/fullime/

さて、JavaScript についていろいろ勉強になりました。クロージャーはそのひとつです。イベントハンドリングにクロージャーを使っているため、グローバル変数は一切使わなくて済みました。さらにオブジェクト指向で書かれているため、同一文書に複数の textarea があっても複数のIMEインスタンスを持つことができます。

ただ、textarea の操作はバッドノウハウの塊です。キャレットの位置を取得する
一般的な方法はなく、ブラウザ依存です。Firefox では、キャレットの位置をピクセル単位で取得できないようです。固定長フォントにしてフォントサイズから適当にキャレット位置を計算しています。うんざりです。

投稿者 taku : 21:55 | コメント (1277) | トラックバック