Hatena::ブログ(Diary)

Cafe Babe RSSフィード

2011-01-19

[] 「Java 6 でIVS比較すると何が起こるか」の記事の誤り(続編)

先日のエントリで「ざっとチェックした限りでは,それらにはまだIVSがらみの変更はないようだが,もし見落としがあれば教えて頂きたい」と書いておいたら,さっそく仕様書記述はないが,Unicode DatabaseのDUCET(Default Unicode Collation Element Table)はすでに変更されていると指摘して頂いた.どうもありがとう.

DUCETをチェックしなかったのは,「Unicode Collation Algorithm」でjava.text.Collatorクラスjava.text.RuleBasedCollatorクラス引用されているように,Mark Davisjava.textパッケージ設計に直接関わっていて,Unicode Databaseがそのままjava.textパッケージに使われていると思っていたからだが,指摘されて実はjava.text.Collatorクラスの実装では,ロケールごとに照合規則を定義して,それをロードしていることを思い出した.

以下が現在のままでも正しく動くコードである

import java.text.Collator;
import java.text.RuleBasedCollator;

public class VariationSelectorTest {
    public static void main(String[] args) throws Exception {
	String nonIvs = "与太郎";
	String ivs1 = "与\uDB40\uDD00太郎";
	String ivs2 = "与\uDB40\uDD02太郎";
	String nonIvsNext = "与那国";

	RuleBasedCollator c = new RuleBasedCollator(",\uDB40\uDD00 ,\uDB40\uDD02 " + ((RuleBasedCollator)Collator.getInstance()).getRules());
	c.setStrength(Collator.PRIMARY);

	System.out.println("Compare " + ivs1 + " with " + nonIvs + ": " +
			   c.compare("test", "test\t"));
	System.out.println("Compare " + ivs1 + " with " + nonIvs + ": " +
			   c.compare(ivs1, nonIvs));
	System.out.println("Compare " + ivs1 + " with " + ivs2 + ": " +
			   c.compare(ivs1, ivs2));
	System.out.println("Compare " + nonIvs + " with " + nonIvsNext + ": " +
			   c.compare(nonIvs, nonIvsNext));
	System.out.println("Compare " + nonIvsNext + " with " + ivs1 + ": " +
			   c.compare(nonIvsNext, ivs1));
    }
}

このコードポイントは以下の通りだ.

  • setStrength()で照合の強さを指定している.
  • デフォルトの照合規則に,異体字選択子を無視する(このコードで対象とする最低限の)規則を追加している.

RuleBasedCollatorは正しく動作するが,デフォルトの照合規則に入っていないのが問題なので,それはバグレポートして修正要求するとよいだろう.

なお,面白いことにApache HarmonyのRuleBasedCollatorの実装コメントには,「If a character is not located in the RuleBasedCollator, the default Unicode Collation Algorithm (UCA) rulebased table is automatically searched as a backup.」と書かれているので,こちらでは正しく動くかもしれない(未確認).

なお,Togetterでは,照合よりも正規化の話が進行していたのだが,現在の正規化方法ではまだ区別されてしまうという理解でよいのだろうか?(確かにテストコードは,そのように動くのだが…)

2011-01-13

[] 「Java 6 でIVS比較すると何が起こるか」の記事の誤り

以下の記事に誤りが散見されるが,それが広まるのは望ましくないので,ここで誤りを指摘しておく.

