2004年度のNEWSです

NEWS [2004]


Eclipse3.0+Lomboz+Sun Java Application Server[040820]

研究の必要上、J2EE(Java2 Enterprise Edition)を使う必要が出てきました。今回はSun Java System Application Server Platform Edition 8がバンドルされたJ2EEのパッケージを利用することにしました。このパッケージにはJ2SEを初めとして各種のAPIが同梱されています。これを利用すればアプリケーションサーバを別にインストールせずにいきなり利用できそうです。今まではJavaのシステムを中心にアプリケーションサーバやWebサーバ、SOAPモジュールなどをインストールしてから、これらのソフトウェア間の設定が大変で苦労していました。

そして、どうせだからEclipseもバージョンが上がったことだし、利用してみることにしました。インストールしてみてEclipseのいいところは、ファイルを展開するだけだというところでしょうか。さらに、Eclipseの売りであるプラグインの機能も使って見ることにしました。プラグインはLombozというJ2EE開発用のプラグインです。このプラグインのインストールも楽で、Eclipseのプラグインフォルダに展開するだけです。

さてJ2EEをインストールする前に旧いバージョンのJDKやJ2EEはアンインストールしておきました。やはり、それぞれ微妙にバージョンが違うのであとで細かい問題が出てきそうです。アプリケーションサーバとEclipseまでのインストールには特に問題はありませんでした。LombozではEMFプロジェクトを採用しているので、EMF Runtime Buildsをダウンロードしてあらかじめインストールしておく必要があります。

Lombozのホームページのインストール手順に関するページの説明に従いインストールしていきます。Lombozではアプリケーションサーバの設定というものがあります。一応、JBossやTomcatなどよく利用されているアプリケーションサーバ用のサーバ定義ファイルは用意されていますが、Sunのアプリケーションサーバに関する定義ファイルはありませんでした。ない場合にはサーバ定義ファイルを自分で作ればいいのですが、サーバがどのクラスから起動するかを知る必要があります。時間がかかりそうなので、自分で調べることはやめてネットで探すことにしました。

googleでの検索を試してみましたが1件しか見つからず、それも質問の書き込みで回答はありませんでした。JBossやTomcatについてはたくさんあるんですけどね。Lomboz専用のフォーラムがObjectWebというサイトにありました。ここで探して見るとやはり、同じように困っている人がいるんですね。1件質問があり、それに対する回答がありました。 Desi Man氏によるものです。ところがこのまま使用すると、新しくプロジェクトのフォルダを作った時にエラーが生ずるので、訂正したものを掲載しておきます。

<serverDefinition 
	 name="Sun Application Server 8"
	 ejbModules="true"
	 webModules="true"
	 earModules="true">
<property id="serverRootDirectory"
	label="Application Server Directory:"
	type="directory"
	default="D:/Sun/AppServer" />
<property id="serverAddress"
	label="Address:"
	type="string"
	default="127.0.0.1" />
<property id="serverPort"
	label="Port:"
	type="string"
	default="8080" />
<property id="serverConfig"
	label="Server Configuration (minimal/default/all):"
	type="string"
	default="domains/domain1/autodeploy" />
<property id="classPathVariableName"
	label="Classpath Variable Name:"
	type="string"
	default="J2EE_HOME" />
<property id="classPath"
	label="Classpath Variable:"
	type="directory"
	default="D:/Sun/AppServer/lib" />
