« January 2007 | Main | March 2007 »

February 2007

2007.02.27

Log4j

 Log4jでこんなことできないかと試行錯誤中・・・。

  • rootLoggerはコンソールとファイルAに出力する
  • あるパッケージは、ファイルAへの出力は行わず、コンソールとファイルBに出力する(ロガーB)

     すべてのロガーの祖先としてrootLoggerがあり、それを継承してしまうためファイルAに出力したくないような場合でも、自動的にファイルAに出力されてしまいます。
     ロガーBで、Appenderを除去しようとしてみたのですが、名前が完全一致していないとそもそもAppenderのリスト自体に上がってこないようで。

    for (Appender app : Collections.<Appender>list(logger.getAllAppenders()) ) {
     System.out.println(app.getName());
    }
    ってやっても、rootLoggerでセットしたAppender情報はロガーBにおいては何も取得できず。

     rootLoggerを何も出力しないようにして、それ以外のパッケージ等をすべて指定するという感じで設定するしかないんですかね?

  • | | Comments (2) | TrackBack (0)

    2007.02.25

    一括自動ダンプ

     リビジョン単位でダンプファイルを作成するにはFORコマンドを使用することで1コマンドでできますが、開始リビジョン・終了リビジョンを意識する必要があるのが難点。

     ってことで、以下のようなのを考えてみました。

    FOR /R .\repos\db\revs %I IN (*)
     DO IF NOT EXIST .\dump\%~nI.dump
     svnadmin dump local --incremental -r %~nI > .\dump\%~nI.dump

    カレントフォルダを基準として、reposフォルダがリポジトリ、dumpフォルダがダンプファイルの格納先。IF NOT EXISTを用いて、対応するリビジョンのdumpファイルが存在しない場合のみsvnadmin dumpコマンドが実行されるようになっています。

     難点は、都度フォルダ内の全ファイルをチェック対象とするため、リビジョンが上がれば上がるほど処理が完了するまでの時間がかかるようになってしまうことでしょうか(^^; まぁ、ファイルの存在チェックならそんなに時間がかかることもないかとは思いますが・・・。

    | | Comments (1) | TrackBack (0)

    2007.02.24

    Subversionのpost-commit hook

    C:\Tools\subversion\bin\svnadmin dump %1 -r %2 --incremental > "C:\Tools\subversion\dump\repos\dump%2.dat"

     ってな感じのバッチファイルを作成し、リポジトリのhooksフォルダ内においておくと、コミットしたタイミングで自動的にそのリビジョンのダンプファイルを出力してくれます。注意点としては、

  • 環境変数はすべてクリアされた状態で起動されるので、普段svnadminにパスを通している場合でも明示的に指定する必要がある
  • バッチファイルの場合、コマンドプロンプトウィンドウが表示される(サーバ(別マシン)にリポジトリを構築している場合は気になりませんが)
    ってことでしょうか。

  • Continue reading "Subversionのpost-commit hook"

    | | Comments (0) | TrackBack (0)

    2007.02.22

    DigestOutputStream

     java.security.DigestOutputStreamのJavaDocにおいて、透明なストリームと記載されていますが、果たして「透明な」というのはどういう意味か? ってことで、試してみました。

    MessageDigest digest = MessageDigest.getInstance("MD5");
    DigestOutputStream dos = new DigestOutputStream(new FileOutputStream("./hoge.txt"), digest);
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(dos, "MS932"));
    writer.write("Hoge");
    writer.flush();
    byte[] b = digest.digest();
    for (int i=0; i<b.length; i++) {
     String s = Integer.toString(b[i] & 0xff, 16);
     if (s.length() == 1) System.out.print("0");
     System.out.print(s);
    }
    System.out.println("");

    Continue reading "DigestOutputStream"

    | | Comments (0) | TrackBack (0)

    2007.02.21

    TimeZone

     偶然、TimeZoneのデフォルト値がAsia/Tokyoになっていない(GMT標準時になっていた)マシンを使う機会がありました。当然ながら、

    System.out.println(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date()));

    なんてやっても、ずれた時刻(9時間前の時刻)が表示されてしまうわけで。

     まぁ、これ自体はjava.text.DateFormat#setTimeZone(java.util.TimeZone)でAsia/Tokyoを指定すればOKなのですが、フォーマッタを作成する毎にsetTimeZoneを行うなんて面倒だなぁ・・・と思っていたら、やはりありました。

    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo"));

    でTimeZoneの初期値をセットしておけば、フォーマッタ作成毎にTimeZoneをセットすることなく、意図する結果を出力することができました。

     ちなみに、

    for (String zone : TimeZone.getAvailableIDs()) {
     System.out.println(zone);
    }

    で、使用可能なタイムゾーンの一覧を取得することが可能です。日本標準時なら、Asia/Tokyoの他にEtc/GMT-9、JST、Japanが使用可能です(Java6の場合。他のバージョンでは結果が異なる可能性があります)。

    | | Comments (0) | TrackBack (0)

    2007.02.20

    .classpathはリポジトリで管理すべきか否か?

     EclipseのソースをSubversion等で管理している場合、果たして.classpathはリポジトリに格納すべきか否か?

     Eclipseそのものの設定が同じであるならば格納すべき・・・というか、逆に、リポジトリで管理できるようにEclipseの基本設定を同じにすべき?
     Eclipseの設定で関係があるとすれば、

  • Eclipseそのものを動作させているJREの違い
  • 各種jarファイルへのパス
    などでしょうか。

     .classpathを含め、このあたりの設定を関係するすべての開発者で共通化しておけば、何らかのライブラリ(jarファイル)を追加したときも、リポジトリと同期させることにより他の環境にも反映させることができます。

     逆に、.classpathを共用しないと割り切って、ライブラリを追加したときはそれぞれの環境で設定するようにするというのも1つの手だとは思います(ただ、jarファイルはリポジトリで管理するようにしておかなければ、人によって異なるバージョンを使ったりするなどの危険が生じてくるので、この部分はリポジトリで管理した方がいいと思いますが)。こうしておくと、最終の成果物に関係のない(個人的な練習・テスト用)ソースを管理の対象外としやすくなりますし。

    #もっとも、練習・テスト用のソースは別のJavaプロジェクトを作成してそちらで作れ、と言われてしまえばそれまでなのですが(^^;

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

    2007.02.19

    複数のコマンドを1行で実行

     今度は1つのコマンドを複数行で記述ではなく、複数のコマンドを1行で実行。

     単に「&」でコマンドを連結すればOK。例えば、

    C:\>dir & dir d:\

    ってやれば、dirコマンドとdir d:\コマンドを続けて実行してくれます。

    #1回の実行に時間のかかるコマンドを続けて実行するような場合に使用? ただ、その場合バッチファイルを作成するという手もありますが(^^;

    | | Comments (0) | TrackBack (0)

    2007.02.18

    Java6でVelocity

     Java6ではScriptエンジンでVelocityを使用できるんですね。
     使用する場合、https://scripting.dev.java.net/からjsr223-engines.zipをダウンロードし、その中に含まれているvelocity-engine.jarにクラスパスを通す必要があります。また、内部でVelocityEngine等の初期化を行っているので、Velocity本体のjarファイルにもクラスパスを通しておく必要があります。

     で、

    ScriptEngineManager m = new ScriptEngineManager();
    ScriptEngine engine = m.getEngineByName("velocity");
    engine.put("value1", "Hoge");
    engine.put("value2", "ほげ");
    StringWriter writer = new StringWriter();
    engine.getContext().setWriter(writer);
    // エンジンに対して,スクリプト(テンプレート)を指定して実行する
    engine.eval("文字列テンプレート\n$value1\n$value2");
    System.out.println(writer);

    ってな感じで実行すればOK。

     engine.eval(java.io.Reader)を使用すれば、任意の入力(あるいはストリーム)を用いてテンプレートを読み込ませることができます。

     ん~~あえて、ScriptEngineを用いてVelocityを使用するメリットはあるんだろうか・・・(^^;

    | | Comments (0) | TrackBack (0)

    2007.02.17

    1つのコマンドを複数行で記述

     何らかのツールをコマンドプロンプトで実行する際、オプションやらパラメータやらで1行が長くなる場合も多々ありますが、ハット「^」を使うことで複数行に分けて記載することができるんですね。

     例えば、svn help logというようなコマンドを実行する場合、

    C:\svn\bin>svn help log

    のような感じで入力しますが、
    C:\svn\bin>svn ^
    More? help ^
    More? log

    ってな感じで入力することも可能です。ちなみに、More? の部分はコマンドプロンプトが自動的に表示される内容です。

     なお、単純に連結されるため、コマンド・オプションの区切りにおいては必要に応じてスペースを入れる必要があります。また、上記の内容はバッチファイルの中においても有効で、「^」の部分において次の行と連結が行われるようです。
     Java6ではクラスパスにワイルドカードを指定することができるようになったためシンプルに記述することができますが、Java5以前でいろいろなjarファイルを必要とする場合や、-Dパラメータ等を多数セットするような場合にバッチファイルの中身を見やすくできるかもしれません。

    #単にキー入力をミスって「^」が末尾に入ったときに「More?」と表示されたので知りました(^^;

    | | Comments (0) | TrackBack (0)

    2007.02.16

    1リビジョン毎のsvnadmin load

     Subversionはコミット・フックスクリプトを利用して、1リビジョン毎のダンプファイルを簡単にかつ自動的に作成することができますが、その場合、リストアするときなどは1ファイルずつsvnadmin loadを行う必要が生じてしまいます。
     1つや2つ程度なら、手作業で1つずつ取り込んでもたいした手間ではありませんが、ファイル数が多くなってくると、非現実的な作業量に(笑)。

     で、コマンドプロンプトからFORを使用することで、サクッと一括処理が可能に。

  • カレントフォルダを基準に、dumpフォルダ内にdump[リビジョン番号].datファイルが格納されている
  • リストア先のリポジトリは、カレントフォルダを基準にreposフォルダである
  • 例えばリビジョン123から1024までを取り込む
  • svnadminにパスが通っている
    となっていた場合、
    FOR /L %I IN (123,1,1024) DO svnadmin load repos < dump\dump%I.dat

    で1つずつ順番にロード実行。
     取り込み対象の開始リビジョン番号、終了リビジョン番号をパラメータ化したバッチファイルを作成しておけば、再利用も容易(開始・終了番号を自動的に判別できれば理想的(何も考えずに実行するだけでOK)なのですが)。

     FOR文を使うことで、既にあるリポジトリの内容を1リビジョン単位でダンプ化することも容易ですね。ただ、最新リビジョンの番号は事前に調べておく必要がありますが。

    FOR /L %I IN (0,1,123) DO svnadmin dump --incremental -r %I:%I repos > dump\dump%I.dat

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

    2007.02.15

    市橋有里選手引退

     シドニー五輪代表の市橋選手引退
     僕も中学~高校時代は陸上部(短距離でしたが)で、年代的に市橋選手とちょうど重なってました(1つ違い)。当時、常に上位に入っていた選手で、高校卒業後もちらほら名前を見かけた選手は市橋選手だけのような・・・(市橋選手は高校から上京したようですが)。

     まぁ、だからどうしたと言われてもあれですが(^^;

     結婚とのことですが、お幸せに(^^)。晩ご飯に創作和食やカフェ飯風なものが出てきたりするんでしょうか(^^;

    | | Comments (0) | TrackBack (0)

    2007.02.14

    Jakarta Commons IO - Null入出力

     Jakarta Commons IOその2。

     NullInputStream/NullReader/NullOutputStream/NullWriter・・・ダミー入出力系のクラスです。OutputStreamやWriterを用いるクラスを使用するけど、何の出力も行いたくないような場合に、NullOutputStreamやNullWriterは有用ですね(OutputStreamWriterでラッピングすると、NullOutputStreamだけで両方の用途を満たせますが)。っていうか、自作したこともあります(笑)。

     何も出力させたくないが、何らかのOutputStreamをセットしないとNullPointerExceptionがスローされるような場合、NullOutputStreamをセットしてあげればOK。まぁ、「何も出力させたくない」(コンソールにも出力させたくない)というようなケースがどの程度あるのかはさておき。

     ちなみに、NullInputStreamやNullReaderはもう少しいろいろな処理が書かれているようです。僕が作ったのは、1回目のread()で-1を戻すものでしたが。0バイトのファイルを読み込むようなイメージですか。Commons IOのNullInputStream等は、指定サイズ分のダミーデータを持ったような感じになっていますね。例えば、指定バイト数だけ中身を0x00で埋め込んだファイルを読み込んでいるような感じですか。

    | | Comments (0) | TrackBack (0)

    2007.02.13

    Agree2007(withATOK2007)

     JUST Suite 2007は泣く泣くあきらめて(キャンセルして)、Agree2007(ATOK 2007セット)を店頭で購入してきました。JustMyShopで購入すると、発送までしばらく時間がかかるようだったので。ATOKがメインとはいえ、プレゼンソフトのAgreeも込みで9000円程度なら・・・ということでAgree2007(ATOK 2007セット)を選択。

     早速Agree2007をインストールしたのですが・・・全然起動してくれない(汗)。何度起動しても、起動直後にアプリケーションエラーで落ちてしまいます。

     で、とりあえずダウンロードページをチェックしてみると、早速アップデートモジュールがリリースされているではないですか。しかも2/9公開って、発売日に修正モジュールリリースですか。修正内容として「特定の環境でAgree 2007が起動できないことがある現象」ってのがありましたが、見事に当てはまっていたようで。修正モジュールを適用すると、無事に起動するようになりました。
     実際の使い勝手等はまた後日。

    | | Comments (0) | TrackBack (0)

    2007.02.12

    Jakarta Commons IO - WildcardFileFilter

     Jakarta Commons IOなるライブラリの存在を知ったので、試してみました(名前の通り、IO関係のライブラリです)。
     ざっくりと、

  • 基本(共通)、その他?(org.apache.commons.io)
  • フィルタ(org.apache.commons.io.filefilter)
  • 入力(org.apache.commons.io.input)
  • 出力(org.apache.commons.io.output)
    の4つに分類できると思われます。

     いろいろと見ていると・・・とりあえず今まで欲しかったけど作ったことがなかった「ワイルドカードを用いたフィルター」があったので使ってみました(正規表現でフィルタリングを行えるフィルターは作ったことがあるのですが)。
     例えば、

    File root = new File("C:\\Temp");
    FileFilter filter = new WildcardFileFilter("*.tmp");
    File[] files = root.listFiles(filter);
    for(File f : files) {
     System.out.println(f.getName());
    }

    で、C:\Tempフォルダ内で、拡張子がtmpであるファイルの一覧を表示することができます(もちろん、拡張子でのチェックなら、endsWithを使うフィルタを作っても実現できますが)。

     注意しなければならないのは、WildcardFileFilterクラスは、辿っていくとjava.io.FileFilterとjava.io.FilenameFilterの2つのインタフェースを実装しているため、root.listFiles(new WildcardFileFilter("*.tmp"));って書いてしまうと、File#listFiles(FileFilter)かFile#listFiles(FilenameFilter)か判断できずにコンパイルエラーが出てしまいます。

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

    2007.02.11

    Ys 20周年

     今年はYsシリーズ20周年なんですね。僕自身はYs初代~WANDERERS FROM Ys(YsIII)まで(と、YsII Eternal)しかプレイしたことがないんですが(^^;、PC88シリーズでプレイしたYsIIは今も印象に残っています。まぁ、だからYsII Eternalも買ったわけですが(笑)。

    #あのオープニング(とそのBGMのTO MAKE THE END OF BATTLE)は圧巻でした。

    | | Comments (0) | TrackBack (0)

    2007.02.10

    ScheduledThreadPool

     Java5で追加された便利なjava.util.concurrentパッケージのクラス群。ある処理を一定のタイミングで繰り返し実行する場合、Java1.4まではjava.util.Timerあるいはjavax.swing.Timerを用いていましたが、前者の場合TimerTaskを継承したクラスを使用する必要がありますし、後者の場合はActionListenerを実装する必要があったり、「固定頻度実行」と「固定遅延実行」(java.util.TimerのJavaDoc中の単語より引用)を切り替えて実行できなかったりしました(もっとも、javax.swing.TimerはGUIに対して安全にアクセスできるというメリットもありますが)。

     ScheduledExecutorServiceを使用すると、Runnableを実装したクラスを使用できるので、処理を記述するクラスの自由度はjava.util.Timerを用いた場合より高まりますし、「固定頻度実行」「固定遅延実行」も簡単に切り替えることができますし。
     ってことで、プールのサイズが2のScheduledThreadPoolを作成し、固定頻度実行・固定遅延実行のスレッドをそれぞれ1つずつ投げ込んで様子を見るテストクラスを作成してみました。

     なお、スレッドプール関係の内容はJava in the BoxConcurrency Utilities その一 非同期処理の巻に詳しく書かれています(自分もそこで勉強しました)。

    Continue reading "ScheduledThreadPool"

    | | Comments (0) | TrackBack (0)

    2007.02.08

    JUST Suite 2007 発売延期

     JUST Suite 2007がインストーラの不具合により発売延期になってしまった模様・・・(涙)。
     さすがに最悪の場合OSが起動しなくなってしまうような不具合だと、延期せざるを得ないんでしょうね。

    #とりあえず、メインの目的はATOKなのですが(^^;

    | | Comments (0) | TrackBack (0)

    2007.02.03

    IE7でwindow.close()

     IE7以降、window.close()を用いて画面をクローズしようとした場合は(仮に親ウィンドウからオープンされている場合でも)必ず確認ダイアログが表示されるようになったようです。

     IE6の場合、親ウィンドウがいなくても、window.openerに値をセットすることでダイアログが表示されるのを回避することができていましたが・・・その技が使えなくなるのはともかくとして(元々そういう動きをすること自体がいいことなのかどうか微妙なところではありましたが)、本当に親ウィンドウがある場合でもダイアログが表示されるようになったのは辛いところ。

     ただ、どうもwindow.open()で開かれたウィンドウに限り、window.close()でダイアログなしで閉じられるようです。もっとも、window.open()を用いた場合、ポップアップブロックの餌食となってしまいますが。
     っていうか、ココログの新規投稿ページのカテゴリー追加や複数カテゴリーの選択ダイアログの動きがちょうどそれですね。とりあえず、ポップアップブロックの除外サイトとしてココログの投稿ページを登録することで回避していますが。

    | | Comments (0) | TrackBack (0)

    « January 2007 | Main | March 2007 »