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#;>
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 インタフェースのデフォルト実装。
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 インタフェースのデフォルト実装。
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 の拡張。何故拡張が必要かは知らない。
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 を調べなければならない。
- Google Calendar に Web ブラウザでアクセス
- Calendars > My Calendars > アクセスしたいカレンダー > Calendar settings を選択
- Private Address の "XML" アイコンのリンク先 URL をコピーする
http://www.google.com/calendar/feeds/in-vitro.example@gmail.com/private-1234567890abcdef1234567890abcdef/basicにアクセスすると
という感じの XML を取得できる。 尚、上記のリクエスト、レスポンス共にダミーなのでそのままコピペしても当然無効。<?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&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<br> </summary> <content type='text'> When: 2006-04-14 21:30:00 to 00:00:00 America/Los_Angeles<br><br>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>
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
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();
}
}
Apr 23, 2006
[Library] JExcelAPI にチャレンジ(5)
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] |
Apr 22, 2006
[Library] JExcelAPI にチャレンジ(4)
シートの印刷サイズをセットする
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);
Apr 21, 2006
[Library] JExcelAPI にチャレンジ(3)
文字を 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);
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);
Apr 19, 2006
[Misc] ジェノグラフィック・プロジェクトその後
以前、自分のご先祖様を調べてくれるジェノグラフィック・プロジェクトに参加した。
自分の DNA サンプルを送ると、DNA の情報を基にルーツを調べてくれる。
DNA の分析に時間がかかっていたが、ついに結果が分かった。
ジェノグラフィック・プロジェクトに関してはこちら→ ジェノグラフィック・プロジェクトに参加
というわけで、私の父方のご先祖様は "Eurasian Adam" だということが分かった。
アフリカから、インド、東南アジアを経由して日本にたどり着いたらしい。
日本人の 40% が私と同じルーツを持つそうなので、「ごくありふれた日本人」ということか。
M174 の皆様、遠い親戚になるそうですのでよろしくお願いしますm(_ _)m
![[ルーツ]](/blog/entries/Misc/20060419_01/genographic_01.png)
ルーツ
![[Genetic Sequence]](/blog/entries/Misc/20060419_01/genographic_02.png)
Genetic Sequence
![[Genetic History]](/blog/entries/Misc/20060419_01/genographic_03.png)
Genetic History
Apr 18, 2006
[Library] JBoss jBPM Process Designer にチャレンジ(2)
JBoss jBPM Process Designer でプロセスを記述してみた。
Process Project の作成、設定など
まずはプロジェクト作成ウィザードを使用して "Process Project" を作成する。
"Process Project" を作成したら、次に "Process" を作成する。
作成された XML をエディタで開くと、プロセス定義をすることができる。
![]() Process Project の作成 |
![]() 作成された Process Project |
![]() jBPM の設定 |
![]() Process の作成 |
プロセスの記述
<?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>
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 を使用する。
- Eclipse 3.1.2 をここからダウンロードする
- Eclipse をインストールする。以降、インストール先ディレクトリを %ECLIPSE_HOME% と記述する。
- JBoss jBPM Process Designer Plugin 3.0.4 をここからダウンロードする
- JBoss jBPM Process Designer をインストールする。JBoss jBPM Process Designer のアーカイブ内の plugins, features をそれぞれ%ECLIPSE_HOME%/plugins, %ECLIPSE_HOME%/features にコピーする
- Eclipse 3.1.2 の起動確認を行う。
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>
Apr 15, 2006
[Library] JBoss jBPM にチャレンジ
先日調べたワークフローエンジンの中から JBoss jBPM を試してみた。
JBoss jBPM の環境構築
JBoss jBPM 3.0.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
- クラスパスに以下の jar を追加する。
jbpm.properties は JbpmConfiguration が自動的に読み込む。 jbpmConfiguration が jbpm.properties を探すサーチパスは
- クラスパス内の /jbpm.properties
- クラスパス内の /org/jbpm/jbpm.properties
とっかかり
とりあえずこの辺りを読めばとりあえず使えるというドキュメントをメモ。
- チュートリアル
- 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/
Apr 14, 2006
[WebService] Google Calendar で遊ぶ
Google Calendar が公開された。 面白そうなので早速遊んでみることに。 インタフェースは Mac に付属の iCal にそっくり。 かなり使いやすい。 まだカレンダの新規作成などでバグが散見されるが、バグが減って安定してくれば結構使えそう。
![]() |
![]() |
![]() |
![]() |
![]() |
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
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
テスト方法
-
各サーバのドキュメントルートに以下の "index.html" を作成する。
<html> <head> <title>dummy page</title> </head> <body> This is a dummy page. </body> </html>
- JMeter で 1000 回程度 "/index.html" を GET する。(このときの結果は無視)
- 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 と同等だったのが意外だった。
もう少し速いイメージがあったのだけれど。
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 をインストールしたときのメモ。
- こちらから JBossWeb のバイナリをダウンロードする。ここでは jbossweb-4.0.4RC1-linux-i686.tar.gz を前提とする。
-
アーカイブを解凍して、適当な位置に配置する。
# 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
-
シェルスクリプトのパーミッションを変更する。
# chmod 755 /opt/jbossweb/bin/*.sh
-
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)
- 必要に応じてサーバの設定を変更する。 例えば、HTTP のポートを変更する場合は /opt/jbossweb/server/default/deploy/jbossweb.sar/server.xml を変更する。
-
起動する。
# cd /opt/jbossweb/bin # ./run.sh
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
インストールされた Jabberd のバージョンを確認してみる。# 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
# 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
Apr 09, 2006
[Misc] Java における慣習的命名
Manager というクラスの命名に関連して、Java における慣習的な命名を調べてみた。 調査方法は以下の通り。
- 調査対象は公開されているオープンソースライブラリ。
- Maven2 の公開リポジトリ(http://repo1.maven.org/maven2) に登録されているライブラリから適当に Jar アーカイブを選択
- 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 |
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.ということらしい。
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
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
の辺りは覚えておいた方がよさそうか。
- 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.)
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 のインストール
- ダウンロードページへ行く。
- "Change Language" で言語を日本語に変更する。
- "32 ビット X86 実行可能ファイル" というリンクからバイナリ("setup.exe")をダウンロードする。
- "setup.exe" を実行するとインストーラが起動する。
Virtual Machine の作成
Virtual Server は入ったが、Virtual Machine の作成方法が分からない。 ファーストステップガイドを読んでみたところ「バーチャル マシンを作成するには、管理 Web サイトを開きます。」と書かれていた。 どうやら「Virtual Server Web アプリケーション」が無ければ Virtual Machine を作成できないらしい。 色々調べてみたが他の Virtual Machine 作成方法は見つからなかった。 IIS はインストールしたくないので、ここで断念。 CUI のツールを用意して欲しいな。
Apr 04, 2006
[DocBook] DocBook Doclet にチャレンジ
DocBook Doclet
DocBook Doclet は Javadoc のカスタム doclet。 API Document を PDF や Docbook 形式など様々な形式で出力することができるスグレモノ。 API Document を Docbook 形式で出力できると便利なので早速試してみた。
DocBook Doclet のインストール
DocBook Doclet は、Javadoc へ組み込んで使用する jar と単体で動作する GUI アプリケーションの 2 種類のバイナリが提供されている。 とりあえず時間もないので GUI アプリケーションを試してみることに。
- こちらから Windows 用のバイナリをダウンロードする。ここでは dbdoclet-0_70_1.exe を使用。
-
ダウンロードしたバイナリを実行するとインストーラが起動するので、後はインストーラの指示通りにインストールする。
但し、インストール先ディレクトリはスペースが含まれないパスに変更した。念のためだけれど。 - デスクトップ上に作成されるショートカットを削除(使用できなかったので)
-
起動用のバッチファイルを作成
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 作成
- 上で作成した起動用バッチファイルを使用して DocBook Doclet を起動する。
- プロジェクトを新規作成する
- "Project" タブで "Project name"、"Destination directory" を設定
- "Sources" タブで "Sourcepath" を設定して "Add" ボタンを押下
- "Classpath" タブで "Classpath" を設定して "Add" ボタンを押下
- 必要に応じて "Javadoc"、"DocBook XML"、"PDF layout"、"Trafo" も設定
- "DocBook" ボタンを押下
- "Destination directory" で指定したディレクトリの中に docbook/Reference.xml が生成される
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 の実行環境構築
- こちらから NGramJ をダウンロードする。ここでは ver.1.0-0.060327 を前提とする。
- アーカイブの中にある以下の 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
Apr 02, 2006
[dotNet] .Net 関連の仕様をメモ
.Net 関連の言語使用をメモ。
- Standard ECMA-334 C# Language Specification
- http://www.ecma-international.org/publications/standards/Ecma-334.htm
- Standard ECMA-335 Common Language Infrastructure (CLI)
- http://www.ecma-international.org/publications/standards/Ecma-335.htm
- Visual Basic .NET Language Specification
- http://www.microsoft.com/downloads/details.aspx?familyid=bf32527d-187c-49fa-8c67-9e9105535550&displaylang=en
- Visual Basic .NET Code Samples: Master Set of 101 Samples
- http://www.microsoft.com/downloads/details.aspx?familyid=87951CB9-5AEB-4F46-9BF0-2B3E3664BE77&displaylang=en
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。
-
+ オークション

