sMashでは、標準で実装されている各種zeroコマンドの他に、カスタムzeroコマンドをGroovyやPHP、Javaで実装することが可能です。
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.cli.tasks/ExtendingCli.html
カスタムzeroコマンドを利用するには、大きく分けて2つの手順が必要です。
1. カスタムzeroコマンドを実装するsMashアプリの作成・公開
2. sMash本体への依存性追加・解決
●1. カスタムzeroコマンドを実装するsMashアプリの作成・公開
まず、アプリケーションを作成します。ここでは、MyCommandsという名前とします。この名前はコマンド名とは無関係です(リポジトリー内のパッケージ名となります)。最終的にsMashのリポジトリーに取り込まれるため、作成する場所はどこでも構いません。
zero create MyCommands
次に、MyCommandsアプリケーションの/config/zero.configを編集します。ここには、コマンド名と、そのコマンドを処理するイベント・ハンドラーを記述します。例えば、”zero mytask”コマンドを作成する場合は、以下のように記述します。
# MyTask
/config/handlers += [{
"events": "cliTask",
"handler" : "cliTask.groovy",
"conditions" : "/event/task =~ mytask"
}]
/config/handlersは、イベント・ハンドラーを登録するためのグローバル・コンテキストのキーです。ここには、3つの値をJSON形式で記述します。
http://www.projectzero.org/sMash/1.1.x/docs/zero.devguide.doc/zero.core/Config.html#Event_handler_registration
events : イベント名。コマンドの場合は”cliTask”という名前を指定しなければなりません。
handler : イベント・ハンドラーの名前。パスを指定しない場合は、/app/scripts内のファイルとして扱われます。
conditions : 実行中の間、有効な値。/event/taskに指定した値がコマンド名になります。また、/event/subTaskに指定した値が、コマンドのサブタスク名になります。
ちなみに、他のポート番号などは、コマンド実行時には全く影響しません。
次に、zero.configで指定したイベント・ハンドラーを実装します。/app/scriptsディレクトリーに、cliTask.groovyを作成し、以下のように記述します。
def onCliTask() {
def task = zget(”/event/task”)
System.out.println(”task name is ” + task)
zget(”/event/args”).each{System.out.println(”arg is ” + it)}
}
このコードでは、onCliTask()メソッドを定義し、タスク名を”task name is XXXX”と出力します。また、その後に引数があった場合には、その数だけ”arg is YYYY”と出力します。
これで、カスタムコマンドの実装は完了です。このアプリケーションをリポジトリに公開します。MyCommandsディレクトリに戻り、zero packageコマンドと、zero publishコマンドを実行してください。
以上で、アプリケーション側の操作は完了です。最後に、sMashにこのアプリケーションの依存性を追加します。
●2. sMash本体への依存性追加・解決
sMash本体のディレクトリーを開き、config/ivy.xmlファイルを開き、以下の1行を<dependencys>内に追加します。
<dependency name=”MyCommands” org=”zero” rev=”[1.0.0.0,)”/>
これにより、通常のCLIに加え、先ほど作成したコマンドがsMashで使えるようになります。ivy.xmlを保存して終了した後、zero resolveを実行してください。zero resolveが失敗する場合は、アプリケーションの公開に失敗していますので、リポジトリーを確認してください。
今回作成したコマンドの実行例は以下の通りです。
このカスタムコマンドの実行のためにsMashのアプリケーションを起動しておく必要は全くありません。通常のzeroコマンドと同様に利用できます。
このエントリーでは、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クラスの配列の数字が、ページ番号に対応しますので、何ページにその単語があるのかを調べることも簡単に行えます。
PHP on sMash 第16回は、Groovy Bridgeです。前回はJava Bridgeを紹介しましたが、v1.1からGroovyのクラスを利用できるようになりました。これによって、既存資産がJavaであっても、Groovyであっても、そのクラスをPHPから利用してコードを書くことができるようになりました。それでは、始めていきましょう。
英語Blogでも既に告知されていますが、sMash v1.1.0向けのfixpack1がリリースされました。リポジトリはこちらです。
fixpack1で修正されたBugのリストは、こちらにあります。
Bug8008やBug8149など日本語関連のBugもいくつか修正されていますので、v1.1をご利用になっていて、phpBBやSugarCRMの日本語版をテストしてみる際は、こちらのfixpackを適用してください。
こちらも英語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では、Apache POIをモジュールとして提供しています。Apache POIは、Microsoft Officeのファイルを操作するAPIを提供するJavaのモジュールです。これを利用することで、sMashで容易にApache POIの利用環境を作ることができます。また、Java Bridgeを利用することで、PHPを用いてMicrosoft Officeのファイルを操作することが可能です。
●利用するための準備
Apache POIは、zero.office.integrationという名前で提供されています。このモジュールへの依存性を、ivy.xmlに追加します。これで準備は完了です。
●Excelファイルを作ってみる
まず最初に、Excelファイルを生成してみましょう。せっかくですので、ここではPHPでやってみましょう。generate.phpとして、次のファイルをpublicフォルダに作成してください(コピー&ペーストするとダブルクォーテーションが全角になるので注意して下さい)。
<?php
java_import(”java.io.FileOutputStream”);
java_import(”org.apache.poi.hssf.usermodel.HSSFWorkbook”);
java_import(”org.apache.poi.poifs.filesystem.POIFSFileSystem”);
$filedir = zget(”/config/root”).”\\public\\sMash.xls”;
try{
//新規ワークブックを作成する
$wb = new HSSFWorkbook();
$fileOut = new FileOutputStream($filedir);
//新規ワークシートを作成する
$sheet = $wb->createSheet();
$wb->setSheetName(0, “シート01″, $wb->ENCODING_UTF_16);
//A1に日本語を書き込む
$row = $sheet->createRow(0);
$cell = $row->createCell(0);
$cell->setEncoding($wb->ENCODING_UTF_16);
$cell->setCellValue(”sMashでExcelファイルを作りました!”);
//終了処理
$wb->write($fileOut);
$fileOut->close();
echo(”Excelファイルの作成が完了しました!”);
} catch (Exception $e) {
echo $e;
echo(”処理が失敗しました”);
}
?>
作成したら、sMashアプリケーションを起動し、http://localhost:8080/generate.phpにアクセスしてみてください。publicフォルダ内にsMash.xlsファイルが生成されているはずです。
●Excelファイルを読み込んでみる
では、そのExcelファイルを読み込んで、PHPで文字列として表示してみましょう。read.phpとして、次のファイルをpublicフォルダに作成してください(コピー&ペーストするとダブルクォーテーションが全角になるので注意して下さい)。
<?php
java_import(”java.io.FileInputStream”);
java_import(”org.apache.poi.hssf.usermodel.HSSFWorkbook”);
java_import(”org.apache.poi.poifs.filesystem.POIFSFileSystem”);
$filedir = zget(”/config/root”).”\\public\\sMash.xls”;
try{
//ファイル読み込み
$filein = new POIFSFileSystem(new FileInputStream($filedir));
//1つ目のシートの、A1を示すセルのオブジェクトを取得する
$wb = new HSSFWorkbook($filein);
$sheet = $wb->getSheet($wb->getSheetName(0));
$row = $sheet->getRow(0);
$cell = $row->getCell(0);
//文字列を取得し、出力
echo $cell->getStringCellValue();
} catch (Exception $e) {
echo $e;
echo(”処理が失敗しました”);
}
?>
作成したら、sMashアプリケーションを起動し、http://localhost:8080/read.phpにアクセスしてみてください。”sMashでExcelファイルを作りました!”と表示されていれば成功です。
●参考情報
他にもApache POIでは、計算式を読み込んだり、セルにコメントを追加したり、そのコメントを読み込んだり、様々なAPIが提供されています。詳細については、Apache POIのWebサイトをご参照下さい。http://poi.apache.org/
PHP on sMash 第15回は、Java bridgeです。sMashでは、PHPからJavaのクラスを容易に利用することができます。そのため、既存のJava資産が存在する場合でも、それを利用して、新たなPHPアプリケーションを作成することができるようになっています。今回は最新版の環境を利用しますので、こちらを参考に開発環境構築を行って下さい。
それでは、始めていきましょう。
PHP on sMash -sMashとPHPで作るRESTful Webアプリケーション- 第14回は、引き続き、PHP拡張についてです。今回も、V1.1の環境を利用しますので、こちらを参考に開発環境構築を行って下さい。
今回もTipsとして、PHP拡張を行う際に使えるいくつかの項目について説明します。今回説明するのは、
php.iniの値を利用する
引数をパースする
エラーを発生させる
PHP関数、拡張PHP関数を実行する
引数、返り値に配列を用いる
PHPの”リソース型”を作成する
の6つです。それでは、始めていきましょう。