<serverHome>${serverRootDirectory}</serverHome>
<webModulesDeployDirectory>${serverRootDirectory}/${serverConfig}
</webModulesDeployDirectory>
<ejbModulesDeployDirectory>${serverRootDirectory}/${serverConfig}
</ejbModulesDeployDirectory>
<earModulesDeployDirectory>${serverRootDirectory}/${serverConfig}
</earModulesDeployDirectory>
<jndiInitialContextFactory>com.sun.enterprise.naming.SerialInitContextFactory
</jndiInitialContextFactory>
<jndiProviderUrl>iiop://${serverAddress}:3700</jndiProviderUrl>
<startClass>LauncherBootstrap</startClass>
<startWorkingDirectory>${serverRootDirectory}/lib</startWorkingDirectory>
<startVmParameters>-Dcom.sun.aas.installRoot=${serverRootDirectory} 
-Dcom.sun.aas.configRoot=${serverRootDirectory}/config 
-Dcom.sun.aas.instanceRoot=${serverRootDirectory}/domains/domain1
</startVmParameters>
<startProgramArguments>s1as-server -Dserver.name=server 
-Ddomain.name=domain1 start</startProgramArguments>
<stopClass>LauncherBootstrap</stopClass>
<stopWorkingDirectory>${serverRootDirectory}</stopWorkingDirectory>
<stopVmParameters>-Dcom.sun.aas.installRoot=${serverRootDirectory} 
-Dcom.sun.aas.configRoot=${serverRootDirectory}/config 
-Dcom.sun.aas.instanceRoot=${serverRootDirectory}/domains/domain1
</stopVmParameters>
<stopProgramArguments>s1as-server -Dserver.name=server 
-Ddomain.name=domain1 stop</stopProgramArguments>
<serverClassPath>
	<jar type="variable">${classPathVariableName}</jar>
	<jar type="variable">${classPathVariableName}/appserv-rt.jar</jar>
	<jar type="variable">${classPathVariableName}/j2ee.jar</jar>
	<jar type="variable">${classPathVariableName}/commons-launcher.jar</jar>
	<jar type="variable">${classPathVariableName}/appserv-admin.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xercesImpl.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xalan.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/ant.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/optional.jar</jar>
</serverClassPath>
<clientClassPath>
	<jar type="variable">${classPathVariableName}</jar>
	<jar type="variable">${classPathVariableName}/j2ee.jar</jar>
	<jar type="variable">${classPathVariableName}/appserv-rt.jar</jar>
	<jar type="variable">${classPathVariableName}/commons-launcher.jar</jar>
	<jar type="variable">${classPathVariableName}/appserv-admin.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xercesImpl.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xalan.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/ant.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/optional.jar</jar>
</clientClassPath>
<projectClassPath>
	<jar type="variable">${classPathVariableName}/appserv-rt.jar</jar>
	<jar type="variable">${classPathVariableName}/j2ee.jar</jar>
	<jar type="variable">${classPathVariableName}/commons-launcher.jar</jar>
	<jar type="variable">${classPathVariableName}/appserv-admin.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xercesImpl.jar</jar>
	<jar type="variable">${classPathVariableName}/endorsed/xalan.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/ant.jar</jar>
	<jar type="variable">${classPathVariableName}/ant/lib/optional.jar</jar>
</projectClassPath>
</serverDefinition>

変更したところはprojectClassPathタグ内で

	<jar type="variable">${classPathVariableName}</jar>

が入っていましたが、これがあるとプロジェクト作成時に、これに対応するjarファイルがないとエラーが発生するので削除しました。

以上のようにしてSunのアプリケーションサーバでも快適にJ2EEの開発ができそうです。まだ、JSPページの作成しか試していませんがservletやEJBの作成も簡単そうです。以前、3層モデルについていろいろ実験していたのですが、作ってからサーバにもっていく作業とデバッグが大変だったので、このような環境が利用できることで簡単にいろんな実験ができそうです。

今度はJavaまわりの話[040327]

テキストを作る関係上、いろんなことをやっています。今回はJavaでGUIのプログラミングを行うためにSwingパッケージを使ったサンプルを考えています。やっているうちに変なところにこだわってしまい、ちょっと時間がかかってしまいました。今回はこの話をしてみたいと思います。

まず次のプログラムを試して見ました。

import javax.swing.*;
public class ex3kai1 {
  public static void main(String[] args) {
    String firstNum;
    firstNum = JOptionPane.showInputDialog("入力テスト!");
    JOptionPane.showMessageDialog(null, firstNum,
      "次の値が入力されました", JOptionPane.ERROR_MESSAGE);
    System.exit(0);
  }
}

このプログラムではダイアログボックスで入力を扱っています。入力後、”了解”ボタン、”取消し”ボタン、クローズボックスのどれかをクリックして次の操作に移ることができます。

showMessageDialogが使われるのは”了解”ボタンがクリックされた時だけにしてもらいたいのですが、この例ではどの場合でもダイアログウィンドウが表示されてしまいます。これだと途中でキャンセルしたくても余分な操作が間に入ってしまいます。

JFC Swingの参考書によればキャンセルボタン(”取消し”ボタン)がクリックされた時に、showInputDialogはnullポインターを返すと書いてありました。そこで次のようにプログラムを変えてみます。

