<?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>ナッツウェル 技術研究室</title>
	<atom:link href="http://www.natswell.com/techcolumn/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.natswell.com/techcolumn</link>
	<description></description>
	<lastBuildDate>Thu, 06 Oct 2011 09:41:37 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Review Boardを調査しました</title>
		<link>http://www.natswell.com/techcolumn/2011/10/06/review-board/</link>
		<comments>http://www.natswell.com/techcolumn/2011/10/06/review-board/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 09:41:37 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[ReviewBoard]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=506</guid>
		<description><![CDATA[平田です。 @ITの記事を参考に、コードレビューシステムのReview Boardを調査しました。 インストール まずは、マニュアルを読みながらReview Boardのインストールです。VMware上のUbuntu 11.04に入れました。以下、注意点など。 マニュアルはRDBMSとWebサーバが既に入っているものとして書かれています。私はMySQLとApache 2.2をapt-get installしました。 後述するセットアップ手順のマニュアルには、Webサーバとアプリケーションとの連携にはmod_wsgiが推奨されています。これもapt-get installします。ちなみにWikipediaによるとWSGIはウィスキーって読むみたいです。 MySQLバインディングをインストールする際、「mysql_config not found」というエラーが出ました。ので、apt-get install libmysqlclient-devします。 サイト生成 ミドルウェアを一通り入れたらReview Boardサイトを生成します。マニュアルはこちら。 あらかじめデータベースとユーザを作成しておく必要があります。 create database reviewboard default character set utf8; grant all privileges on reviewboard.* to reviewboard@localhost identified by 'reviewboard' with grant option; sudo rb-site install /var/www/reviews などとすると、GUIのウィザードが起動します。凝ってんなぁ。 マニュアルに沿ってパーミッションを変更し、Apacheの設定ファイルをコピーした後、/etc/apache2/sites-enabled/000-defaultを削除する必要がありました（マニュアルの&#8221;Note&#8221;に書かれています）。 リポジトリ登録 サイト生成がうまくいけば、Review Boardにアクセスできるはずです。 Review Boardでは、ソースコードリポジトリを登録し、レビュー依頼にパッチを同梱することで差分表示できるようになります。http://localhost/admin/db/scmtools/repository/にアクセスし、ソースコードリポジトリを登録します。 クライアント証明書 調査に使ったプロジェクトでは、Subversionリポジトリにアクセスする際にクライアント証明書を必要とします。これは画面からは設定できません。 /var/www/reviews/data/.subversion/servers設定ファイルを編集し、クライアント証明書ファイルとパスフレーズなどを設定します。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2011/10/reviewboard.png"><img class="alignnone size-medium wp-image-510" title="reviewboard" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2011/10/reviewboard-300x276.png" alt="" width="300" height="276" /></a></p>
<p>平田です。</p>
<p><a title="Review Boardならコードレビューを効率良くできる！" href="http://www.atmarkit.co.jp/fjava/rensai4/devtool19/devtool19_1.html">@ITの記事</a>を参考に、コードレビューシステムの<a title="Review Board" href="http://www.reviewboard.org/">Review Board</a>を調査しました。</p>
<p><span id="more-506"></span></p>
<h2>インストール</h2>
<p>まずは、<a title="インストールガイド（Linux）" href="http://www.reviewboard.org/docs/manual/1.6/admin/installation/linux/">マニュアル</a>を読みながらReview Boardのインストールです。VMware上のUbuntu 11.04に入れました。以下、注意点など。</p>
<ul>
<li>マニュアルはRDBMSとWebサーバが既に入っているものとして書かれています。私はMySQLとApache 2.2をapt-get installしました。</li>
<li>後述するセットアップ手順の<a title="セットアップ手順" href="http://www.reviewboard.org/docs/manual/1.6/admin/installation/creating-sites/">マニュアル</a>には、Webサーバとアプリケーションとの連携にはmod_wsgiが推奨されています。これもapt-get installします。ちなみにWikipediaによるとWSGIはウィスキーって読むみたいです。</li>
<li>MySQLバインディングをインストールする際、「mysql_config not found」というエラーが出ました。ので、apt-get install libmysqlclient-devします。</li>
</ul>
<h2>サイト生成</h2>
<p>ミドルウェアを一通り入れたらReview Boardサイトを生成します。マニュアルは<a title="セットアップ手順" href="http://www.reviewboard.org/docs/manual/1.6/admin/installation/creating-sites/">こちら</a>。</p>
<ul>
<li>あらかじめデータベースとユーザを作成しておく必要があります。
<pre>create database reviewboard default character set utf8;
grant all privileges on reviewboard.* to reviewboard@localhost
identified by 'reviewboard' with grant option;</pre>
</li>
<li>sudo rb-site install /var/www/reviews などとすると、GUIのウィザードが起動します。凝ってんなぁ。</li>
<li>マニュアルに沿ってパーミッションを変更し、Apacheの設定ファイルをコピーした後、/etc/apache2/sites-enabled/000-defaultを削除する必要がありました（マニュアルの&#8221;Note&#8221;に書かれています）。</li>
</ul>
<h2>リポジトリ登録</h2>
<p>サイト生成がうまくいけば、Review Boardにアクセスできるはずです。</p>
<p>Review Boardでは、ソースコードリポジトリを登録し、レビュー依頼にパッチを同梱することで差分表示できるようになります。http://localhost/admin/db/scmtools/repository/にアクセスし、ソースコードリポジトリを登録します。</p>
<h2>クライアント証明書</h2>
<p>調査に使ったプロジェクトでは、Subversionリポジトリにアクセスする際にクライアント証明書を必要とします。これは画面からは設定できません。</p>
<p>/var/www/reviews/data/.subversion/servers設定ファイルを編集し、クライアント証明書ファイルとパスフレーズなどを設定します。</p>
<pre>[groups]
your_group_name_here = foo.example.com
[your_group_name_here]
ssl-client-cert-file=/path/to/certfile
ssl-client-cert-password=your-password-here</pre>
<h2>使ってみた感想</h2>
<p>@ITの記事を参考に、レビューのワークフローを回してみました。レビューの依頼はコマンドラインツールから可能ですが、Pythonを入れるのが面倒だったのでパッチアップロードによるレビューリクエストで進めました。以下、感想です。</p>
<ul>
<li>レビューの依頼や、指摘事項のステータス管理など、TracやRedmineなどのチケット管理システムと機能的に重複している（似たような別のシステムを使いたくない）。</li>
<li>コミット前レビューは良いような気もするけど、レビュアの時間が確保できない場合、コミットが遅れてしまう。コミットが遅れるとマージが発生しうる。それは嫌だ。</li>
<li>Eclipse Pluginが動かない。</li>
<li>コマンドラインツールはPythonから入れなくてはならない。それは嫌だ。</li>
</ul>
<p>全体的にネガティブですね。ツール自体はイケてますが、私にマッチしないだけかもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2011/10/06/review-board/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss Developer Workshop – SwitchYardに参加してきました</title>
		<link>http://www.natswell.com/techcolumn/2011/09/21/jboss-developer-workshop-switchyard/</link>
		<comments>http://www.natswell.com/techcolumn/2011/09/21/jboss-developer-workshop-switchyard/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 06:29:56 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[JBoss製品]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=493</guid>
		<description><![CDATA[平田です。 9/14のテーマはSwitchYardです。SwitchYardは、JBoss ESBに代わる次期ESB基盤です。 SwitchYardのワークショップは、下記の五つのトピックからなります。 SwitchYard概要 サービス指向のインテグレーション（実装寄りの話） 演習 エンタープライズサービス開発 ロードマップなど SwitchYard概要 SOAやESBのお話と、SwitchYardの概要の説明です。 SwitchYardが開発されるに至った経緯など JBoss ESBと同じチームが開発しているそうです。 JBoss ESBの問題を解決しようとしたところ、あまりに影響が大きいので、別プロジェクトにしたのだとか。 サービス指向とは インタフェース、メッセージング、実装、ポリシー、バインディングなどサービス指向における基本コンセプト（SwitchYardの中の人が考える）の説明です。このモデルを実現したのがSwitchYard（の特にBean Services）といった感じ。 SwitchYard上で定義するサービスの種類 Bean Service Java Interface + POJO + アノテーションで定義します。Session Beanっぽい。 Camel Service Apache Camelを使ったサービスを記述できます。ESBが持つべき機能の大半は、Camelを組み込むことで実現している印象です。Camelを取り込んだESBというとApache ServiceMixというのがあるみたい。 BPM Service jBPM5によるサービスオーケストレーションです。JBoss ESBだとjBPM 3.xですね。 デプロイと実行形式 JBoss AS6 or AS7 + SwitchYardに、JARをデプロイします。 WAR形式でサーブレットコンテナにデプロイします。 組み込みデプロイで自動テストします。 OSGiバンドル（予定）。 ちなみに、JBoss ESBでは、中にJBoss ESB用の設定ファイルを同梱して*.esb形式にアーカイブしてデプロイします。 テスト JBoss ESBでは全て統合しないとテストできなかった件を改善するそうです。 [...]]]></description>
			<content:encoded><![CDATA[<p>平田です。</p>
<p>9/14のテーマは<a title="SwitchYard" href="http://www.jboss.org/switchyard">SwitchYard</a>です。SwitchYardは、<a title="JBoss ESB" href="http://www.jboss.org/jbossesb">JBoss ESB</a>に代わる次期ESB基盤です。</p>
<p>SwitchYardのワークショップは、下記の五つのトピックからなります。</p>
<ol>
<li>SwitchYard概要</li>
<li>サービス指向のインテグレーション（実装寄りの話）</li>
<li>演習</li>
<li>エンタープライズサービス開発</li>
<li>ロードマップなど</li>
</ol>
<h2><span id="more-493"></span>SwitchYard概要</h2>
<p>SOAやESBのお話と、SwitchYardの概要の説明です。</p>
<ul>
<li>SwitchYardが開発されるに至った経緯など</li>
<ul>
<li>JBoss ESBと同じチームが開発しているそうです。</li>
<li>JBoss ESBの問題を解決しようとしたところ、あまりに影響が大きいので、別プロジェクトにしたのだとか。</li>
</ul>
<li>サービス指向とは</li>
<ul>
<li>インタフェース、メッセージング、実装、ポリシー、バインディングなどサービス指向における基本コンセプト（SwitchYardの中の人が考える）の説明です。このモデルを実現したのがSwitchYard（の特にBean Services）といった感じ。</li>
</ul>
<li>SwitchYard上で定義するサービスの種類</li>
<ul>
<li>Bean Service</li>
<ul>
<li>Java Interface + POJO + アノテーションで定義します。Session Beanっぽい。</li>
</ul>
<li>Camel Service</li>
<ul>
<li><a title="Apache Camel" href="http://camel.apache.org/">Apache Camel</a>を使ったサービスを記述できます。ESBが持つべき機能の大半は、Camelを組み込むことで実現している印象です。Camelを取り込んだESBというと<a title="Apache ServiceMix" href="http://servicemix.apache.org">Apache ServiceMix</a>というのがあるみたい。</li>
</ul>
<li>BPM Service</li>
<ul>
<li>jBPM5によるサービスオーケストレーションです。JBoss ESBだとjBPM 3.xですね。</li>
</ul>
</ul>
<li>デプロイと実行形式</li>
<ul>
<li>JBoss AS6 or AS7 + SwitchYardに、JARをデプロイします。</li>
<li>WAR形式でサーブレットコンテナにデプロイします。</li>
<li>組み込みデプロイで自動テストします。</li>
<li>OSGiバンドル（予定）。</li>
<li>ちなみに、JBoss ESBでは、中にJBoss ESB用の設定ファイルを同梱して*.esb形式にアーカイブしてデプロイします。</li>
</ul>
<li>テスト</li>
<ul>
<li>JBoss ESBでは全て統合しないとテストできなかった件を改善するそうです。</li>
<li>SwitchYardRunnerというJUnitのテストランナーを使えます。</li>
<li>CDIやHTTPなど、他のミドルウェア、プロトコルのテストサポートを追加できるしくみをMixInと言うらしいです。</li>
<li><a title="Arquillian" href="http://www.jboss.org/arquillian">Arquillian</a>も使えます。</li>
</ul>
<li>開発生産性</li>
<ul>
<li>Maven、Seam Forge、Eclipse</li>
</ul>
</ul>
<h2>サービス指向のインテグレーション</h2>
<p>実装寄りのお話です。</p>
<ul>
<li>サービス</li>
<ul>
<li>Bean Services</li>
<ul>
<li>POJOでサービスが記述できる&#8230;って、バス内でサービスの実装はしないと思うんだけど。</li>
<li>もろにSession Beanみたいなたたずまい。</li>
</ul>
<li>Camel Services</li>
<ul>
<li>XMLでもJava（<a title="流れるようなインタフェース" href="http://capsctrl.que.jp/kdmsnr/wiki/bliki/?FluentInterface">流れるようなインタフェース</a>）でも記述できます。</li>
</ul>
</ul>
<li>ゲートウェイ</li>
<ul>
<li>JBoss ESBのゲートウェイと同じく、バスの入り口を定義します。</li>
<li>大半のプロトコルは、Camel Gatewayが解決する模様。</li>
<li>Camel GatewayによるJMSのほか、直接HornetQのゲートウェイを定義できます。</li>
</ul>
<li>データ変換</li>
<ul>
<li>JBoss ESBでもおなじみのXSLT、Smooksは使えます。</li>
<li>Java Transformer、つまり変換ロジックですよね。</li>
<li>JAX-BやJSONなど。</li>
</ul>
<li>テスト</li>
<ul>
<li>JUnit4の例でした。</li>
</ul>
</ul>
<h2>演習</h2>
<p>演習ではサンプルを作成して実行しました。サンプルは二つあり、一つはSwitchYardに同梱されている在庫管理サービスと発注サービスの連携処理です。もう一つは、車の検査？のサービスです。</p>
<p>jBPM5と同様、あまり込み入ったものではありませんでした。</p>
<h2>エンタープライズサービス開発</h2>
<p>DroolsやjBPMとの統合、管理機能のお話です。全く頭に残っていませんしスライドを見返しても何のことか分かりません。完全に集中力を逸していた模様。</p>
<h2>ロードマップなど</h2>
<p>スライドが配布されなかったのですが、クラウド、ポリシー（PicketBoxと連動したセキュリティ）、Guvnorリポジトリ（JBoss ESBにおけるレジストリ？）、各種ツールなど、今後のロードマップのお話です。</p>
<hr />
<p>ESB自体あまり使ったことがないので、ピンとこない部分も多かったです（私の問題）。印象に残った点としては次のことでしょうか。</p>
<ul>
<li>ESBの機能性は、<a title="エンタープライズ統合パターン" href="http://www.eaipatterns.com/">エンタープライズ統合パターン</a>をいかにカバーするか、なんじゃないかということ。</li>
<li>エンタープライズ統合パターンのカバレッジは、Camelを取り込むことで確保している。</li>
<li>XMLからPOJO、アノテーションへの流れが、EJBっぽい。</li>
<li>単に理解不足かもしれませんが、SwitchYardはESBってよりSOA基盤なのかもしれません。つまりサービス群の連携インフラとしてのメッセージバスではなく、サービスのコンテナというか。</li>
<li>実戦投入するにはもう少し時間がかかりそう。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2011/09/21/jboss-developer-workshop-switchyard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss Developer Workshop &#8211; jBPM5に参加してきました</title>
		<link>http://www.natswell.com/techcolumn/2011/09/20/jboss-developer-workshop-jbpm5/</link>
		<comments>http://www.natswell.com/techcolumn/2011/09/20/jboss-developer-workshop-jbpm5/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 06:34:40 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=474</guid>
		<description><![CDATA[平田です。 9/13、14に開催されたJBoss Developer Workshopに参加してきました。 9/13のテーマはjBPM5です。仕事ではjBPM3.2を使っていますが、jBPM5の実体はDrools Flowということで全然別物になっています（悲しい&#8230;）。 ちなみにこのワークショップは無料でありながらノベルティのUSBメモリが配られ、お茶と温かいコーヒー、お菓子、更にお昼に弁当（美味しい）が用意されていました。レッドハット社主催とは言え、まだ商用版に組み込まれていないコミュニティ成果物のワークショップなのに、このホスピタリティ。更に海外から開発者を呼んだ上に通訳つけてます。この気合、逆に怖い。 jBPM5のワークショップは、四つのトピックからなります。 jBPM5 概要 開発ガイド 演習 jBPM, more than &#8220;just&#8221; BPM jBPM5 概要 BPMのお話と、jBPM5の特徴に関するお話でした。 BPMN 2.0対応 jBPM3.2ではjPDLという形式でプロセス（いわゆるフローチャート）を記述しましたが、BPMN 2.0という標準規格で記述します。 BPMN 2.0は、表記（見た目）まで定義している点がUMLっぽいと思いました。 ルール・イベントとの統合 そもそもがDroolsの成果物を引き継いだ形なので、ルールエンジンとの統合は言わずもがな。イベントについてはよく分かりません。3.2でもフックはたくさんありました。 ワークフローエンジン + オプショナルなコンポーネント・ツール群という構成 永続化やプロセス定義のリポジトリなどが、エンジンと切り離されています。 永続化は、3.2まではHibernateでしたが、JPAベースになっています。 管理コンソールが、REST API + GWTになっていて美しいと思いました。JBoss AS7の管理コンソールも確か同じアーキテクチャですよね。 ドメイン特化プロセス BPMN 2.0ベースのフローチャートに、特定用途向けのノードを追加する仕組みです。マニュアルを見ると分かりますが、アイコンを自由に設定できます。 jPDLにしろ生BPMN 2.0にしろ業務寄りの人には難しいので、別途フローチャートを用意してコミュニケーションを取っていたのですが、それが改善されるかも？ ヒューマンタスクサービス 3.2まではプロセスの進捗状態と一緒くたに永続化されていたタスクが、jBPM5では分離されています。 WS-HumanTaskという標準規格を実装したサービスだそうで。 jBPM5のロードマップ シミュレーションをサポートする予定だそうです。シミュレーションって何でしょうね。 BPMN 2.0のエディタが新しくなるとか。Eclipse.orgに寄贈したとかなんとか。 ドメイン特化プロセスの汎用的なもの（オープンスタンダードなプロトコルや、メジャーなサービス &#8211; Googleなんたら、Twitter）を用意して、すぐ使えるようにしたいとか。  開発ガイド 概要からブレイクダウンしてBPMN [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_484" class="wp-caption alignnone" style="width: 266px"><a href="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2011/09/thumbdrive.jpg"><img class="size-full wp-image-484" title="JBoss thumb drive" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2011/09/thumbdrive.jpg" alt="JBoss thumb drive" width="256" height="192" /></a><p class="wp-caption-text">配布されたUSBメモリ</p></div>
<p>平田です。</p>
<p>9/13、14に開催されたJBoss Developer Workshopに参加してきました。</p>
<p>9/13のテーマはjBPM5です。仕事ではjBPM3.2を使っていますが、jBPM5の実体は<a title="Drools Flow" href="http://www.jboss.org/drools/drools-flow">Drools Flow</a>ということで全然別物になっています（悲しい&#8230;）。</p>
<p>ちなみにこのワークショップは無料でありながらノベルティのUSBメモリが配られ、お茶と温かいコーヒー、お菓子、更にお昼に弁当（美味しい）が用意されていました。レッドハット社主催とは言え、まだ商用版に組み込まれていないコミュニティ成果物のワークショップなのに、このホスピタリティ。更に海外から開発者を呼んだ上に通訳つけてます。この気合、逆に怖い。</p>
<p>jBPM5のワークショップは、四つのトピックからなります。</p>
<ol>
<li>jBPM5 概要</li>
<li>開発ガイド</li>
<li>演習</li>
<li>jBPM, more than &#8220;just&#8221; BPM</li>
</ol>
<p><span id="more-474"></span></p>
<h2>jBPM5 概要</h2>
<p>BPMのお話と、jBPM5の特徴に関するお話でした。</p>
<ul>
<li>BPMN 2.0対応</li>
<ul>
<li>jBPM3.2ではjPDLという形式でプロセス（いわゆるフローチャート）を記述しましたが、BPMN 2.0という標準規格で記述します。</li>
<li>BPMN 2.0は、表記（見た目）まで定義している点がUMLっぽいと思いました。</li>
</ul>
<li>ルール・イベントとの統合</li>
<ul>
<li>そもそもが<a title="Drools" href="http://www.jboss.org/drools">Drools</a>の成果物を引き継いだ形なので、ルールエンジンとの統合は言わずもがな。イベントについてはよく分かりません。3.2でもフックはたくさんありました。</li>
</ul>
<li>ワークフローエンジン + オプショナルなコンポーネント・ツール群という構成</li>
<ul>
<li>永続化やプロセス定義のリポジトリなどが、エンジンと切り離されています。</li>
<li>永続化は、3.2まではHibernateでしたが、JPAベースになっています。</li>
<li>管理コンソールが、REST API + GWTになっていて美しいと思いました。JBoss AS7の管理コンソールも確か同じアーキテクチャですよね。</li>
</ul>
<li>ドメイン特化プロセス</li>
<ul>
<li>BPMN 2.0ベースのフローチャートに、特定用途向けのノードを追加する仕組みです。<a title="jBPM v5.1 manual ch13" href="http://docs.jboss.org/jbpm/v5.1/userguide/ch13.html">マニュアル</a>を見ると分かりますが、アイコンを自由に設定できます。</li>
<li>jPDLにしろ生BPMN 2.0にしろ業務寄りの人には難しいので、別途フローチャートを用意してコミュニケーションを取っていたのですが、それが改善されるかも？</li>
</ul>
<li>ヒューマンタスクサービス</li>
<ul>
<li>3.2まではプロセスの進捗状態と一緒くたに永続化されていたタスクが、jBPM5では分離されています。</li>
<li>WS-HumanTaskという標準規格を実装したサービスだそうで。</li>
</ul>
<li>jBPM5のロードマップ</li>
<ul>
<li>シミュレーションをサポートする予定だそうです。シミュレーションって何でしょうね。</li>
<li>BPMN 2.0のエディタが新しくなるとか。Eclipse.orgに寄贈したとかなんとか。</li>
<li>ドメイン特化プロセスの汎用的なもの（オープンスタンダードなプロトコルや、メジャーなサービス &#8211; Googleなんたら、Twitter）を用意して、すぐ使えるようにしたいとか。</li>
</ul>
</ul>
<h2> 開発ガイド</h2>
<p>概要からブレイクダウンしてBPMN 2.0のプロセス定義と実装よりのお話でした。</p>
<ul>
<li>BPMN 2.0 構成要素</li>
<ul>
<li>ノード + 遷移の有向グラフで、ノードのサブタイプが定義される構成はjPDLと同じです。遷移はTransitionではなくSequenceFlowと言うらしい。</li>
<li>jPDLのデシジョン、及びフォーク・ジョインに相当するものは、BPMN 2.0ではGateway。</li>
</ul>
<li>Java API</li>
<ul>
<li>KnowledgeBaseの操作など、基本的にDroolsです。このへんは勉強し直しですね。</li>
</ul>
<li>SwitchYard</li>
<ul>
<li>SwitchYardは、JBoss内の次期ESB基盤です（9/14のワークショップのテーマ）。現行のJBoss ESBでは、jBPM 3.xベースのサービスオーケストレーションが可能ですが、SwitchYardではjBPM5を使ってサービスオーケストレーションを実現するとのこと。</li>
</ul>
<li>jBPM Installer</li>
<ul>
<li>jBPM5の開発、実行に必要なEclipseからAPサーバまでJava VM以外全てダウンロード・セットアップするAntスクリプトです。数百MBダウンロードするので時間がかかりますが、とりあえず動かすには良いんじゃないでしょうか。</li>
</ul>
<li>アプリ統合</li>
<ul>
<li>何かのシステムでjBPM5を使う場合、ライブラリとして同梱する「組み込み」形式と、REST・SOAP・EJBなどでラップした「サービス」形式があります。</li>
<li>管理コンソールはREST API + GWTという構成なので、REST API経由でアクセスすればJavaでなくとも良くなりますね。ただしトランザクションはぶった切れますが。</li>
</ul>
</ul>
<h2>演習</h2>
<p>予め必要なソフトウェアをダウンロード済みのjBPM Installerが配布され、それを使ってjBPM5のサンプルを作成しました。</p>
<p>これがワークショップのメインかと思いきや、本当にさわりの部分だけでした。ちなみに演習の内容は次の通りです。</p>
<ul>
<li>jBPM5管理コンソール、Guvnorをセットアップし、サンプルを動作させる。</li>
<li>ドメイン特化プロセスを作成する。</li>
<li>Freemarkerでフォームを作成する。</li>
<li>ルールを使う。</li>
</ul>
<h2>jBPM, more than “just” BPM</h2>
<p>jBPMのビジョンに関するプレゼンテーションです。ワークショップの締めですね。</p>
<ul>
<li>従来のBPMシステムではプロセスが複雑になりがちであったが、プロセスとルール、イベントの合わせ技でプロセスをシンプルにする。</li>
<li>JBoss AS7が超速い件。</li>
<li>クラウドの話（レッドハット社のOpenShift）。</li>
<li>Android上で動く（！）jBPM</li>
</ul>
<hr />
<p>冒頭でも書きましたがレッドハット社の気合により至れり尽くせりで、参加して良かったです。</p>
<p>BPM製品なので、実際にjBPM5が組み込まれたサンプルシステム（Seam BookingやDVD Storeのような）でプロセスを簡単に変更できまっせ、みたいなデモがあると良かったかも？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2011/09/20/jboss-developer-workshop-jbpm5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>シングルサインオンを実現するオープンソースソフトウェア「OpenAM」</title>
		<link>http://www.natswell.com/techcolumn/2011/07/07/sso1/</link>
		<comments>http://www.natswell.com/techcolumn/2011/07/07/sso1/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 07:01:14 +0000</pubDate>
		<dc:creator>kazuko-h</dc:creator>
				<category><![CDATA[OpenAM]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=409</guid>
		<description><![CDATA[こんにちは、廣川です。 先日、シングルサインオン（以下、SSO）を導入するという案件が舞い込んできたため、SSO を実現するためのオープンソースソフトウェアである「OpenAM」を調査しました。 OpenAM は前述したとおり、SSO を実現するためのオープンソースソフトウェアなのですが、経緯が少し特殊です。 現在はノルウェーの ForgeRock という会社が運営・開発をしていますが、元々は、旧サン・マイクロシステムズが「OpenSSO」という名前で運営していました。 OpenSSO は、旧サン・マイクロシステムズの製品である「Sun Java System Access Manager」と「Sun Java System Federation Manager」のソースコードを用いて作られています。 この辺りの経緯や歴史は調べればいくらでも出ると思うので、これ以上は割愛します。 OpenAM は商用製品にも劣らない機能と信頼度を持つソフトウェアだと思うのですが、全くの SSO 初心者には少し敷居が高い気がしました。 OpenAM を調べてみた感想としては、以下の三つです。 １、情報が集めにくい ２、エラーが出た場合に、原因の特定が難しい ３、設定項目が多い １つめ。「情報が集めにくい」 OpenAM は前述した通り経緯が少し特殊で、二度名前が変わっています。（「Sun Java System Access Manager」⇒「OpenSSO」⇒「OpenAM」） そのため、情報が分散しています。Sun Java System Access Manager や OpenSSO の資料はよく引っかかるのに、　OpenAM の資料が出てこない、そんな状態です。 とはいえ、以前の名前で出てくる資料もちゃんと参考になるので、そこまで問題視するようなものでもないですが。 また、OpenAM や OpenSSO の資料は、英語のものが多いです。 英語が堪能ならば、情報ももっと楽に集められた気がしますが、そうでない人間にはとても厳しいと思います。そして私は残念ながら「そうでない人間」でした。 ２つめ。「エラーが出た場合に、原因の特定が難しい」 そこまで有名でないオープンソースの宿命と言うべきか、エラーに関しての情報があまり Web 上にありません。 [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、廣川です。</p>
<p>先日、シングルサインオン（以下、SSO）を導入するという案件が舞い込んできたため、SSO を実現するためのオープンソースソフトウェアである「OpenAM」を調査しました。<br />
<span id="more-409"></span></p>
<p>OpenAM は前述したとおり、SSO を実現するためのオープンソースソフトウェアなのですが、経緯が少し特殊です。<br />
現在はノルウェーの ForgeRock という会社が運営・開発をしていますが、元々は、旧サン・マイクロシステムズが「OpenSSO」という名前で運営していました。<br />
OpenSSO は、旧サン・マイクロシステムズの製品である「Sun Java System Access Manager」と「Sun Java System Federation Manager」のソースコードを用いて作られています。</p>
<p>この辺りの経緯や歴史は調べればいくらでも出ると思うので、これ以上は割愛します。</p>
<p>OpenAM は商用製品にも劣らない機能と信頼度を持つソフトウェアだと思うのですが、全くの SSO 初心者には少し敷居が高い気がしました。<br />
OpenAM を調べてみた感想としては、以下の三つです。</p>
<p>１、情報が集めにくい<br />
２、エラーが出た場合に、原因の特定が難しい<br />
３、設定項目が多い</p>
<div style="margin-top:40px;">
１つめ。「情報が集めにくい」</p>
<p>OpenAM は前述した通り経緯が少し特殊で、二度名前が変わっています。（「Sun Java System Access Manager」⇒「OpenSSO」⇒「OpenAM」）<br />
そのため、情報が分散しています。Sun Java System Access Manager や OpenSSO の資料はよく引っかかるのに、　OpenAM の資料が出てこない、そんな状態です。<br />
とはいえ、以前の名前で出てくる資料もちゃんと参考になるので、そこまで問題視するようなものでもないですが。</p>
<p>また、OpenAM や OpenSSO の資料は、英語のものが多いです。<br />
英語が堪能ならば、情報ももっと楽に集められた気がしますが、そうでない人間にはとても厳しいと思います。そして私は残念ながら「そうでない人間」でした。
</p></div>
<div style="margin-top:40px;">
２つめ。「エラーが出た場合に、原因の特定が難しい」</p>
<p>そこまで有名でないオープンソースの宿命と言うべきか、エラーに関しての情報があまり Web 上にありません。<br />
そのため、エラーの原因を調べるためには、ソースやログを読み解くしかありません。<br />
ログは複数に分かれており、一体どのログファイルに必要なログが出力されているのか、特定するのも一苦労です。</p>
<p>ですが、苦労して原因を特定してみると結局、設定を間違えただけなことが多かったです。かなりガックリ来ます。<br />
（安定版をダウンロードしている以上、そうそうソフトウェアのバグはないんですけども）
</p></div>
<div style="margin-top:40px;margin-bottom:40px;">
３つめ。「設定項目が多い」</p>
<p>OpenAM に必要な設定は結構多いです。「OpenAMに必要」というよりは、「SSOに必要」な項目が多いのかもしれません。<br />
（とはいえ、他の SSO ソフトウェアを使用したことがないので、なんとも言えないですが）</p>
<p>デフォルトのままでもある程度使えるのですが、ちょっと変わったことをしようとすると、すぐに詰まります。<br />
どこを弄るとどこが変化するのか、よく把握できないことが多いです。求める結果を得るために、何をしたらいいのかすら判りません。</p>
<p>一応、管理コンソールには設定に関する説明（ヘルプページ）もあるのですが、説明を読んでも具体的に何を入力すればいいのかさっぱりわかりません。<br />
「この値は、現在使用されていません。」と説明されている項目が、実は重要な値なことさえあります。<br />
正直なところ、あんまり参考にならないと思います。</p>
<p>OpenAMは少しの設定ミスで、かなり致命的な現象（たとえば管理コンソールに入れなかったり、無限ループになったり）が引き起こされるので、注意が必要です。
</p></div>
<p>などと色々書いてみましたが、何とか必要な環境は構築することが出来ました。<br />
ということで、次回は少し具体的な話について書こうと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2011/07/07/sso1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SeamのjBPMコンポーネントを使うと、例外発生時にjBPMのデータがロールバックされない</title>
		<link>http://www.natswell.com/techcolumn/2010/05/26/seam-jbpm-rollback-problem/</link>
		<comments>http://www.natswell.com/techcolumn/2010/05/26/seam-jbpm-rollback-problem/#comments</comments>
		<pubDate>Wed, 26 May 2010 08:52:01 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[JBoss製品]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=395</guid>
		<description><![CDATA[JBoss SeamにはjBPMの利用を支援するコンポーネントが同梱されていますが、アプリケーション側で例外が発生したり、jBPM側（プロセス定義中の各種ハンドラなど）で例外が発生した際に、jBPMのデータがコミットされてしまう不具合があります。 この不具合のバグレポートが挙がっていますが、まだ解決されていないようです。 未解決のバグレポート https://jira.jboss.org/browse/JBSEAM-4512 上記のバグレポートによればSeam 2.2.0.GAで発生するようですが、手元の2.1.2でも同様の問題が確認できました。 原因 この不具合の原因は2つあります。 例外発生後もjBPMのエンティティがHibernate Session上に残ってしまっている。 JbpmContextのxxxForUpdateメソッドを使っており、Hibernate Session上だけでなく、JbpmContext.autoSaveProcessInstancesにもエンティティが残っている為、クローズ時に保存されてしまう。 SeamではHTTPリクエスト1件を複数のトランザクションで処理しますが、ビジネス層のトランザクション（Restore ViewフェーズからInvoke Applicationフェーズまで）後もjBPMのエンティティがHibernate Sessionに残っており、プレゼンテーション層のトランザクション（Render Responseフェーズ）でコミットされてしまいます。 また、xxxForUpdateメソッドを使用しているため、例外発生時にjBPMのHibernate Sessionをクリアしても、JbpmContextのautoSaveProcessInstancesにエンティティが残っており、jBPMデータが登録されてしまいます。 ちなみに、アプリケーション側のエンティティも永続コンテキストに残っているのに、なぜコミットされないのか疑問に思い調べたところ、Render Responseフェーズ直前でエンティティマネージャのFlushModeをMANUALに切り替えている為のようです（SeamPhaseListener#beforeRenderResponseの最後のあたり）。 回避策1. SeamのjBPM関連コンポーネントを使わない SeamのjBPM関連コンポーネントは使わず、アプリケーションロジックから直接jBPM APIを叩くことで、この問題を回避&#8230;、というか無視できます。 jBPMの永続化には、Seam管理のHibernate Sessionを使用します。 Seam管理のHibernate Session - components.xml ... &#60;persistence:hibernate-session-factory name="hibernateSessionFactory"/&#62; &#60;persistence:managed-hibernate-session name="hibernateSession" auto-create="true" session-factory-jndi-name="java:/hibernateSessionFactory"/&#62; ... Hibernate SessionをJbpmContextインスタンスに注入することで、アプリケーションと同じトランザクション境界で処理できるようになります。 ... public void open() { Session hibernateSession = (Session) Component.getInstance("hibernateSession"); JbpmContext jbpmContext = [...]]]></description>
			<content:encoded><![CDATA[<p>JBoss SeamにはjBPMの利用を支援するコンポーネントが同梱されていますが、アプリケーション側で例外が発生したり、jBPM側（プロセス定義中の各種ハンドラなど）で例外が発生した際に、jBPMのデータがコミットされてしまう不具合があります。</p>
<p>この不具合のバグレポートが挙がっていますが、まだ解決されていないようです。</p>
<dl>
<dt>未解決のバグレポート</dt>
<dd><a href="https://jira.jboss.org/browse/JBSEAM-4512">https://jira.jboss.org/browse/JBSEAM-4512</a></dd>
</dl>
<p>上記のバグレポートによればSeam 2.2.0.GAで発生するようですが、手元の2.1.2でも同様の問題が確認できました。</p>
<p><span id="more-395"></span></p>
<h2>原因</h2>
<p>この不具合の原因は2つあります。</p>
<ol>
<li>例外発生後もjBPMのエンティティがHibernate Session上に残ってしまっている。</li>
<li>JbpmContextのxxxForUpdateメソッドを使っており、Hibernate Session上だけでなく、JbpmContext.autoSaveProcessInstancesにもエンティティが残っている為、クローズ時に保存されてしまう。</li>
</ol>
<p>SeamではHTTPリクエスト1件を複数のトランザクションで処理しますが、ビジネス層のトランザクション（Restore ViewフェーズからInvoke Applicationフェーズまで）後もjBPMのエンティティがHibernate Sessionに残っており、プレゼンテーション層のトランザクション（Render Responseフェーズ）でコミットされてしまいます。</p>
<p>また、xxxForUpdateメソッドを使用しているため、例外発生時にjBPMのHibernate Sessionをクリアしても、JbpmContextのautoSaveProcessInstancesにエンティティが残っており、jBPMデータが登録されてしまいます。</p>
<p>ちなみに、アプリケーション側のエンティティも永続コンテキストに残っているのに、なぜコミットされないのか疑問に思い調べたところ、Render Responseフェーズ直前でエンティティマネージャのFlushModeをMANUALに切り替えている為のようです（SeamPhaseListener#beforeRenderResponseの最後のあたり）。</p>
<h2>回避策1. SeamのjBPM関連コンポーネントを使わない</h2>
<p>SeamのjBPM関連コンポーネントは使わず、アプリケーションロジックから直接jBPM APIを叩くことで、この問題を回避&#8230;、というか無視できます。</p>
<p>jBPMの永続化には、Seam管理のHibernate Sessionを使用します。</p>
<pre>Seam管理のHibernate Session - components.xml
...
&lt;persistence:hibernate-session-factory name="hibernateSessionFactory"/&gt;
&lt;persistence:managed-hibernate-session name="hibernateSession"
                                auto-create="true"
                  session-factory-jndi-name="java:/hibernateSessionFactory"/&gt;
...</pre>
<p>Hibernate SessionをJbpmContextインスタンスに注入することで、アプリケーションと同じトランザクション境界で処理できるようになります。</p>
<pre>...
public void open() {
  Session hibernateSession = (Session) Component.getInstance("hibernateSession");

  JbpmContext jbpmContext = JbpmConfiguration.getInstance().createJbpmContext();
  jbpmContext.setSession(hibernateSession);

  return jbpmContext;
}
...</pre>
<h2>回避策2. SeamのjBPM関連コンポーネントを置き換える</h2>
<p>SeamのjBPM関連コンポーネントを使う場合は、上記の不具合を回避するよう修正したコンポーネントを、Seam同梱のコンポーネントと置き換えます。</p>
<pre>public class MyManagedJbpmContext extends ManagedJbpmContext {
  @Override
  public void beforeCompletion() {
    if (BusinessProcess.instance().hasActiveProcess()) {
      //JbpmContextのxxxForUpdateメソッドを使わず、明示的にエンティティを保存する。
      instance().save(ProcessInstance.instance());
    }
    super.beforeCompletion();
  }

  @Override
  public void afterCompletion(int status) {
    if (status == Status.STATUS_ROLLEDBACK) {
      instance().getSession().clear();
    }

    super.afterCompletion(status);
  }
}</pre>
<p>ManagedJbpmContextのほかに、JbpmContextのxxxForUpdateメソッドを叩いているコンポーネント（BusinessProcess、PooledTask、ProcessInstance、TaskInstance）をオーバーライドします。</p>
<pre>例) BusinessProcess
public class MyBusinessProcess extends BusinessProcess {
  @Override
  public void createProcess(String processDefinitionName, boolean shouldSignalProcess) {
    createProcess(processDefinitionName, null, shouldSignalProcess);
  }

  @Override
  public void createProcess(String processDefinitionName, String businessKey) {
    createProcess(processDefinitionName, businessKey, true);
  }

  protected void createProcess(String processDefinitionName, String businessKey, boolean shouldSignalProcess) {
    //xxxForUpdateメソッドは使わない。
    ProcessInstance process = ManagedJbpmContext.instance().newProcessInstance(processDefinitionName);
    if (!Strings.isEmpty(businessKey)) process.setKey(businessKey);
    afterCreateProcess(processDefinitionName, process, shouldSignalProcess);
  }

  private void afterCreateProcess(String processDefinitionName, ProcessInstance process, boolean shouldSignalProcess) {
    /*
     * オリジナルのBusinessProcessからコピーする。
     */
    ...
  }
}</pre>
<p>最後に、Seam同梱のコンポーネントを修正したコンポーネントで置き換えます。</p>
<pre>components.xml
 ...
 &lt;component
  class="com.natswell.jbpm.MyManagedJbpmContext"
  name="org.jboss.seam.bpm.jbpmContext" scope="event"/&gt;
 &lt;component class="com.natswell.jbpm.MyBusinessProcess"
  name="org.jboss.seam.bpm.businessProcess" scope="conversation"/&gt;
 ...
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2010/05/26/seam-jbpm-rollback-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss AS起動時のエラー &#8220;java.io.IOException: アクセスが拒否されました。&#8221;</title>
		<link>http://www.natswell.com/techcolumn/2010/05/07/jboss-startup-error-access-is-denied/</link>
		<comments>http://www.natswell.com/techcolumn/2010/05/07/jboss-startup-error-access-is-denied/#comments</comments>
		<pubDate>Fri, 07 May 2010 08:17:32 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[JBoss製品]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=386</guid>
		<description><![CDATA[JBoss ASの起動に失敗する現象を解決した時のメモです。 JBoss Enterprise SOA Platform 5.0.1 (JBoss AS 5.0.0相当) Windows XP JBoss ASの再起動を何度か繰り返していると、起動中に下記のようなエラーが出て正常起動しなくなりました。 2010-05-07 13:15:44,321 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=jboss:service=NamingProviderURLWriter state=Create mode=Manual requiredState=Installed java.io.IOException: アクセスが拒否されました。 at java.io.WinNTFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:883) at org.jboss.naming.NamingProviderURLWriter.start(NamingProviderURLWriter.java:147) 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.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:138) at org.jboss.mx.server.Invocation.invoke(Invocation.java:90) at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:140) [...]]]></description>
			<content:encoded><![CDATA[<p>JBoss ASの起動に失敗する現象を解決した時のメモです。</p>
<ul>
<li>JBoss Enterprise SOA Platform 5.0.1 (JBoss AS 5.0.0相当)</li>
<li>Windows XP</li>
</ul>
<p><span id="more-386"></span></p>
<p>JBoss ASの再起動を何度か繰り返していると、起動中に下記のようなエラーが出て正常起動しなくなりました。</p>
<pre>2010-05-07 13:15:44,321 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error installing to Start: name=jboss:service=NamingProviderURLWriter state=Create mode=Manual requiredState=Installed
java.io.IOException: アクセスが拒否されました。
	at java.io.WinNTFileSystem.createFileExclusively(Native Method)
	at java.io.File.createNewFile(File.java:883)
	at org.jboss.naming.NamingProviderURLWriter.start(NamingProviderURLWriter.java:147)
	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.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
	at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:138)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:90)
	at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:140)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:90)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
	at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
	at $Proxy38.start(Unknown Source)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
	at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
	at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
	at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:297)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:823)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
	at org.jboss.system.ServiceController.start(ServiceController.java:460)
	at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
	at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
	at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1440)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1158)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1179)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1099)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:823)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:782)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
	at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
	at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
	at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:403)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1633)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:935)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1083)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:985)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:775)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:540)
	at org.jboss.system.server.profileservice.repository.AbstractProfileService.registerProfile(AbstractProfileService.java:308)
	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:256)
	at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
	at org.jboss.Main.boot(Main.java:221)
	at org.jboss.Main$1.run(Main.java:556)
	at java.lang.Thread.run(Thread.java:619)</pre>
