ToDo:
Java5になってGenericsが導入されたため、たくさんのクラス及びメソッドがGenerics対応になった。java.lang.ObjectのgetClass()メソッドもその1つで、このメソッドそれまでは、
Object getClass()
だったのだが、Java5では、
Class<? extends Object> getClass()
となっている。この型自体は、別に何も問題では無い。問題なのはAPIドキュメントの記述で、この返り値型について、Object#getClass()のAPIドキュメントでは、
The java.lang.Class object that represents the runtime class of the object. The result is of type Class<? extends X> where X is the erasure of the static type of the expression on which getClass is called.
と書かれている。これは、例えばString型のインスタンスを保持している変数strがあったら、str.getClass()の値が、Class<? extends String>になるということだと思うんだが、ObjectクラスのgetClass()の宣言を見ても、返り値の型はClass<? extends Object>としか宣言されていない。初めは、共変戻り値型の機能を使ってサブクラスでオーバーライドしているのかと思ったが、Object#getClass()はfinalであり、サブクラスでオーバーライドできるわけが無い。試しに自分で次のようなコードを書いて実験してみても、コンパイルエラーになるだけだった。
public class Main {
public static void main(String[] args) {
B b = new B();
Class<? extends B> classB1 = b.getClass();//これはOK
Class<? extends B> classB2 = b.call();//コンパイルエラー
}
}
class A {
Class<? extends A> call() { return null; }
}
class B extends A {
}
何故、java.lang.Object#getClass()だけ、返り値の型がサブクラスで勝手に変わるのだろうか?謎だ…。ちょっと、JLS を調べてみよう。
WORDの企画で、利きコーラを行った。用いたコーラは、コカコーラ、ダイエットコカコーラ、ペプシ、Dr.ペッパー、ガラナなど10種類。3つほど特異な味のものがある他は、ほとんど区別できなかったため、テキトーに書いたが、正解できたのは、Dr.ペッパー1つだけだった。ちなみに、優勝者は、7つも当てた。よくそれだけ当てられるものだ。
味を比べるために、コーラばかり飲まなくてはならなかったため、終わった後は、しばらくお腹が気持ち悪かった。うえっぷ。しかし、この後歯医者に行かなくてはならないというのに、自分は一体何をやっているのだろう…。
今までOnionの開発には、ずっとEclipse3.0を使ってきたが、そろそろ3.1に移行することにした。移行は、大体次のような手順で進めた。
3.のキーバインドの移行は、キーバインドの設定が保存されているファイルがわからなかったため、手間がかかったが、なんとかそれらしいファイル(workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings\org.eclipse.ui.workbench.prefs) を探し出して、新しいワークスペースの同名のファイルを書き換えたところ、うまくいった。インデントなどの設定などはまだ移行できていないが、キーバインド以外は、それほどカスタマイズしているわけではないので、なんとかなるだろう。
Java5で関数型プログラミングっぽいことをするためのライブラリを作ってみた。とりあえず現在までに、6要素までのタプル、6引数までの関数のカリー化、Listに対するmap,foldl,foldr,zip,exists,filter,find,all,tabulateまでを実装した。 また、可変長引数の機能を使って、リストを簡単に生成する関数も実装した。このライブラリを使用したプログラムは、以下のようになる。
import java.util.List; import jp.gr.java_conf.mizu.fpl.*; import jp.gr.java_conf.mizu.fpl.tuples.*; import static jp.gr.java_conf.mizu.fpl.Lists.*;
public class Usage { public static void main(String[] args) { List<Integer> src = list(1, 2, 3, 4, 5);
List<Integer> powerList = map( new Fn<Integer, Integer>(){public Integer $(){ return arg * arg; }}, src); System.out.printf("powerList = %s%n", powerList);
int sum = foldl( new Fn<Tuple2<Integer, Integer>, Integer>(){public Integer $(){ return arg.arg1 + arg.arg2; }}, 0, src); System.out.printf("sum = %d%n", sum);
List<Integer> reversed = foldr( new Fn<Tuple2<Integer, List<Integer>>, List<Integer>>(){ public List<Integer> $(){ arg.arg2.add(arg.arg1); return arg.arg2; }}, emptyList(Integer.class), src); System.out.printf("reversed = %s%n", reversed);
List<Tuple2<Integer, Integer>> pairList = zip(src, src); System.out.printf("pairList = %s%n", pairList);
boolean exists = exists( new Fn<Integer, Boolean>(){public Boolean $(){ return arg > 3; }}, src); System.out.printf("exists = %s%n", exists);
List<Integer> filtered = filter( new Fn<Integer, Boolean>(){public Boolean $(){ return arg > 3; }}, src); System.out.printf("filtered = %s%n", filtered);
int found = find( new Fn<Integer, Boolean>(){public Boolean $(){ return arg % 3 == 0; }}, src); System.out.printf("found = %s%n", found);
boolean all = all( new Fn<Integer, Boolean>(){public Boolean $(){ return arg < 6; }}, src); System.out.printf("all = %s%n", all);
List<String> alphabets = tabulate(5, new Fn<Integer, String>(){public String $(){ return String.valueOf((char)('a' + arg)); }}); System.out.printf("alphabets = %s%n", alphabets); } }
実行結果は、以下のようになる。
powerList = [1, 4, 9, 16, 25] sum = 15 reversed = [5, 4, 3, 2, 1] pairList = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)] exists = true filtered = [4, 5] found = 3 all = true alphabets = [a, b, c, d, e]
プログラマー日記の9/18のエントリに対するツッコミで、数日中には返事をすると言っておきながら、約半月が経ってしまい、申し訳ありません。もともとは、9/11のエントリに対してコメントするつもりでしたが、それから時間が経って、議論のまとめを書かれたようなので、それに対するコメントという形にさせていただきます。
* Objective-CやRubyでは、メソッドシグニチャを動的に指定できる機能がもともと存在する。Javaでは、まずJVMのレベルではそのような機能はなく、JavaのレベルでReflectionAPIを組み合わせる必要がある。
これはその通りですが、JVMという「実装」の話とObjective-CやRubyの「仕様」を同列に比較しているのは奇異に感じます。JVMの仕様によって言語仕様が制約される場合もありますが、少なくとも今回のケースでは、動的なメソッド呼び出しのパフォーマンスの問題さえ抜きにすれば、現在のJVM上のJava言語でも実現可能なわけですし。
* JVMで任意のメソッドシグニチャを指定できるようにするには、JVMレベルでの新しいバイトコードの導入と、Javaレベルでのメソッドシグニチャを求める機能が必要。
前者についてはわかりますが、後者のJavaレベルでのメソッドシグニチャを求める機能というのが、具体的にどういうものをさしているのかがよくわかりませんでした。
* メッセージ指向言語で任意のメッセージが送信できるのは、型づけが弱いため。Javaでは強い型づけを行うため、そのようなことを許していない。
これはどうでしょう。強い型付けを理由に任意のメッセージが送信できる機能を(専用構文/ライブラリを問わず)サポートしていないのだったら、リフレクションAPIも同様の理由でサポートしないのが自然なように思えますが…。
* メッセージ指向言語でのメソッドシグニチャはクラスとは結びついていない。Javaのメソッドシグニチャを表すMethodオブジェクトはクラスと結びついている。(上の記事より拝借)
Javaのメソッドシグニチャを表すというよりも、リフレクションAPIにおけるメソッドを表すというのが正確なところでは無いでしょうか。また、このことは単にリフレクションAPIの設計の問題であって、メッセージ指向云々の話とは直接結びつかないように思います。
先日の日記で、可変長配列を使ってリストリテラルを作っていたが、この方法を応用すれば、配列リテラルも作れることに気がついたので、作ってみることにした。ソースコードはこんな感じ。staticメソッドarrayの宣言で、型パラメータTの可変長引数を取るようにしているのがポイント。このようにすることで、引数の型から自動的にTの型を推論してくれるため、配列の生成時に明示的に型を指定する必要が無い。
public class Array {
public static <T> T[] array(T... args) { return args; }
public static void main(String[] args) {
String[] strings = array("A", "B", "C", "D");
for(String string : strings) {
System.out.println(string);
}
}
}
ちなみに、実行結果は以下のようになる。
A B C D
まあ、配列の場合は、new 型名[]{...}形式の構文があるため、リストリテラルに比べると必要性はあまり無いが、配列の型名を記述する必要が無いのは、少し便利かもしれない。また、この方法には欠点があって、array(1,2,3,4)のような式が、Integer[]と推論されてしまう。型パラメータTがプリミティブ型を取れないゆえの制約なのだが、ちょっと不便だ。この問題に対しては、arrayメソッドをオーバーロードして、以下のようなメソッドの定義を加えることで、とりあえず解決することはできる。
int[] array(int... args) { return args; }
しかし、これをさらに拡張してdouble[]なども扱えるようにしようとして、以下のようなメソッド定義を加えると、array(1,2,3,4)の呼び出しは、array(int... args)と、array(double... args)の両方に適合するため、あいまいであるということでコンパイルエラーになってしまう。
double[] array(double... args) { return args; }
今までは、輪講では英語の技術書の内容を解説していくというものだったが、来週から毎週1つずつ英語の論文について、内容をまとめて発表する形式に変わることになった。今までよりも面白くなりそうで良いとは思うのだが、論文の内容をまとめて解説したことは無かったので、最初は苦労しそうだ。
とりあえず、On Variance-Based Subtyping for Parametric Types、TYPE INFERENCE WITH DEFERRAL、Meta-programming in Nemerleの3つの論文をダウンロードして印刷した。
まずは、TYPE INFERENCE WITH DEFERRALから読み進めているが、なかなか面白い。
友人が、Eclipse 3.1でEclipse Profiler Pluginが使えないが何故かという質問をしてきたので、原因を調べることになった。とりあえずプラグインをダウンロードして、インストールしてみたところ、確かにエラーメッセージが出て、動作しない。マニュアルを読んでみると、
とあるので、JREのbinディレクトリにProfilerDLL.dllを置いてみたが、やはり同じエラーが発生する。Copy ProfilerDLL.dll from root plugin folder into bin folder of your JRE installation
ここで、友人がjMechanicでも同じエラーが発生すると言ってきたので、インストールしてみると、確かに同じエラーが発生する。jMechanicのソースをダウンロードして読んでみると、Eclipse 3.1には無い、Eclipse内部のパッケージのクラスに依存していたせいで、クラスが見つからなかったようだった。Eclipse Profiler Pluginが使えなかったのも同じ原因だろうと思い、Eclilpse Profiler Pluginのソースをダウンロードして調べてみると、やはり、3.1には無いクラスに依存している箇所が存在した。Eclipse 3.1にあるクラスを参照するように書き換えてビルドすると無事、3.1で使えるようになったので、そのバイナリを友人に渡して、なんとか問題は解決した。
リファクタリング機能を提供するライブラリの実装を開始した。現時点で、次のようなgroovyプログラムをEclipseのエディタ上で入力して、メニューからプログラムを実行することで、プロジェクトの名前が変更できる。
import org.onion_lang.storm.lib.*;
hello = Projects.select("foo")//プロジェクトfooを取得 hello.rename("bar")//プロジェクトfooをbarに名前変更
ちなみに、パッケージ名の中にあるstormというのは、今回開発するプラグインの名称で、太陽風を意味するsolar stormに由来している。実は、名称は長い間決めあぐねていたのだが、Eclipseプラグインには、太陽に関係する単語が多いので、何か適当な太陽関係の単語に由来する名称にしようと思って辞書を調べていたところ、solar stormというのがなんとなくカッコ良さそうなので、それに決定したのだった。
_ naoki [失礼します。 僕もEclipse Profiler PluginをEclipse3から 使おうとしましたが同じように..]
_ みずしま [わかりました。メールアドレスを教えていただければ、こちらからお送りしますよ。私のメールアドレスは、hau51010@..]
_ みずしま [あ、すみません。ちゃんとメールアドレスは書かれていますね。編集モードで見てなかったので、気づきませんでした。今日、明..]
_ strano strozzare [ donne arrapate gay gay asiatici pompini vecchie troie c..]
_ malattia bocca mano piede [ piano practice cancun hotel zone map free mpeg 2 decode..]
_ soutaro [俺もあとで読もーっと。>TYPE INFERENCE WITH DEFERRAL ]
_ みずしま [名前一致の型システム上で型推論する話なので,soutaroさんの 興味の方向とは若干違うかもしれませんが,面白いです..]
_ Stephen Diedericks [ * * * * * * * * * * * * * * * * * * * ..]
_ fregna xxx [ lesbe putas culiando stravagante pompino gangbang culia..]
_ all inclusive hotels cancun mexico [ binhex 4 0 decoder free bocchino cazzo grosso duro bloc..]
今日の輪講で、Meta-programming in Nemerleについて紹介したときに、 研究室のM田先生に教えてもらったのだが、Nemerleという名前は、ゲド戦記という作品の登場人物Nemmerleの名前が元になっているらしい。確かに、 Nemmerle ゲド戦記やNemmerle Gedでぐぐると、それらしき文章が出てくる。しかし、ゲド戦記という作品、名前こそ聞いたことはあるものの、実際にどんな話なのかさっぱり知らない。今度、図書館ででも借りて、読んでみるか。
_ ISHFAQ [ゲド戦記は岩波少年文庫にもあるとても有名な物語です。 哲学的ファンタジーで名文名言の宝庫と言われています。 ]
_ みずしま [情報ありがとうございます。つくば市の図書館に あるそうなので、今度借りて読んでみることにします。 > ゲド戦記は岩波..]
_ sexi shop online [ grandes pollas gratis mulatas lesbe sborrata bukkake b..]
_ retirement dental insurance [ gay web cam chat autocad blocco tegola free xp dvd deco..]
_ filmini comici [ rosse porno foto sverginate vergas gigantes pompini po..]
_ cancun hotels with luxury suite [ free gay live chat elk lighting riu cancun hotel and re..]
_ eoitfb ayfwusdbn [merkvs zmwr fgjwml jkvcmqdy bxqesw pdjk ihkrenc ]
_ csgme yqwim [fzsju amhjog aiehxms cvxwoj zutmnkfw eiud nvlguo ]
IKeJIから回ってきた。よりにもよって、こっちに回すとは。
初恋はいつですか?
小学生の頃。同じクラスの子だったけど、もちろん、告白なんてするわけも無く。そもそも、ほんとに恋だったのか、今となっては自信が無い。今まで付き合った人数は?
0人。IKeJIもこのことをわかってるはずなのに、バトン渡すんだもんなあ。好きな人とデートしたい場所は?
特にここじゃなきゃというのは無い。強いて言うなら、一緒にハイキングとかできたら嬉しいかも。特に無い。最近、全然映画見ないので。
好きな人に言われて一番うれしかった言葉は?
そんな言葉を言われるようになりたいなあ。今好きな人いますか?その人の好きなところは?
いない。こんな人は絶対無理って人は?
真面目な(と一般に認識されるような)話を嫌う人。浮気は許せますか?許せるならどこまで?
付き合ったことが無いので、わからないなあ。同棲してみたい?
YES。同棲以前に付き合えなきゃどうしようも無いけど。あなたが愛を感じる行動は?
そんな行動をしてもらえるようになりたいなあ。愛と恋の違い
恋は一時的なもので、愛は持続的なもの、か?一番長く続いた恋愛は?
そもそも続いたことが無いなあ。お付き合いしたい有名人・芸能人は?
特に無し。究極の選択一生人を愛せなくなる・愛されなくなる、どっち?
愛せなくなる。このバトンを渡す五人は?
めんどくさいので、渡さない。うーむ、なんだか不毛な回答ばかりになってしまったが、こればっかりは仕方が無い。
Eclipse SDKには、コードを自動でインデントしてくれる、コードフォーマッターがあるのだが、これが(自分にとって)微妙に使いにくい。コーディングスタイルの設定項目はかなり豊富で、その範囲内でかなりのニーズに答えることができるのは確かなのだが、自分の使いたいコーディングスタイルに合わせることがうまくできないのだ。
例えば、
String[] strs = {"a", "b", "c", "d", "e", ... }
のようなコードがあったとする。このとき、初期化の中が長すぎて、指定したカラム数に収まらないとき「のみ」、
String[] strs = {
"a", "b", "c", "d", "e", ...
};
のようにインデントするようにしたい。しかし、常に(初期化子が指定したカラム数に収まるときでも)
String[] strs = {
"a", "b", "c", "d", "e", ...
};
とする設定はできるものの、指定したカラム数に収まらないときのみそのようにする設定がうまくできない。万人のコーディングスタイルに対応するのは無理かもしれないが、ちょっと不便だ。サードパーティのコードフォーマットプラグイン(例えばJalopy)を使うという手もあるが、SDKで標準的に使える機能と同じような機能を持ったプラグインを新たにインストールするのもどうかという気がしないでもない。
_ xmbrpsl necdfw [cljbzw uwxbt bxhngcrw lsvtijpau bfydankcg tgkziv eokf ]
_ judqk nirchsyzk [eyhf ntyhg fozpresyd htnmdubsl jgushyqex nekwt sajzmtxuh ]
_ rokihd fvcrkebgd [crytwks dymx xunkpvis ctxg fmqezv qombwzpx lcysowin ]
_ dkvt pfmwr [ihqrwd wtuqyg vnka qcxnj kxghfmj cyve iqwcmrgh ]
_ chuwq itpfl [sehgqoydl iwbqkhvur fkel yfujkdgo vftop xcvyj felyc ]
_ sexy raconti erotici [ amas dominantes gangbang candid piedi insensato student..]
_ the piano [ riu cancun hotel and resort sicilia in bocca texas dent..]
_ parmsgb ocxdfplji [qdnzay fqcbk wxlmiy bfzravcu vzadkis rkxa zsatrpx ]
_ fvika mgizd [ekfjrlbt gabe dizaosxk geuyczk skumpxgeq lmwjrz vxpujia ]