Sep 12, 2006

[Misc] ADCan

知り合いが ADCan というアフィリエイトサービスを開始したので、ちょっと紹介。 始まったばかりなので登録者数はマダマダの様だけれど、機能的には他のアフィリエイトサービスと遜色ない。 というか、ぱっと見た限りでは後発な分だけ積極的に +α を狙っているだけに面白いサービスだと思う。 アフィリエイトサイトを専門家の視点からどう映るのかは分からないけれど、 個人的には面白いと思うので時間のあるときにでも登録してみてくださいませ m(_ _)m

ちなみに、JavaScript が有効になっていないと動作しない機能もあると思うので要注意。

ADCan
http://adcan.jp/index.jsp
ADCan - はじめての方へ
http://adcan.jp/info/service.jsp
ADCan - よくある質問
http://adcan.jp/info/qa.jsp

ADCan への参加方法

ブログを持っている人であれば簡単に参加できる。


  1. ↑の画像をクリック。
  2. 一通り解説を読む。
  3. 「パートナー新規登録」ボタンを押下する。
  4. ウィザードに従い、必要情報を記入して仮登録を行う。
  5. 「[ADCan] パートナー会員承認用URLのお知らせ」というメールが届くので、「登録確認 URL」にアクセスして本登録を完了する。
  6. トップページから「ログイン」ボタンを押下してログインを行う。
  7. 現在は「コンテンツマッチ」「アフィリエイト」に参加が可能なので、お好きな方を選択してサービスに参加する。
[adcan01]

コンテンツマッチへの参加

  1. ADCan にログインして、「マイページ」に移動する。
  2. メニューバーから「コンテンツマッチ」を選択する。
  3. 「新しいレイアウトを追加する」リンクを押下する。
  4. 「広告種別」「広告サイズ」「色」などを好みに合わせて選択する。
  5. 一通り好みの設定が完了したら、設定内容が反映されたサンプルが画面下に表示されているので表示サンプルを確認する。
  6. サンプルで問題がないようであれば、「設定を保存して広告タグを生成」ボタンを押下する。
  7. 表示された HTML を自分のブログに貼る。
[adcan02]

ちなみに、コンテンツマッチは↓の様な感じになる。



アフィリエイトへの参加

  1. ADCan にログインして、「マイページ」に移動する。
  2. メニューバーから「アフィリエイト」を選択する。
  3. 「アフィリエイトを検索する」リンクを押下する。
  4. 現在選択可能なアフィリエイトのリストが表示されるので、好みのアフィリエイトを選択する。
  5. アフィリエイトを選択したら、「承認申請する」ボタンを押下する。
  6. ボタン押下後、「承認済み」と表示されたらアフィリエイトを使用可能となる。
  7. 「アフィリエイト素材を開く」ボタンを押下して、広告の素材一覧画面を開く。
  8. 好みにあった広告の HTML を選択し、自分のブログに貼る。
[adcan03]

[adcan04]

ちなみに、アフィリエイトは↓の様な感じになる。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 28, 2006

[dotNet] WinFS の終焉

なんと本日付で WinFS の開発終了がアナウンスされた。

WinFS Update
http://blogs.msdn.com/winfs/archive/2006/06/23/644706.aspx
These changes do mean that we are not pursuing a separate delivery of WinFS, including the previously planned Beta 2 release. With most of our effort now working towards productizing mature aspects of the WinFS project into SQL and ADO.NET, we do not need to deliver a separate WinFS offering.


元々は Longhorn (現在の名称は Windows Vista) の目玉機能として宣伝されていたものなのだが、「開発遅延」→「Windows Vistaには搭載されない」と次第に声が小さくなっていた。 そして、ついに開発打ち切り・・・。 何と言うことだ。 WinFS がもたらしてくれるはずだった利便性には期待していただけに残念だ。 WinFS が搭載される可能性が無いのであれば、無駄に重くなるだけの Windows Vista には全く魅力を感じないのだが、私だけだろうか??
元麻布春男の週刊PCホットライン - Microsoft、WinFSの開発中止を表明
http://pc.watch.impress.co.jp/docs/2006/0628/hot434.htm
WinFS Overview
http://www.ntfs.com/winfs_basics.htm

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 26, 2006

[Misc] Live-F1 にチャレンジ

Live-F1 とは

F1 の公式サイトにグランプリの情報をリアルタイムに提供してくれるサービスがある。 デフォルトでは Java のクライアントが必要なのだけれど、Terminal 版のクライアントもあるらしいということを知った。 公式サイトによると、

Live F1 is a native Linux client for viewing the information feed of the official Formula-1 Web site without the need of a Java-enabled browser. It displays the live timing information from the track side during races, qualifying, and practice sessions. An account on formula1.com is still required.
というツールらしい。
Live F1
http://freshmeat.net/projects/live-f1/
The Official Formula 1 Website
http://formula1.com/
2006 British Grand Prix Live Timing
http://www.formula1.com/race/livetiming/758.html
CLIマジック:フォーミュラ1ファンに新しいツール
http://opentechpress.jp/developer/06/06/21/0236254.shtml

Live-F1 deb パッケージ

更に嬉しいことに、有志の方が Live-F1 を deb パッケージ化してくれている。 何とも素晴らしい!!

ということで、deb化してみました。もともと構成がautoconf化されてて単純だし、cdbsを使えば5分足らずでパッケージを作れます。manがないとかいうのはさておき。

    snip...

パッケージ名live-f1。
KeN's GNU/Linux Diary - live-f1パッケージ
http://kmuto.jp/d/index.cgi/debian/live-f1.htm

Live-F1 を試してみる

というわけで、早速 Live-F1 をインストールして遊んでみた。

  1. F1 公式サイトのアカウントを持っていない場合は Live Timing Registration で登録(無料)を行う。
  2. KeN's GNU/Linux Diary さんのこちらから deb パッケージをダウンロードする。ここでは live-f1_0.2.5-2_i386.deb を前提とする。
  3. Live-F1 をインストールする。
    # dpkg -i ./live-f1_0.2.5-2_i386.deb
    Selecting previously deselected package live-f1.
    (Reading database ... 15390 files and directories currently installed.)
    Unpacking live-f1 (from ./live-f1_0.2.5-2_i386.deb) ...
    Setting up live-f1 (0.2.5-2) ...
    
  4. とりあえずバージョンなどを確認してみた。
    # which live-f1
    /usr/bin/live-f1
    
    # live-f1 --version
    live-f1 0.2.5
    Copyright (C) 2006 Scott James Remnant .
    
    This is free software, covered by the GNU General Public License; see the
    source for copying conditions.  There is NO warranty; not even for
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
  5. 起動してみた。
    # live-f1
    live-f1 0.2.5
    Copyright (C) 2006 Scott James Remnant .
    
    This is free software, covered by the GNU General Public License; see the
    source for copying conditions.  There is NO warranty; not even for
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    In order to connect to the Live Timing stream, you need to be registered;
    if you've not yet done so, do so now by filling in the form at the URL:
    http://www.formula1.com/livetiming_registration/
    
    Enter your registered e-mail address: me@example.com
    Enter your registered password:
     P    Name            Gap  Int Time     Sector 1 Sector 2 Sector 3 Ps Lap  70
     1  1 F. ALONSO       LAP   70 1:18.061 21.6     24.7     31.6      2
     2  5 M. SCHUMACHER   2.1  2.1 1:16.605 21.2     24.2     31.0      2
     3  3 K. RAIKKONEN    8.8  6.7 1:20.463 21.8     25.1     33.4      2
     4  2 G. FISICHELLA  15.6  6.8 1:19.077 21.9     24.8     32.2      3
     5  6 F. MASSA       25.1  9.4 1:20.819 22.5     25.4     32.7      1
     6  8 J. TRULLI        1L   1L 1:18.299 21.7     24.9     31.5      2
     7 16 N. HEIDFELD      1L  1.4 1:18.364 21.7     24.7     31.9      2
     8 14 D. COULTHARD     1L  5.8 1:18.298 21.8     24.8     31.5      2
     9 12 J. BUTTON        1L  2.1 1:18.976 22.2     24.7     32.0      2
    10 21 S. SPEED         1L  0.4 1:18.925 22.2     24.9     31.6      2
    11 15 C. KLIEN         1L  4.2 1:20.455 22.3     25.4     32.6      2
    12  9 M. WEBBER        1L  5.8 1:23.858 24.4     26.7     32.6      2
    13 20 V. LIUZZI        2L   1L 1:20.887 22.5     25.8     32.4      3
    14 18 T. MONTEIRO      4L   2L 1:23.602 23.4     27.6     32.4      3
    15 22 T. SATO          6L   2L          23.0     STOP               3
       17 J. VILLENEUVE   12L   6L          22.2     STOP               2
        7 R. SCHUMACHER   12L      RETIRED  24.6 L51 25.7 L57           6
        4 J. MONTOYA      57L  45L          STOP                        1
       11 R. BARRICHELLO  59L   2L RETIRED                              1
       23 F. MONTAGNY     68L   9L          26.0     59.7     STOP      1
       10 N. ROSBERG      69L   1L          STOP
       19 C. ALBERS                                  27.1     STOP              0
    

Live-F1 + ttyrec

今日のなんでやねんさんのところで ttyrec というツールが紹介されていた。 公式サイトによると、以下の様なものらしい。

ttyrec は tty を録画します。録画したデータは付属の ttyplayコ マンドで再生できます。ttyrec は script コマンドにマイクロ秒 単位で時間情報を埋め込む機能を追加しただけの代物です。emacs -nw でも vi でも lynx でも tty 上で動くプログラムなら何でも 録画できます。
で、ttyrec と Live-F1 でレースの状況を録画しておくことができるそうだ。 live-f1パッケージ によると、
今気付いたんだが,コレをttyrecで録画しとけばlive timingの録画で出来るんじゃないの? ということで,今晩のカナダを録画してみよう.

    snip...

追記4: おぉ,ちゃんとttyplayで再生できる!
とのこと。楽しそう。 今週末(2006/07/02)のアメリカグランプリで試してみよう。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 25, 2006

[WebService] Weather Hacks 発見!!

以前から天気予報を Web サービスで提供してくれるサイトが無いものかと思っていた。 しばらく前に調べたときには下記の様な情報に行き当たって結局諦めたのだが、現在では少し状況が変わっている様だ。

Web屋のネタ帳 - 天気予報をXMLで提供すると気象庁が発表してから半年が経った
http://neta.ywcafe.net/000484.html
Web屋のネタ帳 - 天気予報のXMLはFTPでGETできる。ただし月額10万円超
http://neta.ywcafe.net/000497.html
Web屋のネタ帳 - もしも天気予報がXMLだったら − その1 XMLとは?
http://neta.ywcafe.net/000338.html
Web屋のネタ帳 - もしも天気予報がXMLだったら − その2 できない理由
http://neta.ywcafe.net/000339.html
今回もう一度調べてみたところ、どうやら livedoor が天気予報のデータを XML で配信してくれているらしいということが分かった。 やるな!! livedoor。 Web サービスというより、単に XML がダウンロードできるだけなのだけれど、これでも十分便利。 位置情報とマッピングしてくれるサービスが提供されると、より使い出があるのだけれど。 今後の発展に期待!!
Weather Hacks
http://weather.livedoor.com/weather_hacks/rss_feed_list.html

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 24, 2006

[Misc] オープンソースの SNS

オープンソースの SNS を調べてみた。 色々探してみたが、結局 2 つしか引っかからなかった。 他にもいくつか情報は存在するのだが、既に消滅していたり、そもそも一度もリリースされた形跡がなかったり。

SNS は人を集めてナンボのシステムなのでオープンソースには不向きなのかもしれない。

プロダクト名 サイト ライセンス 動作環境 DBMS
OpenPNE http://docs.openpne.jp/ GPL 2.0 / Commercial License PHP(4.3.*/5.0以降) MySQL(4.0/4.1以降)
Affelio http://open.affelio.jp/ GPL 2.0 / Commercial License Perl(5.6以降) SQLite / MySQL(4.1以降)

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 23, 2006

[Misc] コメントスパムが酷い(2)

とりあえず、スパマーの IP アドレスからの接続を拒否することにした。 httpd.conf を編集して接続を拒否する。

Order allow,deny
allow from all
deny from 195.225.176.73
deny from 195.225.176.77
deny from 195.225.177.90
deny from 85.255.117.250
これでしばらく経過観察にしよう。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 22, 2006

[Misc] コメントスパムが酷い

ここ 1 ヶ月ほど、コメントスパムが極端に酷くなった。 何パターンが存在しているのだけれど、その中でも特にたちの悪いものを調べてみた。

スパマーA - 195.225.176.73

最もたちの悪いのがこれ。 195.225.176.73、195.225.176.77、195.225.177.90 という 3 つの IP アドレスを使用してコメントスパムを送りつけてくる。 通数がやたらと多く、コメントのサイズも巨大なので非常に迷惑。 whois によると

inetnum:      195.225.176.0 - 195.225.179.255
netname:      NETCATHOST
descr:        NetcatHosting
country:      UA
admin-c:      VS1142-RIPE
tech-c:       VS1142-RIPE
status:       ASSIGNED PI
mnt-by:       RIPE-NCC-HM-PI-MNT
mnt-lower:    RIPE-NCC-HM-PI-MNT
mnt-by:       NETCATHOST-MNT
mnt-routes:   NETCATHOST-MNT
source:       RIPE # Filtered
remarks:      ****************************************
remarks:      * Abuse contacts: abuse@netcathost.com *
remarks:      ****************************************

person:       Vsevolod Stetsinsky
address:      01110, Ukraine, Kiev, 20チ, Solomenskaya street. room 206.
phone:        +38 050 6226676
e-mail:       vs@netcathost.com
nic-hdl:      VS1142-RIPE
source:       RIPE # Filtered
というネットワークを使用している。

スパマーB - 85.255.117.250

次にたちの悪いのがこれ。 85.255.117.250 という IP アドレスを使用している。

inetnum:        85.255.112.0 - 85.255.127.255
netname:        inhoster
descr:          Inhoster hosting company
descr:          OOO Inhoster, Poltavskij Shliax 24, Kharkiv, 61000, Ukraine
remarks:        -----------------------------------
remarks:        Abuse notifications to: abuse@inhoster.com
remarks:        Network problems to: noc@inhoster.com
remarks:        Peering requests to: peering@inhoster.com
remarks:        -----------------------------------
country:        UA
org:            ORG-EST1-RIPE
admin-c:        AK4026-RIPE
tech-c:         AK4026-RIPE
tech-c:         FWHS1-RIPE
status:         ASSIGNED PI
mnt-by:         RIPE-NCC-HM-PI-MNT
mnt-lower:      RIPE-NCC-HM-PI-MNT
mnt-by:         RECIT-MNT
mnt-routes:     RECIT-MNT
mnt-domains:    RECIT-MNT
mnt-by:         DAV-MNT
mnt-routes:     DAV-MNT
mnt-domains:    DAV-MNT
source:         RIPE # Filtered

organisation:   ORG-EST1-RIPE
org-name:       INHOSTER
org-type:       NON-REGISTRY
remarks:        *************************************
remarks:        * Abuse contacts: abuse@inhoster.com *
remarks:        *************************************
address:        OOO Inhoster
address:        Poltavskij Shliax 24, Xarkov,
address:        61000, Ukraine
phone:          +38 066 4633621
e-mail:         support@inhoster.com
admin-c:        AK4026-RIPE
tech-c:         AK4026-RIPE
mnt-ref:        DAV-MNT
mnt-by:         DAV-MNT
source:         RIPE # Filtered

person:         Andrei Kislizin
address:        OOO Inhoster,
address:        ul.Antonova 5, Kiev,
address:        03186, Ukraine
phone:          +38 044 2404332
nic-hdl:        AK4026-RIPE
source:         RIPE # Filtered

person:       Fast Web Hosting Support
address:      01110, Ukraine, Kiev, 20チ, Solomenskaya street. room 201.
address:      UA
phone:        +357 99 117759
e-mail:       support@fwebhost.com
nic-hdl:      FWHS1-RIPE
source:       RIPE # Filtered

気づいたこと

スパマーA、スパマーB 共に

01110, Ukraine, Kiev, 20チ, Solomenskaya street.
が関係している。 ワルモノはここに在住??

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 21, 2006

[Maven] pom.xml の pom / organization / name は折り返してはいけない。

唐突に Maven2 でよく分からないエラーが発生するようになってしまった。 Maven2 の依存解決時に JAR ファイルのヘッダがおかしいと言われてビルドに失敗してしまうというもの。

[INFO] [compiler:compile]
Compiling 50 source files to C:\myproject\myapp\target\classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

Failure executing javac, but could not parse the error:
エラー: C:\Documents and Settings\me\.m2\repository\myproject\1.0.0\myapp-1.0.0
.jar の読み込みエラーです。invalid header field
エラー 1 個


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Wed Jun 21 16:57:35 JST 2006
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------

結局、原因は pom.xml の pom / organization / name のコンテンツが折り返されていたことだった。 Eclipse WST の XML エディタで無意識にオートフォーマットをかけてしまっていたらしい。 なんだかものすごく deja vu を感じたので昔のエントリを見返してみると・・・「Maven2 で API Document を生成する方法」にメモしてあった orz 2 度も同じミスでハマってしまった。 今回は忘れないようにちゃんとエラー内容もメモしておく。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 20, 2006

[Mustang] Derby in Mustang にチャレンジ

色々なところで話題になっているようだが、Derby が Mustang に同梱されるらしい。 公式には Java DB という DBMS が搭載されるということだが、Java DB のサイトには

What's Java DB?

Java DB is Sun's supported distribution of the open source Apache Derby 100% Java technology database. It is fully transactional, secure, easy-to-use, standards-based -- SQL, JDBC API, and Java EE -- yet small, only 2MB. The Apache Derby project has a strong and growing community that includes developers from large companies such as Sun Microsystems and IBM as well as individual contributors.
と記述されているので、Java DB == Derby ということだろう。

ユニットテストやプロトタイプ開発時など「とりあえず何でもいいから DBMS が欲しい」というときに Derby を結構使うので同梱してくれるのは多少嬉しい。 ・・・ Maven2 使っていれば別に同梱してくれなくてもすぐ使えるけれど。
Java DB is bundled in Mustang
http://weblogs.java.net/blog/davidvc/archive/2006/06/java_db_is_bund.html
Java DB
http://developers.sun.com/prodtech/javadb

Derby in Mustang のインストール

早速 Java Platform, Standard Edition 6 Binary Snapshot Releases から jdk-6-rc-bin-b88-windows-i586-15_jun_2006.exe をダウンロードしてインストールしてみた。 インストールされた J2SE SDK を見てみると、%JAVA_HOME%\db に Derby がそのまま同梱されていることが分かる。

>tree /f C:\_java\jdk\1.6.0_15_jun_2006\db
C:\_JAVA\JDK\1.6.0_15_JUN_2006\DB
│  3RDPARTY
│  CHANGES
│  COPYRIGHT
│  LICENSE
│  NOTICE
├─demo
│  ├─databases ... snip
│  └─programs ... snip
├─frameworks
│  │  readme.html
│  ├─embedded
│  │  │  readme.html
│  │  └─bin
│  │          dblook.bat
│  │          dblook.ksh
│  │          ij.bat
│  │          ij.ksh
│  │          setEmbeddedCP.bat
│  │          setEmbeddedCP.ksh
│  │          sysinfo.bat
│  │          sysinfo.ksh
│  └─NetworkServer
│      │  readme.html
│      └─bin
│              dblook.bat
│              dblook.ksh
│              ij.bat
│              ij.ksh
│              NetworkServerControl.bat
│              NetworkServerControl.ksh
│              setNetworkClientCP.bat
│              setNetworkClientCP.ksh
│              setNetworkServerCP.bat
│              setNetworkServerCP.ksh
│              startNetworkServer.bat
│              startNetworkServer.ksh
│              stopNetworkServer.bat
│              stopNetworkServer.ksh
│              sysinfo.bat
│              sysinfo.ksh
└─lib
        derby.jar
        derby.war
        derbyclient.jar
        derbyLocale_de_DE.jar
        derbyLocale_es.jar
        derbyLocale_fr.jar
        derbyLocale_it.jar
        derbyLocale_ja_JP.jar
        derbyLocale_ko_KR.jar
        derbyLocale_pt_BR.jar
        derbyLocale_zh_CN.jar
        derbyLocale_zh_TW.jar
        derbynet.jar
        derbyrun.jar
        derbytools.jar

Derby in Mustang を使ってみる

環境設定

Mustang 内の Derby を実行するには、JAVA_HOME、DERBY_HOME という環境変数を指定する必要がある。 これら環境変数を指定した後で、DERBY_HOME の中にある環境設定用バッチファイルを実行する。 今回は Embedded モードを使用した。

> set JAVA_HOME=c:\_java\jdk\1.6.0_15_jun_2006
> set DERBY_HOME=%JAVA_HOME%\db
> set PATH=%JAVA_HOME%\bin;%PATH%
> %DERBY_HOME%\frameworks\embedded\bin\setEmbeddedCp.bat

SET DERBY_HOME=c:\_java\jdk\161730~1.0_1\db

set CLASSPATH=c:\_java\jdk\161730~1.0_1\db\lib
\derby.jar;c:\_java\jdk\161730~1.0_1\db\lib\derbytools.jar;.;C:\Program Files\Ja
va\jre1.5.0_06\lib\ext\QTJava.zip

環境確認

Derby の情報を確認するための sysinfo.bat というバッチファイルが用意されているので実行してみた。

> java -version
java version "1.6.0-rc"
Java(TM) SE Runtime Environment (build 1.6.0-rc-b88)
Java HotSpot(TM) Client VM (build 1.6.0-rc-b88, mixed mode, sharing)

> %DERBY_HOME%\frameworks\embedded\bin\sysinfo.bat
------------------ Java 情報 ------------------
Java バージョン:       1.6.0-rc
Java ベンダー:         Sun Microsystems Inc.
Java ホーム:           c:\_java\jdk\1.6.0_15_jun_2006\jre
Java クラスパス:       c:\_java\jdk\161730~1.0_1\db\lib\derby.jar;c:\_java\jdk\1
61730~1.0_1\db\lib\derbytools.jar;.;C:\Program Files\Java\jre1.5.0_06\lib\ext\QT
Java.zip
OS 名:                 Windows XP
OS アーキテクチャー:   x86
OS バージョン:         5.1
Java ユーザー名:       me
Java ユーザー・ホーム: C:\Documents and Settings\me
Java ユーザー dir:     C:\Hoge
java.specification.name: Java Platform API Specification
java.specification.version: 1.6
--------- Derby 情報 --------
JRE - JDBC: ?-?
[C:\_java\jdk\1.6.0_15_jun_2006\db\lib\derby.jar] 10.2.0.3 alpha - (412448:41244
9)
[C:\_java\jdk\1.6.0_15_jun_2006\db\lib\derbytools.jar] 10.2.0.3 alpha - (412448:
412449)
------------------------------------------------------
----------------- ロケール情報 ----------------
現行ロケール :  [日本語/日本 [ja_JP]]
ロケールのサポートが見つかりました: [de_DE]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [es]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [fr]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [it]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [ja_JP]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [ko_KR]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [pt_BR]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [zh_CN]
         バージョン: 10.2.0.3 alpha - (412448:412449)
ロケールのサポートが見つかりました: [zh_TW]
         バージョン: 10.2.0.3 alpha - (412448:412449)
------------------------------------------------------

サンプルコード実行

以前作成した Embedded モード Derby 用のサンプルコードを実行してみた。

> java jp.in_vitro.codelets.mustang.javadb.Codelet
field01=100, field02=dummy data
field01=888, field02=hogehoge
Derby システムがシャットダウンされました。 : 50000

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 19, 2006

[WebService] YouTube API にチャレンジ

YouTube とは

YouTube はビデオ共有サービスらしい。 しばらく前から話題になっていて気にはなっていたのだが、なかなか使ってみる機会がなかった。 調べてみたら API が公開されているということだったので、とりあえず API だけ遊んでみることにした。

YouTube
http://www.youtube.com/
Developer APIs
http://www.youtube.com/dev

試してみる

YouTube API を使用するには、YouTube のアカウントが必要。 まずは YouTube アカウント作成から行ってみた。

  1. YouTube SignUp から YouTube のアカウントを作成。
  2. developer profile で Developer ID を取得。

User Profile の取得

YouTube API は REST を採用している。 User Profile は下記の URL にアクセスすることで取得できる。

http://www.youtube.com/api2_rest?method=youtube.users.get_profile&dev_id=[Developer ID]&user=[プロファイルを取得したいユーザID]

<?xml version="1.0" encoding="utf-8"?>

<ut_response status="ok">
  <user_profile>
    <first_name />
    <last_name />
    <about_me />
    <age>55</age>
    <video_upload_count>0</video_upload_count>
    <video_watch_count>0</video_watch_count>
    <homepage />
    <hometown />
    <gender>m</gender>
    <occupations />
    <companies />
    <city />
    <country>JP</country>
    <books />
    <hobbies />
    <movies />
    <relationship />
    <friend_count>0</friend_count>
    <favorite_video_count>0</favorite_video_count>
    <currently_on>true</currently_on>
  </user_profile>
</ut_response>

Vide リストを取得

YouTube では Video にタグ付けができるらしい。 現在(2006/06/19) の YouTube API では Video リストはタグ単位、ユーザ単位で取得できる。 とりあえず "cat" というタグのついた Video リストを取得してみた。 URL は下記の通り。

http://www.youtube.com/api2_rest?method=youtube.videos.list_by_tag&dev_id=[Developer ID]&tag=cat

<?xml version="1.0" encoding="utf-8"?>

<ut_response status="ok">
  <video_list>
    <video>
      <author />
      <id>HsNYrJDwguo</id>
      <title>cat</title>
      <length_seconds>183</length_seconds>
      <rating_avg>3.46</rating_avg>
      <rating_count>54</rating_count>
      <description>cat</description>
      <view_count>51380</view_count>
      <upload_time>1145383314</upload_time>
      <comment_count>33</comment_count>
      <tags>cat</tags>
      <url>http://www.youtube.com/?v=HsNYrJDwguo</url>
      <thumbnail_url>http://sjl-static6.sjl.youtube.com/vi/HsNYrJDwguo/2.jpg</thumbnail_url>
    </video>

    snip...

  </video_list>
</ut_response>

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 18, 2006

[Library] JChart2D にチャレンジ

JChart2D とは

JChart2D はチャートを生成してくれる Java 用のライブラリ。 LGPL で提供されている。

JChart2D
http://jchart2d.sourceforge.net/
demo
http://jchart2d.sourceforge.net/applet.shtml

実行環境準備

  1. こちら から JChart2D をダウンロードする。ここでは jchart2d-2.0.0.jar を前提とする。
  2. jchart2d-2.0.0.jar をクラスパスに追加する。

サンプルコード

JChart2D を使用して JPEG のチャートを生成するサンプルを作成してみた。 残念なことに、ウィンドウを表示しない状態での動作は実現できなかった。 というわけで、X Window System がインストールされていない等でウィンドウ描画ができない環境では実行できない。 何か方法があるのだろうか・・・。

package jp.in_vitro.codelets.jchart2d;

