ToDo:
最近の朝は、本当に寒い。今朝なんか、走り終わった後、一時的に手がすごく動きにくくなってしまったほどだ。これからの季節は、手袋でもつけて走った方がいいかも。去年、一昨年の冬も、走るときに手袋はつけてなかったから、そのままでもなんとかなるとは思うけど。
ふと思い立って、JavaでY Combinatorを書いてみた。Y Combinatorについては、自分は説明できるほど詳しくないので、このページなどを 参照(以下のコードも、そのページを参考にして書いた)。さて、JavaでY Combinatorを作るためのコードは以下だが、なかなかにすさまじい。Lambdaが何回も出てくるのは、元のコードでも似たようなものだから仕方ないとして、publicやらcallやらfinalといった、余計な文字が大量に出てくるのがたまらない。
public class YCombinatorTest {
private static int integer(Object arg) {
return ((Integer)arg).intValue();
}
private static Object apply(Object proc, Object arg) {
return ((Lambda)proc).call(arg);
}
public static void main(String[] args) {
Lambda y = new Lambda(){public Object call(final Object f) {
return apply(
new Lambda(){public Object call(final Object proc) {
return apply(f, new Lambda(){public Object call(Object arg) {
return apply(apply(proc, proc), arg);
}});
}},
new Lambda(){public Object call(final Object proc) {
return apply(f, new Lambda(){public Object call(Object arg) {
return apply(apply(proc, proc), arg);
}});
}}
);
}};
Lambda fact = new Lambda(){public Object call(final Object f) {
return new Lambda(){public Object call(final Object n) {
if(integer(n) == 0){
return new Integer(1);
}else{
return integer(n) * integer(apply(f, new Integer(integer(n) - 1)));
}
}};
}};
//fact(6) == 720が表示される
System.out.printf(
"fact(6) == %d%n", integer(apply(apply(y, fact), new Integer(6))));
}
}
interface Lambda {
Object call(Object arg);
}
今日は調子が悪かった。特別疲労感が残っているとかそういうのではないのだが、何故か思ったように力が出ない。例えるなら、気の抜けたビールのような感じか。とりあえず、走った後も特に疲れは残っていないようなので、体調の問題では無いようだが、何故だろう。昨日は、いつもより栄養を十分に取っていなかったから、そのせいだろうか。
今日は、JavaASTBuilderの実装を開始した。JavaASTBuilderは、Groovy Markupの一種で、Javaの抽象構文木を手軽に構築するためのライブラリ だ。まだ実装は完成していないが、例えば次のようにしてJavaの抽象構文木を構築できるようになる予定だ。
def builder = new JavaASTBuilder();
builder.unit {
type(name:"A"){
method("main",
modifiers:["public","static"],args:["args":"String[]]){
}
}
}
//上のコードを実行することによって、以下のコード(11/6追記:を表す抽象構文木)が生成される
/*
* class A {
* public static void main(String[] args){
* }
* }
*/
今朝走ったときに足の指にちょっとしたけがをしたので、薬局に消毒薬を買いに行ったところ、試供品としてビタミン剤が付いてきた。捨てるのもなんなので、とりあえず1つだけ服用してみることに。しかし、そのまま飲むのではなくて、ついお菓子のような感覚でかんでしまったところ、口の中にすごい苦い味が広がった。あわてて説明書きを読んでみると、「かまずに服用してください」の文字が。しかも、かんだときに歯の間に挟まったらしく、しばらく口の中から苦さが取れなかった。うー。災難だった。
k.inabaさんが開発した、Java言語を拡張して名前推論を扱えるようにしたコンパイラ。Jikesを改造して実現されているらしい。名前推論については、リンク先を参照のこと。
名前推論については、以前k.inabaさんの日記にそのネタが書かれた後に、この日記で言及したことがあったが、そのときはアイデアレベルの話だと思っていたので、こうして実装したものが出てくるとは思っていなかった。実装されている機能は、大体、次の2つのようだ。
k.inabaさんのページから引用:
public class Sample { public static void main( String[] args ) { String msg = "Hello, world."; System.out.println( String ); } }
k.inabaさんのページから引用:
wnd.add( new MouseListener(){ ... } )
あと、おまけとして、D言語やC#3.0のような、変数の宣言時に初期化子から型を決定する構文も導入されているようだ。これは、C#3.0と同じように書くようだ。この機能は、Onionにもあるが、C#3.0もD言語も、Onionと違って明示的な宣言構文(varなど)が必要な点が違う。
k.inabaさんのページから引用
var msg = "Hello, World."; //String型
var pi = 3.141592; // double型
var n = 100; // int型
var wnd = new JFrame(); // JFrame型
var x = new int[] { 1, 2, 3 }; // int[] 型
追記:Nikesをダウンロードして使ってみた。 使ってみた感想は、とにかく「面白い」。例えば以下のソースが動くのは、なかなか新鮮。以下のソースのように濫用すると凄まじくソースが読みづらくなる可能性があるので、諸刃の剣ではあるが。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class UsingNikes extends JFrame {
public UsingNikes() throws HeadlessException {
//setDefaultCloseOperation(EXIT_ON_CLOSE)
closeOperation(EXIT_ON_CLOSE);
//getContentPane().setLayout(new FlowLayout())
contentPane().layout(new FlowLayout());
JButton button = new JButton("Button1");
//button.addActionListener(...)
JButton.add(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Button1 Clicked");
}
});
//add(button)
add(JButton);
//左辺値もOK. button = new JButton("Button2");
JButton = new JButton("Button2");
//button.addActionListener(...)
JButton.add(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("Button2 Clicked");
}
});
//add(button)
add(JButton);
pack();
}
public static void main(String[] args) throws HeadlessException {
//SwingUtitlies.invokeLater(...)
SwingUtilities.later(new Runnable(){
public void run(){
//setVisible(true)
new UsingNikes().visible(true);
}
});
}
}
あと、推論方法に問題があって、一部のメソッドが呼び出せない。例えば、以下のようなソースは、showMessageDialog(Component,Object)とshowInternalMessageDialog(Component,Object)のどちらにも適合するので、あいまいであるというエラーが出てしまう。
JOptionPane.showMessageDialog(component, "ほげほげ");
今朝、起きてから少し考えたのだが、名前推論はIDEの補完機能として実装した方が使いやすいのではなかろうか。というのは、従来の補完機能では、呼び出したいメソッドを絞り込むためにある程度余計な名前をタイプする必要があったが、名前推論を使用することで、その必要性をかなり減らせるのではと思うからだ。
例えば、昨日の例で、addMouseListenerをaddとして呼び出すというのがあったが、これをIDEの補完機能として実現することを考える。ここで、IDEの補完機能というのが重要だ。なぜならば、補完機能なら、複数の候補が出現しても一向に問題無いからだ。とすると、メソッド名をタイプする必要は無いので、単に次のようにタイプすればいいことになる。
wnd(new MouseListener(){ ... })
この状態で補完キーを押すと、addMouseListenerとremoveMouseListenerの2つのメソッドが候補として現れることになるので、そこから本当に呼び出したいメソッドを選択すれば良い。このようにすれば、呼び出したいメソッドを選択するために、余計なキーをほとんどタイプせずに済む。
こんな毎日・・・ Script_on_Java経由で。XMLの代替記法で、次のように書けるらしい。これは、自分が求めていたXMLの代替構文のシンタックスにかなり近いかも。テキストを""で囲まなければならないため、ドキュメントを書くために使うのはつらそうだが、それ以外の用途ではなかなか便利かもしれない。
XML SML
<foo bar="baz"> foo bar="baz"{
<foobar/> foobar;
<text>data</text> text{"data"}
</foo> }
以前、Eclipse ProfilerプラグインをEclipse 3.1に対応させるためにソースを修正したという事を書いたが、実はそんな事は必要無かったという事が判明した。積み木小屋に書いてあるところによると、
"Latest File Releases"しかチェックしてなかったけど,実はその下に"Patches"ってのがあって,そこでEclipse3.1用のJARファイルが公開されてた.
らしい。Eclipse Profiler Pluginのページを見てみると、確かにPatchesがあって、その中にEclipse 3.1用のJARファイルが公開されていた。しょんぼり。
未踏ユースのページには一応書いてあるものの、これまでStormを開発することになった動機について日記では書いていなかったと思うので、ちょっと書いてみることにする。以下、その説明。
Eclipseは非常に便利なIDEだ。構文の色付け機能やメソッド一覧などの補完機能はもちろんのこと、クラス/メソッド/フィールドなどの名前変更やメソッドの抽出など(リファクタリング)を行う機能や、オーバーライドするメソッドのスタブの自動生成、CVSとの連携なども標準的な機能として備えている。これらの機能を活用することで、通常のエディタでコードを書くのに比べてコードをかなり速く書くことができる。
しかし、一方で、Eclipse上では行うことが困難な作業がある。例えば、Javaプログラムを書いていて、複数のクラス名について、プレフィクスを付加するという作業を行いたいとする。Eclipseでこのような作業を行うには、メニューの選択と実行を何度も繰り返さなければならない。
それが嫌なら、Eclipseのプラグインとしてそのような機能を実装するという事は考えられる。JDTのAPIでは、Javaのクラス名などを変更するための機能を提供しているため、それを利用することができる。しかし、プラグインは、基本的に再利用するためのプログラムを作ることを前提としているのか、作成するための手間が通常のプログラムに比べて大きい。そのため、使い捨てのプログラムのように、作成する手間が少ないことが重要なプログラムを作るのには向いていない。
別の手段としては、Rubyなどのスクリプト言語を用いて、Eclipseの外でそのような作業を行うことも考えられる。しかし、それらの言語はJavaの構文を知らないので、単純なテキスト置換を行うプログラムにならざるを得ないが、その場合、誤って変更すべきではないテキストまで変更してしまう可能性がある。例えば、名前を変更するクラスとパッケージ名は違うが単純名が同じクラスがあった場合、間違ってそれを変更してしまう可能性がある。それでも手でいちいち変更するよりは楽ではあるが、予期しない変更をしてしまわないか気にしなければいけないのは、精神衛生上良くない。
このように、いずれの手段を用いても、高々クラス名の変更を一括して行う程度の作業が簡単に行えないのが現状だ。しかし、ちょっと考えてみると、Eclipseは、プラグインを開発するための豊富なAPIを提供しているのだから、これをプラグインを作ることなく、Eclipse上から直接利用することができれば、問題は解決するのではないだろうか?これこそがStormでやろうとしていることだ。
約5ヶ月ぶりに角ふじに行った。といっても、大学の近くの天神角ふじは6月で閉店してしまったので、行ったのはサイエンス大通り沿いにある明神角ふじだ。頼んだのは、当然(?)、つけ麺の800g。さすがに長い間食べていなかったため、ちょっときつかったが、なんとか完食することができた。
今日の昼間に申し込みをしようとして、既に締め切られていてがっかりしたのだが、今さっきページを見てみると、なんと
一度、80人で締め切りましたが、会場にもう少し余裕があるようなので、20人分の追加募集を始めました (2005-11-16T23:55)。
とのこと。早速、参加申し込みを行った。当日が楽しみだ。
MYCOM PC WEBより。実際に試してみるには、このページにあるJava Web Start版へのリンクをクリックすれば良いようだ。
こんな毎日・・・ Script_on_Java経由で。Groovyを使ったソフトを作っている身としては、どの程度不具合が修正されているのか気になる。
さて、今日はつくばマラソンだったのだが、結果だけ言うと、完走できなかった。
走り始めた時点で右膝が痛み出しており、しょっぱなから既にまずい状態だったのだが、それでも10km過ぎくらいまではなんとかなった。しかし、それ以降は膝の痛みのため、とても走れる状態ではなくなったので、なんとか歩いて行けるところまでは行くことに。
20kmを過ぎた辺りで、膝の痛みとは関係無しに、足のあちこちが疲労してきて、歩き続けるのもかなりつらくなってきたため、結局、23.5kmを過ぎた辺りで、リタイアした人を乗せる収容車に乗って、スタート地点まで帰って来た。
今年は、規定時間内に完走するつもりでいただけに、悔しい。しかし、考えてみれば、たかだか1ヶ月ちょっとくらいのトレーニングでフルマラソンに挑んだのが無謀だったのかもしれない。来年は、もっと長期的な計画を立てて、トレーニングをすることにしよう。
_ おの [おつかれです。 俺は中間地点でリタイアですよ。 見かけなかったということは、俺は常に後ろにいたのかな? ]
_ みずしま [> おつかれさまです。 > 私は最近、100m走っただけでも息切れが...。 よろしければ、ささださんもどうです?..]
_ 斎藤ただし [お疲れさまでした。完走できなかったとはいえ、ハーフまで行ったとはすごい。俺も来年は参加したいなぁ。 あとはとにかく、..]
_ mayaqua [乙です〜、ご無事が何よりです。 膝の調子が芳しくないようでしたら、病院に連行する方向で検討しておきます。 ]
_ みずしま [> お疲れさまでした。完走できなかったとはいえ、ハーフまで行ったとはすごい。俺も来年は参加したいなぁ。 あとはとにか..]
Javaクラスからそれを操作する(JNIを使った)C++のソースコードを生成するというソフトウェアらしい。そこまでするなら、初めからJavaでプログラムを書いて、一部だけJNIを使うようにすればいいような気がするが、どうなんだろうか。
千葉滋先生による、アスペクト指向の入門書(?)。アスペクト指向については、基本的なことは大体理解しているつもりだが、1度自分の持っている知識を整理しておきたいので購入した。
内容はと言えば、アスペクト指向入門といいつつ、全然入門書では無かった(と思う)。どのくらい入門ではないかというと、Bertrand Meyerのオブジェクト指向入門がオブジェクト指向入門では無いくらい。いや、本当のところは、確かに入門でもあるのだが、それにとどまらず、MOPやリフレクションとアスペクト指向技術の比較、Hyper/JなどのAspectJとは異なる系列のアスペクト指向言語の紹介など、様々な内容について取り扱われており、読んでいて飽きない。
また、専門の研究者らしく、Aspect指向に対するうんちくを語ったり、AspectJの仕様の複雑さについて批判しているのも面白い。アスペクト指向に興味のある人は、買ってみて損はしないと思う。
_ TELL [うわー ]