このエントリーでは、sMash V1.1.1.1での開発環境の構築手順をご紹介します。eclipseもv3.5がリリースされましたので、そちらを利用した方法もご紹介します。
●設定手順
eclipseは導入済みという前提で紹介しますので、eclipseが必要な方はeclipseをダウンロードしてください。バージョンは3.2以上のものを使用して下さい。また、PHPの開発環境の構築するにはeclipseのPHP用のプラグインであるPDTが必要です。PDT導入済みのeclipseを手に入れるには、PDT all in one packageをダウンロードする方法が便利です。
V1.0の環境からのマイグレーションの場合は、以前のバージョンのプラグインをアンインストールします。
・Eclipse 3.4の場合 : Help > Software Updates > Installed Software
・Eclipse 3.2の場合 : Help > Software Updates > Manage Configuration
Project Zero公式サイトから、sMash V1.1.1.1をダウンロードします。
zipファイルを解凍し、解凍してできたzeroフォルダを任意の場所に配置します。
zeroフォルダに移動し、zeroコマンドを実行します。例えば、Windowsの場合はコマンドプロンプトを立ち上げ、以下のコマンドを実行します(<zero_root>はzeroディレクトリを配置した先のzeroディレクトリ内を示す)。
cd <zero_root>
./zero
eclipseを起動し、アップデートサイトの追加ダイアログを表示させます。
・Eclipse 3.5の場合 : Help > Software Updates > “Add site”
・Eclipse 3.4の場合 : Help > Software Updates > Installed Software > “Search for new features to install” > Next > [...]
先日の記事では、Apache POIを利用して、Excelのデータを取得する方法を書きました。今回は、WordとPowerPointのテキストを取得してみましょう。この機能を利用すれば、WordやPowerPointファイルの中身までキーワード検索したり、特定の禁止用語などが含まれていないかチェックすることが可能です。
まず、Wordのテキストを取得するコードは、このようになります。
java.io.FileInputStream fs = new java.io.FileInputStream(file_path);
WordExtractor we = new WordExtractor(fs);
String text = we.getText();
file_pathには、ファイルのパスを入力してください。これで、変数textに、Wordに書かれたテキストが全て格納されます。
次に、PowerPointのテキストを取得するコードです。
java.io.FileInputStream fs = new java.io.FileInputStream(file_path);
HSLFSlideShow hsss = new HSLFSlideShow(fs);
SlideShow ss= new SlideShow(hsss);
Slide[] slides = ss.getSlides();
String text = “”;
for (int i = 0; i < slides.length; i++) {
TextRun[] textruns = slides[i].getTextRuns();
for (int j = 0; j < textruns.length; j++) {
text += textruns[j].getRawText();
}
}
これで、全てのテキストを変数textに格納することができます。また、Slideクラスの配列の数字が、ページ番号に対応しますので、何ページにその単語があるのかを調べることも簡単に行えます。
こちらも英語Blogで既に告知されていたのですが、eclipseのPHP用プラグインであるPDT2.0を、sMash eclipse plug-inがサポートしました。既にPDT2.0を利用されている場合は、plug-inのアップデートを行ってください。
plug-inのアップデートを行うには、eclipseのメニューから以下の手順を行います。
Help > Software Updates > Available Software タブ > zero.eclipse.phpを展開 > WebSphere sMash for PDT 2.0.x にチェックを入れる > 右上のInstallボタンをクリック
後は画面の指示に従って、Install作業を行います。インストールするフィーチャーを選択する際に、PDT 1.0.xを選択しないように注意して下さい(for PDT 1.0.xと2.0.xを両方インストールしてしまうと、プロジェクト作成時に”sMash PHP application”が2つ表示されてしまいます)。インストールしてしまった場合は、Installed SoftwareからWebSphere sMash PDT Featureを選択し、Uninstallボタンをクリックしてください。
ちなみに、eclipseでの開発環境を0から整える方法は、こちらで紹介しています。PDT all-in-one package自体は、こちらからダウンロードしてください(DebuggerはsMash plug-inに含まれているため、必要ありません)。
sMashのログ・メッセージなどは、システム・ロケールを参照しているため、特にロケール設定を行う箇所はありません。そのため、日本語環境では、デフォルトで日本語でログ・メッセージが表示されます。
この設定を変えるためには、JVMのオプション値 -Duser.language=(ロケール名) を与えて、明示的にロケールを設定する必要があります。例えば、英語でログ・メッセージを表示させたい場合は、-Duser.language=enを与える必要があります。
CLIのロケール設定を変えるには、zero.bat (zero.sh)をエディターで開き、set ZERO_OPTS=-Duser.language=enという行を追加します。eclipseの場合は、起動オプションに上記のオプションを追加します(Run as > Run configurations > (アプリケーション名) > Argumentsタブ > VM arguments > -Duser.language=enを追記)。
画像共有サイトなどを構築する場合、ファイルアップロード処理が必要になります。
sMashはファイルアップロード処理も容易に実装することができるのですが、ドキュメントにあまり詳しい記述がないようなので、簡単にまとめておきます。
Forumを検索すると、以下のスレッドがヒットします。
https://www.projectzero.org/forum/viewtopic.php?f=4&t=984&p=4125
どうやら、普通にmultipart/form-dataでPOSTすれば、勝手にmultipartがdecodeされ、ファイル実体への参照はグローバルコンテキスト(/request/files)に格納されるようです。
HTMLの方はこんな感じ。
[public/testUpload.gt]
<html>
<head>
<style type=”text/css”>
@import “<%= getRelativeUri(”/dijit/themes/tundra/tundra.css”) %>”;
</style>
<script type=”text/javascript”
src=”<%= getRelativeUri(”/dojo/dojo.js”) %>”
djConfig=”parseOnLoad: true”></script>
<script type=”text/javascript”>
dojo.require(”dijit.form.Form”);
dojo.require(”dijit.form.TextBox”);
dojo.require(”dijit.form.Button”);
</script>
</head>
<body class=”tundra”>
<form dojoType=”dijit.form.Form” id=”myForm” name=”myform1″
encType=”multipart/form-data” action=”testUpload.groovy” method=”POST” onSubmit=””>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<input dojoType=”dijit.form.TextBox” name=”file1″ type=”file”><br/>
<button dojoType=”dijit.form.Button” type=”submit”>送信</button>
</form>
</body>
</html>
サーバー側のコードはこんな感じです。
[public/testUpload.groovy]
def onPOST() {
def files = request.files
def filelist = files['file1']
logger.INFO{ “Uploaded Files: ” + filelist.size().toString() }
logger.INFO{ “Information: ${filelist.toString()}” }
filelist.each{ file ->
def src = new File(file['path'])
new File(”${config.root[]}/tmp/${file['filename']}”).withOutputStream{ out ->
src.eachByte{ out.write(it) [...]
DB2にはpureXMLという機能があります。
この機能を利用すると、XML(もしくはXMLのフラグメント)をテーブルの1カラムに格納することができるため、部分的に非定型なデータを効率よく扱うことができます。また、XML列に対してはXPathやXQueryによる検索も可能なため、XMLの良さとRDBの良さを組み合わせて利用することができるのも良い点のひとつです。
ただ、sMashのData Access API(zero.data)からpureXMLを利用する場合、残念ながら標準で用意されているResultHandlerではXML列を素直に取りだすことができません。そこで、こちらを参考に、XML列をStringとして取り出すCustom Handlerを作成してみました。
package handler;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import zero.data.Manager;
import com.ibm.pdq.runtime.handlers.RowHandler;
import com.ibm.db2.jcc.DB2Xml;
public class XmlRowHandler implements RowHandler<Map<String, Object>> {
public Map<String, Object> handle(ResultSet resultSet, Map<String, Object> obj)
throws SQLException {
if (obj == null) {
obj = new HashMap<String, Object>();
}
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
int numColumns = resultSetMetaData.getColumnCount();
for (int i=1; i<=numColumns; i++) {
Object column = resultSet.getObject(i);
if(column instanceof DB2Xml){
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(),
((DB2Xml)column).getString() );
} else {
obj.put(resultSetMetaData.getColumnName(i).toLowerCase(), [...]
Project Zeroの開発ロードマップ、実はこちらで公開されていることはご存じでしたでしょうか?
http://www.projectzero.org/wiki/Development/DevRoadmap
Le Mans Sprint S2では、”Story”という単位でアジャイル開発が行われているようです。
Storyの管理にはJazz(Rational Team Concert)が使われているようですね。(Jazzは、Project Zeroと同じく、オープンな開発体制で商用ウェアを開発するという試みです。興味のある方はこちらをご参照ください。)
Security on sMash第4回連載ではACF(Active Content Filtering)を扱います。
ACFはXSS(クロス・サイト・スクリプティング)やCSRF(クロス・サイト・リクエスト・フォージェリ)などのWebアプリケーションへの脅威に対する防護機能であり、設定やAPIにより信頼できないユーザーのリクエストなどにJavaScriptやActiveXコードなどの動的コンテンツが含まれていた場合にこれを無効化することができます。
この連載では2回にわたってsMash V1.0でのセキュリティ設定を紹介してきました。
第三回記事では12月にリリースとなったsMash V1.1での変更点を中心にご紹介します。
WebSphere sMashの主なターゲットは次世代のダイナミックWebアプリケーションであり、マッシュアップ/Wiki/Blogといった、ユーザーが提供するコンテンツを活用する対話型Webアプリケーションにフォーカスしています。
認証に際して、従来はシステムのそれぞれが、ユーザー・レジストリーの提供からユーザーID の保管までを含め、独自の認証システムを内部で維持管理していました。しかし、こういった利用方法をサポートするために、sMashはOpenIDコンシューマーライブラリを提供しており、ユーザーは外部のOpenIDプロバイダーで認証を行うことができます。
OpenIDプロバイダーは、ユーザーID の登録サービスおよび OpenID 認証サービスを提供します。一方でコンシューマーとは、ユーザーを認証する必要がある Webアプリケーションです。ユーザーは認証に際していつものようにユーザー名とパスワードを使うのではなく、任意のOpenID のID(通常はURL)を使ってサイトにアクセスします。
OpenID ではユーザーが保護したい情報 (E メール・アドレスなど) を自分が信頼するOpenIDプロバイダー以外に公開することなく、認証を行なうことができるため、ユーザー中心の認証手法として説明されます。また、OpenIDを利用することで開発者はユーザープロファイルの管理作業を信頼できるサードパーティに委託することができ、アプリケーション開発に専念することができます。
OpenID自体やOpenIDプロバイダーのリストについてはこちらやこちらのサイトなどをご参照ください。
それではWebSphere sMashでOpenIDを利用する方法を見ていきましょう。