import info.monitorenter.gui.chart.Chart2D;
import info.monitorenter.gui.chart.ITrace2D;
import info.monitorenter.gui.chart.traces.Trace2DSimple;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Codelet {

    public Codelet() {
        super();
    }

    protected void execute() throws IOException {
        Chart2D chart = new Chart2D();
        ITrace2D trace = new Trace2DSimple();
        Random random = new Random();
        for (int i = 100; i >= 0; i--) {
            trace.addPoint(i, random.nextDouble() * 10.0 + i);
        }
        chart.addTrace(trace);
        chart.setSize(640, 480);
        chart.setPaintLabels(true);

        JFrame frame = new JFrame();
        frame.setSize(640, 480);
        frame.add(chart);
        frame.setVisible(true);

        BufferedImage image = chart.snapShot();

        frame.setVisible(false);
        frame.dispose();

        ImageIO.write(image, "JPEG", new File("c:\\chart.jpg"));
    }

    public static void main(String[] args) throws IOException {
        Codelet me = new Codelet();
        me.execute();
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 17, 2006

[Misc] プロジェクト jdk-api-ja に参加してみる

jdk-api-ja プロジェクトで Mustang の日本語ドキュメントの精度を高めよう、という活動を行っているらしいということを知った。 日本語ドキュメントは当然日本人のためのものだから、やはり日本人が貢献すべきだろう。 どこまで貢献できるか分からないがとりあえず参加はしておくことに。

プロジェクト jdk-api-ja
https://jdk-api-ja.dev.java.net/ja/index.html
プロジェクトの概要は以下の通り。
プロジェクト jdk-api-ja へようこそ! このプロジェクトは JDK ドキュメントの日本語翻訳の品質向上を目指します。現在、 java.sun.com において、API 仕様を含め JDK ユーザードキュメントの日本語翻訳が提供されています。一方で、Sun はこれらのドキュメントについてユーザ様からバグ報告や、改善のご提案を頂いており、それらを基に定期的に修正を行っています。本プロジェクトではこのプロセスをよりオープンなものにし、リリース前の翻訳に関しても皆様からのフィードバックを取り入れるなど、さらなる日本語翻訳の品質向上を目指します。日本語ドキュメントユーザの皆様、是非ご参加下さい。

なお、プロジェクトの性質上基本的には日本語で運営させて頂きます。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 15, 2006

[Misc] 日本標準 NTP スタート!!

かねてからの願いであった日本標準 NTP がスタートしたらしい。 管理してくれるのは独立行政法人・情報通信研究機構(NICT)。 独立行政法人がこういうサービスをしてくれるのは本当に有り難い。 SourceForgeやApacheのミラーサーバなんかももっと国内でやって欲しいな。

世界最高性能のインターネット用時刻同期サーバによる日本標準時配信の開始
http://www2.nict.go.jp/pub/whatsnew/press/h18/060612-1/060612-1.html
世界最高性能のNTPサーバ、NICTが新設
http://www.itmedia.co.jp/news/articles/0606/12/news068.html

NTP サーバの情報

NTP サーバの情報を見てみた。 IPv6 のアドレスも持っている様だ。

# nslookup
> server ns1.nict.jp
Default Server:  ns1.nict.jp
Address:  133.243.3.1

> set type=A
> ntp.nict.jp
Server:  ns1.nict.jp
Address:  133.243.3.1

Name:    ntp.nict.jp
Addresses:  133.243.238.163, 133.243.238.164, 133.243.238.243, 133.243.238.244

> set type=AAAA
> ntp.nict.jp
Server:  ns1.nict.jp
Address:  133.243.3.1

ntp.nict.jp     AAAA IPv6 address = 2001:2f8:29::fff3
ntp.nict.jp     AAAA IPv6 address = 2001:2f8:29::fff4
nict.jp nameserver = ns1.nict.jp
nict.jp nameserver = ns2.nict.jp
ns1.nict.jp     internet address = 133.243.3.1
ns2.nict.jp     internet address = 133.243.3.2

>

NTP サーバに接続してみる

とりあえず試しに接続してみた。 ntpdate で同期してみただけなのだけれど。

# /etc/init.d/ntp-server stop
Stopping NTP server: ntpd.
# ntpdate 133.243.238.163
14 Jun 16:21:53 ntpdate[32251]: adjust time server 133.243.238.163 offset -0.078740 sec

自動的に時刻同期をする場合、/etc/ntp.conf を編集する。

# vi /etc/ntp.conf
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 14, 2006

[Trac] Trac にチャレンジ(5)

カスタムレポートの作成

Trac はバグや TODO、その他 issue などを Ticket として管理する。 レポート機能を使用することで Ticket の一覧画面を簡単にカスタマイズできる。 例えば、「バージョンが 1.0.0 の Ticket 全て」「マイルストーン MS_001 の Ticket の内クローズされていないもの」といった画面を作成できる。 レポートは非常に便利な機能なので、自前の Report 作成にチャレンジしてみた。

カスタムレポートの作成方法

カスタムレポートの作成方法は Trac のヘルプに記述されている。
Trac Reports
https://www.in-vitro.jp/projects/wiki/TracReports
Trac Permissions
https://www.in-vitro.jp/projects/wiki/TracPermissions

アカウントにレポート生成権限を付与

デフォルト状態のアカウントはレポート生成権限を持っていない。 そのため、trac-admin コマンドを使用してレポート生成権限を与える。

# trac-admin /tmp/trac/myprojects permission add me REPORT_CREATE
ちなみに、レポート関連の権限には REPORT_VIEW, REPORT_CREATE, REPORT_MODIFY, REPORT_DELETE, REPORT_ADMIN, REPORT_SQL_VIEW がある。 REPORT_CREATE を付与するついでに REPORT_MODIFY を付与しておくと、デフォルトで用意されているレポートの定義情報を見られるようになる。

レポートの作成

REPORT_CREATE 権限を所有しているアカウントでログインすると、"View Tickets" 画面に "New Report" というリンクが表示される。 "New Report" からレポート生成画面に移動し、Report Title、Description、SQL Query for Report を入力するとレポートが生成される。 今回は特定のコンポーネント用の Ticket を表示するレポートを作成してみた。 作成した、とは言ってもほとんどデフォルトで用意されているレポートの Copy & Paste。

Active Tickets by Component [MyComponent]

SELECT p.value AS __color__,
   t.milestone AS __group__,
   (CASE status 
      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;'
      ELSE 
        (CASE owner WHEN '$USER' THEN 'font-weight: bold' END)
    END) AS __style__,
   id AS ticket, summary, component, status, 
   resolution,version, severity, priority, owner,
   changetime AS modified,
   time AS _time,reporter AS _reporter
  FROM ticket t,enum p
  WHERE status IN ('new', 'assigned', 'reopened') AND 
        p.name=t.priority AND p.type='priority' AND
        component='MyComponent'
  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 
        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC
All Tickets By Component[MyComponent]  (Including closed)

SELECT p.value AS __color__,
   t.milestone AS __group__,
   (CASE status 
      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;'
      ELSE 
        (CASE owner WHEN '$USER' THEN 'font-weight: bold' END)
    END) AS __style__,
   id AS ticket, summary, component, status, 
   resolution,version, severity, priority, owner,
   changetime AS modified,
   time AS _time,reporter AS _reporter
  FROM ticket t,enum p
  WHERE p.name=t.priority AND p.type='priority' AND
        component='MyComponent'
  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 
        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 13, 2006

[Book] Java EE 5.0 本(少しだけ)続々

先日 EJB3 の書籍を調べてみたので、Java EE 5.0 関連書籍も調べてみた。 こちらは EJB3 程出版されない様だ。 J2EE(Java EE) も枯れてきたということなのか。 少し寂しい。

EJB 3.0 関連書籍

2005/10 発売


Beginning Java EE 5 From Novice to Professional

2006/05 発売


Pro Java EE 5 Performance Management and Optimization

2006/10 発売


Apache Geronimo Java EE 5 Development and Deployment

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 12, 2006

[WebService] Flickr API にチャレンジ

Flickr API とは

Flickr は写真を共有するサービスを提供しているサイト。 API 経由で写真の検索などができる。

Flickr
http://www.flickr.com/
Flickr Services
http://www.flickr.com/services/api/

試してみる

  1. こちらから Flickr のアカウントを取得する。
  2. こちらから API application key を取得する。
  3. http://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=[Your API application key]&text=[Query] にアクセスする。

実行結果

http://www.flickr.com/services/rest/?method=flickr.photos.search&api_key=[My API application key]&text=dr+strangelove にアクセスした結果がこちら↓

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<photos page="1" pages="2" perpage="100" total="167">
	<photo id="159653118" owner="14441184@N00" secret="4137e632d9" server="51" title="Dr_Strangelove" ispublic="1" isfriend="0" isfamily="0" />
	<photo id="157381443" owner="84949728@N00" secret="6dd9524b53" server="48" title="Riding the Fire Hydrant" ispublic="1" isfriend="0" isfamily="0" />
	<photo id="152649730" owner="91264084@N00" secret="e8a2ad03da" server="54" title="dr_strangelove" ispublic="1" isfriend="0" isfamily="0" />

  ...略

</photos>
</rsp>
上記の XML には URL が含まれていないのでそのままでは写真を取得することができない。 ID から URL へのマッピングルールは以下に記述されている。
Photo URLs
http://www.flickr.com/services/api/misc.urls.html

API Explorer

Flickr は Web インターフェースから API をコールできる API Explorer というアプリケーションを提供している。 ちょっと試してみるには非常に便利。

写真検索用 API をコールする API Explorer
http://www.flickr.com/services/api/explore/?method=flickr.photos.search

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 11, 2006

[WebService] Technorati API にチャレンジ

Technorati API とは

Technorati は Blog 検索サービスを提供しているサイト。 Search や Browse といった照会系の API を提供してくれているので、試してみた。

Technorati
http://www.technorati.com/
Developer Center
http://www.technorati.com/developers/
Technorati API Documentation
http://www.technorati.com/developers/api/

試してみる

  1. こちらで Technorati のアカウントを取得する。
  2. 生成したアカウントでサインインする。
  3. こちらに ApiKey が表示されるのでメモ。
  4. http://api.technorati.com/search?key=[Your ApiKey]&query=[Query] にアクセスして検索を行ってみる。

実行結果

http://api.technorati.com/search?key=[My ApiKey]&query=star+wars にアクセスした結果がこちら↓

<?xml version="1.0" encoding="utf-8"?>
<!-- generator="Technorati API version 1.0 /search" -->
<!DOCTYPE tapi PUBLIC "-//Technorati, Inc.//DTD TAPI 0.02//EN" "http://api.technorati.com/dtd/tapi-002.xml">
<tapi version="1.0">
<document>
<result>
    <query>star wars</query>
    <querycount>647413</querycount>
    <rankingstart>0</rankingstart>
</result>
<item>
<weblog>
<name>The Truth Shall Make Ye Fret</name>
<url>http://kingandy.livejournal.com</url>
<rssurl></rssurl>
<atomurl>http://kingandy.livejournal.com/data/atom</atomurl>
<inboundblogs>1</inboundblogs>
<inboundlinks>2</inboundlinks>
<lastupdate>2006-06-06 12:20:43 GMT</lastupdate>
</weblog>
<title>The Truth Shall Make Ye Fret</title>
<excerpt>So I've found the link at the bottom of the Penny Arcade front page that permalinks to the most recent comic. You are no longer safe from my linkage. Why the new Star Wars original trilogy DVDs are a crappy rip</excerpt>
<created>2006-06-08 08:49:22 GMT</created>
<permalink>http://kingandy.livejournal.com/388241.html</permalink>
</item>

  ...略

</document>
</tapi>

現在提供されている API

2006/06/11 現在、以下の API が提供されている。

Search
  • cosmos ・・・ Blogs linking to a given URL.
  • search ・・・ Blog posts featuring a given keyword or phrase.
  • tag ・・・ Blog posts tagged with a specific topic.
Browse
  • toptags ・・・ Top tags indexed by Technorati.
Blog information
  • bloginfo ・・・ Information about a specific blog URL such as link counts, rank, and available feeds.
  • blogposttags ・・・ The top tags used by a specific blog.
Member Information
  • getinfo ・・・ Information about a Technorati member such as full name and other blogs by the same author.

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 10, 2006

[Trac] Trac にチャレンジ(4)

Ticket のフィールドをカスタマイズする

Ticket にはデフォルトで Summary、Component、Version などいくつかのフィールドが用意されている。 また、デフォルトのフィールドでは不足の際はカスタムフィールドを追加することができる。 ということで、カスタムフィールドの追加にチャレンジ。

Custom Ticket Fields
http://projects.edgewall.com/trac/wiki/TracTicketsCustomFields

カスタムフィールドに関する設定は /tmp/trac/myprojects/conf/trac.ini で行う。 今回は Ticket の種類 (Memo、Bug、Todo) を指定する select 型のフィールドを追加してみる。
[ticket-custom]
ticket_type = select
ticket_type.label = Type
ticket_type.options = Memo|Bug|Todo
ticket_type.value = 0

[カスタムフィールドが追加された Ticket]

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 09, 2006

[Misc] GanttProject にチャレンジ

GanttProject とは

GanttProject は、名前の通りプロジェクトをガントチャートで管理するツール。 フリーの Microsoft Project といったところか。 機能的には Microsoft Project の方が高機能だけれど、個人的にはこれで十分な気がする。 Java で開発されているのでプラットフォームを選ばず実行できる、Java Web Start で実行することができる(但し、その場合は PDF によるエクスポートができない)、多言語対応で日本語にも対応しているなど嬉しい点が結構ある。

GanttProject
http://ganttproject.sourceforge.net/index.php
Demo
http://ganttproject.sf.net/demo/demo.html
Run (Java Web Start)
http://ganttproject.sf.net/jws/ganttproject.jnlp
Trac の Ticket や Milestone と GanttProject が連携できないものかと思っていたら、同じ事を考えている人がいた。
Weekbuild の Hack 倉庫 - ガントチャートとマイルストーン
http://weekbuild.sakura.ne.jp/trac/ticket/49
ただ、残念なことにまだ実現はされていない模様。

GanttProject を Java Web Start から起動してみた。 デフォルトの Locale を見てくれているらしく、起動直後から日本語で表示された。

[Gantt View] [Role View]

ちなみに、担当者を作成する前に 編集 > 設定 > 担当者の役割 でロールを設定する必要がある。 ロールを指定せずに担当者を生成すると担当者タブを選択できなくなる(バグ??)。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 08, 2006

[Misc] \\?\ の効用

Windows では \\?\ を使用すると通常許されない名前のディレクトリやファイルを作成できるということを教えてもらった。 \\?\ に続けてフルパスを指定すると、半角ドット(.)で終わるファイルやディレクトリを作成できるらしい。 というわけで、早速チャレンジ。

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:58    <DIR>          .
2006/06/04  01:58    <DIR>          ..

C:\tmp>md dummy

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:58    <DIR>          .
2006/06/04  01:58    <DIR>          ..
2006/06/04  01:58    <DIR>          dummy

C:\tmp>rd dummy

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:59    <DIR>          .
2006/06/04  01:59    <DIR>          ..

C:\tmp>md dummy.

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:59    <DIR>          .
2006/06/04  01:59    <DIR>          ..
2006/06/04  01:59    <DIR>          dummy

C:\tmp>rd dummy.

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:59    <DIR>          .
2006/06/04  01:59    <DIR>          ..

C:\tmp>md \\?\c:\tmp\dummy.

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  01:59    <DIR>          .
2006/06/04  01:59    <DIR>          ..
2006/06/04  01:59    <DIR>          dummy.

C:\tmp>dir dummy.
 C:\tmp のディレクトリ

ファイルが見つかりません

C:\tmp>dir \\?\c:\tmp\dummy.
 \\?\c:\tmp\dummy のディレクトリ

ファイルが見つかりません

C:\tmp>rd dummy.
指定されたファイルが見つかりません。

C:\tmp>rd c:\tmp\dummy.
指定されたファイルが見つかりません。

C:\tmp>rd \\?\c:\tmp\dummy.

C:\tmp>dir
 C:\tmp のディレクトリ

2006/06/04  02:01    <DIR>          .
2006/06/04  02:01    <DIR>          ..

C:\tmp>

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 07, 2006

[Misc] Eclipse Update Site のミラーサイトを作成する

Eclipse 3.x では Software Update 機能が提供され、プラグインのインストールが楽になった。 ただし、この機能、当然作業の度に Update Site に接続する必要がある。 大人数で一度に環境を整えたり、ネットワークの帯域が不足していたり、サーバが落ちていたりするとプラグインのインストールが延々終わらなかったりする。 プロジェクトの開始時にプラグインのインストールが出来ないと困るので、プロジェクトローカルの Update Site を準備してみた。

Subclipse Update Site の構築

Subversion Client Plugin である Subclipse の Update Site を用意する。 Subclipse は、Update Site をそのままアーカイビングしたファイルを提供してくれている。 そのため、Update Site の構築は非常に楽。

  1. こちらから Update Site のアーカイブをダウンロードする。(ここでは site-1.0.1.zip を前提とする)
  2. Apache 経由でアクセスできる位置にアーカイブを展開する。
    # mkdir /var/www/eclipse-plugins/subclipse
    # cd /var/www/eclipse-plugins/subclipse
    # unzip ./site-1.0.1.zip
    Archive:  ./site-1.0.1.zip
       creating: features/
      inflating: features/org.tigris.subversion.subclipse_1.0.1.jar
       creating: plugins/
      inflating: plugins/org.tigris.subversion.javahl.win32_1.0.0.jar
      inflating: plugins/org.tigris.subversion.subclipse.core_1.0.1.jar
      inflating: plugins/org.tigris.subversion.subclipse.ui_1.0.1.jar
      inflating: plugins/org.tigris.subversion.subclipse_1.0.1.jar
      inflating: site.xml
    # ls
    features  plugins  site-1.0.1.zip  site.xml
    # chown -R www-data:www-data .
    
  3. Eclipse の Software Update で http://www.example.com/eclipse-plugins/subclipse/ (URL はアーカイブの展開先に合わせる) を指定してみる。プラグインが見えれば OK。

Maven 2.0 integration plugin Update Site の構築

Maven2 用の Eclipse Plugin の Update Site を用意する。 Maven2.0 integration plugin は残念ながら Update Site 用ファイルのアーカイブは提供されていない。 そのため、必要となるファイルを集めて Update Site を作成する。

  1. こちらから site.xml をダウンロードする。
  2. こちらから Plugin の jar ファイルをダウンロードする。(ここでは org.maven.ide.eclipse.feature_0.0.9.jar を前提とする)
  3. site.xml を編集する。 全バージョンをミラーリングするのであれば編集は不要。 今回はプロジェクトで使用するバージョンだけをミラーリングするので、その他バージョンに関する記述を削除する。
    <?xml version="1.0" encoding="UTF-8"?>
    <site>
       <feature url="features/org.maven.ide.eclipse.feature_0.0.9.jar" id="org.maven.ide.eclipse.feature" version="0.0.9">
          <category name="Maven 2.0 integration"/>
       </feature>
       <category-def name="Maven 2.0 integration" label="org.maven.ide.eclipse"/>
    </site>
    
  4. Update Site 用にディレクトリ構成を作成し、ファイルを設置する。
    /var/www/eclipse-plugins/maven2/
      ├ features/
      │  └ org.maven.ide.eclipse.feature_0.0.9.jar
      └ site.xml
    
  5. Eclipse の Software Update で http://www.example.com/eclipse-plugins/maven2/ (URL は上記で作成したディレクトリに合わせる) を指定してみる。プラグインが見えれば OK。

本格的に Eclipse Update Site のミラーサイトを構築する

ネットワークやマシンの問題で私には無理ではあるけれど、公開用 Eclipse Update Site のミラーサイトを構築することもできる。

Re: [eclipse-mirrors] Eclipse update site mirror
http://dev.eclipse.org/mhonarc/lists/eclipse-mirrors/msg00151.html
Simply add this RSYNC line to your script:

rsync -rtlv --delete download.eclipse.org::eclipseMirror/eclipse/updates/ /path/to/eclipse.org mirror/eclipse/updates/


I will be looking for your Update content at this URL:
http://eclipse.gabriel.co.hu/eclipse/updates/3.1/site.xml

When you are synced, please let me know and I'll add you to the Updates list.

自作 Plugin 用 Update Site の構築

当然ながら、自作 Plugin 用 Update Site を構築することもできる。

FAQ How do I create an update site (site.xml)?
http://wiki.eclipse.org/index.php/FAQ_How_do_I_create_an_update_site_(site.xml)%3F

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 06, 2006

[Book] EJB 3.0 本続々

2006/05/11 に EJB 3.0 Specification の Final Release が公開された。 書籍の方も続々と出版されてきている。 そろそろ書籍を買い揃える時期か。

Enterprise JavaBeans Technology
http://java.sun.com/products/ejb/
JSR-000220 Enterprise JavaBeans 3.0 (Final Release)
http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html

EJB 3.0 関連書籍

2006/05 発売


Ejb 3.0 in a Nutshell A Desktop Quick Reference for Ejb 3.0


Pro EJB 3 Java Persistence API (Pro)


Enterprise Javabeans 3.0

2006/07 発売


Mastering Enterprise Javabeans 3.0


Beginning Ejb 3 (Beginning from Novice to Professional)

2006/09 発売


Sams Teach Yourself Ejb 3.0 in 24 Hours

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 05, 2006

[Library] JDiff にチャレンジ

JDiff とは

JDiff はプロジェクトのバージョン間で API の diff を取るツール。 カスタム Doclet として提供され、新旧 API Document の比較を行い、比較結果の API Document を生成する。 ソースコードではなく、API の比較というのは目新しいので試してみた。

JDiff
http://sourceforge.net/projects/javadiff/

サンプルの実行

サンプルは Ant から実行できる。 JDK、Ant にパスを通して Ant を実行する。 ↓の例では JDiff のバージョンを確認するために JDiff にもパスを通している。

>set JAVA_HOME=c:\_java\jdk\1.5.0_06
>set PATH=%JAVA_HOME%\bin;%PATH%
>set ANT_HOME=c:\_java\tool\ant\1.6.4
>set PATH=%ANT_HOME%\bin;%PATH%
>set JDIFF_HOME=c:\_java\tool\jdiff\1.0.10
>set PATH=%JDIFF_HOME%\bin;%PATH%
>java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

>ant -version
Apache Ant version 1.6.4 compiled on May 19 2005

>jdiff -version
JDiff version: 1.0.10

>cd c:\_java\tool\jdiff\1.0.10\examples

>ant
Buildfile: build.xml

init:

create_javadoc_dirs:

javadoc_old:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] パッケージ com.acme.sp のソースファイルを読み込んでいます...
  [javadoc] パッケージ com.acme.util のソースファイルを読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] 標準 Doclet バージョン 1.5.0_06

  ...略

javadoc_new:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] パッケージ com.acme.sp のソースファイルを読み込んでいます...
  [javadoc] パッケージ com.acme.spextra のソースファイルを読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] 標準 Doclet バージョン 1.5.0_06

  ...略

jdiff_old_api:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] パッケージ com.acme.sp のソースファイルを読み込んでいます...
  [javadoc] パッケージ com.acme.util のソースファイルを読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] JDiff: doclet started ...
  [javadoc] JDiff: writing the API to file 'SuperProduct_1.0.xml'...
  [javadoc] JDiff: finished (took 0s, not including scanning the source files).

jdiff_new_api:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] パッケージ com.acme.sp のソースファイルを読み込んでいます...
  [javadoc] パッケージ com.acme.spextra のソースファイルを読み込んでいます...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] JDiff: doclet started ...
  [javadoc] JDiff: writing the API to file 'SuperProduct_2.0.xml'...
  [javadoc] JDiff: finished (took 0s, not including scanning the source files).

jdiff_compare_apis:
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] ソースファイル C:\_java\tool\jdiff\1.0.10\lib\Null.java を読み込んで
います...
  [javadoc] Javadoc 情報を構築しています...
  [javadoc] JDiff: doclet started ...
  [javadoc] JDiff: reading the old API in from file 'SuperProduct_1.0.xml'... fi
nished
  [javadoc] JDiff: reading the new API in from file 'SuperProduct_2.0.xml'... fi
nished
  [javadoc] JDiff: comparing the old and new APIs ...
  [javadoc]  Approximately 64% difference between the APIs
  [javadoc] JDiff: reading the comments in from file 'C:\_java\tool\jdiff\1.0.10
\examples\sample_output\newdocs\user_comments_for_SuperProduct_1.0_to_SuperProdu
ct_2.0.xml'...
  [javadoc] JDiff: generating HTML report into the file 'C:\_java\tool\jdiff\1.0
.10\examples\sample_output\newdocs\changes.html' and the subdirectory 'C:\_java\
tool\jdiff\1.0.10\examples\sample_output\newdocs\changes'
  [javadoc] JDiff: writing the comments out to file 'C:\_java\tool\jdiff\1.0.10\
examples\sample_output\newdocs\user_comments_for_SuperProduct_1.0_to_SuperProduc
t_2.0.xml'...
  [javadoc] JDiff: finished (took 0s).

jdiff:

BUILD SUCCESSFUL
Total time: 14 seconds
>
Ant プロセス終了後、file:///C:/_java/tool/jdiff/1.0.10/examples/sample_output/newdocs/changes.html にアクセスする。

[JDiff 生成結果(1)] [JDiff 生成結果(2)]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 04, 2006

[Blosxom] SimpleAPI その1. にチャレンジ(2)

SimpleAPI その1. 用の Blosxom プラグインを作成してみた。 %BLOSXOM_HOME%/plugins/siteimg に保存して、Story 内で [[siteimg:<URL>]] と記述するだけ。

SimpleAPI その1. 用 Blosxom プラグイン

プラグインのソースは下記の通り。 ZIP アーカイブでダウンロードする場合は こちら

# Blosxom Plugin: siteimg
# Author: in-vitro.jp
# Version: 1.0.0
# License: GPL

# Autoattach
#
# Usage Examples:
#  [[siteimg:http://www.in-vitro.jp]]

package siteimg;

###############################################################
# Configuration Section

$simpleapi1_url  = "http://img.simpleapi.net/small/";

###############################################################


sub start {
  1;
}


sub story {
  my ($pkg, $path, $filename, $story_ref, $title_ref, $body_ref) = @_;

  $$body_ref =~ s/\[\[siteimg:(.+)\]\]/ <a href="$1\"><img src="$simpleapi1_url$1" width="128" height="128" border="0"><br>$1<\/a>/gs;

  1;
}

1;

こんな感じで表示される。

http://www.in-vitro.jp/blog/index.cgi

Posted in Blosxom | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 03, 2006

[WebService] SimpleAPI その1. にチャレンジ

SimpleAPI その1. ウェブサイトサムネイル作成API β版 というサービスを見つけた。 URL を渡すとページのサムネイル画像を返してくれる。 なかなか面白そうなので試してみた。

SimpleAPI
http://img.simpleapi.net/

このサイトのサムネイル画像


<a href="http://www.in-vitro.jp/blog/index.cgi"> <img src="http://img.simpleapi.net/small/http://www.in-vitro.jp/blog/index.cgi" alt="" width="128" height="128" hspace="4" vspace="4" border="0"> </a>
Blosxom 用の plugin でも作ってみようかな。

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 02, 2006

[Trac] Trac にチャレンジ(3)

マクロの追加

Trac built-in Wiki 用のマクロを追加してみた。 マクロは以下で公開されている。

MacroBazaar
http://projects.edgewall.com/trac/wiki/MacroBazaar
TracHacks - plugin
http://trac-hacks.org/wiki/plugin
今回追加したマクロは以下の通り。
Javadoc
http://projects.edgewall.com/trac/wiki/MacroBazaar#Javadoc
AddComment
http://trac-hacks.org/wiki/AddCommentMacro
TOC
http://trac-hacks.org/wiki/TocMacro
マクロは *.py をサイトからダウンロードしてきて、/tmp/trac/myprojects/wiki-macros (パスは環境毎に異なる)にコピーするだけで良い。 PukiWiki や Hiki などと同じ感覚で大丈夫。

Milestone を Google Calendar に表示する

Trac は Roadmap を iCalendar 用データファイルとしてエクスポートする機能を持っている。 このデータファイルには、Milestone やチケットの情報が含まれている。 都合の良いことに、Google Calendar は iCalendar のデータファイルをインポートする機能を持っている。 というわけで、Trac の Roadmap 情報を Google Calendar にインポートできるか試してみた。

Milestone の作成

まず Milestone を作成する。 先日試した様に trac-admin を使用する。 Milestone を作成する際には、必ず完了期日を指定する。 Google Calendar では完了期日の指定されていない Milestone は表示されない。

# trac-admin /tmp/trac/myprojects milestone add MyMilestone "Jun 18, 2006"
ちなみに、完了期日の設定されていない Milestone に完了期日を設定する場合は
# trac-admin /tmp/trac/myprojects milestone time MyMilestone "Jun 18, 2006"
という様に、"add" コマンドの代わりに "time" コマンドを使用する。

Roadmap のエクスポート

Roadmap ページに行くと、"Download in other formats: iCalendar" というリンクがある。 ここをクリックすると Roadmap の情報がエクスポートされる。

Google Calendar にインポート

Google Calendar の "settings" から "Import Calendar" タブを選択する。 先ほどエクスポートしたデータファイルを選択し、インポート先のカレンダーを指定。 "Import" ボタンを押下するとデータがインポートされる。

[データファイルのインポート] [インポート完了]
[インポートされた Milestone] [Milestone の詳細情報]

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 01, 2006

[Book] フリーで公開されている Java 関連書籍リスト

何となく集めていたフリーで公開されている Java 関連書籍を整理してみた。 古いものが大半だけれど、まだ情報源にできる書籍もそこそこある。 今となってはどこから集めたのか分からないので出典は掲載しない(というか、できない)。


Essentials of the Java Programming Language
http://www.computer-books.us/ja...
http://www.computer-books.us/ja...

Java AWT Reference
http://www.wuppy.net.ru/books/Orel...

Java Language Reference
http://www.wuppy.net.ru/books/Orell...

Java Web Services Tutorial
http://www.computer-books.us/java_...

JDK 1.4 Tutorial
http://muhammad.home.cern.ch/muhamm...

Thinking in Java, 3rd ed
http://jamesthornton.com/eckel/TIJ...

Introduction to Programming Using Java, Fourth Edition
http://math.hws.edu/javanotes/cont...

Core Servlets & JSP
http://pdf.coreservlets.com/

Processing XML with Java
http://www.cafeconleche.org/books/...

Apache Jakarta Commons
http://www.phptr.com/content/images...

JDBC API Tutorial and Reference, Second Edition
http://java.sun.com/j2se/1.4.2/docs...

The Java Virtual Machine Specification Second Edition
http://java.sun.com/docs/books/vms...

Data Structures and Algorithms with Object-Oriented Design Patterns in Java
http://www.brpreiss.com/books/opus...

Java Look and Feel Design Guidelines
http://java.sun.com/products/jlf/ed...

The Java Native Interface Programmer's Guide and Specification
http://java.sun.com/docs/books/jni/h...

Designing Enterprise Applications with the J2EE Platform, Second Edition
http://java.sun.com/blueprints/guid...

Java Security
http://www.goldfish.org/books/O'Rei...

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 31, 2006

[Misc] 攻撃?? 研究?? 調査??

ありがちな脆弱性をねらったアクセスが来ていた。 Perl などで発生しやすい OS コマンドインジェクションを狙ったもの。

HotFix Report - OSコマンド・インジェクション(OS command injection)
http://www.hotfix.jp/archives/word/2004/word04-18.html
セキュリティガイドライン - 4. OSコマンドインジェクション
http://www.e-3lab.com/security_guideline/index.html#os
目的が分からないので、「一応ログはチェックしてるよ」ということをアピールしておく。
********************** - - [30/May/2006:10:56:18 +0900] "GET /blog/index.cgi/Web
Service/20051218_01.htm|ls%20-la| HTTP/1.1" 200 5857 "-" "Mozilla/4.0 (compatibl
e; MSIE 6.0; Windows NT 5.1)"
アクセス元が某国内有名研究所関連の組織なので、さすがにクラックするつもりではないと思うけれど。 調査・研究目的であっても、外部サーバに対して脆弱性を突く(可能性のある) URL を流すなら事前に教えて欲しい。 攻撃なのか調査・研究なのかはアクセスされた方では判断できないから。

