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 クリップ |