Category Archives: Java

Java製の形態素解析器「Kuromoji」なるものがあるらしい

通勤中に、twitter上で突如目に入ってきた情報は、とてもワクワクしました。

Java製形態素解析器「Kuromoji」を試してみる
http://www.mwsoft.jp/programming/lucene/kuromoji.html

これを見る限り、使い方は非常にシンプル。

今までSenのバージョンアップをどれだけ心待ちにしてきたか分かりません。
ひとまず、これも評価して見ようかと思います。

[HT-03a]「Google App Inventor」でサンプルプログラムを開発する

前回は、App Inventorの動作環境のセットアップについて解説した。

今回は、実際にサンプルプログラムを作成してみる。
ただ、ここで紹介する内容は、
App Inventorのチュートリアルに書かれているものなので、
役に立つことと言えば「日本語で解説している」ことくらいだ。

■準備
すでにApp Inventorの開発環境が整っていることが条件。
整っていない場合、以下からセットアップをしてください。
http://blog.mikuriya.biz/archives/664

■今回作るもの
猫の描かれたボタンをクリックすると、「ニャー」と鳴くアプリケーション。

■App Inventorの開発手法のおさらい
・デザイン面は、ウェブ上で編集する。
・処理面は、Java Web Startによってローカル環境で編集する。

では、ここからがサンプルアプリケーションの作成手順です。

■はじめる前に
ChromeだとJava Web Startがうまく起動しなかったため、
Firefoxで開発を行なった。

このアプリは、画像ファイルと音声ファイルを使用する。
画像ファイル「kitty.png」
音声ファイル「meow.mp3」

■AVD(Android Virtual Device)を開く
前回セットアップしたAndroid SDKのtoolからandroid.batを起動する。

送信者 blog画像

■Virtual Deviceを起動する
これも前回セットアップしたAVDを選択し、StartからLaunch。
Launch Optionsもデフォルトのまま起動する。

送信者 blog画像
送信者 blog画像
送信者 blog画像

■App Inventorでプロジェクトを作成する。
App Inventorの画面右上の「My Projects」へ移動する。

送信者 blog画像

本来は開発したAndroidアプリのプロジェクトが一覧に表示されるが、
何も作成していないので、殺風景な感じ。
「New」からプロジェクト名を設定する。ここでは「HelloPurr」と記入する。
OKをクリックすると、開発画面へ自動的に移動する。

送信者 blog画像

■スクリーン名を変更する
Viewerに「Screen1」と書かれている部分をクリック。
PropertiesのTitleを「Pet the Kitty」に修正する。

送信者 blog画像

■ラベル(タイトル)を追加
スクリーン上にテキストを挿入する場合は「Palette – Basic – Label」を使用する。
ドラッグ&ドロップでLabelをViewer上に持ってくる。
その後、以下のオプションを変更。
PropertiesのBackgroundColorをBlue
PropertiesのFontSizeを20
PropertiesのTextをHello Kitty!
PropertiesのTextColorをYellow

送信者 blog画像

■ボタンの追加
猫の描かれたボタンを作成するためにまずはボタンを作成する。
「Palette – Basic – Button」をドラッグ&ドロップでViewer上に持ってくる。
その後、以下のオプションを変更。
PropertiesのFontSizeを20
PropertiesのTextをThis is Pet!

送信者 blog画像

■ボタンに画像を挿入
ボタンに猫の画像を埋め込みたいので、まずは先ほど作成したボタンをクリック。
PropertiesのImageがNone…になっているので、
クリックして猫の画像を設定する。

送信者 blog画像

すると、ボタンに猫の画像が挿入される。

送信者 blog画像

■ボタンクリックで音楽を流す準備
猫の描かれたボタンをクリックすると、
「ニャー」と鳴くアプリケーションであるため、
音声ファイルを定義しておく必要がある。

先述した「開発手法のおさらい」にも書いたが、
「どれをクリックするとどれが動く」といった処理系は、
ブラウザ上で設定できないため、
ブラウザ上では、とりあえず「このアプリでは音声ファイルを使用するよ」とだけ定義する。

「Palette – Media – Sound」をドラッグ&ドロップでViewerに設置する。
Viewerの下にSoundマークが設置されるので、
それをクリックしPropertiesのSourceに音楽ファイルを指定する。

送信者 blog画像
送信者 blog画像

■Open the Blocks Editorを開く
ひとまず、これでデザインや材料準備は終了した。
ここからJava Web Startによる処理部分の開発にはいる。

