goo blog サービス終了のお知らせ 

N2 ToolBox(跡地)

跡地です。引っ越しました。http://d.hatena.ne.jp/nosen

Vimperator: feedSomeKeys.js

2008-09-19 08:50:14 | オープンソース
Vimperator はLivedoor Reader や GMailを使ったときにキーバインドがぶつかって若干問題があると以前書きましたが、 feedSomeKeys.js というプラグインを使うと解決できるらしい。

feedSomeKeys.js は指定したキーイベントをスルーしてWebページ側に送ることが出来るプラグインです。autocommand という、ページのロードやタブの切り替えといったイベントをトリガーとして自動的に何かを実行するVimperatorのコマンドと組み合わせて、
Livedoor Readerや、GMailを開いたときに大事なキーイベントをWebページ側にスルーする設定を行います。

こちらのページを参考にさせていただきつつ、設定してみました。

出来ました。

Vimperatorはカスタマイズがとっても簡単だということがわかりました。すばらしい。

Ant+Ivy vs Maven2

2008-09-13 10:05:02 | オープンソース
Apache Ivyについてもう少し調べてみました。Maven2 との比較で考えてみたいと思います。

Apache Ivyの機能は依存関係を解決するという限定されたもので、ビルドプロセスの構築に必要な残りの部分はAntが担当します。
一方 Maven2 はプラグインの形でビルドに必要な全ての機能が提供されており、かつ少ないPOMの記述量でそれらの機能が利用できるように工夫されています。
Ivy自体は設定ファイルの記述量が少なくて済むようにほとんどの設定項目に妥当なデフォルト値が設定されているのですが、Antが担当する部分は当然自分で書かなければならないし、書くことができます。
Maven2 ではフェーズを自分でカスタマイズすることが困難であるが故に、ちょっと難しいことをやろうとすると、それを実行するantrunの設定をどこのフェーズにバインドさせるかで悩まなければならない場合がしばしばあります。で、結局本来のフェーズの意味を無視した場所に変な処理を突っ込むはめになります。

依存関係を解決する機能についてIvyの機能をみてみると、大きく異なるのが解決した jar 等を配置する場所です。Maven2ではローカルリポジトリに置いて、コンパイル時にもローカルリポジトリに配置されたjarが参照されますが、Ivyのデフォルトの動作では、解決されたjarはプロジェクトのlibディレクトリに突っ込まれます。Eclipseで開発する場合であれば、個人の開発環境をセットアップする時に、Mavenをインストールしなくてよいというメリットがあります。
Maven2ではローカルリポジトリはリモートリポジトリのキャッシュという意味合いが強いのですが、Ivyにおけるローカルリポジトリはあくまでも「ローカル」の「リポジトリ」で、リモートリポジトリのキャッシュはローカルリポジトリとは別に持っています。

IvyではMaven2と違って、依存関係のスコープにあたるものを自分で定義できます。これによって、推移的依存関係を解決するときに、Maven2では余計なjarを取ってきてしまうという問題がなくなります。たとえばMaven2で依存関係にcommons-loggingを指定すると、なにもしないとAvalon Logkitとか、もはやだれも使わないであろうjarまで勝手に取ってきてしまいます。これを避けるには、dependencyのexcludeの設定を行う必要があります。excludeの設定はまじめにやると実は結構大変です。
Ivyでは、commons-loggingの設定をするときに、Avalon Logkitを使うときの依存関係はこれこれ、Log4Jを使うときの設定はこれこれ、というふうに複数の構成を定義することができます。
で、commons-loggingを使う側でも、log4j構成をつかうか、Avalog Logkit構成を使うかを指定できます。しかも、テストの時だけ、違う構成を使うといったうことも可能です。

この例はあくまでたとえ話で、この機能はMaven2でのPOMにあたるIvyモジュール用メタデータ(ivy.xml)が用意されて初めて利用可能になるので、Maven2のセントラルリポジトリからcommons-loggingのjarをIvyで取ってくるときには、構成を指定することはできないのですが。。ただ、Ivyではメタデータとjarを別のリポジトリに配置することも出来るらしいので、もしかするとよく使うライブラリについては自分でIvyの設定ファイルを書いてあげればMaven2のセントラルリポジトリを利用する場合にもIvyの機能を使うようにできるのかもしれません。