・・・と個人的には思うが、人によって判断の分かれるところだろう。 面倒で一々連絡していられるか、ということかもしれない(^^;

とりあえず、怖いので攻撃は勘弁してくださいませ m(_ _)m > ALL

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 30, 2006

[Trac] Trac にチャレンジ(2)

Trac の動作環境が整ったので、実際に使用できるようにプロジェクトの初期設定を行う。 プロジェクトにはコンポーネントやマイルストーンなどの初期値が設定されている。 初期値をそのまま使うことはないので、初期値を削除して実際に使用する値をセットする。 この作業はコマンドラインから trac-admin コマンドを実行して行う。

TracAdmin
http://projects.edgewall.com/trac/wiki/TracAdmin

component の設定

コンポーネントの初期値は component1, component2 となっている。 さすがに component1 という名前のコンポーネントを作成することはないだろう。 ということで、これを削除して新しいコンポーネントを追加する。

# trac-admin /tmp/trac/myprojects component list

Name        Owner
--------------------
component1  somebody
component2  somebody

# trac-admin /tmp/trac/myprojects component remove component1
# trac-admin /tmp/trac/myprojects component remove component2
# trac-admin /tmp/trac/myprojects component list

Name  Owner
-----------

# trac-admin /tmp/trac/myprojects component add MyComponent me
# trac-admin /tmp/trac/myprojects component list

Name            Owner
---------------------
MyComponent     me

#

version の設定

# trac-admin /tmp/trac/myprojects version list

Name  Time
----------

1.0
2.0

# trac-admin /tmp/trac/myprojects version remove 1.0
# trac-admin /tmp/trac/myprojects version remove 2.0
# trac-admin /tmp/trac/myprojects version list

Name  Time
----------

# trac-admin /tmp/trac/myprojects version add 1.0.0
# trac-admin /tmp/trac/myprojects version list

Name   Time
-----------

1.0.0

#

milestone の設定

# trac-admin /tmp/trac/myprojects milestone list

Name        Time
----------------

milestone1
milestone2
milestone3
milestone4

# trac-admin /tmp/trac/myprojects milestone remove milestone1
# trac-admin /tmp/trac/myprojects milestone remove milestone2
# trac-admin /tmp/trac/myprojects milestone remove milestone3
# trac-admin /tmp/trac/myprojects milestone remove milestone4
# trac-admin /tmp/trac/myprojects milestone list

Name  Time
----------

#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 29, 2006

[Trac] Trac にチャレンジ

Trac とは

Trac は Web インターフェースの Wiki + BugTracker + Subversion Viewer。 聞くところによると結構便利らしい。 WebSVN をインストールしようかと思っていたのだけれど、どうせなら BugTracker も一緒に欲しいということで Trac にしてみた。

Trac
http://www.edgewall.com/trac/
The Trac Configuration File
http://projects.edgewall.com/trac/wiki/TracIni

Trac のインストールや設定は以下のサイトを参考にさせていただいた。多謝。 (参考というより、指示通りに作業しただけ・・・)
鷹の島 - Trac をインストールしてみたよ
http://espion.just-size.jp/archives/05/297225719.html
[trac] default_charset
http://zippo.taiyo.co.jp/~gotoh/diary/?200502a&to=200502023#200502023

Trac のインストール

Trac を Debian Sarge にインストールしたときのメモ。 Debian では apt で Trac をインストールできる。便利。 Trac 本体と Python でマルチバイトを扱うライブラリをインストールする。

# apt-get install trac
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libsqlite0 python python-clearsilver python-sqlite python2.3
  python2.3-clearsilver python2.3-sqlite python2.3-subversion
Suggested packages:
  python-doc python-tk python-profiler python2.3-doc python2.3-profiler
  enscript python-docutils
Recommended packages:
  python2.3-iconvcodec python2.3-cjkcodecs python2.3-japanese-codecs
  python-egenix-mxdatetime
The following NEW packages will be installed:
  libsqlite0 python python-clearsilver python-sqlite python2.3
  python2.3-clearsilver python2.3-sqlite python2.3-subversion trac
0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
Need to get 4654kB of archives.
After unpacking 15.7MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://www.jp.debian.org sarge/main libsqlite0 2.8.16-1 [176kB]
Get:2 http://www.jp.debian.org sarge/main python2.3 2.3.5-3sarge1 [2906kB]
Get:3 http://www.jp.debian.org sarge/main python 2.3.5-2 [127kB]
Get:4 http://www.jp.debian.org sarge/main python2.3-clearsilver 0.9.13-3.2 [81.0kB]
Get:5 http://www.jp.debian.org sarge/main python-clearsilver 0.9.13-3.2 [4820B]
Get:6 http://www.jp.debian.org sarge/main python2.3-sqlite 1.0.1-2 [29.1kB]
Get:7 http://www.jp.debian.org sarge/main python-sqlite 1.0.1-2 [2608B]
Get:8 http://www.jp.debian.org sarge/main python2.3-subversion 1.1.4-2 [1130kB]
Get:9 http://www.jp.debian.org sarge/main trac 0.8.1-3sarge4 [199kB]
Fetched 4654kB in 22s (209kB/s)
Preconfiguring packages ...

 ...略
# apt-get install python2.3-japanese-codecs
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  python2.3-japanese-codecs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 273kB of archives.
After unpacking 1237kB of additional disk space will be used.
Get:1 http://www.jp.debian.org sarge/main python2.3-japanese-codecs 1.4.9-3 [273kB]
Fetched 273kB in 1s (241kB/s)
Selecting previously deselected package python2.3-japanese-codecs.
(Reading database ... 15287 files and directories currently installed.)
Unpacking python2.3-japanese-codecs (from .../python2.3-japanese-codecs_1.4.9-3_i386.deb) ...
Setting up python2.3-japanese-codecs (1.4.9-3) ...
#

Trac の設定

Trac プロジェクトの作成

# mkdir /tmp/trac
# cd /tmp/trac
# trac-admin myprojects initenv
Creating a new Trac environment at /tmp/trac/myprojects

Trac will first ask a few questions about your environment
in order to initalize and prepare the project database.

 Please enter the name of your project.
 This name will be used in page titles and descriptions.

Project Name [My Project]> my projects

 Please specify the absolute path to the project Subversion repository.
 Repository must be local, and trac-admin requires read+write
 permission to initialize the Trac database.

Path to repository [/var/svn/test]> /var/svn/svndb

 Please enter location of Trac page templates.
 Default is the location of the site-wide templates installed with Trac.

Templates directory [/usr/share/trac/templates]>
Creating and Initializing Project
 Inserting default data
 Configuring Project
  trac.repository_dir

  ...略

Congratulations!

# chown -R www-data:www-data /tmp/trac

Trac と Apache2 の連携

私の環境では、Trac のメインの用途は Subversion に対する Web インターフェースとなる。 そのため、Trac も Subversion と同一のユーザを使用することにした。 また、アクセス元制限もついでにかけておくことに。

# cat /etc/apache2/sites-available/trac
Alias /trac "/usr/share/trac/htdocs/"
ScriptAlias /proj "/usr/share/trac/cgi-bin/trac.cgi"

<Location "/proj">
  SetEnv TRAC_ENV "/tmp/trac/myprojects"

  SSLRequireSSL

  AuthType Basic
  AuthName "please login"
  AuthUserFile /var/svn/svndb/.svnpasswd
  Require valid-user

  order allow,deny
  allow from 192.168.1.
</Location>

<Location "/trac">
  SSLRequireSSL

  AuthType Basic
  AuthName "please login"
  AuthUserFile /var/svn/svndb/.svnpasswd
  Require valid-user

  order allow,deny
  allow from 192.168.1.
</Location>

# a2ensite trac
Site trac installed; run /etc/init.d/apache2 reload to enable.
# /etc/init.d/apache2 reload
Reloading web server config...done.cts"
# 

Trac の設定

Trac 画面のヘッダ、フッタを設定する。 Subversion 内のファイルの文字エンコーディングも設定する。

# cat /tmp/trac/myprojects/conf/trac.ini
[header_logo]
src = trac_banner.png
alt = my projects
height = 73
link = https://www.example.com/proj
width = 236

[trac]
default_charset = japanese.shift_jis
  ...略
#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 28, 2006

[Library] JasperReports にチャレンジ

JasperReports とは

JasperReports はオープンソースの帳票ソリューション。 帳票印刷、PDF 生成はもちろんのこと、HTML、XLS、CSV、XML の生成が可能。 帳票のデザイナもオープンソースで提供されている、なかなかの優れもの。

JasperReports
http://jasperreports.sourceforge.net/index.html
Tutorial
http://jasperreports.sourceforge.net/tutorial/index.html
GUI Tools
http://jasperreports.sourceforge.net/tools.html
License
http://jasperreports.sourceforge.net/license.html

サンプル実行

実行環境準備

サンプルの実行には JDK、Ant が必要。

>set JAVA_HOME=c:\_java\jdk\1.5.0_06
>set ANT_HOME=c:\_java\tool\ant\1.6.4
>set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%PATH%

>java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

>ant -version
Apache Ant version 1.6.4 compiled on May 19 2005
>cd .\jasperreports-1.2.2\demo\samples\csvdatasource

csvdatasource サンプルの実行

>ant clean javac compile fill pdf
Buildfile: build.xml

clean:

javac:
    [javac] Compiling 1 source file to C:\jasperreports-1.2.2\demo\samples\csvda
tasource
    [javac] 注: C:\jasperreports-1.2.2\demo\samples\csvdatasource\CsvDataSourceA
pp.java の操作は、未チェ
ックまたは安全ではありません。
    [javac] 注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイ
ルしてください。

compile:
      [jrc] Compiling 1 report design files.
      [jrc] File : C:\jasperreports-1.2.2\demo\samples\csvdatasource\CsvDataSourc
eReport.jrxml ... OK.

fill:
     [java] Filling time : 1641

pdf:
     [java] PDF creation time : 1312

BUILD SUCCESSFUL
Total time: 8 seconds

fonts サンプルの実行

>ant clean javac compile fill pdf
Buildfile: build.xml

clean:

javac:
    [javac] Compiling 1 source file to C:\jasperreports-1.2.2\demo\samples\fonts
    [javac] 注: C:\jasperreports-1.2.2\demo\samples\fonts\FontsApp.java の操作は
、未チェックまたは安全ではありません。
    [javac] 注: 詳細については、-Xlint:unchecked オプションを指定して再コンパイ
ルしてください。

compile:
      [jrc] Compiling 1 report design files.
      [jrc] File : C:\jasperreports-1.2.2\demo\samples\fonts\FontsReport.jrxml .
.. OK.

fill:
     [java] Filling time : 2187

pdf:
     [java] PDF creation time : 2250

BUILD SUCCESSFUL
Total time: 10 seconds

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 27, 2006

[Maven] pom.xml で entity reference が使えない理由

pom.xml では entity reference が使用できない。 使えないのは実際に試した結果から知っていたが、理由が分からなかった。 ようやく使えない理由が書かれたドキュメントを見つけたのでメモ。 Maven 1.x の FAQ なのだけれど、Maven 2.x でも同様の理由で使えなくなっているのだろう。 使えると非常に便利なのだけれど、機構的に仕方がないといったところか。

Apache Maven 1.x Frequently Asked Questions
http://maven.apache.org/maven-1.x/faq.html#using-entities
Q. What's the problem with entities in project.xml?

A. As of Maven 1.1, external entities will not be enabled by default in project.xml, and their use is discouraged in Maven 1.0.x as well. There will still be the ability to use them, but it will have to be enabled.

There are several reasons for this, but the main reason is that the content of project.xml needs to be completely self-contained and and able to be reproduced from a history at any point in time.

For this reason, using Jelly expressions other than ${pom.*} references is also not recommended and likely to be unsupported in future.

The most common use of this technique is to manage dependencies across multiple projects. You should strongly consider using inheritence for this purpose.

Note: special character entities will always be supported and should not have any current issues.

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 26, 2006

[Maven] Maven2 のバージョンを自動チェックする方法

Maven2 の実行時に Maven2 のバージョンを自動チェックすることができる。 例えば、2.0.3 以前の Maven2 が使用された場合はビルドを強制的に失敗させる、といったことが可能。 ビルドプロセスが Maven2 のバージョンに依存することは少ないと思うけれど、大規模プロジェクトではこの機能を使っておくと安心できそう。

設定方法

pom.xml の project/prerequisites/maven でバージョンを指定する。

<project>
	<prerequisites>
		<maven>2.0.4</maven>
	</prerequisites>
</project>
詳細な設定方法は以下を参照のこと。
Project Descriptor - Prerequisites
http://maven.apache.org/ref/current/maven-model/maven.html#class_prerequisites

動作例

project/prerequisites/maven に 2.0.5 を指定した状態で、2.0.4 を使用してビルドすると下記の様にビルドに失敗する。

>mvn --version
Maven version: 2.0.4

>mvn clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Unable to build project 'C:\MyProject\pom.xml; it requires Maven version
 2.0.5
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu May 25 19:09:36 JST 2006
[INFO] Final Memory: 1M/2M
[INFO] ------------------------------------------------------------------------

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 25, 2006

[Misc] 公開サーバに用意すべきメールアドレス

公開サーバで用意すべきメールアドレスが RFC2142 で規定されている。

RFC2142 - MAILBOX NAMES FOR COMMON SERVICES, ROLES AND FUNCTIONS
http://www.ietf.org/rfc/rfc2142.txt
RFC2142 - 一般的なサービス、役割、機能に対するメールボックス名
http://rfc-jp.nic.ad.jp/rfc-jp/RFC2142-JP.txt

RFC 2142 で規定されているメールアドレス

RFC 2142 ではビジネス関連、ネットワーク運用関連、インターネットサービス関連の 3 種類のメールアドレスが規定されている。

   BUSINESS-RELATED MAILBOX NAMES

   MAILBOX        AREA                USAGE
   -----------    ----------------    ---------------------------
   INFO           Marketing           Packaged information about the
                                      organization, products, and/or
                                      services, as appropriate
   MARKETING      Marketing           Product marketing and
                                      marketing communications
   SALES          Sales               Product purchase information
   SUPPORT        Customer Service    Problems with product or
                                      service

   NETWORK OPERATIONS MAILBOX NAMES

   MAILBOX        AREA                USAGE
   -----------    ----------------    ---------------------------
   ABUSE          Customer Relations  Inappropriate public behaviour
   NOC            Network Operations  Network infrastructure
   SECURITY       Network Security    Security bulletins or queries

   SUPPORT MAILBOX NAMES FOR SPECIFIC INTERNET SERVICES

   MAILBOX        SERVICE             SPECIFICATIONS
   -----------    ----------------    ---------------------------
   POSTMASTER     SMTP                [RFC821], [RFC822]
   HOSTMASTER     DNS                 [RFC1033-RFC1035]
   USENET         NNTP                [RFC977]
   NEWS           NNTP                Synonym for USENET
   WEBMASTER      HTTP                [RFC 2068]
   WWW            HTTP                Synonym for WEBMASTER
   UUCP           UUCP                [RFC976]
   FTP            FTP                 [RFC959]

要するに

自宅サーバの様な小規模公開サイトの場合、POSTMASTER、HOSTMASTER、WEBMASTER、WWW を用意すればよさそう。 ビジネス関連のサービスを提供する場合は更に INFO、MARKETING、SALES、SUPPORT も必要か。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 24, 2006

[Misc] 開発環境における環境変数の設定

Windows における環境変数にはスコープの違いによりシステム環境変数、ユーザ環境変数、一時的な環境変数の 3 種類の環境変数がある。

システム環境変数
システムのすべてのユーザーに適用される環境変数
ユーザ環境変数
それぞれのユーザーごとに異なる環境変数
一時的な環境変数
特定の CMD プロセス内でのみ有効な環境変数
開発をしていて驚くのが、何でもかんでもシステム環境変数を変更しようとする人が結構いること。 環境変数を設定するという目的からすると別に構わないのだけれど、安全性を考えると余り好ましくない。

環境変数の設定指針

チームメンバへの説明をするときのために設定指針をまとめておく。

1. システム環境変数を変更しない

特にパスやパスに類する環境変数(JAVA_HOMEなど)はシステム環境変数として設定すべきではない。 システム環境変数は新規にソフトウェアをインストールする際に、インストーラに変更されてしまうことがあることを考慮しないといけない。 例えば、Oracle Database Server をインストールするとシステム環境変数の PATH の先頭に Oracle 内の JDK が追加されてしまう。

2. ユーザ環境変数を変更しない

こちらもシステム環境変数と同様。

3. 環境変数はバッチファイルで設定する

別に CMD 起動後に毎回手で打っても良いのだけれど、バッチファイルの方が間違いがないのと面倒がないのでオススメ。

4. パスを追加する際は既存のパスの先頭に追加する

言わずもがな。 既存のパスの後ろに追加する人にはさすがに出会ったことはないが、念のため。

> set JAVA_HOME=c:\_java\jdk\1.6.0

> set ANT_HOME=c:\_java\tool\ant\1.6.5

> set PATH=%JAVA_HOME%\bin;%ANT_HOME%\bin;%PATH%

5. パスを追加する際は、追加後に必ずバージョンを確認する

パスを変更したら、必ず使用する前にバージョンを確認すること。 先頭に追加すればまず間違いは無いが、設定をミスしていると予期しないバージョンのものを使用してしまっている可能性がある。 プロジェクトでは通常使用するソフトウェアのバージョンが規定されている。 自分が使用しているソフトウェアのバージョンくらいはきちんと把握しておいて欲しい。 少なくとも JDK、JRE のバージョンくらいは・・・。

> set JAVA_HOME=c:\_java\jdk\1.6.0

> set PATH=%JAVA_HOME%\bin;%PATH%

> java -version
java version "1.6.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0-beta-b59g)
Java HotSpot(TM) Client VM (build 1.6.0-beta-b59g, mixed mode, sharing)

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 23, 2006

[Misc] DOS Command に関する参考資料をメモ

私より下の世代の人は DOS に関する知識を余り持っていないことが多い。 本番環境として Windows を使用することは少ないにしても、開発は Windows でやることが多いのだから最低限は知っておいて欲しいところ。 今更 config.sys を書けとは言わないが、バッチファイルは書けないと困る。 というわけで、DOS Command に関する参考資料をメモ。

New ways to do familiar tasks
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/dos_diffs.mspx
New command-line tools
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_new_tools.mspx
Command-line reference A-Z
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds.mspx
Batch Commands
http://www.microsoft.com/technet/archive/msdos/07_refer.mspx

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 22, 2006

[Misc] JMX の参考資料をメモ

JBoss AS のソースコードを読み始めて、Microkernel で苦しんでいる。 JMX の詳細を把握していないのが原因。 ということで、JMX の参考資料をメモ。

JMX
http://java.sun.com/products/JavaManagement/index.jsp
JMX Downloads
http://java.sun.com/products/JavaManagement/download.html
Sun Community Source Licensing (SCSL) - Java(TM) Management Extensions (JMX) - Download
http://www.sun.com/software/communitysource/jmx/download.xml
JSR 255: JavaTM Management Extensions (JMXTM) Specification, version 2.0
http://jcp.org/en/jsr/detail?id=255
JSR-000003 Java Management Extensions (JMX) (Maintenance Release 2)
http://jcp.org/aboutJava/communityprocess/final/jsr003/index3.html
Wikipedia - Java Management Extensions
http://en.wikipedia.org/wiki/Java_Management_Extensions
Apache Geronimo も JMX ベースの Microkernel を導入しているらしい。 こちらも面白そう。
JBoss Architecture Overview
http://jboss.com/products/jbossas/architecture
Apache Geronimo Architecture
http://wiki.apache.org/geronimo/Architecture

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 21, 2006

[Subversion] CentOS 4.x に Subversion をインストールする方法

CentOS 4.x に Subversion をインストールしたときのメモ。 apt の代わりに yum を使用するだけで、基本的には Debian と同じ。

Subversion のインストール手順

インストール先 CentOS のバージョンは以下の通り。

# cat /etc/redhat-release
CentOS release 4.2 (Final)
インストール作業自体は yum を使用するだけで完了する。
# yum install subversion

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 subversion              i386       1.1.4-2.ent      base              1.6 M
Installing for dependencies:
 neon                    i386       0.24.7-4         base               86 k
Apache2 と連携するために mod_dav_svn もインストールしておく。
# yum install mod_dav_svn
=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mod_dav_svn             i386       1.1.4-2.ent      base               50 k
後は Subversion の設定ファイルを適当にいじれば OK。 設定ファイルは Debian とは異なり /etc/httpd/conf.d/subversion.conf にある。

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 20, 2006

[Misc] MySQL の文字エンコーディング関連設定

Windows で開発して Linux で稼働させる、といった状況だと文字エンコーディングは UCS2 や UTF-8 にしておくと楽。 MySQL を UTF-8 で動作させるための設定方法をメモしておく。

4.1.2. my.cnf オプション設定ファイル
http://dev.mysql.com/doc/refman/4.1/ja/option-files.html
付録 F. 環境変数
http://dev.mysql.com/doc/refman/4.1/ja/environment-variables.html
9.3.6. 接続のキャラクタセットおよび照合順序
http://dev.mysql.com/doc/refman/4.1/ja/charset-connection.html
ぱんぴーまっしぐら - PHPとMySQLの個人的まとめ
http://puchiko.lowtech.ne.jp/?itemid=349&catid=27

設定方法

環境変数を毎回指定しても良いが、/etc/my.cnf を編集すると毎回毎回の手間を省くことができる。

# cat /etc/my.cnf
[mysql]
default-character-set=utf8

[mysqld]
default-character-set=utf8
character_set_server=utf8
現在の文字エンコーディング関連設定がどうなっているのかを調べる方法は以下の通り。
# mysql -u mysqlaccount -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 141 to server version: 4.1.12

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SHOW VARIABLES LIKE 'character\_set\_%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| character_set_client     | utf8  |
| character_set_connection | utf8  |
| character_set_database   | utf8  |
| character_set_results    | utf8  |
| character_set_server     | utf8  |
| character_set_system     | utf8  |
+--------------------------+-------+
6 rows in set (0.00 sec)
使用した環境は以下の通り。
# mysqladmin -u mysqlaccount -p version
Enter password:
mysqladmin  Ver 8.41 Distrib 4.1.12, for redhat-linux-gnu on i686
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version          4.1.12
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 1 hour 31 min 52 sec

Threads: 2  Questions: 2227  Slow queries: 0  Opens: 97  Flush tables: 1  
Open tables: 64  Queries per second avg: 0.404

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 18, 2006

[Library] Java Plugin Framework(JPF) にチャレンジ(2)

Plugin の構成

Plugin のディレクトリ構成は以下の通り。 このディレクトリ構成を ZIP、JAR でアーカイブ化すると Plugin になる。

PLUGIN_HOME
  ├classes/
  ├docs/
  │  └api/
  ├icons/
  ├lib/
  └plugin.xml

plugin.xml の DTD は以下にある。

Plug-in DTD
http://jpf.sourceforge.net/dtd.html

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 17, 2006

[Library] Java Plugin Framework(JPF) にチャレンジ

Java Plugin Framework(JPF) とは

JPF は、Plugin アーキテクチャをサポートするためのライブラリ。 ZIP や JAR 形式で Plugin を作成し、アプリケーションからその Plugin を読み込み利用する。

Java Plugin Framework(JPF)
http://jpf.sourceforge.net/
Tutorial
http://jpf.sourceforge.net/tutorial.html

デモアプリケーションの起動

JPF にはデモアプリケーションが用意されている。 デモアプリケーションは簡単に起動し、Plugin のロードを試すことができる。

jpf-demo
http://sourceforge.net/project/showfiles.php?group_id=110394&package_id=121489
jpf-demo-bin-0.8> set JAVA_HOME=c:\_java\jdk\1.5.0_06
jpf-demo-bin-0.8> set PATH=%JAVA_HOME%\bin;%PATH%
jpf-demo-bin-0.8> run.bat
[デモアプリケーションのウィンドウ]

サンプルコード

PluginManager を初期化し、Plugin をロードするサンプルコード。

package jp.in_vitro.codelets.jpf;

import java.io.InputStream;
import java.util.Collection;

import org.java.plugin.ObjectFactory;
import org.java.plugin.PluginManager;
import org.java.plugin.PluginManager.PluginLocation;
import org.java.plugin.boot.DefaultPluginsCollector;
import org.java.plugin.boot.PluginsCollector;
import org.java.plugin.registry.ExtensionPoint;
import org.java.plugin.registry.PluginDescriptor;
import org.java.plugin.util.ExtendedProperties;

public class Codelet {

    public Codelet() {
        super();
    }

    protected void execute() throws Exception {
        ExtendedProperties config = new ExtendedProperties(System
                .getProperties());
        InputStream is = null;
        try {
            String configFile = "/"
                    + this.getClass().getPackage().getName().replaceAll("\\.",
                            "/") + "/" + "config.properties";
            is = this.getClass().getResourceAsStream(configFile);
            config.load(is);
        } finally {
            if (is != null) {
                is.close();
            }
        }
        PluginManager pluginManager = ObjectFactory.newInstance(config)
                .createManager();

        PluginsCollector collector = new DefaultPluginsCollector();
        collector.configure(config);
        Collection pluginLocations = collector.collectPluginLocations();

        pluginManager.publishPlugins((PluginLocation[]) pluginLocations
                .toArray(new PluginLocation[pluginLocations.size()]));

        for (Object pdObj : pluginManager.getRegistry().getPluginDescriptors()) {
            PluginDescriptor pd = (PluginDescriptor) pdObj;
            System.out.println("" + pd);
            for (Object epObj : pd.getExtensionPoints()) {
                ExtensionPoint ep = (ExtensionPoint) epObj;
                System.out.println("    " + ep);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Codelet me = new Codelet();
        me.execute();
    }
}

config.properties

org.java.plugin.PathResolver=org.java.plugin.standard.ShadingPathResolver
org.java.plugin.standard.ShadingPathResolver.shadowFolder=${applicationRoot}/temp/.jpf-shadow
org.java.plugin.standard.ShadingPathResolver.unpackMode=smart
org.java.plugin.boot.pluginsRepositories=./plugins/

サンプルコードの実行結果

plugins ディレクトリにデモアプリケーションの Plugin をいくつか登録して読み込ませてみた。

2006/05/16 23:58:37 org.java.plugin.registry.xml.ManifestParser 
情報: got SAX parser factory - com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl@16a55fa
2006/05/16 23:58:37 org.java.plugin.registry.xml.PluginRegistryImpl configure
情報: configured, stopOnError=false, isValidating=true
2006/05/16 23:58:37 org.java.plugin.standard.ShadingPathResolver configure
情報: configured, shadow folder is C:\Codelets\${applicationRoot}\temp\.jpf-shadow
2006/05/16 23:58:37 org.java.plugin.registry.xml.PluginRegistryImpl register
情報: plug-in and fragment descriptors registered - 2
{PluginDescriptor: uid=org.jpf.demo.toolbox.pluginbrowser@0.0.4}
{PluginDescriptor: uid=org.jpf.demo.toolbox.core@0.0.4}
    {ExtensionPoint: uid=org.jpf.demo.toolbox.core@Tool}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 15, 2006

[Misc] ClassLoader に関する参考資料をメモ

未だに ClassLoader を実装するとハマることがある。 何年実装やっているんだ・・・orz というわけで、ClassLoader に関する再勉強の必要性を強く感じて参考資料を集めてみた。

JSR 924: Java Virtual Machine Specification
http://www.jcp.org/en/jsr/detail?id=924
The Java Virtual Machine Specification Second Edition
http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
Java2 Platform SE 5.0 API Document - java.lang.ClassLoader
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/ClassLoader.html
The Apache Tomcat 5.5 Servlet/JSP Container Class Loader HOW-TO
http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html
developerWorks - クラス・ローディングとデバッグ・ツール
http://www-06.ibm.com/jp/developerworks/java/060113/j_j-dclp1.shtml
developerWorks - クラス・ローディングに関する基本的な例外
http://www-06.ibm.com/jp/developerworks/java/060127/j_j-dclp2.shtml

ちなみに、今回ハマった状況はこういうもの。 「class A extends B」というクラスをロードする。 B をシステム ClassLoader がロード、A を自作 ClassLoader がロード。 特定環境下で 「A.class.getSuperclass」 が何故か java.lang.Object を返してくるという問題が発生。 結局のところ、ClassLoader の階層構造にミスがあったのだけれど、発生する環境としない環境があって結構手こずった。

教訓 - ClassLoader の階層構造はきちんと把握しよう。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 14, 2006

[Misc] JSTL に関する参考資料をメモ

JSTL に関するサイトをメモ。

JSTL 1.1 API Document
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html
JavaServer Pages Standard Tag Library
http://java.sun.com/products/jsp/jstl/index.jsp
JSR 052 JavaServer Pages Standard Tag Library Specification
http://jcp.org/aboutJava/communityprocess/final/jsr052/
developerWorks - JSTL入門: 式言語
http://www-06.ibm.com/jp/developerworks/java/030411/j_j-jstl0211.html
developerWorks - JSTL入門: 核心(core)に触れる
http://www-06.ibm.com/jp/developerworks/java/030516/j_j-jstl0318.html

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 13, 2006

[Misc] 日本固有のバリデーションに関わる資料をメモ。

日本固有のバリデーションに関する資料をメモ。 海外製ライブラリは当然の様にこの辺りは未サポート。 自前のライブラリを「正確に」作成する場合に参照すると良いページ。

ゆうびんホームページ - 郵便番号検索
http://www.post.japanpost.jp/zipcode/
全国地方公共団体コード
http://ja.wikipedia.org/wiki/%E5%85%A8%E5%9B%BD%E5%9C%B0%E6%96%B9%E5%85%AC%E5%85%B1%E5%9B%A3%E4%BD%93%E3%82%B3%E3%83%BC%E3%83%89
JIS X 0401 都道府県コード
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+0401%3A1973&dantaiCd=JIS&status=1&pageNo=0
JIS X 0402 市区町村コード
http://www.webstore.jsa.or.jp/webstore/Com/FlowControl.jsp?lang=jp&bunsyoId=JIS+X+0402%3A2003&dantaiCd=JIS&status=1&pageNo=0
市外局番の一覧
http://www.soumu.go.jp/joho_tsusin/top/tel_number/shigai_list.html

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 12, 2006

[Library] Eclipse 3.1 で JUnit 4 のテストケースを一括実行する

JUnit 4 は JUnit 3 よりも楽にテストケースを作成できる。 最近はめっきり JUnit 4 に染まってしまった。 ただ、ツールのサポートが追いついていないところだけが玉に瑕。 Eclipse 3.1 の環境下で、JUnit 4 のテストケースを一括実行したいので簡単なコードを書いてみた。

JUnit 4 のテストケース一括実行用クラス

↓のコード (AllTests) をプロジェクトのルートパッケージに置いて実行する。 AllTests が置いてあるパッケージ以下の全テストケース("**/*Test.class") が実行される。 JVM は 5.0 以降が必要。

package jp.in_vitro.test;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestSuite;

public class AllTests {

    public static Test suite() throws URISyntaxException,
            ClassNotFoundException {
        return AllTests.createTestSuite();
    }

    protected static TestSuite createTestSuite() throws URISyntaxException,
            ClassNotFoundException {
        TestSuite suite = new TestSuite();

        URL codeSourceUrl = AllTests.class.getProtectionDomain()
                .getCodeSource().getLocation();
        File codeSourceFile = new File(codeSourceUrl.toURI());
        String codeSourceName = codeSourceFile.getAbsolutePath().replaceAll(
                "\\\\", "\\\\\\\\");

        List<File> testCaseFiles = new ArrayList<File>();
        AllTests.listTestCase(testCaseFiles, codeSourceFile);

        for (File testCaseFile : testCaseFiles) {
            String fileName = testCaseFile.getAbsolutePath();
            String className = fileName.replaceAll(codeSourceName + "\\\\", "")
                    .replaceAll(".class", "").replaceAll("\\\\", ".");
            suite.addTest(new JUnit4TestAdapter(Class.forName(className)));
        }
        return suite;
    }

    protected static void listTestCase(final List<File> testCaseFiles,
            final File file) {

        for (File child : file.listFiles()) {
            if (child.isFile()) {
                if (child.getAbsolutePath().endsWith("Test.class")) {
                    testCaseFiles.add(child);
                }
            } else if (child.isDirectory()) {
                AllTests.listTestCase(testCaseFiles, child);
            }
        }
    }
}
Eclipse 3.2 では JUnit 4 はサポートされているだろうか??

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 11, 2006

[Misc] Google Trends で遊ぶ

Google Trends というサービスが新規公開された。 How does Google Trends work? によると、

Google Trends analyzes a portion of Google web searches to compute how many searches have been done for the terms you enter relative to the total number of searches done on Google over time.
というサービスらしい。 試してみると、これが意外と面白い。

Google Trends の使い方

Google Trends のクエリフォーマットは How many terms can I compare? What other functionality is available? で解説されている。

You can compare up to five terms by separating each term with a comma. To compare trend info for "mittens" and "bathing suits," for example, you'd simply enter [ mittens, bathing suits ] and click on "Search Trends."

To see how many searches contained either of two terms, just separate those terms with a vertical bar: "|". For example, to determine how many searches contained the terms "mittens" or "gloves," you'd enter [ mittens | gloves ]. To compare multi-word terms, use parentheses. To see how many searches were done for either "winter mittens" or "gloves," for instance, enter [ (winter mittens) | gloves ]; otherwise, your query will be interpreted to mean all searches for "winter mittens" or "winter gloves."

You can also exclude terms from your search by using the minus sign. To see how many searches contained the term "maps" but not "google," for instance, just enter [ maps -google ].

To restrict your results to only those searches that contain your terms in the specific order you've entered them, put your terms in quotation marks. (By default, Google Trends will show you all searches that contain the terms you entered in any order.)

Note: when you use any of these advanced features -- quotation marks, minus signs, or vertical bars -- Google Trends will only display the search-volume graph. The news portion of the product doesn't support advanced functionality at this time.
要するに、
  • 比較したいキーワードはカンマ区切りで入力 (例、"apple,orange")
  • キーワードを OR で連結する場合は '|' を使用 (例、"Revolution|Wii,PS3|(Play Station 3)")
  • 特定の語彙を除外したい場合は '-' を使用 (例、"java - coffee,.Net")
というだけなので、特に難しいことは何もない。

Web 開発のトレンド

面白いので、Java による Web 開発関連のトレンドを調べてみた。 Application Server や IDE はなかなか面白い結果だった。

●java ●.net
Java vs .Net Applcation Server IDE Ant vs Maven O/R Mapping Framework DI Container Unit Test

↑のボックスをクリックするとグラフが切り替わる。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 10, 2006

[Linux] Linux で起動してからの時間を調べる方法

Linux が起動してから経過した時間を調べる方法をメモ。 起動後の経過時間は /proc/uptime から取得することができる。

# cat /proc/uptime
2700777.74 2676642.02
一つめの値が起動後の経過時間を秒数で表した数値となる。 後は電卓を叩いて日数や時間数に換算すれば良い。 電卓を起動するのが面倒な場合は AWK で計算しても良い。
# cat /proc/uptime | awk '{print $1 / 60 /60 /24 "days (" $1 "sec)"}'
31.2591days (2700784.86sec)
ただしこの値、32bit でカウントされているために 500 日程度でリセットされてしまうらしい。 (ともちゃ日記さんの [Linux] uptime より)
Manpage of PROC
http://www.linux.or.jp/JM/html/LDP_man-pages/man5/proc.5.html

Posted in Linux | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 09, 2006

[WebService] Wikipedia API にチャレンジ

Wikipedia の API が無いものかと調べてみた。 「クローラのアクセスは止めて」と書いてあるものの普通に公開されていた。

Wikipedia:Database download
http://en.wikipedia.org/wiki/Wikipedia:Download#XML_schema
XML access
http://en.wikipedia.org/wiki/Special:Export/Title_of_the_article
RSS access
http://www.blinkbits.com/en_wikifeeds_rss/Title_of_the_article

XML フォーマットで記事を取得

AIBO に関する記事を XML フォーマットで取得してみた。 http://en.wikipedia.org/wiki/Special:Export/AIBO にアクセスするだけで良い。

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ 
                                  http://www.mediawiki.org/xml/export-0.3.xsd" 
              version="0.3" 
              xml:lang="en">
<siteinfo>
<sitename>Wikipedia</sitename> 
<base>http://en.wikipedia.org/wiki/Main_Page</base> 
<generator>MediaWiki 1.7alpha</generator> 
<case>first-letter</case> 
<namespaces>
<namespace key="-2">Media</namespace> 
<namespace key="-1">Special</namespace> 
<namespace key="0" /> 
<namespace key="1">Talk</namespace> 
<namespace key="2">User</namespace> 
<namespace key="3">User talk</namespace> 
<namespace key="4">Wikipedia</namespace> 
<namespace key="5">Wikipedia talk</namespace> 
<namespace key="6">Image</namespace> 
<namespace key="7">Image talk</namespace> 
<namespace key="8">MediaWiki</namespace> 
<namespace key="9">MediaWiki talk</namespace> 
<namespace key="10">Template</namespace> 
<namespace key="11">Template talk</namespace> 
<namespace key="12">Help</namespace> 
<namespace key="13">Help talk</namespace> 
<namespace key="14">Category</namespace> 
<namespace key="15">Category talk</namespace> 
<namespace key="100">Portal</namespace> 
<namespace key="101">Portal talk</namespace> 
</namespaces>
</siteinfo>
<page>
<title>AIBO</title> 
<id>47087</id> 
<revision>
<id>51895470</id> 
<timestamp>2006-05-06T22:55:18Z</timestamp> 
<contributor>
<ip>68.121.102.200</ip> 
</contributor>
<comment>/* External links */</comment> 
<text xml:space="preserve">[[Image:AIBO.JPG|thumb|right|The AIBO ERS-7 re
sembles a small dog]] '''AIBO''' is one of several types of [[robot|robotic]] [
[pet]]s designed and manufactured by [[Sony]]; there have been sever
中略
</text> 
</revision>
</page>
</mediawiki>

RSS フォーマットで記事を取得

同じく、AIBO に関する記事を RSS フォーマットで取得してみた。 http://www.blinkbits.com/en_wikifeeds_rss/AIBO にアクセスするだけで良い。

<?xml version="1.0" encoding="utf-8" ?> 
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" 
                      xmlns:annotate="http://purl.org/rss/1.0/modules/annotate/" 
                      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<channel>
<title>AIBO RSS Feed for Wikipedia powered by BlinkBits.com</title> 
<link>http://www.blinkbits.com/en_wikifeeds/AIBO</link> 
<description>Imagine the Collective Wisdom of All Mankind Available in the 
Blink of An Eye... That's BlinkBits!</description> 
<managingEditor>lcotter@blinkbits.com</managingEditor> 
<docs>http://www.blinkbits.com</docs> 
<generator>RSS Feed 2.1.4</generator> 
<language>en</language> 
<lastBuildDate>Wed, 12 Apr 2006 08:09:19 -0400</lastBuildDate> 
<image>
<url>http://www.blinkbits.com/images/icon_6040.gif</url> 
<title>AIBO RSS Feed from Wikipedia Powered by BlinkBits.com</title> 
<link>http://www.blinkbits.com</link> 
<width>60</width> 
<height>40</height> 
</image>
<item>
<title>AIBO Wikipedia RSS Feed</title> 
<link>http://www.blinkbits.com/en_wikifeeds/AIBO</link> 
<pubDate>Wed, 12 Apr 2006 08:09:19 -0400</pubDate> 
<guid isPermaLink="true">http://www.blinkbits.com/en_wikifeeds/AIBO</guid> 
<description>
<![CDATA[ [b]AIBO[/b] is one of several types of robotic pets designed and ma
nufactured by Sony; there have been several different models since their introdu

中略

]]> 
The Wikipedia article is licensed under http://www.gnu.org/copyleft/fdl.html and
 uses material from http://en.wikipedia.org/wiki/AIBO. A preview of this article 
is available at http://www.blinkbits.com/en_wikifeeds/AIBO. 
</description>
<dc:subject>Biography</dc:subject> 
<comments>http://www.blinkbits.com/en_wikifeeds/AIBO</comments> 
</item>
</channel>
</rss>

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 08, 2006

[Library] JUnit 4.1 リリース

JUnit 4.1 がリリースされた。 README.html によると、4.0 からの変更点は

  • Bug fix: listeners now get a correct test running time, rather than always being told 0 secs.
  • The @RunWith annotation is now inherited by subclasses: all subclasses of an abstract test class will be run by the same runner.
  • The build script fails if the JUnit unit tests fail
  • The faq has been updated
  • Javadoc has been improved, with more internal links, and package descriptions added (Thanks, Matthias Schmidt!)
  • An acknowledgements.txt file has been created to credit outside contributions
  • The Enclosed runner, which runs all of the static inner classes of a given class, has been added to org.junit.runners.
だそうだ。 特に大きな変更は無い模様。

ついでに JUnit4 の素敵な紹介記事を発見したのでメモ。
developerWorks - JUnit 4の現状を紹介する
http://www-06.ibm.com/jp/developerworks/java/051007/j_j-junit4.shtml

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 07, 2006

[Maven] Maven2 でアーカイブのファイル名を指定する

Maven2 でアーカイブを生成すると、デフォルトでは artifactId と version からファイル名が決定される。 WAR だとアーカイブファイル名がコンテキスト名として使用されるので、任意のファイル名を指定したい。 いつも設定方法を忘れるので、メモしておく。

アーカイブファイル名の指定方法

アーカイブファイル名は project/build/finalName で指定する。 ↓の例では my-war-file.war という WAR ファイルが生成される。

<?xml version="1.0"?>
<project>
  <artifactId>my-artifact</artifactId>
  <version>1.0.0</version>
  <packaging>war</packaging>
  <build>
    <finalName>my-war-file</finalName>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 30, 2006

[Misc] Java で Scheme

JVM 上の Scheme 実行環境で遊んでみた。 どうやら SISC と Kawa という環境があるらしい。

SISC
http://sisc.sourceforge.net/
Kawa
http://www.gnu.org/software/kawa/
オレンジニュース - JavaベースのScheme処理系「Kawa」と「SISC」の違い
http://secure.ddo.jp/~kaku/tdiary/20060412.html
ひWeb / ひ日誌 - JavaベースのScheme処理系
http://www.fobj.com/hisa/diary/20060412.html#p02

Kawa にチャレンジ

Kawa は jar 1 つで動作できる非常に軽い環境。

>set JAVA_HOME=c:\_java\jdk\1.5.0_06
>set PATH=%JAVA_HOME%\bin;%PATH%
>java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

>java -jar .\kawa-1.8.jar
#|kawa:1|# (display (+ 12 4))(newline)
16
#|kawa:2|#

SISC にチャレンジ

Kawa よりは jar が多いけれど、Kawa 同様簡単に起動できた。

>java -classpath .\sisc.jar;.\sisc-lib.jar;.\sisc-opt.jar sisc.REPL
 -h .\sisc.shp
SISC (1.13.6)
#;> (display (+ 12 4))
16#;>

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 29, 2006

[AS] JBoss AS のコードを読む (3)

Server 実行編

今回は Server の実行周り。

org.jboss.Main
起動用クラス。main メソッドを持つ。起動時引数の解析はここで行われている。
org.jboss.system.server.Server
Server 機能を表すインタフェース。主に Server のライフサイクルを制御するメソッドが定義されている。
org.jboss.system.server.ServerImpl
Server インタフェースのデフォルト実装。

[Server Server 実行に関係するクラス]
Server 実行に関係するクラス

[Server Server 実行時のシーケンス]
Server 実行時のシーケンス

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 27, 2006

[AS] JBoss AS のコードを読む (2)

Server 初期化編

今回は Server の初期化処理周り。

org.jboss.Main
起動用クラス。main メソッドを持つ。起動時引数の解析はここで行われている。
org.jboss.system.server.Server
Server 機能を表すインタフェース。主に Server のライフサイクルを制御するメソッドが定義されている。
org.jboss.system.server.ServerImpl
Server インタフェースのデフォルト実装。
org.jboss.system.server.ServerConfig
Server の設定項目を表すインタフェース。
org.jboss.system.server.ServerConfigImpl
ServerConfig インタフェースのデフォルト実装。

[Server 初期化に関係するクラス]
Server 初期化に関係するクラス

[Server 初期化時のシーケンス]
Server 初期化時のシーケンス

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 26, 2006

[AS] JBoss AS のコードを読む (1)

以前から JBoss のコードを読んでみたいと思っていた。 ただ Application Server という規模の大きなコードを読む面倒さから、なかなか着手する気にならなかった。 今回、とりあえずどこまで続くか分からないが、着手だけはしてみることに。 読みやすい順番で少しずつ、のんびりと読んで行きたいと思う。

起動編

まずは main メソッド実行から Server#start が呼ばれるところ辺りまで。

org.jboss.Main
起動用クラス。main メソッドを持つ。起動時引数の解析はここで行われている。
org.jboss.system.server.ServerLoader
Server インスタンスを生成するファクトリクラス。
org.jboss.system.server.Server
Server 機能を表すインタフェース。主に Server のライフサイクルを制御するメソッドが定義されている。
org.jboss.system.server.ServerImpl
Server インタフェースのデフォルト実装。
org.jboss.system.server.NoAnnotationURLClassLoader
URLClassLoader の拡張。何故拡張が必要かは知らない。

[起動時処理に関係するクラス]
起動時処理に関係するクラス

[起動時のシーケンス]
起動時のシーケンス

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 25, 2006

[WebService] Google Calendar API にチャレンジ

Google Calendar も API が公開されていたのでサワリだけ試してみた。

Using the Google Calendar Data API
http://code.google.com/apis/gdata/calendar.html

API 経由で Google Calendar にアクセス

Google Calendar に API 経由でアクセスするためには、まずアクセスしたいカレンダーの URL を調べなければならない。

  1. Google Calendar に Web ブラウザでアクセス
  2. Calendars > My Calendars > アクセスしたいカレンダー > Calendar settings を選択
  3. Private Address の "XML" アイコンのリンク先 URL をコピーする
上記手順で得られた URL にアクセスしてみると、カレンダーの内容を XML で取得できる。
http://www.google.com/calendar/feeds/in-vitro.example@gmail.com/private-1234567890abcdef1234567890abcdef/basic
にアクセスすると
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
	xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'
	xmlns:gd='http://schemas.google.com/g/2005'>
	<id>
		http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic
	</id>
	<updated>2006-04-24T01:05:34.000Z</updated>
	<title type='text'>private</title>
	<subtitle type='text'>private</subtitle>
	<link rel='http://schemas.google.com/g/2005#feed'
		type='application/atom+xml'
		href='http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic'>
	</link>
	<link rel='self' type='application/atom+xml'
		href='http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic?max-results=25'>
	</link>
	<link rel='next' type='application/atom+xml'
		href='http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic?start-index=26&amp;max-results=25'>
	</link>
	<author>
		<name>in-vitro-example</name>
		<email>in-vitro-example@gmail.com</email>
	</author>
	<generator version='1.0' uri='http://www.google.com/calendar'>
		Google Calendar
	</generator>
	<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
	<entry>
		<id>
			http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic/1357913579abcdefabcdef2468
		</id>
		<published>2006-04-15T04:30:00.000Z</published>
		<updated>2006-04-15T14:43:51.000Z</updated>
		<category scheme='http://schemas.google.com/g/2005#kind'
			term='http://schemas.google.com/g/2005#event'>
		</category>
		<title type='text'>○○さん、××さんと昼食</title>
		<summary type='html'>
			When: 2006-04-14 21:30:00 to 00:00:00
			America/Los_Angeles&lt;br&gt;
		</summary>
		<content type='text'>
			When: 2006-04-14 21:30:00 to 00:00:00
			America/Los_Angeles&lt;br&gt;&lt;br&gt;Event
			Description:null
		</content>
		<link rel='alternate' type='text/html'
			href='http://www.google.com/calendar/event?eid=fedcba0987654321fedcba0987654321fedbca0987654321fedbca098765'
			title='alternate'>
		</link>
		<link rel='self' type='application/atom+xml'
			href='http://www.google.com/calendar/feeds/in-vitro-example%40gmail.com/private-1234567890abcdef1234567890abcdef/basic/1357913570abcdefabcdef2468'>
		</link>
		<author>
			<name>in-vitro-example</name>
			<email>in-vitro-example@gmail.com</email>
		</author>
	</entry>
</feed>
という感じの XML を取得できる。 尚、上記のリクエスト、レスポンス共にダミーなのでそのままコピペしても当然無効。

Google Calendar API のリクエスト URL フォーマット

Google Calendar API に対するリクエスト URL は

  http://www.google.com/calendar/feeds/<userID>/<visibility>/<projection>
という形式になっている。 visibility、projection に指定可能な値は
Visibility values
http://code.google.com/apis/gdata/calendar.html#Visibility
Projection values
http://code.google.com/apis/gdata/calendar.html#Projection
に記載されている。

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 24, 2006

[Library] JExcelAPI にチャレンジ(6)

チマチマと動作確認のために作成していたコードを貼っておく。 ここ数日の内容をまとめたもの。

package jp.in_vitro.codelets.jexcelapi;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import jxl.HeaderFooter;
import jxl.SheetSettings;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.PageOrientation;
import jxl.format.PaperSize;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

public class Codelet2 {

    public Codelet2() {
        super();
    }

    protected void execute() throws IOException, RowsExceededException,
            WriteException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        WorkbookSettings settings = new WorkbookSettings();
        settings.setGCDisabled(true);
        WritableWorkbook book = Workbook.createWorkbook(baos, settings);

        WritableSheet sheet = book.createSheet("my sheet", 0);
        this.configureSheet(sheet);
        this.adjustColumnWidth(sheet);
        this.writeHeader(sheet, 1);
        this.writeBookmark(sheet, 2, 1, "Google", "http://www.google.com/",
                "サーチエンジン");
        this.writeBookmark(sheet, 3, 2, "CNN", "http://www.cnn.com/", "ニュース");
        this.writeBookmark(sheet, 4, 3, "Amazon", "http://www.amazon.co.jp/",
                "ショッピング");

        book.write();
        book.close();

        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File("c:\\tmp.xls"));
            fos.write(baos.toByteArray());
            fos.flush();
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }

    protected void configureSheet(final WritableSheet sheet) {

        SheetSettings settings = sheet.getSettings();

        HeaderFooter header = new HeaderFooter();
        header.getCentre().append("My Bookmarks");
        settings.setHeader(header);

        HeaderFooter footer = new HeaderFooter();
        footer.getCentre().appendPageNumber();
        footer.getCentre().append(" / ");
        footer.getCentre().appendTotalPages();
        settings.setFooter(footer);

        settings.setProtected(true);
        settings.setPassword("mypassword");

        settings.setFitHeight(2);
        settings.setFitWidth(0);
        settings.setFitToPages(true);

        settings.setHorizontalFreeze(1);
        settings.setVerticalFreeze(2);

        settings.setZoomFactor(75);

        sheet.setPageSetup(PageOrientation.LANDSCAPE, PaperSize.B5, 10, 10);
    }

    protected void adjustColumnWidth(final WritableSheet sheet) {

        int[] widths = new int[] { 10, 30, 50, 50 };

        for (int i = 0; i < widths.length; i++) {
            sheet.setColumnView(i, widths[i]);
        }
    }

    protected void writeHeader(final WritableSheet sheet, final int y)
            throws WriteException {

        String[] headers = new String[] { "No.", "Title", "URL", "Description" };
        String[] comments = new String[] { "番号", "タイトル", "", "備考" };

        WritableCellFormat format = new WritableCellFormat();
        format.setBorder(Border.ALL, BorderLineStyle.THIN);
        format.setBackground(Colour.LIGHT_ORANGE);
        format.setAlignment(Alignment.CENTRE);

        WritableFont font = new WritableFont(format.getFont());
        font.setBoldStyle(WritableFont.BOLD);
        format.setFont(font);

        for (int i = 0; i < headers.length; i++) {
            WritableCellFeatures feature = new WritableCellFeatures();
            if (!"".equals(comments[i])) {
                feature.setComment(comments[i]);
            }
            Label label = new Label(i, y, headers[i]);
            label.setCellFeatures(feature);
            label.setCellFormat(format);
            sheet.addCell(label);
        }
    }

    protected void writeBookmark(final WritableSheet sheet, final int y,
            final int no, final String title, final String url,
            final String description) throws RowsExceededException,
            WriteException {

        WritableCellFormat format = new WritableCellFormat();
        format.setBorder(Border.ALL, BorderLineStyle.THIN);

        Number noNumber = new Number(0, y, no);
        noNumber.setCellFormat(format);
        Label titleLabel = new Label(1, y, title);
        titleLabel.setCellFormat(format);
        Formula urlLabel = new Formula(2, y, "HYPERLINK(\"" + url + "\",\""
                + url + "\")");
        urlLabel.setCellFormat(format);
        Label descriptionLabel = new Label(3, y, description);
        descriptionLabel.setCellFormat(format);

        sheet.addCell(noNumber);
        sheet.addCell(titleLabel);
        sheet.addCell(urlLabel);
        sheet.addCell(descriptionLabel);
    }

    public static void main(String[] args) throws IOException,
            RowsExceededException, WriteException {
        Codelet2 me = new Codelet2();
        me.execute();
    }

}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 23, 2006

[Library] JExcelAPI にチャレンジ(5)

JEXCELAPI にチャレンジ(4)の続き。

JExcelAPI 実行時の GC を抑制する

どうやら JExcelAPI はガベージコレクションを強制的に実行するらしい。 ガベージコレクションにより CPU に負荷がかかりすぎる様であれば、下記の方法で抑制する。

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        WorkbookSettings settings = new WorkbookSettings();
        settings.setGCDisabled(true);
        WritableWorkbook book = Workbook.createWorkbook(baos, settings);

ガベージコレクションの状況

実際に WorkbookSettings#setGCDisabled でどの程度ガベージコレクションの頻度が変わるのかチェックしてみた。 適当なブックを作成するサンプルコードを -verbose:gc 付きで実行してみた結果。 ガベージコレクションを抑制しないとかなり FULL GC が実行されていることが分かる。 サーバなどで JVM に大量のメモリを割り当てている環境では注意が必要になりそう。

-verbose:gc

setGCDisabled(true) setGCDisabled(false)
[GC 512K->219K(1984K), 0.0037125 secs]
[GC 731K->213K(1984K), 0.0013843 secs]
[GC 725K->355K(1984K), 0.0025442 secs]
[GC 485K->355K(1984K), 0.0008825 secs]
[Full GC 355K->355K(1984K), 0.0185440 secs]
[GC 5987K->5482K(7108K), 0.0007786 secs]
[GC 5994K->5489K(7108K), 0.0010468 secs]
[GC 6001K->5494K(7108K), 0.0008387 secs]
[GC 6006K->5510K(7108K), 0.0014418 secs]
[GC 5819K->5602K(7108K), 0.0015913 secs]
[GC 5940K->5604K(7108K), 0.0007699 secs]
[GC 6116K->5607K(7108K), 0.0007481 secs]
[GC 6118K->5644K(7108K), 0.0021126 secs]
[GC 5870K->5654K(7108K), 0.0005934 secs]
[Full GC 5654K->460K(7108K), 0.0228395 secs]
[GC 5946K->5605K(7108K), 0.0003456 secs]
[GC 5946K->5606K(7108K), 0.0003162 secs]
[GC 6116K->5649K(7108K), 0.0006051 secs]
[GC 5685K->5653K(7108K), 0.0005341 secs]
[Full GC 5653K->460K(7108K), 0.0227604 secs]
[GC 5946K->5605K(6612K), 0.0003417 secs]
[GC 5941K->5607K(6612K), 0.0002489 secs]
[GC 6117K->5649K(6612K), 0.0004610 secs]
[GC 5685K->5653K(6612K), 0.0005034 secs]
[Full GC 5653K->454K(6612K), 0.0246984 secs]
[GC 5940K->5600K(9932K), 0.0007546 secs]
[GC 5939K->5601K(9932K), 0.0002735 secs]
[GC 6111K->5644K(9932K), 0.0005029 secs]
[GC 5682K->5647K(9932K), 0.0005302 secs]
[Full GC 5647K->454K(9932K), 0.0233284 secs]
[GC 5940K->5600K(7220K), 0.0003615 secs]
[GC 5936K->5601K(7220K), 0.0002601 secs]
[GC 6111K->5644K(7220K), 0.0007819 secs]
[GC 5682K->5647K(7220K), 0.0005554 secs]
[Full GC 5647K->454K(7220K), 0.0346614 secs]
[GC 5939K->5600K(7220K), 0.0003635 secs]
[GC 5938K->5601K(7220K), 0.0002766 secs]
[GC 6111K->5644K(7220K), 0.0004685 secs]
[GC 5682K->5647K(7220K), 0.0005615 secs]
[Full GC 5647K->454K(7220K), 0.0334269 secs]
[GC 5939K->5600K(7220K), 0.0003344 secs]
[GC 5938K->5601K(7220K), 0.0002590 secs]
[GC 6108K->5638K(7220K), 0.0005610 secs]
[GC 5687K->5648K(7220K), 0.0005389 secs]
[Full GC 5648K->455K(7220K), 0.0241341 secs]
[GC 5941K->5601K(7220K), 0.0003498 secs]
[GC 5938K->5602K(7220K), 0.0003266 secs]
[GC 6109K->5638K(7220K), 0.0004643 secs]
[GC 5688K->5649K(7220K), 0.0005397 secs]
[Full GC 5649K->456K(7220K), 0.0234329 secs]
[GC 5942K->5602K(7224K), 0.0008445 secs]
[GC 5940K->5603K(7224K), 0.0002972 secs]
[GC 6114K->5646K(7224K), 0.0004772 secs]
[GC 5684K->5649K(7224K), 0.0005274 secs]
[Full GC 5649K->457K(7224K), 0.0240489 secs]
[GC 5942K->5602K(7228K), 0.0003386 secs]
[GC 5938K->5604K(7228K), 0.0002643 secs]
[GC 6113K->5646K(7228K), 0.0004836 secs]
[GC 5684K->5650K(7228K), 0.0005246 secs]
[Full GC 5650K->457K(7228K), 0.0248289 secs]
[GC 5941K->5602K(7228K), 0.0003587 secs]
[GC 5940K->5604K(7228K), 0.0002548 secs]
[GC 6114K->5646K(7228K), 0.0004914 secs]
[GC 5684K->5650K(7228K), 0.0005420 secs]
[Full GC 5650K->456K(7228K), 0.0240072 secs]
[GC 5940K->5602K(7224K), 0.0003609 secs]
[GC 5939K->5603K(7224K), 0.0002562 secs]
[GC 6113K->5645K(7224K), 0.0004696 secs]
[GC 5683K->5649K(7224K), 0.0005280 secs]
[Full GC 5649K->456K(7224K), 0.0239544 secs]
[GC 5940K->5602K(7224K), 0.0003447 secs]
[GC 5939K->5603K(7224K), 0.0002523 secs]
[GC 6113K->5645K(7224K), 0.0004699 secs]
[GC 5683K->5649K(7224K), 0.0005327 secs]
[Full GC 5649K->456K(7224K), 0.0233776 secs]
[GC 5940K->5602K(7224K), 0.0004629 secs]
[GC 5939K->5603K(7224K), 0.0002674 secs]
[GC 6113K->5645K(7224K), 0.0004660 secs]
[GC 5683K->5649K(7224K), 0.0005395 secs]
[Full GC 5649K->456K(7224K), 0.0236684 secs]
[GC 5940K->5602K(7224K), 0.0003498 secs]
[GC 5939K->5603K(7224K), 0.0002699 secs]
[GC 6113K->5645K(7224K), 0.0004730 secs]
[GC 512K->219K(1984K), 0.0030713 secs]
[GC 731K->213K(1984K), 0.0013647 secs]
[GC 725K->355K(1984K), 0.0024732 secs]
[GC 485K->355K(1984K), 0.0009328 secs]
[Full GC 355K->355K(1984K), 0.0186873 secs]
[GC 5987K->5482K(7108K), 0.0014714 secs]
[GC 5994K->5489K(7108K), 0.0010350 secs]
[GC 6001K->5494K(7108K), 0.0008428 secs]
[GC 6006K->5510K(7108K), 0.0013708 secs]
[GC 5819K->5602K(7108K), 0.0016069 secs]
[GC 5940K->5604K(7108K), 0.0007275 secs]
[GC 6116K->5607K(7108K), 0.0007294 secs]
[GC 6118K->5644K(7108K), 0.0020734 secs]
[Full GC 5850K->5654K(7108K), 0.0233583 secs]
[GC 5676K->5654K(10196K), 0.0002358 secs]
[Full GC 5654K->460K(10196K), 0.0228359 secs]
[GC 6284K->5606K(10196K), 0.0003883 secs]
[Full GC 6142K->5619K(10196K), 0.0328980 secs]
[GC 5639K->5620K(10196K), 0.0002173 secs]
[Full GC 5620K->454K(10196K), 0.0228797 secs]
[GC 6279K->5601K(10196K), 0.0004512 secs]
[Full GC 6135K->5648K(10196K), 0.0234963 secs]
[GC 5666K->5648K(10196K), 0.0002104 secs]
[Full GC 5648K->454K(10196K), 0.0328841 secs]
[GC 6274K->5601K(10196K), 0.0003517 secs]
[Full GC 6135K->5619K(10196K), 0.0401814 secs]
[GC 5637K->5620K(10196K), 0.0002282 secs]
[Full GC 5620K->454K(10196K), 0.0338029 secs]
[GC 6276K->5601K(10196K), 0.0003730 secs]
[Full GC 6134K->5648K(10196K), 0.0235197 secs]
[GC 5665K->5648K(10196K), 0.0002112 secs]
[Full GC 5648K->454K(10196K), 0.0232991 secs]
[GC 6275K->5601K(10196K), 0.0006495 secs]
[Full GC 6135K->5619K(10196K), 0.0410946 secs]
[GC 5637K->5620K(10196K), 0.0002313 secs]
[Full GC 5620K->454K(10196K), 0.0235823 secs]
[GC 6276K->5601K(10196K), 0.0003721 secs]
[Full GC 6143K->5648K(10196K), 0.0371251 secs]
[GC 5666K->5649K(10196K), 0.0002836 secs]
[Full GC 5649K->455K(10196K), 0.0232323 secs]
[GC 6278K->5602K(10196K), 0.0003699 secs]
[Full GC 6142K->5621K(10196K), 0.0310796 secs]
[GC 5638K->5621K(10196K), 0.0002299 secs]
[Full GC 5621K->456K(10196K), 0.0236888 secs]
[GC 6277K->5603K(10196K), 0.0005277 secs]
[Full GC 6137K->5649K(10196K), 0.0237972 secs]
[GC 5667K->5650K(10196K), 0.0002115 secs]
[Full GC 5650K->456K(10196K), 0.0231585 secs]
[GC 6276K->5603K(10196K), 0.0003615 secs]
[Full GC 6135K->5621K(10196K), 0.0310106 secs]
[GC 5638K->5621K(10196K), 0.0002330 secs]
[Full GC 5621K->456K(10196K), 0.0243056 secs]
[GC 6277K->5603K(10196K), 0.0003727 secs]
[Full GC 6137K->5649K(10196K), 0.0243352 secs]
[GC 5667K->5650K(10196K), 0.0002106 secs]
[Full GC 5650K->456K(10196K), 0.0239634 secs]
[GC 6276K->5603K(10196K), 0.0006238 secs]
[Full GC 6135K->5621K(10196K), 0.0313233 secs]
[GC 5638K->5621K(10196K), 0.0002310 secs]
[Full GC 5621K->456K(10196K), 0.0241263 secs]
[GC 6277K->5603K(10196K), 0.0003755 secs]
[Full GC 6136K->5649K(10196K), 0.0241584 secs]
[GC 5667K->5650K(10196K), 0.0002148 secs]
[Full GC 5650K->456K(10196K), 0.0233303 secs]
[GC 6276K->5603K(10196K), 0.0003743 secs]
[Full GC 6136K->5621K(10196K), 0.0304924 secs]
[GC 5638K->5621K(10196K), 0.0002355 secs]
[Full GC 5621K->456K(10196K), 0.0235848 secs]
[GC 6276K->5603K(10196K), 0.0005327 secs]
[Full GC 6136K->5649K(10196K), 0.0246543 secs]

-verbose:gc -Xmn16m

setGCDisabled(true) setGCDisabled(false)
[GC 10740K->455K(16192K), 0.0067553 secs]
[GC 13198K->455K(16192K), 0.0033887 secs]
[GC 13310K->455K(16192K), 0.0031920 secs]
[GC 13194K->455K(16192K), 0.0032965 secs]
[GC 13188K->456K(16192K), 0.0032487 secs]
[GC 13231K->456K(16192K), 0.0032934 secs]
[GC 13218K->456K(16192K), 0.0033169 secs]
[Full GC 10740K->5620K(16192K), 0.0376690 secs]
[Full GC 12104K->5625K(16192K), 0.0320728 secs]
[Full GC 12050K->5651K(16192K), 0.0320968 secs]
[Full GC 12031K->5619K(16192K), 0.0346910 secs]
[Full GC 11985K->5630K(16192K), 0.0324041 secs]
[Full GC 12034K->5639K(16192K), 0.0324170 secs]
[Full GC 12040K->5649K(16192K), 0.0326779 secs]
[Full GC 12043K->5621K(16192K), 0.0340462 secs]
[Full GC 11999K->5630K(16192K), 0.0329092 secs]
[Full GC 11992K->5635K(16192K), 0.0330936 secs]
[Full GC 12009K->5636K(16192K), 0.0325304 secs]
[Full GC 11999K->5621K(16192K), 0.0325377 secs]
[Full GC 11992K->5630K(16192K), 0.0431563 secs]
[Full GC 12000K->5638K(16192K), 0.0337579 secs]
[Full GC 12001K->5646K(16192K), 0.0353190 secs]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 22, 2006

[Library] JExcelAPI にチャレンジ(4)

JEXCELAPI にチャレンジ(3)の続き。

シートの印刷サイズをセットする

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);