画面右上の「Open the Blocks Editor」をクリックすると、
jnlpファイルをダウンロードする画面がでるので、
Java Web Start Launcherで開くを選択。
※冒頭で説明したが、必ずAVDを開いておくこと。

送信者 blog画像

たまに「Could not create the Java virtual」というエラーがでて、
起動に失敗することがある。
なんか起動の順番が重要っぽいので、
その場合は、ブラウザやらAVDやら一通り閉じて、
AVD起動→Firefox起動→Open the Blocks Editor→Java Web Start起動
をやってください。

■Open the Blocks Editorで処理部分の編集
猫の描かれたボタンをクリックすると、
「ニャー」と鳴くアプリケーションなので、
今回の処理は、
「ボタンをクリックと猫の音声ファイルが再生される」部分だ。

画面上部のMy Blocksをクリックする。

送信者 blog画像

Button1をクリックすると、なんかパズルみたいなのがいろいろでてきた。

送信者 blog画像

「ボタンをクリックと猫の音声ファイルが再生される」処理なので、
Button1.Clickをフィールド上に設置。

送信者 blog画像

「ボタンをクリックと猫の音声ファイルが再生される」処理なので、
Sound1からSound1.PlayをButton1.Clickにパズルのようにはめる。

送信者 blog画像
送信者 blog画像

これで、処理部分が完成した。

■動作チェック
処理部分が完成したので、AVDでアプリの動作確認を行なう。
Open the Blocks Editorの画面右上「Connect to phone」をクリック。

送信者 blog画像

AVDにアプリが登場!

送信者 blog画像

これで終了だ。
最大の難所は、やはりJava Web Startを立ち上げられるかどうかだろう。
それができれば、誰でも簡単にandroidアプリが開発できる。

[HT-03a]Androidアプリをマウスで開発「App Inventor For Android」セットアップ編

「App Inventor For Android」がベータ版としてついに公開された。
早速、サンプルアプリを作成し、操作を実感してみた。

YouTubeにアップされているレッスン動画を見れば、
簡単にセットアップが完了したが、メモとして残す。

セットアップさえ終われば、サンプルアプリも簡単に作成できるので、
今回は重要な点と環境設定の手順のみを解説する。

■App Inventorで準備すること
・App Inventor For Androidが利用できるユーザーであること
・Javaをインストールすること
・Android SDKをインストールすること
・Android携帯を持っている人は、USBでPCと接続できていることを確認すること
・App Inventor Extras Softwareをインストールすること

■App Inventorの開発手法
・Androidアプリのデザインは、ウェブ上(ブラウザ)で作成する
・Androidアプリの処理部分は、Java Web Startで作成する

では、ここから詳細な解説をおこなう。

■App Inventorの開発環境セットアップ
まず、Java6を普通にインストールする。
http://www.java.com/ja/

送信者 blog画像

最新版のAndroid SDKをインストールする。
(現時点での最新版は、android-sdk_r07-windows.zip)
これは、Android携帯のエミュレータとか入っている開発キット。
インストールは、zip解凍して適当なディレクトリに設置するのみ。
http://developer.android.com/sdk/index.html

送信者 blog画像

App Inventor Extras Softwareをインストールする。
(installer softwareのリンクをクリックしインストーラをダウンロード)
よくわからないけどドライバとか入ってるっぽいのでインストールする。
インストーラなので「次へ」を連発すればインストールされる。
http://appinventor.googlelabs.com/learn/setup/setupwindows.html

送信者 blog画像

Android SDKにてSDK Platformパッケージをインストールする。
まず${ANDROID_SDK_HOME}/tools/android.batを起動する。

送信者 blog画像

Android SDK and AVD Managerというのが開くので、
Installed PackagesタブからAndroid SDK Tools, revision 7を選択し、
「Update All」をクリックする。
指示に従ってそのままインストールを開始(少し時間がかかる)。

送信者 blog画像

忘れないうちに、先に自分で作成したアプリを動作させる環境だけセットアップしておく。
Virtual DevicesタブからNewをクリック

送信者 blog画像

Nameは自由に、Targetは自分が開発したいAndroidのバージョン、
SD Cardは想定されるSD Cardのサイズ。
(特に決まってないならバージョンは2.2、SD Cardは16MiBで進める)

送信者 blog画像

作成したAVD(Android Virtual Device)を選択し、Startボタンで起動する。

送信者 blog画像

Launch Optionsでは特にチェックを入れず、そのままLaunchをクリックする。

送信者 blog画像

ついにAVDが起動した。

送信者 blog画像

これで一通りのセットアップが完了だ。
これで駄目だったら、以下の参考URLで動画見て勉強してください。