import javax.swing.*;
public class ex3kai2 {
  public static void main(String[] args) {
    String firstNum;
    firstNum = JOptionPane.showInputDialog("入力テスト!");
    if(firstNum == null){
      System.exit(0);
    }
    JOptionPane.showMessageDialog(null, firstNum,
      "次の値が入力されました", JOptionPane.ERROR_MESSAGE);
    System.exit(0);
  }
}

if文でshowInputDialogの返すnullを判定し、nullの場合すぐに終了するようにしています。このように書くことでイメージどおりに、ボタンやクローズボックスを扱うことができます。

このように書くと当たり前のように見えます。ですが、まさかクローズボックスをクリックした時にnullポインタが返されているとは考えつきませんでした。WindowListenerを実装してみたりといろいろやってみましたが、同じ結果となり自由にイベントの処理が実装できないのではと疑っていました。結局、次のプログラムでnullポインタが返されていることを確認することができました。実行後クローズボックスか”取消し”ボタンをクリックするとNullPointerExceptionの例外が返されます。

import javax.swing.*;
public class ex3kai3{
  public static void main(String[] args) {
    String firstNum;
    firstNum = JOptionPane.showInputDialog("入力テスト!");
    if(firstNum.length() == 0){
      JOptionPane.showMessageDialog(null, "何も入力されていません!",
        "未入力", JOptionPane.ERROR_MESSAGE);
    }
    System.exit(0);
  }
}

細かいことにこだわってしまいましたが、やっぱり気になってしまうものです。本やサイトで調べてもわからなかったのですが、このような場合には実験した方が早いですね。それとサイトを調べている時にjmusicのサイトを見つけました。Javaで音をならそうというプロジェクトのようです。GUIのプログラミングのチュートリアルを初めとして、音楽関連の話題が盛りだくさんです。jmusicで検索すると見つかると思いますので、興味のある方は覗いてみてはいかがでしょうか。うちのページもjmusicのページみたいに充実できればいいなぁ(^^;)。

DirectX9まわりの話[040318]

授業で3Dアニメーションのプログラムを取り上げようと考えています。今のところ実習室のパソコンはDirectX7で止まっていますので、DirectXを使った授業は無理かもしれません。一応DirectX9のバージョンアップは要求しているんですが、HDDの容量の問題もあって更新は次期システムまで保留になるかも。とすると、OpenGL環境でということになりますが、今回はDirectXまわりの話です。

現在ノートパソコンでDirectX9のプログラムを試しています。MicrosoftのDirectX9SDKのサンプルを試す分には問題なくプロジェクトをビルドし、実行させることができます。ところが、ある本のサンプルにおいてはプロジェクトを正常にビルドするところまでいくのですが、実行すると途中で止まりMicrosoftにエラーを報告しようとしてしまいます(^^;)。そこでDirectX9SDKのサンプルと比較して調べたところInitD3D関数に問題がありました。

もとのプログラムは以下のようになっています。

 DWORD Flags= D3DCREATE_MIXED_VERTEXPROCESSING;
    中略
  if(FAILED(hr = pD3D->CreateDevice(
                       D3DADAPTER_DEFAULT, 
                       D3DDEVTYPE_HAL, hWnd, Flags, 
                       &d3dpp, &pD3DDevice)))

ところが、このままだとハードウェアに依存してしまいます。ハードウェアとはもちろんNVIDIAとかATIのDirectX9対応のグラフィックカードのことです。うちのノートはintelの82830MというおそらくDirectX9に対応していないチップを使っているので、実行時にエラーを起こしてしまうようです。これを回避するために、この部分をソフトウェアでカバーするように次のように設定することができます。

  DWORD Flags= D3DCREATE_SOFTWARE_VERTEXPROCESSING;

このようにすることで、なんとか動き出します。ハードウェアに依存した場合の正常な動作と比較していないのではっきりしたことはいえませんが、大分動きがゆっくりなような気がします。これでサンプルをいろいろ試せるようになったのですが、サンプルを試していくうちにまた問題が出てきました。ビルド時にインターフェイスID3DXSpriteのDraw関数の引数の数に問題があると出てきます。問題のコードは次のように7つの引数を指定しています。

    g_Guide->Draw(g_GuideTexture, NULL, NULL, NULL, 0.0f, 
                       &D3DXVECTOR2(0.0f, 0.0f), 0xFFFFFFFF);