sheet.setPageSetup(PageOrientation.LANDSCAPE, PaperSize.B5, 10, 10);

シート印刷時のページ数を指定する

シートを印刷するときに指定したページ枚数にフィットするように拡大縮小させることができる。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


settings.setFitHeight(1);
settings.setFitWidth(1);
settings.setFitToPages(true);

シートを保護する

以下の方法でシート編集時にパスワードを問い合わせるようにすることができる。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


settings.setProtected(true);
settings.setPassword("mypassword");

ウィンドウ枠を固定する

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


settings.setHorizontalFreeze(1);
settings.setVerticalFreeze(2);

シート表示のズームをセットする

SheetSettings#setZoomFactor でズームを指定できる。 パラメータとして渡す数値はズームの %。 例えば、50 を指定すると 50% で表示される。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


settings.setZoomFactor(75);

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 21, 2006

[Library] JExcelAPI にチャレンジ(3)

JEXCELAPI にチャレンジ(2)の続き。

文字を BOLD にする

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

WritableCellFormat format = new WritableCellFormat();

WritableFont font = new WritableFont(format.getFont());
font.setBoldStyle(WritableFont.BOLD);

format.setFont(font);

Label label = new Label(0, 0, "hoge");
label.setCellFormat(format);
sheet.addCell(label);

文字をセンタリングする

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

WritableCellFormat format = new WritableCellFormat();

format.setAlignment(Alignment.CENTRE);


Label label = new Label(0, 0, "hoge");
label.setCellFormat(format);
sheet.addCell(label);

罫線を引く

セル単位で罫線を引くことができる。 使用できる線種は以下の通り。

  • DASH_DOT
  • DASH_DOT_DOT
  • DASHED
  • DOTTED
  • DOUBLE
  • HAIR
  • MEDIUM
  • MEDIUM_DASH_DOT
  • MEDIUM_DASH_DOT_DOT
  • MEDIUM_DASHED
  • NONE
  • SLANTED_DASH_DOT
  • THICK
  • THIN
ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

WritableCellFormat format = new WritableCellFormat();

format.setBorder(Border.ALL, BorderLineStyle.THIN);


Label label = new Label(0, 0, "hoge");
label.setCellFormat(format);
sheet.addCell(label);

セルの背景色をセットする

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

WritableCellFormat format = new WritableCellFormat();

format.setBackground(Colour.LIGHT_ORANGE);


Label label = new Label(0, 0, "hoge");
label.setCellFormat(format);
sheet.addCell(label);

シートにヘッダをセットする

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


HeaderFooter header = new HeaderFooter();
header.getCentre().append("My Bookmarks");
settings.setHeader(header);

シートにフッタをセットする

フッタもヘッダと同じ方法でセットできる。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

SheetSettings settings = sheet.getSettings();


HeaderFooter footer = new HeaderFooter();
footer.getCentre().appendPageNumber();
footer.getCentre().append(" / ");
footer.getCentre().appendTotalPages();
settings.setFooter(footer);

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 20, 2006

[Library] JExcelAPI にチャレンジ(2)

JExcelAPI を実際に使用する可能性が出てきた。 というわけで、JExcelAPI で出来ることを簡単に調べてメモしておく。 JExcelAPI のバージョンは 2.5.9 を前提とする。

JExcelAPI にチャレンジ
http://www.in-vitro.jp/blog/index.cgi/Library/20051105_01.html
JExcelAPI のクラス図
http://www.in-vitro.jp/blog/index.cgi/Library/20051106_01.html

ブックを生成する

ブックは Workbook#createWorkbook(File) で簡単に生成できる。 Servlet から Stream で Web ブラウザに流すといった用途の場合は下記の様に一度オンメモリで生成する。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

// ここで book を編集する。

book.write();
book.close();

OutputStream fos = null;
try {
    fos = new FileOutputStream(new File("c:\\mybook.xls"));
    fos.write(baos.toByteArray());
    fos.flush();
} finally {
    if (fos != null) {
        fos.close();
    }
}

シートを生成する

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);


WritableSheet sheet = book.createSheet("my sheet", 0);

カラムの幅を変更する

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);

sheet.setColumnView(0, 100);

セルに数値を書く

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);


Number number = new Number(0, 0, 999);
sheet.addCell(number);

セルに文字列を書く

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);


Label label = new Label(0, 0, "hoge");
sheet.addCell(label);

セルに式を書く

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);


Formula formula = new Formula(0, 0, "10 * 10");
sheet.addCell(formula);

セルにリンクを書く

WritableHyperlink を使用するとリンクを作成できる。 ただ、WritableHiperlink を使用したセルにフォーマット(罫線等)を指定する方法が見つからなかった。 仕方が無いので、関数を使用してリンクを作成してみた。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook book = Workbook.createWorkbook(baos);

WritableSheet sheet = book.createSheet("my sheet", 0);


Formula formula = new Formula(0, 0, "HYPERLINK(\"http://www.google.com/\", \"Google\")");
sheet.addCell(formula);

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 19, 2006

[Misc] ジェノグラフィック・プロジェクトその後

以前、自分のご先祖様を調べてくれるジェノグラフィック・プロジェクトに参加した。 自分の DNA サンプルを送ると、DNA の情報を基にルーツを調べてくれる。 DNA の分析に時間がかかっていたが、ついに結果が分かった。

ジェノグラフィック・プロジェクトに関してはこちら→ ジェノグラフィック・プロジェクトに参加

というわけで、私の父方のご先祖様は "Eurasian Adam" だということが分かった。 アフリカから、インド、東南アジアを経由して日本にたどり着いたらしい。 日本人の 40% が私と同じルーツを持つそうなので、「ごくありふれた日本人」ということか。

M174 の皆様、遠い親戚になるそうですのでよろしくお願いしますm(_ _)m

[ルーツ]
ルーツ

[Genetic Sequence]
Genetic Sequence

[Genetic History]
Genetic History

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 18, 2006

[Library] JBoss jBPM Process Designer にチャレンジ(2)

JBoss jBPM Process Designer でプロセスを記述してみた。

Process Project の作成、設定など

まずはプロジェクト作成ウィザードを使用して "Process Project" を作成する。 "Process Project" を作成したら、次に "Process" を作成する。 作成された XML をエディタで開くと、プロセス定義をすることができる。

[Process Designer 01]
Process Project の作成
[Process Designer 02]
作成された Process Project
[Process Designer 03]
jBPM の設定
[Process Designer 04]
Process の作成

プロセスの記述

[Process Designer 05]
プロセスエディタ

プロセスエディタが生成した XML は↓

<?xml version="1.0" encoding="UTF-8"?>

<process-definition
  xmlns="http://jbpm.org/3/jpdl"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://jbpm.org/3/jpdl http://jbpm.org/xsd/jpdl-3.0.xsd"
  name="sample-process">
   <start-state name="start">
      <transition name="tr1" to="state1"></transition>
   </start-state>
   <end-state name="end1"></end-state>
   <state name="state1">
      <transition name="tr1" to="decision1"></transition>
   </state>
   <decision name="decision1">
      <transition name="tr1" to="state2"></transition>
      <transition name="tr2" to="state3"></transition>
   </decision>
   <state name="state2">
      <transition name="tr1" to="end1"></transition>
   </state>
   <state name="state3">
      <transition name="tr1" to="end1"></transition>
   </state>
</process-definition>

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 17, 2006

[Library] JBoss jBPM Process Designer にチャレンジ

JBoss jBPM Process Designer とは

JBoss jBPM Process Designer は、JBoss jBPM 用のプロセス定義ツール。 GUI でプロセスを定義することができるので便利。 JBoss 謹製で、Eclipse Plugin として提供されている。

JBoss jBPM Process Designer ドキュメント
http://docs.jboss.com/jbpm/v3/gpd/

JBoss jBPM Process Designer の実行環境構築

JBoss jBPM Process Designer は Eclipse Plugin なので、まず Eclipse を用意する。 ドキュメントによると

This release should work with all Eclipse 3.1 releases starting from M7.
ということなので、現時点(2006/04/17) で最新のプロダクトリリースである 3.1.2 を使用することにする。 JBoss jBPM Process Designer は最新の 3.0.4 を使用する。
  1. Eclipse 3.1.2 をここからダウンロードする
  2. Eclipse をインストールする。以降、インストール先ディレクトリを %ECLIPSE_HOME% と記述する。
  3. JBoss jBPM Process Designer Plugin 3.0.4 をここからダウンロードする
  4. JBoss jBPM Process Designer をインストールする。JBoss jBPM Process Designer のアーカイブ内の plugins, features をそれぞれ%ECLIPSE_HOME%/plugins, %ECLIPSE_HOME%/features にコピーする
  5. Eclipse 3.1.2 の起動確認を行う。
JBoss jBPM Process Designer のアーカイブには EMF や GEF、JEM などの Plugin も同梱されている。 EMF や GEF は Plugin も依存しているので、念のため Eclipse は JBoss jBPM Process Designer 専用のものを用意した。

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 16, 2006

[Library] JBoss jBPM + Hibernate + Derby 連携方法をメモ

JBoss jBPM は DBMS に情報を格納することができる。 この機能をお手軽に試すために Derby と連携させてみた。

jbpm.properties

クラスパスルートに jbpm.properties を作成する。

jbpm.hibernate.cfg.xml=hibernate.cfg.xml

hibernate.cfg.xml

クラスパスルートに hibernate.cfg.xml を作成する。

<?xml version="1.0" ?>

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" >

<hibernate-configuration>
  <session-factory>
    <property name="connection.driver_class">
      org.apache.derby.jdbc.EmbeddedDriver
    </property>
    <property name="connection.url">jdbc:derby:derbyDB</property>
    <property name="dialect">
      org.hibernate.dialect.DerbyDialect
    </property>
    <property name="show_sql">true</property>
    <property name="use_outer_join">true</property>
    <mapping resource="DummyEntity.hbm.xml" />
  </session-factory>
</hibernate-configuration>

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 15, 2006

[Library] JBoss jBPM にチャレンジ

先日調べたワークフローエンジンの中から JBoss jBPM を試してみた。

JBoss jBPM
http://labs.jboss.com/portal/index.html?ctrl:id=page.default.info&project=jbossjbpm

JBoss jBPM の環境構築

JBoss jBPM 3.0.1 の実行環境構築方法は以下の通り。

  1. クラスパスのルートに jbpm.properties を設置する。
    • antlr-2.7.5H3.jar
    • asm-attrs.jar
    • asm.jar
    • bsh-2.0b2.jar
    • cglib-2.1.jar
    • commons-collections-2.1.1.jar
    • commons-logging-1.0.4.jar
    • converter.jar
    • dom4j-1.6.jar
    • ehcache-1.1.jar
    • hibernate3.jar
    • jaxen-1.1-beta-4.jar
    • jbpm-3.0.1.jar
    • jbpm-identity-3.0.1.jar
    • jdbc2_0-stdext.jar
    • jta.jar
  2. クラスパスに以下の jar を追加する。

jbpm.properties は JbpmConfiguration が自動的に読み込む。 jbpmConfiguration が jbpm.properties を探すサーチパスは
  1. クラスパス内の /jbpm.properties
  2. クラスパス内の /org/jbpm/jbpm.properties
となっている。 そのため、クラスパスルートに jbpm.properties を置いておくと JBoss jBPM の設定を変更できる。

とっかかり

とりあえずこの辺りを読めばとりあえず使えるというドキュメントをメモ。

チュートリアル
http://docs.jboss.com/jbpm/v3/userguide/tutorial.html
Graph Oriented Programming
http://docs.jboss.com/jbpm/v3/userguide/graphorientedprogramming.html
jPDL xml schema
http://docs.jboss.com/jbpm/v3/userguide/jpdl.html#d0e4520
Expressions
http://docs.jboss.com/jbpm/v3/userguide/jpdl.html#expressions
Expression Language
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html
Script
http://docs.jboss.com/jbpm/v3/userguide/processmodelling.html#script
beanshell
http://www.beanshell.org/

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 14, 2006

[WebService] Google Calendar で遊ぶ

Google Calendar が公開された。 面白そうなので早速遊んでみることに。 インタフェースは Mac に付属の iCal にそっくり。 かなり使いやすい。 まだカレンダの新規作成などでバグが散見されるが、バグが減って安定してくれば結構使えそう。

[Google Calendar 01]
[Google Calendar 02]
[Google Calendar 03]
[Google Calendar 04]
[Google Calendar 05]

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 13, 2006

[Library] Java で利用可能なワークフローエンジンをメモ

Google 先生に教えてもらったワークフローエンジンをメモ。 Java 用の API が存在する(と思われる)もののみ。

オープンソース製品

ActiveBPEL (ActiveBPEL, LLC., GPL/Commercial License)
http://www.activebpel.org/
Bonita (ECOO Team., LGPL)
http://bonita.objectweb.org/
con:cern
http://con-cern.org/
Dalma
https://dalma.dev.java.net/nonav/maven/index.html
Enhydra Workflow Platform (Together Teamlösungen, LGPL 2.1)
http://www.enhydra.org/workflow/
Enhydra JaWE
http://www.enhydra.org/workflow/jawe/index.html
Enhydra Shark
http://www.enhydra.org/workflow/shark/index.html
Freefluo
http://freefluo.sourceforge.net/
JBoss jBPM
http://labs.jboss.com/portal/index.html?ctrl:id=page.default.info&project=jbossjbpm
JFlower (?, GPL)
http://sourceforge.net/projects/jflower/
Nautica Worklfow (アルゴ21 研究開発センター, LGPL 2.1)
http://nautica.sourceforge.jp/main.html
OpenWFE (?, BSD License)
http://web.openwfe.org/display/openwfe/Home
OSWorkflow (OpenSymphony, The OpenSymphony Software License, Version 1.1)
http://www.opensymphony.com/osworkflow/
S2Buri (まこたん, ASL 2.0)
http://s2buri.sandbox.seasar.org/
Taverna (?, LGPL)
http://taverna.sourceforge.net/
Twister (?, LGPL)
http://www.smartcomps.org/twister/
XFLOW (Rob Tan, ?)
http://xflow.sourceforge.net/
werkflow
http://sourceforge.net/projects/werkflow/

商用製品

j-Flow (関西日本電気)
http://www.scs.co.jp/product/gaiyo/jflow.html
Flux Workflow (Flux Corporation.)
http://www.fluxcorp.com/workflow/
Global Flow (Panasonic Solution Technologies Co.)
http://panasonic.co.jp/pss/pstc/products/gf/flow/index.html
Green Office Workflow (京セラコミュニケーションシステム株式会社)
http://www.kccs.co.jp/products/workflow/index.html
Groupmax (日立)
http://www.hitachi.co.jp/Prod/comp/soft1/groupmax/
MajorFlow (松下ネットソリューションズ株式会社)
http://www.mnes.co.jp/Home/products.nsf/ContentsByKey/MajorFlow_Top
MELDandy (三菱電機情報ネットワーク株式会社)
http://www.mind.co.jp/service/application/appli_package/meldandy/index.html
OptimalFlow (株式会社NTTデータビジネスブレインズ)
http://www.nttd-bb.com/solution/total/solution4/index.html
WebLogic Integration (BEA Systems, Inc.)
http://www.beasys.co.jp/products/weblogic/integration/index.html

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 12, 2006

[AS] Apache Web Server 2、lighttpd、JBossWeb のパフォーマンス比較

JBossWeb のパフォーマンス感が知りたくて、大雑把なパフォーマンス比較をしてみた。 それぞれインストールしただけの Apache Web Server 2、JBossWeb に JMeter で負荷をかけてみた。 また、ついでに lighttpd も試してみた。

テスト環境

  • Debian Sarge on VMWare Player
  • Kernel 2.6.8-2-386

テスト方法

  1. 各サーバのドキュメントルートに以下の "index.html" を作成する。
    <html>
    <head>
      <title>dummy page</title>
    </head>
    <body>
      This is a dummy page.
    </body>
    </html>
    
  2. JMeter で 1000 回程度 "/index.html" を GET する。(このときの結果は無視)
  3. JMeter でスレッド数 10、20、30、40、50 の状態で "/index.html" を 1000 回 GET し、パフォーマンスを計測する。

テスト結果

Apache Web Server 2

# /usr/sbin/apache2 -v
Server version: Apache/2.0.54
Server built:   Sep  5 2005 11:11:08
スレッド数 Samples Average Median 90% Line Min Max Error % Throughput KB/sec
10 10000 9 0 16 0 1734 0.00% 824.7/sec 78.93
20 20000 18 15 31 0 3562 0.00% 859.7/sec 82.27
30 30000 28 16 32 0 3609 0.00% 913.0/sec 87.38
40 40000 35 15 47 0 11078 0.00% 815.0/sec 78.00
50 50000 48 16 78 0 12218 0.00% 810.3/sec 77.55

lighttpd

# /usr/sbin/lighttpd -v
lighttpd-1.4.11 (ssl) - a light and fast webserver
Build-Date: Mar 27 2006 09:56:59
スレッド数 Samples Average Median 90% Line Min Max Error % Throughput KB/sec
10 10000 5 0 16 0 485 0.00% 1406.7/sec 134.62
20 20000 15 16 31 0 235 0.00% 1175.4/sec 112.49
30 30000 23 16 47 0 313 0.00% 1209.1/sec 115.71
40 40000 32 31 62 0 204 0.01% 1151.6/sec 110.32
50 50000 41 47 63 0 297 0.01% 1140.8/sec 109.27

Apache Web Server 2

# ./run.sh --version
=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /opt/jbossweb

  JAVA: /opt/jdk15/bin/java

  JAVA_OPTS: -server -Xms128m -Xmx128m -Dprogram.name=run.sh

  CLASSPATH: /opt/jbossweb/bin/run.jar:/opt/jdk15/lib/tools.jar

=========================================================================

JBoss 4.0.4RC1 (build: CVSTag=JBoss_4_0_4_RC1 date=200602071519)

Distributable under LGPL license.
See terms of license at gnu.org.
スレッド数 Samples Average Median 90% Line Min Max Error % Throughput KB/sec
10 10000 10 0 16 0 625 0.00% 856.8/sec 81.99
20 20000 21 0 16 0 12984 0.00% 817.9/sec 78.27
30 30000 32 15 31 0 13750 0.00% 763.7/sec 73.09
40 40000 48 15 62 0 6703 0.00% 739.0/sec 70.73
50 50000 59 16 94 0 12922 0.00% 750.1/sec 71.79

Apache Tomcat 5.5

Apache Tomcat 5.5.16 の計測結果を以下に示す。

スレッド数 Samples Average Median 90% Line Min Max Error % Throughput KB/sec
10 10000 8 0 16 0 562 0.00% 959.5/sec 91.83
20 20000 19 0 16 0 10844 0.00% 888.9/sec 85.07
30 30000 28 0 16 0 20766 0.00% 901.0/sec 86.23
40 40000 36 0 16 0 8953 0.00% 886.4/sec 84.83
50 50000 51 0 16 0 12844 0.00% 866.7/sec 82.95

まとめ

未チューニング状態では、JBossWeb のパフォーマンスは Apache Web Server 2 より多少遅いレベルの様だ。 当然ながら Apache Tomcat とも大差ない結果となっている。 それにしても、lighttpd は light と銘打つだけあって流石に速い。 それにしても、Apache Web Server 2 が JBossWeb や Apache Tomcat と同等だったのが意外だった。 もう少し速いイメージがあったのだけれど。

[Throughput]
[KB/sec]

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 11, 2006

[AS] JBossWeb にチャレンジ

JBossWeb とは

JBossWeb は、JBoss AS をシンプルにして Web サーバ機能のみを残したもの。 要するに「ほぼ」Apache Tomcat ということだろう。 当然 Servlet や JSP の動作環境も提供される。