■参考URL
これを手順どおりにやっただけなので、動画だしこっちを見た方がよいかも。
Lesson 1(環境設定): http://www.youtube.com/watch?v=NtK5ccqUt6Q
Lesson 2(サンプル開発): http://www.youtube.com/watch?v=t5o3bTMVDVw

[Java]Solr1.4.1をTomcat6へインストール(Windows版)

以前から興味があった全文検索エンジン「Solr」を触ってみる。
この記事ではWindowsへのインストールのみ解説している。

0.前提
Tomcatは、以下のディレクトリにインストールされているものとする。

C:\Program Files\Apache Software Foundation\Tomcat 6.0

1.ダウンロード
以下のURLからダウンロード先を選択し、apache-solr-1.4.1.zipをダウンロード
http://www.apache.org/dyn/closer.cgi/lucene/solr/
※URLによってはSolr1.4.1が無い場合もあるのでよく探す

2.zip解凍
ダウンロードしてきたapache-solr-1.4.1.zipをzip解凍する

3.アプリケーションをTomcatに設置
以下、指定のwarファイルを指定のTomcatディレクトリへ移動する。
・移動するファイル

apache-solr-1.4.1/example/webapps/solr.war

・移動先のTomcatディレクトリ

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps

4.warファイルを解凍し設定ファイル設置
先ほど設置したsolr.warをzip解凍する。

以下2つのフォルダを解凍したフォルダ内に設置する。
移動するフォルダ

apache-solr-1.4.1\example\solr\bin
apache-solr-1.4.1\example\solr\conf

移動先のフォルダ

C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\solr

5.Tomcatの設定ファイルを作成
Web画面上からSolrアプリケーションが見れるように、
Tomcatの設定ファイルを作成する。

・作成するファイル

C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\solr.xml

・ファイルの内容

<Context docBase="solr" debug="0" crossContext="true">
	<Environment name="solr/home" type="java.lang.String"
		value="C:/Program Files/Apache Software Foundation/Tomcat 6.0/webapps/solr"
		override="true" />
</Context>

6.Tomcatを起動
Tomcatを起動し、以下のURLへ接続する。

http://localhost:8080/solr/admin

この間にエラーが出たらなんか間違えてるので、
一から読み直すかあきらめてください。

7.参考URL
http://ymotoba.blogspot.com/2008/10/solr.html
※まんま同じ作業を行ないました

[SAStruts]Webアプリケーション用に作成したプロジェクトでスタンドアローンプログラムが実行できない

EclipseのプラグインDoltengからWebアプリケーションとしてSAStrutsを作成し、
開発を進めていたが、mainで動作するスタンドアローンなプログラムを実行させる機会があった。
従来は、プロジェクトを分けているが小さいプログラムだったので、
Webアプリケーションと同一のプロジェクト内にプログラムを作成した。

そこで、スタンドアローンなプログラムを実行。。。エラー発生。
「SingletonS2ContainerFactory.init()」の時点でエラーが発生していた。

Exception in thread "main" org.seasar.framework.container.ComponentNotFoundRuntimeException: [ESSR0046]コンポーネント(interface javax.servlet.ServletContext)が見つかりません
	at org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponentDef(S2ContainerBehavior.java:165)
	at org.seasar.framework.container.impl.S2ContainerBehavior$DefaultProvider.acquireFromGetComponent(S2ContainerBehavior.java:158)
	at org.seasar.framework.container.impl.S2ContainerBehavior.acquireFromGetComponent(S2ContainerBehavior.java:62)
	at org.seasar.framework.container.impl.S2ContainerImpl.getComponent(S2ContainerImpl.java:124)
	at org.seasar.framework.container.SingletonS2Container.getComponent(SingletonS2Container.java:43)
	at org.seasar.struts.util.ServletContextUtil.getServletContext(ServletContextUtil.java:42)
	at org.seasar.struts.util.S2ModuleConfigUtil.getModuleConfig(S2ModuleConfigUtil.java:38)
	at org.seasar.struts.customizer.ActionCustomizer.customize(ActionCustomizer.java:80)
	...
	(省略)

初期設定時に発生したエラーなので、
設定ファイルの内容を編集しなくてはならないことが早い段階で分かった。

上記で起きた問題を解決したので、忘れないために解説する。

以下、解説。

■概要
Webアプリケーション(SAStruts)でプロジェクトした時に、
そのプロジェクトからスタンドアローン(main)の実行を行なう場合、
src/resources以下の設定ファイルをいくつか編集する必要がある。

これを行なわないと、初期起動時にエラーが発生する。

■原因
「SingletonS2ContainerFactory.init()」を呼びだした際に、
スタンドアローンでは使用しないコンポーネント(?)を無駄に読み込む。
これは、プロジェクト作成時にWebアプリケーション用の設定になっているから。

いくつかWebアプリケーション用に定義された値を除去する必要がある。

■解決
編集すべきファイルは、「creator.dicon」。
ここには、初期起動時に呼びだすいくつかのコンポーネントが定義されている。

編集前のcreator.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="customizer.dicon"/>
	<component class="org.seasar.framework.container.creator.ActionCreator"/>
	<component class="org.seasar.struts.creator.FormCreator"/>
	<component class="org.seasar.framework.container.creator.ServiceCreator"/>
	<component class="org.seasar.framework.container.creator.DtoCreator"/>
	<component class="org.seasar.framework.container.creator.InterceptorCreator"/>
	<component class="org.seasar.framework.container.creator.DaoCreator"/>
</components>

編集後のcreator.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<include path="convention.dicon"/>
	<include path="customizer.dicon"/>
	<!-- データベース接続機能のService系のみ残す -->
	<component class="org.seasar.framework.container.creator.ServiceCreator"/>
</components>

これで実行すれば、正常に動作する。
もっと詳細な原因を知りたければ他で調べてください。

■参考URL
http://ml.seasar.org/archives/seasar-user/2009-April/017325.html

[Lucene]QueryParserによるOR検索とAND検索の切り替え

オープンソース検索エンジンLuceneで検索システムを開発していた時に
手間取った点があったので、ここに記す。

GoogleやYahoo、MSNなど大抵の検索エンジンでは、
空白区切りにキーワードを記述するとAND検索処理(絞り込み検索)が行われる。

しかし、LuceneはデフォルトでOR検索処理(または、あるいは検索)が行われる。
これだと、AND検索を行なうことができない。

OR検索からAND検索に切り替える方法があった。

独自QueryParserの作成 | 関口宏司のLuceneブログ

ここで書かれている問題は・・・QueryParserのsetDefaultOperator()で
ANDを指定しているとき、"A AND B OR C"という検索質問をQuery...

QueryParserのsetDefaultOperator()にANDを設定してやれば解決。

あやうくAND検索用の処理を書くところだった。

Apache POIで複雑なExcelを出力すると破損する

結局、原因不明で調査、作業を終えたのだが、

Apache POIで複雑なExcelを出力すると破損する

という現象が起きた。

複雑なことといっても、デザインをそれなりにいじったことと
1ファイルに4枚のシートを作成したこと。

以下のURLでも同じような現象が起きている。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44883&forum=12
http://d.hatena.ne.jp/kusakari/20071214/1197603134

私の場合、
1シート目から順に値をセットして、計4シートセットした後、
Excelファイルを出力する処理を記述しているのだが、
先に4シート目に値をセットしてから1,2,3シートの順に値をセットすると、
エラー(破損)が発生しなくなった。

たぶんPOIのバグだろう。

ちなみに最新BETA版「poi-bin-3.5-beta6-20090622」だと、
こんな面倒なことは起きないで正常に処理される。
バグを直したってことなのか?

Apache PoiでExcelシートの印刷の向きを横に変更する

ここで初めて知ったのだが、Poiではシートごとに印刷時の設定を編集することができるようだ。

HSSFWorkbook workbook = new HSSFWorkbook();

HSSFSheet sheet = workbook.createSheet(Excel.COVER);

HSSFPrintSetup setup = sheet.getPrintSetup();

// 印刷の向きを横か縦に変更
setup.setLandscape(true);

HSSFPrintSetupには、その他印刷系機能が備わっている。
詳しくは以下参考サイトで。

■参考URL
http://blog.goo.ne.jp/fkcalc/e/8b11a8af75898f7c620ac9dda687706a
http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFPrintSetup.html

[Annotations][TestNG]アノテーションを使用した簡単テストフレームワーク「TestNG」

最近SAStrutsをよく使用するため、アノテーション機能も使用する機会が多くなった。
その中でもTestNGというテスト用フレームワークは、すごく使いやすい。

■Eclipseにプラグインとして追加
以下のURLに書いてあるようにプラグインの追加を行なう。
http://testng.org/doc/download.html

Eclipseの再起動後、プロジェクトを作成。
プロジェクトを右クリック→プロパティ→Javaビルドパス→ライブラリへ移動
外部Jarの追加で「testng-jdk15.jar」を追加で完了

■テストされるクラスの作成
テストされるクラスを作成する。
ポイントは3点。
1.コンストラクタで引数を受け取ること。
2.コンストラクタで受け取った値を引数なしでreturnする。
3.引数とコンストラクタで受け取った値を結合してreturnする。

