02/04

(1:03) ゲームをしていてスペイン語のリスニングをする時間がなくなった。

Flappy Birdってやつ。

 

こういうゲームはiPadのほうが難易度が低いと思ったのだが、後でiPhoneでやってみたら、こっちのほうがずっと簡単だった。

あっという間にiPadの最高点が取れた(上回ることはできなかった)。

 

妻から昼に連絡があった。

これまでよその家の WiFi にただ乗りしていたのが使えなくなって、図書館の無料インターネットでメッセージをくれたという。

まあ、無事で何よりだ。

 

今日は生活リズムを少し取り戻してプールに行った。

その後、喫茶店に。

 

また darts-clone の Java 版を触っていた。

テストをどうしようか迷っていたけど、やっぱり元のやつを移植しようかなと。

 

Java はトライの不毛地帯(×歩も打ちたい)だ。

といっても、トライのライブラリがあるのはもともと C++ ぐらいで、ほかの LL 等はだいたいそれをバインディングで利用する感じになっている。

しかし、Java は独自のエコシステムがあって、C++ のライブラリを使うという文化があまりない。

元々 Java は速いので、わざわざ C++ のものを使う意義が少ないというのもあるかもしれない。

だから、C++ の枯れたライブラリを Java に移植するというのはある程度意味があるんじゃないだろうか。

darts-clone はいろいろ工夫があるから、車輪の再発明をするよりそのまま持ってくるのがいいように思える。

 

darts の Java 移植は、村脇さんのやつと Komiya Atsushi さんのやつがある。

後者のほうがパフォーマンスがいいようだ。

 

darts-clone をわざわざ移植するとなると、パフォーマンスを測らないといけない気がする。

そうじゃないと、なんでわざわざそれを使うのかという説得力がないような。

でも、そういうのは苦手だ(社会性がないので他人に何かを証明するというところにあまり意義を感じない)。

 

darts-clone のほかに、marisa-trie もできたら移植したいところだけど、こちらも難しそうだ。

 

いま利用できる Java のトライライブラリとしては、Takao Nakaguchi さんの trie4j がある。

これは LOUDS、ダブル配列などが揃っている。

しかし、やたさんのものほど変態的にカリカリにチューニングはされておらず、小綺麗な感じだ。

もちろん、それはそれでとてもいい(参考にもなる)のだが、ブラックボックスとして使うとしたら、中身が C++ のベタ移植でもユーザには特に問題がないだろう。

 

そういえば、こういう話もある。

Unicode でも大丈夫みたい - やた@はてな日記

Unicode でも動くけれど、あまりいいことがないという話。

Java から使うからといって、必ずしも Unicode でデータを持たなくてもいいんじゃないだろうか。

インターフェイスとしては String でも、内部では UTF-8 のバイト列にしたほうが、特にダブル配列には良さそうだ(今の移植版はそうしている)。

 

あと、trie4j の LOUDS トライはユニークな連続 ID をもらってくることができない。

marisa はこれができるから、キーと値の関連付けがやりやすい。

(marisa を使い始めたときは、キーと値は何も考えずに関連付けられるのが当たり前だと思っていたゆるふわ脳だったけど、考えてみるとユニークな連続 ID をもらってきてそれに従って値を並べ直すほうが無駄がない)

 

ちょっと改造したら、trie4j でもユニークな連続 ID は取得できるようになった(もともと、ノードがキーと関連付けられているかどうかをビットベクトルで持っているので、それで rank() を取ればいい)。

もうちょっと工夫したら、ID からキーの復元もすぐできそうだ(やってないけど)。

 

まあ、Javaや日本語が滅びない限りどうやっても Java での共通接頭辞検索は必要になるので、もう少し幸せな状況になってほしい(したい)ところ。