JBossWeb
http://labs.jboss.com/portal/index.html?ctrl:id=page.default.info&project=jbossweb
JBossWeb Download
http://labs.jboss.com/portal/index.html?ctrl:id=page.default.downloads&project=jbossweb

JBossWeb のインストール

Debian Sarge 上に JBossWeb をインストールしたときのメモ。

  1. こちらから JBossWeb のバイナリをダウンロードする。ここでは jbossweb-4.0.4RC1-linux-i686.tar.gz を前提とする。
  2. アーカイブを解凍して、適当な位置に配置する。
    # tar zxvf ./jbossweb-4.0.4RC1-linux-i686.tar.gz
    # mv ./jbossweb-4.0.4RC1-linux-i686 /opt
    # ln -s /opt/jbossweb-4.0.4RC1-linux-i686 /opt/jbossweb
    
  3. シェルスクリプトのパーミッションを変更する。
    # chmod 755 /opt/jbossweb/bin/*.sh
    
  4. Java の動作環境を設定する。
    # export JAVA_HOME=/opt/jdk15
    # export PATH=$JAVA_HOME/bin:$PATH
    # java -version
    java version "1.5.0_05"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_05-b05)
    Java HotSpot(TM) Client VM (build 1.5.0_05-b05, mixed mode, sharing)
    
  5. 必要に応じてサーバの設定を変更する。 例えば、HTTP のポートを変更する場合は /opt/jbossweb/server/default/deploy/jbossweb.sar/server.xml を変更する。
  6. 起動する。
    # cd /opt/jbossweb/bin
    # ./run.sh
    

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 10, 2006

[Misc] Jabberd のインストールにチャレンジ

Jabberd を Debian Sarge にインストールしてみた。 Jabberd は APT で簡単にインストールできる。

jabberd 1.4
http://jabberd.jabberstudio.org/1.4/
jabberdの動かし方
http://nantoka.kicks-ass.net/wiki/index.php?%5B%5Bjabberd%A4%CE%C6%B0%A4%AB%A4%B7%CA%FD%5D%5D
# apt-get install jabber jabber-aim jabber-common jabber-dev jabber-jit jabber-jud jabber-msn jabber-muc jabber-yahoo
パッケージリストを読みこんでいます... 完了
依存関係ツリーを作成しています... 完了
以下の特別パッケージがインストールされます:
  libcurl3 libexpat1-dev libglib1.2 libglib2.0-0 libpth-dev libpth2 libssl-dev
提案パッケージ:
  libcurl3-gssapi ca-certificates libpth-dbg libpth-prof
推奨パッケージ:
  libglib2.0-data
以下のパッケージが新たにインストールされます:
  jabber jabber-aim jabber-common jabber-dev jabber-jit jabber-jud jabber-msn
  jabber-muc jabber-yahoo libcurl3 libexpat1-dev libglib1.2 libglib2.0-0
  libpth-dev libpth2 libssl-dev
アップグレード: 0 個、新規インストール: 16 個、削除: 0 個、保留: 9 個。
4532kB のアーカイブを取得する必要があります。
展開後に追加で 13.1MB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://http1.debian.or.jp sarge/main jabber-common 0.4 [3848B]
取得:2 http://http1.debian.or.jp sarge/main libpth2 2.0.1-2 [73.5kB]
インストールされた Jabberd のバージョンを確認してみる。
# /usr/sbin/jabberd -v
Jabberd Version 1.4.3
インストールが終了すると Jabberd は自動的に起動される。
# ps -ef | grep jabber
jabber    1104     1  0 12:00 ?        00:00:00 /usr/sbin/jabberd
jabber    1106  1104  0 12:00 ?        00:00:00 /usr/sbin/jabberd
root      1145   872  0 12:01 pts/0    00:00:00 grep jabber

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 09, 2006

[Misc] Java における慣習的命名

Manager というクラスの命名に関連して、Java における慣習的な命名を調べてみた。 調査方法は以下の通り。

  1. 調査対象は公開されているオープンソースライブラリ。
  2. Maven2 の公開リポジトリ(http://repo1.maven.org/maven2) に登録されているライブラリから適当に Jar アーカイブを選択
  3. Jar アーカイブ内の全クラス、全メソッドを抽出
  4. クラス名、メソッド名をキャメルノーてーションを前提として単語に分割
  5. 単語毎に出現回数をカウント
調査対象となった Jar アーカイブ、クラス、メソッドの個数は以下の通り。
  • Jar アーカイブ ・・・ 1179
  • クラス ・・・ 129152
  • メソッド ・・・ 943841

慣習的クラス名

クラス名として使用されている単語の TOP 30 は以下の通り。 件の Manager も 27 位にランクインしている。

順位 単語 カウント数
01 Impl 7817
02 Factory 6171
03 Type 4676
04 Exception 4596
05 Element 3170
06 Map 2928
07 Key 2723
08 Document 2622
09 Context 2361
10 Abstract 2328
11 Handler 2221
12 Bean 2215
13 Class 2196
14 Set 2110
15 Xml 2106
16 Hash 2073
17 Object 2026
18 Info 2010
19 Helper 1915
20 Resource 1900
21 Holder 1757
22 List 1756
23 Property 1731
24 Message 1671
25 Tag 1671
26 Default 1655
27 Manager 1655
28 Event 1622
29 Name 1600
30 Attribute 1575

慣習的メソッド名

メソッド名として使用されている単語の TOP 30 は以下の通り。

順位 単語 カウント数
01 get 240349
02 set 107927
03 Name 33048
04 is 32509
05 Value 25894
06 Type 23199
07 add 22824
08 String 18564
09 create 18113
10 new 16511
11 to 14490
12 Class 13125
13 Instance 12121
14 Element 11662
15 Id 11543
16 Set 10390
17 Object 9427
18 Attribute 9413
19 remove 9336
20 Array 9113
21 To 9084
22 Stream 7733
23 Property 7654
24 Message 6936
25 Key 6931
26 Node 6794
27 XML 6726
28 write 6190
29 Data 6150
30 New 6102

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 08, 2006

[Misc] Manager というクラスの命名

Radium Software DevelopmentさんのSomethingManagerというエントリを読んで。

クラス名に "Manager" という接尾語を用いていることは,そのクラスの設計に不備があることを暗に告げていると考えることができる。このような,クラス名から伝わってくる「兆候」 ― いわゆる "code smell" [Wikipedia] は,他にも幾つか見つけることができる。例えば "Object", "Handler", "Data" などがこれに含まれる [C2Wiki] 。これらの接尾語をクラス名に見つけたならば,そのクラスの設計を見直すことを考えた方が良いかもしれない。

確かに言われてみると、"Manager" という命名は責務が曖昧になりがちだ。 ただ、"Manager" という命名のクラスが即クラス設計のミスだとは思えない。 逆に "Manager" クラスの責務を規定しても良いのではないだろうか??

Code smell

Manager という命名など、コードのきな臭さのことを Code smell というらしい。 Code smell によると

code smell is a jargon term used among programmers to refer to a symptom that indicates something may be wrong.
ということらしい。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 07, 2006

[Misc] Jabber Server にチャレンジ

複数の IM を使用しなければならない状況が次第に増えてきた。 主に Google Talk と MSN Messenger。 使い分けが面倒になってきたので、IM クライアントを一つに統一したい。 というわけで、Jabber クライアントに乗り換えることに。 ついでなので、Jabber Server も少し調べてみることに。 Jabber Server が簡単に立てられるようなら、自分専用で用意してみようと思う。

IM Federation - Software
http://imfederation.com/software.html
Jabber :: Software :: Servers
http://www.jabber.org/software/servers.shtml

Jabbered

リストアップされていた Jabber Server の中から Jabberd を調べてみることに。 Jabberd を選択したのは、Debian Sarge の場合 apt でインストールできるため。 当然設定も Debian に合わせてカスタマイズしてあるはず。

jabberd 1.4
http://jabberd.jabberstudio.org/1.4/
jabberdの動かし方
http://nantoka.kicks-ass.net/wiki/index.php?%5B%5Bjabberd%A4%CE%C6%B0%A4%AB%A4%B7%CA%FD%5D%5D
# apt-cache search jabber
jabber - Daemon for the jabber.org Open Source Instant Messenger
jabber-aim - Provides AIM messenger transport for Jabber IM server
jabber-common - Jabber server and transport (common files)
jabber-dev - Daemon for the jabber.org Open Source Instant Messenger
jabber-jit - Jabber ICQ Transport
jabber-jud - Provides User Directory support for the Jabber IM server
jabber-msn - Provides the MSN transport for the Jabber IM server
jabber-muc - Multi User Chat module for the Jabber IM Server
jabber-yahoo - Provides Yahoo messenger transport for Jabber IM server

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 06, 2006

[Tiger] Java の Unicode 4 サポート

Java が Java 5.0 で Unicode 4 にバージョンアップしてたことを最近知った。 Unicode 4 は 1 文字 16bit では表現できないコード体系になっているらしい。 Java は 1 文字 16bit を前提としている言語になっている。 char は 16bit で確保されているし。 Unicode 4 のサポートは結構オオゴトな気がするのだが、どうなっているのだろう。 というわけで、少々調べてみることにした。

JSR-000204 Unicode Supplementary Character Support (Final Release)
http://jcp.org/aboutJava/communityprocess/final/jsr204/index.html
The Java Language Specification
http://java.sun.com/docs/books/jls/index.html
JSR-000204 Unicode Supplementary Character Support (Proposed Final Draft)
http://jcp.org/aboutJava/communityprocess/first/jsr204/index.html
Java プラットフォームにおける補助文字のサポート
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/index_ja.html
Unicode 4.0 の補助文字のサポート Supplementary Char
http://www.javainthebox.net/laboratory/J2SE1.5/MiscAPI/SupplementaryChar/SupplementaryChar.html

Unicode 4 のコード体系

Unicode 3 までの Unicode は 1 文字 16bit で固定されていた。 Unicode 4 では、コード体系が下記の様に拡張されている。

  • 0x0000 - 0xFFFF ・・・ BMP(Basic Multilingual Plane, 基本多言語面)
  • 0x10000 - 0x1FFFFF ・・・ SMP(Supplementary Multilingual Plane, 補助的多言語面)
    • 0x10000 - 0x1FFFF ・・・ Plane 1
    • 0x20000 - 0x2FFFF ・・・ Plane 2
    • 0x30000 - 0x3FFFF ・・・ Plane 3
    • 0x40000 - 0x4FFFF ・・・ Plane 4
    • 0x50000 - 0x5FFFF ・・・ Plane 5
    • 0x60000 - 0x6FFFF ・・・ Plane 6
    • 0x70000 - 0x7FFFF ・・・ Plane 7
    • 0x80000 - 0x8FFFF ・・・ Plane 8
    • 0x90000 - 0x9FFFF ・・・ Plane 9
    • 0xA0000 - 0xAFFFF ・・・ Plane 10
    • 0xB0000 - 0xBFFFF ・・・ Plane 11
    • 0xC0000 - 0xCFFFF ・・・ Plane 12
    • 0xD0000 - 0xDFFFF ・・・ Plane 13
    • 0xE0000 - 0xEFFFF ・・・ Plane 14
    • 0xF0000 - 0xFFFFF ・・・ Plane 15
    • 0x100000 - 0x10FFFF ・・・ Plane 16
というわけで、コード体系が大きく変更されている。 Unicode の Glossary of Unicode Terms にも見慣れない言葉が追加されている。
Supplementary Character
A Unicode encoded character having a supplementary code point.
Supplementary Code Point
A Unicode code point between U+10000 and U+10FFFF.
Supplementary Planes
Planes 1 through 16, consisting of the supplementary code points.
Surrogate Character
A misnomer. It would be an encoded character having a surrogate code point, which is impossible. Do not use this term.
Surrogate Code Point
A Unicode code point in the range U+D800 through U+DFFF. Reserved for use by UTF-16, where a pair of surrogate code units (a high surrogate followed by a low surrogate) “stand in” for a supplementary code point.
Surrogate Pair
A representation for a single abstract character that consists of a sequence of two 16-bit code units, where the first value of the pair is a high-surrogate code unit, and the second is a low-surrogate code unit. (See definition D27 in Section 3.8, Surrogates.)
の辺りは覚えておいた方がよさそうか。

Posted in Tiger | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 05, 2006

[VMWare] Virtual Server 2005 にチャレンジ

Virtual Server とは

Virtual Server は Microsoft 製の仮想化ソフト。 VMWare と同種のソフトウェア。 今は Microsoft 製品だけれど Virtual PC 同様 Microsoft に買収された Connectix が開発したもの。 VMWare で特に困ったことはないが、最近フリーで公開されたので試してみることに。

Download or Order Virtual Server 2005 R2 Enterprise Edition for Free
http://www.microsoft.com/windowsserversystem/virtualserver/software/default.mspx
Virtual Server 2005 R2 Software Download Registration
http://www.microsoft.com/windowsserversystem/virtualserver/software/privacy.mspx

Virtual Server のインストール

  1. ダウンロードページへ行く。
  2. "Change Language" で言語を日本語に変更する。
  3. "32 ビット X86 実行可能ファイル" というリンクからバイナリ("setup.exe")をダウンロードする。
  4. "setup.exe" を実行するとインストーラが起動する。
インストーラに「Virtual Server Web アプリケーション」は IIS が必要だと言われた。 クライアント用途の PC なので当然 IIS は入っていない。 とりあえず「カスタムセットアップ」を選択して「Virtual Server Web アプリケーション」を外してインストールを続行。 問題なくインストールは終了。

Virtual Machine の作成

Virtual Server は入ったが、Virtual Machine の作成方法が分からない。 ファーストステップガイドを読んでみたところ「バーチャル マシンを作成するには、管理 Web サイトを開きます。」と書かれていた。 どうやら「Virtual Server Web アプリケーション」が無ければ Virtual Machine を作成できないらしい。 色々調べてみたが他の Virtual Machine 作成方法は見つからなかった。 IIS はインストールしたくないので、ここで断念。 CUI のツールを用意して欲しいな。

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 04, 2006

[DocBook] DocBook Doclet にチャレンジ

DocBook Doclet

DocBook Doclet は Javadoc のカスタム doclet。 API Document を PDF や Docbook 形式など様々な形式で出力することができるスグレモノ。 API Document を Docbook 形式で出力できると便利なので早速試してみた。

dbdoclet
http://www.michael-a-fuchs.de/index.html

DocBook Doclet のインストール

DocBook Doclet は、Javadoc へ組み込んで使用する jar と単体で動作する GUI アプリケーションの 2 種類のバイナリが提供されている。 とりあえず時間もないので GUI アプリケーションを試してみることに。

  1. こちらから Windows 用のバイナリをダウンロードする。ここでは dbdoclet-0_70_1.exe を使用。
  2. ダウンロードしたバイナリを実行するとインストーラが起動するので、後はインストーラの指示通りにインストールする。
    但し、インストール先ディレクトリはスペースが含まれないパスに変更した。念のためだけれど。
  3. デスクトップ上に作成されるショートカットを削除(使用できなかったので)
  4. 起動用のバッチファイルを作成
    set JAVA_HOME=c:\_java\jdk\1.5.0_06
    set PATH=%JAVA_HOME%\bin;%PATH%
    set DOCLET_HOME=C:\_java\tool\DocBookDoclet
    set DOCLET_JAR=%DOCLET_HOME%\jars\tidbit.jar
    
    java.exe -Xmx512m -Dhome=%DOCLET_HOME% -jar %DOCLET_JAR%
    

DocBook Doclet で DocBook 形式の API Document 作成

  1. 上で作成した起動用バッチファイルを使用して DocBook Doclet を起動する。
  2. プロジェクトを新規作成する
  3. "Project" タブで "Project name"、"Destination directory" を設定
  4. "Sources" タブで "Sourcepath" を設定して "Add" ボタンを押下
  5. "Classpath" タブで "Classpath" を設定して "Add" ボタンを押下
  6. 必要に応じて "Javadoc"、"DocBook XML"、"PDF layout"、"Trafo" も設定
  7. "DocBook" ボタンを押下
  8. "Destination directory" で指定したディレクトリの中に docbook/Reference.xml が生成される
[dbdoclet]

Posted in DocBook | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 03, 2006

[Library] NGramJ にチャレンジ

NGramJ とは

NGramJ は、Natural Language Processing(NLP)用のライブラリ。 与えられたバイト配列の言語、文字エンコーディングを判別してくれる。 たとえば、"竹やぶに竹立てかけた。"という文字列を Shift_JIS のバイト配列で NGramJ に引き渡すと、「Shift_JIS の日本語」であることを判断してくれる。

NGramJ
http://ngramj.sourceforge.net/index.html
API Document
http://ngramj.sourceforge.net/javadoc/index.html

NGramJ の実行環境構築

  1. こちらから NGramJ をダウンロードする。ここでは ver.1.0-0.060327 を前提とする。
  2. アーカイブの中にある以下の ngramj.jar をクラスパスに追加する。

サンプルコード

とりあえず日本語と英語の判別を試してみた。

package jp.in_vitro.codelets.ngramj;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Logger;

import de.spieleck.app.ngramj.Categorizer;
import de.spieleck.app.ngramj.EntryProfile;
import de.spieleck.app.ngramj.Profile;
import de.spieleck.app.ngramj.lm.CategorizerImpl;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws IOException {
        Codelet me = new Codelet();
        me.execute01();
        me.execute02();
        me.execute03();
        me.execute04();
    }

    protected void execute01() throws IOException {
        String target = "竹やぶに竹立てかけた。";
        InputStream is = new ByteArrayInputStream(target
                .getBytes("Shift_JIS"));
        Profile profile = this.match(is);
        
        Logger.global.info("" + target + " -> " + profile);
    }

    protected void execute02() throws IOException {
        String target = "竹やぶに竹立てかけた。";
        InputStream is = new ByteArrayInputStream(target
                .getBytes("EUC-JP"));
        Profile profile = this.match(is);
        
        Logger.global.info("" + target + " -> " + profile);
    }

    protected void execute03() throws IOException {
        String target = "竹やぶに竹立てかけた。";
        InputStream is = new ByteArrayInputStream(target
                .getBytes("UTF-8"));
        Profile profile = this.match(is);
        
        Logger.global.info("" + target + " -> " + profile);
    }

    protected void execute04() throws IOException {
        String target = "This is a pen. Who cares?";
        InputStream is = new ByteArrayInputStream(target
                .getBytes("ISO-8859-1"));
        Profile profile = this.match(is);
        
        Logger.global.info("" + target + " -> " + profile);
    }


    protected Profile match(final InputStream is) throws IOException {

        Categorizer categorizer = new CategorizerImpl();
        EntryProfile entryProfile = new EntryProfile(is);
        Profile profile = categorizer.match(entryProfile);

        return profile;
    }
}

実行結果

日本語の UTF-8 は判別できなかった。調べてみると標準で用意されている日本語プロファイルは Shift_JIS と EUC-JP だけだった。 Shift_JIS、EUC-JP 以外の文字エンコーディングを使用する場合は、自分でプロファイルを作成する必要がある。

2006/04/03 2:05:59 jp.in_vitro.codelets.ngramj.Codelet execute01
情報: 竹やぶに竹立てかけた。 -> japanese-shift_jis.lm
2006/04/03 2:05:59 jp.in_vitro.codelets.ngramj.Codelet execute02
情報: 竹やぶに竹立てかけた。 -> japanese-euc_jp.lm
2006/04/03 2:06:00 jp.in_vitro.codelets.ngramj.Codelet execute03
情報: 竹やぶに竹立てかけた。 -> armenian.lm
2006/04/03 2:06:00 jp.in_vitro.codelets.ngramj.Codelet execute04
情報: This is a pen. Who cares? -> english.lm

標準提供されるプロファイル

今回使用したバージョンでは下記のプロファイルが添付されていた。 実際に使用するのであれば、日本語関連で文字エンコーディングをいくつか追加する必要がありそう。

afrikaans.lm
albanian.lm
amharic-utf.lm
arabic-iso8859_6.lm
arabic-windows1256.lm
armenian.lm
basque.lm
belarus-windows1251.lm
bosnian.lm
breton.lm
bulgarian-iso8859_5.lm
catalan.lm
chinese-big5.lm
chinese-gb2312.lm
croatian-ascii.lm
czech-iso8859_2.lm
danish.lm
dutch.lm
english.lm
esperanto.lm
estonian.lm
finnish.lm
french.lm
frisian.lm
georgian.lm
german.lm
greek-iso8859-7.lm
hawaian.lm
hebrew-iso8859_8.lm
hindi.lm
hungarian.lm
icelandic.lm
indonesian.lm
irish.lm
italian.lm
japanese-euc_jp.lm
japanese-shift_jis.lm
korean.lm
latin.lm
latvian.lm
lithuanian.lm
malay.lm
manx.lm
marathi.lm
middle_frisian.lm
mingo.lm
nepali.lm
norwegian.lm
persian.lm
polish.lm
portuguese.lm
quechua.lm
romanian.lm
rumantsch.lm
russian-iso8859_5.lm
russian-koi8_r.lm
russian-windows1251.lm
sanskrit.lm
scots.lm
scots_gaelic.lm
serbian-ascii.lm
slovak-ascii.lm
slovak-windows1250.lm
slovenian-ascii.lm
slovenian-iso8859_2.lm
spanish.lm
swahili.lm
swedish.lm
tagalog.lm
tamil.lm
thai.lm
turkish.lm
ukrainian-koi8_r.lm
vietnamese.lm
welsh.lm
yiddish-utf.lm

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 02, 2006

Apr 01, 2006

[WebService] Yahoo!オークション API にチャレンジ

Yahoo!オークションも遂に API 公開ということで少し遊んでみた。

Yahoo!デベロッパーネットワーク - Yahoo!オークション
http://developer.yahoo.co.jp/auctions/
カテゴリ情報
http://developer.yahoo.co.jp/auctions/categorytree/V1/rest/categorytree.html
商品リスト
http://developer.yahoo.co.jp/auctions/categoryleaf/V1/rest/categoryleaf.html
出品リスト
http://developer.yahoo.co.jp/auctions/sellinglist/V1/rest/sellinglist.html

Yahoo!オークション API を使用したサンプルアプリケーション

Ajax を利用した Yahoo!オークション API サンプルアプリケーション。 "+" をクリックするとツリーが展開される。 リーフノードに表示される"[OPEN]"をクリックすると、出品されているアイテムの 1 ページ目を表示する。 ただそれだけ。

ちなみに、Web ブラウザは IE のみ対応。 Ajax なので当然要 JavaScript。


  • + オークション

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 31, 2006

[Mustang] JapaneseImperialCalendar にチャレンジ

Mustang では遂に和暦がサポートされるらしい!!

JavaWorld 2006/05
を貰ったので何となく眺めていたら、とある記事で紹介されていた。 java.util.Calendar の実装クラスがパッケージプライベートなので API Document を眺めていても全く気付いていなかった。 Calendar の和暦サポートは Mustang でも流れたとばかり思っていた。 JavaWorld は久しぶりに開いたけれど、軽くでも毎月目を通すべきかもしれないな。

JavaWorld の記事中でも紹介されていた JapaneseImperialCalendar の紹介ページは↓

Java SE 6 Mustang じゃじゃ馬ならし 官公庁向けでも大丈夫 - 和暦
http://www.javainthebox.net/laboratory/JavaSE6/imperialcalendar/imperialcalendar.html

サンプルコード

package jp.in_vitro.codelets.util;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

public class Codelet {

    private Date date = new Date(System.currentTimeMillis());

    public Codelet() {
        super();
    }

    public static void main(final String[] args) {
        Codelet me = new Codelet();
        me.execute00();
        me.execute01();
        me.execute02();
        me.execute03();
    }