全体として、IvyはMaven2よりも、余計なおせっかいを焼かないこと、リポジトリや依存関係のスコープの構成が柔軟にできることを重視して設計されているようです。Maven2は、ソースコードをコンパイルして、jarやwarを作るところまでは大体うまくできるのですが、その後、出来たアーティファクトを検証用の環境にアップロードして機能テストを実行。。。といったところまで踏み込んだ自動化をやろうとすると、それがもともとのMaven2のモデルにうまくはまらないが故に、結構苦労しなければなりません。

Ant+Ivyはその辺はいくらでも柔軟に対応できるので、組織の中に構成管理にかんするエキスパートがいて、プロジェクトをまたがって使える共通のAntスクリプトをメンテしており、Maven2がデフォルトでできること以上の突っ込んだ自動化に取り組みたいということであれば、Ant+Ivyを採用した方が幸せになれるのかもしれません。

Ivyはいま2.0-beta2なので、2.0の正式リリースが待たれます。


Vimperator

2008-09-11 06:48:32 | オープンソース
Vimperatorは、VimっぽいキーバインドでFireFoxを操作できる、
FireFoxのアドオンです。そのVimっぽさへのこだわりは偏執狂的で、デフォルトの設定で起動するとロケーションバーも
メニューバーも隠れた状態で起動します。これらを表示するように設定することもできるのですが、あえて隠したまま使ってます。快適にブラウジングできるように工夫された数々のキーバインドには、Vim使いなら思わずニヤリとしてしまうこと請け合いです。

今の会社では、ノートPCに外部モニタをくっつけて作業しているのですが、片方のディスプレイでなにかしながら、
もう一方のディスプレイでFireFoxを起動しているとき、マウスを隣のディスプレイまで移動させなくても
FireFox が操作できるのが非常に具合がよろしい。

livedoor Readerや gmail のようにVimのキーバインドと衝突してしまうアプリケーションがうまいこと操作できない
のがちょっと問題ですが、ほとんどのページは超高速でブラウズできます。

Simple

2008-09-08 22:06:25 | オープンソース
最近気になっているオープンソースプロダクト、その3はSimpleという、その名の通りシンプルなフレームワークです。
平たくいうと埋め込み型のHTTPサーバを簡単に作るためのフレームワークで、ServletとかRestletとかと同じレイヤに属するものです。なので、Simpleを使ってWebアプリケーションを構築しようとするには、Simpleの上になにかまたフレームワーク的な
ものを乗っける必要があります。

Servletよりも軽量かつ柔軟で、Restletほど理屈っぽくもなく、java.nioとかjava.util.concurrentあたりのAPIをうまいこと使って、実に簡潔なコードでまとめあげられています。

以前、LiQ Containerを使ったWebアプリケーションフレームワークを構想していたときに、
「もっとServletってこんなふうだったらいいのに」と感じていた、その思いをほとんどそのまんま実現してくれているので、
びっくりしました。

J2SEもどんどん高機能になってきているので、新しめの機能を使いこなしていけば、大げさなアプリケーションサーバなんてなくても、十分役に立つサーバアプリケーションを簡単に書ける可能性はあると思います。
Simpleはその可能性を大きく実現に向けて近づけてくれるフレームワークのような気がしています。

欠点は、Click以上にググりづらいことです。

「Simple」では話になりません。
「Simple Framework」-> まだ全然だめです。
「Simple Framework Java」-> これでようやく検索のトップに引っかかります。

プロジェクト名は絶対失敗してると思います。

StringTemplate

2008-09-07 21:36:15 | オープンソース
最近気になっているもう一つのプロダクトがStringTemplateという
テンプレートエンジンです。これは結構前からあるもので、有名なパーサジェネレータであるANTLRを作った人が作ったもので、
ANTLRの中でコードジェネレータ用のテンプレートエンジンとして使われているようです。

他のテンプレートエンジンよりも、テンプレートの中にfor文やif文を埋め込まずに済ませるための様々な
工夫がなされており、とてもきれいにモデルとビューを分離できそうです。ものすごいCoolっぽい感じがします。