ところが、d3dx9core.h(2003年9月10日のバージョン)ではDraw関数について以下のように書いてあります。引数は5つになっています。もとのコードが書かれた時点と大きく変わっているようです。DirectXはstableとはいえないのかな。

    STDMETHOD(Draw)(THIS_ LPDIRECT3DTEXTURE9 pTexture, CONST RECT *pSrcRect,
         CONST D3DXVECTOR3 *pCenter, CONST D3DXVECTOR3 *pPosition, 
              D3DCOLOR Color) PURE;

そこで、これに従って次のように書くことで、サンプルを試すことができました。

    g_Guide->Draw(g_GuideTexture, NULL, NULL, NULL, 0xFFFFFFFF);

あと、参考までに、わかりにくいバグが出た時に私はよくprintf関数を使ってバグの箇所を見つけ出します。昔からデバッガを使わずにバグ探しをしています。デバッガを使うと効率がよいという風に言われていますが、私が使っても問題がさらに複雑に見えてきて見通しが悪くなってしまうような気がするからです。デバッガをたよって見るよりも、自分で予想しながら探していくのが向いているんですね。

今回のプログラミングではGUIを使ったプログラムを試しています。clコマンドを使ってmakefileを作っていくのもいいのですが、やはりIDEを使った方が楽ですね。また、デバッグ時にprintf関数の代わりに次の1行を適当にはさみ、おかしな動作が起こっている箇所を調べました。ま、自分の好きな方法でやるのが一番です。これは、参考までに書いておきます。

MessageBox(hWnd, "Chech it!", "Check!", MB_YESNO | MB_ICONQUESTION);

こんな、感じでプログラミングの勉強をしております。また、何か見つけたら報告したいと思います。

Windowsプログラミングのテキスト[040306]

WindowsOSに関するプログラミングは、WindowsOS特有の記述をするために長くなってしまいがちです。ウィンドウそのものを扱うので、GUIやWindowsOSが提供する各種のコントロールの使用法に話が集中して分厚い本になってしまいます。このWindowsプログラミングを扱ったものは以下のものが有名です。ただし、Petzold本は新しい版が出ています。

・プログラミング Windows95、Charles Prtzold著、アスキー出版局、8800円

・Windows2000プログラミング標準講座、ハーバート・シルト著、翔泳社、5200円

1冊目は1800ページ弱、2冊目は約700ページのボリュームです。このあたりの本だけで十分な内容ですが、最近洋書で次の本を試して見ました。

・Windows Programming with C++ (The Addison-Wesley Nitty Gritty Programming Series)、Henning Hansen著、Addison-Wesley、価格はアマゾンなどで調べてみてください。

この本の特徴はやはり、薄さです。300ページ弱ながらWindowsプログラミングの要点をおさえています。最初に骨格となるプログラムを示し、その基本構造をほとんど変えずに、GUIに関するものから描画、テキストエディタのプログラムを作っていきます。全体は3部構成となっており、Start up!でサンプルプログラムを試し、Take that!で各種Win32APIの説明を読み、Go Ahead!でさらにこんなこともできるんだよということに触れています。

残念ながら、サンプルプログラムのソースプログラムには間違いがいくつか見られます。また、Go Ahead!でのDirectXのプログラムはバージョン7と旧いものを扱っています。けれどもそれを補うほどの構成には感心させられます。まず、とりあえずサンプルを試して、必要だったらWin32APIの解説を読んで、興味持ったら次のこともやってみましょうね、という考え方は自分がテキストを作る上でも参考になりそうです。

Nitty Grittyとは物事の核心のことを指すようですが、まさにざっと試して感触をつかんでもらおうという思想が明確に表現されています。英語で書かれていますが、やはりこのような本で核心をつかむことこそ、初心者に必要とされるもののように思えます。

細かいこと(パート2)[040229]

やっているうちにいろいろ出てくるもんです。うちのサーバのディスプレイは256色表示に設定してあるのですが、このトップページをサーバのディスプレイで見ると、テーブルで3分割してあるうちの、ヘッダー相当部分とその下の右側の部分の背景色が同じ色になってしまいます。いわゆるWebセーフカラー(216色)を使って背景色を決めれば、こんなことは起こらないわけですが、今更Webセーフカラーというのもなんですから、このままの背景色でいきたいと思います。またして、Webセーフカラーのチェックできる環境がたまたまあったんで気がついたんですけどね(^^;)。