    protected void execute00() {
        Locale locale = new Locale("ja", "JP");
        Calendar cal = Calendar.getInstance(locale);

        System.out
                .println("0*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : " + locale);
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute01() {
        Locale locale = new Locale("ja", "JP", "JP");
        Calendar cal = Calendar.getInstance(locale);

        System.out
                .println("1*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : " + locale);
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute02() {
        Locale.setDefault(new Locale("ja", "JP"));
        Calendar cal = Calendar.getInstance();

        System.out
                .println("2*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : null");
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }

    protected void execute03() {
        Locale.setDefault(new Locale("ja", "JP", "JP"));
        Calendar cal = Calendar.getInstance();

        System.out
                .println("3*************************************************************");

        System.out.println("Default Locale : " + Locale.getDefault());
        System.out.println("Calendar#getInstance : null");
        System.out.println();
        System.out.println("" + cal);
        DateFormat format0 = new SimpleDateFormat("GGGGyy年MMMMdd日");
        System.out.println("GGGGyy年MMMMdd日 : " + format0.format(this.date));
        DateFormat format1 = new SimpleDateFormat("GGGyy年MMMMdd日");
        System.out.println("GGGyy年MMMMdd日 : " + format1.format(this.date));
        DateFormat format2 = new SimpleDateFormat("GGGGyy/MM/dd");
        System.out.println("GGGGyy/MM/dd : " + format2.format(this.date));
        DateFormat format3 = new SimpleDateFormat("GGGyy/MM/dd");
        System.out.println("GGGyy/MM/dd : " + format3.format(this.date));
        System.out.println();
    }
}

実行結果

0, 2, 3 の結果は理解できる。 1 は何故こうなるのだろう?? バグなのか仕様なのか・・・。 Mustang が正式にリリースされたら試してみるか。

0*************************************************************
Default Locale : ja_JP
Calendar#getInstance : ja_JP

java.util.GregorianCalendar[time=1143914626604,areFieldsSet=true,areAllFieldsSet
=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=324000
00,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1
,minimalDaysInFirstWeek=1,ERA=1,YEAR=2006,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_MONTH=
2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOU
R=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=604,ZONE_OFFSET=32400000,DST_OF
FSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

1*************************************************************
Default Locale : ja_JP
Calendar#getInstance : ja_JP_JP

java.util.JapaneseImperialCalendar[time=1143914626664,areFieldsSet=true,areAllFi
eldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset
=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayO
fWeek=1,minimalDaysInFirstWeek=1,ERA=4,YEAR=18,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_M
ONTH=2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=
0,HOUR=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,D
ST_OFFSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

2*************************************************************
Default Locale : ja_JP
Calendar#getInstance : null

java.util.GregorianCalendar[time=1143914626664,areFieldsSet=true,areAllFieldsSet
=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset=324000
00,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayOfWeek=1
,minimalDaysInFirstWeek=1,ERA=1,YEAR=2006,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_MONTH=
2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOU
R=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,DST_OF
FSET=0]
GGGGyy年MMMMdd日 : 西暦06年4月02日
GGGyy年MMMMdd日 : 西暦06年4月02日
GGGGyy/MM/dd : 西暦06/04/02
GGGyy/MM/dd : 西暦06/04/02

3*************************************************************
Default Locale : ja_JP_JP
Calendar#getInstance : null

java.util.JapaneseImperialCalendar[time=1143914626664,areFieldsSet=true,areAllFi
eldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Tokyo",offset
=32400000,dstSavings=0,useDaylight=false,transitions=10,lastRule=null],firstDayO
fWeek=1,minimalDaysInFirstWeek=1,ERA=4,YEAR=18,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_M
ONTH=2,DAY_OF_MONTH=2,DAY_OF_YEAR=92,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=
0,HOUR=3,HOUR_OF_DAY=3,MINUTE=3,SECOND=46,MILLISECOND=664,ZONE_OFFSET=32400000,D
ST_OFFSET=0]
GGGGyy年MMMMdd日 : 平成18年4月02日
GGGyy年MMMMdd日 : H18年4月02日
GGGGyy/MM/dd : 平成18/04/02
GGGyy/MM/dd : H18/04/02

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 30, 2006

Mar 29, 2006

[Maven] Maven2 で API Document を生成する方法

Maven2 では maven-javadoc-plugin というプラグインが提供されており、このプラグインを使用することで簡単に API Document を生成できる。 但し、デフォルトの設定ではお約束のように 2 バイト文字が文字化けするので、多少設定が必要。

javadoc:javadoc
http://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html

maven-javadoc-plugin の設定方法

<pom>
  <organization>
    <name>in-vitro.jp</name>  ←改行コードが入るとエラー
    <url>http://www.in-vitro.jp/</url>
  </organization>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
</pom>

maven-javadoc-plugin の実行方法

JDK と Maven2 にパスを通したコンソールから、下記のコマンドを実行する。 生成された API Document は target/site に出力される。

  > mvn site

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 27, 2006

[Misc] Named Capture メモ

最速インターフェース研究会さんのNamedCapture for JavaScriptでNamed Captureというものを知った。 日本語では「名前付きキャプチャ」と言うらしい。 Named Capture は正規表現の Syntax で、(?P<name>regexp) と言うように名前を指定することで今までマッチした順序を数値で指定していたところが名前でアクセスできるようになるらしい。 細かい改良だけれど、意外と便利そう。

.NET での正規表現の使用
http://japan.internet.com/developer/20050822/28.html
グループ化構成体
http://msdn.microsoft.com/library/ja/cpgenref/html/cpcongroupingconstructs.asp?frame=true
Named Capture Groups
http://regular-expressions.info/named.html
http://regular-expressions.info/ の情報を信じるならば、Named Capture は Python がオリジナルらしい。 そして、Microsoft は .Net で同様の機能を取り入れたが、その際に Syntax を独自のものにしてしまったようだ。いつものことだが迷惑極まりない。
The regular expression classes of the .NET framework also support named capture. Unfortunately, the Microsoft developers decided to invent their own syntax, rather than follow the one pioneered by Python.

Python で Named Capture にチャレンジ

$ python
Python 1.5.2 (#1, Jan 31 2003, 11:01:49)  [GCC 2.96 20000731 (Red Hat Linux 7.2 2 on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import re
>>> search = re.compile("(?P[a-zA-Z]+)")
>>> line = "123abc456"
>>> result = search.search(line)
>>> print result.group('alphabet')
abc
>>> print result.group(0)
abc
>>>

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 26, 2006

[Library] MockObjects

MockObjects とは

MockObjects は、Javaのテスト用ライブラリで様々なモックの詰め合わせ。 単体テストを真面目に行おうとすると、とかくモックだの何だのが必要になるのでこれがあると便利。 類似のライブラリには SpringFrameworkPackage org.springframework.mock.webPackage org.springframework.mock.jndi がある。

MockObjects
http://www.mockobjects.com/FrontPage.html
http://www.mockobjects.com/ (2007.05.23 変更)
API Document
http://mockobjects.sourceforge.net/javadoc/1.4/
Using Mock Objects in Java
http://javaboutique.internet.com/tutorials/mock_objects/
MockObjects ってなに?
http://genjo9.lit.let.hokudai.ac.jp/keita/read.cgi?MockObjects

MockObjects が提供するモック

  • com.mockobjects.beans
    • MockPropertyChangeListener
  • com.mockobjects.io
    • MockFile
    • MockFileInputStream
    • MockIOFactory
    • MockOutputStream
    • MockPrintStream
    • MockPrintWriter
    • MockWriter
  • com.mockobjects.jms
    • MockConnection
    • MockMapMessage
    • MockMessage
    • MockMessageConsumer
    • MockMessageProducer
    • MockMessagePublisher
    • MockObjectMessage
    • MockQueue
    • MockQueueConnection
    • MockQueueConnectionFactory
    • MockQueueReceiver
    • MockQueueSender
    • MockQueueSession
    • MockSession
    • MockTemporaryQueue
    • MockTextMessage
    • MockTopic
    • MockTopicConnection
    • MockTopicConnectionFactory
    • MockTopicPublisher
    • MockTopicSession
    • MockTopicSubscriber
  • com.mockobjects.mail
    • MockMessage
    • MockService
    • MockSession
    • MockTransport
  • com.mockobjects.mail.internet
    • MockMimeMessage
    • MockMimeMessageFactory
  • com.mockobjects.naming
    • MockContext
  • com.mockobjects.naming.directory
    • MockAttribute
    • MockAttributes
    • MockDirContext
    • MockNamingEnumeration
  • com.mockobjects.net
    • MockSocket
    • MockSocketFactory
  • com.mockobjects.rmi
    • MockNaming
  • com.mockobjects.servlet
    • MockBodyContent
    • MockFilterChain
    • MockFilterConfig
    • MockHttpServletRequest
    • MockHttpServletResponse
    • MockHttpSession
    • MockJspWriter
    • MockPageContext
    • MockRequestDispatcher
    • MockServletConfig
    • MockServletContext
    • MockServletInputStream
    • MockServletOutputStream
  • com.mockobjects.sql
    • MockArray
    • MockConnection
    • MockConnection2
    • MockDatabaseMetaData
    • MockDataSource
    • MockDriver
    • MockMultiRowResultSet
    • MockPreparedStatement
    • MockResultSetMetaData
    • MockSingleRowResultSet
    • MockStatement

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 24, 2006

[Subversion] FSFS の発音

Subversion のドキュメントを眺めていて面白い記述を発見した。

Jack Repenning が何も文句を言わないのなら「fuzz-fuzz」と発音することになっています
というわけで、FSFS は「ふぁずふぁず」と発音するらしい。 知らなかった。 ・・・日本国内で「ふぁずふぁず」と発音しても通じないだろうな。

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 23, 2006

[Subversion] Subversion のリポジトリ破損

Subversion のリポジトリ(FSFS)が破損した。 Commit は出来るのだが、Update や Log を実行すると

REPORT request failed on '/repository/!svn/vcc/default'
REPORT of '/repository/!svn/vcc/default': 200 OK
というエラーが発生して処理が中断してしまう。 TortoiseSVN でも Subclipse でも発生したので、サーバ側の問題の模様。

原因

原因はリビジョンファイルの破損。 HDD のセクタが破損したことで $SVN_HOME/svndb/db/revs/ の中にある特定のファイルにアクセスできなくなっていた。 壊れていたリビジョンは最新のものではなく、少し古い(数日前)のものだった。 "svnadmin verify" コマンドでリビジョンの状態をチェックできる。

# svnadmin verify /home/svn/svndb/
         (SNIP)
* Verified ▒・▒吾с??222▒
* Verified ▒・▒吾с??223▒
* Verified ▒・▒吾с??224▒
* Verified ▒・▒吾с??225▒
* Verified ▒・▒吾с??226▒
* Verified ▒・▒吾с??227▒
* Verified ▒・▒吾с??228▒
svn: Can't read file '/home/svn/svndb/db/revs/229': 入力/出力エラーです
#
コマンドの実行結果が文字化けしているのはご愛敬といったところか・・・。

対処方法

今回は破損したリビジョンが数日前と比較的最近のものだったので、破損したリビジョンの一つ前の状態に戻すことにした。 手順は以下の通り。

  1. $SVN_HOME/svndb/db/revs から破損したリビジョン以降のリビジョンファイルを削除
  2. $SVN_HOME/svndb/db/revprops から↑で削除したものと同じ名前のファイルを削除
  3. $SVN?HOME/svndb/db/current を編集して、現在のリビジョンを削除後の最新リビジョンに変更

備考

破損したリビジョンだけを無かったことに出来ないか、と思い色々調べてみたがどうも難しそう。 Subversion では各リビジョンはファイルの差分情報しか持っていない。 そのため、破損したリビジョンで変更が加えられているファイルがその後のリビジョンでも変更されていると、破損したリビジョンを削除することは出来ない。 ツールなどでも復旧は出来ないようだ。 リビジョンファイルを一つずつ手で修正すれば良いのかもしれないが、膨大な量の修正が必要になることとバイナリファイルを修正するという 2 点から容易な作業ではない。 バックアップはお早めに、といったところか。

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 22, 2006

[Mustang] Java 6 Revealed

もう Mustang に関する書籍が出版される。 発売予定日 は 2006/05/29。 このタイミングで出版とは、さすが米国。 日本も負けていられない。 誰か国産 Mustang 本書いてくれないかな。


Java 6 Revealed

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 21, 2006

[Mustang] Console にチャレンジ

Mustang では Console というクラスが新設された。 Console はその名の通りコンソールへのアクセスを提供してくれるクラス。 ちなみに、コンソール用なので Eclipse 上では使えない模様(System.console() が null を返す)。

Class Console
http://download.java.net/jdk6/docs/api/java/io/Console.html

サンプルコード

package jp.in_vitro.codelets.lang;

import java.io.Console;
import java.io.PrintWriter;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(String[] args) {
        Codelet me = new Codelet();
        me.execute();
    }

    protected void execute() {
        Console console = System.console();
        PrintWriter writer = console.writer();

        writer.print("name:");
        writer.flush();
        String name = console.readLine();
        writer.println("your name is " + name);
        writer.flush();

        writer.print("password:");
        writer.flush();
        char[] password = console.readPassword();
        writer.println("your password is " + new String(password));
        writer.flush();
    }
}

実行結果

> java -version
java version "1.6.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0-beta-b59g)
Java HotSpot(TM) Client VM (build 1.6.0-beta-b59g, mixed mode, sharing)

> java -classpath classes jp.in_vitro.codelets.lang.Codelet
name:in-vitro.jp
your name is in-vitro.jp
password:     ←[ここでパスワードを入力しているがエコーバックされない]
your password is hogehoge

>

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 20, 2006

[Mustang] Mustang における File の 追加機能

Mustang では java.io.File も結構機能追加されていることに気付いた。 ディスクスペースの取得や、パーミッション関連の操作が追加されている。

Class File
http://download.java.net/jdk6/docs/api/java/io/File.html

Mustang で File に追加されたメソッド

public boolean setWritable(boolean writable,boolean ownerOnly)
Sets the owner's or everybody's write permission for this abstract pathname.
public boolean setWritable(boolean writable)
A convenience method to set the owner's write permission for this abstract pathname.
public boolean setReadable(boolean readable,boolean ownerOnly)
Sets the owner's or everybody's read permission for this abstract pathname.
public boolean setReadable(boolean readable)
A convenience method to set the owner's read permission for this abstract pathname.
public boolean setExecutable(boolean executable,boolean ownerOnly)
Sets the owner's or everybody's execute permission for this abstract pathname.
public boolean setExecutable(boolean executable)
A convenience method to set the owner's execute permission for this abstract pathname.
public boolean canExecute()
Tests whether the application can execute the file denoted by this abstract pathname.
public long getTotalSpace()
Returns the size of the partition named by this abstract pathname.
public long getFreeSpace()
Returns the number of unallocated bytes in the partition named by this abstract path name.
public long getUsableSpace()
Returns the number of bytes available to this virtual machine on the partition named by this abstract pathname.

サンプルコード(ディスクスペースの取得)

package jp.in_vitro.codelets.io;

import java.io.File;

public class Codelet {

    public Codelet(){
        super();
    }
    
    public static void main(String[] args) {
        Codelet me = new Codelet();
        me.execute();
    }
    
    protected void execute(){
        File file = new File("c:\\");
        System.out.println("" + file.getAbsolutePath());
        System.out.println("FREE SPACE   : " + file.getFreeSpace());
        System.out.println("TOTAL SPACE  : " + file.getTotalSpace());
        System.out.println("USABLE SPACE : " + file.getUsableSpace());
    }
}

実行結果

c:\
FREE SPACE   : 2151354368
TOTAL SPACE  : 15002906624
USABLE SPACE : 2151354368

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 19, 2006

[Mustang] Normalizer にチャレンジ

Normalizer とは

java.text.Normalize は Mustang から導入された文字列処理用のクラス。 Unicode 文字列の正規化を行ってくれる。 今まで独自のコードでやっていた処理を Normalizer に置き換えられそうなのでチェックしてみた。

Class Normalizer
http://download.java.net/jdk6/doc/api/java/text/Normalizer.html
Enum Normalizer.Form
http://download.java.net/jdk6/doc/api/java/text/Normalizer.Form.html
Normalization Charts
http://www.unicode.org/charts/normalization/

Normalizer では、以下の 4 つの Normalization Form が定義されている。

  • NFC - Canonical decomposition, followed by canonical composition.
  • NFD - Canonical decomposition.
  • NFKC - Compatibility decomposition, followed by canonical composition.
  • NFKD - Compatibility decomposition.
同じ文字でもそれぞれの Form で文字コード上の表現が変化する。

変換結果

日本語を使用するアプリケーションで頻繁に変換処理が行われる文字をチェックしてみた。 NFKC 変換が現在の独自ロジックでの変換の置き換えに使用できそう。 但し、色々試してみたところ多少不足があるので単純な置き換えは無理。

ORIGINAL ->      NFC        NFD          NFKC          NFKD
-------------------------------------------------------------
¢ (00A2) ->   ¢ (00A2)  ¢ (00A2)  ¢ (00A2)  ¢ (00A2)
¢ (FFE0) ->   ¢ (FFE0)  ¢ (FFE0)  ¢ (00A2)  ¢ (00A2)
£ (00A3) ->   £ (00A3)  £ (00A3)  £ (00A3)  £ (00A3)
£ (FFE1) ->   £ (FFE1)  £ (FFE1)  £ (00A3)  £ (00A3)
¬ (00AC) ->   ¬ (00AC)  ¬ (00AC)  ¬ (00AC)  ¬ (00AC)
¬ (FFE2) ->   ¬ (FFE2)  ¬ (FFE2)  ¬ (00AC)  ¬ (00AC)
- (002D) ->   - (002D)  - (002D)  - (002D)  - (002D)
- (FF0D) ->   - (FF0D)  - (FF0D)  - (002D)  - (002D)
| (007C) ->   | (007C)  | (007C)  | (007C)  | (007C)
| (FF5C) ->   | (FF5C)  | (FF5C)  | (007C)  | (007C)
~ (007E) ->   ~ (007E)  ~ (007E)  ~ (007E)  ~ (007E)
~ (FF5E) ->   ~ (FF5E)  ~ (FF5E)  ~ (007E)  ~ (007E)
が (304C) ->   が (304C)  か? (304B3099)  が (304C)  か? (304B3099)
ぎ (304E) ->   ぎ (304E)  き? (304D3099)  ぎ (304E)  き? (304D3099)
ぱ (3071) ->   ぱ (3071)  は? (306F309A)  ぱ (3071)  は? (306F309A)
ぴ (3074) ->   ぴ (3074)  ひ? (3072309A)  ぴ (3074)  ひ? (3072309A)
㍉ (3349) ->   ㍉ (3349)  ㍉ (3349)  ミリ (30DF30EA)  ミリ (30DF30EA)
㌔ (3314) ->   ㌔ (3314)  ㌔ (3314)  キロ (30AD30ED)  キロ (30AD30ED)
㎜ (339C) ->   ㎜ (339C)  ㎜ (339C)  mm (006D006D)  mm (006D006D)
㎡ (33A1) ->   ㎡ (33A1)  ㎡ (33A1)  m2 (006D0032)  m2 (006D0032)
㍻ (337B) ->   ㍻ (337B)  ㍻ (337B)  平成 (5E736210)  平成 (5E736210)
㍼ (337C) ->   ㍼ (337C)  ㍼ (337C)  昭和 (662D548C)  昭和 (662D548C)
№ (2116) ->   № (2116)  № (2116)  No (004E006F)  No (004E006F)
㏍ (33CD) ->   ㏍ (33CD)  ㏍ (33CD)  KK (004B004B)  KK (004B004B)
℡ (2121) ->   ℡ (2121)  ℡ (2121)  TEL (00540045004C)  TEL (00540045004C)
㊤ (32A4) ->   ㊤ (32A4)  ㊤ (32A4)  上 (4E0A)  上 (4E0A)
㊥ (32A5) ->   ㊥ (32A5)  ㊥ (32A5)  中 (4E2D)  中 (4E2D)
㈱ (3231) ->   ㈱ (3231)  ㈱ (3231)  (株) (0028682A0029)  (株) (0028682A0029)
㈲ (3232) ->   ㈲ (3232)  ㈲ (3232)  (有) (002867090029)  (有) (002867090029)

サンプルコード

package jp.in_vitro.codelets.text;

import java.text.Normalizer;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(String[] args) {
        Codelet me = new Codelet();
        me.execute();
    }

    protected void execute() {

        String targets = "\u00A2\uFFE0\u00A3\uFFE1\u00AC\uFFE2\u002D\uFF0D\u007C\uFF5C\u007E\uFF5Eがぎぱぴ㍉㌔㎜㎡㍻㍼№㏍℡㊤㊥㈱㈲";
        System.out
                .println("ORIGINAL ->      NFC        NFD          NFKC          NFKD");
        System.out
                .println("-------------------------------------------------------------");
        for (char ch : targets.toCharArray()) {
            this.normalize("" + ch);
        }
    }

    protected void normalize(final String target) {
        String normalized = null;
        String normalizedHex = null;

        System.out.print("" + target + " (" + this.toHex(target) + ") -> ");

        normalized = Normalizer.normalize(target, Normalizer.Form.NFC);
        normalizedHex = this.toHex(normalized);
        System.out.print("  " + normalized + " (" + normalizedHex + ")");

        normalized = Normalizer.normalize(target, Normalizer.Form.NFD);
        normalizedHex = this.toHex(normalized);
        System.out.print("  " + normalized + " (" + normalizedHex + ")");

        normalized = Normalizer.normalize(target, Normalizer.Form.NFKC);
        normalizedHex = this.toHex(normalized);
        System.out.print("  " + normalized + " (" + normalizedHex + ")");

        normalized = Normalizer.normalize(target, Normalizer.Form.NFKD);
        normalizedHex = this.toHex(normalized);
        System.out.print("  " + normalized + " (" + normalizedHex + ")");

        System.out.println();
    }

    protected String toHex(final String str) {

        StringBuffer buf = new StringBuffer();
        for (char ch : str.toCharArray()) {
            buf.append(Integer.toString((int) ((ch >> 12) & 0x0F), 16)
                    .toUpperCase());
            buf.append(Integer.toString((int) ((ch >> 8) & 0x0F), 16)
                    .toUpperCase());
            buf.append(Integer.toString((int) ((ch >> 4) & 0x0F), 16)
                    .toUpperCase());
            buf.append(Integer.toString((int) (ch & 0x0F), 16).toUpperCase());
        }
        return new String(buf);
    }
}

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 18, 2006

[Mustang] Java から Web ブラウザと MUA を起動

Mustang を眺めていたら、何と Web ブラウザと MUA を起動する API を発見!! 早速チャレンジ。
単純に API を呼んでみたところ何の障害もなく Web ブラウザの起動に成功した。
普段使いのメールアドレスが全て Gmail になっているため、MUA は起動確認できず。 そもそも MUA がインストールされていない orz
Mustang では Web ブラウザや MUA 以外にもファイルに関連づけられたアプリケーションの起動ができる。 試しに Explorer とテキストエディタを起動してみたが、どちらもうまくいった。

Class Desktop
http://download.java.net/jdk6/docs/api/java/awt/Desktop.html

サンプルコード

package jp.in_vitro.codelets.awt;

import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

public class Codelet2 {

    public Codelet2() {
        super();
    }

    public static void main(String[] args) throws MalformedURLException,
            IOException, URISyntaxException {
        Codelet2 me = new Codelet2();
        me.runWebBrowser();
        me.runMailer();
        me.runExplorer();
        me.runTextEditor();
    }

    protected void runWebBrowser() throws MalformedURLException, IOException,
            URISyntaxException {
        Desktop.getDesktop().browse(
                new URL("http://www.in-vitro.jp/blog").toURI());
    }

    protected void runMailer() throws IOException {
        Desktop.getDesktop().mail();
    }

    protected void runExplorer() throws IOException {
        Desktop.getDesktop().open(new File("c:\\"));
    }

    protected void runTextEditor() throws IOException {
        File dummyTextFile = new File("c:\\hogehoge.txt");
        OutputStream os = null;
        try {
            os = new FileOutputStream(dummyTextFile);
            os.write("this is temporary file.".getBytes());
        } finally {
            if (os != null) {
                os.close();
            }
        }

        Desktop.getDesktop().open(dummyTextFile);
    }
}

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 17, 2006

[Library] Smack にチャレンジ

Smack とは

Smack は Java 用の Jabber ライブラリ。 Google Talk 用の API が用意されているのが嬉しい。

Smack
http://www.jivesoftware.org/smack/

Smack の実行環境構築

  1. こちらから Smack をダウンロードする。ここでは ver.2.2.0 を前提とする。
  2. アーカイブの中にある以下の jar をクラスパスに追加する
    • smack.jar
    • smackx.jar

サンプルコード

Smack を使用して Google Talk のアカウントに IM のメッセージを送信してみた。 Smack はGoogle Talk 用のインターフェースを提供してくれているので非常に簡単。

package jp.in_vitro.codelets.smack;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.GoogleTalkConnection;
import org.jivesoftware.smack.XMPPException;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws XMPPException {
        Codelet me = new Codelet();
        me.execute();
    }

    protected void execute() throws XMPPException {
        GoogleTalkConnection con = new GoogleTalkConnection();
        con.login("[MY ID]", "[PASSWORD]");
        Chat chat = con.createChat("[MY FRIEND ID]@gmail.com");
        chat.sendMessage("ASCII");
        chat.sendMessage("ひらがな");
        chat.sendMessage("漢字");
        chat.sendMessage("ハンカクカタカナ");
    }
}
[メッセージを受信したところ]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 16, 2006

[Library] XMPP/Jabber メモ

XMPP/Jabber に関する情報をメモ。

Jabber Software Foundation
http://www.jabber.org/
Jabber Protocols
http://www.jabber.org/protocol/
<xmpp/>.org
http://www.xmpp.org/
XMPP Specs
http://www.xmpp.org/specs/
History of XMPP
http://www.xmpp.org/history.html
Summary of XMPP
http://www.xmpp.org/summary.html

Java の Jabber ライブラリ

Code Libraries に掲載されているものの内、Java から利用可能なものをリストアップしてみた。

Echomine Muse
http://open.echomine.org/confluence/display/MUSE/
JabberBeans
http://jabberbeans.jabberstudio.org/
JabberWookie
http://www.jabberwookie.com/
JSO
http://jso.jabberstudio.org/
micro-jabber
http://sourceforge.net/projects/micro-jabber
Smack
http://www.jivesoftware.org/smack/
tweeze
http://www.ipster.org/tweeze/
Yaja
http://yaja.sourceforge.net/

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 15, 2006

[Library] iText にチャレンジ(3)

日本語フォントを利用した PDF を作成してみた。 日本語フォントを読み込めたのでかなり期待していたが、期待通り簡単に日本語を扱うことができた。

サンプルコード

package jp.in_vitro.codelets.itext;

import java.io.FileOutputStream;
import java.io.IOException;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfWriter;

public class Codelet2 {

    public Codelet2() {
        super();
    }

    public static void main(final String[] args) throws DocumentException,
            IOException {
        Codelet2 me = new Codelet2();
        me.createPDF();
    }

    protected void createPDF() throws DocumentException, IOException {

        BaseFont baseFont = BaseFont.createFont(
                "c:\\windows\\fonts\\msgothic.ttc,1", BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED);
        Font font = new Font(baseFont, 12);

        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(
                "c:\\Japanese.pdf"));

        document.open();
        String text1 = "こんにちは";
        document.add(new Paragraph(text1, font));
        document.close();
    }
}
[作成された PDF]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 14, 2006

[Library] iText にチャレンジ(2)

今日は日本語フォントの取り扱いにチャレンジ。

サンプルコード

日本語フォントを読み込んで情報を表示してみた。 チュートリアルに記載されている通りのコードで簡単に動作した。 とりあえず MS P ゴシックを読み込んでみた。

package jp.in_vitro.codelets.itext;

import java.io.IOException;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

public class Codelet1 {

    public Codelet1() {
        super();
    }

    public static void main(final String[] args) throws DocumentException,
            IOException {
        Codelet1 me = new Codelet1();
        me.viewFontInfo();
    }

    protected void viewFontInfo() throws IOException, DocumentException {
        BaseFont baseFont = BaseFont.createFont(
                "c:\\windows\\fonts\\msgothic.ttc,1", BaseFont.IDENTITY_H,
                BaseFont.EMBEDDED);

        System.out.println("[Postscript Font Name] "
                + baseFont.getPostscriptFontName());
        System.out.println("[Direct Text to Byte] "
                + baseFont.isDirectTextToByte());
        System.out.println("[Embedded] " + baseFont.isEmbedded());
        System.out.println("[Font Specific] " + baseFont.isFontSpecific());
        System.out.println("[Force Widths Output] "
                + baseFont.isForceWidthsOutput());
        System.out.println("[Subset] " + baseFont.isSubset());
        System.out.println("[Code Pages Supported]");
        for (String codePage : baseFont.getCodePagesSupported()) {
            System.out.println("  " + codePage);
        }
        System.out.println("[Full Font Name]");
        for (String[] tmp : baseFont.getFullFontName()) {
            System.out.print("  ");
            for (String defference : tmp) {
                System.out.print(defference + ", ");
            }
            System.out.println();
        }
    }
}

実行結果

[Postscript Font Name] MS-PGothic
[Direct Text to Byte] false
[Embedded] true
[Font Specific] false
[Force Widths Output] false
[Subset] true
[Code Pages Supported]
  1252 Latin 1
  1250 Latin 2: Eastern Europe
  1251 Cyrillic
  1253 Greek
  1254 Turkish
  1257 Windows Baltic
  932 JIS/Japan
  OEM Character Set
  869 IBM Greek
  866 MS-DOS Russian
  865 MS-DOS Nordic
  863 MS-DOS Canadian French
  861 MS-DOS Icelandic
  860 MS-DOS Portuguese
  857 IBM Turkish
  855 IBM Cyrillic; primarily Russian
  852 Latin 2
  775 MS-DOS Baltic
  737 Greek; former 437 G
  850 WE/Latin 1
  437 US
[Full Font Name]
  1, 0, 0, MS PGothic, 
  3, 1, 1033, MS PGothic, 
  3, 1, 1041, MS Pゴシック, 

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 13, 2006

[Library] iText にチャレンジ

iText とは

iText は Java から PDF を扱うライブラリ。 ライセンスは MPLLGPL のデュアルライセンス。

iText
http://www.lowagie.com/iText/
API Document
http://itextdocs.lowagie.com/docs/
Tutorial: iText by Example
http://itext.sourceforge.net/tutorial/

サンプルコード

とりあえずお決まりの Hello World。

package jp.in_vitro.codelets.itext;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(final String[] args) throws FileNotFoundException,
            DocumentException {
        Codelet me = new Codelet();
        me.execute();
    }

    protected void execute() throws FileNotFoundException, DocumentException {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream("c:\\HelloWorld.pdf"));
        document.open();
        document.add(new Paragraph("Hello World"));
        document.close();
    }
}
[作成された PDF]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 12, 2006

[Derby] Derby を Tomcat 5.5 の DataSource に設定する方法

Server Mode で起動した Derby を Tomcat 5.5 に DataSource として登録する方法をメモ。 Tomcat 5.0 → 5.5 で設定方法が変わったことで、意外と設定に時間がかかってしまった。

The Apache Tomcat 5.5 Servlet/JSP Container JNDI Datasource HOW-TO
http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

Derby を Server Mode で起動

Derby 10.1.2.1 を前提とする。

> set JAVA_HOME=c:\jdk1.5.0_06
> set DERBY_INSTALL=c:\db-derby-10.1.2.1-bin
> cd db-derby-10.1.2.1-bin\frameworks\NetworkServer\bin
db-derby-10.1.2.1-bin\frameworks\NetworkServer\bin>startNetworkServer.bat
サーバーは、ポート 1527 で接続を受け入れる準備ができました。

Tomcat 5.5 の設定

Tomcat 5.5.15 を前提とする。

  1. Tomcat に Derby の JDBC ドライバを登録する。 derbyclient.jar、derbynet.jar、derbytools.jar を %CATALINA_HOME%/common/lib/ にコピーする。
  2. DataSource の設定を行う。 %CATALINA_HOME%/conf/server.xml に下記の設定を追加する。
    <Host name="localhost" 
          appBase="webapps"
          unpackWARs="true" 
          autoDeploy="true"
          xmlValidation="false" 
          xmlNamespaceAware="false">
    
      <Context path="/myapp" 
               docBase="myapp"
               reloadable="false" 
               crossContext="true">
    
        <Resource name="jdbc/TestDB" 
                  auth="Container" 
                  type="javax.sql.DataSource"
                  driverClassName="org.apache.derby.jdbc.ClientDriver"
                  url="jdbc:derby://localhost:1527/derbyDB;create=true"/>
      </Context>
    <Host>
    
ちなみに、Host → Context → Resource という階層構造にしないと、何故か url や driverClassName が設定されないために
Cannot create JDBC driver of class '' for connect URL 'null' java.sql.SQLException: No suitable driver
という例外が発生する。

Web アプリケーションの設定

<web-app>
  <resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/TestDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

アプリケーションからの呼び出し

普通に JNDI 経由で DataSource を取得すれば良い。

Context context = new InitialContext();
Object obj = context.lookup("java:comp/env/jdbc/TestDB");
DataSource dataSource  = (DataSource)obj;
Connection connection = dataSource.getConnection();

Posted in Derby | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 11, 2006

[Misc] JavaScript 用デバッグコンソール

JavaScript 用のデバッグコンソールを作成してみた。 alert() を使用すると、誤って無限ループに陥った際に Web ブラウザを強制終了せざる得なくなることがある。 それを防ぐため & もう少し使いやすいインタフェースを用意するために DebugConsole クラスを作成した。

DebugConsole

HTML 内で適当に読み込んで呼び出すと、Web ブラウザのウィンドウ右上にデバッグコンソールが開く。 後は debug メソッドで適当に確認したいメッセージをデバッグコンソールに書き出すだけ。

/*******************************************************************************
 *
 *  DebugConsole
 *    copyright(c) 2006 in-vitro.jp, all rights reserved.
 *
 *
 *  REQUIRED
 *    +MS Windows XP
 *    +Internet Explorer 6
 *
 *  USAGE(1) - SIMPLE
 *    var debugConsole = new DebugConsole();
 *    debugConsole.open();
 *    debugConsole.debug("this is a debug message");
 *    debugConsole.close();
 *
 *  USAGE(2) - with initializer
 *    function myInitializer(debugConsole) {
 *      debugConsole.style.backgroundColor = "#ffffff";
 *      debugConsole.style.border = "1ps solid #000000";
 *      return "this is a header";
 *    }
 *    var debugConsole = new DebugConsole(myInitializer);
 *    debugConsole.open();
 *    debugConsole.debug("this is a debug message");
 *    debugConsole.close();
 *
 *  LICENSE
 *    Creative Commons Attribution-ShareAlike 2.1
 *    @see http://creativecommons.org/licenses/by-sa/2.1/jp/
 *
 *******************************************************************************/

/**
 * Construct DebugConsole
 *
 * @param initializer [optional] function which initialize DebugConsole.
 */
function DebugConsole(initializer) {
  document.getElementsByTagName('body')[0].innerHTML += "<div id=\"debugConsole\"></div>";
  this.debugConsole = document.getElementById('debugConsole');

  if(initializer == undefined || initializer == null) {
    this.header = DebugConsole_initializer(this.debugConsole);
  } else {
    this.header = initializer(this.debugConsole);
  }

  this.debugConsole.style.position = "absolute";
  this.debugConsole.style.display = 'none';
  this.debugConsole.style.top = "0px";
  this.debugConsole.style.right = "0px";
}

/* register member functions to DebugConsole */
DebugConsole.prototype.open = DebugConsole_open;
DebugConsole.prototype.close = DebugConsole_close;
DebugConsole.prototype.debug = DebugConsole_debug;
DebugConsole.prototype.clear = DebugConsole_clear;
DebugConsole.prototype.move = DebugConsole_move;
DebugConsole.prototype.moveInternal = DebugConsole_moveInternal;

/**
 * Default DebugConsole Initializer
 */
function DebugConsole_initializer(debugConsole) {
  debugConsole.style.backgroundColor = "#eeeeee";
  debugConsole.style.border = "3px solid #cccccc";
  debugConsole.style.width = "250px";
  debugConsole.style.height = "300px";
  debugConsole.style.padding = "0.5em";
  return "【DEBUG CONSOLE】";
}

/**
 * Open DebugConsole
 */
function DebugConsole_open() {
  // move DebugConsole periodically.
  this.timerId = setInterval(this.move, 1000);
  // show DebugConsole
  this.debugConsole.style.display = 'block';
  this.clear();
}

/**
 * Close DebugConsole
 */
function DebugConsole_close() {
  this.debugConsole.style.display = 'none';
  clearInterval(this.timerId);
}

/**
 * Append message to DebugConsole
 */
function DebugConsole_debug(message) {
  this.debugConsole.innerHTML += message + "<br>";
}

/**
 * Clear DebugConsole
 */
function DebugConsole_clear() {
  if(this.header == undefined || this.header == null) {
    this.debugConsole.innerHTML = "";
  } else {
    this.debugConsole.innerHTML = this.header + "<br>";
  }
}

/**
 * Move DebugConsole to NORTH-EAST corner (INTERNAL USE ONLY)
 */
function DebugConsole_move() {
  this.debugConsole.moveInternal()
}

/**
 * Move DebugConsole to NORTH-EAST corner (INTERNAL USE ONLY)
 */
function DebugConsole_moveInternal() {
  this.debugConsole.style.top = document.body.scrollTop + "px";
  this.debugConsole.style.right = "0px";
}

ダウンロード

余りニーズがあるとも思えないけれど、とりあえず。
debugconsole.js

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 10, 2006

[Blosxom] Bloxsom のエントリーを一覧表示する

Blosxom のエントリー一覧を確認したくなることが結構あるので、簡単なスクリプトを作成してみた。 このスクリプトは Blosxom starter kit 環境下で、エントリーファイルの一覧を HTML で表示する。 Blosxom starter kit の設定ファイルを参照している都合で、ノーマルの Blosxom 環境下では動作しないかもしれない(未確認)。

Blosxom エントリー一覧表示スクリプト

$BLOG_HOME 直下に適当な名前でスクリプトを設置し、パーミッションを 755 にすると動作する。

#!/usr/bin/perl

package blosxom;

eval { require './config.cgi'; };
die "Failed to load configuration file.\n$@" if $@;

use vars qw! $datadir $url $depth $file_extension %files !;

use strict;
use FileHandle;
use File::Find;
use File::stat;
use Time::localtime;
use Time::Local;
use CGI qw/:standard :netscape/;
use CGI::Carp;

my $fh = new FileHandle;

# Use the stated preferred URL or figure it out automatically
$url ||= url();
$url =~ s/^included:/http:/; # Fix for Server Side Includes (SSI)
$url =~ s!/$!!;

# Drop ending any / from dir settings
$datadir =~ s!/$!!;
  
# Fix depth to take into account datadir's path
$depth and $depth += ($datadir =~ tr[/][]) - 1;

# find entry files
my @files;
find(
  sub {
    my $d; 
    my $curr_depth = $File::Find::dir =~ tr[/][]; 
    return if $depth and $curr_depth > $depth; 
    my $file = $File::Find::name;
    if($file =~ m/(.)*\.$file_extension$/i) {
      push(@files, $file);
    }
  }, $datadir
);

# soft entry files
@files = sort {
  $a =~ /.*\/(.+)/;
  my $filename_a = $1;
  $b =~ /.*\/(.+)/;
  my $filename_b = $1;
  $filename_b cmp $filename_a;
} @files;

# print results;
print "Content-type: text/html\n\n";
print "<html>";
print "<head><title>";
print "list entries in ";
print $datadir;
print "</title></head>";
print "<body>";
print "list entries in ";
print $datadir;
print "<ol>";
foreach my $file (@files) {
  $file =~ /.*\/(.+)/;
  my $filename = $1;
  my $fileurl = $file;
  $fileurl =~ s/$datadir//g;
  $fileurl =~ s/\.$file_extension/\.html/g;
  $fileurl = $url . $fileurl;
  print "<li>";
  print "<a href=\"";
  print $fileurl;
  print "\">";
  print $filename;
  print "</a>";
  print " <span style=\"font-size: x-small;\">(";
  print $file;
  print ")</span>";
  print "</li>";
}
print "</ol>";
print "</body></html>";

Posted in Blosxom | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 09, 2006

[Misc] AJAX におけるクライアントサイドのキャッシュ機構

作り方にもよるが、非AJAX よりも AJAX の方がサーバサイドへのリクエスト数が増える。 HTML で問題になりがちな部分更新を AJAX で解決しようとすればするほどリクエスト数が増えてしまう。 というわけで、サーバサイドの負荷を減らすべく AJAX でクライアントサイドのキャッシングを実施する方法を思案中。
ちなみに、考えているだけで実際に試したわけではないので要注意。

AJAX におけるキャッシング

Cookie

Cookie にデータを保持する。JavaScript がローカルのファイルシステムにアクセスできる唯一の方法。

非表示レイヤー

JavaScript で表示されない(display: none)レイヤーを作成し、その中にデータを保存する。

  • 永続化できない(HTMLリロードで消える)
    →但し、サーバサイドと連携すれば多少は永続化出来る。
  • (一応)サイズ制限はない
  • オンメモリで保持されるため、クライアントの負荷が大きい?

Cookie のサイズ制限を考えると、非表示レイヤーを使う方が現実的か。 実際に運用されているサービスはどうしているのだろう?? 今度調べてみよう。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 08, 2006

[Misc] MTASC にチャレンジ

MTASC とは

MTASC は、Motion-Twin ActionScript 2 Compiler の略。 名前の通り、ActionScript2 のコンパイラ。 オープンソースで提供されている。 MTASC を使用することで Flash の swf ファイルを簡単に費用をかけずに生成できる。

MTASC 公式サイト
http://www.mtasc.org/#download
MTASC ダウンロード
http://www.mtasc.org/#download

ActionScript に関する資料

ActionScript に関する知識が全く無いので、参考になりそうなサイトをメモ。

FLASH-jp フォーラム
http://www.flash-jp.com/
ActionScript ガイド
http://www.macromedia.com/jp/support/flash/technotes.html#actionScript
ActionScript 2.0 の学習
http://livedocs.macromedia.com/flash/8_jp/main/00001214.html
Flash の ActionScript チュートリアル集
http://www.3enhancedesigners.com/tutorials/flash/flash_actionscript.asp
Flash ActionScript Helper
http://homepage3.nifty.com/ginga-b/
Flash ActionScript 講座
http://www.game3rd.com/flash/action/
ActionScriptPlugin plugin
http://xdoclet.codehaus.org/ActionScriptPlugin

サンプルコード

とりあえず Hello World だけチャレンジ。

class HelloWorld {
  static var me : HelloWorld;

  function HelloWorld() {
    _root.createTextField("textfield",0,0,0,800,600);
    _root.textfield.text = "Hello ActionScript World !!";
  }

  static function main(mc) {
    me = new HelloWorld();
  }
}
コンパイルはコマンドラインから実行する。
> mtasc -swf helloworld.swf -main -header 800:600:20 HelloWorld.as

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 07, 2006

[Misc] ジェノグラフィック・プロジェクトに参加

ジェノグラフィック・プロジェクトとは

ジェノグラフィック・プロジェクトとは、「はるか遠い祖先がたどった遺伝学的な旅や実際にこの地球上を移動したルートなどについて知ることが目的」のプロジェクトらしい。 参加者は自分の DNA 情報をプロジェクトに送付すると、自分の祖先がどの大陸からどこを経由して自分へとつながっているのかを知ることができる。 プロジェクトのサイトによると、

男性参加者:Y染色体による分析。父方の直系の祖先が誕生した起源を明らかにできます。
女性参加者:ミトコンドリアDNAによる分析。母方の直系の祖先が昔に移動する際の起源を明らかにできます。
だそうだ。 これは面白そうだということで、早速参加してみることに。
ジェノグラフィック・プロジェクト
http://nng.nikkeibp.co.jp/nng/genographic/project.shtml
Genographic Project Public Participation Kit Non-U.S. and Non-Canada Delivery
http://shop.nationalgeographic.com/shopping/product/detailmain.jsp?itemID=2346&itemType=PRODUCT

Genographic Project Public Participation Kit

申し込んで 1 週間程でキットが送られてきた。 キットにはプロジェクト解説の DVD や DNA 採取器具などが含まれている。 DNA 採取は頬の内側を付属の器具でこするだけなので、手間要らずで痛みもない。 そういえば、小学校か中学校の実験でも頬の内側から細胞を採取したことがあったっけ。 返送して 4 ~ 6 週間で結果が分かるそうだ。楽しみだ。

[Genographic Project Public Participation Kit]
パッケージ
[キットの中身]
キットの中身
[DNA 採取器具]
DNA 採取器具
[採取した DNA]
採取した DNA

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 06, 2006

[Book] 初めてのアジャイル開発

書籍情報


初めてのアジャイル開発

レビュー

内容的には
アジャイルと規律の方
が良い感じがする。 ただ、多少視点が異なるのでどちらも読んで損はないと思う。 スクラム、XP、UP、Evoというアジャイル手法を単純に紹介するだけでなく、それぞれの手法の良いところを組み合わせる方法も紹介されており興味深い。

書籍内で紹介されていたThe New New Product Development Gameも併せて読んでみた。 この記事は 1986年にHarvard Business Reviewに掲載されたものなのだが今でもオンラインで入手可能。

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 05, 2006

[Subversion] Subversion 管理用ディレクトリの ".svn" と "_svn"

Subversion 管理下のファイルをチェックアウトすると、管理用ディレクトリとして ".svn" が作成される。 それが、TortoiseSVN をバージョンアップした途端に "_svn" に変わってしまったという話を聞いた。 となると、TortoiseSVN をバージョンアップするわけにいかなくなってしまうので原因を調べてみた。 原因は Subversion 1.3 のリリースノートに記載されていた。

The "_svn" hack is now officially supported: since some versions of ASP.NET don't allow directories beginning with dot (e.g., ".svn", the standard Subversion working copy administrative directory), the svn command line client and svnversion now treat the environment variable SVN_ASP_DOT_NET_HACK specially on Windows. If this variable is set (to any value), they will use "_svn" instead of ".svn". We recommend that all Subversion clients running on Windows take advantage of this behaviour. Note that once the environment variable is set, working copies with standard ".svn" directories will stop working, and will need to be re-checked-out to get "_svn" instead.

".svn" が "_svn" に変わった環境で環境変数を調べてみてもらったところ、SVN_ASP_DOT_NET_HACK=1 となっていた。 結局、SVN_ASP_DOT_NET_HACK を設定しなければ今まで通り ".svn" のママだということが分かった。 TortoiseSVN をバージョンアップしても問題は無さそうということで一安心。

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 04, 2006

[VMWare] VMWare と Xen の違い

VMWareXen はどちらも仮想化ソフト。 同じ仮想化ソフトではあるけれど、仮想化の実現方式は結構異なるらしい。 Interview on Xen with Manuel Bouyerで Xen と VMWare の実装の違いが紹介されていた (vimrc diaryさんのXenとVmwareの違い [xen]経由)。

VMware will emulate real hardware so that an unmodified OS can run on top of the virtualizer. Just run an OS in VMware, and this OS will see some kind of VGA adapter for the console along with the usual PS/2 keyboards and mouse, some kind of network interface (a DEC tulip if my memory is right), and some kind of IDE or SCSI adapter for mass storage. To achieve this, the virtualizer will have to emulate these devices. This means emulating the registers and interrupts, quite often with MMU faults when these fake registers are accessed. This means that a single I/O operation will most likely require several context switches. The same goes for the MMU: accesses to privileged CPU registers, page tables and use of privileged instruction will all generate context switches.

The Xen's virtualizer (the hypervisor) doesn't emulate real hardware but offers an interface to the guest OS for these operations. This means that the guest OS will have to be modified to use these interfaces. But then these interfaces can be optimized for the task, allowing it to batch large numbers of operations in a single communication with the hypervisor, and so limiting the number of context switches required for I/O or MMU operations.

ということは、VMWare より Xen の方が高速なのだろうか?? 調べてみると、Xen のサイトに Xen と VMWare のパフォーマンスの比較が載っていた。 確かに、VMWare より Xen の方が高速の様だ。 とは言え、気軽に使うには普通の OS がそのままゲスト OS として使用できる VMWare の方が楽なので、個人的には VMWare を使っていくつもり。

ついでに少し調べていたら仮想化技術の実現方式の違いを解説したページを発見した。

仮想化技術のアプローチと実装 ~ VMwareから要注目技術Xenまで ~
http://www.atmarkit.co.jp/flinux/special/vm/vm02.html

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 03, 2006

[Maven] リモートリポジトリをローカルのストレージに置く方法

Maven2 のリモートリポジトリをプロジェクトホームの下に置く方法をメモ。 リモートリポジトリをサーバに置くことができないこともあるので。 pom.xml に下記の設定を行うと、$PROJECT_HOME/repository がリモートリポジトリとして認識される。

