JUnitでSystem.out.println()をテスト

処理結果がSystem.outされるメソッドをテストするにはどうしたらよいでしょうか。出力された結果の目視確認ではJUnitでの自動テストにはなりません。そんなときは、下記のようにテストケースを実装すると良いと思います。

private final ByteArrayOutputStream out = new ByteArrayOutputStream();

@Before public void before() {
    System.setOut(out);
}
@After public void after() {
    System.setOut(null);
}
@Test public void testCalc() {
    Calc calc = new Calc();
    calc.add(1, 3); // 1 + 3 の結果をSystem.outしているメソッド
    Assert.assertThat(out.toString(), Is.is("4"));
}

このように実装することにより、System.outされた結果を検証することができます。

NetBeansのJavadoc設定

NetBeansでクラスを右クリックして表示される「Javadocを表示」メニューは、インストールしただけでは使えない。

ドキュメントのZipファイルをダウンロードして、それを設定する必要があります。NetBeansJavaプラットフォーム設定画面で、プラットフォームのJavadocとして設定しましょう。

こうすれば「Javadocを表示」メニューから、そのクラスのJavadocが見えるようになります。

OSX Server10.5でiCal Server

ブラウザからグループカレンダーにアクセスすると下記のように表示される。

Error processing calendar data (210)

この問題はDNSを正しく設定していないために発生していたようだ。ただ、現状ではDNSを設定すると他の機能に影響が出てしまう。そのため、暫定策として/private/etc/hostsファイルにIPとホスト名とのマッピングを記載する事により回避する。

またこれとは別にグループカレンダーにアクセスできるようになって発覚した問題があり、イベントを登録すると9時間ズレてしまう。Timezoneがズレているのだとは思うけれども、どうすれば良いのかが分からない。