やっとページのフォーマットが決まったと宣言したばかりですが、また微妙に変更しています。今、シリーズもののページについて考えていますが、ページの素となるXMLデータはヘッダー部分、本体部分、フッター部分の三つで考えています。変更前はこのヘッダー部分は個々のページでユニークなものにしていました。ところがシリーズものを考える場合、ヘッダー部分のファイルを個別に作成するとファイルが増えてしまい余計なファイルが増えてしまいます。そこで、ヘッダー部分でユニークな部分は本体部分に移し、ヘッダー部分は一つだけにしました。それに伴い、pythonで書いたプログラムも一部変更となったので、ちょっと時間がかかってしまいました。

さらに、シリーズものの場合リンクについても考える必要が生じました。シリーズもののトップページのリンクに対してサブのページのリンクをインデントして、サブの要素であることを明確に示す必要があります。言葉で書くと難しいのですが、リンクに関するXMLデータのタグにパラメータをつけて、XSLのプログラムの方でこのパラメータをもとにxsl:ifを使って分岐し、スタイルシートに対応させるだけでイメージ通りに表示できるようになりました。こういう時にXMLを使ってページを表現した際のメリットを実感できます。

こうやって、シリーズもののページを作っていますが、やはりサイト更新前の内容は今ひとつかなと思い、書き換えながら作っています。ま、ちょっと時間がかかるかもしれませんがどんどん追加していきたいと思います。

先日、Java Virtual Machineを使って作ったプログラミング言語のページがあったので、つらつら眺めていました。有名どころの言語からアップレットで使ってもらうもの、そして言語の種類はBASIC、Lisp、Javascript、はてはJavaの拡張版までいろんなものがありました。興味ある方はのぞいてみてはいかがかな。

http://www.robert-tolksdorf.de/vmlanguages.html

この中でBambookitというXMLベースの言語がありました。XMLでGUI環境を実現しているアイディアはおもしろいなと思いました。ページをのぞきにいくと、商用のサイトになっていました。antみたいな考え方を使っているものと思われます。antの場合でタスクという分類のタグがあり、これらのタグを指定することで様々な処理を行わせるようにしています。うちの院生もこのあたりのことを研究してみないかい(^^)。

また、いろいろ細かいことが [040225]

23日に一度担当科目のページをアップしてみたら、情報システム演習IIIのIIIのところが?マークで表示されています。調べて見るとXSLTプロセッサで変換後に置き換わっているようです。このIIIは置き換わる前は2バイト1文字のもので、NEC拡張文字と呼ばれる文字の一つです。おそらくXSLTプロセッサがこの文字をUnicodeにあるかどうかチェックして、ない時に?で置き換えているものと思われます。で、このIIIを表示するために、1バイトのI(大文字)を3つ並べて書いています。これもグローバライゼーションの弊害か(笑)。

そうやって直したページを研究室のWin95+IE4というレトロな環境で見てみると、今度はテーブルのヘッダーに相当する部分が左右にはみ出して表示されます。これはWinXP+IE6という今のところ新しい環境では大丈夫なんですけどね。それでいろいろ試してみたら、ページを構成する3つのテーブルをtableタグでさらに囲み、スタイルシートの方でヘッダーに相当するテーブルのwidthを100%としておくことで、両環境で同じページを表現することができました。もし、Win95のレトロ環境を使っていなかったらこんなことには絶対気がつかなかったことでしょう(笑)。

やっとページのフォーマットが決まりました[040223]

ちょっとページの更新に間が空いてしまいました。今回は担当科目の紹介のページを入れたので時間がかかってしまいました。それと、ページの共通のフォーマットについて、いろいろ試行錯誤していました。どういう点で悩んだかというと、XMLのファイルを作る時にはタグを打つのが面倒くさいので、なるだけ簡単に入力してプログラムでXMLのファイルに変換する方法を考えていました。参考までに今回使ったantのプログラムをのせておきます。

<project default="page040223">
  <target name="clear">
    <delete>
      <fileset dir=".">
        <include name="*.htm" />
        <include name="tmp*.*" />
      </fileset>
    </delete>
  </target>
  
  <target name="python" depends="clear">
    <exec executable="cmd.exe">
      <arg line="/C python fileout5.py < tanto2004.txt > tmp1.txt" />
    </exec>
    <exec executable="cmd.exe">
      <arg line="/C python fileout5.py < index2004.txt > tmp2.txt" />
    </exec>
    <concat destfile="tmp1.xml" append="true">
      <filelist dir="." files="tanto-header.txt,tmp1.txt,footer.txt" />
    </concat>
    <concat destfile="tmp2.xml" append="true">
      <filelist dir="." files="index-header.txt,tmp2.txt,footer.txt" />
    </concat>
  </target>
  <target name="page040223" depends="python">
    <style in="./tmp1.xml" out="./tanto.htm"
           extension="htm" style="./page-top21.xsl" processor="trax" />
    <style in="./tmp2.xml" out="./index.htm"
           extension="htm" style="./page-top21.xsl" processor="trax" />
  </target>
</project>

ずいぶん、長くなってしまいました。しかもpythonという言語を使ってなにやら行っております。このあたりの種明かしは、またの機会にしたいと思います。今度はC言語勉強会のようなシリーズもののページを作る時はどうしたらいいか考えてみたいと思います。

antを使ったページの作り方[040213]

Java用のビルドツールとしてantというものがあります。これを使って最初のプロトタイプを用意すれば長いコマンドラインを毎回タイプすることもなく簡単にページをビルドすることができます。antではXMLを使って命令を書いていきますが、その中でコマンドの役割を果たすのがタスクと呼ばれるものです。XMLですからこのタスクもタグとして記述します。また、タスクには様々な機能のものが用意されています。このようにXMLが機能付きのタグとして利用されるのは便利ですね。

さて、ページの生成にXSLT プロセッサ Xalanを用いていますが、antでもstyleというタグを使うことで簡単にXalanを利用することができます。今回のページを作る時に、次のようなビルドファイルを作りました。

<project default="page040213">
  <target name="clear">
    <delete>
      <fileset dir=".">
        <include name="*.htm" />
      </fileset>
    </delete>
  </target>
  
  <target name="page040213" depends="clear">
    <style in="./page-top3.xml" out="./index.htm"
           extension="htm" style="./page-top2.xsl" processor="trax"/>
  </target>
</project>

前回のjavaで処理していたコマンドのin,out,xslに渡していた値は、パラメータin,out,styleの値に対応しています。いったん、これを一つ用意しておけば毎回長いコマンドを打つ必要がなくなります。参考までにこのプログラムの前半は、すでに作った拡張子htmのファイルを削除する部分です。

さて、antの具体的な説明についてはほとんど説明しておりません。そこで、antの基本から応用まで説明している参考書を紹介しておきます。また、この本に付属しているCDROMにはantだけでなく、Java、Apache Jakartaプロジェクトの各種ツールが入っているのでとても便利です。

・Javaデベロッパーのための Apache Ant入門、宮元 信二著、SOFTBANK Publishing、2400円

いよいよページの更新スタートです[040210]

とりあえず、ページの更新を開始します。トップのページから始めて少しずつページを増やしていきます。今回はサイト構築も視野に入れて作っていきます。ほぼできあがるのは4月1日頃を予定しています。その間、急に増えたり、さっぱり更新されなかったりとページの見がいはないかもしれません(笑)。

急にページのデザインが変わるのもなんですが、ちょっとは今までと変わったページにしたくなるものです。しかも本人がなまぐさですから、デザインを一から考えるのもかなり強いストレスがかかってきます。そんな折、使えそうな本が見つかったので紹介します。

・HTML&スタイルシート デザインブック、エビスコム著、ソシム、2500円

・Webデザインのためのデジタル色見本帖、土橋 敬彦著、オーム社、2500円

1冊目はページのデザインを考えるための本で、スタイルシートを実践的に勉強することができます。2冊目は配色の本で色を調べる際に重宝します。

今回のページはデータ部分をXMLファイルとし、これをHTMLに変更するためにXSLのファイルを使っています。ページの共通のデザインには外部CSSのファイルを使って、デザインの統一を考えているつもりです。そして、Xalan XSLTプロセッサを使ってこれらのファイルからこのページを表現しているHTMLファイルを作りました。

やっとXMLファイルの構成や、デザインの部分のXSLファイルも完成しindex.htmを作ることができました。記念すべきコマンドは以下の通りでした。

C:\MyPage2004>java org.apache.xalan.xslt.Process -in page-top2.xml -xsl 
page-top2.xsl -out index.htm

参考までにこのページのトップの部分はtop.xml、メインの部分はpage-top2.xml、page-top2.xslそしてCSSはstyle1.cssというファイルで構成されています。これをXalanに処理させて目的のページを作ります。

あとは、XMLファイルにデータをポンポン追加していけば、タグに気を使わずにページを作ることができます。さらに複数のページを用意する際には一括処理を考える必要があります。これでページ作りがはたして楽になるだろうか(笑)。