Hatena::ブログ(Diary)

Cafe Babe RSSフィード

2006-09-13

[] 設計のブラックホール理論

James Goslingブログに書かれていた話だが,元はGuy Steeleの話らしい.

http://blogs.sun.com/jag/entry/the_black_hole_theory_of

ざっと訳すと次のような感じか?

Lispブラックホールだ.もしLispではない何かを,Lisp風に設計しようとすると,設計の引力がそれをブラックホールに引き込むことがわかるだろう.そして,それはLispになるんだ.

Jamesは例のクロージャの提案に関連してこの話を持ち出してきた.意図を正しく読み取れていないかもしれないが,たとえばLispは簡素でフレキシブル言語でありながら現在ほとんど使われていない理由は,その強力さゆえに言語重力崩壊を起こしてしまったからで,Java言語においてもクロージャ機能の追加はそのような危険があるという指摘だと理解すればいいのか?(ぜひコメントをよろしく).

なお,その下に付けられているコメントの内容が種種雑多で面白いので,時間があればざっと目を通してみるのもよいだろう.

2006-09-05

[] 石原直樹退職

Sun Microsystems石原直樹さんが,彼のブログ退職したことを告白している.

http://blogs.sun.com/chats/entry/%E5%8D%92%E6%A5%AD

彼はJava Technology Evangelistであったが,社内的な業務だけでなく,Java関連のオープンソース活動のサポートを積極的に行ってくれたことに非常に感謝したい.イベントにおける発表・交流の場の提供,U.S.の技術者との交流の支援などをはじめとして,彼のJava関連のオープンソース活動への貢献は非常に多大であり,決して無視することはできないということに異論がある人はいないだろう.ここで,心を込めて「今までどうもごくろうさまでした」と感謝の意を伝えておきたい.

最近報道されているように,日米のIT業界は(特に優秀な)人材の流動化が活発になりつつあり.実際,私が優秀だと思う人達からは(彼を含めて)転職の報告や内密の相談を受けることが頻繁になってきた.彼らが一番求めているのは,やりがいのある仕事と,正当な評価であり,それを満たしてくれる職場に移っているようだ.しかし,日本企業には優秀な人間を特別扱いできないので,他の企業に流出させてしまう傾向が見られるような気がしているのだが,結局人間が一番重要なこの業界が,今後どのように変わっていくのか非常に興味深い.

2006-07-20

[] レアグッズ希望の声

Dukeマウスで味を占めた(?笑)サン・マイクロシステムズが,レアグッズに関する希望の声を発表していた.

http://jp.sun.com/communities/users/0607/feature02.html

いやあ,みなさん面白い意見でわくわくしてくる(笑).個人的には,WebカムとBluetoothヘッドセットに一票かな.メモパッドを見ていて,巻き取り機付きのケーブル(USBとか)もありかなと思う.コアなネタを出せば,Dukeマーク付きのHP-16C(RPNのプログラミング専用!電卓)だけどね.

2006-06-05

[] binarySearchメソッドのバグ

GoogleのJoshua Bloch(Sun Microsystemsから転職したのは,このブログの読者は知ってるよね?)が,Google Research Blogで長い間眠っていた興味深いJavaのライブラリのバグについて報告している.

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

問題があるのは二分探索のコード中の中間を知るために平均を求める部分なのだが,整数値を加算した時にオーバーフローすると負の値になってしまい,その結果ArrayIndexOutOfBoundsExceptionが投げられるというものだ.java.util.Arraysクラス以外にも,java.util.Collectionsクラスやjava.util.TreeMapクラスや,他の分割統治法を用いるようなコードに存在している.自分のコードを見直してみるのもよいだろう.

さて,この部分だけを取り出したサンプルコードを書いてみた.

public class AverageTest {
    public static void main(String args[]) {
	int high = 100;
	int low = 10;

	System.out.printf("high = %d, low = %d?n", high, low);
	System.out.printf("1, (low + high) / 2 -> %d?n", (low + high) / 2);
	System.out.printf("2, (low + high) >> 1 -> %d?n", (low + high) >> 1);
	System.out.printf("3, (low + high) >>> 1 -> %d?n", (low + high) >>> 1);
	System.out.printf("4, low + ( (high - low) / 2) -> %d?n",
			low + ( (high - low) / 2));
	
	high = Integer.MAX_VALUE;
	low = Integer.MAX_VALUE - 1;

	System.out.printf("?nhigh = %d, low = %d?n", high, low);
	System.out.printf("1, (low + high) / 2 -> %d?n", (low + high) / 2);
	System.out.printf("2, (low + high) >> 1 -> %d?n", (low + high) >> 1);
	System.out.printf("3, (low + high) >>> 1 -> %d?n", (low + high) >>> 1);
	System.out.printf("4, low + ( (high - low) / 2) -> %d?n",
			low + ( (high - low) / 2));
    }
}

この実行結果は,以下のようになる.つまり,正しいコードは3と4だ.

high = 100, low = 10
1, (low + high) / 2 -> 55
2, (low + high) >> 1 -> 55
3, (low + high) >>> 1 -> 55
4, low + ((high - low) / 2) -> 55

high = 2147483647, low = 2147483646
1, (low + high) / 2 -> -1
2, (low + high) >> 1 -> -2
3, (low + high) >>> 1 -> 2147483646
4, low + ((high - low) / 2) -> 2147483646

さて,この興味深いバグは,いくつかの示唆を与えてくれる.一つは,この種のバグは非常に見つけにくいことであり,もう一つは技術の進歩の早さである.昔は32ビット空間は広大だと思ったが,今では必ずしもそうではない.Webの登場により,大規模データを処理するのが当たり前となりつつある昨今,この種のバグを作らないこと,また早期に発見して修正することが,ますます重要になっていくだろう.

2006-05-12

[] AJAX FAQ日本語版

最近AJAX関係の仕事をしているSun Microsystemsの吉田豊さんが,Greg MurrayのJava開発者向けFAQを日本語訳してくれた!

http://blogs.sun.com/roller/page/yuta?entry=java_%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E5%90%91%E3%81%91_ajax_faq

ちなみに,彼が翻訳してくれているらしい,日本語版アクエリウムもJava開発者には必読であろう.もし知らないなんて人がいたら,ぜひ一度見て見るべし.

http://blogs.sun.com/roller/page/theaquarium_ja