この問題は次回に持ち越し:-(

ICEfaces 2.0 Alpha 2

久しぶりにICEfacesを触ってみました。というのも、JSFが2.0になってからなかなかICEfacesがJSF2.0で正常に動作しなかった上に、そもそもICEfacesを利用するメリットが薄れてきて遠ざかることに。ただ、やっぱりICEfacesコンポーネントは秀逸であるため利用したい、とは常々考えていたところ、Alpha2のリリースがやってきました。

Mavenにも対応したということなので、pom.xmlに以下ICEfacesリポジトリの場所を追記。JBossリポジトリは、後述するdependencyを追加すると依存ライブラリとして参照されているjsf-api-2.0.2.FCS.jarとjsf-impl-2.0.2.FCS.jarを取り込むために必要となります。

<repository>
    <id>org.icefaces</id>
    <name>Repository hosting the icefaces artifacts</name>
    <url>http://anonsvn.icefaces.org/repo/maven2/snapshots/</url>
</repository>
<repository>
    <id>JBOSS</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.org/maven2/</url>
</repository>

あとは、以下のdependencyを追加すればOK。

<dependency>
    <groupId>org.icefaces</groupId>
    <artifactId>icefaces-comps-compat</artifactId>
    <version>2.0-A2</version>
    <scope>compile</scope>
</dependency>

Mavenなので依存ライブラリも自動的に取り込まれます。取り込まれたライブラリは以下のようになりました。結構いろいろなライブラリが必要なようです。

  • icefaces-com-ps-compat-2.0-A2.jar
  • icefaces-compat-2.0-A2.jar
  • icefaces-2.0-A2.jar
  • jsf-api-2.0.2.FCS.jar
  • jsf-impl-2.0.2.FCS.jar
  • jstl-1.1.2.jar
  • servlet-api-2.3.jar
  • commons-beanutils-1.8.0.jar
  • commons-collections-3.2.jar
  • commons-digester-1.8.jar
  • commons-fileupload-1.2.1.jar
  • commons-logging-1.1.jar

次にweb.xmlです。ICEfaces1.8の頃までは結構色々と設定しなければならなかったと記憶しているのですが、2.0では下記があれば良いようです。

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

もしICEfacesで用意しているcssなどを利用したい場合は、さらに下記を追記する必要があります。

<servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>com.icesoft.faces.webapp.ResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/xmlhttp/*</url-pattern>
</servlet-mapping>

ICEfacescssは下記のコードで参照することが可能です。

<ice:outputStyle href="/xmlhttp/css/rime/rime.css"/>

ICEfacesの設定はこれだけで良いのですが、実際にxhtmlを実装してみて気がついたこと。FacesMessageを利用してエラーメッセージを表示しているのですが、bodyタグをice:outputBodyにしておかないとf:messagesタグにエラーメッセージが表示されないようです。
例:
Javaソースコード中で下記のようにエラーメッセージを設定している場合

FacesContext ctx = FacesContext.getCurrentInstance();
ctx.addMessage(null, new FacesMessage("エラーです。")));
  • h:body -> 表示されない
  • ice:outputBody -> 表示される

あとは、ICEfacesを利用した場合にf:ajaxタグがうまく動作してないように感じられるぐらい。今のところ、f:ajaxタグは部分再描画にしか利用していないので、非同期で画面を再描画してくれるICEfacesにすべてをお任せする形で良いのかもしれません。

Snow LeopardでZIPファイルを暗号化

まさに標題の通りなわけで、どうしても暗号化(パスワードロック)する必要があって、Snow Leopardでできないかなと調べました。フリーのソフトを入れれば簡単なんだけど、できたら標準搭載の機能で何とかしたいところ。というわけで調べた結果、コマンドラインで暗号化できるようなのでこれにて実施してみます。手順は2段階で、まず最初はファイルを圧縮します。(ファイル右クリックで圧縮したZIPファイルだと暗号化に失敗するようです...)

> zip -r [ZIPファイル名] [圧縮対象ファイル名]

次にZIPファイルを暗号化します。

> zipcloak [ZIPファイル名]
Enter password: ***********
Verify password: ***********
encrypting: [ZIPファイル名]

これで完成。以外に簡単なんだけど、本当は右クリックでここまでできるようになると嬉しい。

追記:
zipcloakコマンドを使わなくても以下のようにzipコマンドで一回でできました。

> zip -e [ZIPファイル名] [圧縮対象ファイル名]
Enter password: ***********
Verify password: ***********
encrypting: [ZIPファイル名]

MacにMercurialをインストールしてNetBeansから利用

すっかりどっぷりMercurialにハマってしまったので、自宅のMacにもインストールしてみようと思います。さて、ここはやっぱりMacPortsでインストールするべきかと思い、久しぶりにMacportsをアップデートしてみました。

>sudo port selfupdate

なんだかエラーが出ます。そういえばSnow Leopardにアップデートしてから一度もMacPortsを起動していないことを思い出し、これはやっぱりバージョンアップしたせいであるという結論を導きだしました。MacPortsのサイトにいくと、Snow Leopardについて言及していて、対応版1.8.2が出ているようなのでそれをダウンロードしてインストールします。インストール後のアップデートは正常に動作(注意:XCode3.2.1以降がインストールされていないとMacPorts1.8.2が正常に動作しません)したので、早速、Mercurialがあるのかどうか検索してみます。

>sudo port search mercurial

Mercurial @1.4.2を見つけることができたので、これをインストールします。ここまで来たら後はNetBeansからMercurialに対してコミットを実施するだけです。NetBeansの「チーム」->「Mercurial」から「プロジェクトの初期化」を選択して、既存プロジェクトを初期化します。(既存のファイル等が消える訳ではなく、Mercurialリポジトリとして動作するように管理ファイルが設置される、ということです)プロジェクトをCtrl+クリックして「Mercurial」から「コミット」を選択します。ところが、ここで問題が...。

コミットメッセージに日本語を使うと、コミットに失敗するようなのです。すぐに文字コードの問題だということはわかったのですが、Mercurialのコミットの文字コードはどこで設定すればよいのか。マニュアルを調べるとHGENCODINGという環境変数文字コードを設定できるとあります。が、NetBeansからこの設定が見えるのでしょうか?通常、.bashrcとかに設定するとは思うのですが、NetBeansはターミナルから起動する訳ではないので認識しない。NetBeansのパッケージ構成を見ると「Contents/Resources/NetBeans/bin」にnetbeansという起動用のシェルスクリプトがあります。ここにHGENCODINGの設定を行えばうまく認識してくれそうです。起動処理の直前にHGENCODINGの設定を追加します。

export HGENCODING="Shift_JIS"

# in case of macosx, the apple.laf.useScreenMenuBar property should be ideally in the Info.plist file
# but it doesn't get propagated into the executed java VM. 
case "`uname`" in
    Darwin*)
        eval launchNbexec \
            --jdkhome '"$netbeans_jdkhome"' \
            -J-Dcom.apple.mrj.application.apple.menu.about.name=NetBeans \
            -J-Xdock:name=NetBeans \
            '"-J-Xdock:icon=$progdir/../nb6.8/netbeans.icns"' \
            --branding nb \
            --clusters '"$netbeans_clusters"' \
            -J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \
            -J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense \
            ${netbeans_default_options} \
            '"$@"'
        ;;
    *)
        eval launchNbexec \
            --jdkhome '"$netbeans_jdkhome"' \
            --branding nb \
            --clusters '"$netbeans_clusters"' \
            -J-Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade \
            -J-Dnetbeans.accept_license_class=org.netbeans.license.AcceptLicense \
            ${netbeans_default_options} \
            '"$@"'
        ;;
esac

文字コードShift_JISとします。これはJDK6ではデフォルトの文字コードShift_JISとなっているためです。そのためJDK6上で動作するNetBeansは、特に文字コードを設定しなければShift_JISで動作することになり、コミットメッセージもShift_JISとなります。

これでコミットメッセージに日本語を利用できるようになりました。