作者のTerrence Parr氏はモデルとビューの分離については一家言ある人らしく、このテーマに関する
興味深い論文を発表しています。

この論文の中で、StringTemplateを使ってifもforも書かずにテーブルの行をしましまにする例とかが紹介されています。

Apache Ivy

2008-09-06 21:25:05 | オープンソース
他のブログサービスを調べているうちに、なんか面倒になってしまったので、ブログの引っ越しは中止します。。

さて、最近いくつか興味を引くオープンソースのプロダクトが出てきているのですが、その中の
一つがApache Ivyです。IvyはAntのサブプロジェクトで、AntのカスタムタスクとしてMaven2が提供するような
依存性管理の仕組みを提供するもののようです。Ivy自体は依存性管理だけの機能しか持たないので、
比較するときは、Maven2 vs Ivyではなく、Maven2 vs Ant+Ivyという比較の仕方になります。

Ant から使える同様の仕組みとしてMaven Tasks For Antというものもあるのでややこしいのですが、
Ivyは、Mavenのセントラルリポジトリに入っているアーティファクトも使えるけれど、
自前のもっと柔軟な依存性管理を実現しようとするものらしいです。
特に、企業内で独自のリポジトリを構築しようとした場合に有利っぽいです。
ざっとドキュメントは眺めてみたのですが、ちゃんと調べないと詳しいことがわからなそう。。

Maven2の決め打ち加減に納得がいかない向きには良いツールなのかも知れませんが、
まだ不明な点が多すぎます。
でも、後発だから、なにかMaven2とかの良くないところを改善しようとして何かしているはず。


S2JDBCをいじる

2008-05-04 11:50:05 | オープンソース
少々思うところあって、S2JDBCをいじってみました。

これは、非常に良く出来たものです。

APIは直感的でわかりやすく、マニュアルがなくてもIDEのコード補完の力でそれこそ流れるようにプログラミングができます。
機能的にもシンプルで、多分あまり裏で余計なことをしていないので、プロジェクトに合わせて自分なりにもう一工夫、といったことも容易にできそうです。こういう風に、ひたすらAPIの使い方を覚えるだけでなく、どう使いこなしてやろうか、ということについてイマジネーションがどんどん広がるライブラリは好きです。

機会があれば実戦投入してみたいですね。

ちなみに、ただS2JDBCを動かしてみるだけではつまらないので、S2Containerではなく、LiQ Container上で動かしてみました。Containerをセットアップするコードは以下のようなイメージになります。
----
Container container = new Container();
S2Dbcp s2dbcp = new S2Dbcp();
S2Jdbc s2jdbc = new S2Jdbc();

s2dbcp.configure(container)
     .driverClassName("org.h2.Driver")
     .url("jdbc:h2:mem:db1")
    .user("")
    .password("");
        
s2jdbc.configure(container)
    .dialect(HsqlDialect.class);
        
sentinel.configure(container);

JdbcManager jdbcManager = container.get(JdgcManager.class);
----

S2DbcpクラスとS2JdbcクラスはS2のコンポーネントをLiQから使えるようにするために自分で書いたクラスです。

S2DbcpクラスではコネクションプールとJTAに関連するコンポーネントを、
S2JdbcクラスではJdbcManagerをContainerにぶち込んでいます。

XMLで設定するのと違って、内部のコンポーネントの構造をきれいにカプセル化して、
設定可能なパラメータだけを外部に公開できるところが良いところです。

dialectの設定など、実装クラスのクラスオブジェクト自体を渡せるので、余計な間違いがおこりづらいはずです。
もちろんDbmsDialectの実装クラスでないクラスを渡そうとするとコンパイルエラーになります。

あと、コンテナの初期化が軽いのもメリットといえばメリットですね。



JRuby:メソッドの引数にJavaオブジェクトを渡す

2008-04-27 11:01:45 | オープンソース
fooというrubyのメソッドに、FooというJavaクラスのインスタンスを渡す例です。

----
import java.util.ArrayList;
import java.util.Map;

import org.jruby.Ruby;
import org.jruby.RubyClass;
import org.jruby.RubyRuntimeAdapter;
import org.jruby.internal.runtime.methods.DynamicMethod;
import org.jruby.javasupport.JavaembedUtils;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;

public class JRubyTest {
    private static class Foo {
        public String getFoo() {
            return "foo";
        }
    }
    public static void main(String[] args) throws Exception {
        Ruby ruby = JavaembedUtils.initialize(new ArrayList<String>());
        RubyRuntimeAdapter evaler = JavaembedUtils.newRuntimeAdapter();

        String ls = System.getProperty("line.separator");
        String script = 
            "def foo(arg)" + ls +
            "  puts arg.foo" + ls +
            "end";
        evaler.eval(ruby, script);
       
        Map<String, DynamicMethod> map = ruby.getClass("Object").getMethods();
        DynamicMethod method = map.get("foo");
        ThreadContext ctx = ruby.getCurrentContext();
        RubyClass obj = ruby.getObject();
        
        IRubyObject arg = JavaembedUtils.javaToRuby(ruby, new Foo()); //[A]
        IRubyObject rv = method.call(ctx, obj, null, "foo", arg);  //[B]

        System.out.println(rv);
    }

}
----

ポイントは上の例の最後の方の[A]と[B]の2点あります。
[A]でJavaのオブジェクトをRubyのオブジェクトに変換しています。
Javaのオブジェクトのメソッドはいい感じでRubyのメソッドに変換される模様です。
[B]では、JRubyのランタイムから取得したメソッドfooを表すメソッドオブジェクトの呼び出しを行っています。
このcallメソッドのシグネチャは以下のようになっております。

-----
public IRubyObject call(ThreadContext context, IRubyObject self, RubyModule klazz, String name, IRubyObject arg)
-----
このメソッドの引数の意味がわからなくてちょっとはまりました。
いまのところ、適当な引数を渡してみたらなんとか動いた、というのが正直なところです。
第2引数と第3引数で、そのメソッドがそのオブジェクトが属するオブジェクトとモジュールを決定します。これらは、メソッド内で引数のメソッド以外のメソッド呼び出しをするときに必要になってきます。
これらの引数にnullを渡して、その呼び出し先のメソッドで上記の例のようにputsとかを呼び出すと、ぬるぽになります。

第4引数も何に使われるのか謎なのですが、多分メソッド名です。
DynamicMethod自体は自分の名前を持ってないようだったので。。。


第5引数以降はRubyのメソッドに渡す引数です。

callメソッドの実装を読み解こうとも試みたのですが、ひどくややこしいことになっていたので、それはいずれ。。

JRubyのスクリプト内で定義したメソッドをJavaから呼ぶ

2008-04-24 08:27:52 | オープンソース
まずは、軽く触ってみました。


package jp.liq.rest.liq_restlet;

import java.util.ArrayList;

import org.jruby.Ruby;
import org.jruby.RubyRuntimeAdapter;
import org.jruby.javasupport.JavaembedUtils;
import org.jruby.runtime.builtin.IRubyObject;

public class JRubyTest {
    public static void main(String[] args) throws Exception {
        Ruby ruby = JavaembedUtils.initialize(new ArrayList<String>());
        RubyRuntimeAdapter evaler = JavaembedUtils.newRuntimeAdapter();

        String ls = System.getProperty("line.separator");
        String script = 
            "def foo" + ls +
            "  return 'bar' " + ls +
            "end";
        evaler.eval(ruby, script);
        IRubyObject eval = evaler.eval(ruby, "foo");
        
        System.out.println(eval);
    }

}


Rubyスクリプトとして定義されたメソッド「foo」をJavaから呼び出して
います。標準出力には'bar'が出力されます。

そろそろJRubyをいじってみようと思う

2008-04-23 08:15:33 | オープンソース
最近JRubyに興味があります。
アプリケーションの中で、Javaだと書きにくい部分をRubyで書く、
というのが魅力的に思えるからです。バージョンも1.1がリリースされて、
かなり成熟してきた感があります。
くそ忙しいなかではありますが、徐々に勉強していきたいと思っております。
とりえあえず、ソースコードをダウンロードしてきて、ビルドしてみました。
ソースツリーにnbprojectとかいうフォルダがあるところをみると、
どうも、JRubyはNetBeansを使って開発しているらしい。さすがSUN。