<pom>
  <repositories>
    <repository>
      <id>softwareframework-repository</id>
      <name>software framework repository</name>
      <url>file://${basedir}/repository</url>
    </repository>
  </repositories>
</pom>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 02, 2006

[Maven] Maven2 で J2SE 5.0 のソースコードをコンパイルする方法

Maven2 で J2SE 5.0 のソースコードをコンパイルするためには pom.xml に下記の設定を行う必要がある。 至る所で紹介されている情報だけれど、頻繁に行う設定なのでメモしておく。

<build>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 01, 2006

[Maven] CARGO にチャレンジ

CARGO とは

CARGO は、アプリケーションサーバをラッピングするオープンソースのライブラリ。 Maven、Maven2、Ant 用のプラグインが提供されており、それらから簡単にアプリケーションサーバの起動、停止などを実現することができる。 Maven2 から CARGO を使用して Tomcat の起動とアプリケーションのディプロイを行ってみた。

CARGO 公式サイト
http://www.geotools.org/display/CARGO
CARGO Maven2 plugin
http://www.geotools.org/display/CARGO/Maven2+plugin
Container Support
http://docs.codehaus.org/display/CARGO/Home#Home-Containersupport

pom.xml の設定

CARGO で Tomcat 5 を扱うためには、pom.xml に下記の設定を行う。

<build>
  <plugins>
    <plugin>
      <groupId>org.codehaus.cargo</groupId>
      <artifactId>cargo-maven2-plugin</artifactId>
      <executions>
        <execution>
          <id>tomcat-execution</id>
          <phase>package</phase>
          <goals>
            <goal>start</goal>
          </goals>
          <configuration>
            <wait>false</wait>
            <container>
              <containerId>tomcat5x</containerId>
              <zipUrlInstaller>
                <url>
                  http://www.apache.org/dist/tomcat/tomcat-5/v5.5.15/bin/apache-tomcat-5.5.15.zip
                </url>
                <installDir>
                  ${installDir}
                </installDir>
              </zipUrlInstaller>
            </container>
            <configuration>
              <dir>
                ${project.build.directory}/tomcat5x/container
              </dir>
            </configuration>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
この設定を行った後 "mvn package" を実行すると Tomcat 5 の起動とディプロイを CARGO が自動的に行ってくれる。 Tomcat 5 は CARGO が勝手にダウンロードして、$PROJECT_HOME/target/tomcat5x/container にインストールしてくれる。 "mvn clean" で target が削除されてもその次の実行時に再度ダウンロードされる。 Tomcat が起動しているかどうかは "http://localhost:8080/cargocpc/" にアクセスすることで確認できる。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 27, 2006

[Book] MIND HACKS

書籍情報


MIND HACKS

レビュー

脳の働きを紹介する書籍。 色々な実験をすることで脳の働きを実際に感じることができる。 実験は簡単なものが多いので、ネットに接続可能な PC が一台目の前にあるだけで非常に楽しめる一冊。 仕事に役に立つ類の書籍ではないが、読んで絶対損はないと思う。 本書で紹介されている簡単で面白い実験を一つ。

目の盲点

  1. ↓の"+"と"●"の間が 5cm くらいになるようにする
  2. ディスプレイから顔を 30cm くらい離す
  3. 左目を閉じて、右目で"+"を見る
  4. "+"を見たままで顔を少しずつディスプレイに近づける
  5. 顔を近づけて行くと、あるところで"●"が見えなくなる。
  6. 更に顔を近づけていくと再度"●"が見えるようになる
"●"が見えなくなった範囲が目の盲点らしい。面白い。

+           ●

ところで、この書籍で紹介されている Open EEG で脳電図の計測装置の作り方が公開されている。 少し見たところでは作るのは結構面倒そうだけれど楽しそう。 いつかチャレンジしてみたいものだ。誰か指南してくれないかな。

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 26, 2006

[Misc] WST の JavaScript エディタで日本語を表示する方法

WST の JavaScript エディタは、ファイルの文字エンコーディングが"US-ASCII"に指定されている。 そのため Windows-31J 等で記述された js ファイルを読み込むと 2 バイト文字は表示されない。 簡単な方法で 2 バイト文字を表示できたので、その方法をメモ。 方法は 2 通りあるので、好きな方を選択すれば良い。

ファイル単位で文字エンコーディング指定

*.js ファイルのプロパティ画面(*.js ファイルを選択して Alt+Enter) にある "Text file encoding" に文字エンコーディングを指定する。 コンボボックスには"Shift_JIS"、"Windows-31J"、"MS932"といった文字エンコーディングは存在しないが、メゲずに直接入力する。 ここでは "MS932" を指定している。
[プロパティ画面]
プロパティ画面で"MS932"を指定する

*.js ファイルのデフォルト文字エンコーディングを指定

"Window" → "Preferences" メニューから "General" → "ContentTypes" を選択。 "Content types" ツリーから "Text" → "JavaScript" を選択。 下の "Default encoding" が "US-ASCII" になっているので、"MS932"に書き換えて "Update" ボタンを押下。

[Preferences]
Preferences でデフォルトの文字エンコーディングを指定する
[プロパティ画面]
デフォルトの文字エンコーディングが "MS932" になっていることを確認する

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 25, 2006

[Misc] JavaScript メモ

JavaScript 関連のドキュメントを集めてみた。 JavaScript は今まで単なる手続き型言語としてしか利用していなかったので、基本から勉強し直そうと思う。

JavaScript Guide

Netscape 社による JavaScript 関連ドキュメント。 Netscape 社のサイトには既に存在しないので、別ドメインのものを参照するしかない模様。

Core JavaScript Guide
http://synchro.net/docs/js/guide/index.html
Regular Expressions
http://synchro.net/docs/js/guide/regexp.html#1010922
Predefined Functions
http://synchro.net/docs/js/guide/fcns.html#1008357
Predefined Core Objects
http://synchro.net/docs/js/guide/obj.html#1010352
Core JavaScript Reference
http://synchro.net/docs/js/ref/index.html
Chapter 1 Objects, Methods, and Properties
http://synchro.net/docs/js/ref/objintro.html#1061890
Array
http://synchro.net/docs/js/ref/array.html#1193137
Date
http://synchro.net/docs/js/ref/date.html#1193137
RegExp
http://synchro.net/docs/js/ref/regexp.html#1193136
String
http://synchro.net/docs/js/ref/string.html#1193137
Chapter 2 Top-Level Properties and Functions
http://synchro.net/docs/js/ref/toplev.html#1061890
Appendix A Reserved Words
http://synchro.net/docs/js/ref/keywords.html#1004016

JavaScript 入門

JavaScript によるオブジェクト指向開発の入門。 ↑のガイドやリファレンスへの取っ掛かりとして有益。 石井勝さんのドキュメントがあって、ちょっとしんみりした。

PART 3 JavaScript言語仕様
http://www.fureai.or.jp/~tato/JS/BOOK/BOOKSAMPL/PART3/PART3.HTM
オブジェクト指向プログラム言語としての JavaScript
http://www.tokumaru.org/JavaScript/
オブジェクトなJSの基礎講座
http://www.parkcity.ne.jp/~chaichan/src/2ndthema.htm
Objective JavaScript
http://web.paulownia.jp/script/
JavaScriptによるオブジェクト指向プログラミング
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/js-oop.html

Eclipse による JavaScript 開発環境

Eclipse は標準では JavaScript 用のエディタを搭載していない。 普通のテキストエディタでは物悲しいので、別途プラグインをインストールする必要がある。 JavaScript Editor PlugIn for Eclipse は既に開発が終了してしまっているみたいなので、現時点(2006/02/25)では WST を選択するのがベストだろうか。

JavaScript Editor PlugIn for Eclipse
http://sourceforge.net/projects/jseditor
Eclipse Web Tools Platform (WTP) Project
http://www.eclipse.org/webtools/index.html
wst - the web standard tools subproject
http://www.eclipse.org/webtools/wst/main.html

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 23, 2006

[Derby] Derby メモ(3)

Derby のパフォーマンスに関するリファレンスをメモ。 「Derby ならでは」というものは少ない。 システムのプロパティ(derby.storage.pageCacheSize、derby.storage.pageReservedSpace、derby.storage.pageSize)くらいか。

Performance tips and tricks
http://db.apache.org/derby/docs/10.0/manuals/tuning/perf19.html
derby.storage.pageCacheSize
http://db.apache.org/derby/docs/10.1/tuning/tuning-single#N18B49
derby.storage.pageReservedSpace
http://db.apache.org/derby/docs/10.1/tuning/tuning-single#N18D9B
derby.storage.pageSize
http://db.apache.org/derby/docs/10.1/tuning/tuning-single#N18FFB

Posted in Derby | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 21, 2006

[Library] Struts 1.3 メモ

オレンジニュース さんの Apaxhe Struts 1.3.0 リリース で Struts 1.3 のリリースを知った。 結構たくさんアーカイブがあったので、とりあえず中身をざっと眺めてみた。

Struts ダウンロードサイト
http://svn.apache.org/dist/struts/

アーカイブの概要

各アーカイブの docs/index.html の内容をリスト化しておく。

struts-action
Struts Action Framework is a flexible control layer based on standard technologies like Java Servlets, JavaBeans, ResourceBundles, and XML, as well as various Jakarta Commons packages, like BeanUtils and Chain of Responsibility. Struts Action Framework helps you create an extensible development environment for your application, based on published standards and proven design patterns.
struts-el
This subproject is an extension of the Struts tag library. Each JSP custom tag in this library is a subclass of an associated tag in the Struts tag library.
struts-extras
The purpose of this subproject is to provide a separate and common location to provide optional but often useful extension classes to Struts Action Framework.
struts-taglib
This library simplifies development of a JSP-based view layer of a Struts Action Framework Application. These tags were previously packaged as part of the base Struts 1.2 distribution, but have been extracted into a separate library.
struts-tiles
Tiles is a templating framework. It can be used to create a common look & feel for a web site or application and to create reusable view components.

アーカイブの中身

action-library_1.3_00.zip

action-library_1.3_00
│  struts-config_1_3.dtd
│  web-app_2_3.dtd
└─action-library_1.3.0
        antlr-2.7.2.jar
        cactus-12-1.4.1.jar
        cactus-ant-1.4.1.jar
        commons-beanutils-1.7.0.jar
        commons-chain-1.0.jar
        commons-digester-1.6.jar
        commons-fileupload-1.1.jar
        commons-io-1.1.jar
        commons-logging-1.0.4.jar
        commons-validator-1.2.0.jar
        httpunit-1.5.4.jar
        junit-3.8.1.jar
        oro-2.0.8.jar
        struts-action-1.3.0.jar
        struts-el-1.3.0.jar
        struts-extras-1.3.0.jar
        struts-mailreader-dao-1.3.0.jar
        struts-taglib-1.3.0.jar
        struts-tiles-1.3.0.jar

struts-action-1.3.0.tar.gz

struts-action-1.3.0
│  struts-action-1.3.0.jar
├─conf
│      chain-config.xml
│      struts-config_1_0.dtd
│      struts-config_1_1.dtd
│      struts-config_1_2.dtd
│      struts-config_1_3.dtd
│      validator-rules.xml
│      web-app_2_2.dtd
│      web-app_2_3.dtd
└─docs
    ├─apidocs
    ├─faqs
    ├─images
    ├─jcoverage
    ├─style
    ├─userGuide
    ├─xref
    └─xref-test

struts-action-1.3.0-src.tar.gz

struts-action-1.3.0
│  build.xml
│  maven.xml
│  project.xml
├─build
│      maven.xml
│      pom.xml
│      project.properties
│      project.xml
│      struts.jsl
│      struts_checks.xml
│      struts_jalopy.xml
├─conf
│  └─java
│          chain-config.xml
│          struts-config_1_0.dtd
│          struts-config_1_1.dtd
│          struts-config_1_2.dtd
│          struts-config_1_3.dtd
│          validator-rules.xml
│          web-app_2_2.dtd
│          web-app_2_3.dtd
└─src
    ├─java
    ├─java
    │  └─org
    │      └─apache
    │          └─struts
    │              ├─action
    │              ├─chain
    │              │  ├─commands
    │              │  │  ├─generic
    │              │  │  ├─servlet
    │              │  │  └─util
    │              │  └─contexts
    │              ├─config
    │              │  └─impl
    │              ├─mock
    │              ├─upload
    │              ├─util
    │              └─validator
    │                  └─validwhen
    └─test

struts-el-1.3.0

struts-el-1.3.0
│  struts-el-1.3.0.jar
└─docs
    ├─apidocs
    ├─images
    ├─jcoverage
    ├─style
    ├─tlddoc
    ├─xref
    └─xref-test

struts-el-1.3.0-src.tar.gz

struts-el-1.3.0
│  build.xml
│  maven.xml
│  project.properties
│  project.xml
├─build
│      maven.xml
│      pom.xml
│      project.properties
│      project.xml
│      struts.jsl
│      struts_checks.xml
│      struts_jalopy.xml
└─src
    ├─exercise-taglib
    ├─java
    │  └─org
    │      └─apache
    │          └─strutsel
    │              └─taglib
    │                  ├─bean
    │                  ├─html
    │                  ├─logic
    │                  ├─tiles
    │                  └─utils
    ├─test
    └─tld
            struts-bean-el.tld
            struts-html-el.tld
            struts-logic-el.tld
            struts-tiles-el.tld

struts-extras-1.3.0.tar.gz

struts-extras-1.3.0
│  struts-extras-1.3.0.jar
└─docs
    ├─apidocs
    ├─images
    ├─jcoverage
    ├─style
    ├─xref
    └─xref-test

struts-extras-1.3.0-src.tar.gz

struts-extras-1.3.0
│  build.xml
│  project.properties
│  project.xml
├─build
│      maven.xml
│      pom.xml
│      project.properties
│      project.xml
│      struts.jsl
│      struts_checks.xml
│      struts_jalopy.xml
└─src
    ├─conf
    ├─java
    │  └─org
    │      └─apache
    │          └─struts
    │              ├─actions
    │              ├─plugins
    │              └─validator
    └─test

struts-site-1.3.0.tar.gz

struts-site-1.3.0
│  struts-site-1.3.0.jar
└─docs
    ├─images
    ├─legacy
    ├─proposals
    ├─struts-doc-1.0.2
    ├─struts-doc-1.1
    ├─style
    ├─stylesheets
    └─uml

struts-site-1.3.0-src.tar.gz

struts-site-1.3.0
│  maven.xml
│  project.properties
│  project.xml
└─build
        maven.xml
        pom.xml
        project.properties
        project.xml
        struts.jsl
        struts_checks.xml
        struts_jalopy.xml

struts-taglib-1.3.0

struts-taglib-1.3.0
│  struts-taglib-1.3.0.jar
└─docs
    ├─apidocs
    ├─images
    ├─jcoverage
    ├─style
    ├─tlddoc
    ├─xref
    └─xref-test

struts-taglib-1.3.0-src.tar.gz

struts-taglib-1.3.0
│  build.xml
│  maven.xml
│  project.properties
│  project.xml
├─build
│      maven.xml
│      pom.xml
│      project.properties
│      project.xml
│      struts.jsl
│      struts_checks.xml
│      struts_jalopy.xml
└─src
    ├─conf
    ├─java
    │  └─org
    │      └─apache
    │          └─struts
    │              └─taglib
    │                  ├─bean
    │                  ├─html
    │                  ├─logic
    │                  └─nested
    │                      ├─bean
    │                      ├─html
    │                      └─logic
    ├─test
    ├─test-cactus
    ├─tld
    └─webapp

struts-tiles-1.3.0.tar.gz

struts-tiles-1.3.0
│  struts-tiles-1.3.0.jar
└─docs
    ├─apidocs
    ├─images
    ├─jcoverage
    ├─style
    ├─tlddoc
    ├─xref
    └─xref-test

struts-tiles-1.3.0-src.tar.gz

struts-tiles-1.3.0
│  build.xml
│  maven.xml
│  project.properties
│  project.xml
├─build
│      maven.xml
│      pom.xml
│      project.properties
│      project.xml
│      struts.jsl
│      struts_checks.xml
│      struts_jalopy.xml
└─src
    ├─java
    │  └─org
    │      └─apache
    │          └─struts
    │              └─tiles
    │                  ├─actions
    │                  ├─beans
    │                  ├─commands
    │                  ├─definition
    │                  ├─taglib
    │                  │  └─util
    │                  └─xmlDefinition
    ├─resource
    │  └─org
    │      └─apache
    │          └─struts
    │              ├─resources
    │              │      tiles-config_1_1.dtd
    │              │      tiles-config_1_3.dtd
    │              └─tiles
    │                      chain-config.xml
    ├─test
    └─tld
            struts-tiles.tld

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 20, 2006

[Mustang] SystemTray にチャレンジ

SystemTray とは

Mustang では Windows のタスクバーステータスエリアにアイコンを表示する機能が追加されたらしい。 わんこ日記さんの[Java]What's cool in AWT on Java SE 6 (Mustang)で紹介されていた。 これは面白そうなので早速チャレンジ。

API Document - Class SystemTray
http://java.sun.com/javase/6/docs/api/java/awt/SystemTray.html

サンプルコード

JDK 6.0beta で試してみたところ、非常に簡単に実現できた。

package jp.in_vitro.codelets.awt;

import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Logger;

import javax.swing.ImageIcon;

public class Codelet {

    public static void main(final String... args) throws AWTException,
            InterruptedException {
        Codelet me = new Codelet();
        me.execute();
    }

    public Codelet() {
        super();
    }

    public void execute() throws AWTException, InterruptedException {
        if (SystemTray.isSupported()) {
            // create PopupMenu
            PopupMenu popupMenu = new PopupMenu();
            MenuItem exitMenuItem = new MenuItem();
            exitMenuItem.setLabel("Exit");
            exitMenuItem.addActionListener(new ExitMenuItemActionListener());
            popupMenu.add(exitMenuItem);

            // create TrayIcon
            ImageIcon image = new ImageIcon(this.getClass().getResource(
                    "/trayicon.jpg"));
            TrayIcon icon = new TrayIcon(image.getImage());
            icon.setPopupMenu(popupMenu);

            // enable TrayIcon
            SystemTray tray = SystemTray.getSystemTray();
            tray.add(icon);
        } else {
            Logger.global.info("SystemTray is not supported.");
        }
    }

    protected static class ExitMenuItemActionListener implements ActionListener {
        public void actionPerformed(final ActionEvent evt) {
            System.exit(0);
        }
    }
}

[表示されたトレイアイコン]
表示されたトレイアイコン

[ポップアップメニュー]
ポップアップメニュー

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 19, 2006

[Library] JUnit 4.0 にチャレンジ

今日は JUnit 4.0 をもう少し細かく掘り下げてみる。 ざっとソースコードを眺めてみた。

JUnitCore

JUnit 4 のテストケースを自分で実行する場合、JUnitCore を使うのが一番楽だと思う。 JUnitCore は Request や Runner を作成してテストケースを実行してくれる。
[JUnitCore周辺のクラス図]

Runner

細かい作業が必要で JUnitCore が使えない場合は Runner を自分で制御する必要がある。 そういう状況は余り無いと思うけれど。
[Runnerとサブクラス]

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 18, 2006

[Library] JUnit 4.0 にチャレンジ

長らく 3.x の時代が続いていた JUnit だけれど、遂に 4.0 がリリースされた。 というわけで、とりあえず軽く触ってみた。 4.0 がリリースされたというニュースが出ているのだが、2006/02/18 現在公式サイトには情報がなかった。 ダウンロードも 3.8.1 が最新のママ。 公式サイトで 4.0 が見つからない場合は、↓のダウンロードサイトをチェックすると良い。

JUnit 公式サイト
http://junit.org/index.htm
JUnit ダウンロードサイト
http://prdownloads.sourceforge.net/junit/
@Test でユニットテスト - 新生 JUnit 4.0 公開
http://pcweb.mycom.co.jp/news/2006/02/16/347.html

JUnit 4 の Annotation

JUnit 3 → 4 の大きな変更は Annotation の導入らしい。 というわけで、JUnit 4 で用意されている Annnotation をリストアップしてみた。

@After
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface After {
}
@AfterClass
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AfterClass {
}
@Before
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {
}
@BeforeClass
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BeforeClass {
}
@Ignore
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Ignore {
  /**
   * The optional reason why the test is ignored.
   */
  String value() default ""; 
}
@Test
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {
  static class None extends Throwable {
    private static final long serialVersionUID= 1L;    
    private None() {
    }
  }
  /**
   * Optionally specify <code>expected</code>, a Throwable, to cause a test method to succeed iff 
   * an exception of the specified class is thrown by the method.
   */
  Class<? extends Throwable> expected() default None.class;
  /** 
   * Optionally specify <code>timeout</code> in milliseconds to cause a test method to fail if it
   * takes longer than that number of milliseconds.*/
  long timeout() default 0L; 
}
Annotation の実行タイミング

↑に挙げた Annotation は全て Target が METHOD になっている。 これら Annotation が指定されたメソッドの実行タイミングは以下の通り。

package jp.in_vitro.codelets.junit4;

import java.util.logging.Logger;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.JUnitCore;

public class Codelet {

    public static void main(String[] args) {
        JUnitCore.runClasses(new Class[] { Codelet.class });
    }

    @BeforeClass
    public static void beforeClass() {
        Logger.global.info("beforeClass");
    }

    @Before
    public void before() {
        Logger.global.info("before");
    }

    @Test
    public void mytest01() {
        Logger.global.info("mytest01");
    }

    @Test
    public void mytest02() {
        Logger.global.info("mytest02");
    }

    @Test @Ignore
    public void mytest03() {
        Logger.global.info("mytest03");
    }

    @After
    public void after() {
        Logger.global.info("after");
    }

    @AfterClass
    public static void afterClass() {
        Logger.global.info("afterClass");
    }

}
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet beforeClass
情報: beforeClass
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet before
情報: before
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet mytest01
情報: mytest01
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet after
情報: after
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet before
情報: before
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet mytest02
情報: mytest02
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet after
情報: after
2006/02/18 17:24:32 jp.in_vitro.codelets.junit4.Codelet afterClass
情報: afterClass

Assert

JUnit 4 ではテストケースが TestCase クラスを継承する必要は無くなった。 そのため、assert* メソッドは Assert クラスで定義されているものを使用する。 Assert クラスには↓のメソッドが用意されている。 これくらいの数なら static import を使っても良さそう。

static public void assertTrue(String message, boolean condition)
static public void assertTrue(boolean condition)
static public void assertFalse(String message, boolean condition)
static public void assertFalse(boolean condition)
static public void fail(String message)
static public void fail()
static public void assertEquals(String message, Object expected, Object actual)
static public void assertEquals(Object expected, Object actual)
public static void assertEquals(String message, Object[] expecteds, Object[] actuals)
public static void assertEquals(Object[] expecteds, Object[] actuals)
static public void assertEquals(String message, double expected, double actual, double delta)
static public void assertEquals(double expected, double actual, double delta)
static public void assertEquals(String message, float expected, float actual, float delta)
static public void assertEquals(float expected, float actual, float delta)
static public void assertNotNull(String message, Object object)
static public void assertNotNull(Object object)
static public void assertNull(String message, Object object)
static public void assertNull(Object object)
static public void assertSame(String message, Object expected, Object actual)
static public void assertSame(Object expected, Object actual)
static public void assertNotSame(String message, Object expected, Object actual)
static public void assertNotSame(Object expected, Object actual)

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 16, 2006

[Mustang] Mustang Beta リリース

Mustang の Beta がついにリリースされた。 Beta リリースに伴い(?) サイトが整備されてきているみたいなので、改めてメモ。

Java Platform, Standard Edition (Java SE) 6 Beta
http://java.sun.com/javase/6/
Download Java Platform, Standard Edition 6 Beta
http://java.sun.com/javase/6/download.jsp
JDK 6 Documentation
http://java.sun.com/javase/6/docs/index.html
Java Platform Standard Edition 6 API Specification
http://java.sun.com/javase/6/docs/api/index.html
Bug Database
http://bugs.sun.com/bugdatabase/index.jsp
Bug Database (Mustang 関連)
http://bugs.sun.com/bugdatabase/search.do?process=1&category=java&bugStatus=open&subcategory=&type=bug&keyword=6.0+or+1.6
change (Contains a list of bug fixes for each build)
https://mustang.dev.java.net/servlets/ProjectDocumentList?folderID=2855

Posted in Mustang | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 15, 2006

[Maven] Maven2 で JAR の Manifest ファイルを設定する方法をメモ

Maven2 の JAR アーカイバ(maven-jar-plugin) における Manifest 関連の設定をメモ。

Manifest 関連の設定方法

JAR アーカイバの Manifest 関連の設定は pom.xml に記述する。

<model>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>jp.in_vitro.dummy.Main</mainClass>
              <packageName>jp.in_vitro.dummy</packageName>
              <addClasspath>true</addClasspath>
              <addExtensions>true</addExtensions>
              <classpathPrefix>lib</classpathPrefix>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</model>

Manifest 関連の設定項目

設定項目 設定値 解説
addClasspath "true" / "false" "true" が指定された場合、pom.xml の dependencies に従い Class-Path が出力される。
addExtensions "true" / "false" "true" が指定された場合、pom.xml の dependencies に従い拡張情報(各 dependency の詳細情報)が出力される。
classpathPrefix 任意の文字列 addClasspath に "true" が設定された際、各 Classpath エントリに指定された文字列が接頭語として付加される。例えば classpathPrefix に "lib" を指定すると、Class-Path の各エレメントは "lib/commons-logging.jar" の様になる。
mainClass 任意のクラス名(FQCN) JAR のメインクラスを指定する。Manifest ファイルの Main-Class に出力される。
packageName 任意のパッケージ名 JAR のパッケージを指定する。Manifest ファイルの Package に出力される。

Manifest 関連設定の実体

pom.xml で指定した Manifest 関連の設定は maven-archiver (maven-archiver-2.0-beta-3.jar など) にある org.apache.maven.archiver.ManifestConfiguration というクラスが保持する。 ManifestConfiguration には以下のフィールドが用意されていて、ここに設定内容がインジェクションされる。

  private String mainClass;
  private String packageName;
  private String addClasspath;
  private String addExtensions;
  private String classpathPrefix;

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 14, 2006

[Library] Jetty にチャレンジ

Jetty とは

Jetty はオープンソースの Servlet Engine。 Tomcat と同カテゴリのソフトウェア。 Servlet Engine なので当然 Servlet をディプロイすることも可能なのだけれど、 今回は Jetty そのものをアプリケーション内に取り込んでみる。 Servlet を登録するよりもコーディングは面倒になるが、色々融通が利くようになる。

Jetty 公式サイト
http://jetty.mortbay.org/jetty/index.html

Jetty の初期化 & 起動

まずは Jetty を初期化する。今回使用している Jetty のバージョンは 6.0 beta8。

InputStream is = null;
Server server = null;
try {
  is = this.getClass().getResourceAsStream("/jetty.xml");
  XmlConfiguration configuration = new XmlConfiguration(is);
  Object obj = configuration.newInstance();
  server = (Server) obj;
} finally {
  if (is != null) {
    is.close();
  }
}

MyHandler myHandler = new MyHandler();
server.setHandler(myContextHandler);
server.start();
jetty.xml はこんな↓感じ。
<?xml version="1.0"?>

<!DOCTYPE Configure PUBLIC 
          "-//Mort Bay Consulting//DTD Configure//EN" 
          "http://jetty.mortbay.org/configure.dtd">

<Configure id="Server" class="org.mortbay.jetty.Server">
    <Set name="ThreadPool">
      <New class="org.mortbay.thread.BoundedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">100</Set>
      </New>
    </Set>
    <Set name="connectors">
      <Array type="org.mortbay.jetty.Connector">
        <Item>
          <New class="org.mortbay.jetty.nio.SelectChannelConnector">
            <Set name="port">80</Set>
            <Set name="maxIdleTime">50000</Set>
            <Set name="Acceptors">10</Set>
          </New>
        </Item>
      </Array>
    </Set>
</Configure>

ハンドラの作成

リクエストを受け取ったときに実行されるハンドラを用意する。 但し、この時点では HttpSession は使えないので要注意。

public class MyHandler extends AbstractHandler {

  public MyHandler() {
    super();
  }

  public boolean handle(final String target,
         final HttpServletRequest request,
         final HttpServletResponse response, final int dispatch)
           throws IOException, ServletException {

    // TODO: ここで何か処理をする
  }
}

HttpSession の準備

HttpSession を使う場合はもう少し面倒なコーディングが必要。 ハンドラを ContextHandler と SessionHandler でラッピングすると HttpSession が使用できるようになる。 ハンドラのの登録は jetty.xml を使って行っても良い。

  SessionManager sessionManager = new HashSessionManager(new Random(
          System.currentTimeMillis()));
  sessionManager
          .setMetaManager(new AbstractSessionManager.NullMetaManager());

  MyHandler myHandler = new MyHandler();
  SessionHandler sessionHandler = new SessionHandler();
  sessionHandler.setHandler(myHandler);
  sessionHandler.setSessionManager(sessionManager);
  MyContextHandler myContextHandler = new MyContextHandler();
  myContextHandler.setContextPath("/");
  myContextHandler.setHandler(sessionHandler);

  this.server.setHandler(myContextHandler);

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 11, 2006

[Misc] ATOK のライセンス

ATOK 2006 が届いた。 ATOK を使うのは本当に久しぶり。 以前は ATOK 派だったのだけれど、ここしばらくは PC を一人で複数台使う様になったのでライセンス代がツラくて MS-IME でガマンしていた。

しかし、最近知り合いから「ATOK のライセンスは複数台の PC へのインストールを許可している」ということを教えてもらった。 本当!? それって常識!?

というわけで、早速最新版を購入してみた。

ATOK 2006 電子辞書セット

ATOK 2006 のライセンス(部分抜粋)

確かに複数台へのインストールが許可されている。すばらしい!!

第 2 条 ご使用条件
1. 弊社は、本契約にご同意いただけたお客様が下記の各号に従い本ソフトウェアを使用することを許諾します。

(1)本ソフトウェアをお客様が占有・管理する 1 台のコンピュータに複製(インストール)しお客様ご自身(お客様が法人の場合は従業員 1 名)が使用することができます。

(2)前(1)号にかかわらず、お客様の管理のもと第 3 条に違反しない範囲で、 1 台のコンピュータにのみインストールした本ソフトウェアを複数人で使用することができます。

(3)前(1)号にかかわらず、本ソフトウェアの使用者がお客様ご自身(法人の場合は特定の従業員 1 名)に限られている場合は、本ソフトウェアを同時に使用しないという条件で、お客様(当該従業員)のみが使用する他のコンピュータにインストールすることができます。

ATOK 2006 のラインアップ


ATOK 2006 for Windows CD-ROM

ATOK 2006 for Windows 電子辞典セット CD-ROM

ATOK 2006 for Windows 就活応援セット CD-ROM

ATOK 用辞書

何か辞書を追加しようかと、どういう辞書があるのか調べてみた。 用途があるのは「広辞苑」と「角川類語新辞典」くらいか。 「日経パソコン用語辞典」は 2004 年度版しか見付からないということは売れなかったのだろうか。


広辞苑 第五版 for ATOK CD-ROM

角川類語新辞典 for ATOK(NW) CD-ROM

明鏡国語辞典・ジーニアス英和/和英辞典/R.2(NW) CD-ROM

医療辞書’06 for ATOK CD-ROM

角川類語新辞典 for ATOK

ぎょうせい 公用文表記辞書 for ATOK(NW2) CD-ROM

医療辞書 2005 for ATOK (NW)

共同通信社 記者ハンドブック辞書 第10版 for ATOK (NW)

NHK 新用字用語辞書 第3版 for ATOK CD-ROM

知恵蔵 for ATOK for Windows CD-ROM

建築・土木用語変換・対訳 for ATOK for Windows CD-ROM

日経パソコン用語事典 2004 for ATOK for Windows CD-ROM

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 09, 2006

[Derby] Derby メモ(2)

Derby を使った Java 開発に必要な情報をメモ。

Derby Reference Manual
http://db.apache.org/derby/docs/10.1/ref/
Statements
http://db.apache.org/derby/docs/10.1/ref/crefsqlj39374.html
DataTypes
http://db.apache.org/derby/docs/10.1/ref/crefsqlj31068.html
Derby System Tables
http://db.apache.org/derby/docs/10.1/ref/rrefsistabs38369.html

Derby データ型 <-> Java データ型のマッピング

Derby と Java のデータ型のマッピングを一覧表にしたものが欲しかったのだが、探した限りでは見つからなかったので自作してみた。 とは言っても、↑の DataTypes の内容を表形式にしただけのオソマツなもの。 個人的にはこれで十分だが。

Syntax Corresponding compile-time Java type JDBC metadata type (java.sql.Types) 備考
BIGINT java.lang.Long BIGINT -9223372036854775808 (java.lang.Long.MIN_VALUE) ~ 9223372036854775807 (java.lang.Long.MAX_VALUE)
{ BLOB | BINARY LARGE OBJECT } ( length [{K |M |G }])) java.sql.Blob BLOB K(1024), M(1024 * 1024), G(1024 * 1024 * 1024)
CHAR[ACTER] [(length)] java.lang.String CHAR
{ CHAR | CHARACTER }[(length)] FOR BIT DATA - BINARY
{CLOB |CHARACTER LARGE OBJECT}(length [{{K |M |G}])) java.sql.Clob CLOB K(1024), M(1024 * 1024), G(1024 * 1024 * 1024)
DATE java.sql.Date DATE サポートするフォーマットは
  • yyyy-mm-dd
  • mm/dd/yyyy
  • dd.mm.yyyy
{ DECIMAL | DEC } [(precision [, scale ])] java.math.BigDecimal DECIMAL
{ DOUBLE PRECISION | DOUBLE } java.lang.Double DOUBLE precision は 1 ~ 31。scale は precision 以下。
FLOAT [ (precision) ] - REAL or DOUBLE
{ INTEGER | INT } java.lang.Integer INTEGER -2147483648 (java.lang.Integer.MIN_VALUE) ~ 2147483647 (java.lang.Integer.MAX_VALUE)
LONG VARCHAR java.lang.String LONGVARCHAR
LONG VARCHAR FOR BIT DATA - -
NUMERIC [(precision [, scale ])] java.math.BigDecimal NUMERIC
REAL java.lang.Float REAL
SMALLINT java.lang.Short SMALLINT -32768 (java.lang.Short.MIN_VALUE) ~ 32767 (java.lang.Short.MAX_VALUE)
TIME java.sql.Time TIME サポートするフォーマットは
  • hh:mm[:ss]
  • hh.mm[.ss]
  • hh[:mm] {AM | PM}
TIMESTAMP java.sql.Timestamp TIMESTAMP サポートするフォーマットは
  • yyyy-mm-dd hh[:mm[:ss[.nnnnnn]]]
  • yyyy-mm-dd-hh[.mm[.ss[.nnnnnn]]]
{ VARCHAR | CHAR VARYING | CHARACTER VARYING }(length) java.lang.String VARCHAR The maximum length for a VARCHAR string is 32,672 characters.
{ VARCHAR | CHAR VARYING | CHARACTER VARYING } (length) FOR BIT DATA - VARBINARY The maximum size of the length value is 32,672 bytes.

Posted in Derby | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Library] コンテンツ移動のお知らせ

http://www.in-vitro.jp/blog/index.cgi/Library/20060209_01.html はこちらに移動しました。
Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 08, 2006

[VMWare] VMWare Player on Debian Sarge インストールメモ:

Debian Sarge に VMWare Player をインストールしたときのメモ。 大した障害はなかったが、Windows 版の様にインストーラ一発で終了、というわけには行かなかった。

