2001.4.10 〜 2001.12.30
[1999.9-2000.9 2000.9-2001.3 2001.4-2001.12 2002.1-2002.6 2002.7-2003.1 2003.2-2003.12 2004.1-2004.12 最新版]
僕のホームページの更新メモですが、自分のページ作成に関して参考にしたサイトなどや興味あってちょっと調べたことなどを紹介しています。
| 実行オプション | アクセッサなし | アクセッサあり (final) |
アクセッサあり (not final) |
備考 |
|---|---|---|---|---|
| -hotspot | 1,743 ms | 3,214 ms | 10,765 ms | クライアント用hotspot |
| -server | 310 ms | 351 ms | 321 ms | サーバ用hotspot |
| -Xint | 26,478 ms | 49,000 ms | 54,008 ms | hotspotなし |
| 実行オプション | アクセッサなし | アクセッサあり (final) |
アクセッサあり (not final) |
備考 |
|---|---|---|---|---|
| -client | 1,660 ms | 1,740 ms | 1,583 ms | クライアント用hotspot |
| -server | 315 ms | 349 ms | 331 ms | サーバ用hotspot |
| -Xint | 39,778 ms | 83,319 ms | 85,192 ms | hotspotなし |
# Swing properties swing.defaultlaf=com.sun.java.swing.plaf.motif.MotifLookAndFeel補助的(Auxiliary)LookAndFeelの導入
java.awt.Font[family=Tahoma,name=Tahoma,style=plain,size=11]これでTahomaフォントになる理由はわかった。Windows2000上で画面のプロパティ→デザインでメニューのフォントを見るとTahomaになっている。うんうん。次になぜTahomaフォントでは日本語がNGなのだろうか。
java.awt.Font[family=MS UI Gothic,name=MS UI Gothic,style=plain,size=12]となる。こうすると、WindowsLookAndFeelでのメニューフォントに日本語表示が可能になる。
BeanShell 1.1a16 - by Pat Niemeyer (pat@pat.net)
bsh % lafs = UIManager.getInstalledLookAndFeels();
bsh % print(lafs);
Array: [Ljavax.swing.UIManager$LookAndFeelInfo;@329f3d {
javax.swing.UIManager$LookAndFeelInfo[Metal javax.swing.plaf.metal.MetalLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel]
javax.swing.UIManager$LookAndFeelInfo[Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel]
}
bsh %
でもってデフォルトのLook & Feelは何かを調べるには、
bsh % print(UIManager.getLookAndFeel());
[The Java(tm) Look and Feel - javax.swing.plaf.metal.MetalLookAndFeel]
bsh % print(UIManager.get("ButtonUI"));
javax.swing.plaf.metal.MetalButtonUI
bsh %
とすればよいのです。上記ではさらにJButtonの見栄え(UserInterface)を提供するクラスも調べています。簡単ですね。UIManagerはこのように見栄えを管理しています。ここで、Look
& FeelをWindowsにしてみましょう。
bsh % UIManager.setLookAndFeel(lafs[2].getClassName());
bsh % print(UIManager.getLookAndFeel());
[The Microsoft Windows Look and Feel - com.sun.java.swing.plaf.windows.WindowsLookAndFeel]
bsh % print(UIManager.get("ButtonUI"));
com.sun.java.swing.plaf.windows.WindowsButtonUI
bsh %
このようにUIManagerにWindows Look & Feelを設定することで、JButtonの見栄えがMetalButtonUIクラスからWindowsButtonUIクラスに変更されたことが分かります。UIManagerは内部でUIDefaultsと呼ぶ対照表を持っており、ここにLook
& Feelに応じたデータを管理しています。
bsh % print(UIManager.get("Button.font"));
を実行すると、Metal Look & Feelのときは
javax.swing.plaf.FontUIResource[family=dialog,name=Dialog,style=bold,size=12]
と表示され、Windows Look & Feelのときは
javax.swing.plaf.FontUIResource[family=Tahoma,name=Tahoma,style=plain,size=11]
と表示されます。
if (employee.getTerminationDate() != null)これはemployeeが解雇されたのか否かが不明瞭なメソッド名。そこで、分かりやすいメソッドを追加する。
public boolean is Terminated() {
return getTerminationDate() != null;
}他の例:clear()よりもremoveAll()を使うほうが分かりやすい。
| 適用前 | 適用後 |
if (ftpResponse.charAt(0) == '2') {
// ftpの結果が200s これは成功
}
|
if (wasSuccesful(ftpResponse)) {
:
}
public boolean wasSuccessful(String ftpResponse) {
return ftpResponse.charAt(0) == '2';
}
|
| Composed Method適用後 | パラメータ収容クラス | Parameter Object適用後 |
void longComplex() {
:
mA(a, b, c, d, e);
:
mB(a, b, c, d, e);
:
mC(a, b, c, d, e);
:
}
|
class Para {
T a;
T b;
T c;
T d;
T e;
}
|
void longComplex() {
Para p = new Para();
:
mA(p);
mB(p);
mC(p);
:
}
|
| 適用前 | Composed Method適用 | Method Object適用 |
void longComplex() {
// do A
:
// do B
:
// do C
:
}
|
void longComplex() {
simpleA();
simpleB();
simpleC();
}
void simpleA() {
:
}
void simpleB() {
:
}
void simpleC() {
:
}
|
void longComplex() {
Calculator cal =
new Calculator(..);
cal.compute();
}
class Calculator {
:
void compute() {
a();
b();
c();
}
:
}
|
Canvasクラスにメソッドを追加
public void draw(Art art) {
art.drawOn(this);
}
| 適用前 | 適用後 |
canvas.moveTo(3, 4); canvas.drawLineTo(7, 11); bulletArt1.drawOn(canvas); canvas.drawLineTo(12, 13); bulletArt2.drawOn(canvas); |
canvas.moveTo(3, 4); canvas.drawLineTo(7, 11); canvas.draw(bulletArt1); canvas.drawLineTo(12, 13); canvas.draw(bulletArt2); |
class A {
:
public asB() {
return new B(...);
}
}このパターンは極力使わず、Converter Constructor
Methodを使う。どうしてもクラスBに変換メソッドを追加できない場合に限って使う。
new Sentence(existingSentence, word);としていた場合
public Sentence cat(Word word) {
return new Sentence(this, word);
}
というメソッドを提供する。すると、呼び出し側は
existingSentence.cat(word);と記述すればよい。本パターンは、操作が繰返し頻繁に表れる場合にのみ使う。
int setCursorTo() {
return setCursorTo(1, 1);
}
int setCursorTo(int x) {
return setCursorTo(x, 1);
}
int setCursorTo(int x, int y) {
//メソッドの処理の実体
}
ポイント:public Manager(String name, String ssn, int contractedRate) {
set(name, ssn, contractedRate);
}
// コンストラクタ・パラメータ・メソッド
private void set(String _name, String _ssn, String _contractedRate) {
name = _name;
ssn = _ssn;
contractedRate = _contractedRate;
baseSalary = contractedRate * 2000;
}デフォルト値を扱うコンストラクタが必要なら、Default
Parameter Valuesを使う。
Manager manager = new Manager();
manager.setName("Blow Joseph");
manager.setSSN("999-99-9999");
manager.setContractedRate(40);
というコードにContractor Methodを適用すると
public Manager(String name, String ssn, String contractedRate) {
:
}になる。
public void createCustomerCSV() {
テンポラリファイル名の決定
出力ファイルのオープン
データの作成、書き出し
ファイルクローズ
}
をComposed Methodを適用して
public void createCSV(ファイル名) {
ファイルオープン
writeCustomer(データ);
ファイルクローズ
}
public String getTempFilename(ファイル名プリフィックス) {
テンポラリファイル名決定
}
public void writeCustomer(fs, データ) {
fsへデータ書き出し
}
| 項目 | JDK1.3.1 | JDK1.4β2 | JDK1.4β3 | |
| Arcs | 21.3 | 23.7 | 23.7 | |
| Bezier Anim | 18.2 | - | - | 表示が欠け読取不可 |
| Ellipses | 21.2 | 23.3 | 23.6 | |
| Clip Anim | 18.4 | 25.2 | 24.0 | |
| Intersection | 22.8 | 23.9 | 22.7 | |
| Rotate3D | 15.2 | 18.7 | 18.6 | |
| Fade Anim | 13.1 | 20.8 | 20.7 | |
| Duke Anim | 170[ms] | 157[ms] | 160[ms] | |
| Warp Image | 23.3 | 28.2 | 28.2 | |
| Line Anim | 19.7 | 22.0 | 21.3 | |
| Balls | 22.4 | 24.4 | 24.0 | |
| Bezier Scroller | 22.4 | 23.6 | 23.1 | |
| Grad Anim | 22.5 | 25.1 | 25.2 | |
| Texture Anim | 22.4 | 26.0 | 25.4 | |
| Select Text | 14.1 | 20.7 | 22.8 | |
| Transform Anim | 13.9 | - | - | 表示が欠け読取不可 |
| Total | 258.8 | 305.6 | 非測定項目、単位ms項目を除く |
実行時のメモリモニタ。JDK1.4β2ではTransform Animationの時だけ激しくGCがかかっている。β1のときはほとんどすべてが激しいGC状態だったので、随分改善されていることが分かる。今後に期待。
| JDK1.3.1 | JDK1.4β2 |
AC_INIT(check_main.c) AM_INIT_AUTOMAKE(check_money, 1.0) AC_CHECK_LIB(check, suite_create) AC_OUTPUT(Makefile)次に、aclocal、autoconfを実行する。
$ aclocal $ autoconfMakefile生成の雛型となるMakefile.amを作る。
TESTS=check_money noinst_PROGRAM=check_money check_money_SOURCE = money.h money.c check_money.cそして、automakeを実行するのだが、いくつかの標準ドキュメントファイルが存在しないとエラーになるため、まずは空ファイルを用意してからautomakeを実行する。automakeに指定したオプションは、インストール用シェルスクリプト等がなければ自動生成させるためのものだ。
$ touch NEWS README AUTHORS ChangeLog $ automake --add-missingこれで、シェルスクリプトconfigureが生成された。あとはこのconfigureを実行すればMakefileが出来上がり。
AC_CHECK_LIB(cygipc, msgctl)これで、aclocal、autoconf、automakeと3発実効すると、Cygwin用のconfigureスクリプトが生成される。後は普通のオープンソースを構築する要領でconfigure/makeすればlibcygipc.aをリンクするlibcheck.aが出来る。
#include <check.h>
#include <stdlib.h>
#include "product.h"
/* テストコードは、マクロSTART_TESTとEND_TESTの間に書く */
START_TEST(test_name)
{
int answer = product_func(10);
fail_unless(answer == 55, "not correct"); /* 結果が55でなければテスト失敗 */
}
END_TEST
/* テストスイートを作成する関数を定義するのが常套手段
* テストスイートには複数のテストケースを登録できる。
* テストケースには複数のテストコード(START_TEST〜END_TEST)を登録できる。
*/
Suite* make_suite()
{
Suite* s = suite_create("SuiteName");
TCase* tc = tcase_create("TestCaseName");
suite_add_tcase(s, tc);
tcase_add_test(tc, test_name);
return s;
}
/* テストランナーを作成し、実行する。テスト結果は失敗した数を取り出せるので
* これを判定する。
int main()
{
int num_fail;
Suite* suite = make_suite();
SRunner sr = srunner_create(s);
srunner_run_all(sr, CRNORMAL);
num_fail = srunner_ntests_failed(sr);
srunner_free(sr);
suite_free(suite);
return (num_fail == 0)? EXIT_SUCCESS : EXIT_FAILURE;
}