「Java 6 でIVSを比較すると何が起こるか」(yanok.net

まず,Java文字列の同一性判定の話である

これは想像通りですね。単にcharの列を比較しただけの結果になっています。つまり、見た目の区別がつかなくても容赦なく別々の文字列として扱っています。これが何をもたらすかというと、Stringクラス比較しているプログラムに対しては、"与" と "与[0E0100]" と "与[0E0102]" を、見た目の区別がないにもかかわらず、人が入力し分けてやらないと困ることになるということです。

Java言語Unicode文字列が同一性を判定するには,いくつかの方法がある.

  1. java.lang.String#equals()…単なるUnicode文字シーケンスの同一性を判定する
  2. java.text.Collator#equals()…Unicode照合規則に基づいて動的に同一性を判定する
  3. java.text.Collator#getCollationKey()+java.text.CollationKey#compareTo()…Unicode照合規則に基づいて静的にオブジェクトの同一性を判定する
  4. java.text.Collator#getCollationKey()+java.text.CollationKey#toByteArray()+バイナリ比較Unicode照合規則に基づいて静的にバイト列の同一性を判定する
  5. java.text.Normalizer#normalize()+java.lang.String#equals()…Unicode正規化規則に基づいて静的に文字列の同一性を判定する

このように多くの方法があるのは,文字列の同一性判定にいろいろな要求があるからである.たとえば,自然言語の正しい比較は2以降でしか行えないが,プログラミング言語ではUnicode正規化規則や照合規則をあえて適用しないと仕様で規定しているものが多く,その場合には1を用いることになる.また,String#equals()自体はUnicode文字シーケンスを比較しているだけだが,事前にNormalizerを使って正規化しておけば,毎回Collatorを使うよりも高速に処理できることになる(この機能はデータベースの実装に必要なので,私が強く要求して実現したものである).

次にIVS仕様に関する解釈である

UTS #37のIVDの仕様には「variation selectors are default ignorable」と書いてありますが、Javaはignoreしてくれないようです。

この引用部分をさらに長く引用すると,以下の通りである

Furthermore, variation selectors are default ignorable. This implies that registrants are expected to ensure that the glyphic subset associated with an IVS is indeed a subset of the glyphs which are acceptable for the base character alone. Stated another way, the shapes in the glyphic subset of an IVS should be unifiable with the base character of that IVS. One possible way to determine this is to consider the unification rules for Han ideographs; see [Unicode], section 12.1 Han, and [ISO 10646], annex S.

これを読めばすぐ分かるが,ここで述べているのは異体字選択子があったとしても無視して基底文字のグリフで代用してもよいというグリフやレンダリングエンジンにおける話であり,Unicode照合規則やUnicode正規化規則の話ではない(ざっとチェックした限りでは,それらにはまだIVSがらみの変更はないようだが,もし見落としがあれば教えて頂きたい).

つまり,ここでチェックすべき実装の部分はレンダリングエンジンでどのように表示されるかであり,文字列比較に関してはJavaの実装はUnicode標準に沿って実装されていると言える.もし,この部分の仕様に関して実装をチェックするとしたら,Javaレンダリングエンジンでどのように表示されるかであろう.

もちろん,今後各言語仕様や実装において,どのような機能拡張をすべきかという議論はあるだろう.その場合には,私もJavaC#ECMAScript仕様策定や標準化に関わってきたので,何らかの協力ができるかもしれない.

2010-08-12

[] ネットワーク創発する知能研究会 JWEIN10 参加者募集

日本ソフトウェア科学会のネットワーク創発する知能研究会ワークショップJWEIN10が,2010年8月20日(金)〜8月22日(日)の3日間,田町キャンパスイノベーションセンター東京で開催される.「ネットワークダイナミクス」と「ネットワーク創発する知能」に関した研究に興味のある人は参加して頂きたい.

http://www.ai.sanken.osaka-u.ac.jp/ndei/index.php?cmd=read&page=jwein_summer_2010

なお,今回は,一般講演に加えて,次のような招待講演をおこなう予定である.

  1. 折田 明子 氏(慶応大)「意図せず生まれる知識共有」
  2. 中谷 裕教 氏(理化学研究所)「将棋棋士の駒組認識
  3. 堀本 勝久 氏 (産総研)「システム生物学研究におけるネットワーク解析」

折田氏は,ブログTwitterなどのインターネット上のサービスユーザの知識が蓄積され,それが他のユーザによって活用される点に着目して,それがうまくおこなわれるためにはどのように設計すべきかを,調査結果を分析して説明してくれる.

中谷氏は,将棋棋士の脳活動が一般人とどう違うか?ということを説明してくれる.今年の人工知能学会全国大会でもこれは話題になったが,羽生名人の脳活動は凄いらしい.

堀本氏は,生物を,単なる分子としてではなく,それが関係したネットワークとして分析する方法について説明してくれるらしい.特定の条件を満たした時に活性化する制御ネットワークとは何か,当日明らかにされると思う.

この三人の講演者によるパネルディスカッションもおこなう予定だ.

2010-05-28

[] 樋浦秀樹さんを送る会(西麻布・クリニカ・ガストロミカ・エスペリア)

ガンで亡くなられた樋浦秀樹氏を送る会が開催されたので,私も行ってきた.

f:id:kazama:20100528194549j:image

確か15年ぐらい前に私の発言に関して直接メールを頂いたのがきっかけで,それからはいろいろ面倒を見て頂き,私の著書のレビューなどもお願いしたことがあったし,アメリカ日本で一緒に食事をしたこともあった.病気の話を聞いた時も,訃報を聞いた時も心の中で信じたくない気持ちがずっとあったが,この会に参加して彼が本当に亡くなったんだとようやく実感した.

なお,この日は彼の誕生日だったそうで,バースデーケーキが用意されていた.

f:id:kazama:20100528201453j:image

樋浦氏の偉大さを痛感したのは,この口コミで広まった会にものすごい人数の人達が集まったことだ(100名以上?).しかも,IT業界活躍されている凄い人達が多く.このような人達組織や分野の垣根を越えてこれだけ集まる機会はめったにないだろう.

しかし,我々も彼の死を悲しむだけでなく,彼に教えてもらったことを,さらに世の中に広めていかねばならないだろう.

蛇足:私が知っている人の中には,どうも私を覚えていない人が多かったようだ.その時は「まあ,私って印象薄いからなあ…」と思っていたのだが,後から三年前に15kg以上減量したので,最近会っていなかった人は私のことがわからなくて当然だったのだ(爆)こちらから積極的に声を掛けなくてごめんなさい.

2010-03-03

[] 竹内郁雄教授最終講義研究・開発は楽しく」(東京大学

3月3日東京大学竹内郁雄教授の最終講義がおこなわれた.

f:id:kazama:20100303151459j:image

なお,今回は参加者が多かった他の最終講義の参加人数から推測して340名の会場を用意したのだが,予想をはるかに上回る参加人数(400名くらい?)で,一部の人達は立ち見になってしまった.また,鵺シール竹内郁雄最終講義スペシャルバージョン普通は文字がオレンジ,これは文字がブルー)も300枚用意したのだが,全然足りなくて一部の人達には渡すことができなかった.この場を借りて準備不足をお詫びしたい.

なお,最終講義の様子は二台のビデオカメラ撮影してある.大学の許可が出れば,公開されるかもしれないので,その時はこのブログでもお知らせしようと思う.

さて,今回の講義の題名は「研究・開発は楽しく」である.竹内先生によると,通常の最終講義で喋る内容はすでに別の場所で喋ったので,それは講演の資料として配ることにして,最終講義では別の話にしたいということだった.その後知らされた題名を聞いてちょっとびっくりしたが,私は今回の講義の内容は情報処理分野の研究者開発者に対して送る竹内教授メッセージだと思っている.若かりしころのエピソード,電電公社NTT在籍時代のとんでもない話(爆)やユニークな,TAO/ELIS開発時の数々の逸話,Lispというプログラミング言語本質など,様々なことを話して頂いたと思うが,その根底にあるのは「人生仕事を真面目に存分に楽しめ.そうすれば,成果はその後についてくる.」ということだろう.ただし,その裏には補食(当時存在した残業すると支給されるご飯.Googleの只飯のようなもの)を食べて終電間際まで仕事をし,それなのに朝4時にインターネット接続の障害が起こるといきなりメールが飛び交ってリモートで問題を解決する(本当に,みんないつ寝ていたんだろう?(笑))ような真摯さがあったことも忘れてはならない.昨今,企業も大学もかなり締め付けが厳しくなってしまったが,竹内教授の最終講義を聞いた人は,信念を持って仕事は楽しくやって頂きたいと思う.

最終講義は爆笑ものであっただけでなく,以下の最後のスライドのように非常に含蓄のある言葉も沢山あったと思う.

f:id:kazama:20100303180845j:image

最後に講義中で紹介された二冊の本「初めての人のためのLISP[増補改訂版]」,「ガベージコレクションアルゴリズムと実装」を紹介しておこう.特に「初めての人のためのLISP」を読むと,「研究・開発は楽しく」という哲学を理解して頂けるのではないかと思う.

初めての人のためのLISP[増補改訂版]

初めての人のためのLISP[増補改訂版]

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装