<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ふたつの川うるおう日記 &#187; Java</title>
	<atom:link href="http://jfut.integ.jp/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://jfut.integ.jp</link>
	<description></description>
	<lastBuildDate>Sat, 27 Aug 2011 15:18:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>古いサーバでJDK 6 Update 18に更新したらタイムゾーンがJSTからGMTに変わった件と対処法</title>
		<link>http://jfut.integ.jp/2010/01/20/jdk-6-update-18-default-timezone-on-old-server/</link>
		<comments>http://jfut.integ.jp/2010/01/20/jdk-6-update-18-default-timezone-on-old-server/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 13:09:50 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://jfut.integ.jp/?p=910</guid>
		<description><![CDATA[とある古いサーバにインストールされているJDK 6 Update 17をJDK 6 Update 18に更新したらデフォルトのタイムゾーンがJSTからGMTに変わってしまいました。他のサーバでは問題なかったのでこの古いサ [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2005/12/04/apache-2-2-dav_svn%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC-%E8%A7%A3%E6%B1%BA/' rel='bookmark' title='Apache 2.2 dav_svnがエラー (解決)'>Apache 2.2 dav_svnがエラー (解決)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/05/28/jdk-5-0-update-7/' rel='bookmark' title='JDK 5.0 Update 7'>JDK 5.0 Update 7</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2007/11/17/devloader-ex-mayaa/' rel='bookmark' title='DevLoader改変、Mayaa対応編'>DevLoader改変、Mayaa対応編</a> <small>昨日のDevLoader改変により、最近のSeasarを使ったプロジェクトに対応したものの、今日いざ自分のMayaaを使ったプロジェクトのjarファイルをMavenで管理させたら見事に上手く動きませんでした。 というわけ [...]...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content3" class="fswiki_content">
				<p>とある古いサーバにインストールされているJDK 6 Update 17をJDK 6 Update 18に更新したらデフォルトのタイムゾーンがJSTからGMTに変わってしまいました。<strong>他のサーバでは問題なかったのでこの古いサーバ限定の問題です。</strong></p>
				<p>状況を確認するためにサンプルコードを動かして確認しました。</p>
				<pre>import java.util.Date;

public class DateTest {
    public static void main(String[] args) {
        System.out.println(new java.util.Date());
    }
}
</pre>
				<p>実行してみます。</p>
				<pre># /usr/local/java/jdk1.6.0_17/bin/java DateTest
Wed Jan 20 21:42:44 JST 2010
# /usr/local/java/jdk1.6.0_18/bin/java DateTest
Wed Jan 20 12:42:56 GMT 2010
</pre>
				<p>というようにJDK 6 Update 17ではJSTなのにJDK 6 Update 18だとGMTになってしまいました。<a href="http://sel.ist.osaka-u.ac.jp/~m-itii/php/d/soliloquy.php?mode=daily&#038;date=2007%2F3%2F15">JVMのタイムゾーンがGMTになる 追記</a>と同じ原因のようで、/etc/localtime を調べてみたら /usr/share/zoneinfo/Asia/Tokyo と違うものでした。</p>
				<pre># ls -al /etc/localtime
-rw-r--r--  1 root root 73 Feb 26  2004 /etc/localtime
# ls -al /usr/share/zoneinfo/Asia/Tokyo
-rw-r--r--  2 root root 125 Mar 22  2006 /usr/share/zoneinfo/Asia/Tokyo
</pre>
				<p>というわけで、コピーして直します。</p>
				<pre>cp -a /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
</pre>
				<p>再び確認します。</p>
				<pre># /usr/local/java/jdk1.6.0_17/bin/java DateTest
Wed Jan 20 21:49:58 JST 2010
# /usr/local/java/jdk1.6.0_18/bin/java DateTest
Wed Jan 20 21:50:07 JST 2010
</pre>
				<p>無事直りました。良かった良かった。</p>
				<p>/etc/localtime が食い違ってのは、/etc/localtimeのタイムスタンプが2004-02-26 という古いサーバなので、インストール時に何かミスったか、これまでの運用の中での更新で何かがおきたのかなと思います。ただ、JDK更新したらいきなしWEBアプリが書き込むデータのタイムスタンプが9時間ずれ初めてたのでビックリしました。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2005/12/04/apache-2-2-dav_svn%E3%81%8C%E3%82%A8%E3%83%A9%E3%83%BC-%E8%A7%A3%E6%B1%BA/' rel='bookmark' title='Apache 2.2 dav_svnがエラー (解決)'>Apache 2.2 dav_svnがエラー (解決)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/05/28/jdk-5-0-update-7/' rel='bookmark' title='JDK 5.0 Update 7'>JDK 5.0 Update 7</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2007/11/17/devloader-ex-mayaa/' rel='bookmark' title='DevLoader改変、Mayaa対応編'>DevLoader改変、Mayaa対応編</a> <small>昨日のDevLoader改変により、最近のSeasarを使ったプロジェクトに対応したものの、今日いざ自分のMayaaを使ったプロジェクトのjarファイルをMavenで管理させたら見事に上手く動きませんでした。 というわけ [...]...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2010/01/20/jdk-6-update-18-default-timezone-on-old-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする</title>
		<link>http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/</link>
		<comments>http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 03:10:12 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfut.integ.jp/?p=884</guid>
		<description><![CDATA[Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にし [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/' rel='bookmark' title='Cubbyでアクションメソッドに指定するアノテーションの順番'>Cubbyでアクションメソッドに指定するアノテーションの順番</a> <small>しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/' rel='bookmark' title='入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理'>入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理</a> <small>入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親 [...]...</small></li>
<li><a href='http://jfut.integ.jp/2007/01/09/1action-1actionform%E3%82%921event-1actionform%E3%81%B8/' rel='bookmark' title='1Action 1ActionFormを1Event 1ActionFormへ'>1Action 1ActionFormを1Event 1ActionFormへ</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content11" class="fswiki_content">
				<p>Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にしてしまえば、少しだけリファクタリングしやすくなりそうです。また、IDE上での参照元・参照先への移動や使われているかどうかのチェックも簡単になります。</p>
				<p>例えば、次のようなアクションクラスがあるとします。</p>
				<pre>@Path(&quot;hoge&quot;)
public class HogeAction extends AbstractAction {

    @Binding(bindingType = BindingType.NONE)
    protected ValidationRules processApplyValidation =
        new DefaultValidationRules() {
            @Override
            public void initialize() {
                add(&quot;token&quot;, new TokenValidator());
                add(&quot;name&quot;, new TokenValidator());
                add(&quot;comment&quot;, new TokenValidator());
            }
        };

    @RequestParameter
    public HogeParameterDto hogeParameterDto;

    @Path(&quot;process&quot;)
    @Accept(POST)
    @OnSubmit(&quot;apply&quot;)
    @Form(&quot;hogeParameterDto&quot;)
    @Validation(rules = &quot;processApplyValidation&quot;, errorPage = &quot;/hoge/edit.html&quot;)
    public ActionResult processApply() {
        return new Forward(&quot;/hoge/edit.html&quot;);
    }

}
</pre>
				<p>これを次のようにします。</p>
				<pre>import static org.example.test.entity.names.Names.*;

@Path(&quot;hoge&quot;)
public class HogeAction extends AbstractAction {

    private static final String processApplyValidationName
        = &quot;processApplyValidation&quot;;
    @Binding(bindingType = BindingType.NONE)
    protected ValidationRules processApplyValidation =
        new DefaultValidationRules() {
            @Override
            public void initialize() {
                add(TOKEN, new TokenValidator());
                add(post().name().toString(), new TokenValidator());
                add(post().comment().toString(), new TokenValidator());
            }
        };

    private static final String hogeParameterDtoName = &quot;hogeParameterDto&quot;;
    @RequestParameter
    public HogeParameterDto hogeParameterDto;

    @Path(&quot;process&quot;)
    @Accept(POST)
    @OnSubmit(&quot;apply&quot;)
    @Form(hogeParameterDtoName)
    @Validation(rules = processApplyValidationName, errorPage = &quot;/hoge/edit.html&quot;)
    public ActionResult processApply() {
        return new Forward(&quot;/hoge/edit.html&quot;);
    }

}
</pre>
				<p>変更した箇所を説明します。</p>
				</div>
				<p><span id="more-884"></span></p>
				<div id="fswiki_content12" class="fswiki_content">
				<h3> 説明</h3>
				<h4> S2JDBC-GenのNamesクラス内のstatic関数をStatic Import</h4>
				<pre>import static org.example.test.entity.names.Names.*;
</pre>
				<p>S2JDBC-Gen 2.4.40で導入されたNamesクラス内のstatic関数をStatic Importします。バリデーションルールのinitialize()内で使います。</p>
				<ul>
				<li> 参考: <a href="http://d.hatena.ne.jp/taedium/20091008/p1">Namesクラス と SqlFilesクラス &#8211; taediumの日記</a></ll>
				</ul>
				<h4> バリデーションルールの変数名を定数定義</h4>
				<pre>private static final String processApplyValidationName = &quot;processApplyValidation&quot;;
</pre>
				<p>バリデーションルールprocessApplyValidationの変数名を表す定数です。アクションメソッドの @Validation にはここで指定した定数を使うようにすることでリファクタリングしやすくします。</p>
				<h4> バリデーションルール: TokenValidatorに使用するパラメータの定数化と使用</h4>
				<pre>add(TOKEN, new TokenValidator());
</pre>
				<p>Cubbyで標準提供されている2重サブミットを検証するTokenValidatorで仕様するパラメータ名を指定します。TOKEN は AbstractAction で次のように定義しておきます。</p>
				<pre>protected static final String TOKEN = &quot;token&quot;;
</pre>
				<p>この例では、パラメータ名に &quot;token&quot; を使用しています。</p>
				<h4> バリデーションルール: リクエストパラメータに定数を使用</h4>
				<pre>add(post().name().toString(), new TokenValidator());
add(post().comment().toString(), new TokenValidator());
</pre>
				<p>本来NamesクラスからStatic Importした静的関数はS2JDBCでjoinやwhereで指定するのに使うのに便利な関数ですが、ここではその文字列表現を流用してパラメータの指定に使用します。例ではテーブルpostが持つ属性名nameとcommentの文字列表現を流用しています。</p>
				<p>リクエストパラメータ名とテーブルの属性名は一緒なことが多いと思うので、多くの場合で流用できると思います。これでS2JBDC同様バリデーションの項目名もリファクタリングしやすくなります。</p>
				<h4> リクエストパラメータのバインド先の変数名を定数定義</h4>
				<pre>private static final String hogeParameterDtoName = &quot;hogeParameterDto&quot;;
</pre>
				<p>バリデーションルールの変数名同様、リクエストパラメータのバインド先hogeParameterDtoの変数名を表す定数です。アクションメソッドの @Form にはここで指定した定数を使うようにすることでリファクタリングしやすくします。</p>
				<h4> @Form で定数を使用する</h4>
				<pre>...
@Form(hogeParameterDtoName)
...
public ActionResult processApply() {
    ...
}
</pre>
				<p>先に定義した リクエストパラメータのバインド先hogeParameterDtoの変数名 をアクションメソッドに対するアノテーション @Form に指定します。</p>
				<h4> @Validation で定数を使用する</h4>
				<pre>...
@Validation(rules = processApplyValidationName, errorPage = &quot;/hoge/edit.html&quot;)
...
public ActionResult processApply() {
    ...
}
</pre>
				<p>先に定義した バリデーションルールprocessApplyValidationの変数名 をアクションメソッドに対するアノテーション @Validation に指定します。</p>
				<hr />
				<p>以上です。</p>
				<p>やろうと思えば、@Path や @OnSubmit などでも定数を使えますがそこは定数にしていません。@OnSubmitはHTMLファイルの中身と対応するので定数化してもリファクタリングのしやすさには影響しないですが、@PathはHTMLファイル名の変更や移動の時に使えるので定数化しても良いかもしれないですね。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/' rel='bookmark' title='Cubbyでアクションメソッドに指定するアノテーションの順番'>Cubbyでアクションメソッドに指定するアノテーションの順番</a> <small>しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/' rel='bookmark' title='入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理'>入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理</a> <small>入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親 [...]...</small></li>
<li><a href='http://jfut.integ.jp/2007/01/09/1action-1actionform%E3%82%921event-1actionform%E3%81%B8/' rel='bookmark' title='1Action 1ActionFormを1Event 1ActionFormへ'>1Action 1ActionFormを1Event 1ActionFormへ</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cubbyでアクションメソッドに指定するアノテーションの順番</title>
		<link>http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/</link>
		<comments>http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 03:41:33 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfut.integ.jp/?p=855</guid>
		<description><![CDATA[しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/' rel='bookmark' title='Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする'>Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする</a> <small>Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にし [...]...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/' rel='bookmark' title='入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理'>入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理</a> <small>入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親 [...]...</small></li>
<li><a href='http://jfut.integ.jp/2008/01/20/cubby-is-good/' rel='bookmark' title='Cubbyの良いところ'>Cubbyの良いところ</a> <small>先日Cubbyで作った2個目の簡単なアプリを予定通り動かし始めました。今のとこ大きなトラブルもないようです。というわけで、Cubbyの良いところを書きたいと思います。ちなみにほとんど同じことがSAStrutsにも言えます [...]...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content24" class="fswiki_content">
				<p>しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しますが、処理の流れを考えて次の順番で指定しています。</p>
				<ol>
				<li> URIを指定: @Path</li>
				<li> HTTPメソッドを指定: @Accept</li>
				<li> 同一URIへのPOST時などに実行するアクションメソッドを変える指定: @OnSubmit</li>
				<li> リクエストパラメータのバインド先を指定: @Form</li>
				<li> リクエストパラメータのバリデーションを指定: @Validation</ll>
				</ol>
				<pre>@Path(&quot;hoge&quot;)
public class HogeAction extends AbstractAction {
    ...
    @Path(&quot;process&quot;)
    @Accept(POST)
    @OnSubmit(&quot;apply&quot;)
    @Form(&quot;hogeParameterDto&quot;)
    @Validation(rules = &quot;processApplyValidation&quot;, errorPage = &quot;/hoge/edit.html&quot;)
    public ActionResult processApply() {
        return new Forward(&quot;/hoge/edit.html&quot;);
    }
    ...
}
</pre>
				<ul>
				<li> 参考: <a href="http://cubby.seasar.org/20x/action.html">Cubby Project &#8211; アクション</a></ll>
				</ul>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2010/01/11/cubby-actionclass-with-static-field/' rel='bookmark' title='Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする'>Cubbyのアクションクラスで定数を利用してリファクタリングしやすくする</a> <small>Cubbyのアクションクラスにはバリデーションルールの定義時やアノテーションに文字列が登場します。文字列で指定しているのでリファクタリングする時に修正漏れなどがおきそうでちょっと怖いです。そこで、それらの文字列を定数にし [...]...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/' rel='bookmark' title='入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理'>入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理</a> <small>入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親 [...]...</small></li>
<li><a href='http://jfut.integ.jp/2008/01/20/cubby-is-good/' rel='bookmark' title='Cubbyの良いところ'>Cubbyの良いところ</a> <small>先日Cubbyで作った2個目の簡単なアプリを予定通り動かし始めました。今のとこ大きなトラブルもないようです。というわけで、Cubbyの良いところを書きたいと思います。ちなみにほとんど同じことがSAStrutsにも言えます [...]...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JIRA 4.xと新しいPlugin機構</title>
		<link>http://jfut.integ.jp/2010/01/04/jira4-and-new-plugin-infrastructure/</link>
		<comments>http://jfut.integ.jp/2010/01/04/jira4-and-new-plugin-infrastructure/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 05:44:31 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>
		<category><![CDATA[Server]]></category>

		<guid isPermaLink="false">http://jfut.integ.jp/?p=822</guid>
		<description><![CDATA[Seasarプロジェクトでも利用しているJIRA のライセンスを去年の10月に自分用に購入しました。JIRAを開発しているAtlassian社が10ユーザまで利用できるGet Started for $10というライセン [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2008/09/10/atlassian-jira-personal-license/' rel='bookmark' title='Atlassian JIRA &#8211; Personal License'>Atlassian JIRA &#8211; Personal License</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/05/18/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B/' rel='bookmark' title='バージョンの組み合わせ'>バージョンの組み合わせ</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/s2struts%E3%81%A7hot-deploy%E6%99%82%E3%81%ABthrowsinterceptor%E3%81%8C%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%AA%E3%81%84-%E8%A7%A3%E6%B1%BA/' rel='bookmark' title='S2StrutsでHOT deploy時にThrowsInterceptorが呼ばれない (解決)'>S2StrutsでHOT deploy時にThrowsInterceptorが呼ばれない (解決)</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content31" class="fswiki_content">
				<p><a href="https://www.seasar.org/issues/">Seasarプロジェクトでも利用しているJIRA</a> のライセンスを去年の10月に自分用に購入しました。JIRAを開発している<a href="http://www.atlassian.com/">Atlassian社</a>が10ユーザまで利用できるGet Started for $10というライセンスを始めたので思わず買いました。JIRA 4.0になって、JIRA 3.x以前にあったエディションの違いが無くなり、$10でEnterpriseエディションが使えるというのは破格です。JIRA 3.xまではLDAPサポートにEnterprise以上が必要でとても買える金額では無かったため嬉しいです。また、このライセンスの購入費用は全額 <a href="http://www.roomtoread.org/">Room to Read</a> に寄付されるプログラムになっています。</p>
				<p>日本円で購入したい場合は、Atlassian社のOfficial Atlassian Partnerである <a href="http://www.ricksoft.jp/">リックソフト株式会社</a> が1,050 円で販売されています。</p>
				<ul>
				<li> <a href="http://www.atlassian.com/software/jira/">Bug Tracking, Issue Tracking &amp; Project Management Software &#8211; JIRA</a> (Atlassian社)</li>
				<li> <a href="http://www.ricksoft.jp/product/atlassian/at_price">アトラシアン(Atlassian)製品の価格と購入（オンライン販売）</a> (リックソフト株式会社)</ll>
				</ul>
				<p>そんなわけで、だいぶ前置置きが長くなりましたが、自分用にJIRAの環境を作りました。購入当初JIRA 4.0には <a href="http://confluence.atlassian.com/display/JIRAKB/Gadgets+do+not+display+correctly+after+upgrade+to+JIRA+4.0">新しく導入されたガジェットの仕組みがSSL環境で上手く動かない問題</a> があったので、使い始めたのはこの問題がJIRA側で解決した4.0.1からです。</p>
				<p>ただ、まだ問題があって、Seasarプロジェクトで利用していた3.xのインストール手順でwarファイルを作成し、Tomcatにデプロイするとエラーがでて上手く起動しないのです。いろいろ試してみると自分で追加していたPluginを全部外すと起動しました。そんなことをつぶやいていたらリックソフトのohnukiさんがコンタクトをくださっていろいろやりとりした結果、原因が判明しました。</p>
				<p>原因は、JIRA 4.0からOSGiを使用した新しいPlugin機構(Version 2)がサポートされ、JIRA 3.xの時とPluginの配置の仕方が変わっていたことでした。これに気付かず、JIRA 3.xの導入の仕方で入れていたので上手くPluginがロードされなかったようです。一応、互換性のため、古いPluginの配置方法(Version 1)も使えるようですが、Tomcat 5.5.28では動作するものの、Tomcat 6.0.20では動作せず、それでエラーが出ていました。</p>
				<ul>
				<li> 参考: <a href="http://confluence.atlassian.com/display/JIRA/Managing+JIRA%27s+Plugins">Managing JIRA&#8217;s Plugins</a>
				<ul>
				<li> Version 1: atlassian-jira/WEB-INF/lib/ 以下に配置</li>
				<li> Version 2: jira.home/plugins/installed-plugins/ 以下に配置
				<ul>
				<li> jira.home はJIRA 4.0から導入されたホームディレクトリ指定</ll>
				</ul>
				<p></ll>
				</ul>
				<p></ll>
				</ul>
				<p>というわけで、無事やっとPluginも使えるようになりました。ohnukiさんありがとうございました！</p>
				<p>Pluginが使えるようになったので、SeasarプロジェクトのJIRAも近日アップグレードのテストをし、アナウンスを出した後に現在の3.13.5から4.0.1に更新したいと思います。</p>
				<p>以下、何かの参考までにVersion 1 + Tomcat 6.0.20で起動した時の例外全文を記載しておきます。</p>
				</div>
				<p><span id="more-822"></span></p>
				<div id="fswiki_content32" class="fswiki_content">
				<h3> 起動時のエラー内容</h3>
				<ul>
				<li> 環境
				<ul>
				<li> Sun JDK 1.6.0_17 64-Bit Server VM</li>
				<li> JIRA 4.0.1 + Version 1の方法でのPlugin導入
				<ul>
				<li> JIRA Calendar Plugin 1.12</li>
				<li> JIRA Charting Plugin 1.5</li>
				</ul>
				</li>
				<li> Tomcat 6.0.20</ll>
				</ul>
				<p></ll>
				</ul>
				<pre>2010/01/04 13:18:33 org.apache.catalina.core.StandardContext listenerStart
致命的: クラス com.atlassian.jira.upgrade.ConsistencyLauncher のリスナインスタンスにコンテキスト初期化イベントを送信中の例外です
java.lang.ExceptionInInitializerError
	at org.objectweb.jotm.Current.&lt;init&gt;(Current.java:121)
	at org.objectweb.jotm.UserTransactionFactory.getObjectInstance(UserTransactionFactory.java:45)
	at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:140)
	at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
	at org.apache.naming.SelectorContext.lookup(SelectorContext.java:137)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at org.ofbiz.core.entity.transaction.JNDIFactory.getUserTransaction(JNDIFactory.java:109)
	at org.ofbiz.core.entity.TransactionFactory.getUserTransaction(TransactionFactory.java:91)
	at org.ofbiz.core.entity.TransactionUtil.getStatus(TransactionUtil.java:80)
	at org.ofbiz.core.entity.jdbc.SQLProcessor.getConnection(SQLProcessor.java:369)
	at org.ofbiz.core.entity.jdbc.SQLProcessor.prepareStatement(SQLProcessor.java:416)
	at org.ofbiz.core.entity.GenericDAO.selectListIteratorByCondition(GenericDAO.java:1024)
	at org.ofbiz.core.entity.GenericDAO.selectByAnd(GenericDAO.java:595)
	at org.ofbiz.core.entity.GenericHelperDAO.findByAnd(GenericHelperDAO.java:134)
	at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:792)
	at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:777)
	at org.ofbiz.core.entity.GenericDelegator.findByAnd(GenericDelegator.java:754)
	at com.opensymphony.module.propertyset.ofbiz.OFBizPropertySet.getKeys(OFBizPropertySet.java:87)
	at com.opensymphony.module.propertyset.AbstractPropertySet.getKeys(AbstractPropertySet.java:292)
	at com.atlassian.jira.propertyset.PropertySetCache.bulkLoad(PropertySetCache.java:301)
	at com.atlassian.jira.propertyset.JiraCachingPropertySet.init(JiraCachingPropertySet.java:834)
	at com.opensymphony.module.propertyset.PropertySetManager.getInstance(PropertySetManager.java:45)
	at com.opensymphony.module.propertyset.PropertySetManager.getInstance(PropertySetManager.java:22)
	at com.atlassian.jira.config.properties.PropertiesManager.loadPropertySet(PropertiesManager.java:83)
	at com.atlassian.jira.config.properties.PropertiesManager.&lt;init&gt;(PropertiesManager.java:29)
	at com.atlassian.jira.config.properties.PropertiesManager.getInstance(PropertiesManager.java:39)
	at com.atlassian.jira.config.properties.ApplicationPropertiesImpl.getPropertiesManager(ApplicationPropertiesImpl.java:69)
	at com.atlassian.jira.config.properties.ApplicationPropertiesImpl.getString(ApplicationPropertiesImpl.java:117)
	at com.atlassian.jira.config.properties.ApplicationPropertiesImpl.getDefaultBackedString(ApplicationPropertiesImpl.java:143)
	at com.atlassian.jira.ComponentManager.registerExtensions(ComponentManager.java:299)
	at com.atlassian.jira.ComponentManager.initialise(ComponentManager.java:195)
	at com.atlassian.jira.ComponentManager.&lt;init&gt;(ComponentManager.java:181)
	at com.atlassian.jira.ComponentManager.&lt;clinit&gt;(ComponentManager.java:159)
	at com.atlassian.jira.upgrade.ConsistencyLauncher.launchConsistencyChecker(ConsistencyLauncher.java:63)
	at com.atlassian.jira.upgrade.ConsistencyLauncher.contextInitialized(ConsistencyLauncher.java:42)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.) (Caused by org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.))
	at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:543)
	at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:370)
	at org.objectweb.jotm.TraceTm.&lt;clinit&gt;(TraceTm.java:47)
	... 65 more
Caused by: org.apache.commons.logging.LogConfigurationException: org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed. (Caused by org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.)
	at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:397)
	at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
	... 68 more
Caused by: org.apache.commons.logging.LogConfigurationException: Invalid class loader hierarchy.  You have more than one version of 'org.apache.commons.logging.Log' visible, which is not allowed.
	at org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:385)
	... 69 more
2010/01/04 13:18:33 org.apache.catalina.core.StandardContext listenerStart
致命的: クラス com.atlassian.jira.upgrade.UpgradeLauncher のリスナインスタンスにコンテキスト初期化イベントを送信中の例外です
java.lang.NoClassDefFoundError: Could not initialize class com.atlassian.jira.ComponentManager
	at com.atlassian.jira.upgrade.UpgradeLauncher.getJiraLicenseService(UpgradeLauncher.java:215)
	at com.atlassian.jira.upgrade.UpgradeLauncher.checkLicenseIsValid(UpgradeLauncher.java:145)
	at com.atlassian.jira.upgrade.UpgradeLauncher.checkIfUpgradeNeeded(UpgradeLauncher.java:85)
	at com.atlassian.jira.upgrade.UpgradeLauncher.contextInitialized(UpgradeLauncher.java:49)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2010/01/04 13:18:33 org.apache.catalina.core.StandardContext listenerStart
致命的: クラス com.atlassian.jira.scheduler.JiraSchedulerLauncher のリスナインスタンスにコンテキスト初期化イベントを送信中の例外です
java.lang.NoClassDefFoundError: Could not initialize class com.atlassian.jira.ComponentManager
	at com.atlassian.jira.ManagerFactory.getApplicationProperties(ManagerFactory.java:200)
	at com.atlassian.jira.scheduler.JiraSchedulerLauncher.canCreateScheduler(JiraSchedulerLauncher.java:75)
	at com.atlassian.jira.scheduler.JiraSchedulerLauncher.proceedIfAllClear(JiraSchedulerLauncher.java:45)
	at com.atlassian.jira.scheduler.JiraSchedulerLauncher.contextInitialized(JiraSchedulerLauncher.java:29)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2010/01/04 13:18:33 org.apache.catalina.core.StandardContext listenerStop
致命的: クラス com.atlassian.jira.startup.JiraStartupChecklistContextListener のリスナインスタンスにコンテキスト破棄イベントを送信中の例外です
java.lang.NoClassDefFoundError: Could not initialize class com.atlassian.jira.ComponentManager
	at com.atlassian.jira.startup.JiraStartupChecklistContextListener.unlockJiraHome(JiraStartupChecklistContextListener.java:75)
	at com.atlassian.jira.startup.JiraStartupChecklistContextListener.contextDestroyed(JiraStartupChecklistContextListener.java:62)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:3973)
	at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4577)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4474)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:556)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:491)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1206)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:314)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:722)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:516)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:583)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
</pre>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2008/09/10/atlassian-jira-personal-license/' rel='bookmark' title='Atlassian JIRA &#8211; Personal License'>Atlassian JIRA &#8211; Personal License</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/05/18/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B/' rel='bookmark' title='バージョンの組み合わせ'>バージョンの組み合わせ</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/s2struts%E3%81%A7hot-deploy%E6%99%82%E3%81%ABthrowsinterceptor%E3%81%8C%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%AA%E3%81%84-%E8%A7%A3%E6%B1%BA/' rel='bookmark' title='S2StrutsでHOT deploy時にThrowsInterceptorが呼ばれない (解決)'>S2StrutsでHOT deploy時にThrowsInterceptorが呼ばれない (解決)</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2010/01/04/jira4-and-new-plugin-infrastructure/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>入力された文字の前後の空白スペースなどの文字列を除去しても有効な文字があるか検証するValidatorと実際に取り除く処理</title>
		<link>http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/</link>
		<comments>http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/04/%E5%85%A5%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%9F%E6%96%87%E5%AD%97%E3%81%AE%E5%89%8D%E5%BE%8C%E3%81%AE%E7%A9%BA%E7%99%BD%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%AA%E3%81%A9%E3%81%AE%E6%96%87%E5%AD%97/</guid>
		<description><![CDATA[入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親 [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2007/01/09/1action-1actionform%E3%82%921event-1actionform%E3%81%B8/' rel='bookmark' title='1Action 1ActionFormを1Event 1ActionFormへ'>1Action 1ActionFormを1Event 1ActionFormへ</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/06/07/s2struts-hotdeploy%E3%81%A7actionconfig%E3%81%AE%E3%83%91%E3%82%B9%E4%BF%AE%E6%AD%A3%E3%81%B8%E3%81%AE%E9%81%93-4/' rel='bookmark' title='S2Struts HotDeployでActionConfigのパス修正への道 (4)'>S2Struts HotDeployでActionConfigのパス修正への道 (4)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/hot-deploy%E6%99%82%E3%81%AE%E3%82%B5%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AEservice%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D/' rel='bookmark' title='HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)'>HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content34" class="fswiki_content">
				<p>入力フォームでユーザに文字を入力させると、前後に空白スペースなどを入れちゃったりしますよね。Validatorで前後に空白スペースがあればエラーにしても良いですが、それはちょっと不親切なので自動的に取り除いてあげるのが親切かなと思います。また、String の trim() 関数だと全角スペース1文字がエラーになりません。得てして前後にスペースを入れちゃう人は全角のスペースを入れるのでこれもチェックしないといけません。というわけで、Cubby 1.1.x 向けにValidatorを書いてみました。</p>
				<p>取り除きたい文字は半角・全角スペースだけとも限らないので、取り除きたい正規表現を前後別々に指定できるようになっています。引数が1個の時は前後とも同じ正規表現が使用されます。</p>
				<ul>
				<li> RegexTrimRequiredValidator</ll>
				</ul>
				<pre>import org.seasar.cubby.validator.MessageHelper;
import org.seasar.cubby.validator.ScalarFieldValidator;
import org.seasar.cubby.validator.ValidationContext;
import org.seasar.framework.util.StringUtil;

/**
 * 先頭と末尾を正規表現でtrimした文字列の必須検証をします。
 * &lt;p&gt;
 * trimした文字列の長さが0の場合、検証エラーとなります。
 * &lt;/p&gt;
 * &lt;p&gt;
 * デフォルトエラーメッセージキー: valid.required
 * &lt;/p&gt;
 *
 * @author jfut
 */
public class RegexTrimRequiredValidator implements ScalarFieldValidator {

    /** メッセージヘルパ */
    private final MessageHelper messageHelper;
    /** 文字の先頭から除去する正規表現 */
    private String prefixRegexTrim;
    /** 文字の末尾から除去する正規表現 */
    private String postfixRegexTrim;

    /** 正規表現における先頭識別文字 */
    private static final char BEGIN_CHAR = '^';
    /** 正規表現における末尾識別文字 */
    private static final char END_CHAR = '$';

    /**
     * インスタンスを作成します。
     */
    public RegexTrimRequiredValidator() {
        this(null, null);
    }

    /**
     * インスタンスを作成します。
     *
     * @param regexTrim
     *            除去する正規表現
     */
    public RegexTrimRequiredValidator(final String regexTrim) {
        this(regexTrim, regexTrim);
    }

    /**
     * インスタンスを作成します。
     *
     * @param prefixRegexTrim
     *            文字の先頭から除去する正規表現
     * @param postfixRegexTrim
     *            文字の末尾から除去する正規表現
     */
    public RegexTrimRequiredValidator(final String prefixRegexTrim,
            final String postfixRegexTrim) {
        this(prefixRegexTrim, postfixRegexTrim, &quot;valid.required&quot;);
    }

    /**
     * エラーメッセージキーを指定してインスタンスを作成します。
     *
     * @param prefixRegexTrim
     *            文字の先頭から除去する正規表現
     * @param postfixRegexTrim
     *            文字の末尾から除去する正規表現
     * @param messageKey
     *            エラーメッセージキー
     */
    public RegexTrimRequiredValidator(final String prefixRegexTrim,
            final String postfixRegexTrim, final String messageKey) {
        this.prefixRegexTrim = prefixRegexTrim;
        this.postfixRegexTrim = postfixRegexTrim;
        this.messageHelper = new MessageHelper(messageKey);
        setupRegexTrim();
    }

    /**
     * 正規表現をセットアップします。
     */
    public void setupRegexTrim() {
        // prefixRegexTrim
        if (prefixRegexTrim != null) {
            // 文字の末尾が $ の場合、取り除きます
            if (prefixRegexTrim.charAt(prefixRegexTrim.length() - 1) == END_CHAR) {
                prefixRegexTrim =
                    prefixRegexTrim.substring(0, prefixRegexTrim.length() - 1);
            }
            // 文字の先頭に ^ が無い場合、追加します
            if (prefixRegexTrim.charAt(0) != BEGIN_CHAR) {
                prefixRegexTrim = BEGIN_CHAR + prefixRegexTrim;
            }
        } else {
            prefixRegexTrim = &quot;&quot;;
        }
        // postfixRegexTrim
        if (postfixRegexTrim != null) {
            // 文字の先頭が ^ の場合、取り除きます
            if (postfixRegexTrim.charAt(0) == BEGIN_CHAR) {
                postfixRegexTrim =
                    postfixRegexTrim.substring(1, postfixRegexTrim.length());
            }
            // 文字の末尾に $ が無い場合、追加します
            if (postfixRegexTrim.charAt(postfixRegexTrim.length() - 1) != END_CHAR) {
                postfixRegexTrim = postfixRegexTrim + END_CHAR;
            }
        } else {
            postfixRegexTrim = &quot;&quot;;
        }
    }

    /**
     * {@inheritDoc}
     */
    public void validate(final ValidationContext context, final Object value) {
        if (value instanceof String) {
            final String str = trim((String)value);
            if (!StringUtil.isEmpty(str)) {
                return;
            }
        } else if (value != null) {
            return;
        }
        context.addMessageInfo(this.messageHelper.createMessageInfo());
    }

    /**
     * 指定された文字列の先頭と末尾をtrimします。
     *
     * @param value
     *            文字列
     * @return trimされた文字列
     */
    public String trim(String value) {
        if (value != null) {
            value = value.replaceAll(prefixRegexTrim, &quot;&quot;);
            value = value.replaceAll(postfixRegexTrim, &quot;&quot;);
        }
        return value;
    }
}
</pre>
				<ul>
				<li> 適当なActionでの使用例</ll>
				</ul>
				<p>入力値をチェックしつつ、不要な文字を取り除いても有効な文字がある時は、同じ条件で不要な文字をtrimできるようにインスタンス化して使用します。ポイントはパラメータがバインドされたインスタンスをtrimするために、ValidationRulesでValidateしつつ、最後にインナークラスRegexTrimValidationRuleFilterでtrimを実行しておくところです。これによりアクションメソッド実行時には既にtrimされた値が入ったインスタンスを使うことができます(参考: <a href="http://jfut.integ.jp/category/java/feed//../http://cubby.seasar.org/action.html#リクエストからアクション実行までのフロー">リクエストからアクション実行までのフロー</a>、Action#preactionなんてのがあるとそこが適切かも？Interceptorだとちょっと書きにくいし)。</p>
				<p>この例では、入力値の前後の半角・全角スペースをすべて取り除いても有効な文字があるかどうかをチェックし、そして、RegexTrimValidationRuleFilterで実際に不要な文字を取り除きます。</p>
				<pre>@Path(&quot;register&quot;)
public class RegisterAction extends Action {

    // -------------------------------------------------- [Validation]

    private final RegexTrimRequiredValidator trimRequiredValidator =
        new RegexTrimRequiredValidator(&quot;[\\s　]*&quot;);

    @Binding(bindingType = BindingType.NONE)
    public ValidationRules registerValidation = new DefaultValidationRules() {
        @Override
        public void initialize() {
            add(&quot;token&quot;, new TokenValidator());
            add(&quot;lastName&quot;, trimRequiredValidator);
            add(&quot;firstName&quot;, trimRequiredValidator);
            add(&quot;lastNameEnglish&quot;, trimRequiredValidator);
            add(&quot;firstNameEnglish&quot;, trimRequiredValidator);
            add(&quot;mailAddress1&quot;, trimRequiredValidator, new EmailValidator());
            add(&quot;mailAddress2&quot;, trimRequiredValidator, new EmailValidator());
            add(&quot;inside&quot;, new RequiredValidator());
            // add(&quot;uid&quot;, validator);
            add(&quot;laboratory&quot;, trimRequiredValidator);
            add(&quot;promotion&quot;, trimRequiredValidator);
            add(...他のValidationRule...);
            add(new RegexTrimValidationRuleFilter());
        }
    };

    // -------------------------------------------------- [DI Filed]

    @Resource
    private UserService userService;

    // -------------------------------------------------- [Attribute]

    protected RegisterFormDto registerFormDto;

    // -------------------------------------------------- [Action Method]

    public ActionResult index() {
        return new Forward(&quot;/register/index.html&quot;);
    }

    @Accept(POST)
    @Form(&quot;registerFormDto&quot;)
    @Validation(rules = &quot;registerValidation&quot;, errorPage = &quot;/register/index.html&quot;)
    public ActionResult confirm() {
        return new Forward(&quot;/register/confirm.html&quot;);
    }

    @Path(&quot;process&quot;)
    @OnSubmit(&quot;apply&quot;)
    @Accept(POST)
    @Form(&quot;registerFormDto&quot;)
    @Validation(rules = &quot;registerValidation&quot;, errorPage = &quot;/register/confirm.html&quot;)
    public ActionResult processApply() {
        registerFormDto.mailAddress = registerFormDto.mailAddress1;
        User user =
            Beans.createAndCopy(User.class, registerFormDto).execute();
        userService.insertAndSendMail(user);
        return new Forward(&quot;/register/success.html&quot;);
    }

    ... 他のアクションメソッド省略 ...

    // -------------------------------------------------- [Helper Method]

    // -------------------------------------------------- [Validation Class]

    private class RegexTrimValidationRuleFilter implements ValidationRule {
        public void apply(Map&lt;String, Object[]&gt; params, Object form,
                ActionErrors errors) {
            // BeanDesc と PropertyDesc を使って汎用的にしても良いですね
            registerFormDto.lastName =
                trimRequiredValidator.trim(registerFormDto.lastName);
            registerFormDto.firstName =
                trimRequiredValidator.trim(registerFormDto.firstName);
            registerFormDto.lastNameEnglish =
                trimRequiredValidator.trim(registerFormDto.lastNameEnglish);
            registerFormDto.firstNameEnglish =
                trimRequiredValidator.trim(registerFormDto.firstNameEnglish);
            registerFormDto.mailAddress1 =
                trimRequiredValidator.trim(registerFormDto.mailAddress1);
            registerFormDto.mailAddress2 =
                trimRequiredValidator.trim(registerFormDto.mailAddress2);
            registerFormDto.laboratory =
                trimRequiredValidator.trim(registerFormDto.laboratory);
            registerFormDto.promotion =
                trimRequiredValidator.trim(registerFormDto.promotion);
        }
    }

    ...
}
</pre>
				<ul>
				<li> RegexTrimRequiredValidatorTest</ll>
				</ul>
				<p>テストケースも書いておきます(半角・全角スペースの違いが判り難いかも)。</p>
				<pre>public class RegexTrimRequiredValidatorTest {
    @Test
    public void test1() {
        RegexTrimRequiredValidator validator;
        validator = new RegexTrimRequiredValidator();
        assertNull(validator.trim(null));
        assertEquals(&quot;&quot;, validator.trim(&quot;&quot;));
        assertEquals(&quot; &quot;, validator.trim(&quot; &quot;));
        assertEquals(&quot;abc&quot;, validator.trim(&quot;abc&quot;));

        validator = new RegexTrimRequiredValidator(&quot;[\\s　]*&quot;);
        assertNull(validator.trim(null));
        assertEquals(&quot;&quot;, validator.trim(&quot;&quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot; &quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot;　&quot;));
        assertEquals(&quot;a b&quot;, validator.trim(&quot;　a b &quot;));
        assertEquals(&quot;a b&quot;, validator.trim(&quot;　 　a b  　&quot;));
        assertEquals(&quot;abc&quot;, validator.trim(&quot;abc&quot;));

        validator = new RegexTrimRequiredValidator(&quot;^[\\s　]*$&quot;);
        assertNull(validator.trim(null));
        assertEquals(&quot;&quot;, validator.trim(&quot;&quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot; &quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot;　&quot;));
        assertEquals(&quot;a b&quot;, validator.trim(&quot;　a b &quot;));
        assertEquals(&quot;a b&quot;, validator.trim(&quot;　 　a b  　&quot;));
        assertEquals(&quot;abc&quot;, validator.trim(&quot;abc&quot;));

        validator = new RegexTrimRequiredValidator(&quot;^[\\s　]*$&quot;, &quot;^[\\s]*$&quot;);
        assertNull(validator.trim(null));
        assertEquals(&quot;&quot;, validator.trim(&quot;&quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot; &quot;));
        assertEquals(&quot;&quot;, validator.trim(&quot;　&quot;));
        assertEquals(&quot;a b&quot;, validator.trim(&quot;　a b &quot;));
        assertEquals(&quot;a b  　&quot;, validator.trim(&quot;　 　a b  　&quot;));
        assertEquals(&quot;abc&quot;, validator.trim(&quot;abc&quot;));
    }
}
</pre>
				<p>書いてみてなかなか便利だったので3月に書いたアプリでは大活躍でした(^^)。</p>
				<p>[2009-04-17 14:09追記]: 日記用にActionクラスを適当に書き得てたとこがおかしかったので修正。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2007/01/09/1action-1actionform%E3%82%921event-1actionform%E3%81%B8/' rel='bookmark' title='1Action 1ActionFormを1Event 1ActionFormへ'>1Action 1ActionFormを1Event 1ActionFormへ</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/06/07/s2struts-hotdeploy%E3%81%A7actionconfig%E3%81%AE%E3%83%91%E3%82%B9%E4%BF%AE%E6%AD%A3%E3%81%B8%E3%81%AE%E9%81%93-4/' rel='bookmark' title='S2Struts HotDeployでActionConfigのパス修正への道 (4)'>S2Struts HotDeployでActionConfigのパス修正への道 (4)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/hot-deploy%E6%99%82%E3%81%AE%E3%82%B5%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AEservice%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D/' rel='bookmark' title='HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)'>HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/04/16/cubby-regex-trim-required-validator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる</title>
		<link>http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/</link>
		<comments>http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/03/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/</guid>
		<description><![CDATA[

関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2006/06/07/s2struts-hotdeploy%E3%81%A7actionconfig%E3%81%AE%E3%83%91%E3%82%B9%E4%BF%AE%E6%AD%A3%E3%81%B8%E3%81%AE%E9%81%93-4/' rel='bookmark' title='S2Struts HotDeployでActionConfigのパス修正への道 (4)'>S2Struts HotDeployでActionConfigのパス修正への道 (4)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/' rel='bookmark' title='Cubbyでアクションメソッドに指定するアノテーションの順番'>Cubbyでアクションメソッドに指定するアノテーションの順番</a> <small>しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/hot-deploy%E6%99%82%E3%81%AE%E3%82%B5%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AEservice%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D/' rel='bookmark' title='HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)'>HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content36" class="fswiki_content">
				<p><a href="http://jfut.featia.net/diary/20090311.html#p01">Buri + S2JDBC対応 Example</a>のS2JDBCToDataAccessRule#insertでinsert関数が複数見つかる場合があったので試しにコード書いてみたらそうでした。Genericsはコンパイル時に型が解釈されるから当然なんだろうけど、普段コンパイルエラーで生成できないバイトコードが生成されるんですね。</p>
				<p>以下、コードと実行結果。</p>
				<ul>
				<li> S2AbstractService</ll>
				</ul>
				<pre>// S2-TigerのS2AbstractServiceから抜粋
public abstract class S2AbstractService&lt;T&gt; {
    ... 省略 ...
    public int insert(T entity) {
        return jdbcManager.insert(entity).execute();
    }
    ... 省略 ...
}
</pre>
				<ul>
				<li> AbstractService</ll>
				</ul>
				<pre>public abstract class AbstractService&lt;ENTITY&gt; extends S2AbstractService&lt;ENTITY&gt; {
    public int insert(ENTITY entity) {
        return super.insert(entity);
    }
}
</pre>
				<ul>
				<li> HogeService</ll>
				</ul>
				<pre>public class HogeService extends AbstractService&lt;Hoge&gt; {
    @Override
    public int insert(Hoge hoge) {
        hoge.registTime = new Timestamp(new Date().getTime());
        return super.insert(hoge);
    }
    // insert(Hoge hoge)関数とObject型が重複するので自分で書くとコンパイルエラー
    // public int insert(Object object) {
    //     ...
    // }
}
</pre>
				<ul>
				<li> 出力するためのコード、@Testついてるけど何もテストはしていない</ll>
				</ul>
				<pre>@RunWith(Seasar2.class)
@RootDicon(&quot;app.dicon&quot;)
public class HogeServiceTest {
    @Test
    public void testFindInsertMethod() {
        Method methods[] = HogeService.class.getMethods();
        for (Method method : methods) {
            if (method.getName().startsWith(&quot;insert&quot;)) {
                System.out.println(&quot;# method: &quot; + method.toGenericString());
            }
        }
        // Overrideされた関数があるかどうかを探します
        try {
            Method method =
                ClassUtil.getMethod(
                    HogeService.class,
                    &quot;insert&quot;,
                    new Class[] { Hoge.class });
            if (method != null) {
                System.out.println(&quot;## found: &quot; + method.toGenericString());
            }
        } catch (NoSuchMethodRuntimeException e) {
            System.out.println(&quot;## not found&quot;);
        }
    }
}
</pre>
				<ul>
				<li> 出力結果</ll>
				</ul>
				<pre># method: public int org.example.service.HogeService.insert(org.example.entity.Hoge)
# method: public int org.example.service.HogeService.insert(java.lang.Object)
## found: public int org.example.service.HogeService.insert(org.example.entity.Hoge)
</pre>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2006/06/07/s2struts-hotdeploy%E3%81%A7actionconfig%E3%81%AE%E3%83%91%E3%82%B9%E4%BF%AE%E6%AD%A3%E3%81%B8%E3%81%AE%E9%81%93-4/' rel='bookmark' title='S2Struts HotDeployでActionConfigのパス修正への道 (4)'>S2Struts HotDeployでActionConfigのパス修正への道 (4)</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2010/01/10/cubby-actionmethod-annotation-order/' rel='bookmark' title='Cubbyでアクションメソッドに指定するアノテーションの順番'>Cubbyでアクションメソッドに指定するアノテーションの順番</a> <small>しばらく時間が空いてからCubbyを使ったWEBアプリケーションを書く時に、アクションメソッドに指定するアノテーションの順番どうだったかなっと考えるのでまとめます。アノテーションなので適当な順番に書いても問題なく動作しま [...]...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/22/hot-deploy%E6%99%82%E3%81%AE%E3%82%B5%E3%83%96%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AEservice%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9D/' rel='bookmark' title='HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)'>HOT deploy時のサブアプリケーションのServiceクラスの==コンポーネント名==setterのメソッド名 (解決)</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Buri + S2JDBC対応 Example</title>
		<link>http://jfut.integ.jp/2009/03/11/buri-s2jdbc-example/</link>
		<comments>http://jfut.integ.jp/2009/03/11/buri-s2jdbc-example/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/03/buri-s2jdbc%E5%AF%BE%E5%BF%9C-example/</guid>
		<description><![CDATA[id:imai78さんの某のブログのぶり入門記マトメ, id:j5ik2oさんのBuriをS2JDBC対応にしてみる その３, id:jfluteさんのDBFlute: Buri対応のプロトタイプ公開, [id:mako [...]
関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/' rel='bookmark' title='仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる'>仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/09/3%E6%9C%88%E3%81%8B%E3%82%89%E6%9C%9D%E3%81%8B%E3%82%89%E6%99%A9%E3%81%BE%E3%81%A7%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A0%E3%81%A3%E3%81%9F/' rel='bookmark' title='3月から朝から晩までモードだった'>3月から朝から晩までモードだった</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2008/10/14/develop-environment/' rel='bookmark' title='完成、開発環境紹介'>完成、開発環境紹介</a> <small>最後のフェーズまで実装して完成。あとは考慮漏れがないことを祈るだけ。開発期間は認証周りなどは以前作ったものを流用してたので1週間ちょい。今回使ったものは次のとおり。 開発環境 Jiemamy: テーブル設計 (今回はER [...]...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content41" class="fswiki_content">
				<p><a href="http://d.hatena.ne.jp/imai78/">id:imai78さん</a>の<a href="http://groups.google.co.jp/group/buri-ja/web/%E6%9F%90%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E3%81%B6%E3%82%8A%E5%85%A5%E9%96%80%E8%A8%98%E3%83%9E%E3%83%88%E3%83%A1?hl=ja">某のブログのぶり入門記マトメ</a>, <a href="http://d.hatena.ne.jp/j5ik2o/20090307/1236434203">id:j5ik2oさんのBuriをS2JDBC対応にしてみる その３</a>, <a href="http://d.hatena.ne.jp/jflute/20090310/1236690449">id:jfluteさんのDBFlute: Buri対応のプロトタイプ公開</a>, [id:makotanさんの<a href="http://d.hatena.ne.jp/makotan/20090311#p3">buri]新たに拡張ポイント追加</a> に触発されて作ってみました(ほとんどid:j5ik2oさんのS2JDBCToDataAccessRuleのおかげです)。</p>
				<ul>
				<li> <a href="http://integ.jp/java/buri/">Buri + S2JDBC対応 Example</a> の buri-example4 (Eclipseプロジェクトをexportしたもの)
				<ul>
				<li> [2009-03-13 11:17追記] HogeServiceにOverrideしたinsert関数があるとinsert用OGNL式が重複するのを修正 (S2JDBCToDataAccessRule#insertSetup)</ll>
				</ul>
				<p></ll>
				</ul>
				<p>Buriの内部でS2Daoが使用されているので依存ライブラリとしての2Daoは残っていますが、とりあえず利用者からはS2Dao意識しなくてOKです。DocumentProcessorTestで実行してみた感じ、たぶんちゃんと動いてそうです。<del>詳細は家に帰った後にやる気があればかまた明日あたり</del>書きました。</p>
				<p>注意として、buri-core 1.0.1-SNAPSHOTはSVNから最新のコードをチェックアウトして自分のローカル環境に mvn install してください(最新のburi-core 1.0.1-SNAPSHOTをmvn deployして欲しいかも)。</p>
				<p>[2009-03-12 00:16追記] ファイルの説明を追加</p>
				<p>ファイルの説明。S2JDBC-Genで自動生成させるとBuri関係のEntity、Names、Serviceも生成されますが、判りやすいようにExampleでは削除してあります。</p>
				<ul>
				<li> src/main/java
				<ul>
				<li> entity.Document
				<ul>
				<li> S2JDBC-Genで生成したEntityクラス、publicフィールドしかありません、デフォルトのままで改変なし</li>
				</ul>
				</li>
				<li> entity.names.DocumentNames
				<ul>
				<li> S2JDBC-Genで生成したNamesクラス、このExampleでは出番ないですが実際にアプリを書くときは大活躍します、デフォルトのままで改変なし</li>
				</ul>
				</li>
				<li> service.AbstractService
				<ul>
				<li> S2JDBC-Genで生成したものにS2JDBCToDataAccessRule用に public ENTITY select(Long id) を追加してあります</li>
				</ul>
				</li>
				<li> service.DocumentService
				<ul>
				<li> S2JDBC-Genで生成したServiceクラス、デフォルトのままで改変なし、実際にアプリを書くときはここに主にDBへの様々な方法でアクセスするためのコードを追加していきます</li>
				</ul>
				</li>
				<li> org.escafe.buri.compiler.util.impl.rules.DataAccessCheckRule
				<ul>
				<li> protected void checkKeyName(BuriDataFieldType src) でS2JDBC用に javax.persistence.Id アノテーションでプライマリキーを探すようにコードを追加してあります、buri-share.dicon をいじりたくなかったので同名クラスでごまかしています・・・要課題？</li>
				</ul>
				</li>
				<li> org.escafe.buri.compiler.util.impl.rules.S2JDBCToDataAccessRule
				<ul>
				<li> <a href="http://d.hatena.ne.jp/j5ik2o/20090307/1236434203">id:j5ik2oさんのBuriをS2JDBC対応にしてみる その３</a><del>のまま</del>です</li>
				<li> [2009-03-13 11:17追記] HogeServiceにOverrideしたinsert関数があるとinsert用OGNL式が重複するのを修正 (S2JDBCToDataAccessRule#insertSetup) したのでそのままでは無くなりました</li>
				</ul>
				</li>
				</ul>
				</li>
				<li> src/main/resources
				<ul>
				<li> buri/dicon/buri-user.dicon
				<ul>
				<li> <a href="http://d.hatena.ne.jp/makotan/20090311#p3">id:makotanさんの新たに拡張ポイント追加</a>で追加された userDataFieldRuleSet で S2JDBCToDataAccessRule を設定、ただ、diconファイルのinclude順の問題で、&lt;include path=&quot;buri/dicon/event.dicon&quot; /&gt; と ClassDefUtilImpl のコンポーネント定義を追加</li>
				</ul>
				</li>
				<li> buri/dicon/selectByPath.sql
				<ul>
				<li> BuriPathDataを参照するS2JDBC用の2Way-SQLファイル、使い方は DocumentProcessorTest に</li>
				</ul>
				</li>
				<li> 他のdiconファイル
				<ul>
				<li> 普通のSMART deploy構成、ぶりと関係ないdiconファイルも入っていますが気にしないでください</li>
				</ul>
				</li>
				</ul>
				</li>
				<li> src/test/resources
				<ul>
				<li> DocumentProcessorTest
				<ul>
				<li> 動作テスト用のテストクラス、<a href="http://d.hatena.ne.jp/imai78/">id:imai78さん</a>のぶり入門記ベースです</ll>
				</ul>
				<p></ll>
				</ul>
				<p></ll>
				</ul>
				<p>これで今やっている期限が来週の一人プロジェクトで楽が出来そうです。</p>
				<p>なお、BuriAutoSelectProcessorでの簡単な動作確認しかしてないので、それ以外の複雑なことをしたらどのようになるかは試してみないと判らないです(^^;;。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/03/13/%E4%BB%AE%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%82%92%E5%9E%8B%E5%BC%95%E6%95%B0%E3%82%92%E6%8C%81%E3%81%A4%E9%96%A2%E6%95%B0%E3%81%A7override%E3%81%97%E3%81%9F/' rel='bookmark' title='仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる'>仮型引数を持つ関数を型引数を持つ関数でOverrideしたクラスからその関数をリフレクションで取得するとそれぞれ別の関数として見つかる</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/04/09/3%E6%9C%88%E3%81%8B%E3%82%89%E6%9C%9D%E3%81%8B%E3%82%89%E6%99%A9%E3%81%BE%E3%81%A7%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A0%E3%81%A3%E3%81%9F/' rel='bookmark' title='3月から朝から晩までモードだった'>3月から朝から晩までモードだった</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2008/10/14/develop-environment/' rel='bookmark' title='完成、開発環境紹介'>完成、開発環境紹介</a> <small>最後のフェーズまで実装して完成。あとは考慮漏れがないことを祈るだけ。開発期間は認証周りなどは以前作ったものを流用してたので1週間ちょい。今回使ったものは次のとおり。 開発環境 Jiemamy: テーブル設計 (今回はER [...]...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/03/11/buri-s2jdbc-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>寝込んで復活したらBuri周りが素敵なことになっていた</title>
		<link>http://jfut.integ.jp/2009/03/08/%E5%AF%9D%E8%BE%BC%E3%82%93%E3%81%A7%E5%BE%A9%E6%B4%BB%E3%81%97%E3%81%9F%E3%82%89buri%E5%91%A8%E3%82%8A%E3%81%8C%E7%B4%A0%E6%95%B5%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6/</link>
		<comments>http://jfut.integ.jp/2009/03/08/%E5%AF%9D%E8%BE%BC%E3%82%93%E3%81%A7%E5%BE%A9%E6%B4%BB%E3%81%97%E3%81%9F%E3%82%89buri%E5%91%A8%E3%82%8A%E3%81%8C%E7%B4%A0%E6%95%B5%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/03/%E5%AF%9D%E8%BE%BC%E3%82%93%E3%81%A7%E5%BE%A9%E6%B4%BB%E3%81%97%E3%81%9F%E3%82%89buri%E5%91%A8%E3%82%8A%E3%81%8C%E7%B4%A0%E6%95%B5%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6/</guid>
		<description><![CDATA[

関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2006/07/07/client-side-caching-command-line-options-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-1-1-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%83%84%E3%83%BC%E3%83%AB/' rel='bookmark' title='Client-Side Caching Command-Line Options バージョン 1.1 コマンド ライン ツール'>Client-Side Caching Command-Line Options バージョン 1.1 コマンド ライン ツール</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/21/s2strutsqualified-0-7-beta-2/' rel='bookmark' title='S2StrutsQualified 0.7 beta 2'>S2StrutsQualified 0.7 beta 2</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content43" class="fswiki_content">
				<p>id:j5ik2oさんがBuriをS2JDBC対応に！素晴らしい！！</p>
				<ul>
				<li> <a href="http://d.hatena.ne.jp/j5ik2o/20090305/1236279597">BuriをS2JDBC対応にしてみる その１</a></li>
				<li> <a href="http://d.hatena.ne.jp/j5ik2o/20090306/1236337020">BuriをS2JDBC対応にしてみる その２</a></li>
				<li> <a href="http://d.hatena.ne.jp/j5ik2o/20090307/1236434203">BuriをS2JDBC対応にしてみる その３</a></ll>
				</ul>
				<p>ParticipantのIDが反映されるように！素晴らしい！！</p>
				<ul>
				<li> <a href="http://d.hatena.ne.jp/r-matuda/">escafeFlowEditor ver0.2.0</a></li>
				<li> <a href="http://www.escafe.org/escafeFlowEditor/">escafeFlowEditor</a></ll>
				</ul>
				<p>Buriを使ってみようか迷ってたところでしたが、使うしかないですね。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2006/07/07/client-side-caching-command-line-options-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-1-1-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%83%84%E3%83%BC%E3%83%AB/' rel='bookmark' title='Client-Side Caching Command-Line Options バージョン 1.1 コマンド ライン ツール'>Client-Side Caching Command-Line Options バージョン 1.1 コマンド ライン ツール</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/08/21/s2strutsqualified-0-7-beta-2/' rel='bookmark' title='S2StrutsQualified 0.7 beta 2'>S2StrutsQualified 0.7 beta 2</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/03/08/%E5%AF%9D%E8%BE%BC%E3%82%93%E3%81%A7%E5%BE%A9%E6%B4%BB%E3%81%97%E3%81%9F%E3%82%89buri%E5%91%A8%E3%82%8A%E3%81%8C%E7%B4%A0%E6%95%B5%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>積もったタスク消化中: Hudson Plugin 完了</title>
		<link>http://jfut.integ.jp/2009/02/10/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/</link>
		<comments>http://jfut.integ.jp/2009/02/10/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Admin]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Project]]></category>
		<category><![CDATA[Seasar]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/02/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/</guid>
		<description><![CDATA[

関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/02/09/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/' rel='bookmark' title='積もったタスク消化中: Hudson Plugin'>積もったタスク消化中: Hudson Plugin</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD/' rel='bookmark' title='積もったタスク消化中'>積もったタスク消化中</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/munin-plugin-ipmitool_sensor_-1-4/' rel='bookmark' title='Munin Plugin: ipmitool_sensor_ 1.4'>Munin Plugin: ipmitool_sensor_ 1.4</a> <small>以前、2008-10-29 (Wed) &#8211; Munin ipmitool_sensor_ Pluginで紹介したMunin用のipmitool_sensor_ Pluginの新しいバージョンをリリースしました [...]...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content45" class="fswiki_content">
				<p><a href="http://jfut.integ.jp/category/java/feed//../20090209.html#p01">昨日作ったPublisher</a>で、ジョブの設定ファイル(config.xml)に値を保存し、その値をcronで回して処理するスクリプトが完成しました。Seasarコミッタの方で、マルチジョブ実行時に複数軸用のテストデータベース環境が必要な方は、下記のページを参考に設定してご利用ください。</p>
				<ul>
				<li> <a href="http://www.seasar.org/wiki/index.php?Hudson#testdb">テスト用データベースを使用するには &#8211; Hudson &#8211; SeasarWiki</a></ll>
				</ul>
				<p>作ったHudson Plug-inは次のとおりです。本当はPlug-inから直接DB環境作った方が良いんでしょうが、Tomcatの動作権限の問題でこのPlug-inはほぼ何もしません。。なので見ても参考にならないでしょうが下記にアップしてあります。</p>
				<ul>
				<li> <a href="http://integ.jp/java/hudson/plugins/testdb/">Hudson Test Database Plug-in</a>
				<ul>
				<li> config.xml に保存される値</ll>
				</ul>
				<p></ll>
				</ul>
				<pre>&lt;hudson.plugins.testdb.TestDBPublisher&gt;
  &lt;amountOfAdditionalTestDB&gt;3&lt;/amountOfAdditionalTestDB&gt;
&lt;/hudson.plugins.testdb.TestDBPublisher&gt;
</pre>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/02/09/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/' rel='bookmark' title='積もったタスク消化中: Hudson Plugin'>積もったタスク消化中: Hudson Plugin</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD/' rel='bookmark' title='積もったタスク消化中'>積もったタスク消化中</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/munin-plugin-ipmitool_sensor_-1-4/' rel='bookmark' title='Munin Plugin: ipmitool_sensor_ 1.4'>Munin Plugin: ipmitool_sensor_ 1.4</a> <small>以前、2008-10-29 (Wed) &#8211; Munin ipmitool_sensor_ Pluginで紹介したMunin用のipmitool_sensor_ Pluginの新しいバージョンをリリースしました [...]...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/02/10/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>積もったタスク消化中: Hudson Plugin</title>
		<link>http://jfut.integ.jp/2009/02/09/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/</link>
		<comments>http://jfut.integ.jp/2009/02/09/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 03:00:01 +0000</pubDate>
		<dc:creator>jfut</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Project]]></category>

		<guid isPermaLink="false">http://jfuttest1.integ.jp/2009/02/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/</guid>
		<description><![CDATA[

関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/02/10/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/' rel='bookmark' title='積もったタスク消化中: Hudson Plugin 完了'>積もったタスク消化中: Hudson Plugin 完了</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD/' rel='bookmark' title='積もったタスク消化中'>積もったタスク消化中</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/01/18/eclipse-plugin/' rel='bookmark' title='Eclipse Plugin'>Eclipse Plugin</a> <small> ...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[				<div id="fswiki_content47" class="fswiki_content">
				<p>Publisherで超簡単なの作ってみた。cronで回す連携用のスクリプトを明日作って完成かな。</p>
				</div>
<p>関連する記事:<ol>
<li><a href='http://jfut.integ.jp/2009/02/10/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin-%E5%AE%8C%E4%BA%86/' rel='bookmark' title='積もったタスク消化中: Hudson Plugin 完了'>積もったタスク消化中: Hudson Plugin 完了</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2009/02/08/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD/' rel='bookmark' title='積もったタスク消化中'>積もったタスク消化中</a> <small> ...</small></li>
<li><a href='http://jfut.integ.jp/2006/01/18/eclipse-plugin/' rel='bookmark' title='Eclipse Plugin'>Eclipse Plugin</a> <small> ...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://jfut.integ.jp/2009/02/09/%E7%A9%8D%E3%82%82%E3%81%A3%E3%81%9F%E3%82%BF%E3%82%B9%E3%82%AF%E6%B6%88%E5%8C%96%E4%B8%AD-hudson-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