<p>一度上記のエラーが出ると、その後かならずJBoss ASの起動中にエラーがでるようになります。</p>
<p>調査したところ、<code>org.jboss.naming.NamingProviderURLWriter</code>が生成するファイルを、Windowsのインデックスサービスが掴みっぱなしになっていたのが原因でした。</p>
<p>このインデックスサービスを終了し、<code>NamingProviderURLWriter</code>が生成する<code>$JBOSS_HOME/server/defaultなど/data/jnp-service.url</code>というファイルを削除すると、正常に起動するようになりました。</p>
<p>JBoss ASのソースが見られなければ、解決できなかっただろうなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2010/05/07/jboss-startup-error-access-is-denied/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernateのエラー &#8220;An empty name cannot be passed to rebind&#8221;</title>
		<link>http://www.natswell.com/techcolumn/2010/02/02/an-empty-name-cannot-be-passed-to-rebind/</link>
		<comments>http://www.natswell.com/techcolumn/2010/02/02/an-empty-name-cannot-be-passed-to-rebind/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 02:29:30 +0000</pubDate>
		<dc:creator>平田</dc:creator>
				<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[平田メモ]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=376</guid>
		<description><![CDATA[次の組み合わせで出た表題のエラーを解決したときのメモです。 JBoss Application Server 5.0.1 GA (JDK6 distribution) Seam 2.1.2 jBPM 3.2.2 Hibernate 3.3.0 GA 上記の組み合わせのアプリケーションを起動すると、下記のエラーが発生しました。 11:08:06,356 ERROR [SessionFactoryObjectFactory] Invalid JNDI name: javax.naming.InvalidNameException: An empty name cannot be passed to rebind at org.jnp.server.NamingServer.rebind(NamingServer.java:237) at org.jnp.interfaces.NamingContext.rebind(NamingContext.java:571) at javax.naming.InitialContext.rebind(InitialContext.java:412) at org.hibernate.util.NamingHelper.bind(NamingHelper.java:97) at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113) at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:338) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327) at org.jbpm.persistence.db.DbPersistenceServiceFactory.getSessionFactory(DbPersistenceServiceFactory.java:91) at org.jbpm.persistence.db.DbPersistenceService.getSessionFactory(DbPersistenceService.java:95) at org.jbpm.persistence.db.DbPersistenceService.getSession(DbPersistenceService.java:99) at org.jbpm.persistence.db.DbPersistenceService.getGraphSession(DbPersistenceService.java:341) at org.jbpm.JbpmContext.getGraphSession(JbpmContext.java:571) [...]]]></description>
			<content:encoded><![CDATA[<p>次の組み合わせで出た表題のエラーを解決したときのメモです。</p>
<ul>
<li>JBoss Application Server 5.0.1 GA (JDK6 distribution)</li>
<li>Seam 2.1.2</li>
<li>jBPM 3.2.2</li>
<li>Hibernate 3.3.0 GA</li>
</ul>
<p><span id="more-376"></span></p>
<p>上記の組み合わせのアプリケーションを起動すると、下記のエラーが発生しました。</p>
<pre>
11:08:06,356 ERROR [SessionFactoryObjectFactory] Invalid JNDI name:
javax.naming.InvalidNameException: An empty name cannot be passed to rebind
	at org.jnp.server.NamingServer.rebind(NamingServer.java:237)
	at org.jnp.interfaces.NamingContext.rebind(NamingContext.java:571)
	at javax.naming.InitialContext.rebind(InitialContext.java:412)
	at org.hibernate.util.NamingHelper.bind(NamingHelper.java:97)
	at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:338)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
	at org.jbpm.persistence.db.DbPersistenceServiceFactory.getSessionFactory(DbPersistenceServiceFactory.java:91)
	at org.jbpm.persistence.db.DbPersistenceService.getSessionFactory(DbPersistenceService.java:95)
	at org.jbpm.persistence.db.DbPersistenceService.getSession(DbPersistenceService.java:99)
	at org.jbpm.persistence.db.DbPersistenceService.getGraphSession(DbPersistenceService.java:341)
	at org.jbpm.JbpmContext.getGraphSession(JbpmContext.java:571)
	at org.jbpm.JbpmContext.deployProcessDefinition(JbpmContext.java:173)
	at org.jboss.seam.bpm.Jbpm.deployProcess(Jbpm.java:316)
	at org.jboss.seam.bpm.Jbpm.installProcessDefinitions(Jbpm.java:294)
	at org.jboss.seam.bpm.Jbpm.startup(Jbpm.java:80)
	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.jboss.seam.util.Reflections.invoke(Reflections.java:22)
	at org.jboss.seam.util.Reflections.invokeAndWrap(Reflections.java:144)
	at org.jboss.seam.Component.callComponentMethod(Component.java:2249)
	at org.jboss.seam.Component.callCreateMethod(Component.java:2172)
	at org.jboss.seam.Component.newInstance(Component.java:2132)
	at org.jboss.seam.contexts.Contexts.startup(Contexts.java:304)
	at org.jboss.seam.contexts.Contexts.startup(Contexts.java:278)
	at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:113)
	at org.jboss.seam.init.Initialization.init(Initialization.java:740)
	at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:312)
	at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:144)
	at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
	at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
	at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
	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.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
	at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
	at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
	at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
	at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
	at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
	at $Proxy36.start(Unknown Source)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
	at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
	at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
	at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
	at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
	at org.jboss.system.ServiceController.start(ServiceController.java:460)
	at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
	at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
	at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
	at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:698)
	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
	at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
	at org.jboss.Main.boot(Main.java:209)
	at org.jboss.Main$1.run(Main.java:547)
	at java.lang.Thread.run(Thread.java:619)