![[Server Server 実行に関係するクラス]](/blog/entries/AS/20060429_01/jboss_invocation_01.png)
![[Server Server 実行時のシーケンス]](/blog/entries/AS/20060429_01/jboss_invocation_02.png)
![[Server 初期化に関係するクラス]](/blog/entries/AS/20060427_01/jboss_initserver_01.png)
![[Server 初期化時のシーケンス]](/blog/entries/AS/20060427_01/jboss_initserver_02.png)
![[起動時処理に関係するクラス]](/blog/entries/AS/20060426_01/jboss_boot_01.png)
![[起動時のシーケンス]](/blog/entries/AS/20060426_01/jboss_boot_02.png)
![[Process Designer 01]](/blog/entries/Library/20060418_01/gpd_01.png)
![[Process Designer 02]](/blog/entries/Library/20060418_01/gpd_02.png)
![[Process Designer 03]](/blog/entries/Library/20060418_01/gpd_03.png)
![[Process Designer 04]](/blog/entries/Library/20060418_01/gpd_04.png)
![[Process Designer 05]](/blog/entries/Library/20060418_01/gpd_05.png)
![[Google Calendar 01]](/blog/entries/WebService/20060414_01/calendar_01.png)
![[Google Calendar 02]](/blog/entries/WebService/20060414_01/calendar_02.png)
![[Google Calendar 03]](/blog/entries/WebService/20060414_01/calendar_03.png)
![[Google Calendar 04]](/blog/entries/WebService/20060414_01/calendar_04.png)
![[Google Calendar 05]](/blog/entries/WebService/20060414_01/calendar_05.png)