インストール手順

  1. (もしインストールされていなければ) X Window System をインストール。X は VMWare Player の実行に必須の様だ。
    # apt-get install x-window-system
    
  2. カーネルのバージョンに合わせてカーネルのヘッダファイルをインストールする。
    # apt-get install kernel-headers-2.4.27-2-386
    パッケージリストを読みこんでいます... 完了
    依存関係ツリーを作成しています... 完了
    以下の特別パッケージがインストールされます:
      kernel-headers-2.4.27-2
    以下のパッケージが新たにインストールされます:
      kernel-headers-2.4.27-2 kernel-headers-2.4.27-2-386
    アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
    2120kB のアーカイブを取得する必要があります。
    展開後に追加で 29.8MB のディスク容量が消費されます。
    続行しますか? [Y/n]
    
  3. ここから Linux 版の VMWare Player をダウンロード。ここでは VMware-player-1.0.1-19317.tar.gz を使う
  4. VMWare Player のインストーラを実行して、インストールと初期設定を行う。
    # tar zxvf ./VMware-player-1.0.1-19317.tar.gz
    # ./vmware-player-distrib/vmware-install.pl
    Creating a new installer database using the tar3 format.
    
    Installing the content of the package.
    
    In which directory do you want to install the binary files?
    [/usr/bin]
    
    What is the directory that contains the init directories (rc0.d/ to rc6.d/)?
    [/etc]
    
    What is the directory that contains the init scripts?
    [/etc/init.d]
    
    In which directory do you want to install the library files?
    [/usr/lib/vmware]
    
    The path "/usr/lib/vmware" does not exist currently. This program is going to
    create it, including needed parent directories. Is this what you want? [yes] yes
    
    In which directory do you want to install the documentation files?
    [/usr/share/doc/vmware]
    
    The path "/usr/share/doc/vmware" does not exist currently. This program is going
    to create it, including needed parent directories. Is this what you want?
    [yes] yes
    
    The installation of VMware Player 1.0.1 build-19317 for Linux completed
    successfully. You can decide to remove this software from your system at any
    time by invoking the following command: "/usr/bin/vmware-uninstall.pl".
    
    Before running VMware Player for the first time, you need to configure it by
    invoking the following command: "/usr/bin/vmware-config.pl". Do you want this
    program to invoke the command for you now? [yes] yes
    
    The correct version of one or more libraries needed to run VMware Player may be
    missing.  This is the output of ldd /usr/bin/vmware:
            libm.so.6 => /lib/libm.so.6 (0x4001c000)
            libdl.so.2 => /lib/libdl.so.2 (0x4003e000)
            libpthread.so.0 => /lib/libpthread.so.0 (0x40041000)
            libX11.so.6 => not found
            libXtst.so.6 => not found
            libXext.so.6 => not found
            libXt.so.6 => not found
            libICE.so.6 => not found
            libSM.so.6 => not found
            libXrender.so.1 => not found
            libz.so.1 => /usr/lib/libz.so.1 (0x40094000)
            libc.so.6 => /lib/libc.so.6 (0x400a6000)
            /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
    
    This program cannot tell for sure, but you may need to upgrade libc5 to glibc
    before you can run VMware Player.
    
    Hit enter to continue.
    
    Making sure services for VMware Player are stopped.
    
    Stopping VMware services:
       Virtual machine monitor                                             done
    
    You must read and accept the End User License Agreement to continue.
    Press enter to display it.
    
    (snip)
    
    Do you accept? (yes/no) yes
    
    Thank you.
    
    Configuring fallback GTK+ 2.4 libraries.
    
    In which directory do you want to install the mime type icons?
    [/usr/share/icons]
    
    The path "/usr/share/icons" does not exist currently. This program is going to
    create it, including needed parent directories. Is this what you want? [yes] yes
    
    What directory contains your desktop menu entry files? These files have a
    .desktop file extension. [/usr/share/applications]
    
    In which directory do you want to install the application's icon?
    [/usr/share/pixmaps]
    
    Trying to find a suitable vmmon module for your running kernel.
    
    None of the pre-built vmmon modules for VMware Player is suitable for your
    running kernel.  Do you want this program to try to build the vmmon module for
    your system (you need to have a C compiler installed on your system)? [yes] yes
    
    Using compiler "/usr/bin/gcc". Use environment variable CC to override.
    
    What is the location of the directory of C header files that match your running
    kernel? [/usr/src/linux/include] /usr/src/kernel-headers-2.4.27-2-386/include
    
    Extracting the sources of the vmmon module.
    
    Building the vmmon module.
    
    Using standalone build system.
    make: Entering directory `/tmp/vmware-config0/vmmon-only'
    make[1]: Entering directory `/tmp/vmware-config0/vmmon-only'
    make[2]: Entering directory `/tmp/vmware-config0/vmmon-only/driver-2.4.27-2-386'
    make[2]: Leaving directory `/tmp/vmware-config0/vmmon-only/driver-2.4.27-2-386'
    make[2]: Entering directory `/tmp/vmware-config0/vmmon-only/driver-2.4.27-2-386'
    make[2]: Leaving directory `/tmp/vmware-config0/vmmon-only/driver-2.4.27-2-386'
    make[1]: Leaving directory `/tmp/vmware-config0/vmmon-only'
    make: Leaving directory `/tmp/vmware-config0/vmmon-only'
    The module loads perfectly in the running kernel.
    
    Do you want networking for your virtual machines? (yes/no/help) [yes] yes
    
    Configuring a bridged network for vmnet0.
    
    The following bridged networks have been defined:
    
    . vmnet0 is bridged to eth0
    
    All your ethernet interfaces are already bridged.
    
    Do you want to be able to use NAT networking in your virtual machines? (yes/no)
    [yes] no
    
    Do you want to be able to use host-only networking in your virtual machines?
    [no] no
    
    Extracting the sources of the vmnet module.
    
    Building the vmnet module.
    
    Using standalone build system.
    make: Entering directory `/tmp/vmware-config0/vmnet-only'
    make: Leaving directory `/tmp/vmware-config0/vmnet-only'
    The module loads perfectly in the running kernel.
    
    Would you like to enable the Google searchbar? (yes/no) [no]
    
    Starting VMware services:
       Virtual machine monitor                                             done
       Virtual ethernet                                                    done
       Bridged networking on /dev/vmnet0                                   done
    
    The configuration of VMware Player 1.0.1 build-19317 for Linux for this running
    kernel completed successfully.
    
    You can now run VMware Player by invoking the following command:
    "/usr/bin/vmplayer".
    
    Enjoy,
    
    --the VMware team
    
    #
    
  5. 後は、「X が起動した状態で」VMWare Player を起動する。

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 07, 2006

[VMWare] VMWare Server にチャレンジ

VMWare Server のフリー版が公開されたので、早速チャレンジ。 ダウンロードのためのユーザ登録で、"State/Province"を選択しないとダウンロードサイトが Internal Server Error になることに気付くのに時間が掛かった以外は特に問題なく進んだ。 窓の杜に書いてあるのに・・・気付けよ > 自分

VMWare Server ダウンロードページ
http://www.vmware.com/download/server/
VMware Server Documentation
http://www.vmware.com/support/pubs/server_pubs.html
Installing the Beta
http://www.vmware.com/support/server/doc/releasenotes_server_beta.html#install
窓の杜 - VMware、仮想PC作成・実行ソフトのサーバー版「VMware Server」を無償公開
http://www.forest.impress.co.jp/article/2006/02/06/vmwareserver.html

VMWare Server インストールメモ

VMWare Server のインストールに関してメモ。

  1. VMWare のサイトでユーザ登録。"State/Province"の選択を忘れずに!!
  2. メールでシリアル番号が送付される
  3. 上記で登録したユーザでログインして、VMWare Server をダウンロード
  4. もし VMWare Player がインストールされていたら、VMWare Server インストール前にアンインストールする(しておかないと VMWare Server のインストールが失敗する)
    [VMWare Server Install失敗]
  5. VMWare Server をインストールする [VMWare Server Installer]
VMWare Player のセッションもそのまま引き継げて、かなり良い感じ。

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 05, 2006

[Misc] lighttpd にチャレンジ(3)

今日は J2EE アプリケーションサーバとの連携に挑戦。 挑戦とは言ってもモジュールを 1 つ設定するだけなのだけれど。

J2EE AS 連携の設定

Apache Tomcat 5.5 と連携させてみる。

  1. Proxy モジュールの設定(/etc/lighttpd/conf-available/10-proxy.conf)を変更する
    proxy.server     = ( ".jsp" =>
                         (
                           ( "host" => "127.0.0.1",
                             "port" => 8080
                           )
                         )
                        )
    
  2. Proxy モジュールを有効にする
    # ln -s /etc/lighttpd/conf-available/10-proxy.conf /etc/lighttpd/conf-enabled/10-proxy.conf
    
  3. lighttpd を再起動
    # /etc/init.d/lighttpd restart
    Stopping web server: lighttpd.
    Starting web server: lighttpd.
    #
  4. Tomcat を起動して接続を確認する。http://server/index.jsp にアクセスして Tomcat のトップ画面が表示されることを確認する。
[lighttpd 経由で Tomcat にアクセス]
lighttpd 経由で Tomcat のトップ画面にアクセス(画像は Tomcat に振っていないので表示されない)

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 03, 2006

[Misc] lighttpd にチャレンジ(2)

昨日はとりあえず動作させるところまで試してみたので、次に Perl の CGI を試してみた。 特に悩むこともなく普通に動作できた。

Perl CGI の設定

  1. CGI 用の設定を有効にする
    # ln -s /etc/lighttpd/conf-available/10-cgi.conf /etc/lighttpd/conf-enabled/10-cgi.conf
    
  2. lighttpd を再起動
    # /etc/init.d/lighttpd restart
    Stopping web server: lighttpd.
    Starting web server: lighttpd.
    #
  3. テスト用の Perl CGI を作成する。Perl のインタプリタは lighttpd が知っているので、スクリプトの先頭に "#!/usr/bin/perl" みたいな指定をする必要はない。
    # cat /var/www/index.pl
    print "Content-type: text/html\n\n";
    print "This file is /var/www/index.pl";
    
    
[index.plにアクセス]
http://dummyserver/index.pl にアクセスしてみた

PHP CGI の設定

ついでに PHP も試してみた。 lighttpd で PHP を使用する場合、"php5-cgi" や "php4-cgi" が必要となる。 Apache HTTP Server の場合は "php5" や "php4" パッケージを使っているはずなので、Apache HTTP Server で PHP を使っている環境でも別途インストール作業が必要。

  1. php-cgi をインストール
    # apt-get install php5-cgi
    パッケージリストを読みこんでいます... 完了
    依存関係ツリーを作成しています... 完了
    提案パッケージ:
      php-pear
    以下のパッケージが新たにインストールされます:
      php5-cgi
    アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 200 個。
    4636kB のアーカイブを取得する必要があります。
    展開後に追加で 10.2MB のディスク容量が消費されます。
  2. テスト用の PHP CGI を作成する。
    # cat /var/www/index.php
    <html>
    <body>
    <?php
      print "This file is /var/www/index.php";
    ?>
    </body>
    </html> 
    
    
[index.phpにアクセス]
http://dummyserver/index.php にアクセスしてみた

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 02, 2006

[Misc] lighttpd にチャレンジ

lighttpd とは

lighttpd は軽量でセキュアな Web サーバ。 比較的新しく開発されたものらしい。 @IT の記事で紹介されていて初めて知った(via hard で loxse な日々 さんの 話題のWebサーバ「lighttpd」を使うには)。 J2EE アプリケーションサーバを除くと Apache HTTP Server 以外の Web サーバはまともに触ったことがないので、興味本位で試してみることに。

lighttpd 公式サイト
http://www.lighttpd.net/
話題のWebサーバ「lighttpd」を使うには
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/842uselighttpd.html
動作可能なプラットフォームは
  • Linux (binary packages for FC3, SuSE, Debian, Gentoo, PLD-Linux, OpenWRT)
  • BSD (FreeBSD, NetBSD, OpenBSD, MacOS X)
  • SGI IRIX
  • Windows (Cygwin)
  • Solaris
  • AIX
  • and various other POSIX compatible OSes
ライセンスは新 BSD ライセンスのようだ。

lighttpd のインストール

まずは lighttpd をインストール。 プラットフォームは Debian Sarge。 Debian では lighttpd は unstable 扱いになっている。 ・・・というわけで、

  1. /etc/apt/sources.list に "deb http://http1.debian.or.jp/debian/ unstable main" を追加
  2. apt でパッケージを探す。
    # apt-get update
    # apt-cache search lighttpd
    lighttpd - A fast webserver with minimal memory footprint
    lighttpd-doc - Documentation for lighttpd
    lighttpd-mod-mysql-vhost - MySQL-based virtual host configuration for lighttpd
  3. apt でインストールする。
    # apt-get install lighttpd lighttpd-doc
    パッケージリストを読みこんでいます... 完了
    依存関係ツリーを作成しています... 完了
    以下の特別パッケージがインストールされます:
      libc6 libc6-dev libssl0.9.8 locales lsb-base
    提案パッケージ:
      glibc-doc rrdtool
    推奨パッケージ:
      php4-cgi php5-cgi
    以下のパッケージは「削除」されます:
      base-config
    以下のパッケージが新たにインストールされます:
      libssl0.9.8 lighttpd lighttpd-doc lsb-base
    以下のパッケージはアップグレードされます:
      libc6 libc6-dev locales
    アップグレード: 3 個、新規インストール: 4 個、削除: 1 個、保留: 207 個。
    15.1MB のアーカイブを取得する必要があります。
    展開後に追加で 9249kB のディスク容量が消費されます。
    続行しますか? [Y/n] Y

    [設定画面(1)]
    設定画面(1) - Locale の登録
    [設定画面(2)]
    設定画面(2) - 標準 Locale の選択
  4. インストールができたか確認する。
    # /usr/sbin/lighttpd -v
    lighttpd-1.4.9 (ssl) - a light and fast webserver
    Build-Date: Jan 30 2006 12:29:26
    #
  5. 起動確認をする。(必要であれば)Apache HTTP Server を停止して、lighttpd を起動する。lighttpd は (Debian のパッケージでは)デフォルトで 80 番ポートをバインドする。
    # /etc/init.d/apache2 stop
    Stopping web server: Apache2.
    # /etc/init.d/lighttpd start
    Starting web server: lighttpd.
    #
これでインストールは完了。

lighttpd でページを表示してみる

lighttpd のデフォルトの設定は (Debian のパッケージでは) localhost からのアクセスしか受け付けない。 というわけで、とりあえずそれを解除してから Web ブラウザでアクセスしてみる。

  1. /etc/lighttpd/livhttpd.conf にある 'server.bind = "localhost"' をコメントアウトする。
  2. lighttpd を再起動する。
    # /etc/init.d/lighttpd restart
    Stopping web server: lighttpd.
    Starting web server: lighttpd.
    #
  3. テスト用の HTML ファイルを作成する。
    # cat /var/www/index.html
    
    
      This file is /var/www/index.html
    
    
    
    
[lighttpdへアクセスしてみた]
lighttpd へアクセスしてみた

lighttpd の設定ファイル

Debian パッケージに用意されている lighttpd の設定ファイルをメモ。

  • /etc/lighttpd/
    • conf-available/
      • 10-auth.conf
      • 10-fastcgi.conf
      • 10-simple-vhost.conf
      • 10-userdir.conf
      • 10-cgi.conf
      • 10-proxy.conf
      • 10-ssi.conf
      • README
    • conf-enabled/
    • lighttpd.conf

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 29, 2006

[Misc] Microsoft Physics Illustrator for Tablet PC にチャレンジ

Microsoft Physics Illustrator for Tablet PC とは

Physics Illustrator はタブレット PC 用の物理シミュレータ。 hirax.net さんのところで 手書きの「ピタゴラ・シミュレータ」 として紹介されていたのを見て、楽しそうだったので試してみた。 (結城浩の日記 さんの 手書きの「ピタゴラ・シミュレータ」 経由) ただ、タブレット PC 用と銘打っているだけあって、普通の Windows XP Professional で動かすには一工夫必要。

Microsoft Physics Illustrator for Tablet PC
http://www.microsoft.com/downloads/details.aspx?FamilyID=56347faf-a639-4f3b-9b87-1487fd4b5a53

インストール時のメモ

Physics Illustrator for Tablet PCの動かし方(修正版) で紹介されている方法で問題なく動作した。 手元の環境 (Windows XP Professional) では以下の通りで動作した。

  1. .net framework は既にインストールされている(ver.1.1)ので何もしなかった
  2. Tablet PC Platform Software Development Kit (SDK) v1.5 をインストール。
  3. Microsoft Physics Illustrator for Tablet PC を起動

遊んでみる

期待通りかなり楽しめた。 ただ、トラックパッドではなかなか直線、曲線を描くのが大変。 やはり Tablet PC の方が操作はし易いだろうな、という感じ。
ところで、だれかこういうインターフェースの IDE を作ってくれないかな。

[physics(01)] [physics(02)] [physics(03)] [physics(04)] [physics(05)]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 28, 2006

[Misc] xfy にチャレンジ

xfy とは

xfy とは Justsystem が公開している XML オーサリングツール(?)。 XHTML、SVG など様々な規格に対応していて便利。 しかも Java でプラグインも作成可能。

xfy
http://www.xfytec.com/
what's xfy
https://www.xfytec.com/whats/

実際に試してみる

  1. ダウンロードページからバイナリ(ここでは xfy_combo_pack_051114.exe)をダウンロード。(要ユーザ登録)
  2. インストーラの指示に従ってインストール
  3. 起動してサンプルを開いてみる
    [xhtmlのサンプルを開いたところ]

付属のサンプル

xfy には以下のサンプルが付属していた。 サンプルはデフォルトのインストール先を選択した場合、C:\Program Files\Justsystem\xfy Basic Edition 1.0\doc\samples にある。

  • compound
  • mathml
  • shapeml
  • svg
  • tutorial
  • xhtml

xfy アプリケーション

xfy 用のアプリケーション(プラグイン??) がいくつか公開されていたので、その中で CML Viewer XVCD というのを試してみた。 CML Viewer XVCD は、Chemical Markup Language(CML) のビューア。 CMLViewerXVCD_kisi_060117.zip をダウンロードして、index.xml を xfy で開くとサンプルを見ることができる。
[CML Viewer XVCD の画面]

CML Viewer XVCD
https://www.xfytec.com/community/modules/mydownloads/singlefile.php?cid=24&lid=24

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 27, 2006

[Library] クラスの依存関係チェックツールをメモ

クラスの依存関係をチェックできるツールをメモ。 コードレビューなどで重宝する。 とは言うものの、パッケージ間の依存に関する規約がプロジェクト毎にマチマチだったり、パッケージの数が膨大だったりするので、こういうアリモノのツールだと開発標準との摺り合わせが大変だったりする。 なので、個人的にはニーズに合わせて自作した方が手っ取り早いだろう派。

JDepend
http://www.clarkware.com/software/JDepend.html
Byecycle
http://byecycle.sourceforge.net/

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 24, 2006

[Book] 実務で役立つ WBS 入門

書籍情報


実務で役立つ WBS 入門

レビュー

WBS はいつの間にか何となく人マネで作成している。 それはそれで別に困ったこともないのだが、今更な感じで読んでみると気付かされることが多々あった。

  1. WBS 入門
  2. 基本概念
  3. ライフサイクル計画
  4. プロジェクトでの WBS の利用
  5. WBS の利用例
  6. WBS の作成
という構成になっているのだが、個人的には「基本概念で述べられていたレベルの粒度の話」「WBS の作成で述べられていた WBS 作成フロー」「WBS にまつわる Q & A」が参考になった。 WBS なら知ってる、書けるという人でも一度読んでみると多少なりとも得るものがあると思う。

Posted in Book | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 22, 2006

[Misc] 今更 ajax にチャレンジ

ajax でちょっとしたタブ型のインターフェースを作ってみた。 こういうものと昨日調べた JavaScript のテンプレートエンジンを組み合わせると面白いのではないかと思って。 テンプレートエンジンとの組み合わせはまだ出来ていないのだけれど。

2006/01/21 2006/01/20 2006/01/18 2006/01/17 2006/01/16

JavaScript を有効にすると動作します。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 21, 2006

[Misc] JavaScript のテンプレートエンジン

JavaScript のテンプレートエンジンを集めてみた。 意外と見つからなかった。もう少し見付かるかと思ったのだけれど・・・。

Ajax Pages
http://ajax-pages.sourceforge.net/
Jamritas
http://sourceforge.net/projects/jamritas/
JKL.Hina
http://www.kawa.net/works/js/jkl/hina.html
TrimPath
http://sunset.freespace.jp/smarty/
Lyase.View
http://inforno.net/articles/2006/02/15/the-embed-javascript-implementation
(2006/02/21) Inforno さんのテンプレートエンジン追加。Trackback Thanx!! > Inforno さん
(2006/02/24) Inforno さんのテンプレートエンジン名称を正式なものに修正。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 20, 2006

[WebService] Google Maps API を利用しているサイトを調査

ふと思い立って Google Maps API を利用しているサイトを調べてみた。 とは言え、既にかなりの数のサイトが Google Maps API を利用している模様。 とりあえず検索エンジンで適当にかき集めてみた。

Google Maps API はクライアント側に負荷がかかるのが難点ではあるけれど、皆が色々工夫しているのが楽しい。 もっと探せばいくらでも見付かりそうだな。

サービス検索

地図でホテルの料金比較:ホテル情報館
http://www.bit-style.com/travel/
関東のデートスポットマップ
http://www.date2.jp/
地図から検索 Find Job! Mapsβ
http://www.find-job.net/fj/mapsearch.cgi
食べログ.com
http://tabelog.com/restaurant/tokyo/

ブログ・SNS連携

はてなマップ
http://map.hatena.ne.jp/
なビログ
http://navilog.manno.jp/mailbbs.php
BLOGエントリを地図に
http://daily-archive.com/
マイミクマップ
http://www.flatz.jp/var/miximap/index.php
どこだログ
http://www.platypus.st/exec/show-tb4gmap.rb
お散歩マニア
http://www.osanpomania.net/

ゲーム

Google Maps で鈴鹿サーキット試走
http://tech.nitoyon.com/javascript/application/racing/1/
Google Maps APIシューティング挫折版
http://www.asahi-net.or.jp/~cs8k-cyu/javascript/gma_shmup_test/
らくがきマップ
http://playon.jp/mm/map/

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 18, 2006

[VMWare] Samba + LDAP の VMware 仮想ディスク(2)

実際に試してみた。 まずは起動と Samba へのアクセスに挑戦。

  1. VMWare Player を起動
  2. root/samba でログイン
  3. ifconfig で IP アドレスを調べる
  4. Windows からエクスプローラでアクセス
  5. ldap01/ldap01 で認証
  6. 問題無く Samba に接続。ファイルの読み書きも問題無し
というわけで、何事も無く終了。
[Samba へ無事接続]

次にドメインへの参加に挑戦。 ・・・ここで問題発生。 色々試してはみたもののドメインには参加できなかった。 クライアントは Windows XP Professional。 ローカルセキュリティポリシーとかも調整したが無理だった。 Samba の勉強が必要か。 とりあえず今回は時間が無いので断念。

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 17, 2006

[VMWare] Samba + LDAP の VMware 仮想ディスク

hard で loxse な日々さんがSamba + LDAP の VMware 仮想ディスクを紹介していた。 公開元のだめだめ日記さんによると・・・

  • Samba+LDAPでPDCの構成済
  • smbldap-tools設定済
  • Windowsから管理するための設定済
  • UNIXとWindowsのアカウント同期設定済
です。

ベースは Debian GNU/Linux 3.1(Sarge) です。base-system に最低限 Samba+LDAPを動作させるのに必要なパッケージ+αを入れることで、200MB程度の容量に抑えました。
というものらしい。素晴らしい!! 「ActiveDirectory までは別に要らないなぁ」という場合に何とも便利。 試してみたいのだが、ダウンロードが終わらない・・・後 4 時間orz 明日試してみよう。

Posted in VMWare | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 16, 2006

[Library] Restlet にチャレンジ (2)

サンプルコード(1)

まずはリクエストの内容を表示するサンプル。

package jp.in_vitro.codelets.restletsample;

import org.restlet.AbstractRestlet;
import org.restlet.Restlet;
import org.restlet.RestletCall;
import org.restlet.RestletException;
import org.restlet.component.DefaultRestletContainer;
import org.restlet.component.RestletContainer;
import org.restlet.data.MediaTypes;
import org.restlet.data.Preference;

import com.noelios.restlet.data.StringRepresentation;
import com.noelios.restlet.ext.jetty.JettyServer;

public class RestletContainerSample {

    public static void main(String[] args) throws Exception {
        RestletContainerSample me = new RestletContainerSample();
        me.initialize();
        me.execute();
    }

    public RestletContainerSample() {
        super();
    }

    protected void initialize() {
        // Restlet API に Restlet 実装を登録。
        com.noelios.restlet.Engine.register();
    }

    protected void execute() throws Exception {
        // Jetty と Restlet コンテナの準備
        RestletContainer restletContainer = new DefaultRestletContainer(
                "My container");
        JettyServer httpServer = new JettyServer("Web Server", 8080,
                restletContainer);
        restletContainer.addServer(httpServer);

        // Restlet コンテナに Restlet を登録して、Restlet コンテナを開始。
        Restlet myRestlet = new MyRestlet(restletContainer);
        restletContainer.attach("http://localhost:8080/restlet", myRestlet);
        restletContainer.start();
    }

    protected static class MyRestlet extends AbstractRestlet {

        public MyRestlet(final RestletContainer restletContainer) {
            super(restletContainer);
        }

        public void handle(final RestletCall call) throws RestletException {
            StringBuffer message = new StringBuffer();
            message.append("<html><body>");
            message.append("<dl>");
            message.append("<dt>Client Address</dd>");
            message.append("<dd>" + call.getClientAddress() + "</dd>");
            message.append("<dt>Client Name</dd>");
            message.append("<dd>" + call.getClientName() + "</dd>");
            message.append("<dt>Method</dd>");
            message.append("<dd>" + call.getMethod() + "</dd>");
            if (call.getReferrerRef() != null) {
                message.append("<dt>Referrer Ref</dd>");
                message.append("<dd>" + call.getReferrerRef().getPath()
                        + "</dd>");
            }
            if (call.getResourceRef() != null) {
                message.append("<dt>Resource Ref</dd>");
                message.append("<dd>" + call.getResourceRef().getPath()
                        + "</dd>");
            }
            if (call.getSecurity() != null) {
                message.append("<dt>Security (description)</dd>");
                message.append("<dd>" + call.getSecurity().getDescription()
                        + "</dd>");
                message.append("<dt>Security (challenge request)</dd>");
                message.append("<dd>"
                        + call.getSecurity().getChallengeRequest() + "</dd>");
                message.append("<dt>Security (challenge response)</dd>");
                message.append("<dd>"
                        + call.getSecurity().getChallengeResponse() + "</dd>");
            }
            if (call.getStatus() != null) {
                message.append("<dt>Status</dd>");
                message.append("<dd>" + call.getStatus() + "</dd>");
            }
            if (call.getMatches() != null) {
                message.append("<dt>Matches</dd>");
                message.append("<dd>");
                for (String match : call.getMatches()) {
                    message.append(match);
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getPaths() != null) {
                message.append("<dt>Paths</dd>");
                message.append("<dd>");
                for (String path : call.getPaths()) {
                    message.append(path);
                    message.append("<br>");
                }
                message.append("</dd>");
            }
            if (call.getMediaTypePrefs() != null) {
                message.append("<dt>Media Type Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getMediaTypePrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getLanguagePrefs() != null) {
                message.append("<dt>Language Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getLanguagePrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getCharacterSetPrefs() != null) {
                message.append("<dt>Character Set Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getCharacterSetPrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getConditions() != null) {
                message.append("<dt>Conditions (description)</dd>");
                message.append("<dd>" + call.getConditions().getDescription()
                        + "</dd>");
                message.append("<dt>Conditions (modified since)</dd>");
                message.append("<dd>" + call.getConditions().getModifiedSince()
                        + "</dd>");
                message.append("<dt>Conditions (unmodified since)</dd>");
                message.append("<dd>"
                        + call.getConditions().getUnmodifiedSince() + "</dd>");
            }
            message.append("</dl>");
            message.append("</body></html>");
            call.setOutput(new StringRepresentation(new String(message),
                    MediaTypes.TEXT_HTML));
        }
    }
}

サンプルコード(2)

URL に従ってファイルを返すサンプル。

package jp.in_vitro.codelets.restletsample;

import org.restlet.component.DefaultRestletContainer;
import org.restlet.component.RestletContainer;
import org.restlet.data.MediaTypes;

import com.noelios.restlet.DirectoryRestlet;
import com.noelios.restlet.ext.jetty.JettyServer;

public class DirectoryRestletSample {

    public static void main(final String[] args) throws Exception {
        DirectoryRestletSample me = new DirectoryRestletSample();
        me.initialize();
        me.execute();
    }

    public DirectoryRestletSample() {
        super();
    }

    protected void initialize() {
        // Restlet API に Restlet 実装を登録。
        com.noelios.restlet.Engine.register();
    }

    protected void execute() throws Exception {
        // Jetty と Restlet コンテナの準備
        RestletContainer restletContainer = new DefaultRestletContainer(
                "My container");
        JettyServer httpServer = new JettyServer("Web Server", 8080,
                restletContainer);
        restletContainer.addServer(httpServer);

        // リクエストのパスに従ってファイルを返す Restlet
        DirectoryRestlet dirRestlet = new DirectoryRestlet(restletContainer,
                "c:/tmp", true, "index");
        dirRestlet.addExtension("txt", MediaTypes.TEXT_PLAIN);

        // Restlet コンテナに Restlet を登録して、Restlet コンテナを開始。
        restletContainer.attach("http://localhost:8080/", dirRestlet);
        restletContainer.start();
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 15, 2006

[Library] Restlet にチャレンジ

Restlet とは

Restlet は、Java の Webアプリケーション用フレームワーク。 REST アーキテクチャの考え方をベースにしているフレームワークでちょっと目新しい。

Restlet
http://www.restlet.org/
Restlet Tutorial
http://www.restlet.org/tutorial
Java開発をWeb 2.0に対応させる「Restlet」プロジェクト
http://www.itmedia.co.jp/enterprise/articles/0601/10/news022.html
RESTアーキテクチャとは? SOAPとの関係は?
http://www.goodpic.com/mt/archives/000185.html

Restlet の実行環境構築

  1. こちらから Restlet をダウンロードする。ここでは ver.0.19 を前提とする。
  2. アーカイブの中の lib ディレクトリにある以下の jar をクラスパスに追加する。
    • com.noelios.restlet.jar
    • freemarker.jar
    • javax.servlet.jar
    • mail.jar
    • org.apache.commons.logging.jar
    • org.mortbay.jetty.jar
    • org.restlet.jar
    • restlet.freemarker.jar
    • restlet.javamail.jar
    • restlet.jetty.jar

サンプルコード

Web ブラウザに "Hello Restlet World" という文字列を送るサンプルコード。 Jetty を使うと気軽に Web アプリケーションが作成できる。 アプリケーションサーバをわざわざ用意したくないような小規模な Web アプリで使うと便利かも。

package jp.in_vitro.codelets.restletsample;

import org.restlet.UniformCall;
import org.restlet.UniformInterface;
import org.restlet.data.MediaTypes;

import com.noelios.restlet.data.StringRepresentation;
import com.noelios.restlet.ext.jetty.JettyServer;

public class UniformInterfaceSample {

    public static void main(final String[] args) {
        UniformInterfaceSample me = new UniformInterfaceSample();
        me.execute();
    }

    public UniformInterfaceSample() {
        super();
    }

    protected void execute() {
        // Web ブラウザに "Hello Restlet World" という文字列を text/plain で返す。
        UniformInterface handler = new UniformInterface() {
            public void handle(final UniformCall call) {
                call.setOutput(new StringRepresentation("Hello Restlet World!",
                        MediaTypes.TEXT_PLAIN));
            }
        };
        // HTTP サーバを起動する。
        new JettyServer("Web Server", 8080, handler).start();
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 13, 2006

[Misc] パスワード強度に関するメモ

ちょっと気になったのでパスワード強度に関して調べてみた。 いくつかメモ。 パスワード強度は"password strength"とか"password quality"とか言うみたい。 調べた限りではパスワード強度の標準的な算出方法は見付からなかった。 サイト毎に独自で実装しているのだろうか??

Iris Today Archives - パスワード・クオリティーを理解する
http://www-06.ibm.com/jp/software/lotus/developer/iris_today/20010904_5.html#1
Understanding password quality
http://www-10.lotus.com/ldd/today.nsf/8a6d147cf55a7fd385256658007aacf1/098c9f7d4a0cccbd85256abc0011e4f0?OpenDocument
Password Quality Scale
http://www.eclipse-education.com/eclipseweb.nsf/0/b565c53895a58b170525693f001037c2?OpenDocument

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 11, 2006

[Misc] サニタイズ言うなキャンペーンについてメモ

「サニタイズ言うなキャンペーン」に関するメモ。 サニタイズという言葉が問題だということは分かるけれど、Web アプリケーションにおけるプレゼンテーション層の標準的なフローがイマイチ明確にされていないのがそもそもの問題だと思う。

「サニタイズ言うなキャンペーン」とは何か
http://takagi-hiromitsu.jp/diary/20051227.html#p02
はてなダイアリー - サニタイズとは
http://d.hatena.ne.jp/keyword/%A5%B5%A5%CB%A5%BF%A5%A4%A5%BA?kid=127293
要約版:「サニタイズ言うなキャンペーン」とは
http://takagi-hiromitsu.jp/diary/20051231.html#p02
「サニタイズ言うなキャンペーンがわかりにくい理由」
http://bakera.jp/hatomaru.aspx/ebi/2006/1/5
セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏
http://pcweb.mycom.co.jp/articles/2005/07/12/wasf/

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 08, 2006

[Misc] LANDISK の telnet に関するメモ

LANDISK の telnet サポート

I・O Data 製 NAS の LANDISK で簡単に telnet サーバを立ち上げる方法をメモ。 wizd on LANDISK さんが公開されているアップデータを利用すると簡単にできる。 wizd on LANDISK さんに感謝!!

LANDISK HDL シリーズ
http://www.iodata.jp/prod/storage/hdd/2005/hdl-u/
LANDISK HDL シリーズサポートソフトライブラリ
http://www.iodata.jp/lib/
wizd on LANDISK
http://landisk.sealandair.info/

手順

  1. ここから最新ファームウェアをダウンロードする。
  2. ファームウェアを最新のものに更新する。
  3. ここから landisk_telnetd_v2.0.zip をダウンロードする。
  4. landisk_telnetd_v2.0.zip 内の update.tgz で再度 LANDISK を更新する。
  5. LANDISK に ユーザ "landisk" を追加する。
  6. LANDISK に telnet で接続してみる。
    Linux 2.4.21 (hoge.example.com) (0)
    
    
    hoge.example.com: landisk
    Password:
    No directory, logging in with HOME=/
    bash$ uname -a
    Linux hoge.example.com 2.4.21 #48 Tue Mar 22 22:03:49 JST 2005 sh4 unknown
    bash$

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jan 06, 2006

[Library] jLHA にチャレンジ

jLHA とは

jLHA は、名前の通り Java で LHA を扱うためのライブラリ。 J2SE にある ZIP 用 API と似通ったインターフェースを持っているため使いやすい。 ライセンスは独自ライセンスになっている。

LHA Library for Java
http://homepage1.nifty.com/dangan/Content/Program/Java/jLHA/LhaLibrary.html

jLHA の実行環境構築

  1. こちらから jLHA のソースコードをダウンロードする(ここでは version 0.06-05 を使用)。
  2. compile.xml 内の javac.target のvalue="1.1"をvalue="1.5"に変更する。
  3. jLHA をコンパイルして jar を生成する。ここでは、JDK 1.5.0_05 と Ant 1.6.2 を使用した。
    > ant -f compile.xml compileRelease
    > jar cvf jlha-0.06-05.jar jp
  4. jlha-0.06-05.jar をクラスパスに指定する。

サンプルコード

package jp.in_vitro.codelets.jlha;

import java.io.IOException;
import java.io.InputStream;

import jp.gr.java_conf.dangan.util.lha.LhaFile;
import jp.gr.java_conf.dangan.util.lha.LhaHeader;

public class Codelet {

    public Codelet() {
        super();
    }

    public static void main(String[] args) throws IOException {
        Codelet me = new Codelet();
        me.execute();
    }

    protected void execute() throws IOException {
        LhaFile file = new LhaFile("c:\\sample.lzh");
        LhaHeader[] entries = file.getEntries();
        String path = null;
        for (LhaHeader entry : entries) {
            path = entry.getPath();
            System.out.println("" + path);

            InputStream is = null;
            try {
                is = file.getInputStream(path);
                int ch = 0;
                while ((ch = is.read()) >= 0) {
                    System.out.print((char) ch);
                }
                System.out.println();
            } finally {
                if (is != null) {
                    is.close();
                }
            }
        }
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |