« February 2007 | Main | April 2007 »

March 2007

2007.03.31

ViewVCのdocrootの設定

 2年近く前にViewCVSのインストールを行いましたが、久しぶりに手入れを・・・って正確には、Tracをインストールして以来ViewCVSは全然使っていなかったのですが、Wiki等なしで単に「リポジトリブラウズ」だけを行いたいようなSubversionリポジトリがでてきたので(^^;

 ViewCVSは、現在はViewVCとして公開されており、設定等に関しては、Subversion/ViewVC - てんぷらメモを参考にさせていただきました。

 まぁ、ViewVCのインストール&設定そのものは簡単に終わったのですが、ViewVCでアクセスするとApacheのエラーログに

The given path contained wildcard characters: access to /*docroot*/~

って感じのメッセージが大量に。まぁ、文字通り「ワイルドカードを含むURLでのリクエストがあった」ってことで、結果の表示自体は問題なく行えているのですが、さすがにリクエストの度に大量のログが出力されるのもアレなので回避方法を探してみました。

Continue reading "ViewVCのdocrootの設定"

| | Comments (0) | TrackBack (0)

2007.03.26

ZipOutputStreamで空ファイルの出力

 ZipOutputStreamを用いることで、簡単にzipファイルを作成することができますが・・・ファイルサイズ0のいわゆる「空ファイル」は出力することができないんですかね・・・? ZIP32.DLL&LHUT32を用いてZIPファイルを作成したり、WindowsXPのZIP圧縮機能を使ったりしても、ファイルサイズ0のファイルはアーカイブに含めることができなかったので、もしかすると、ZIPの仕様そのものが0バイトのファイルを受け付けないようになっていたりするんですかね??

 まれに、「存在するか否かが重要」ということでファイルサイズ0のファイルを使用する場合があるのですが、う~ん・・・。

【追記】
やはり、ZIPとしては0バイトも問題なく格納可能なようです。ってことは、やはり出力の仕方の問題なんでしょうかね・・・?

【さらに追記】
普通に(0バイト以外のファイルの場合と同様に)出力するだけで問題なくファイルの出力ができていたようです。どうも、確認の際に使用していたツールの問題? ただ、そのツールでも、リストには表示されないものの、ファイルの解凍等は問題なく行えるんですよね・・・。ちなみに、WindowsXPのExplorerで開くと、やはり問題なく内容を表示することができました。

| | Comments (0) | TrackBack (0)

2007.03.25

SVNKit&JavaHL

 Subversionのリポジトリに対してアクセスするためのJavaライブラリとして、JNIを使用するJavaHL以外にSVNKitってのもあります。SVNKitは「かつてはJavaSVNと呼ばれていた」Pure Javaによる実装ですが、Pure Javaで実装されているため動作させるOSを気にすることなくSubversionに対してアクセスすることができます。

 ところが・・・JavaHLとはアクセスの仕方が全然違う(涙)。一応サンプルソース等も公開されているのですが・・・勉強不足だなぁ(苦笑)。まぁ、それはそれとして、とりあえずJavaHLと同じ扱いで、JNI経由ではなくPureJava実装経由でアクセスする方法が提供されており、それを使うと以下のようにSVNClientを初期化するところを書き換えるだけでJavaHLを使った場合と全く同じような感じでアクセスすることができます。

SVNClientInterface client = SVNClientImpl.newInstance();

 もちろん、この実装を使用すると、DLLを準備する必要はなくなります(なお、JavaHLで使用するsvnjavahl.jarは必要です)。

#SVNClientImplの実装を読めば、SVNKit本来の使い方でアクセスする方法を勉強できそうな感じ? ただ、SVNClientのアクセス方法がシンプルなだけにそこまで気力があるかどうか(^^;

| | Comments (0) | TrackBack (0)

2007.03.24

久しぶりにJavaHL

 かなり以前にJavaHLを使ってみましたが、久しぶりに使う機会がありました。
 ちなみに、JavaHLはここからダウンロード可能で、ソース等はここで公開されており(ViewVC)チェックアウト等を行う場合はここから行うことが可能です。

 で、Eclipse3.2(Subclipseプラグイン導入済み)上で-Djava.library.pathでlibsvnjavahl-1.dllを格納しているパスを指定して、ごにょごにょと実行。例えば以下のような感じ。

// ワーキングコピーC:/svn/testrepos以下のフォルダを再帰的にupdateする
SVNClientInterface client = new SVNClient();
long revision = client.update("C:/svn/testrepos", Revision.HEAD, true);
System.out.println("svn update, revision : " + revision);
// ワーキングコピーC:/svn/testrepos以下のファイルにおいて、新規に追加されているファイルすべてをaddし、紛失したファイルをすべてremoveする
SVNClientInterface client = new SVNClient();
Status[] status = client.status("C:/svn/testrepos", true, false, false);
for (int i=0; i'lt;status.length; i++) {
 int s = status[i].getTextStatus();
 if (s == StatusKind.unversioned) {
  String path = status[i].getPath();
  System.out.println("svn add : " + path);
  client.add(path, false);
 } else if (s == StatusKind.missing) {
  String path = status[i].getPath();
  System.out.println("svn remove : " + path);
  client.remove(new String[] { path }, "", false);
 }
}

Continue reading "久しぶりにJavaHL"

| | Comments (0) | TrackBack (1)

2007.03.23

Opera for PDAでSSLクライアント証明書

 Opera for PDAにふれる機会があったので、ついでなのでSSLクライアント証明書のテストもやってみました(笑)。もちろん、ここで使用したのはOpenSSLで作成した自作証明書(PKCS#12形式)ですが。

 クライアント証明書をインポートしようとしたときに、2回以上パスワード入力画面が表示されましたが、1回目のは証明書のエクスポート用パスワードってのはOKとして、2回目のは・・・?
 で、調べてみると、どうやら証明書ストアに対するパスワードなんですね。どうも、事前に証明書ストアに対するパスワードを設定しておく必要があるような感じです。
 ちなみに、クライアント証明書を使用する際(証明書が必要なエリアにアクセスする際)にも証明書ストアのパスワードが必要となるようですが、このパスワードを記憶させる設定は見つけられませんでした(^^;

#まぁ、普段PDAでクライアント証明書が要求されるようなところへアクセスすることはまずないと思いますが。

| | Comments (0) | TrackBack (0)

2007.03.22

dotProject

 プロジェクト管理ツールdotProjectをインストールしてみました。ガントチャートの出力が可能という点が魅力。
 なお、試したのはWindows2000+Apache2.0.59+PHP5.2.1+MySQL5.0.27+dotProject2.1-rc1という組み合わせです。
 ってことで、悩んだ点をちらほらと。もっとも、正式版ではないので、暫定的な回避方法となる可能性も高いですが。

  • インストール時にテーブル作成に失敗してしまう。

  • 日付型を2007/03/22という感じの形式にしたいが、コンボボックスにはこの形式が入っていない。
      moludes/system/addeditpref.phpファイルの98行目付近に%Y/%m/%dの形式を追加すればOK。

  • ガントチャートを日本語化したが、開始日の枠の幅が狂ってしまう(日付が重なってしまう)。
      modules/projects/gantt.phpファイル内の$graph->scale->actinfo->SetColTitlesの処理を記述しているところの160,10,70,70ってところを160,70,70,70に書き直すことで枠の幅がいい感じに(gantt2.phpも同様)。

  • すべてのページの画面下部にCall to a member function Execute() on a non-object in (Apache_DocumentRoot)\dotproject\classes\query.class.php on line 650というメッセージが表示される。
      PHPの仕様変更によるものらしい? こちらに書かれているように、該当ファイルの650行目の$db->Execute($q);の前に@を付加するとメッセージは出なくなりました。

  • Default File Indexing Parser等で/usr/bin~が指定されている。
      今のままだとWindows環境ではまず間違いなく動きませんが、どういう時に呼び出される処理なのかもよくわからないので、とりあえずは放置(笑)。

     なお、ガントチャートの日本語化は、dotProject のガントチャートで日本語を表示する。(okkezのPukiWiki)を参考にソースを書き換えました。少し前の資料ですが、2.1rc1でも同様の対応で日本語化が可能でした(なお、この対応だけだと文字数が多くて途中で切り出した場合に、末尾が化ける場合がありますが)。

  • | | Comments (0) | TrackBack (1)

    2007.03.21

    Luceneではまった

     Javaの全文検索ライブラリであるApache Luceneではまったこと・・・ついうっかりと、インデックス作成時の環境と、インデックス利用時の環境とが違ってしまっていたこと。

     何故ヒットしないんだろうと数日間悩んでしまいました(苦笑)。

     インデックス利用時はHighlighterを使用するために若干手を加えた(?)SenTokenizerを使用しているにも関わらず、インデックス作成時はデフォルトのSenTokenizerを使用していたこと。
     インデックス作成時も、手を加えたSenTokenizerを利用するように設定を書き換えることで、期待通りの動きをするようになりました。

    #若干手を加えたSenTokenizerってのは、関口宏司氏のApache Lucene入門に掲載されているものです。

    | | Comments (0) | TrackBack (0)

    2007.03.20

    普通紙FAX

     現在家で使用しているFAXは、インクフィルム(感熱タイプ)を利用する普通紙FAX。6年ほど前に購入。

     昔あったパソコン用の熱転写プリンタ(今もあるのかもしれませんが)は、インクフィルムがなくなっても感熱用紙を使用することにより印刷可能だったのですが、今使っているFAXもそれができたりします。A4サイズの感熱紙を使うと、インクフィルムに印刷内容が残ることもないので、後始末が楽なのですが・・・最近のインクフィルムタイプの普通紙FAXって、感熱紙非対応のものばかりなのですね(涙)。調べた範囲ではP社・N社・S社・S社・B社すべてNG。

     FAXの利用頻度は非常に低い(月に数ページ程度)のと、液晶画面で内容の確認も可能なので、インクフィルムを利用したとしてもコストがかかって仕方がないって訳ではないのですが・・・やはり、インクジェットプリンタと同様、本体を安くしてインクで稼ぐという構造になっているんでしょうか(^^;

     FAX&プリンタの利用頻度が高いのであれば、インクジェット型の複合機もいい感じではあるのですが・・・プリンタも月に数枚印刷する程度の利用頻度。「使わなすぎ」ってのも、かえって選択肢が狭くなってしまいますね(苦笑)。

    | | Comments (0) | TrackBack (0)

    2007.03.19

    Java6でClass.forName(String)

     Java5でGenericsが導入され、それに伴い、Class.forName(String)の部分において、それまでと同じ記述方法だと警告が出るようになってしまいました。

     例えば、Java1.4だと

    Class hogeClass = Class.forName("Hoge");

    Class[] parameters = { Class.forName("java.lang.String") };

    Object[] paramvalue = { aParamvalue };

    Hoge hoge = (Hoge)hogeClass.getConstructor(parameters).newInstance(paramvalue);

    ってな感じで、HogeクラスのHoge(String)コンストラクタを経由して初期化することができていましたが、このままだと型の安全性の点で警告が表示されてしまいます(以下はEclipse3.2(英語版)でのメッセージ)。
    Type safety: The method getConstructor(Class...) belongs to the raw type Class. References to generic type Class<T> should be parameterized

     いろいろと調べてみたところ、たまにっき。にて方法が書かれていました。

    Continue reading "Java6でClass.forName(String)"

    | | Comments (0) | TrackBack (0)

    2007.03.15

    非数(NaN)

     たまたま、処理の都合上0.0d/0が紛れ込み、それをチェックする処理を記述する必要があったのですが・・・

    double hoge = 0.0d;
    double fuga = hoge / 0;
    System.out.println(fuga == Double.NaN);
    なんて処理を記述した場合、得られる結果は期待に反して"false"だったりします。

     んで、DoubleにはisNaN(double)ってメソッドがあるのですが、それのソースを見てみたところ、

    return (引数 != 引数);

    ってなってました。もちろん、上記の例だとSystem.out.println(Double.isNaN(fuga));の結果はtrueとなります。ほ~って感じです(^^;

     しかし、内部的にはどういう風に値を保持しているんでしょうね?? JavaDocによると、Double.NaNは

    Double.longBitsToDouble(0x7ff8000000000000L) によって返される値と同じです。

    ってことだそうですが、このメソッドって、nativeなんですよね。

    | | Comments (0) | TrackBack (0)

    2007.03.12

    java.util.HashMap

     特に深く考えずに非常に多用しているjava.util.HashMapですが、その実装はバージョンとともに変化が生じているようです。
     キーとなるオブジェクトのhashCode()を取得するところまではすべて同じ(というか、そうでなければ何を手がかりに格納するのやら)なのですが、その値をどのように使用するかっていうところでいろいろと変わっているようです(同じバージョンでも、どのベンダー製のものかによって実装が異なるんですね)。

     パフォーマンスとか、Mapに格納する際のキーの衝突頻度などを考慮して、処理が書き換わっているんでしょうかね。

    | | Comments (0) | TrackBack (0)

    2007.03.11

    SubversionとSSLクライアント証明書(2)

     SubversionとSSLクライアント証明書ではTortoiseSVNを使用しましたが、コマンドラインからsvn.exeを用いた場合の話。

     svn.exeでhttps://~に対してアクセスを使用したと場合、

    Authentication realm: https://localhost:8443
    Client certificate filename:

    って表示されるので、使用するSSL証明書(p12ファイル)のパスを入力。続いて、
    Passphrase for '(入力された証明書ファイル)':

    とパスワードの確認メッセージが表示されるので、SSL証明書のパスワードを入力。

     なお、サーバ側の証明書が「信頼された」証明書でない場合(自作証明書の場合は基本的にすべてこれに該当するはず)は、続いて

    Error validating server certificate for 'https://localhost:8443':
    - The certificate is not issued by a trusted authority. Use the
    fingerprint to validate the certificate manually!
    Certificate information:
    - Hostname: wikisrv
    - Valid: (サーバ証明書の有効期間)
    - Issuer: (サーバ証明書に登録されている内容)
    - Fingerprint: (サーバ証明書に登録されている内容)
    (R)eject, accept (t)emporarily or accept (p)ermanently?

    と表示されるので、必要に応じて信頼することとなります。

    Continue reading "SubversionとSSLクライアント証明書(2)"

    | | Comments (0) | TrackBack (0)

    2007.03.10

    SubversionとSSLクライアント証明書

     WebDAVでクライアント証明書を試してみたのですが、ここでSubversion(サーバ&クライアント)+SSLクライアント証明書を組み合わせてみるとどうなるかの実験メモ。

     サーバはApache2.0系列でOpenSSLを用いてCA証明書・サーバ証明書・クライアント証明書を作成。Subversionリポジトリへブラウザからhttpsでアクセスしようとした際にクライアント証明書を確認するダイアログが表示されることを確認。

     とりあえず、これでサーバ側(&証明書)の準備は整ったので、後はSubversionクライアントからアクセスのテスト。使用したクライアントは、svn.exeそのものとTortoiseSVNで、まずはTortoiseSVNから。

    Continue reading "SubversionとSSLクライアント証明書"

    | | Comments (0) | TrackBack (1)

    2007.03.04

    Apache2.2 + Tomcat6.0

     Tomcat6.0のstable版がリリースされました(6.0.10)。ってことで、とりあえずは、Apache2.2との連携のテスト(笑)。
     使用したのは、HunterのサイトからダウンロードしたApache_2.2.3-Openssl_0.9.8d-Win32.zipおよび、Apache Tomcat6 Downloadsからダウンロードした6.0.10のCore Binary Distribution(ZIP版)。なお、Apacheを動かすのにVC7のRuntimeが必要になるので、Hunterのサイトから併せてダウンロード。

     それぞれを展開(VC7のRuntimeはApache2のbinフォルダ内にコピー)して、httpd.confをApache2.2 + Tomcat5.5の時と同様に書き換え。

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

    の部分をコメント解除した状態に。なお、Tomcat6では、jsp-examplesとservlets-examplesがexamplesフォルダにまとめられたので、
    <Location /examples/>
      ProxyPass ajp://localhost:8009/examples/
    </Location>

    ってな感じになります。

    Continue reading "Apache2.2 + Tomcat6.0"

    | | Comments (0) | TrackBack (0)

    2007.03.02

    Randomのランダム具合

     java.util.Randomで整数を生成した場合、どの程度同じ値が出てくる可能性があるのかをテストしてみました。

    java.util.Random random = new java.util.Random();
    java.util.Set set = new java.util.HashSet();
    for (int i=0; i<200000; i++) {
     set.add(Integer.toString(random.nextInt(Integer.MAX_VALUE)));
    }
    System.out.println(set.size());

     0~約21億の間の整数をランダムで20万回発生させた場合、一度も重複する値がなかった場合はset.size()の戻り値としては20万となることが期待できます。
     で、実行してみたところ、199980~199995って感じの結果が得られました(ちなみに、ループ回数を2万に減らしても、2万にならない場合もありました)。ま、0~21億の間の値を「シャッフル」して、順番に値を取得しているというわけではないので、こんなもんでしょうか。

    #もちろん、nextInt(int)の引数の値を大きくするほど、同じ値が発生する率は減少しますが(例えば、この値を1000000等にすると、それなりに重複発生率は上昇します)。

    | | Comments (0) | TrackBack (0)

    « February 2007 | Main | April 2007 »