N2 ToolBox(跡地)

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

よいお年を

2004-12-30 09:56:50 | その他
今年も残りわずかとなりました。

世の中を見渡してみると、今年は災害や戦争、犯罪など
あらゆる面で本当にひどい年で「世界が壊れ始めたこと
がはっきりした一年」だったとつくづく思います。
来年以降、世界は一体どういう方向に進んでいくの
でしょうか?
僕には明るい見通しが全く立たないのですが。。

個人的には、いろいろなことに手を出しすぎて訳が
わからなくなった一年でした。このBlogも思い付きで
はじめたのはいいのですが、最後の方かなり書くペースが
落ちてしまいました。来年は新しいことに
チャレンジするというよりは、いま手をつけたことを
しっかりやるということを主眼において活動したいと
思っております。

暗い話はこれくらいにしておいて、今年一年を振り返って
僕的に熱かったトピックをいくつか挙げてみたいと思います。

-----

1. エニアグラム
技術的な話題ではないですが、実は自分のなかでは結構大きい
インパクトがありました。重要な気付きが得られた気がします。

2. コーチンング
エニアグラムと併せて、勉強したいです。
わかったのは、自分はコーチには向かない、ということ。
このBlogではまだコーチングの話題は取り上げてなかった
ですね。

3. アジャイル開発方法論
結構真剣に勉強しました。突き詰めて勉強するうちになぜか
ソフトウェア開発というよりもビジネス書をたくさん読む
ようになって、とんと技術に疎くなってしまいました。
来年はアジャイルに関連した仕事で、より激しい闘いに
巻き込まれる予感がしています。

4. オープンソースJava
今年ほどオープンソースJavaが熱かった年は無かったのでは
ないでしょうか? J2SE, J2EEに新しく採り入れられた仕様の
ほとんどは何かのオープンソースのプロダクトのパクリと
思われ、Javaの世界はオープンソースが牽引しているのだと
実感しました。
個人的にはもっとも興味あるプロダクトは開発中のMaven2
ですね。

5. POJO
そして多くのオープンソースプロダクトの基本となっている
のがPOJOです。今後しばらく、
POJO + DependencyInjection + アスペクト指向というのが
あらゆるアーキテクチャの根幹となっていく気がしています。
----

それでは良いお年を..

Maven2: POM中の日本語

2004-12-16 01:09:39 | オープンソース
たしか現行Mavenがまだ1.0rc2くらいだったころ、POMの中に
記述した日本語が化け化けになるというバグがありました。

m2ではそのへんはどうなっているんだろうと、試してみました。

その結果判明したのは、
文字コードがシステムのデフォルトエンコーディングだったら通る
ということです。微妙。。。

問題はm2がPOMをパースする時に使っている、plexus-utilについてくる
XMLプルパーサにありました。このパーサは
XML Pull APIというのと同じシグネチャのインターフェースを
実装しているのですが、XML Pull APIの仕様によると、XML宣言のとこに
書いてあるエンコーディングから文字コードを判定する
というフィーチャはあくまでオプションの扱いに
なっています。plexus-utilについてくるパーサは
最低限の実装しかしてないので、当然そのようなフィーチャは
サポートされるはずもなく、パーサを使う側(=modelloが生成したコード)
でもエンコーディングを指定していないので、
自動的にデフォルトエンコーディングとしてパースして
しまっている模様です。

Shift_JISで書いたPOMをLinux上でビルドしたりとか、普通にありそう
なのでこれは結構いたいのでは。。

直そうとすると、plexus-utilのXMLプルパーサとmodelloにだけ
影響があって、実はm2は変更しなくていいので、m2のMLに投げていい問題
なのかどうかも不明です。。。困った。

XMLプルパーサのソースなんてとても手がつけられなさそうだと
思ってたのですが、実は以外とシンプルな作りになっているので
頑張って自分で直してみるというのも面白いかも。

Maven2:プラグインを作ってみよう!

2004-12-12 21:31:23 | オープンソース
お久しぶりです。
さすが師走と言うか、忙しくてなかなかblog書く暇がありません。

今日はm2のPluginのつくり方について調べたことのメモです。
調べているうちにさらに様々な疑問点、問題点が噴出してきてしまって
いるのですが、それはとりあえず置いておいてプラグインの書き方の話しに
集中しましょう。

m2のPluginの作り方は意外と簡単で、以下の3ステップでOKです。

  1. Plugin用のPOMを作る。

  2. AbstractPluginクラスをextendしてJavaクラスとしてプラグインを記述する。

  3. plugin:installゴールを実行


これで、作ったPluginがローカルリポジトリにインストールされて、
使えるようになります。
以下、各ステップをもうちょい詳しく解説します。

1. Plugin用のPOMを作る

まずPlugin自体のPOMを作ります。このPOMはリポジトリにインストールされて、
Pluginが依存するjarを自動的にダウンロードする時などに使われます。
今回作ったPOMは以下のような感じです。
<?xml version="1.0" encoding="Shift_JIS"?>

<project>
  <!--
    おまじない。Pluginの共通の親POM。
    Mavenリポジトリ内のPOMを継承している!
   -->
  <parent>
    <groupId>maven</groupId>
    <artifactId>maven-plugin-parent</artifactId>
    <version>2.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <!--groupIdはかならずmaven-->
  <groupId>maven</groupId>
  <!--artifactIdはmaven-[Plugin名]-plugin-->
  <artifactId>maven-foo-plugin</artifactId>
  <name>My First Plugin</name>
  <type>plugin</type>  
  <!--いまのところバージョンはこれ以外指定できない-->
  <version>1.0-SNAPSHOT</version>  
  <inceptionYear>2001</inceptionYear>
  <package>org.apache.maven</package>
  <logo>/images/maven.gif</logo>
</project>


2.AbstractPluginクラスをextendしてJavaクラスとしてプラグインを記述する。

いよいよプラグイン本体の作成です。
今回作ったのはPOMに書かれたプロジェクト名を
出力するというごく簡単な物です。
ソースコードは大体以下の通りです。パッケージ宣言とかインポート文は省いてます。

/**
 * @goal print
 *
 * @description deploys a pom to remote repository
 *
 * @parameter
 *   name="projectName"
 *   type="String"
 *   required="true"
 *   validator=""
 *   expression="#project.name"
 *   description=""
 *
 */
public class SampleMojo extends AbstractPlugin {
    public void execute(PluginExecutionRequest request, PluginExecutionResponse response) {
        String pn = (String) request.getParameter("projectName");
        System.out.println("Project Name:" + pn);
    }
}


実装しなくてはならないのはexecuteだけのようです。
なんだかServletみたいなインターフェースですね。
JavaDocの中に定義しているパラメータとrequest.getParameterで取得している
パラメータとの対応関係に注意して下さい。
プラグインが必要とするパラメータは設定情報として切り出されて、
コンテナ側が勝手にrequestオブジェクトにセットしてくれるようになっています。
おかげでm2のpluginはPluginのインターフェースにのみ依存し、
m2のCoreには依存しないように記述することが出来ます。

2.plugin:installゴールを実行

ここまで出来たらプロジェクトのベースディレクトリで
m2 plugin:install
を実行すると、JavaDocの中に書かれていた設定情報から
XML形式の設定ファイルを生成し、クラスをコンパイルし、Jarに固め、
ローカルリポジトリにインストールし、POMもローカルリポジトリにインストールし、
使える状態に持っていってくれます。

このプラグインを実行するには
m2 foo:print
でOKです。
POMのname要素に書かれているプロジェクト名が出力されるはずです。