Sample.java

public class Sample {
	private String value;

	public Sample(String value) {
		this.value = value;
	}

	public String str() {
		return this.value;
	}

	public String str(String str) {
		return str + "_" + this.value;
	}
}

■テストクラスの作成
テスト用クラスを作成する。
今回は、引数なしのメソッドと引数ありのメソッドの2種類を作成するが、
ひとまず、引数なしのメソッドだけテストするクラスを作成する。

SampleTest.java

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/* これ重要 */
import static org.testng.Assert.*;

public class SampleTest {
	private Sample sample;

	/** BeforeClassを定義するとテスト処理の前にこのメソッドが呼ばれる */
	@BeforeClass
	public void init() {
		this.sample = new Sample("test value");
	}

	/** 引数なしのテスト処理 */
	@Test
	public void sysout() {
		String result = this.sample.str();

		/* resultがnullではないか */
		assertNotNull(result);
		/* resultが第2引数と一致しているか */
		assertEquals(result, "test value");
	}
}

■テスト実行、確認
前項で作成したテストクラスを右クリック→実行(Run As)→TestNG Testをクリック
コンソールに実行結果がでているがひとまず無視。

プロジェクト名を右クリック→更新(Refresh)をクリック
すると、「test-output」と「temp-testng-customsuite.xml」が勝手に出力されているはず。

「test-output」は、テスト結果をHTMLとして出力してくれるため、
非常に便利。

それと「temp-testng-customsuite.xml」は、
テストを実行する際の設定ファイルになる。

■引数を渡したテストクラスの作成
先ほど作成したSample.javaの引数ありメソッドをテストする。
アノテーションParametersが2箇所入ってる。
このParametersは次項で設定ファイルに追記する。

SampleTest.java

import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

/* これ重要 */
import static org.testng.Assert.*;

public class SampleTest {
	private Sample sample;

	/** BeforeClassを定義するとテスト処理の前にこのメソッドが呼ばれる */
	@BeforeClass
	@Parameters("const-value")
	public void init(String constValue) {
		this.sample = new Sample(constValue);
	}

	/** 引数なしのテスト処理 */
	@Test
	public void sysout() {
		String result = this.sample.str();

		/* resultがnullではないか */
		assertNotNull(result);
		/* resultが第2引数と一致しているか */
		assertEquals(result, "test value");
	}

	/** 引数ありのテスト処理 */
	@Test
	@Parameters("test-value")
	public void sysout(String str) {
		String result = this.sample.str(str);

		/* resultがnullではないか */
		assertNotNull(result);
	}
}

■設定ファイルを編集
解説も面倒になってきたので、設定ファイルを見て
あとは本家サイトで記述方法を学んでください。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="LoginSample">
	<!-- テストクラス内で使用するパラメータ系を定義する -->
	<parameter name="const-value" value="test value" />
	<parameter name="test-value" value="XXXXXXX" />

	<!-- nameは必須項目。通常パッケージ名などでカテゴリ分けする -->
	<test name="defaultPackage">
		<classes>
			<!-- テストするクラスを指定 -->
			<class name="SampleTest" />
		</classes>
	</test>
</suite>

[SAStruts]テスト時(HotDeploy)と本番時(CoolDeploy)の切り替え

前もって言っておくが、
すでにSAStrutsを使用している人は理解できる話なので、
読まなくてよい。

今回は、HotDeployとCoolDeployの話。

これは、SAStrutsを最近導入した人やこれから導入する人には、
少々理解しづらい。私もその一人だった。

ここから解説。

HotDeploy時は、テスト時に使用するモード。
1スレッドしか使用できないため、複数の接続を同時に処理できない。
あくまでも一人でのテスト用に使用する。

CoolDeploy時は、本番時に使用するモード。
複数のアクセスを可能にする。

WarmDeployというモードもあるが省略。

2つのモードを切り替えるには、env.txtを編集する。
たぶんデフォルトでは「ct(ホットデプロイ)」と書かれているが、
これを「product(クールデプロイ)」に変更する。

詳細は、以下のURLで解説している。

http://sastruts.seasar.org/fileReference.html#env

ここでなかなか難しいのが、
HotDeployでは動いていたが、CoolDeployに切り替えると
動かなくなる(エラーがでる)という現象。

Seasar2側からすれば
「CoolDeployで動かないんだからちゃんと書け」
と言うだろうが、こっちからすれば
「HotDeployで動いてるんだからちゃんと動け」って話。

仕方ない。