</pre>
<p><code>hibernate.cfg.xml</code>を修正すると、エラーが出なくなりました。</p>
<pre>
&lt;hibernate-configuration&gt;
 &lt;session-factory name=""&gt; &larr; NG
...
----
&lt;hibernate-configuration&gt;
 &lt;session-factory&gt; &larr; OK
...
</pre>
<p>いくつか謎が。</p>
<ol>
<li>JBoss AS 5.0.1 GAの無印版（JDK6でない方）だと発生しない。</li>
<li>そもそも、いつ<code>name=""</code>なる記述が紛れ込んだのか分からない。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2010/02/02/an-empty-name-cannot-be-passed-to-rebind/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【解決】Relay――アップロードができない件</title>
		<link>http://www.natswell.com/techcolumn/2009/11/11/%e3%80%90%e8%a7%a3%e6%b1%ba%e3%80%91relay%e2%80%95%e2%80%95%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84%e4%bb%b6/</link>
		<comments>http://www.natswell.com/techcolumn/2009/11/11/%e3%80%90%e8%a7%a3%e6%b1%ba%e3%80%91relay%e2%80%95%e2%80%95%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84%e4%bb%b6/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 00:46:28 +0000</pubDate>
		<dc:creator>渡邊</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Relay]]></category>
		<category><![CDATA[インストール]]></category>
		<category><![CDATA[ファイル管理]]></category>
		<category><![CDATA[渡邊]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=349</guid>
		<description><![CDATA[【Relayとは】 ファイル管理機能を提供するWebアプリケーションです。 管理対象のファイルはサーバ側で管理されます。ブラウザを使い、複数の利用者でそれらのファイルを共有できます。認証機能があり、各利用者の権限設定も可能です。 詳細はRelayのサイトを参照して下さい。 http://www.ecosmear.com/relay/ 【対象読者】 次の読者を想定しています。 1.これからRelayをインストールするつもりである。 2.Relayをインストールしてみたが、アップロード機能だけ動作しない。 当コンテンツは特に2番でお困りの方に向けて執筆しています。レンタルサーバに導入する為、Webサーバの設定を変更できない場合にお役に立てると思います。 【インストール手順概要】 まだインストールが済んでいない方は、「ajax Relay インストール」をキーワードにインストール手順を調べて下さいm(__)m。ここでは次の3点を想定し、概要だけ記します。 ・Relayのバージョン：　Relay v0.1 Beta（relayb01-071706.zip） ・インストール先（サーバーのディレクトリ）：　/var/bar/ ・Relayにアクセスする為のURL：　http://hoge/relay [手順] 1. インストール先の環境に必要なプログラム群がインストールされていることを確認します。（http://www.ecosmear.com/relay/ 参照） 2. Relayの圧縮ファイルをダウンロードします。 3. Relayの圧縮ファイルを /var/bar/ に転送し、解凍します。 4. http://hoge/relay にアクセスします。 5. 画面の指示に従って進んでいけばインストール完了です。 サーバの環境によっては、http://hoge/relay にアクセスするとブラウザにエラーメッセージ（サーバーのエラー）が表示されます。 /var/bar/relay/.htaccess を消してから、http://hoge/relay にアクセスします。それでも無理な場合は他を当たって下さい m(__)m。 【アップロード機能を使えるようにする】 サーバの環境によっては、上記のインストール手順を完了させただけでは、アップロード機能だけ動作しない場合があります。 RelayはPHPで実装されていますが、アップロード機能だけはPerlで実装されています。 具体的には、/var/bar/relay/upload.pl がアップロード機能のプログラムです。 アップロード機能だけ動作しない場合は、下記をお読み下さい。 A. サーバーがサポートしているPerlの拡張子を確認して下さい。 .pl をサポートしている場合、ここは読み飛ばしてB.へ進んで下さい。例えば、.pl ではなく、.cgi にしなければならない場合、次の修正をして下さい。 1. upload.pl のファイル名を変更する。 [...]]]></description>
			<content:encoded><![CDATA[<p><br/></p>
<h2>【Relayとは】</h2>
<p>ファイル管理機能を提供するWebアプリケーションです。<br />
管理対象のファイルはサーバ側で管理されます。ブラウザを使い、複数の利用者でそれらのファイルを共有できます。認証機能があり、各利用者の権限設定も可能です。<br />
<span id="more-349"></span><br />
詳細はRelayのサイトを参照して下さい。<br />
<a href="http://www.ecosmear.com/relay/">http://www.ecosmear.com/relay/</a><br />
<br/></p>
<h2>【対象読者】</h2>
<p>次の読者を想定しています。</p>
<p>1.これからRelayをインストールするつもりである。<br />
2.Relayをインストールしてみたが、アップロード機能だけ動作しない。</p>
<p>当コンテンツは特に2番でお困りの方に向けて執筆しています。レンタルサーバに導入する為、Webサーバの設定を変更できない場合にお役に立てると思います。<br />
<br/></p>
<h2>【インストール手順概要】</h2>
<p>まだインストールが済んでいない方は、「ajax Relay インストール」をキーワードにインストール手順を調べて下さいm(__)m。ここでは次の3点を想定し、概要だけ記します。<br />
・Relayのバージョン：　Relay v0.1 Beta（relayb01-071706.zip）<br />
・インストール先（サーバーのディレクトリ）：　/var/bar/<br />
・Relayにアクセスする為のURL：　http://hoge/relay</p>
<p>[手順]<br />
 1. インストール先の環境に必要なプログラム群がインストールされていることを確認します。（<a href="http://www.ecosmear.com/relay/">http://www.ecosmear.com/relay/</a> 参照）<br />
 2. Relayの圧縮ファイルをダウンロードします。<br />
 3. Relayの圧縮ファイルを /var/bar/ に転送し、解凍します。<br />
 4. http://hoge/relay にアクセスします。<br />
 5. 画面の指示に従って進んでいけばインストール完了です。</p>
<p>サーバの環境によっては、http://hoge/relay にアクセスするとブラウザにエラーメッセージ（サーバーのエラー）が表示されます。<br />
/var/bar/relay/.htaccess を消してから、http://hoge/relay にアクセスします。それでも無理な場合は他を当たって下さい m(__)m。<br />
<br/></p>
<h2>【アップロード機能を使えるようにする】</h2>
<p>サーバの環境によっては、上記のインストール手順を完了させただけでは、アップロード機能だけ動作しない場合があります。</p>
<p>RelayはPHPで実装されていますが、アップロード機能だけはPerlで実装されています。<br />
具体的には、/var/bar/relay/upload.pl がアップロード機能のプログラムです。<br />
アップロード機能だけ動作しない場合は、下記をお読み下さい。<br />
<br/></p>
<h3>A. サーバーがサポートしているPerlの拡張子を確認して下さい。</h3>
<p>.pl をサポートしている場合、ここは読み飛ばしてB.へ進んで下さい。例えば、.pl ではなく、.cgi にしなければならない場合、次の修正をして下さい。</p>
<p>1. upload.pl のファイル名を変更する。<br />
修正前：　/var/bar/relay/upload.pl<br />
修正後：　/var/bar/relay/upload.cgi</p>
<p>2. upload.cgi の5行目を修正する。<br />
修正前：　$path =~s/upload\.pl/conf.uploader/;<br />
修正前：　$path =~s/upload\.cgi/conf.uploader/;</p>
<p>3. /var/bar/relay/js/relay.js の12行目を修正する。<br />
修正前：　UPLOADURL: &#8216;upload.pl&#8217;,<br />
修正後：　UPLOADURL: &#8216;upload.cgi&#8217;,</p>
<p>4. 検証<br />
http://hoge/relay/upload.cgi?test にアクセスします。<br />
ブラウザに ok と表示されれば成功です。これでアップロード機能が使えるようになっていると思いますので、試してみて下さい。何も表示されない場合、次のB.をお読み下さい。<br />
<br/></p>
<h3>B. Perlのプログラムを配置する場所に制約がないか確認して下さい。</h3>
<p>例えば、/var/bar/cgi/ 以下に配置しなければならない場合、次の修正をして下さい。<br />
（下記の説明は、A.の修正を実施した場合を想定しています。その必要がなかった場合は、upload.cgi を upload.plと読み替えて下さい）</p>
<p>1. upload.cgi を移動する。<br />
移動前：　/var/bar/relay/upload.cgi<br />
移動後：　/var/bar/cgi/upload.cgi</p>
<p>2. upload.cgi の5行目を修正する。<br />
修正前：　$path =~s/upload\.cgi/conf.uploader/;<br />
修正後：　$path =~s/cgi-bin\/upload\.cgi/relay\/conf.uploader/;</p>
<p>3./var/bar/relay/js/relay.js の12行目を修正する。<br />
修正前：　UPLOADURL: &#8216;upload.cgi&#8217;,<br />
修正後：　UPLOADURL: &#8216;http://hoge/cgi/upload.cgi&#8217;,</p>
<p>4. 検証<br />
http://hoge/cgi-bin/upload.cgi?test にアクセスします。<br />
ブラウザに ok と表示されれば成功です。これでアップロード機能が使えるようになっていると思いますので、試してみて下さい。<br />
以上の手順で解決できなかった場合は、お役に立てずにすみません。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2009/11/11/%e3%80%90%e8%a7%a3%e6%b1%ba%e3%80%91relay%e2%80%95%e2%80%95%e3%82%a2%e3%83%83%e3%83%97%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8c%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache FOPで、日本語をボールド出力する</title>
		<link>http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/</link>
		<comments>http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 08:23:45 +0000</pubDate>
		<dc:creator>松本</dc:creator>
				<category><![CDATA[FOP]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=285</guid>
		<description><![CDATA[こんにちは、松本です。 FOPで、MS明朝などの日本語フォントを使用した場合、font-weight に bold を指定しても太字で出力できません。 そこで、文字列を重ねて出力することで、太字を実現してみました。 フォントに Arial を指定した場合、 &#60;fo:block font-family=&#8221;Arial&#8221;&#62;   ABC123 &#60;/fo:block&#62; &#60;fo:block font-family=&#8221;Arial&#8221; font-weight=&#8221;bold&#8221;&#62;   ABC123 &#60;/fo:block&#62; 太字は正常に出力されます。 しかし、フォントにMS明朝を指定した場合、 &#60;fo:block font-family=&#8221;Mincho&#8221;&#62;   あいうABC123 &#60;/fo:block&#62; &#60;fo:block font-family=&#8221;Mincho&#8221; font-weight=&#8221;bold&#8221;&#62;   あいうABC123 &#60;/fo:block&#62; 太字の指定は無視されて出力します。 そこで、次のような template を作成します。 これは、count に指定した回数だけX位置を 0.1 ポイント調整しながら同じ文字列を出力するテンプレートです。 &#60;xsl:template name=&#8221;bold-japanese&#8221;&#62;   &#60;xsl:param name=&#8221;value&#8221;/&#62;   &#60;xsl:param name=&#8221;count&#8221;/&#62;   &#60;xsl:value-of select=&#8221;$value&#8221;/&#62;   &#60;fo:block-container absolute-position=&#8221;absolute&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、松本です。</p>
<p>FOPで、MS明朝などの日本語フォントを使用した場合、font-weight に bold を指定しても太字で出力できません。</p>
<p>そこで、文字列を重ねて出力することで、太字を実現してみました。</p>
<p><span id="more-285"></span></p>
<p>フォントに Arial を指定した場合、</p>
<blockquote><p>&lt;fo:block font-family=&#8221;Arial&#8221;&gt;<br />
  ABC123<br />
&lt;/fo:block&gt;<br />
&lt;fo:block font-family=&#8221;Arial&#8221; font-weight=&#8221;bold&#8221;&gt;<br />
  ABC123<br />
&lt;/fo:block&gt;</p></blockquote>
<p>太字は正常に出力されます。</p>
<blockquote><p><a rel="attachment wp-att-289" href="http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/20091001164618-00131/"><img class="alignnone size-full wp-image-289" title="20091001164618-00131" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/10/20091001164618-00131.png" alt="20091001164618-00131" width="101" height="54" /></a></p></blockquote>
<p>しかし、フォントにMS明朝を指定した場合、</p>
<blockquote><p>&lt;fo:block font-family=&#8221;Mincho&#8221;&gt;<br />
  あいうABC123<br />
&lt;/fo:block&gt;<br />
&lt;fo:block font-family=&#8221;Mincho&#8221; font-weight=&#8221;bold&#8221;&gt;<br />
  あいうABC123<br />
&lt;/fo:block&gt;</p></blockquote>
<p>太字の指定は無視されて出力します。</p>
<blockquote><p><a rel="attachment wp-att-294" href="http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/20091001165156-00132/"><img class="alignnone size-full wp-image-294" title="20091001165156-00132" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/10/20091001165156-00132.png" alt="20091001165156-00132" width="166" height="60" /></a></p></blockquote>
<p>そこで、次のような template を作成します。</p>
<p>これは、count に指定した回数だけX位置を 0.1 ポイント調整しながら同じ文字列を出力するテンプレートです。</p>
<blockquote><p>&lt;xsl:template name=&#8221;bold-japanese&#8221;&gt;<br />
  &lt;xsl:param name=&#8221;value&#8221;/&gt;<br />
  &lt;xsl:param name=&#8221;count&#8221;/&gt;<br />
  &lt;xsl:value-of select=&#8221;$value&#8221;/&gt;<br />
  &lt;fo:block-container absolute-position=&#8221;absolute&#8221;<br />
    left=&#8221;0.1&#8243; right=&#8221;0.1&#8243;&gt;<br />
    &lt;fo:block start-indent=&#8221;0&#8243;&gt;<br />
      &lt;xsl:if test=&#8221;number($count) &gt; 1&#8243;&gt;<br />
        &lt;xsl:call-template name=&#8221;bold-japanese&#8221;&gt;<br />
          &lt;xsl:with-param name=&#8221;value&#8221; select=&#8221;$value&#8221;/&gt;<br />
          &lt;xsl:with-param name=&#8221;count&#8221; select=&#8221;number($count) &#8211; 1&#8243;/&gt;<br />
        &lt;/xsl:call-template&gt;<br />
      &lt;/xsl:if&gt;<br />
    &lt;/fo:block&gt;<br />
  &lt;/fo:block-container&gt;<br />
&lt;/xsl:template&gt;</p></blockquote>
<p>block-container の部分が、位置を調整して重ね書きするロジックです。</p>
<p>このテンプレートを以下のように呼び出すと、</p>
<blockquote><p>&lt;fo:block font-family=&#8221;Mincho&#8221;&gt;<br />
  あいうABC123<br />
&lt;/fo:block&gt;<br />
&lt;fo:block font-family=&#8221;Mincho&#8221;&gt;<br />
  &lt;xsl:call-template name=&#8221;bold-japanese&#8221;&gt;<br />
    &lt;xsl:with-param name=&#8221;value&#8221;&gt;<br />
      あいうABC123<br />
    &lt;/xsl:with-param&gt;<br />
    &lt;xsl:with-param name=&#8221;count&#8221; select=&#8221;5&#8243;/&gt;<br />
  &lt;/xsl:call-template&gt;<br />
&lt;/fo:block&gt;</p></blockquote>
<p> 太字のように出力します。</p>
<blockquote><p><a rel="attachment wp-att-305" href="http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/20091001171457-00133/"><img class="alignnone size-full wp-image-305" title="20091001171457-00133" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/10/20091001171457-00133.png" alt="20091001171457-00133" width="168" height="60" /></a></p></blockquote>
<p>ここでは、「日本語が使える」前提で書いています。日本語フォントを使用する方法は、他のページを探してください、たくさんヒットすると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2009/10/01/apache-fop%e3%81%a7%e3%80%81%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%92%e3%83%9c%e3%83%bc%e3%83%ab%e3%83%89%e5%87%ba%e5%8a%9b%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache FOPで、文字列を均等割り付けする</title>
		<link>http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/</link>
		<comments>http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 08:39:17 +0000</pubDate>
		<dc:creator>松本</dc:creator>
				<category><![CDATA[FOP]]></category>

		<guid isPermaLink="false">http://www.natswell.com/techcolumn/?p=178</guid>
		<description><![CDATA[松本です。 Excelのようにセル内の文字列を均等割り付けして表示して欲しいと、リクエストがありました。FOPのリファレンスを探してみましたが、該当するようなプロパティは見つかりません。 そこで、別の機能を使用して、この機能を実現する事にしました。 実現方法として、以下の２パターンを考えてみました。 text-align-last を使用する。 word-spacing を使用する。 どちらも、文字間に半角スペースを入れて、各文字を単語として認識させ、単語の間隔を調整することで、均等割り付けを実現します。  以下のような記述の場合、 &#60;fo:table-cell&#62;   &#60;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&#62;     件数   &#60;/fo:block&#62;   &#60;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&#62;     最大値   &#60;/fo:block&#62;   &#60;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&#62;     最大件数   &#60;/fo:block&#62;   &#60;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&#62;     超最大件数   &#60;/fo:block&#62; &#60;/fo:table-cell&#62; このような出力になります。 まずは、text-align-last を使用してみましょう。 以下のように記述を変更します。文字間の半角スペースを忘れずに入れてください。  &#60;fo:table-cell&#62;   &#60;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;             text-align-last=&#8221;justify&#8221;&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>松本です。</p>
<p>Excelのようにセル内の文字列を均等割り付けして表示して欲しいと、リクエストがありました。FOPのリファレンスを探してみましたが、該当するようなプロパティは見つかりません。</p>
<p>そこで、別の機能を使用して、この機能を実現する事にしました。</p>
<p><span id="more-178"></span></p>
<p>実現方法として、以下の２パターンを考えてみました。</p>
<ol>
<li>text-align-last を使用する。</li>
<li>word-spacing を使用する。</li>
</ol>
<p>どちらも、文字間に半角スペースを入れて、各文字を単語として認識させ、単語の間隔を調整することで、均等割り付けを実現します。</p>
<p> 以下のような記述の場合、</p>
<blockquote><p>&lt;fo:table-cell&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&gt;<br />
    件数<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&gt;<br />
    最大値<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&gt;<br />
    最大件数<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;&gt;<br />
    超最大件数<br />
  &lt;/fo:block&gt;<br />
&lt;/fo:table-cell&gt;</p></blockquote>
<p>このような出力になります。</p>
<blockquote><p><a rel="attachment wp-att-232" href="http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/20090925164737-00128/"><img class="alignnone size-full wp-image-232" title="20090925164737-00128" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/09/20090925164737-00128.png" alt="20090925164737-00128" width="178" height="95" /></a></p></blockquote>
<p>まずは、text-align-last を使用してみましょう。</p>
<p>以下のように記述を変更します。文字間の半角スペースを忘れずに入れてください。</p>
<blockquote><p> &lt;fo:table-cell&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;<br />
            text-align-last=&#8221;justify&#8221;&gt;<br />
    件 数<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;<br />
            text-align-last=&#8221;justify&#8221;&gt;<br />
    最 大 値<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;<br />
            text-align-last=&#8221;justify&#8221;&gt;<br />
    最 大 件 数<br />
  &lt;/fo:block&gt;<br />
  &lt;fo:block start-indent=&#8221;8mm&#8221; end-indent=&#8221;8mm&#8221;<br />
            text-align-last=&#8221;justify&#8221;&gt;<br />
    超 最 大 件 数<br />
  &lt;/fo:block&gt;<br />
&lt;/fo:table-cell&gt;</p></blockquote>
<p>このような出力になります。</p>
<blockquote><p> <a rel="attachment wp-att-249" href="http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/20090925170827-00129/"><img class="alignnone size-full wp-image-249" title="20090925170827-00129" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/09/20090925170827-00129.png" alt="20090925170827-00129" width="178" height="114" /></a></p></blockquote>
<p>「超最大件数」を見て判るように、半角スペースの間隔未満には対応できません。</p>
<p>次に、word-spacing を使用してみましょう。</p>
<p>フォントサイズを使用して、間隔を計算します。</p>
<blockquote><p>from-parent(&#8216;font-size&#8217;)×（（最大文字数－表示文字数）÷（表示文字数－1）－0.5）</p></blockquote>
<p>以下のように記述を変更します。この場合も、文字間の半角スペースを忘れずに入れてください。</p>
<blockquote><p>&lt;fo:block start-indent=&#8221;8mm&#8221;<br />
          word-spacing=&#8221;from-parent(&#8216;font-size&#8217;) * (4 div 1 &#8211; 0.5)&#8221;&gt;<br />
  件 数<br />
&lt;/fo:block&gt;<br />
&lt;fo:block start-indent=&#8221;8mm&#8221;<br />
          word-spacing=&#8221;from-parent(&#8216;font-size&#8217;) * (3 div 2 &#8211; 0.5)&#8221;&gt;<br />
  最 大 値<br />
&lt;/fo:block&gt;<br />
&lt;fo:block start-indent=&#8221;8mm&#8221;<br />
          word-spacing=&#8221;from-parent(&#8216;font-size&#8217;) * (2 div 3 &#8211; 0.5)&#8221;&gt;<br />
  最 大 件 数<br />
&lt;/fo:block&gt;<br />
&lt;fo:block start-indent=&#8221;8mm&#8221;<br />
          word-spacing=&#8221;from-parent(&#8216;font-size&#8217;) * (1 div 4 &#8211; 0.5)&#8221;&gt;<br />
  超 最 大 件 数<br />
&lt;/fo:block&gt;</p></blockquote>
<p>このような出力になります。</p>
<blockquote><p><a rel="attachment wp-att-262" href="http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/20090925172516-00130/"><img class="alignnone size-full wp-image-262" title="20090925172516-00130" src="http://www.natswell.com/techcolumn/wordpress/wp-content/uploads/2009/09/20090925172516-00130.png" alt="20090925172516-00130" width="178" height="95" /></a></p></blockquote>
<p>この方法では、マイナスの間隔まで対応できますが、計算式が面倒くさいですね。</p>
<p>今のところ２番目の方法を使っていますが、最適なプロパティが埋もれているかもしれません。ご存知の方は、ご一報を</p>
]]></content:encoded>
			<wfw:commentRss>http://www.natswell.com/techcolumn/2009/09/25/apache-fop%e3%81%a7%e3%80%81%e6%96%87%e5%ad%97%e5%88%97%e3%82%92%e5%9d%87%e7%ad%89%e5%89%b2%e3%82%8a%e4%bb%98%e3%81%91%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

